Annotation of embedaddon/axTLS/ssl/openssl.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2007, Cameron Rich
3: *
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions are met:
8: *
9: * * Redistributions of source code must retain the above copyright notice,
10: * this list of conditions and the following disclaimer.
11: * * Redistributions in binary form must reproduce the above copyright notice,
12: * this list of conditions and the following disclaimer in the documentation
13: * and/or other materials provided with the distribution.
14: * * Neither the name of the axTLS project nor the names of its contributors
15: * may be used to endorse or promote products derived from this software
16: * without specific prior written permission.
17: *
18: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29: */
30:
31: /*
32: * Enable a subset of openssl compatible functions. We don't aim to be 100%
33: * compatible - just to be able to do basic ports etc.
34: *
35: * Only really tested on mini_httpd, so I'm not too sure how extensive this
36: * port is.
37: */
38:
39: #include "config.h"
40:
41: #ifdef CONFIG_OPENSSL_COMPATIBLE
42: #include <stdlib.h>
43: #include <string.h>
44: #include <stdarg.h>
45: #include "os_port.h"
46: #include "ssl.h"
47:
48: #define OPENSSL_CTX_ATTR ((OPENSSL_CTX *)ssl_ctx->bonus_attr)
49:
50: static char *key_password = NULL;
51:
52: void *SSLv23_server_method(void) { return NULL; }
53: void *SSLv3_server_method(void) { return NULL; }
54: void *TLSv1_server_method(void) { return NULL; }
55: void *SSLv23_client_method(void) { return NULL; }
56: void *SSLv3_client_method(void) { return NULL; }
57: void *TLSv1_client_method(void) { return NULL; }
58:
59: typedef void * (*ssl_func_type_t)(void);
60: typedef void * (*bio_func_type_t)(void);
61:
62: typedef struct
63: {
64: ssl_func_type_t ssl_func_type;
65: } OPENSSL_CTX;
66:
67: SSL_CTX * SSL_CTX_new(ssl_func_type_t meth)
68: {
69: SSL_CTX *ssl_ctx = ssl_ctx_new(0, 5);
70: ssl_ctx->bonus_attr = malloc(sizeof(OPENSSL_CTX));
71: OPENSSL_CTX_ATTR->ssl_func_type = meth;
72: return ssl_ctx;
73: }
74:
75: void SSL_CTX_free(SSL_CTX * ssl_ctx)
76: {
77: free(ssl_ctx->bonus_attr);
78: ssl_ctx_free(ssl_ctx);
79: }
80:
81: SSL * SSL_new(SSL_CTX *ssl_ctx)
82: {
83: SSL *ssl;
84: ssl_func_type_t ssl_func_type;
85:
86: ssl = ssl_new(ssl_ctx, -1); /* fd is set later */
87: ssl_func_type = OPENSSL_CTX_ATTR->ssl_func_type;
88:
89: #ifdef CONFIG_SSL_ENABLE_CLIENT
90: if (ssl_func_type == SSLv23_client_method ||
91: ssl_func_type == SSLv3_client_method ||
92: ssl_func_type == TLSv1_client_method)
93: {
94: SET_SSL_FLAG(SSL_IS_CLIENT);
95: }
96: else
97: #endif
98: {
99: ssl->next_state = HS_CLIENT_HELLO;
100: }
101:
102: return ssl;
103: }
104:
105: int SSL_set_fd(SSL *s, int fd)
106: {
107: s->client_fd = fd;
108: return 1; /* always succeeds */
109: }
110:
111: int SSL_accept(SSL *ssl)
112: {
113: while (ssl_read(ssl, NULL) == SSL_OK)
114: {
115: if (ssl->next_state == HS_CLIENT_HELLO)
116: return 1; /* we're done */
117: }
118:
119: return -1;
120: }
121:
122: #ifdef CONFIG_SSL_ENABLE_CLIENT
123: int SSL_connect(SSL *ssl)
124: {
125: return do_client_connect(ssl) == SSL_OK ? 1 : -1;
126: }
127: #endif
128:
129: void SSL_free(SSL *ssl)
130: {
131: ssl_free(ssl);
132: }
133:
134: int SSL_read(SSL *ssl, void *buf, int num)
135: {
136: uint8_t *read_buf;
137: int ret;
138:
139: while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK);
140:
141: if (ret > SSL_OK)
142: {
143: memcpy(buf, read_buf, ret > num ? num : ret);
144: }
145:
146: return ret;
147: }
148:
149: int SSL_write(SSL *ssl, const void *buf, int num)
150: {
151: return ssl_write(ssl, buf, num);
152: }
153:
154: int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type)
155: {
156: return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
157: }
158:
159: int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type)
160: {
161: return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK);
162: }
163:
164: int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d)
165: {
166: return (ssl_obj_memory_load(ssl_ctx,
167: SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK);
168: }
169:
170: int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
171: unsigned int sid_ctx_len)
172: {
173: return 1;
174: }
175:
176: int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
177: {
178: return 1;
179: }
180:
181: int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file)
182: {
183: return (ssl_obj_load(ssl_ctx,
184: SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
185: }
186:
187: int SSL_shutdown(SSL *ssl)
188: {
189: return 1;
190: }
191:
192: /*** get/set session ***/
193: SSL_SESSION *SSL_get1_session(SSL *ssl)
194: {
195: return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */
196: }
197:
198: int SSL_set_session(SSL *ssl, SSL_SESSION *session)
199: {
200: memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE);
201: return 1;
202: }
203:
204: void SSL_SESSION_free(SSL_SESSION *session) { }
205: /*** end get/set session ***/
206:
207: long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
208: {
209: return 0;
210: }
211:
212: void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
213: int (*verify_callback)(int, void *)) { }
214:
215: void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { }
216:
217: int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
218: const char *CApath)
219: {
220: return 1;
221: }
222:
223: void *SSL_load_client_CA_file(const char *file)
224: {
225: return (void *)file;
226: }
227:
228: void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file)
229: {
230:
231: ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL);
232: }
233:
234: void SSLv23_method(void) { }
235:
236: void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { }
237:
238: void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u)
239: {
240: key_password = (char *)u;
241: }
242:
243: int SSL_peek(SSL *ssl, void *buf, int num)
244: {
245: memcpy(buf, ssl->bm_data, num);
246: return num;
247: }
248:
249: void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { }
250:
251: long SSL_get_verify_result(const SSL *ssl)
252: {
253: return ssl_handshake_status(ssl);
254: }
255:
256: int SSL_state(SSL *ssl)
257: {
258: return 0x03; // ok state
259: }
260:
261: /** end of could do better list */
262:
263: void *SSL_get_peer_certificate(const SSL *ssl)
264: {
265: return &ssl->ssl_ctx->certs[0];
266: }
267:
268: int SSL_clear(SSL *ssl)
269: {
270: return 1;
271: }
272:
273:
274: int SSL_CTX_check_private_key(const SSL_CTX *ctx)
275: {
276: return 1;
277: }
278:
279: int SSL_CTX_set_cipher_list(SSL *s, const char *str)
280: {
281: return 1;
282: }
283:
284: int SSL_get_error(const SSL *ssl, int ret)
285: {
286: ssl_display_error(ret);
287: return 0; /* TODO: return proper return code */
288: }
289:
290: void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {}
291: int SSL_library_init(void ) { return 1; }
292: void SSL_load_error_strings(void ) {}
293: void ERR_print_errors_fp(FILE *fp) {}
294:
295: #ifndef CONFIG_SSL_SKELETON_MODE
296: long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) {
297: return CONFIG_SSL_EXPIRY_TIME*3600; }
298: long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) {
299: return SSL_CTX_get_timeout(ssl_ctx); }
300: #endif
301: void BIO_printf(FILE *f, const char *format, ...)
302: {
303: va_list(ap);
304: va_start(ap, format);
305: vfprintf(f, format, ap);
306: va_end(ap);
307: }
308:
309: void* BIO_s_null(void) { return NULL; }
310: FILE *BIO_new(bio_func_type_t func)
311: {
312: if (func == BIO_s_null)
313: return fopen("/dev/null", "r");
314: else
315: return NULL;
316: }
317:
318: FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; }
319: int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; }
320:
321:
322:
323: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>