| Index: openssl/crypto/asn1/p5_pbe.c
|
| ===================================================================
|
| --- openssl/crypto/asn1/p5_pbe.c (revision 105093)
|
| +++ openssl/crypto/asn1/p5_pbe.c (working copy)
|
| @@ -71,61 +71,78 @@
|
|
|
| IMPLEMENT_ASN1_FUNCTIONS(PBEPARAM)
|
|
|
| -/* Return an algorithm identifier for a PKCS#5 PBE algorithm */
|
|
|
| -X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt,
|
| - int saltlen)
|
| -{
|
| +/* Set an algorithm identifier for a PKCS#5 PBE algorithm */
|
| +
|
| +int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter,
|
| + const unsigned char *salt, int saltlen)
|
| + {
|
| PBEPARAM *pbe=NULL;
|
| - ASN1_OBJECT *al;
|
| - X509_ALGOR *algor;
|
| - ASN1_TYPE *astype=NULL;
|
| + ASN1_STRING *pbe_str=NULL;
|
| + unsigned char *sstr;
|
|
|
| - if (!(pbe = PBEPARAM_new ())) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| + pbe = PBEPARAM_new();
|
| + if (!pbe)
|
| + {
|
| + ASN1err(ASN1_F_PKCS5_PBE_SET0_ALGOR,ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| - }
|
| - if(iter <= 0) iter = PKCS5_DEFAULT_ITER;
|
| - if (!ASN1_INTEGER_set(pbe->iter, iter)) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| + }
|
| + if(iter <= 0)
|
| + iter = PKCS5_DEFAULT_ITER;
|
| + if (!ASN1_INTEGER_set(pbe->iter, iter))
|
| + {
|
| + ASN1err(ASN1_F_PKCS5_PBE_SET0_ALGOR,ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| - }
|
| - if (!saltlen) saltlen = PKCS5_SALT_LEN;
|
| - if (!(pbe->salt->data = OPENSSL_malloc (saltlen))) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| + }
|
| + if (!saltlen)
|
| + saltlen = PKCS5_SALT_LEN;
|
| + if (!ASN1_STRING_set(pbe->salt, NULL, saltlen))
|
| + {
|
| + ASN1err(ASN1_F_PKCS5_PBE_SET0_ALGOR,ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| - }
|
| - pbe->salt->length = saltlen;
|
| - if (salt) memcpy (pbe->salt->data, salt, saltlen);
|
| - else if (RAND_pseudo_bytes (pbe->salt->data, saltlen) < 0)
|
| + }
|
| + sstr = ASN1_STRING_data(pbe->salt);
|
| + if (salt)
|
| + memcpy(sstr, salt, saltlen);
|
| + else if (RAND_pseudo_bytes(sstr, saltlen) < 0)
|
| goto err;
|
|
|
| - if (!(astype = ASN1_TYPE_new())) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| + if(!ASN1_item_pack(pbe, ASN1_ITEM_rptr(PBEPARAM), &pbe_str))
|
| + {
|
| + ASN1err(ASN1_F_PKCS5_PBE_SET0_ALGOR,ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| - }
|
| + }
|
|
|
| - astype->type = V_ASN1_SEQUENCE;
|
| - if(!ASN1_pack_string_of(PBEPARAM, pbe, i2d_PBEPARAM,
|
| - &astype->value.sequence)) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| - goto err;
|
| - }
|
| - PBEPARAM_free (pbe);
|
| + PBEPARAM_free(pbe);
|
| pbe = NULL;
|
| -
|
| - al = OBJ_nid2obj(alg); /* never need to free al */
|
| - if (!(algor = X509_ALGOR_new())) {
|
| - ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| - goto err;
|
| +
|
| + if (X509_ALGOR_set0(algor, OBJ_nid2obj(alg), V_ASN1_SEQUENCE, pbe_str))
|
| + return 1;
|
| +
|
| +err:
|
| + if (pbe != NULL)
|
| + PBEPARAM_free(pbe);
|
| + if (pbe_str != NULL)
|
| + ASN1_STRING_free(pbe_str);
|
| + return 0;
|
| }
|
| - ASN1_OBJECT_free(algor->algorithm);
|
| - algor->algorithm = al;
|
| - algor->parameter = astype;
|
|
|
| - return (algor);
|
| -err:
|
| - if (pbe != NULL) PBEPARAM_free(pbe);
|
| - if (astype != NULL) ASN1_TYPE_free(astype);
|
| +/* Return an algorithm identifier for a PKCS#5 PBE algorithm */
|
| +
|
| +X509_ALGOR *PKCS5_pbe_set(int alg, int iter,
|
| + const unsigned char *salt, int saltlen)
|
| + {
|
| + X509_ALGOR *ret;
|
| + ret = X509_ALGOR_new();
|
| + if (!ret)
|
| + {
|
| + ASN1err(ASN1_F_PKCS5_PBE_SET,ERR_R_MALLOC_FAILURE);
|
| + return NULL;
|
| + }
|
| +
|
| + if (PKCS5_pbe_set0_algor(ret, alg, iter, salt, saltlen))
|
| + return ret;
|
| +
|
| + X509_ALGOR_free(ret);
|
| return NULL;
|
| -}
|
| + }
|
|
|