1 /* 2 * ustream-ssl - library for SSL over ustream 3 * 4 * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org> 5 * 6 * Permission to use, copy, modify, and/or distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <string.h> 20 21 #include <libubox/ustream.h> 22 23 #include "ustream-ssl.h" 24 #include "openssl_bio_compat.h" 25 #include "ustream-internal.h" 26 27 static int 28 s_ustream_new(BIO *b) 29 { 30 BIO_set_init(b, 1); 31 BIO_set_data(b, NULL); 32 BIO_clear_flags(b, ~0); 33 return 1; 34 } 35 36 static int 37 s_ustream_free(BIO *b) 38 { 39 if (!b) 40 return 0; 41 42 BIO_set_data(b, NULL); 43 BIO_set_init(b, 0); 44 BIO_clear_flags(b, ~0); 45 return 1; 46 } 47 48 static int 49 s_ustream_read(BIO *b, char *buf, int len) 50 { 51 struct bio_ctx *ctx; 52 char *sbuf; 53 int slen; 54 55 if (!buf || len <= 0) 56 return 0; 57 58 ctx = (struct bio_ctx *)BIO_get_data(b); 59 if (!ctx || !ctx->stream) 60 return 0; 61 62 sbuf = ustream_get_read_buf(ctx->stream, &slen); 63 64 BIO_clear_retry_flags(b); 65 if (!slen) { 66 BIO_set_retry_read(b); 67 return -1; 68 } 69 70 if (slen > len) 71 slen = len; 72 73 memcpy(buf, sbuf, slen); 74 ustream_consume(ctx->stream, slen); 75 76 return slen; 77 } 78 79 static int 80 s_ustream_write(BIO *b, const char *buf, int len) 81 { 82 struct bio_ctx *ctx; 83 84 if (!buf || len <= 0) 85 return 0; 86 87 ctx = (struct bio_ctx *)BIO_get_data(b); 88 if (!ctx || !ctx->stream) 89 return 0; 90 91 if (ctx->stream->write_error) 92 return len; 93 94 return ustream_write(ctx->stream, buf, len, false); 95 } 96 97 static int 98 s_ustream_gets(BIO *b, char *buf, int len) 99 { 100 return -1; 101 } 102 103 static int 104 s_ustream_puts(BIO *b, const char *str) 105 { 106 return s_ustream_write(b, str, strlen(str)); 107 } 108 109 static long s_ustream_ctrl(BIO *b, int cmd, long num, void *ptr) 110 { 111 switch (cmd) { 112 case BIO_CTRL_FLUSH: 113 return 1; 114 default: 115 return 0; 116 }; 117 } 118 119 static BIO *ustream_bio_new(struct ustream *s) 120 { 121 BIO *bio; 122 struct bio_ctx *ctx = calloc(1, sizeof(struct bio_ctx)); 123 124 ctx->stream = s; 125 ctx->meth = BIO_meth_new(100 | BIO_TYPE_SOURCE_SINK, "ustream"); 126 127 BIO_meth_set_write(ctx->meth, s_ustream_write); 128 BIO_meth_set_read(ctx->meth, s_ustream_read); 129 BIO_meth_set_puts(ctx->meth, s_ustream_puts); 130 BIO_meth_set_gets(ctx->meth, s_ustream_gets); 131 BIO_meth_set_ctrl(ctx->meth, s_ustream_ctrl); 132 BIO_meth_set_create(ctx->meth, s_ustream_new); 133 BIO_meth_set_destroy(ctx->meth, s_ustream_free); 134 bio = BIO_new(ctx->meth); 135 BIO_set_data(bio, ctx); 136 137 return bio; 138 } 139 140 __hidden void ustream_set_io(struct ustream_ssl_ctx *ctx, void *ssl, struct ustream *conn) 141 { 142 BIO *bio = ustream_bio_new(conn); 143 SSL_set_bio(ssl, bio, bio); 144 } 145
This page was automatically generated by LXR 0.3.1. • OpenWrt