diff options
Diffstat (limited to 'src/lib/libcrypto/pem/pem_lib.c')
| -rw-r--r-- | src/lib/libcrypto/pem/pem_lib.c | 329 | 
1 files changed, 163 insertions, 166 deletions
| diff --git a/src/lib/libcrypto/pem/pem_lib.c b/src/lib/libcrypto/pem/pem_lib.c index 7a2c0ad83b..18b751a91a 100644 --- a/src/lib/libcrypto/pem/pem_lib.c +++ b/src/lib/libcrypto/pem/pem_lib.c | |||
| @@ -58,45 +58,40 @@ | |||
| 58 | 58 | ||
| 59 | #include <stdio.h> | 59 | #include <stdio.h> | 
| 60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" | 
| 61 | #include "buffer.h" | 61 | #include <openssl/buffer.h> | 
| 62 | #include "objects.h" | 62 | #include <openssl/objects.h> | 
| 63 | #include "evp.h" | 63 | #include <openssl/evp.h> | 
| 64 | #include "rand.h" | 64 | #include <openssl/rand.h> | 
| 65 | #include "x509.h" | 65 | #include <openssl/x509.h> | 
| 66 | #include "pem.h" | 66 | #include <openssl/pem.h> | 
| 67 | #ifndef NO_DES | 67 | #include <openssl/pkcs12.h> | 
| 68 | #include "des.h" | 68 | #ifndef OPENSSL_NO_DES | 
| 69 | #include <openssl/des.h> | ||
| 69 | #endif | 70 | #endif | 
| 70 | 71 | ||
| 71 | char *PEM_version="PEM part of SSLeay 0.9.0b 29-Jun-1998"; | 72 | const char *PEM_version="PEM" OPENSSL_VERSION_PTEXT; | 
| 72 | 73 | ||
| 73 | #define MIN_LENGTH 4 | 74 | #define MIN_LENGTH 4 | 
| 74 | 75 | ||
| 75 | /* PEMerr(PEM_F_PEM_WRITE_BIO,ERR_R_MALLOC_FAILURE); | ||
| 76 | * PEMerr(PEM_F_PEM_READ_BIO,ERR_R_MALLOC_FAILURE); | ||
| 77 | */ | ||
| 78 | |||
| 79 | #ifndef NOPROTO | ||
| 80 | static int def_callback(char *buf, int num, int w); | ||
| 81 | static int load_iv(unsigned char **fromp,unsigned char *to, int num); | 76 | static int load_iv(unsigned char **fromp,unsigned char *to, int num); | 
| 82 | #else | 77 | static int check_pem(const char *nm, const char *name); | 
| 83 | static int def_callback(); | ||
| 84 | static int load_iv(); | ||
| 85 | #endif | ||
| 86 | 78 | ||
| 87 | static int def_callback(buf, num, w) | 79 | int PEM_def_callback(char *buf, int num, int w, void *key) | 
| 88 | char *buf; | ||
| 89 | int num; | ||
| 90 | int w; | ||
| 91 | { | 80 | { | 
| 92 | #ifdef NO_FP_API | 81 | #ifdef OPENSSL_NO_FP_API | 
| 93 | /* We should not ever call the default callback routine from | 82 | /* We should not ever call the default callback routine from | 
| 94 | * windows. */ | 83 | * windows. */ | 
| 95 | PEMerr(PEM_F_DEF_CALLBACK,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 84 | PEMerr(PEM_F_DEF_CALLBACK,ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | 
| 96 | return(-1); | 85 | return(-1); | 
| 97 | #else | 86 | #else | 
| 98 | int i,j; | 87 | int i,j; | 
| 99 | char *prompt; | 88 | const char *prompt; | 
| 89 | if(key) { | ||
| 90 | i=strlen(key); | ||
| 91 | i=(i > num)?num:i; | ||
| 92 | memcpy(buf,key,i); | ||
| 93 | return(i); | ||
| 94 | } | ||
| 100 | 95 | ||
| 101 | prompt=EVP_get_pw_prompt(); | 96 | prompt=EVP_get_pw_prompt(); | 
| 102 | if (prompt == NULL) | 97 | if (prompt == NULL) | 
| @@ -123,11 +118,9 @@ int w; | |||
| 123 | #endif | 118 | #endif | 
| 124 | } | 119 | } | 
| 125 | 120 | ||
| 126 | void PEM_proc_type(buf, type) | 121 | void PEM_proc_type(char *buf, int type) | 
| 127 | char *buf; | ||
| 128 | int type; | ||
| 129 | { | 122 | { | 
| 130 | char *str; | 123 | const char *str; | 
| 131 | 124 | ||
| 132 | if (type == PEM_TYPE_ENCRYPTED) | 125 | if (type == PEM_TYPE_ENCRYPTED) | 
| 133 | str="ENCRYPTED"; | 126 | str="ENCRYPTED"; | 
| @@ -143,11 +136,7 @@ int type; | |||
| 143 | strcat(buf,"\n"); | 136 | strcat(buf,"\n"); | 
| 144 | } | 137 | } | 
| 145 | 138 | ||
| 146 | void PEM_dek_info(buf, type, len, str) | 139 | void PEM_dek_info(char *buf, const char *type, int len, char *str) | 
| 147 | char *buf; | ||
| 148 | char *type; | ||
| 149 | int len; | ||
| 150 | char *str; | ||
| 151 | { | 140 | { | 
| 152 | static unsigned char map[17]="0123456789ABCDEF"; | 141 | static unsigned char map[17]="0123456789ABCDEF"; | 
| 153 | long i; | 142 | long i; | 
| @@ -166,13 +155,9 @@ char *str; | |||
| 166 | buf[j+i*2+1]='\0'; | 155 | buf[j+i*2+1]='\0'; | 
| 167 | } | 156 | } | 
| 168 | 157 | ||
| 169 | #ifndef NO_FP_API | 158 | #ifndef OPENSSL_NO_FP_API | 
| 170 | char *PEM_ASN1_read(d2i,name,fp, x, cb) | 159 | char *PEM_ASN1_read(char *(*d2i)(), const char *name, FILE *fp, char **x, | 
| 171 | char *(*d2i)(); | 160 | pem_password_cb *cb, void *u) | 
| 172 | char *name; | ||
| 173 | FILE *fp; | ||
| 174 | char **x; | ||
| 175 | int (*cb)(); | ||
| 176 | { | 161 | { | 
| 177 | BIO *b; | 162 | BIO *b; | 
| 178 | char *ret; | 163 | char *ret; | 
| @@ -183,74 +168,97 @@ int (*cb)(); | |||
| 183 | return(0); | 168 | return(0); | 
| 184 | } | 169 | } | 
| 185 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 170 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 
| 186 | ret=PEM_ASN1_read_bio(d2i,name,b,x,cb); | 171 | ret=PEM_ASN1_read_bio(d2i,name,b,x,cb,u); | 
| 187 | BIO_free(b); | 172 | BIO_free(b); | 
| 188 | return(ret); | 173 | return(ret); | 
| 189 | } | 174 | } | 
| 190 | #endif | 175 | #endif | 
| 191 | 176 | ||
| 192 | char *PEM_ASN1_read_bio(d2i,name,bp, x, cb) | 177 | static int check_pem(const char *nm, const char *name) | 
| 193 | char *(*d2i)(); | 178 | { | 
| 194 | char *name; | 179 | /* Normal matching nm and name */ | 
| 195 | BIO *bp; | 180 | if (!strcmp(nm,name)) return 1; | 
| 196 | char **x; | 181 | |
| 197 | int (*cb)(); | 182 | /* Make PEM_STRING_EVP_PKEY match any private key */ | 
| 183 | |||
| 184 | if(!strcmp(nm,PEM_STRING_PKCS8) && | ||
| 185 | !strcmp(name,PEM_STRING_EVP_PKEY)) return 1; | ||
| 186 | |||
| 187 | if(!strcmp(nm,PEM_STRING_PKCS8INF) && | ||
| 188 | !strcmp(name,PEM_STRING_EVP_PKEY)) return 1; | ||
| 189 | |||
| 190 | if(!strcmp(nm,PEM_STRING_RSA) && | ||
| 191 | !strcmp(name,PEM_STRING_EVP_PKEY)) return 1; | ||
| 192 | |||
| 193 | if(!strcmp(nm,PEM_STRING_DSA) && | ||
| 194 | !strcmp(name,PEM_STRING_EVP_PKEY)) return 1; | ||
| 195 | |||
| 196 | /* Permit older strings */ | ||
| 197 | |||
| 198 | if(!strcmp(nm,PEM_STRING_X509_OLD) && | ||
| 199 | !strcmp(name,PEM_STRING_X509)) return 1; | ||
| 200 | |||
| 201 | if(!strcmp(nm,PEM_STRING_X509_REQ_OLD) && | ||
| 202 | !strcmp(name,PEM_STRING_X509_REQ)) return 1; | ||
| 203 | |||
| 204 | /* Allow normal certs to be read as trusted certs */ | ||
| 205 | if(!strcmp(nm,PEM_STRING_X509) && | ||
| 206 | !strcmp(name,PEM_STRING_X509_TRUSTED)) return 1; | ||
| 207 | |||
| 208 | if(!strcmp(nm,PEM_STRING_X509_OLD) && | ||
| 209 | !strcmp(name,PEM_STRING_X509_TRUSTED)) return 1; | ||
| 210 | |||
| 211 | /* Some CAs use PKCS#7 with CERTIFICATE headers */ | ||
| 212 | if(!strcmp(nm, PEM_STRING_X509) && | ||
| 213 | !strcmp(name, PEM_STRING_PKCS7)) return 1; | ||
| 214 | |||
| 215 | return 0; | ||
| 216 | } | ||
| 217 | |||
| 218 | int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO *bp, | ||
| 219 | pem_password_cb *cb, void *u) | ||
| 198 | { | 220 | { | 
| 199 | EVP_CIPHER_INFO cipher; | 221 | EVP_CIPHER_INFO cipher; | 
| 200 | char *nm=NULL,*header=NULL; | 222 | char *nm=NULL,*header=NULL; | 
| 201 | unsigned char *p=NULL,*data=NULL; | 223 | unsigned char *data=NULL; | 
| 202 | long len; | 224 | long len; | 
| 203 | char *ret=NULL; | 225 | int ret = 0; | 
| 204 | 226 | ||
| 205 | for (;;) | 227 | for (;;) | 
| 206 | { | 228 | { | 
| 207 | if (!PEM_read_bio(bp,&nm,&header,&data,&len)) return(NULL); | 229 | if (!PEM_read_bio(bp,&nm,&header,&data,&len)) { | 
| 208 | if ( (strcmp(nm,name) == 0) || | 230 | if(ERR_GET_REASON(ERR_peek_error()) == | 
| 209 | ((strcmp(nm,PEM_STRING_RSA) == 0) && | 231 | PEM_R_NO_START_LINE) | 
| 210 | (strcmp(name,PEM_STRING_EVP_PKEY) == 0)) || | 232 | ERR_add_error_data(2, "Expecting: ", name); | 
| 211 | ((strcmp(nm,PEM_STRING_DSA) == 0) && | 233 | return 0; | 
| 212 | (strcmp(name,PEM_STRING_EVP_PKEY) == 0)) || | ||
| 213 | ((strcmp(nm,PEM_STRING_X509_OLD) == 0) && | ||
| 214 | (strcmp(name,PEM_STRING_X509) == 0)) || | ||
| 215 | ((strcmp(nm,PEM_STRING_X509_REQ_OLD) == 0) && | ||
| 216 | (strcmp(name,PEM_STRING_X509_REQ) == 0)) | ||
| 217 | ) | ||
| 218 | break; | ||
| 219 | Free(nm); | ||
| 220 | Free(header); | ||
| 221 | Free(data); | ||
| 222 | } | 234 | } | 
| 223 | if (!PEM_get_EVP_CIPHER_INFO(header,&cipher)) goto err; | 235 | if(check_pem(nm, name)) break; | 
| 224 | if (!PEM_do_header(&cipher,data,&len,cb)) goto err; | 236 | OPENSSL_free(nm); | 
| 225 | p=data; | 237 | OPENSSL_free(header); | 
| 226 | if (strcmp(name,PEM_STRING_EVP_PKEY) == 0) | 238 | OPENSSL_free(data); | 
| 227 | { | ||
| 228 | if (strcmp(nm,PEM_STRING_RSA) == 0) | ||
| 229 | ret=d2i(EVP_PKEY_RSA,x,&p,len); | ||
| 230 | else if (strcmp(nm,PEM_STRING_DSA) == 0) | ||
| 231 | ret=d2i(EVP_PKEY_DSA,x,&p,len); | ||
| 232 | } | 239 | } | 
| 233 | else | 240 | if (!PEM_get_EVP_CIPHER_INFO(header,&cipher)) goto err; | 
| 234 | ret=d2i(x,&p,len); | 241 | if (!PEM_do_header(&cipher,data,&len,cb,u)) goto err; | 
| 235 | if (ret == NULL) | 242 | |
| 236 | PEMerr(PEM_F_PEM_ASN1_READ_BIO,ERR_R_ASN1_LIB); | 243 | *pdata = data; | 
| 244 | *plen = len; | ||
| 245 | |||
| 246 | if (pnm) | ||
| 247 | *pnm = nm; | ||
| 248 | |||
| 249 | ret = 1; | ||
| 250 | |||
| 237 | err: | 251 | err: | 
| 238 | Free(nm); | 252 | if (!pnm) OPENSSL_free(nm); | 
| 239 | Free(header); | 253 | OPENSSL_free(header); | 
| 240 | Free(data); | 254 | if (!ret) OPENSSL_free(data); | 
| 241 | return(ret); | 255 | return ret; | 
| 242 | } | 256 | } | 
| 243 | 257 | ||
| 244 | #ifndef NO_FP_API | 258 | #ifndef OPENSSL_NO_FP_API | 
| 245 | int PEM_ASN1_write(i2d,name,fp, x, enc, kstr, klen, callback) | 259 | int PEM_ASN1_write(int (*i2d)(), const char *name, FILE *fp, char *x, | 
| 246 | int (*i2d)(); | 260 | const EVP_CIPHER *enc, unsigned char *kstr, int klen, | 
| 247 | char *name; | 261 | pem_password_cb *callback, void *u) | 
| 248 | FILE *fp; | ||
| 249 | char *x; | ||
| 250 | EVP_CIPHER *enc; | ||
| 251 | unsigned char *kstr; | ||
| 252 | int klen; | ||
| 253 | int (*callback)(); | ||
| 254 | { | 262 | { | 
| 255 | BIO *b; | 263 | BIO *b; | 
| 256 | int ret; | 264 | int ret; | 
| @@ -261,27 +269,20 @@ int (*callback)(); | |||
| 261 | return(0); | 269 | return(0); | 
| 262 | } | 270 | } | 
| 263 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 271 | BIO_set_fp(b,fp,BIO_NOCLOSE); | 
| 264 | ret=PEM_ASN1_write_bio(i2d,name,b,x,enc,kstr,klen,callback); | 272 | ret=PEM_ASN1_write_bio(i2d,name,b,x,enc,kstr,klen,callback,u); | 
| 265 | BIO_free(b); | 273 | BIO_free(b); | 
| 266 | return(ret); | 274 | return(ret); | 
| 267 | } | 275 | } | 
| 268 | #endif | 276 | #endif | 
| 269 | 277 | ||
| 270 | int PEM_ASN1_write_bio(i2d,name,bp, x, enc, kstr, klen, callback) | 278 | int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x, | 
| 271 | int (*i2d)(); | 279 | const EVP_CIPHER *enc, unsigned char *kstr, int klen, | 
| 272 | char *name; | 280 | pem_password_cb *callback, void *u) | 
| 273 | BIO *bp; | ||
| 274 | char *x; | ||
| 275 | EVP_CIPHER *enc; | ||
| 276 | unsigned char *kstr; | ||
| 277 | int klen; | ||
| 278 | int (*callback)(); | ||
| 279 | { | 281 | { | 
| 280 | EVP_CIPHER_CTX ctx; | 282 | EVP_CIPHER_CTX ctx; | 
| 281 | int dsize=0,i,j,ret=0; | 283 | int dsize=0,i,j,ret=0; | 
| 282 | unsigned char *p,*data=NULL; | 284 | unsigned char *p,*data=NULL; | 
| 283 | char *objstr=NULL; | 285 | const char *objstr=NULL; | 
| 284 | #define PEM_BUFSIZE 1024 | ||
| 285 | char buf[PEM_BUFSIZE]; | 286 | char buf[PEM_BUFSIZE]; | 
| 286 | unsigned char key[EVP_MAX_KEY_LENGTH]; | 287 | unsigned char key[EVP_MAX_KEY_LENGTH]; | 
| 287 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 288 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 
| @@ -303,7 +304,7 @@ int (*callback)(); | |||
| 303 | goto err; | 304 | goto err; | 
| 304 | } | 305 | } | 
| 305 | /* dzise + 8 bytes are needed */ | 306 | /* dzise + 8 bytes are needed */ | 
| 306 | data=(unsigned char *)Malloc((unsigned int)dsize+20); | 307 | data=(unsigned char *)OPENSSL_malloc((unsigned int)dsize+20); | 
| 307 | if (data == NULL) | 308 | if (data == NULL) | 
| 308 | { | 309 | { | 
| 309 | PEMerr(PEM_F_PEM_ASN1_WRITE_BIO,ERR_R_MALLOC_FAILURE); | 310 | PEMerr(PEM_F_PEM_ASN1_WRITE_BIO,ERR_R_MALLOC_FAILURE); | 
| @@ -317,18 +318,23 @@ int (*callback)(); | |||
| 317 | if (kstr == NULL) | 318 | if (kstr == NULL) | 
| 318 | { | 319 | { | 
| 319 | if (callback == NULL) | 320 | if (callback == NULL) | 
| 320 | klen=def_callback(buf,PEM_BUFSIZE,1); | 321 | klen=PEM_def_callback(buf,PEM_BUFSIZE,1,u); | 
| 321 | else | 322 | else | 
| 322 | klen=(*callback)(buf,PEM_BUFSIZE,1); | 323 | klen=(*callback)(buf,PEM_BUFSIZE,1,u); | 
| 323 | if (klen <= 0) | 324 | if (klen <= 0) | 
| 324 | { | 325 | { | 
| 325 | PEMerr(PEM_F_PEM_ASN1_WRITE_BIO,PEM_R_READ_KEY); | 326 | PEMerr(PEM_F_PEM_ASN1_WRITE_BIO,PEM_R_READ_KEY); | 
| 326 | goto err; | 327 | goto err; | 
| 327 | } | 328 | } | 
| 329 | #ifdef CHARSET_EBCDIC | ||
| 330 | /* Convert the pass phrase from EBCDIC */ | ||
| 331 | ebcdic2ascii(buf, buf, klen); | ||
| 332 | #endif | ||
| 328 | kstr=(unsigned char *)buf; | 333 | kstr=(unsigned char *)buf; | 
| 329 | } | 334 | } | 
| 330 | RAND_seed(data,i);/* put in the RSA key. */ | 335 | RAND_add(data,i,0);/* put in the RSA key. */ | 
| 331 | RAND_bytes(iv,8); /* Generate a salt */ | 336 | if (RAND_pseudo_bytes(iv,enc->iv_len) < 0) /* Generate a salt */ | 
| 337 | goto err; | ||
| 332 | /* The 'iv' is used as the iv and as a salt. It is | 338 | /* The 'iv' is used as the iv and as a salt. It is | 
| 333 | * NOT taken from the BytesToKey function */ | 339 | * NOT taken from the BytesToKey function */ | 
| 334 | EVP_BytesToKey(enc,EVP_md5(),iv,kstr,klen,1,key,NULL); | 340 | EVP_BytesToKey(enc,EVP_md5(),iv,kstr,klen,1,key,NULL); | 
| @@ -337,12 +343,14 @@ int (*callback)(); | |||
| 337 | 343 | ||
| 338 | buf[0]='\0'; | 344 | buf[0]='\0'; | 
| 339 | PEM_proc_type(buf,PEM_TYPE_ENCRYPTED); | 345 | PEM_proc_type(buf,PEM_TYPE_ENCRYPTED); | 
| 340 | PEM_dek_info(buf,objstr,8,(char *)iv); | 346 | PEM_dek_info(buf,objstr,enc->iv_len,(char *)iv); | 
| 341 | /* k=strlen(buf); */ | 347 | /* k=strlen(buf); */ | 
| 342 | 348 | ||
| 343 | EVP_EncryptInit(&ctx,enc,key,iv); | 349 | EVP_CIPHER_CTX_init(&ctx); | 
| 350 | EVP_EncryptInit_ex(&ctx,enc,NULL,key,iv); | ||
| 344 | EVP_EncryptUpdate(&ctx,data,&j,data,i); | 351 | EVP_EncryptUpdate(&ctx,data,&j,data,i); | 
| 345 | EVP_EncryptFinal(&ctx,&(data[j]),&i); | 352 | EVP_EncryptFinal_ex(&ctx,&(data[j]),&i); | 
| 353 | EVP_CIPHER_CTX_cleanup(&ctx); | ||
| 346 | i+=j; | 354 | i+=j; | 
| 347 | ret=1; | 355 | ret=1; | 
| 348 | } | 356 | } | 
| @@ -359,15 +367,12 @@ err: | |||
| 359 | memset((char *)&ctx,0,sizeof(ctx)); | 367 | memset((char *)&ctx,0,sizeof(ctx)); | 
| 360 | memset(buf,0,PEM_BUFSIZE); | 368 | memset(buf,0,PEM_BUFSIZE); | 
| 361 | memset(data,0,(unsigned int)dsize); | 369 | memset(data,0,(unsigned int)dsize); | 
| 362 | Free(data); | 370 | OPENSSL_free(data); | 
| 363 | return(ret); | 371 | return(ret); | 
| 364 | } | 372 | } | 
| 365 | 373 | ||
| 366 | int PEM_do_header(cipher, data, plen, callback) | 374 | int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen, | 
| 367 | EVP_CIPHER_INFO *cipher; | 375 | pem_password_cb *callback,void *u) | 
| 368 | unsigned char *data; | ||
| 369 | long *plen; | ||
| 370 | int (*callback)(); | ||
| 371 | { | 376 | { | 
| 372 | int i,j,o,klen; | 377 | int i,j,o,klen; | 
| 373 | long len; | 378 | long len; | 
| @@ -379,21 +384,27 @@ int (*callback)(); | |||
| 379 | 384 | ||
| 380 | if (cipher->cipher == NULL) return(1); | 385 | if (cipher->cipher == NULL) return(1); | 
| 381 | if (callback == NULL) | 386 | if (callback == NULL) | 
| 382 | klen=def_callback(buf,PEM_BUFSIZE,0); | 387 | klen=PEM_def_callback(buf,PEM_BUFSIZE,0,u); | 
| 383 | else | 388 | else | 
| 384 | klen=callback(buf,PEM_BUFSIZE,0); | 389 | klen=callback(buf,PEM_BUFSIZE,0,u); | 
| 385 | if (klen <= 0) | 390 | if (klen <= 0) | 
| 386 | { | 391 | { | 
| 387 | PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_PASSWORD_READ); | 392 | PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_PASSWORD_READ); | 
| 388 | return(0); | 393 | return(0); | 
| 389 | } | 394 | } | 
| 395 | #ifdef CHARSET_EBCDIC | ||
| 396 | /* Convert the pass phrase from EBCDIC */ | ||
| 397 | ebcdic2ascii(buf, buf, klen); | ||
| 398 | #endif | ||
| 399 | |||
| 390 | EVP_BytesToKey(cipher->cipher,EVP_md5(),&(cipher->iv[0]), | 400 | EVP_BytesToKey(cipher->cipher,EVP_md5(),&(cipher->iv[0]), | 
| 391 | (unsigned char *)buf,klen,1,key,NULL); | 401 | (unsigned char *)buf,klen,1,key,NULL); | 
| 392 | 402 | ||
| 393 | j=(int)len; | 403 | j=(int)len; | 
| 394 | EVP_DecryptInit(&ctx,cipher->cipher,key,&(cipher->iv[0])); | 404 | EVP_CIPHER_CTX_init(&ctx); | 
| 405 | EVP_DecryptInit_ex(&ctx,cipher->cipher,NULL, key,&(cipher->iv[0])); | ||
| 395 | EVP_DecryptUpdate(&ctx,data,&i,data,j); | 406 | EVP_DecryptUpdate(&ctx,data,&i,data,j); | 
| 396 | o=EVP_DecryptFinal(&ctx,&(data[i]),&j); | 407 | o=EVP_DecryptFinal_ex(&ctx,&(data[i]),&j); | 
| 397 | EVP_CIPHER_CTX_cleanup(&ctx); | 408 | EVP_CIPHER_CTX_cleanup(&ctx); | 
| 398 | memset((char *)buf,0,sizeof(buf)); | 409 | memset((char *)buf,0,sizeof(buf)); | 
| 399 | memset((char *)key,0,sizeof(key)); | 410 | memset((char *)key,0,sizeof(key)); | 
| @@ -407,12 +418,10 @@ int (*callback)(); | |||
| 407 | return(1); | 418 | return(1); | 
| 408 | } | 419 | } | 
| 409 | 420 | ||
| 410 | int PEM_get_EVP_CIPHER_INFO(header,cipher) | 421 | int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher) | 
| 411 | char *header; | ||
| 412 | EVP_CIPHER_INFO *cipher; | ||
| 413 | { | 422 | { | 
| 414 | int o; | 423 | int o; | 
| 415 | EVP_CIPHER *enc=NULL; | 424 | const EVP_CIPHER *enc=NULL; | 
| 416 | char *p,c; | 425 | char *p,c; | 
| 417 | 426 | ||
| 418 | cipher->cipher=NULL; | 427 | cipher->cipher=NULL; | 
| @@ -438,9 +447,15 @@ EVP_CIPHER_INFO *cipher; | |||
| 438 | for (;;) | 447 | for (;;) | 
| 439 | { | 448 | { | 
| 440 | c= *header; | 449 | c= *header; | 
| 450 | #ifndef CHARSET_EBCDIC | ||
| 441 | if (!( ((c >= 'A') && (c <= 'Z')) || (c == '-') || | 451 | if (!( ((c >= 'A') && (c <= 'Z')) || (c == '-') || | 
| 442 | ((c >= '0') && (c <= '9')))) | 452 | ((c >= '0') && (c <= '9')))) | 
| 443 | break; | 453 | break; | 
| 454 | #else | ||
| 455 | if (!( isupper(c) || (c == '-') || | ||
| 456 | isdigit(c))) | ||
| 457 | break; | ||
| 458 | #endif | ||
| 444 | header++; | 459 | header++; | 
| 445 | } | 460 | } | 
| 446 | *header='\0'; | 461 | *header='\0'; | 
| @@ -454,14 +469,12 @@ EVP_CIPHER_INFO *cipher; | |||
| 454 | PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO,PEM_R_UNSUPPORTED_ENCRYPTION); | 469 | PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO,PEM_R_UNSUPPORTED_ENCRYPTION); | 
| 455 | return(0); | 470 | return(0); | 
| 456 | } | 471 | } | 
| 457 | if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),8)) return(0); | 472 | if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),enc->iv_len)) return(0); | 
| 458 | 473 | ||
| 459 | return(1); | 474 | return(1); | 
| 460 | } | 475 | } | 
| 461 | 476 | ||
| 462 | static int load_iv(fromp,to,num) | 477 | static int load_iv(unsigned char **fromp, unsigned char *to, int num) | 
| 463 | unsigned char **fromp,*to; | ||
| 464 | int num; | ||
| 465 | { | 478 | { | 
| 466 | int v,i; | 479 | int v,i; | 
| 467 | unsigned char *from; | 480 | unsigned char *from; | 
| @@ -490,13 +503,9 @@ int num; | |||
| 490 | return(1); | 503 | return(1); | 
| 491 | } | 504 | } | 
| 492 | 505 | ||
| 493 | #ifndef NO_FP_API | 506 | #ifndef OPENSSL_NO_FP_API | 
| 494 | int PEM_write(fp, name, header, data,len) | 507 | int PEM_write(FILE *fp, char *name, char *header, unsigned char *data, | 
| 495 | FILE *fp; | 508 | long len) | 
| 496 | char *name; | ||
| 497 | char *header; | ||
| 498 | unsigned char *data; | ||
| 499 | long len; | ||
| 500 | { | 509 | { | 
| 501 | BIO *b; | 510 | BIO *b; | 
| 502 | int ret; | 511 | int ret; | 
| @@ -513,12 +522,8 @@ long len; | |||
| 513 | } | 522 | } | 
| 514 | #endif | 523 | #endif | 
| 515 | 524 | ||
| 516 | int PEM_write_bio(bp, name, header, data,len) | 525 | int PEM_write_bio(BIO *bp, const char *name, char *header, unsigned char *data, | 
| 517 | BIO *bp; | 526 | long len) | 
| 518 | char *name; | ||
| 519 | char *header; | ||
| 520 | unsigned char *data; | ||
| 521 | long len; | ||
| 522 | { | 527 | { | 
| 523 | int nlen,n,i,j,outl; | 528 | int nlen,n,i,j,outl; | 
| 524 | unsigned char *buf; | 529 | unsigned char *buf; | 
| @@ -541,7 +546,7 @@ long len; | |||
| 541 | goto err; | 546 | goto err; | 
| 542 | } | 547 | } | 
| 543 | 548 | ||
| 544 | buf=(unsigned char *)Malloc(PEM_BUFSIZE*8); | 549 | buf=(unsigned char *)OPENSSL_malloc(PEM_BUFSIZE*8); | 
| 545 | if (buf == NULL) | 550 | if (buf == NULL) | 
| 546 | { | 551 | { | 
| 547 | reason=ERR_R_MALLOC_FAILURE; | 552 | reason=ERR_R_MALLOC_FAILURE; | 
| @@ -561,7 +566,7 @@ long len; | |||
| 561 | } | 566 | } | 
| 562 | EVP_EncodeFinal(&ctx,buf,&outl); | 567 | EVP_EncodeFinal(&ctx,buf,&outl); | 
| 563 | if ((outl > 0) && (BIO_write(bp,(char *)buf,outl) != outl)) goto err; | 568 | if ((outl > 0) && (BIO_write(bp,(char *)buf,outl) != outl)) goto err; | 
| 564 | Free(buf); | 569 | OPENSSL_free(buf); | 
| 565 | if ( (BIO_write(bp,"-----END ",9) != 9) || | 570 | if ( (BIO_write(bp,"-----END ",9) != 9) || | 
| 566 | (BIO_write(bp,name,nlen) != nlen) || | 571 | (BIO_write(bp,name,nlen) != nlen) || | 
| 567 | (BIO_write(bp,"-----\n",6) != 6)) | 572 | (BIO_write(bp,"-----\n",6) != 6)) | 
| @@ -572,13 +577,9 @@ err: | |||
| 572 | return(0); | 577 | return(0); | 
| 573 | } | 578 | } | 
| 574 | 579 | ||
| 575 | #ifndef NO_FP_API | 580 | #ifndef OPENSSL_NO_FP_API | 
| 576 | int PEM_read(fp, name, header, data,len) | 581 | int PEM_read(FILE *fp, char **name, char **header, unsigned char **data, | 
| 577 | FILE *fp; | 582 | long *len) | 
| 578 | char **name; | ||
| 579 | char **header; | ||
| 580 | unsigned char **data; | ||
| 581 | long *len; | ||
| 582 | { | 583 | { | 
| 583 | BIO *b; | 584 | BIO *b; | 
| 584 | int ret; | 585 | int ret; | 
| @@ -595,12 +596,8 @@ long *len; | |||
| 595 | } | 596 | } | 
| 596 | #endif | 597 | #endif | 
| 597 | 598 | ||
| 598 | int PEM_read_bio(bp, name, header, data, len) | 599 | int PEM_read_bio(BIO *bp, char **name, char **header, unsigned char **data, | 
| 599 | BIO *bp; | 600 | long *len) | 
| 600 | char **name; | ||
| 601 | char **header; | ||
| 602 | unsigned char **data; | ||
| 603 | long *len; | ||
| 604 | { | 601 | { | 
| 605 | EVP_ENCODE_CTX ctx; | 602 | EVP_ENCODE_CTX ctx; | 
| 606 | int end=0,i,k,bl=0,hl=0,nohead=0; | 603 | int end=0,i,k,bl=0,hl=0,nohead=0; | 
| @@ -643,7 +640,7 @@ long *len; | |||
| 643 | PEMerr(PEM_F_PEM_READ_BIO,ERR_R_MALLOC_FAILURE); | 640 | PEMerr(PEM_F_PEM_READ_BIO,ERR_R_MALLOC_FAILURE); | 
| 644 | goto err; | 641 | goto err; | 
| 645 | } | 642 | } | 
| 646 | strncpy(nameB->data,&(buf[11]),(unsigned int)i-6); | 643 | memcpy(nameB->data,&(buf[11]),i-6); | 
| 647 | nameB->data[i-6]='\0'; | 644 | nameB->data[i-6]='\0'; | 
| 648 | break; | 645 | break; | 
| 649 | } | 646 | } | 
| @@ -668,7 +665,7 @@ long *len; | |||
| 668 | nohead=1; | 665 | nohead=1; | 
| 669 | break; | 666 | break; | 
| 670 | } | 667 | } | 
| 671 | strncpy(&(headerB->data[hl]),buf,(unsigned int)i); | 668 | memcpy(&(headerB->data[hl]),buf,i); | 
| 672 | headerB->data[hl+i]='\0'; | 669 | headerB->data[hl+i]='\0'; | 
| 673 | hl+=i; | 670 | hl+=i; | 
| 674 | } | 671 | } | 
| @@ -696,7 +693,7 @@ long *len; | |||
| 696 | PEMerr(PEM_F_PEM_READ_BIO,ERR_R_MALLOC_FAILURE); | 693 | PEMerr(PEM_F_PEM_READ_BIO,ERR_R_MALLOC_FAILURE); | 
| 697 | goto err; | 694 | goto err; | 
| 698 | } | 695 | } | 
| 699 | strncpy(&(dataB->data[bl]),buf,(unsigned int)i); | 696 | memcpy(&(dataB->data[bl]),buf,i); | 
| 700 | dataB->data[bl+i]='\0'; | 697 | dataB->data[bl+i]='\0'; | 
| 701 | bl+=i; | 698 | bl+=i; | 
| 702 | if (end) | 699 | if (end) | 
| @@ -721,7 +718,7 @@ long *len; | |||
| 721 | } | 718 | } | 
| 722 | i=strlen(nameB->data); | 719 | i=strlen(nameB->data); | 
| 723 | if ( (strncmp(buf,"-----END ",9) != 0) || | 720 | if ( (strncmp(buf,"-----END ",9) != 0) || | 
| 724 | (strncmp(nameB->data,&(buf[9]),(unsigned int)i) != 0) || | 721 | (strncmp(nameB->data,&(buf[9]),i) != 0) || | 
| 725 | (strncmp(&(buf[9+i]),"-----\n",6) != 0)) | 722 | (strncmp(&(buf[9+i]),"-----\n",6) != 0)) | 
| 726 | { | 723 | { | 
| 727 | PEMerr(PEM_F_PEM_READ_BIO,PEM_R_BAD_END_LINE); | 724 | PEMerr(PEM_F_PEM_READ_BIO,PEM_R_BAD_END_LINE); | 
| @@ -750,9 +747,9 @@ long *len; | |||
| 750 | *header=headerB->data; | 747 | *header=headerB->data; | 
| 751 | *data=(unsigned char *)dataB->data; | 748 | *data=(unsigned char *)dataB->data; | 
| 752 | *len=bl; | 749 | *len=bl; | 
| 753 | Free(nameB); | 750 | OPENSSL_free(nameB); | 
| 754 | Free(headerB); | 751 | OPENSSL_free(headerB); | 
| 755 | Free(dataB); | 752 | OPENSSL_free(dataB); | 
| 756 | return(1); | 753 | return(1); | 
| 757 | err: | 754 | err: | 
| 758 | BUF_MEM_free(nameB); | 755 | BUF_MEM_free(nameB); | 
