diff options
| author | markus <> | 2002-09-05 12:51:50 +0000 |
|---|---|---|
| committer | markus <> | 2002-09-05 12:51:50 +0000 |
| commit | 15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch) | |
| tree | bf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/asn1/a_sign.c | |
| parent | 027351f729b9e837200dae6e1520cda6577ab930 (diff) | |
| download | openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2 openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip | |
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/asn1/a_sign.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/a_sign.c | 195 |
1 files changed, 171 insertions, 24 deletions
diff --git a/src/lib/libcrypto/asn1/a_sign.c b/src/lib/libcrypto/asn1/a_sign.c index 02188e68c4..de53b44144 100644 --- a/src/lib/libcrypto/asn1/a_sign.c +++ b/src/lib/libcrypto/asn1/a_sign.c | |||
| @@ -55,34 +55,87 @@ | |||
| 55 | * copied and put under another distribution licence | 55 | * copied and put under another distribution licence |
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | /* ==================================================================== | ||
| 59 | * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. | ||
| 60 | * | ||
| 61 | * Redistribution and use in source and binary forms, with or without | ||
| 62 | * modification, are permitted provided that the following conditions | ||
| 63 | * are met: | ||
| 64 | * | ||
| 65 | * 1. Redistributions of source code must retain the above copyright | ||
| 66 | * notice, this list of conditions and the following disclaimer. | ||
| 67 | * | ||
| 68 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 69 | * notice, this list of conditions and the following disclaimer in | ||
| 70 | * the documentation and/or other materials provided with the | ||
| 71 | * distribution. | ||
| 72 | * | ||
| 73 | * 3. All advertising materials mentioning features or use of this | ||
| 74 | * software must display the following acknowledgment: | ||
| 75 | * "This product includes software developed by the OpenSSL Project | ||
| 76 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
| 77 | * | ||
| 78 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 79 | * endorse or promote products derived from this software without | ||
| 80 | * prior written permission. For written permission, please contact | ||
| 81 | * openssl-core@openssl.org. | ||
| 82 | * | ||
| 83 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 84 | * nor may "OpenSSL" appear in their names without prior written | ||
| 85 | * permission of the OpenSSL Project. | ||
| 86 | * | ||
| 87 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 88 | * acknowledgment: | ||
| 89 | * "This product includes software developed by the OpenSSL Project | ||
| 90 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
| 91 | * | ||
| 92 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 93 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 94 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 95 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 96 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 97 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 98 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 99 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 100 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 101 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 102 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 103 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 104 | * ==================================================================== | ||
| 105 | * | ||
| 106 | * This product includes cryptographic software written by Eric Young | ||
| 107 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 108 | * Hudson (tjh@cryptsoft.com). | ||
| 109 | * | ||
| 110 | */ | ||
| 58 | 111 | ||
| 59 | #include <stdio.h> | 112 | #include <stdio.h> |
| 60 | #include <time.h> | 113 | #include <time.h> |
| 61 | #include <sys/types.h> | ||
| 62 | #include <sys/stat.h> | ||
| 63 | 114 | ||
| 64 | #include "cryptlib.h" | 115 | #include "cryptlib.h" |
| 65 | #include "bn.h" | ||
| 66 | #include "evp.h" | ||
| 67 | #include "x509.h" | ||
| 68 | #include "objects.h" | ||
| 69 | #include "buffer.h" | ||
| 70 | #include "pem.h" | ||
| 71 | 116 | ||
| 72 | int ASN1_sign(i2d,algor1,algor2,signature,data,pkey,type) | 117 | #ifndef NO_SYS_TYPES_H |
| 73 | int (*i2d)(); | 118 | # include <sys/types.h> |
| 74 | X509_ALGOR *algor1; | 119 | #endif |
| 75 | X509_ALGOR *algor2; | 120 | |
| 76 | ASN1_BIT_STRING *signature; | 121 | #include <openssl/bn.h> |
| 77 | char *data; | 122 | #include <openssl/evp.h> |
| 78 | EVP_PKEY *pkey; | 123 | #include <openssl/x509.h> |
| 79 | EVP_MD *type; | 124 | #include <openssl/objects.h> |
| 125 | #include <openssl/buffer.h> | ||
| 126 | |||
| 127 | #ifndef NO_ASN1_OLD | ||
| 128 | |||
| 129 | int ASN1_sign(int (*i2d)(), X509_ALGOR *algor1, X509_ALGOR *algor2, | ||
| 130 | ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey, | ||
| 131 | const EVP_MD *type) | ||
| 80 | { | 132 | { |
| 81 | EVP_MD_CTX ctx; | 133 | EVP_MD_CTX ctx; |
| 82 | unsigned char *p,*buf_in=NULL,*buf_out=NULL; | 134 | unsigned char *p,*buf_in=NULL,*buf_out=NULL; |
| 83 | int i,inl=0,outl=0,outll=0; | 135 | int i,inl=0,outl=0,outll=0; |
| 84 | X509_ALGOR *a; | 136 | X509_ALGOR *a; |
| 85 | 137 | ||
| 138 | EVP_MD_CTX_init(&ctx); | ||
| 86 | for (i=0; i<2; i++) | 139 | for (i=0; i<2; i++) |
| 87 | { | 140 | { |
| 88 | if (i == 0) | 141 | if (i == 0) |
| @@ -90,7 +143,14 @@ EVP_MD *type; | |||
| 90 | else | 143 | else |
| 91 | a=algor2; | 144 | a=algor2; |
| 92 | if (a == NULL) continue; | 145 | if (a == NULL) continue; |
| 93 | if ( (a->parameter == NULL) || | 146 | if (type->pkey_type == NID_dsaWithSHA1) |
| 147 | { | ||
| 148 | /* special case: RFC 2459 tells us to omit 'parameters' | ||
| 149 | * with id-dsa-with-sha1 */ | ||
| 150 | ASN1_TYPE_free(a->parameter); | ||
| 151 | a->parameter = NULL; | ||
| 152 | } | ||
| 153 | else if ((a->parameter == NULL) || | ||
| 94 | (a->parameter->type != V_ASN1_NULL)) | 154 | (a->parameter->type != V_ASN1_NULL)) |
| 95 | { | 155 | { |
| 96 | ASN1_TYPE_free(a->parameter); | 156 | ASN1_TYPE_free(a->parameter); |
| @@ -111,9 +171,9 @@ EVP_MD *type; | |||
| 111 | } | 171 | } |
| 112 | } | 172 | } |
| 113 | inl=i2d(data,NULL); | 173 | inl=i2d(data,NULL); |
| 114 | buf_in=(unsigned char *)Malloc((unsigned int)inl); | 174 | buf_in=(unsigned char *)OPENSSL_malloc((unsigned int)inl); |
| 115 | outll=outl=EVP_PKEY_size(pkey); | 175 | outll=outl=EVP_PKEY_size(pkey); |
| 116 | buf_out=(unsigned char *)Malloc((unsigned int)outl); | 176 | buf_out=(unsigned char *)OPENSSL_malloc((unsigned int)outl); |
| 117 | if ((buf_in == NULL) || (buf_out == NULL)) | 177 | if ((buf_in == NULL) || (buf_out == NULL)) |
| 118 | { | 178 | { |
| 119 | outl=0; | 179 | outl=0; |
| @@ -123,7 +183,7 @@ EVP_MD *type; | |||
| 123 | p=buf_in; | 183 | p=buf_in; |
| 124 | 184 | ||
| 125 | i2d(data,&p); | 185 | i2d(data,&p); |
| 126 | EVP_SignInit(&ctx,type); | 186 | EVP_SignInit_ex(&ctx,type, NULL); |
| 127 | EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); | 187 | EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); |
| 128 | if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out, | 188 | if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out, |
| 129 | (unsigned int *)&outl,pkey)) | 189 | (unsigned int *)&outl,pkey)) |
| @@ -132,16 +192,103 @@ EVP_MD *type; | |||
| 132 | ASN1err(ASN1_F_ASN1_SIGN,ERR_R_EVP_LIB); | 192 | ASN1err(ASN1_F_ASN1_SIGN,ERR_R_EVP_LIB); |
| 133 | goto err; | 193 | goto err; |
| 134 | } | 194 | } |
| 135 | if (signature->data != NULL) Free((char *)signature->data); | 195 | if (signature->data != NULL) OPENSSL_free(signature->data); |
| 136 | signature->data=buf_out; | 196 | signature->data=buf_out; |
| 137 | buf_out=NULL; | 197 | buf_out=NULL; |
| 138 | signature->length=outl; | 198 | signature->length=outl; |
| 199 | /* In the interests of compatibility, I'll make sure that | ||
| 200 | * the bit string has a 'not-used bits' value of 0 | ||
| 201 | */ | ||
| 202 | signature->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | ||
| 203 | signature->flags|=ASN1_STRING_FLAG_BITS_LEFT; | ||
| 204 | err: | ||
| 205 | EVP_MD_CTX_cleanup(&ctx); | ||
| 206 | if (buf_in != NULL) | ||
| 207 | { memset((char *)buf_in,0,(unsigned int)inl); OPENSSL_free(buf_in); } | ||
| 208 | if (buf_out != NULL) | ||
| 209 | { memset((char *)buf_out,0,outll); OPENSSL_free(buf_out); } | ||
| 210 | return(outl); | ||
| 211 | } | ||
| 212 | |||
| 213 | #endif | ||
| 214 | |||
| 215 | int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2, | ||
| 216 | ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey, | ||
| 217 | const EVP_MD *type) | ||
| 218 | { | ||
| 219 | EVP_MD_CTX ctx; | ||
| 220 | unsigned char *buf_in=NULL,*buf_out=NULL; | ||
| 221 | int i,inl=0,outl=0,outll=0; | ||
| 222 | X509_ALGOR *a; | ||
| 223 | |||
| 224 | EVP_MD_CTX_init(&ctx); | ||
| 225 | for (i=0; i<2; i++) | ||
| 226 | { | ||
| 227 | if (i == 0) | ||
| 228 | a=algor1; | ||
| 229 | else | ||
| 230 | a=algor2; | ||
| 231 | if (a == NULL) continue; | ||
| 232 | if (type->pkey_type == NID_dsaWithSHA1) | ||
| 233 | { | ||
| 234 | /* special case: RFC 2459 tells us to omit 'parameters' | ||
| 235 | * with id-dsa-with-sha1 */ | ||
| 236 | ASN1_TYPE_free(a->parameter); | ||
| 237 | a->parameter = NULL; | ||
| 238 | } | ||
| 239 | else if ((a->parameter == NULL) || | ||
| 240 | (a->parameter->type != V_ASN1_NULL)) | ||
| 241 | { | ||
| 242 | ASN1_TYPE_free(a->parameter); | ||
| 243 | if ((a->parameter=ASN1_TYPE_new()) == NULL) goto err; | ||
| 244 | a->parameter->type=V_ASN1_NULL; | ||
| 245 | } | ||
| 246 | ASN1_OBJECT_free(a->algorithm); | ||
| 247 | a->algorithm=OBJ_nid2obj(type->pkey_type); | ||
| 248 | if (a->algorithm == NULL) | ||
| 249 | { | ||
| 250 | ASN1err(ASN1_F_ASN1_SIGN,ASN1_R_UNKNOWN_OBJECT_TYPE); | ||
| 251 | goto err; | ||
| 252 | } | ||
| 253 | if (a->algorithm->length == 0) | ||
| 254 | { | ||
| 255 | ASN1err(ASN1_F_ASN1_SIGN,ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD); | ||
| 256 | goto err; | ||
| 257 | } | ||
| 258 | } | ||
| 259 | inl=ASN1_item_i2d(asn,&buf_in, it); | ||
| 260 | outll=outl=EVP_PKEY_size(pkey); | ||
| 261 | buf_out=(unsigned char *)OPENSSL_malloc((unsigned int)outl); | ||
| 262 | if ((buf_in == NULL) || (buf_out == NULL)) | ||
| 263 | { | ||
| 264 | outl=0; | ||
| 265 | ASN1err(ASN1_F_ASN1_SIGN,ERR_R_MALLOC_FAILURE); | ||
| 266 | goto err; | ||
| 267 | } | ||
| 139 | 268 | ||
| 269 | EVP_SignInit_ex(&ctx,type, NULL); | ||
| 270 | EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl); | ||
| 271 | if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out, | ||
| 272 | (unsigned int *)&outl,pkey)) | ||
| 273 | { | ||
| 274 | outl=0; | ||
| 275 | ASN1err(ASN1_F_ASN1_SIGN,ERR_R_EVP_LIB); | ||
| 276 | goto err; | ||
| 277 | } | ||
| 278 | if (signature->data != NULL) OPENSSL_free(signature->data); | ||
| 279 | signature->data=buf_out; | ||
| 280 | buf_out=NULL; | ||
| 281 | signature->length=outl; | ||
| 282 | /* In the interests of compatibility, I'll make sure that | ||
| 283 | * the bit string has a 'not-used bits' value of 0 | ||
| 284 | */ | ||
| 285 | signature->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | ||
| 286 | signature->flags|=ASN1_STRING_FLAG_BITS_LEFT; | ||
| 140 | err: | 287 | err: |
| 141 | memset(&ctx,0,sizeof(ctx)); | 288 | EVP_MD_CTX_cleanup(&ctx); |
| 142 | if (buf_in != NULL) | 289 | if (buf_in != NULL) |
| 143 | { memset((char *)buf_in,0,(unsigned int)inl); Free((char *)buf_in); } | 290 | { memset((char *)buf_in,0,(unsigned int)inl); OPENSSL_free(buf_in); } |
| 144 | if (buf_out != NULL) | 291 | if (buf_out != NULL) |
| 145 | { memset((char *)buf_out,0,outll); Free((char *)buf_out); } | 292 | { memset((char *)buf_out,0,outll); OPENSSL_free(buf_out); } |
| 146 | return(outl); | 293 | return(outl); |
| 147 | } | 294 | } |
