summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/bio/bss_rtcp.c
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:15 +0000
committerryker <>1998-10-05 20:13:15 +0000
commit536c76cbb863bab152f19842ab88772c01e922c7 (patch)
treedfecec371a097b73d605aae665887946d9982219 /src/lib/libcrypto/bio/bss_rtcp.c
downloadopenbsd-536c76cbb863bab152f19842ab88772c01e922c7.tar.gz
openbsd-536c76cbb863bab152f19842ab88772c01e922c7.tar.bz2
openbsd-536c76cbb863bab152f19842ab88772c01e922c7.zip
Import of SSLeay-0.9.0b with RSA and IDEA stubbed + OpenBSD build
functionality for shared libs. Note that routines such as sslv2_init and friends that use RSA will not work due to lack of RSA in this library. Needs documentation and help from ports for easy upgrade to full functionality where legally possible.
Diffstat (limited to 'src/lib/libcrypto/bio/bss_rtcp.c')
-rw-r--r--src/lib/libcrypto/bio/bss_rtcp.c297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/lib/libcrypto/bio/bss_rtcp.c b/src/lib/libcrypto/bio/bss_rtcp.c
new file mode 100644
index 0000000000..6eb434dee8
--- /dev/null
+++ b/src/lib/libcrypto/bio/bss_rtcp.c
@@ -0,0 +1,297 @@
1/* crypto/bio/bss_rtcp.c */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved.
4 *
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
8 *
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15 *
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
25 * are met:
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40 *
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE.
52 *
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
57 */
58
59/* Written by David L. Jones <jonesd@kcgl1.eng.ohio-state.edu>
60 * Date: 22-JUL-1996
61 */
62/* VMS */
63#include <stdio.h>
64#include <stdlib.h>
65#include <string.h>
66#include <errno.h>
67#include "cryptlib.h"
68#include "bio.h"
69
70#include <iodef.h> /* VMS IO$_ definitions */
71extern int SYS$QIOW();
72typedef unsigned short io_channel;
73/*************************************************************************/
74struct io_status { short status, count; long flags; };
75
76struct rpc_msg { /* Should have member alignment inhibited */
77 char channel; /* 'A'-app data. 'R'-remote client 'G'-global */
78 char function; /* 'G'-get, 'P'-put, 'C'-confirm, 'X'-close */
79 unsigned short int length; /* Amount of data returned or max to return */
80 char data[4092]; /* variable data */
81};
82#define RPC_HDR_SIZE (sizeof(struct rpc_msg) - 4092)
83
84struct rpc_ctx {
85 int filled, pos;
86 struct rpc_msg msg;
87};
88
89static int rtcp_write(BIO *h,char *buf,int num);
90static int rtcp_read(BIO *h,char *buf,int size);
91static int rtcp_puts(BIO *h,char *str);
92static int rtcp_gets(BIO *h,char *str,int size);
93static long rtcp_ctrl(BIO *h,int cmd,long arg1,char *arg2);
94static int rtcp_new(BIO *h);
95static int rtcp_free(BIO *data);
96
97static BIO_METHOD rtcp_method=
98 {
99 BIO_TYPE_FD,
100 "RTCP",
101 rtcp_write,
102 rtcp_read,
103 rtcp_puts,
104 rtcp_gets,
105 rtcp_ctrl,
106 rtcp_new,
107 rtcp_free,
108 };
109
110BIO_METHOD *BIO_s_rtcp()
111 {
112 return(&rtcp_method);
113 }
114/*****************************************************************************/
115/* Decnet I/O routines.
116 */
117static int get ( io_channel chan, char *buffer, int maxlen, int *length )
118{
119 int status;
120 struct io_status iosb;
121 status = SYS$QIOW ( 0, chan, IO$_READVBLK, &iosb, 0, 0,
122 buffer, maxlen, 0, 0, 0, 0 );
123 if ( (status&1) == 1 ) status = iosb.status;
124 if ( (status&1) == 1 ) *length = iosb.count;
125 return status;
126}
127
128static int put ( io_channel chan, char *buffer, int length )
129{
130 int status;
131 struct io_status iosb;
132 status = SYS$QIOW ( 0, chan, IO$_WRITEVBLK, &iosb, 0, 0,
133 buffer, length, 0, 0, 0, 0 );
134 if ( (status&1) == 1 ) status = iosb.status;
135 return status;
136}
137/***************************************************************************/
138
139static int rtcp_new(bi)
140BIO *bi;
141{
142 struct rpc_ctx *ctx;
143 bi->init=1;
144 bi->num=0;
145 bi->flags = 0;
146 bi->ptr=Malloc(sizeof(struct rpc_ctx));
147 ctx = (struct rpc_ctx *) bi->ptr;
148 ctx->filled = 0;
149 ctx->pos = 0;
150 return(1);
151}
152
153static int rtcp_free(a)
154BIO *a;
155{
156 if (a == NULL) return(0);
157 if ( a->ptr ) Free ( a->ptr );
158 a->ptr = NULL;
159 return(1);
160}
161
162static int rtcp_read(b,out,outl)
163BIO *b;
164char *out;
165int outl;
166{
167 int status, length;
168 struct rpc_ctx *ctx;
169 /*
170 * read data, return existing.
171 */
172 ctx = (struct rpc_ctx *) b->ptr;
173 if ( ctx->pos < ctx->filled ) {
174 length = ctx->filled - ctx->pos;
175 if ( length > outl ) length = outl;
176 memmove ( out, &ctx->msg.data[ctx->pos], length );
177 ctx->pos += length;
178 return length;
179 }
180 /*
181 * Requst more data from R channel.
182 */
183 ctx->msg.channel = 'R';
184 ctx->msg.function = 'G';
185 ctx->msg.length = sizeof(ctx->msg.data);
186 status = put ( b->num, (char *) &ctx->msg, RPC_HDR_SIZE );
187 if ( (status&1) == 0 ) {
188 return -1;
189 }
190 /*
191 * Read.
192 */
193 ctx->pos = ctx->filled = 0;
194 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length );
195 if ( (status&1) == 0 ) length = -1;
196 if ( ctx->msg.channel != 'R' || ctx->msg.function != 'C' ) {
197 length = -1;
198 }
199 ctx->filled = length - RPC_HDR_SIZE;
200
201 if ( ctx->pos < ctx->filled ) {
202 length = ctx->filled - ctx->pos;
203 if ( length > outl ) length = outl;
204 memmove ( out, ctx->msg.data, length );
205 ctx->pos += length;
206 return length;
207 }
208
209 return length;
210}
211
212static int rtcp_write(b,in,inl)
213BIO *b;
214char *in;
215int inl;
216{
217 int status, i, segment, length;
218 struct rpc_ctx *ctx;
219 /*
220 * Output data, send in chunks no larger that sizeof(ctx->msg.data).
221 */
222 ctx = (struct rpc_ctx *) b->ptr;
223 for ( i = 0; i < inl; i += segment ) {
224 segment = inl - i;
225 if ( segment > sizeof(ctx->msg.data) ) segment = sizeof(ctx->msg.data);
226 ctx->msg.channel = 'R';
227 ctx->msg.function = 'P';
228 ctx->msg.length = segment;
229 memmove ( ctx->msg.data, &in[i], segment );
230 status = put ( b->num, (char *) &ctx->msg, segment + RPC_HDR_SIZE );
231 if ((status&1) == 0 ) { i = -1; break; }
232
233 status = get ( b->num, (char *) &ctx->msg, sizeof(ctx->msg), &length );
234 if ( ((status&1) == 0) || (length < RPC_HDR_SIZE) ) { i = -1; break; }
235 if ( (ctx->msg.channel != 'R') || (ctx->msg.function != 'C') ) {
236 printf("unexpected response when confirming put %c %c\n",
237 ctx->msg.channel, ctx->msg.function );
238
239 }
240 }
241 return(i);
242}
243
244static long rtcp_ctrl(b,cmd,num,ptr)
245BIO *b;
246int cmd;
247long num;
248char *ptr;
249 {
250 long ret=1;
251
252 switch (cmd)
253 {
254 case BIO_CTRL_RESET:
255 case BIO_CTRL_EOF:
256 ret = 1;
257 break;
258 case BIO_CTRL_SET:
259 b->num = num;
260 ret = 1;
261 break;
262 case BIO_CTRL_SET_CLOSE:
263 case BIO_CTRL_FLUSH:
264 case BIO_CTRL_DUP:
265 ret=1;
266 break;
267 case BIO_CTRL_GET_CLOSE:
268 case BIO_CTRL_INFO:
269 case BIO_CTRL_GET:
270 case BIO_CTRL_PENDING:
271 case BIO_CTRL_WPENDING:
272 default:
273 ret=0;
274 break;
275 }
276 return(ret);
277 }
278
279static int rtcp_gets(bp,buf,size)
280BIO *bp;
281char *buf;
282int size;
283 {
284 return(0);
285 }
286
287static int rtcp_puts(bp,str)
288BIO *bp;
289char *str;
290{
291 int length;
292 if (str == NULL) return(0);
293 length = strlen ( str );
294 if ( length == 0 ) return (0);
295 return rtcp_write ( bp,str, length );
296}
297