Remove duplicate code.
Update code to use ASN1_TYPE_pack_sequence and ASN1_TYPE_unpack_sequence instead of performing the same operation manually. Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
22f5bd3dd2
commit
e93c8748ab
@ -165,17 +165,14 @@ X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter,
|
|||||||
|
|
||||||
if (!(ret = X509_ALGOR_new()))
|
if (!(ret = X509_ALGOR_new()))
|
||||||
goto merr;
|
goto merr;
|
||||||
if (!(ret->parameter = ASN1_TYPE_new()))
|
|
||||||
goto merr;
|
|
||||||
|
|
||||||
ret->algorithm = OBJ_nid2obj(NID_pbes2);
|
ret->algorithm = OBJ_nid2obj(NID_pbes2);
|
||||||
|
|
||||||
/* Encode PBE2PARAM into parameter */
|
/* Encode PBE2PARAM into parameter */
|
||||||
|
|
||||||
if (!ASN1_item_pack(pbe2, ASN1_ITEM_rptr(PBE2PARAM),
|
if (!ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(PBE2PARAM), pbe2,
|
||||||
&ret->parameter->value.sequence))
|
&ret->parameter))
|
||||||
goto merr;
|
goto merr;
|
||||||
ret->parameter->type = V_ASN1_SEQUENCE;
|
|
||||||
|
|
||||||
PBE2PARAM_free(pbe2);
|
PBE2PARAM_free(pbe2);
|
||||||
pbe2 = NULL;
|
pbe2 = NULL;
|
||||||
@ -261,13 +258,9 @@ X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen,
|
|||||||
|
|
||||||
/* Encode PBKDF2PARAM into parameter of pbe2 */
|
/* Encode PBKDF2PARAM into parameter of pbe2 */
|
||||||
|
|
||||||
if (!(keyfunc->parameter = ASN1_TYPE_new()))
|
if (!ASN1_TYPE_pack_sequence(ASN1_ITEM_rptr(PBKDF2PARAM), kdf,
|
||||||
goto merr;
|
&keyfunc->parameter))
|
||||||
|
|
||||||
if (!ASN1_item_pack(kdf, ASN1_ITEM_rptr(PBKDF2PARAM),
|
|
||||||
&keyfunc->parameter->value.sequence))
|
|
||||||
goto merr;
|
goto merr;
|
||||||
keyfunc->parameter->type = V_ASN1_SEQUENCE;
|
|
||||||
|
|
||||||
PBKDF2PARAM_free(kdf);
|
PBKDF2PARAM_free(kdf);
|
||||||
return keyfunc;
|
return keyfunc;
|
||||||
|
@ -320,8 +320,6 @@ int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri,
|
|||||||
{
|
{
|
||||||
CMS_EncryptedContentInfo *ec;
|
CMS_EncryptedContentInfo *ec;
|
||||||
CMS_PasswordRecipientInfo *pwri;
|
CMS_PasswordRecipientInfo *pwri;
|
||||||
const unsigned char *p = NULL;
|
|
||||||
int plen;
|
|
||||||
int r = 0;
|
int r = 0;
|
||||||
X509_ALGOR *algtmp, *kekalg = NULL;
|
X509_ALGOR *algtmp, *kekalg = NULL;
|
||||||
EVP_CIPHER_CTX kekctx;
|
EVP_CIPHER_CTX kekctx;
|
||||||
@ -346,11 +344,9 @@ int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (algtmp->parameter->type == V_ASN1_SEQUENCE) {
|
kekalg = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(X509_ALGOR),
|
||||||
p = algtmp->parameter->value.sequence->data;
|
algtmp->parameter);
|
||||||
plen = algtmp->parameter->value.sequence->length;
|
|
||||||
kekalg = d2i_X509_ALGOR(NULL, &p, plen);
|
|
||||||
}
|
|
||||||
if (kekalg == NULL) {
|
if (kekalg == NULL) {
|
||||||
CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT,
|
CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT,
|
||||||
CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER);
|
CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER);
|
||||||
|
@ -82,7 +82,6 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen,
|
|||||||
PBEPARAM *pbe;
|
PBEPARAM *pbe;
|
||||||
int saltlen, iter;
|
int saltlen, iter;
|
||||||
unsigned char *salt;
|
unsigned char *salt;
|
||||||
const unsigned char *pbuf;
|
|
||||||
int mdsize;
|
int mdsize;
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
EVP_MD_CTX_init(&ctx);
|
EVP_MD_CTX_init(&ctx);
|
||||||
@ -94,8 +93,8 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pbuf = param->value.sequence->data;
|
pbe = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBEPARAM), param);
|
||||||
if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) {
|
if (pbe == NULL) {
|
||||||
EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR);
|
EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -190,23 +190,14 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
|
|||||||
ASN1_TYPE *param, const EVP_CIPHER *c,
|
ASN1_TYPE *param, const EVP_CIPHER *c,
|
||||||
const EVP_MD *md, int en_de)
|
const EVP_MD *md, int en_de)
|
||||||
{
|
{
|
||||||
const unsigned char *pbuf;
|
|
||||||
int plen;
|
|
||||||
PBE2PARAM *pbe2 = NULL;
|
PBE2PARAM *pbe2 = NULL;
|
||||||
const EVP_CIPHER *cipher;
|
const EVP_CIPHER *cipher;
|
||||||
EVP_PBE_KEYGEN *kdf;
|
EVP_PBE_KEYGEN *kdf;
|
||||||
|
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
if (param == NULL || param->type != V_ASN1_SEQUENCE ||
|
pbe2 = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBE2PARAM), param);
|
||||||
param->value.sequence == NULL) {
|
if (pbe2 == NULL) {
|
||||||
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_DECODE_ERROR);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = param->value.sequence->data;
|
|
||||||
plen = param->value.sequence->length;
|
|
||||||
if (!(pbe2 = d2i_PBE2PARAM(NULL, &pbuf, plen))) {
|
|
||||||
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_DECODE_ERROR);
|
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_DECODE_ERROR);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -248,8 +239,7 @@ int PKCS5_v2_PBKDF2_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass,
|
|||||||
const EVP_CIPHER *c, const EVP_MD *md, int en_de)
|
const EVP_CIPHER *c, const EVP_MD *md, int en_de)
|
||||||
{
|
{
|
||||||
unsigned char *salt, key[EVP_MAX_KEY_LENGTH];
|
unsigned char *salt, key[EVP_MAX_KEY_LENGTH];
|
||||||
const unsigned char *pbuf;
|
int saltlen, iter;
|
||||||
int saltlen, iter, plen;
|
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
unsigned int keylen = 0;
|
unsigned int keylen = 0;
|
||||||
int prf_nid, hmac_md_nid;
|
int prf_nid, hmac_md_nid;
|
||||||
@ -265,15 +255,9 @@ int PKCS5_v2_PBKDF2_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass,
|
|||||||
|
|
||||||
/* Decode parameter */
|
/* Decode parameter */
|
||||||
|
|
||||||
if (!param || (param->type != V_ASN1_SEQUENCE)) {
|
kdf = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBKDF2PARAM), param);
|
||||||
EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_DECODE_ERROR);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = param->value.sequence->data;
|
if (kdf == NULL) {
|
||||||
plen = param->value.sequence->length;
|
|
||||||
|
|
||||||
if (!(kdf = d2i_PBKDF2PARAM(NULL, &pbuf, plen))) {
|
|
||||||
EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_DECODE_ERROR);
|
EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_DECODE_ERROR);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -74,18 +74,12 @@ int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
|
|||||||
PBEPARAM *pbe;
|
PBEPARAM *pbe;
|
||||||
int saltlen, iter, ret;
|
int saltlen, iter, ret;
|
||||||
unsigned char *salt;
|
unsigned char *salt;
|
||||||
const unsigned char *pbuf;
|
|
||||||
unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
|
unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
|
||||||
|
|
||||||
/* Extract useful info from parameter */
|
/* Extract useful info from parameter */
|
||||||
if (param == NULL || param->type != V_ASN1_SEQUENCE ||
|
|
||||||
param->value.sequence == NULL) {
|
|
||||||
PKCS12err(PKCS12_F_PKCS12_PBE_KEYIVGEN, PKCS12_R_DECODE_ERROR);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = param->value.sequence->data;
|
pbe = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBEPARAM), param);
|
||||||
if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) {
|
if (pbe == NULL) {
|
||||||
PKCS12err(PKCS12_F_PKCS12_PBE_KEYIVGEN, PKCS12_R_DECODE_ERROR);
|
PKCS12err(PKCS12_F_PKCS12_PBE_KEYIVGEN, PKCS12_R_DECODE_ERROR);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -221,10 +221,7 @@ static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass)
|
|||||||
static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen)
|
static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen)
|
||||||
{
|
{
|
||||||
PBEPARAM *pbe;
|
PBEPARAM *pbe;
|
||||||
const unsigned char *p;
|
pbe = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBEPARAM), alg->parameter);
|
||||||
|
|
||||||
p = alg->parameter->value.sequence->data;
|
|
||||||
pbe = d2i_PBEPARAM(NULL, &p, alg->parameter->value.sequence->length);
|
|
||||||
if (!pbe)
|
if (!pbe)
|
||||||
return 0;
|
return 0;
|
||||||
*pnid = OBJ_obj2nid(alg->algorithm);
|
*pnid = OBJ_obj2nid(alg->algorithm);
|
||||||
|
@ -271,34 +271,23 @@ static int rsa_priv_print(BIO *bp, const EVP_PKEY *pkey, int indent,
|
|||||||
/* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
|
/* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
|
||||||
static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg)
|
static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
|
||||||
int plen;
|
|
||||||
if (alg == NULL)
|
if (alg == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
|
if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (alg->parameter->type != V_ASN1_SEQUENCE)
|
return ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(X509_ALGOR),
|
||||||
return NULL;
|
alg->parameter);
|
||||||
|
|
||||||
p = alg->parameter->value.sequence->data;
|
|
||||||
plen = alg->parameter->value.sequence->length;
|
|
||||||
return d2i_X509_ALGOR(NULL, &p, plen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
|
static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
|
||||||
X509_ALGOR **pmaskHash)
|
X509_ALGOR **pmaskHash)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
|
||||||
int plen;
|
|
||||||
RSA_PSS_PARAMS *pss;
|
RSA_PSS_PARAMS *pss;
|
||||||
|
|
||||||
*pmaskHash = NULL;
|
*pmaskHash = NULL;
|
||||||
|
|
||||||
if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE)
|
pss = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(RSA_PSS_PARAMS),
|
||||||
return NULL;
|
alg->parameter);
|
||||||
p = alg->parameter->value.sequence->data;
|
|
||||||
plen = alg->parameter->value.sequence->length;
|
|
||||||
pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen);
|
|
||||||
|
|
||||||
if (!pss)
|
if (!pss)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -768,17 +757,12 @@ static int rsa_item_sign(EVP_MD_CTX *ctx, const ASN1_ITEM *it, void *asn,
|
|||||||
static RSA_OAEP_PARAMS *rsa_oaep_decode(const X509_ALGOR *alg,
|
static RSA_OAEP_PARAMS *rsa_oaep_decode(const X509_ALGOR *alg,
|
||||||
X509_ALGOR **pmaskHash)
|
X509_ALGOR **pmaskHash)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
|
||||||
int plen;
|
|
||||||
RSA_OAEP_PARAMS *pss;
|
RSA_OAEP_PARAMS *pss;
|
||||||
|
|
||||||
*pmaskHash = NULL;
|
*pmaskHash = NULL;
|
||||||
|
|
||||||
if (!alg->parameter || alg->parameter->type != V_ASN1_SEQUENCE)
|
pss = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(RSA_OAEP_PARAMS),
|
||||||
return NULL;
|
alg->parameter);
|
||||||
p = alg->parameter->value.sequence->data;
|
|
||||||
plen = alg->parameter->value.sequence->length;
|
|
||||||
pss = d2i_RSA_OAEP_PARAMS(NULL, &p, plen);
|
|
||||||
|
|
||||||
if (!pss)
|
if (!pss)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user