summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/bio_md.c
diff options
context:
space:
mode:
authorryker <>1998-10-05 20:13:14 +0000
committerryker <>1998-10-05 20:13:14 +0000
commitaeeae06a79815dc190061534d47236cec09f9e32 (patch)
tree851692b9c2f9c04f077666855641900f19fdb217 /src/lib/libcrypto/evp/bio_md.c
parenta4f79641824cbf9f60ca9d1168d1fcc46717a82a (diff)
downloadopenbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.gz
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.tar.bz2
openbsd-aeeae06a79815dc190061534d47236cec09f9e32.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/evp/bio_md.c')
-rw-r--r--src/lib/libcrypto/evp/bio_md.c270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/lib/libcrypto/evp/bio_md.c b/src/lib/libcrypto/evp/bio_md.c
new file mode 100644
index 0000000000..fa5fdc055b
--- /dev/null
+++ b/src/lib/libcrypto/evp/bio_md.c
@@ -0,0 +1,270 @@
1/* crypto/evp/bio_md.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#include <stdio.h>
60#include <errno.h>
61#include "cryptlib.h"
62#include "buffer.h"
63#include "evp.h"
64
65/* BIO_put and BIO_get both add to the digest,
66 * BIO_gets returns the digest */
67
68#ifndef NOPROTO
69static int md_write(BIO *h,char *buf,int num);
70static int md_read(BIO *h,char *buf,int size);
71/*static int md_puts(BIO *h,char *str); */
72static int md_gets(BIO *h,char *str,int size);
73static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2);
74static int md_new(BIO *h);
75static int md_free(BIO *data);
76#else
77static int md_write();
78static int md_read();
79/*static int md_puts(); */
80static int md_gets();
81static long md_ctrl();
82static int md_new();
83static int md_free();
84#endif
85
86static BIO_METHOD methods_md=
87 {
88 BIO_TYPE_MD,"message digest",
89 md_write,
90 md_read,
91 NULL, /* md_puts, */
92 md_gets,
93 md_ctrl,
94 md_new,
95 md_free,
96 };
97
98BIO_METHOD *BIO_f_md()
99 {
100 return(&methods_md);
101 }
102
103static int md_new(bi)
104BIO *bi;
105 {
106 EVP_MD_CTX *ctx;
107
108 ctx=(EVP_MD_CTX *)Malloc(sizeof(EVP_MD_CTX));
109 if (ctx == NULL) return(0);
110
111 bi->init=0;
112 bi->ptr=(char *)ctx;
113 bi->flags=0;
114 return(1);
115 }
116
117static int md_free(a)
118BIO *a;
119 {
120 if (a == NULL) return(0);
121 Free(a->ptr);
122 a->ptr=NULL;
123 a->init=0;
124 a->flags=0;
125 return(1);
126 }
127
128static int md_read(b,out,outl)
129BIO *b;
130char *out;
131int outl;
132 {
133 int ret=0;
134 EVP_MD_CTX *ctx;
135
136 if (out == NULL) return(0);
137 ctx=(EVP_MD_CTX *)b->ptr;
138
139 if ((ctx == NULL) || (b->next_bio == NULL)) return(0);
140
141 ret=BIO_read(b->next_bio,out,outl);
142 if (b->init)
143 {
144 if (ret > 0)
145 {
146 EVP_DigestUpdate(ctx,(unsigned char *)out,
147 (unsigned int)ret);
148 }
149 }
150 BIO_clear_retry_flags(b);
151 BIO_copy_next_retry(b);
152 return(ret);
153 }
154
155static int md_write(b,in,inl)
156BIO *b;
157char *in;
158int inl;
159 {
160 int ret=0;
161 EVP_MD_CTX *ctx;
162
163 if ((in == NULL) || (inl <= 0)) return(0);
164 ctx=(EVP_MD_CTX *)b->ptr;
165
166 if ((ctx != NULL) && (b->next_bio != NULL))
167 ret=BIO_write(b->next_bio,in,inl);
168 if (b->init)
169 {
170 if (ret > 0)
171 {
172 EVP_DigestUpdate(ctx,(unsigned char *)in,
173 (unsigned int)ret);
174 }
175 }
176 BIO_clear_retry_flags(b);
177 BIO_copy_next_retry(b);
178 return(ret);
179 }
180
181static long md_ctrl(b,cmd,num,ptr)
182BIO *b;
183int cmd;
184long num;
185char *ptr;
186 {
187 EVP_MD_CTX *ctx,*dctx,**pctx;
188 EVP_MD **ppmd;
189 EVP_MD *md;
190 long ret=1;
191 BIO *dbio;
192
193 ctx=(EVP_MD_CTX *)b->ptr;
194
195 switch (cmd)
196 {
197 case BIO_CTRL_RESET:
198 if (b->init)
199 EVP_DigestInit(ctx,ctx->digest);
200 else
201 ret=0;
202 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
203 break;
204 case BIO_C_GET_MD:
205 if (b->init)
206 {
207 ppmd=(EVP_MD **)ptr;
208 *ppmd=ctx->digest;
209 }
210 else
211 ret=0;
212 break;
213 case BIO_C_GET_MD_CTX:
214 if (b->init)
215 {
216 pctx=(EVP_MD_CTX **)ptr;
217 *pctx=ctx;
218 }
219 else
220 ret=0;
221 break;
222 case BIO_C_DO_STATE_MACHINE:
223 BIO_clear_retry_flags(b);
224 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
225 BIO_copy_next_retry(b);
226 break;
227
228 case BIO_C_SET_MD:
229 md=(EVP_MD *)ptr;
230 EVP_DigestInit(ctx,md);
231 b->init=1;
232 break;
233 case BIO_CTRL_DUP:
234 dbio=(BIO *)ptr;
235 dctx=(EVP_MD_CTX *)dbio->ptr;
236 memcpy(dctx,ctx,sizeof(ctx));
237 b->init=1;
238 break;
239 default:
240 ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
241 break;
242 }
243 return(ret);
244 }
245
246static int md_gets(bp,buf,size)
247BIO *bp;
248char *buf;
249int size;
250 {
251 EVP_MD_CTX *ctx;
252 unsigned int ret;
253
254
255 ctx=(EVP_MD_CTX *)bp->ptr;
256 if (size < ctx->digest->md_size)
257 return(0);
258 EVP_DigestFinal(ctx,(unsigned char *)buf,&ret);
259 return((int)ret);
260 }
261
262/*
263static int md_puts(bp,str)
264BIO *bp;
265char *str;
266 {
267 return(-1);
268 }
269*/
270