提交 856640b5 编写于 作者: D Dr. Stephen Henson

Extend PBE code to support non default PKCS#5 v2.0 PRFs.

上级 76240b3a
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
Changes between 0.9.8b and 0.9.9 [xx XXX xxxx] Changes between 0.9.8b and 0.9.9 [xx XXX xxxx]
*) Initial support for PKCS#5 v2.0 PRFs other than default SHA1 HMAC.
[Steve Henson]
*) Replace the algorithm specific calls to generate keys in "req" with the *) Replace the algorithm specific calls to generate keys in "req" with the
new API. new API.
[Steve Henson] [Steve Henson]
......
...@@ -799,8 +799,20 @@ void PKCS5_PBE_add(void); ...@@ -799,8 +799,20 @@ void PKCS5_PBE_add(void);
int EVP_PBE_CipherInit (ASN1_OBJECT *pbe_obj, const char *pass, int passlen, int EVP_PBE_CipherInit (ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de); ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de);
/* PBE type */
/* Can appear as the outermost AlgorithmIdentifier */
#define EVP_PBE_TYPE_OUTER 0x0
/* Is an PRF type OID */
#define EVP_PBE_TYPE_PRF 0x1
int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid,
EVP_PBE_KEYGEN *keygen);
int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
EVP_PBE_KEYGEN *keygen); EVP_PBE_KEYGEN *keygen);
int EVP_PBE_find(int type, int pbe_nid,
int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen);
void EVP_PBE_cleanup(void); void EVP_PBE_cleanup(void);
#define ASN1_PKEY_ALIAS 0x1 #define ASN1_PKEY_ALIAS 0x1
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* project 1999. * project 1999.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. * Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -67,71 +67,135 @@ static STACK *pbe_algs; ...@@ -67,71 +67,135 @@ static STACK *pbe_algs;
/* Setup a cipher context from a PBE algorithm */ /* Setup a cipher context from a PBE algorithm */
typedef struct { typedef struct
int pbe_nid; {
const EVP_CIPHER *cipher; int pbe_type;
const EVP_MD *md; int pbe_nid;
EVP_PBE_KEYGEN *keygen; int cipher_nid;
} EVP_PBE_CTL; int md_nid;
EVP_PBE_KEYGEN *keygen;
} EVP_PBE_CTL;
int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de) ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de)
{ {
const EVP_CIPHER *cipher;
const EVP_MD *md;
int cipher_nid, md_nid;
EVP_PBE_KEYGEN *keygen;
EVP_PBE_CTL *pbetmp, pbelu; if (!EVP_PBE_find(EVP_PBE_TYPE_OUTER, OBJ_obj2nid(pbe_obj),
int i; &cipher_nid, &md_nid, &keygen))
pbelu.pbe_nid = OBJ_obj2nid(pbe_obj); {
if (pbelu.pbe_nid != NID_undef) i = sk_find(pbe_algs, (char *)&pbelu);
else i = -1;
if (i == -1) {
char obj_tmp[80]; char obj_tmp[80];
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_PBE_ALGORITHM); EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_PBE_ALGORITHM);
if (!pbe_obj) BUF_strlcpy (obj_tmp, "NULL", sizeof obj_tmp); if (!pbe_obj) BUF_strlcpy (obj_tmp, "NULL", sizeof obj_tmp);
else i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj); else i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj);
ERR_add_error_data(2, "TYPE=", obj_tmp); ERR_add_error_data(2, "TYPE=", obj_tmp);
return 0; return 0;
} }
if(!pass) passlen = 0;
else if (passlen == -1) passlen = strlen(pass); if(!pass)
pbetmp = (EVP_PBE_CTL *)sk_value (pbe_algs, i); passlen = 0;
i = (*pbetmp->keygen)(ctx, pass, passlen, param, pbetmp->cipher, else if (passlen == -1)
pbetmp->md, en_de); passlen = strlen(pass);
if (!i) {
if (cipher_nid == -1)
cipher = NULL;
else
cipher = EVP_get_cipherbynid(cipher_nid);
if (md_nid == -1)
md = NULL;
else
md = EVP_get_digestbynid(md_nid);
if (!keygen(ctx, pass, passlen, param, cipher, md, en_de))
{
EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE); EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE);
return 0; return 0;
} }
return 1; return 1;
} }
static int pbe_cmp(const char * const *a, const char * const *b) static int pbe_cmp(const char * const *a, const char * const *b)
{ {
const EVP_PBE_CTL * const *pbe1 = (const EVP_PBE_CTL * const *) a, const EVP_PBE_CTL * const *pbe1 = (const EVP_PBE_CTL * const *) a,
* const *pbe2 = (const EVP_PBE_CTL * const *)b; * const *pbe2 = (const EVP_PBE_CTL * const *)b;
return ((*pbe1)->pbe_nid - (*pbe2)->pbe_nid); int ret = (*pbe1)->pbe_type - (*pbe2)->pbe_type;
} if (ret)
return ret;
else
return (*pbe1)->pbe_nid - (*pbe2)->pbe_nid;
}
/* Add a PBE algorithm */ /* Add a PBE algorithm */
int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid, int md_nid,
EVP_PBE_KEYGEN *keygen) EVP_PBE_KEYGEN *keygen)
{ {
EVP_PBE_CTL *pbe_tmp; EVP_PBE_CTL *pbe_tmp;
if (!pbe_algs) pbe_algs = sk_new(pbe_cmp); if (!pbe_algs)
if (!(pbe_tmp = (EVP_PBE_CTL*) OPENSSL_malloc (sizeof(EVP_PBE_CTL)))) { pbe_algs = sk_new(pbe_cmp);
if (!(pbe_tmp = (EVP_PBE_CTL*) OPENSSL_malloc (sizeof(EVP_PBE_CTL))))
{
EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE); EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE);
return 0; return 0;
} }
pbe_tmp->pbe_nid = nid; pbe_tmp->pbe_type = pbe_type;
pbe_tmp->cipher = cipher; pbe_tmp->pbe_nid = pbe_nid;
pbe_tmp->md = md; pbe_tmp->cipher_nid = cipher_nid;
pbe_tmp->md_nid = md_nid;
pbe_tmp->keygen = keygen; pbe_tmp->keygen = keygen;
sk_push (pbe_algs, (char *)pbe_tmp); sk_push (pbe_algs, (char *)pbe_tmp);
return 1; return 1;
} }
int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
EVP_PBE_KEYGEN *keygen)
{
int cipher_nid, md_nid;
if (cipher)
cipher_nid = EVP_CIPHER_type(cipher);
else
cipher_nid = -1;
if (md)
md_nid = EVP_MD_type(md);
else
md_nid = -1;
return EVP_PBE_alg_add_type(EVP_PBE_TYPE_OUTER, nid,
cipher_nid, md_nid, keygen);
}
int EVP_PBE_find(int type, int pbe_nid,
int *pcnid, int *pmnid, EVP_PBE_KEYGEN **pkeygen)
{
EVP_PBE_CTL *pbetmp, pbelu;
int i;
if (pbe_nid == NID_undef)
return 0;
pbelu.pbe_type = type;
pbelu.pbe_nid = pbe_nid;
i = sk_find(pbe_algs, (char *)&pbelu);
if (i == -1)
return 0;
pbetmp = (EVP_PBE_CTL *)sk_value (pbe_algs, i);
if (pcnid)
*pcnid = pbetmp->cipher_nid;
if (pmnid)
*pmnid = pbetmp->md_nid;
if (pkeygen)
*pkeygen = pbetmp->keygen;
return 1;
}
void EVP_PBE_cleanup(void) void EVP_PBE_cleanup(void)
{ {
sk_pop_free(pbe_algs, OPENSSL_freeFunc); sk_pop_free(pbe_algs, OPENSSL_freeFunc);
pbe_algs = NULL; pbe_algs = NULL;
} }
...@@ -97,6 +97,7 @@ EVP_PBE_alg_add(NID_pbeWithSHA1AndRC2_CBC, EVP_rc2_64_cbc(), EVP_sha1(), ...@@ -97,6 +97,7 @@ EVP_PBE_alg_add(NID_pbeWithSHA1AndRC2_CBC, EVP_rc2_64_cbc(), EVP_sha1(),
#endif #endif
#ifndef OPENSSL_NO_HMAC #ifndef OPENSSL_NO_HMAC
EVP_PBE_alg_add(NID_pbes2, NULL, NULL, PKCS5_v2_PBE_keyivgen); EVP_PBE_alg_add(NID_pbes2, NULL, NULL, PKCS5_v2_PBE_keyivgen);
EVP_PBE_alg_add_type(EVP_PBE_TYPE_PRF, NID_hmacWithSHA1, -1, NID_sha1, 0);
#endif #endif
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* project 1999. * project 1999.
*/ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1999 The OpenSSL Project. All rights reserved. * Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -71,28 +71,36 @@ ...@@ -71,28 +71,36 @@
#endif #endif
/* This is an implementation of PKCS#5 v2.0 password based encryption key /* This is an implementation of PKCS#5 v2.0 password based encryption key
* derivation function PBKDF2 using the only currently defined function HMAC * derivation function PBKDF2.
* with SHA1. Verified against test vectors posted by Peter Gutmann * SHA1 version verified against test vectors posted by Peter Gutmann
* <pgut001@cs.auckland.ac.nz> to the PKCS-TNG <pkcs-tng@rsa.com> mailing list. * <pgut001@cs.auckland.ac.nz> to the PKCS-TNG <pkcs-tng@rsa.com> mailing list.
*/ */
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, int PKCS5_PBKDF2_HMAC(const char *pass, int passlen,
const unsigned char *salt, int saltlen, int iter, const unsigned char *salt, int saltlen, int iter,
const EVP_MD *digest,
int keylen, unsigned char *out) int keylen, unsigned char *out)
{ {
unsigned char digtmp[SHA_DIGEST_LENGTH], *p, itmp[4]; unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4];
int cplen, j, k, tkeylen; int cplen, j, k, tkeylen, mdlen;
unsigned long i = 1; unsigned long i = 1;
HMAC_CTX hctx; HMAC_CTX hctx;
mdlen = EVP_MD_size(digest);
HMAC_CTX_init(&hctx); HMAC_CTX_init(&hctx);
p = out; p = out;
tkeylen = keylen; tkeylen = keylen;
if(!pass) passlen = 0; if(!pass)
else if(passlen == -1) passlen = strlen(pass); passlen = 0;
while(tkeylen) { else if(passlen == -1)
if(tkeylen > SHA_DIGEST_LENGTH) cplen = SHA_DIGEST_LENGTH; passlen = strlen(pass);
else cplen = tkeylen; while(tkeylen)
{
if(tkeylen > mdlen)
cplen = mdlen;
else
cplen = tkeylen;
/* We are unlikely to ever use more than 256 blocks (5120 bits!) /* We are unlikely to ever use more than 256 blocks (5120 bits!)
* but just in case... * but just in case...
*/ */
...@@ -100,20 +108,22 @@ int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, ...@@ -100,20 +108,22 @@ int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
itmp[1] = (unsigned char)((i >> 16) & 0xff); itmp[1] = (unsigned char)((i >> 16) & 0xff);
itmp[2] = (unsigned char)((i >> 8) & 0xff); itmp[2] = (unsigned char)((i >> 8) & 0xff);
itmp[3] = (unsigned char)(i & 0xff); itmp[3] = (unsigned char)(i & 0xff);
HMAC_Init_ex(&hctx, pass, passlen, EVP_sha1(), NULL); HMAC_Init_ex(&hctx, pass, passlen, digest, NULL);
HMAC_Update(&hctx, salt, saltlen); HMAC_Update(&hctx, salt, saltlen);
HMAC_Update(&hctx, itmp, 4); HMAC_Update(&hctx, itmp, 4);
HMAC_Final(&hctx, digtmp, NULL); HMAC_Final(&hctx, digtmp, NULL);
memcpy(p, digtmp, cplen); memcpy(p, digtmp, cplen);
for(j = 1; j < iter; j++) { for(j = 1; j < iter; j++)
HMAC(EVP_sha1(), pass, passlen, {
digtmp, SHA_DIGEST_LENGTH, digtmp, NULL); HMAC(digest, pass, passlen,
for(k = 0; k < cplen; k++) p[k] ^= digtmp[k]; digtmp, mdlen, digtmp, NULL);
} for(k = 0; k < cplen; k++)
p[k] ^= digtmp[k];
}
tkeylen-= cplen; tkeylen-= cplen;
i++; i++;
p+= cplen; p+= cplen;
} }
HMAC_CTX_cleanup(&hctx); HMAC_CTX_cleanup(&hctx);
#ifdef DEBUG_PKCS5V2 #ifdef DEBUG_PKCS5V2
fprintf(stderr, "Password:\n"); fprintf(stderr, "Password:\n");
...@@ -125,7 +135,15 @@ int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, ...@@ -125,7 +135,15 @@ int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
h__dump (out, keylen); h__dump (out, keylen);
#endif #endif
return 1; return 1;
} }
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
const unsigned char *salt, int saltlen, int iter,
int keylen, unsigned char *out)
{
return PKCS5_PBKDF2_HMAC(pass, passlen, salt, saltlen, iter, EVP_sha1(),
keylen, out);
}
#ifdef DO_TEST #ifdef DO_TEST
main() main()
...@@ -155,6 +173,8 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, ...@@ -155,6 +173,8 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
PBE2PARAM *pbe2 = NULL; PBE2PARAM *pbe2 = NULL;
const EVP_CIPHER *cipher; const EVP_CIPHER *cipher;
PBKDF2PARAM *kdf = NULL; PBKDF2PARAM *kdf = NULL;
const EVP_MD *prfmd;
int prf_nid, hmac_md_nid;
if (param == NULL || param->type != V_ASN1_SEQUENCE || if (param == NULL || param->type != V_ASN1_SEQUENCE ||
param->value.sequence == NULL) { param->value.sequence == NULL) {
...@@ -226,10 +246,23 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, ...@@ -226,10 +246,23 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
goto err; goto err;
} }
if(kdf->prf && (OBJ_obj2nid(kdf->prf->algorithm) != NID_hmacWithSHA1)) { if (kdf->prf)
prf_nid = OBJ_obj2nid(kdf->prf->algorithm);
else
prf_nid = NID_hmacWithSHA1;
if (!EVP_PBE_find(EVP_PBE_TYPE_PRF, prf_nid, NULL, &hmac_md_nid, 0))
{
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_UNSUPPORTED_PRF); EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_UNSUPPORTED_PRF);
goto err; goto err;
} }
prfmd = EVP_get_digestbynid(hmac_md_nid);
if (prfmd == NULL)
{
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_UNSUPPORTED_PRF);
goto err;
}
if(kdf->salt->type != V_ASN1_OCTET_STRING) { if(kdf->salt->type != V_ASN1_OCTET_STRING) {
EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN,
...@@ -241,7 +274,8 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, ...@@ -241,7 +274,8 @@ int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
salt = kdf->salt->value.octet_string->data; salt = kdf->salt->value.octet_string->data;
saltlen = kdf->salt->value.octet_string->length; saltlen = kdf->salt->value.octet_string->length;
iter = ASN1_INTEGER_get(kdf->iter); iter = ASN1_INTEGER_get(kdf->iter);
PKCS5_PBKDF2_HMAC_SHA1(pass, passlen, salt, saltlen, iter, keylen, key); PKCS5_PBKDF2_HMAC(pass, passlen, salt, saltlen, iter, prfmd,
keylen, key);
EVP_CipherInit_ex(ctx, NULL, NULL, key, NULL, en_de); EVP_CipherInit_ex(ctx, NULL, NULL, key, NULL, en_de);
OPENSSL_cleanse(key, keylen); OPENSSL_cleanse(key, keylen);
PBKDF2PARAM_free(kdf); PBKDF2PARAM_free(kdf);
......
...@@ -62,12 +62,12 @@ ...@@ -62,12 +62,12 @@
* [including the GNU Public Licence.] * [including the GNU Public Licence.]
*/ */
#define NUM_NID 802 #define NUM_NID 803
#define NUM_SN 798 #define NUM_SN 799
#define NUM_LN 798 #define NUM_LN 799
#define NUM_OBJ 760 #define NUM_OBJ 761
static unsigned char lvalues[5345]={ static unsigned char lvalues[5353]={
0x00, /* [ 0] OBJ_undef */ 0x00, /* [ 0] OBJ_undef */
0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 1] OBJ_rsadsi */ 0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 1] OBJ_rsadsi */
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 7] OBJ_pkcs */ 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 7] OBJ_pkcs */
...@@ -828,6 +828,7 @@ static unsigned char lvalues[5345]={ ...@@ -828,6 +828,7 @@ static unsigned char lvalues[5345]={
0x2A,0x85,0x03,0x02,0x09,0x01,0x03,0x03, /* [5320] OBJ_id_GostR3411_94_with_GostR3410_94_cc */ 0x2A,0x85,0x03,0x02,0x09,0x01,0x03,0x03, /* [5320] OBJ_id_GostR3411_94_with_GostR3410_94_cc */
0x2A,0x85,0x03,0x02,0x09,0x01,0x03,0x04, /* [5328] OBJ_id_GostR3411_94_with_GostR3410_2001_cc */ 0x2A,0x85,0x03,0x02,0x09,0x01,0x03,0x04, /* [5328] OBJ_id_GostR3411_94_with_GostR3410_2001_cc */
0x2A,0x85,0x03,0x02,0x09,0x01,0x08,0x01, /* [5336] OBJ_id_GostR3410_2001_ParamSet_cc */ 0x2A,0x85,0x03,0x02,0x09,0x01,0x08,0x01, /* [5336] OBJ_id_GostR3410_2001_ParamSet_cc */
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x06, /* [5344] OBJ_hmacWithMD5 */
}; };
static ASN1_OBJECT nid_objs[NUM_NID]={ static ASN1_OBJECT nid_objs[NUM_NID]={
...@@ -2122,6 +2123,7 @@ static ASN1_OBJECT nid_objs[NUM_NID]={ ...@@ -2122,6 +2123,7 @@ static ASN1_OBJECT nid_objs[NUM_NID]={
{"id-GostR3410-2001-ParamSet-cc", {"id-GostR3410-2001-ParamSet-cc",
"GOST R 3410-2001 Parameter Set Cryptocom", "GOST R 3410-2001 Parameter Set Cryptocom",
NID_id_GostR3410_2001_ParamSet_cc,8,&(lvalues[5336]),0}, NID_id_GostR3410_2001_ParamSet_cc,8,&(lvalues[5336]),0},
{"hmacWithMD5","hmacWithMD5",NID_hmacWithMD5,8,&(lvalues[5344]),0},
}; };
static ASN1_OBJECT *sn_objs[NUM_SN]={ static ASN1_OBJECT *sn_objs[NUM_SN]={
...@@ -2372,6 +2374,7 @@ static ASN1_OBJECT *sn_objs[NUM_SN]={ ...@@ -2372,6 +2374,7 @@ static ASN1_OBJECT *sn_objs[NUM_SN]={
&(nid_objs[784]),/* "gost89" */ &(nid_objs[784]),/* "gost89" */
&(nid_objs[757]),/* "gost94" */ &(nid_objs[757]),/* "gost94" */
&(nid_objs[797]),/* "gost94cc" */ &(nid_objs[797]),/* "gost94cc" */
&(nid_objs[802]),/* "hmacWithMD5" */
&(nid_objs[163]),/* "hmacWithSHA1" */ &(nid_objs[163]),/* "hmacWithSHA1" */
&(nid_objs[432]),/* "holdInstructionCallIssuer" */ &(nid_objs[432]),/* "holdInstructionCallIssuer" */
&(nid_objs[430]),/* "holdInstructionCode" */ &(nid_objs[430]),/* "holdInstructionCode" */
...@@ -3186,6 +3189,7 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={ ...@@ -3186,6 +3189,7 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={
&(nid_objs[509]),/* "generationQualifier" */ &(nid_objs[509]),/* "generationQualifier" */
&(nid_objs[601]),/* "generic cryptogram" */ &(nid_objs[601]),/* "generic cryptogram" */
&(nid_objs[99]),/* "givenName" */ &(nid_objs[99]),/* "givenName" */
&(nid_objs[802]),/* "hmacWithMD5" */
&(nid_objs[163]),/* "hmacWithSHA1" */ &(nid_objs[163]),/* "hmacWithSHA1" */
&(nid_objs[486]),/* "homePostalAddress" */ &(nid_objs[486]),/* "homePostalAddress" */
&(nid_objs[473]),/* "homeTelephoneNumber" */ &(nid_objs[473]),/* "homeTelephoneNumber" */
...@@ -4094,6 +4098,7 @@ static ASN1_OBJECT *obj_objs[NUM_OBJ]={ ...@@ -4094,6 +4098,7 @@ static ASN1_OBJECT *obj_objs[NUM_OBJ]={
&(nid_objs[ 3]),/* OBJ_md2 1 2 840 113549 2 2 */ &(nid_objs[ 3]),/* OBJ_md2 1 2 840 113549 2 2 */
&(nid_objs[257]),/* OBJ_md4 1 2 840 113549 2 4 */ &(nid_objs[257]),/* OBJ_md4 1 2 840 113549 2 4 */
&(nid_objs[ 4]),/* OBJ_md5 1 2 840 113549 2 5 */ &(nid_objs[ 4]),/* OBJ_md5 1 2 840 113549 2 5 */
&(nid_objs[802]),/* OBJ_hmacWithMD5 1 2 840 113549 2 6 */
&(nid_objs[163]),/* OBJ_hmacWithSHA1 1 2 840 113549 2 7 */ &(nid_objs[163]),/* OBJ_hmacWithSHA1 1 2 840 113549 2 7 */
&(nid_objs[37]),/* OBJ_rc2_cbc 1 2 840 113549 3 2 */ &(nid_objs[37]),/* OBJ_rc2_cbc 1 2 840 113549 3 2 */
&(nid_objs[ 5]),/* OBJ_rc4 1 2 840 113549 3 4 */ &(nid_objs[ 5]),/* OBJ_rc4 1 2 840 113549 3 4 */
......
...@@ -1075,6 +1075,10 @@ ...@@ -1075,6 +1075,10 @@
#define LN_md5_sha1 "md5-sha1" #define LN_md5_sha1 "md5-sha1"
#define NID_md5_sha1 114 #define NID_md5_sha1 114
#define LN_hmacWithMD5 "hmacWithMD5"
#define NID_hmacWithMD5 802
#define OBJ_hmacWithMD5 OBJ_rsadsi,2L,6L
#define LN_hmacWithSHA1 "hmacWithSHA1" #define LN_hmacWithSHA1 "hmacWithSHA1"
#define NID_hmacWithSHA1 163 #define NID_hmacWithSHA1 163
#define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L #define OBJ_hmacWithSHA1 OBJ_rsadsi,2L,7L
......
...@@ -799,3 +799,4 @@ id_GostR3410_2001_cc 798 ...@@ -799,3 +799,4 @@ id_GostR3410_2001_cc 798
id_GostR3411_94_with_GostR3410_94_cc 799 id_GostR3411_94_with_GostR3410_94_cc 799
id_GostR3411_94_with_GostR3410_2001_cc 800 id_GostR3411_94_with_GostR3410_2001_cc 800
id_GostR3410_2001_ParamSet_cc 801 id_GostR3410_2001_ParamSet_cc 801
hmacWithMD5 802
...@@ -338,6 +338,7 @@ rsadsi 2 2 : MD2 : md2 ...@@ -338,6 +338,7 @@ rsadsi 2 2 : MD2 : md2
rsadsi 2 4 : MD4 : md4 rsadsi 2 4 : MD4 : md4
rsadsi 2 5 : MD5 : md5 rsadsi 2 5 : MD5 : md5
: MD5-SHA1 : md5-sha1 : MD5-SHA1 : md5-sha1
rsadsi 2 6 : : hmacWithMD5
rsadsi 2 7 : : hmacWithSHA1 rsadsi 2 7 : : hmacWithSHA1
rsadsi 3 2 : RC2-CBC : rc2-cbc rsadsi 3 2 : RC2-CBC : rc2-cbc
: RC2-ECB : rc2-ecb : RC2-ECB : rc2-ecb
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册