diff options
author | steve <steve> | 1999-03-28 23:17:13 +0000 |
---|---|---|
committer | steve <steve> | 1999-03-28 23:17:13 +0000 |
commit | 53ba73161134ba7ada63d7f963f1d5031f3358b9 (patch) | |
tree | 9ee383dd80e9cfadaf1680d4c0f479bc25607619 /crypto/asn1/p5_pbe.c | |
parent | 0aa17361f071d5cfa5238a30805150dccc9092b8 (diff) | |
download | openssl-53ba73161134ba7ada63d7f963f1d5031f3358b9.tar.gz |
Yet more PKCS#12 integration: add lots of files under crypto/pkcs12 and add
them to the build environment.
Diffstat (limited to 'crypto/asn1/p5_pbe.c')
-rw-r--r-- | crypto/asn1/p5_pbe.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/crypto/asn1/p5_pbe.c b/crypto/asn1/p5_pbe.c index a94d6c14d..afcf95599 100644 --- a/crypto/asn1/p5_pbe.c +++ b/crypto/asn1/p5_pbe.c @@ -59,9 +59,12 @@ #include <stdio.h> #include "cryptlib.h" #include "asn1_mac.h" +#include "rand.h" /* PKCS#5 password based encryption structure */ +#define PKCS5_SALT_LEN 8 + /* *ASN1err(ASN1_F_PBEPARAM_NEW,ASN1_R_DEOCDE_ERROR) *ASN1err(ASN1_F_D2I_PBEPARAM,ASN1_R_DEOCDE_ERROR) @@ -114,3 +117,68 @@ PBEPARAM *a; ASN1_INTEGER_free (a->iter); Free ((char *)a); } + +/* Return an algorithm identifier for a PKCS#5 PBE algorithm */ + +X509_ALGOR *PKCS5_pbe_set(alg, iter, salt, saltlen) +int alg; +int iter; +unsigned char *salt; +int saltlen; +{ + unsigned char *pdata, *ptmp; + int plen; + PBEPARAM *pbe; + ASN1_OBJECT *al; + X509_ALGOR *algor; + ASN1_TYPE *astype; + + if (!(pbe = PBEPARAM_new ())) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + ASN1_INTEGER_set (pbe->iter, iter); + if (!saltlen) saltlen = PKCS5_SALT_LEN; + if (!(pbe->salt->data = Malloc (saltlen))) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + pbe->salt->length = saltlen; + if (salt) memcpy (pbe->salt->data, salt, saltlen); + else RAND_bytes (pbe->salt->data, saltlen); + if (!(plen = i2d_PBEPARAM (pbe, NULL))) { + ASN1err(ASN1_F_ASN1_PBE_SET,ASN1_R_ENCODE_ERROR); + return NULL; + } + if (!(pdata = Malloc (plen))) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + ptmp = pdata; + i2d_PBEPARAM (pbe, &ptmp); + PBEPARAM_free (pbe); + + if (!(astype = ASN1_TYPE_new())) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + + astype->type = V_ASN1_SEQUENCE; + if (!(astype->value.sequence=ASN1_STRING_new())) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + ASN1_STRING_set (astype->value.sequence, pdata, plen); + Free (pdata); + + al = OBJ_nid2obj(alg); /* never need to free al */ + if (!(algor = X509_ALGOR_new())) { + ASN1err(ASN1_F_ASN1_PBE_SET,ERR_R_MALLOC_FAILURE); + return NULL; + } + ASN1_OBJECT_free(algor->algorithm); + algor->algorithm = al; + algor->parameter = astype; + + return (algor); +} |