ASN: when getting OID from stream, check the summed value; added utility to skip OID; setting OID uses same strings as getting, separated NULL tag from the OID

pull/202/head
John Safranek 2015-11-21 12:00:34 -08:00
parent 9c6b52876a
commit d248a7660c
3 changed files with 538 additions and 278 deletions

View File

@ -678,12 +678,440 @@ WOLFSSL_LOCAL int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx,
}
static int GetObjectId(const byte* input, word32* inOutIdx, word32* oid,
word32 maxIdx)
/* hashType */
static const byte hashMd2hOid[] = {42, 134, 72, 134, 247, 13, 2, 2};
static const byte hashMd5hOid[] = {42, 134, 72, 134, 247, 13, 2, 5};
static const byte hashSha1hOid[] = {43, 14, 3, 2, 26};
static const byte hashSha256hOid[] = {96, 134, 72, 1, 101, 3, 4, 2, 1};
static const byte hashSha384hOid[] = {96, 134, 72, 1, 101, 3, 4, 2, 2};
static const byte hashSha512hOid[] = {96, 134, 72, 1, 101, 3, 4, 2, 3};
/* sigType */
#ifndef NO_DSA
static const byte sigSha1wDsaOid[] = {42, 134, 72, 206, 56, 4, 3};
#endif /* NO_DSA */
#ifndef NO_RSA
static const byte sigMd2wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1, 2};
static const byte sigMd5wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1, 4};
static const byte sigSha1wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1, 5};
static const byte sigSha256wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1,11};
static const byte sigSha384wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1,12};
static const byte sigSha512wRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1,13};
#endif /* NO_RSA */
#ifdef HAVE_ECC
static const byte sigSha1wEcdsaOid[] = {42, 134, 72, 206, 61, 4, 1};
static const byte sigSha256wEcdsaOid[] = {42, 134, 72, 206, 61, 4, 3, 2};
static const byte sigSha384wEcdsaOid[] = {42, 134, 72, 206, 61, 4, 3, 3};
static const byte sigSha512wEcdsaOid[] = {42, 134, 72, 206, 61, 4, 3, 4};
#endif /* HAVE_ECC */
/* keyType */
#ifndef NO_DSA
static const byte keyDsaOid[] = {42, 134, 72, 206, 56, 4, 1};
#endif /* NO_DSA */
#ifndef NO_RSA
static const byte keyRsaOid[] = {42, 134, 72, 134, 247, 13, 1, 1, 1};
#endif /* NO_RSA */
#ifdef HAVE_NTRU
static const byte keyNtruOid[] = {43, 6, 1, 4, 1, 193, 22, 1, 1, 1, 1};
#endif /* HAVE_NTRU */
#ifdef HAVE_ECC
static const byte keyEcdsaOid[] = {42, 134, 72, 206, 61, 2, 1};
#endif /* HAVE_ECC */
/* curveType */
#ifdef HAVE_ECC
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC192)
static const byte curve192v1Oid[] = {42, 134, 72, 206, 61, 3, 1, 1};
#endif /* HAVE_ALL_CURVES || HAVE_ECC192 */
#if defined(HAVE_ALL_CURVES) || !defined(NO_ECC256)
static const byte curve256v1Oid[] = {42, 134, 72, 206, 61, 3, 1, 7};
#endif /* HAVE_ALL_CURVES || HAVE_ECC256 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC160)
static const byte curve160r1Oid[] = {43, 129, 4, 0, 2};
#endif /* HAVE_ALL_CURVES || HAVE_ECC160 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC224)
static const byte curve224r1Oid[] = {43, 129, 4, 0, 33};
#endif /* HAVE_ALL_CURVES || HAVE_ECC224 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC384)
static const byte curve384r1Oid[] = {43, 129, 4, 0, 34};
#endif /* HAVE_ALL_CURVES || HAVE_ECC384 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC521)
static const byte curve521r1Oid[] = {43, 129, 4, 0, 35};
#endif /* HAVE_ALL_CURVES || HAVE_ECC521 */
#endif /* HAVE_ECC */
/* blkType */
static const byte blkDesCbcOid[] = {43, 14, 3, 2, 7};
static const byte blkDes3CbcOid[] = {42, 134, 72, 134, 247, 13, 3, 7};
/* ocspType */
#ifdef HAVE_OCSP
static const byte ocspBasicOid[] = {43, 6, 1, 5, 5, 7, 48, 1, 1};
static const byte ocspNonceOid[] = {43, 6, 1, 5, 5, 7, 48, 1, 2};
#endif /* HAVE_OCSP */
/* certExtType */
static const byte extBasicCaOid[] = {85, 29, 19};
static const byte extAltNamesOid[] = {85, 29, 17};
static const byte extCrlDistOid[] = {85, 29, 31};
static const byte extAuthInfoOid[] = {43, 6, 1, 5, 5, 7, 1, 1};
static const byte extAuthKeyOid[] = {85, 29, 35};
static const byte extSubjKeyOid[] = {85, 29, 14};
static const byte extCertPolicyOid[] = {85, 29, 32};
static const byte extKeyUsageOid[] = {85, 29, 15};
static const byte extInhibitAnyOid[] = {85, 29, 54};
static const byte extExtKeyUsageOid[] = {85, 29, 37};
static const byte extNameConsOid[] = {85, 29, 30};
/* certAuthInfoType */
static const byte extAuthInfoOcspOid[] = {43, 6, 1, 5, 5, 7, 48, 1};
static const byte extAuthInfoCaIssuerOid[] = {43, 6, 1, 5, 5, 7, 48, 2};
/* certPolicyType */
static const byte extCertPolicyAnyOid[] = {85, 29, 32, 0};
/* certKeyUseType */
static const byte extAltNamesHwNameOid[] = {43, 6, 1, 5, 5, 7, 8, 4};
/* certKeyUseType */
static const byte extExtKeyUsageAnyOid[] = {85, 29, 37, 0};
static const byte extExtKeyUsageServerAuthOid[] = {43, 6, 1, 5, 5, 7, 3, 1};
static const byte extExtKeyUsageClientAuthOid[] = {43, 6, 1, 5, 5, 7, 3, 2};
static const byte extExtKeyUsageOcspSignOid[] = {43, 6, 1, 5, 5, 7, 3, 9};
/* kdfType */
static const byte pbkdf2Oid[] = {42, 134, 72, 134, 247, 13, 1, 5, 12};
static const byte* OidFromId(word32 id, word32 type, word32* oidSz)
{
const byte* oid = NULL;
*oidSz = 0;
switch (type) {
case hashType:
switch (id) {
case MD2h:
oid = hashMd2hOid;
*oidSz = sizeof(hashMd2hOid);
break;
case MD5h:
oid = hashMd5hOid;
*oidSz = sizeof(hashMd5hOid);
break;
case SHAh:
oid = hashSha1hOid;
*oidSz = sizeof(hashSha1hOid);
break;
case SHA256h:
oid = hashSha256hOid;
*oidSz = sizeof(hashSha256hOid);
break;
case SHA384h:
oid = hashSha384hOid;
*oidSz = sizeof(hashSha384hOid);
break;
case SHA512h:
oid = hashSha512hOid;
*oidSz = sizeof(hashSha512hOid);
break;
}
break;
case sigType:
switch (id) {
#ifndef NO_DSA
case CTC_SHAwDSA:
oid = sigSha1wDsaOid;
*oidSz = sizeof(sigSha1wDsaOid);
break;
#endif /* NO_DSA */
#ifndef NO_RSA
case CTC_MD2wRSA:
oid = sigMd2wRsaOid;
*oidSz = sizeof(sigMd2wRsaOid);
break;
case CTC_MD5wRSA:
oid = sigMd5wRsaOid;
*oidSz = sizeof(sigMd5wRsaOid);
break;
case CTC_SHAwRSA:
oid = sigSha1wRsaOid;
*oidSz = sizeof(sigSha1wRsaOid);
break;
case CTC_SHA256wRSA:
oid = sigSha256wRsaOid;
*oidSz = sizeof(sigSha256wRsaOid);
break;
case CTC_SHA384wRSA:
oid = sigSha384wRsaOid;
*oidSz = sizeof(sigSha384wRsaOid);
break;
case CTC_SHA512wRSA:
oid = sigSha512wRsaOid;
*oidSz = sizeof(sigSha512wRsaOid);
break;
#endif /* NO_RSA */
#ifdef HAVE_ECC
case CTC_SHAwECDSA:
oid = sigSha1wEcdsaOid;
*oidSz = sizeof(sigSha1wEcdsaOid);
break;
case CTC_SHA256wECDSA:
oid = sigSha256wEcdsaOid;
*oidSz = sizeof(sigSha256wEcdsaOid);
break;
case CTC_SHA384wECDSA:
oid = sigSha384wEcdsaOid;
*oidSz = sizeof(sigSha384wEcdsaOid);
break;
case CTC_SHA512wECDSA:
oid = sigSha512wEcdsaOid;
*oidSz = sizeof(sigSha512wEcdsaOid);
break;
#endif /* HAVE_ECC */
default:
break;
}
break;
case keyType:
switch (id) {
#ifndef NO_DSA
case DSAk:
oid = keyDsaOid;
*oidSz = sizeof(keyDsaOid);
break;
#endif /* NO_DSA */
#ifndef NO_RSA
case RSAk:
oid = keyRsaOid;
*oidSz = sizeof(keyRsaOid);
break;
#endif /* NO_RSA */
#ifdef HAVE_NTRU
case NTRUk:
oid = keyNtruOid;
*oidSz = sizeof(keyNtruOid);
break;
#endif /* HAVE_NTRU */
#ifdef HAVE_ECC
case ECDSAk:
oid = keyEcdsaOid;
*oidSz = sizeof(keyEcdsaOid);
break;
#endif /* HAVE_ECC */
default:
break;
}
break;
#ifdef HAVE_ECC
case curveType:
switch (id) {
#if defined(HAVE_ALL_CURVES) || !defined(NO_ECC256)
case ECC_256R1:
oid = curve256v1Oid;
*oidSz = sizeof(curve256v1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC256 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC384)
case ECC_384R1:
oid = curve384r1Oid;
*oidSz = sizeof(curve384r1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC384 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC521)
case ECC_521R1:
oid = curve521r1Oid;
*oidSz = sizeof(curve521r1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC521 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC160)
case ECC_160R1:
oid = curve160r1Oid;
*oidSz = sizeof(curve160r1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC160 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC192)
case ECC_192R1:
oid = curve192v1Oid;
*oidSz = sizeof(curve192v1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC192 */
#if defined(HAVE_ALL_CURVES) || defined(HAVE_ECC224)
case ECC_224R1:
oid = curve224r1Oid;
*oidSz = sizeof(curve224r1Oid);
break;
#endif /* HAVE_ALL_CURVES || HAVE_ECC224 */
default:
break;
}
break;
#endif /* HAVE_ECC */
case blkType:
switch (id) {
case DESb:
oid = blkDesCbcOid;
*oidSz = sizeof(blkDesCbcOid);
break;
case DES3b:
oid = blkDes3CbcOid;
*oidSz = sizeof(blkDes3CbcOid);
break;
}
break;
#ifdef HAVE_OCSP
case ocspType:
switch (id) {
case OCSP_BASIC_OID:
oid = ocspBasicOid;
*oidSz = sizeof(ocspBasicOid);
break;
case OCSP_NONCE_OID:
oid = ocspNonceOid;
*oidSz = sizeof(ocspNonceOid);
break;
}
break;
#endif /* HAVE_OCSP */
case certExtType:
switch (id) {
case BASIC_CA_OID:
oid = extBasicCaOid;
*oidSz = sizeof(extBasicCaOid);
break;
case ALT_NAMES_OID:
oid = extAltNamesOid;
*oidSz = sizeof(extAltNamesOid);
break;
case CRL_DIST_OID:
oid = extCrlDistOid;
*oidSz = sizeof(extCrlDistOid);
break;
case AUTH_INFO_OID:
oid = extAuthInfoOid;
*oidSz = sizeof(extAuthInfoOid);
break;
case AUTH_KEY_OID:
oid = extAuthKeyOid;
*oidSz = sizeof(extAuthKeyOid);
break;
case SUBJ_KEY_OID:
oid = extSubjKeyOid;
*oidSz = sizeof(extSubjKeyOid);
break;
case CERT_POLICY_OID:
oid = extCertPolicyOid;
*oidSz = sizeof(extCertPolicyOid);
break;
case KEY_USAGE_OID:
oid = extKeyUsageOid;
*oidSz = sizeof(extKeyUsageOid);
break;
case INHIBIT_ANY_OID:
oid = extInhibitAnyOid;
*oidSz = sizeof(extInhibitAnyOid);
break;
case EXT_KEY_USAGE_OID:
oid = extExtKeyUsageOid;
*oidSz = sizeof(extExtKeyUsageOid);
break;
case NAME_CONS_OID:
oid = extNameConsOid;
*oidSz = sizeof(extNameConsOid);
break;
}
break;
case certAuthInfoType:
switch (id) {
case AIA_OCSP_OID:
oid = extAuthInfoOcspOid;
*oidSz = sizeof(extAuthInfoOcspOid);
break;
case AIA_CA_ISSUER_OID:
oid = extAuthInfoCaIssuerOid;
*oidSz = sizeof(extAuthInfoCaIssuerOid);
break;
}
break;
case certPolicyType:
switch (id) {
case CP_ANY_OID:
oid = extCertPolicyAnyOid;
*oidSz = sizeof(extCertPolicyAnyOid);
break;
}
break;
case certAltNameType:
switch (id) {
case HW_NAME_OID:
oid = extAltNamesHwNameOid;
*oidSz = sizeof(extAltNamesHwNameOid);
break;
}
break;
case certKeyUseType:
switch (id) {
case EKU_ANY_OID:
oid = extExtKeyUsageAnyOid;
*oidSz = sizeof(extExtKeyUsageAnyOid);
break;
case EKU_SERVER_AUTH_OID:
oid = extExtKeyUsageServerAuthOid;
*oidSz = sizeof(extExtKeyUsageServerAuthOid);
break;
case EKU_CLIENT_AUTH_OID:
oid = extExtKeyUsageClientAuthOid;
*oidSz = sizeof(extExtKeyUsageClientAuthOid);
break;
case EKU_OCSP_SIGN_OID:
oid = extExtKeyUsageOcspSignOid;
*oidSz = sizeof(extExtKeyUsageOcspSignOid);
break;
}
case kdfType:
switch (id) {
case PBKDF2_OID:
oid = pbkdf2Oid;
*oidSz = sizeof(pbkdf2Oid);
break;
}
break;
case ignoreType:
default:
break;
}
return oid;
}
WOLFSSL_LOCAL int GetObjectId(const byte* input, word32* inOutIdx, word32* oid,
word32 oidType, word32 maxIdx)
{
int length;
word32 i = *inOutIdx;
#ifndef NO_VERIFY_OID
word32 actualOidSz = 0;
const byte* actualOid;
#endif /* NO_VERIFY_OID */
byte b;
(void)oidType;
WOLFSSL_ENTER("GetObjectId()");
*oid = 0;
b = input[i++];
@ -693,18 +1121,62 @@ static int GetObjectId(const byte* input, word32* inOutIdx, word32* oid,
if (GetLength(input, &i, &length, maxIdx) < 0)
return ASN_PARSE_E;
while(length--)
*oid += input[i++];
#ifndef NO_VERIFY_OID
actualOid = &input[i];
if (length > 0)
actualOidSz = (word32)length;
#endif /* NO_VERIFY_OID */
while(length--) {
/* odd HC08 compiler behavior here when input[i++] */
*oid += input[i];
i++;
}
/* just sum it up for now */
*inOutIdx = i;
#ifndef NO_VERIFY_OID
{
const byte* checkOid = NULL;
word32 checkOidSz;
if (oidType != ignoreType) {
checkOid = OidFromId(*oid, oidType, &checkOidSz);
if (checkOid == NULL ||
checkOidSz != actualOidSz ||
XMEMCMP(actualOid, checkOid, checkOidSz) != 0) {
WOLFSSL_MSG("OID Check Failed");
return ASN_UNKNOWN_OID_E;
}
}
}
#endif /* NO_VERIFY_OID */
return 0;
}
static int SkipObjectId(const byte* input, word32* inOutIdx, word32 maxIdx)
{
int length;
if (input[(*inOutIdx)++] != ASN_OBJECT_ID)
return ASN_OBJECT_ID_E;
if (GetLength(input, inOutIdx, &length, maxIdx) < 0)
return ASN_PARSE_E;
*inOutIdx += length;
return 0;
}
WOLFSSL_LOCAL int GetAlgoId(const byte* input, word32* inOutIdx, word32* oid,
word32 maxIdx)
word32 oidType, word32 maxIdx)
{
int length;
word32 i = *inOutIdx;
@ -716,31 +1188,18 @@ WOLFSSL_LOCAL int GetAlgoId(const byte* input, word32* inOutIdx, word32* oid,
if (GetSequence(input, &i, &length, maxIdx) < 0)
return ASN_PARSE_E;
b = input[i++];
if (b != ASN_OBJECT_ID)
if (GetObjectId(input, &i, oid, oidType, maxIdx) < 0)
return ASN_OBJECT_ID_E;
if (GetLength(input, &i, &length, maxIdx) < 0)
return ASN_PARSE_E;
while(length--) {
/* odd HC08 compiler behavior here when input[i++] */
*oid += input[i];
i++;
}
/* just sum it up for now */
/* could have NULL tag and 0 terminator, but may not */
b = input[i++];
b = input[i];
if (b == ASN_TAG_NULL) {
i++;
b = input[i++];
if (b != 0)
return ASN_EXPECT_0_E;
}
else
/* go back, didn't have it */
i--;
*inOutIdx = i;
@ -856,7 +1315,7 @@ int ToTraditional(byte* input, word32 sz)
if (GetMyVersion(input, &inOutIdx, &version) < 0)
return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0)
if (GetAlgoId(input, &inOutIdx, &oid, sigType, sz) < 0)
return ASN_PARSE_E;
if (input[inOutIdx] == ASN_OBJECT_ID) {
@ -1133,7 +1592,7 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (GetSequence(input, &inOutIdx, &length, sz) < 0)
return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0)
if (GetAlgoId(input, &inOutIdx, &oid, sigType, sz) < 0)
return ASN_PARSE_E;
first = input[inOutIdx - 2]; /* PKCS version alwyas 2nd to last byte */
@ -1147,7 +1606,7 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (GetSequence(input, &inOutIdx, &length, sz) < 0)
return ASN_PARSE_E;
if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0)
if (GetAlgoId(input, &inOutIdx, &oid, kdfType, sz) < 0)
return ASN_PARSE_E;
if (oid != PBKDF2_OID)
@ -1192,7 +1651,8 @@ int ToTraditionalEnc(byte* input, word32 sz,const char* password,int passwordSz)
if (version == PKCS5v2) {
/* get encryption algo */
if (GetAlgoId(input, &inOutIdx, &oid, sz) < 0) {
/* JOHN: New type. Need a little more research. */
if (GetAlgoId(input, &inOutIdx, &oid, blkType, sz) < 0) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(salt, NULL, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(cbcIv, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@ -1285,15 +1745,9 @@ int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx, RsaKey* key,
if (GetSequence(input, inOutIdx, &length, inSz) < 0)
return ASN_PARSE_E;
b = input[(*inOutIdx)++];
if (b != ASN_OBJECT_ID)
return ASN_OBJECT_ID_E;
if (GetLength(input, inOutIdx, &length, inSz) < 0)
if (SkipObjectId(input, inOutIdx, inSz) < 0)
return ASN_PARSE_E;
*inOutIdx += length; /* skip past */
/* could have NULL tag and 0 terminator, but may not */
b = input[(*inOutIdx)++];
@ -1898,7 +2352,8 @@ static int GetKey(DecodedCert* cert)
if (GetSequence(cert->source, &cert->srcIdx, &length, cert->maxIdx) < 0)
return ASN_PARSE_E;
if (GetAlgoId(cert->source, &cert->srcIdx, &cert->keyOID, cert->maxIdx) < 0)
if (GetAlgoId(cert->source, &cert->srcIdx,
&cert->keyOID, keyType, cert->maxIdx) < 0)
return ASN_PARSE_E;
switch (cert->keyOID) {
@ -1986,18 +2441,12 @@ static int GetKey(DecodedCert* cert)
#ifdef HAVE_ECC
case ECDSAk:
{
int oidSz = 0;
byte b = cert->source[cert->srcIdx++];
byte b;
if (b != ASN_OBJECT_ID)
return ASN_OBJECT_ID_E;
if (GetLength(cert->source,&cert->srcIdx,&oidSz,cert->maxIdx) < 0)
if (GetObjectId(cert->source, &cert->srcIdx,
&cert->pkCurveOID, curveType, cert->maxIdx) < 0)
return ASN_PARSE_E;
while(oidSz--)
cert->pkCurveOID += cert->source[cert->srcIdx++];
if (CheckCurve(cert->pkCurveOID) < 0)
return ECC_CURVE_OID_E;
@ -2699,7 +3148,7 @@ int DecodeToKey(DecodedCert* cert, int verify)
WOLFSSL_MSG("Got Cert Header");
if ( (ret = GetAlgoId(cert->source, &cert->srcIdx, &cert->signatureOID,
cert->maxIdx)) < 0)
sigType, cert->maxIdx)) < 0)
return ret;
WOLFSSL_MSG("Got Algo ID");
@ -2925,216 +3374,35 @@ static int SetCurve(ecc_key* key, byte* output)
WOLFSSL_LOCAL word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz)
{
/* adding TAG_NULL and 0 to end */
/* hashTypes */
static const byte shaAlgoID[] = { 0x2b, 0x0e, 0x03, 0x02, 0x1a,
0x05, 0x00 };
static const byte sha256AlgoID[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x01, 0x05, 0x00 };
static const byte sha384AlgoID[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x02, 0x05, 0x00 };
static const byte sha512AlgoID[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
0x04, 0x02, 0x03, 0x05, 0x00 };
static const byte md5AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
0x02, 0x05, 0x05, 0x00 };
static const byte md2AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
0x02, 0x02, 0x05, 0x00};
/* blkTypes, no NULL tags because IV is there instead */
static const byte desCbcAlgoID[] = { 0x2B, 0x0E, 0x03, 0x02, 0x07 };
static const byte des3CbcAlgoID[] = { 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x03, 0x07 };
/* RSA sigTypes */
#ifndef NO_RSA
static const byte md5wRSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x04, 0x05, 0x00};
static const byte shawRSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x05, 0x05, 0x00};
static const byte sha256wRSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00};
static const byte sha384wRSA_AlgoID[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x0c, 0x05, 0x00};
static const byte sha512wRSA_AlgoID[] = {0x2a, 0x86, 0x48, 0x86, 0xf7,
0x0d, 0x01, 0x01, 0x0d, 0x05, 0x00};
#endif /* NO_RSA */
/* ECDSA sigTypes */
#ifdef HAVE_ECC
static const byte shawECDSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0xCE, 0x3d,
0x04, 0x01, 0x05, 0x00};
static const byte sha256wECDSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0xCE,0x3d,
0x04, 0x03, 0x02, 0x05, 0x00};
static const byte sha384wECDSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0xCE,0x3d,
0x04, 0x03, 0x03, 0x05, 0x00};
static const byte sha512wECDSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0xCE,0x3d,
0x04, 0x03, 0x04, 0x05, 0x00};
#endif /* HAVE_ECC */
/* RSA keyType */
#ifndef NO_RSA
static const byte RSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
0x01, 0x01, 0x01, 0x05, 0x00};
#endif /* NO_RSA */
#ifdef HAVE_ECC
/* ECC keyType */
/* no tags, so set tagSz smaller later */
static const byte ECC_AlgoID[] = { 0x2a, 0x86, 0x48, 0xCE, 0x3d,
0x02, 0x01};
#endif /* HAVE_ECC */
int algoSz = 0;
int tagSz = 2; /* tag null and terminator */
word32 idSz, seqSz;
word32 tagSz, idSz, seqSz, algoSz = 0;
const byte* algoName = 0;
byte ID_Length[MAX_LENGTH_SZ];
byte seqArray[MAX_SEQ_SZ + 1]; /* add object_id to end */
byte ID_Length[MAX_LENGTH_SZ];
byte seqArray[MAX_SEQ_SZ + 1]; /* add object_id to end */
if (type == hashType) {
switch (algoOID) {
case SHAh:
algoSz = sizeof(shaAlgoID);
algoName = shaAlgoID;
break;
tagSz = (type == hashType || type == sigType ||
(type == keyType && algoOID == RSAk)) ? 2 : 0;
case SHA256h:
algoSz = sizeof(sha256AlgoID);
algoName = sha256AlgoID;
break;
algoName = OidFromId(algoOID, type, &algoSz);
case SHA384h:
algoSz = sizeof(sha384AlgoID);
algoName = sha384AlgoID;
break;
case SHA512h:
algoSz = sizeof(sha512AlgoID);
algoName = sha512AlgoID;
break;
case MD2h:
algoSz = sizeof(md2AlgoID);
algoName = md2AlgoID;
break;
case MD5h:
algoSz = sizeof(md5AlgoID);
algoName = md5AlgoID;
break;
default:
WOLFSSL_MSG("Unknown Hash Algo");
return 0; /* UNKOWN_HASH_E; */
}
}
else if (type == blkType) {
switch (algoOID) {
case DESb:
algoSz = sizeof(desCbcAlgoID);
algoName = desCbcAlgoID;
tagSz = 0;
break;
case DES3b:
algoSz = sizeof(des3CbcAlgoID);
algoName = des3CbcAlgoID;
tagSz = 0;
break;
default:
WOLFSSL_MSG("Unknown Block Algo");
return 0;
}
}
else if (type == sigType) { /* sigType */
switch (algoOID) {
#ifndef NO_RSA
case CTC_MD5wRSA:
algoSz = sizeof(md5wRSA_AlgoID);
algoName = md5wRSA_AlgoID;
break;
case CTC_SHAwRSA:
algoSz = sizeof(shawRSA_AlgoID);
algoName = shawRSA_AlgoID;
break;
case CTC_SHA256wRSA:
algoSz = sizeof(sha256wRSA_AlgoID);
algoName = sha256wRSA_AlgoID;
break;
case CTC_SHA384wRSA:
algoSz = sizeof(sha384wRSA_AlgoID);
algoName = sha384wRSA_AlgoID;
break;
case CTC_SHA512wRSA:
algoSz = sizeof(sha512wRSA_AlgoID);
algoName = sha512wRSA_AlgoID;
break;
#endif /* NO_RSA */
#ifdef HAVE_ECC
case CTC_SHAwECDSA:
algoSz = sizeof(shawECDSA_AlgoID);
algoName = shawECDSA_AlgoID;
break;
case CTC_SHA256wECDSA:
algoSz = sizeof(sha256wECDSA_AlgoID);
algoName = sha256wECDSA_AlgoID;
break;
case CTC_SHA384wECDSA:
algoSz = sizeof(sha384wECDSA_AlgoID);
algoName = sha384wECDSA_AlgoID;
break;
case CTC_SHA512wECDSA:
algoSz = sizeof(sha512wECDSA_AlgoID);
algoName = sha512wECDSA_AlgoID;
break;
#endif /* HAVE_ECC */
default:
WOLFSSL_MSG("Unknown Signature Algo");
return 0;
}
}
else if (type == keyType) { /* keyType */
switch (algoOID) {
#ifndef NO_RSA
case RSAk:
algoSz = sizeof(RSA_AlgoID);
algoName = RSA_AlgoID;
break;
#endif /* NO_RSA */
#ifdef HAVE_ECC
case ECDSAk:
algoSz = sizeof(ECC_AlgoID);
algoName = ECC_AlgoID;
tagSz = 0;
break;
#endif /* HAVE_ECC */
default:
WOLFSSL_MSG("Unknown Key Algo");
return 0;
}
}
else {
WOLFSSL_MSG("Unknown Algo type");
if (algoName == NULL) {
WOLFSSL_MSG("Unknown Algorithm");
return 0;
}
idSz = SetLength(algoSz - tagSz, ID_Length); /* don't include tags */
seqSz = SetSequence(idSz + algoSz + 1 + curveSz, seqArray);
idSz = SetLength(algoSz, ID_Length);
seqSz = SetSequence(idSz + algoSz + 1 + tagSz + curveSz, seqArray);
/* +1 for object id, curveID of curveSz follows for ecc */
seqArray[seqSz++] = ASN_OBJECT_ID;
XMEMCPY(output, seqArray, seqSz);
XMEMCPY(output + seqSz, ID_Length, idSz);
XMEMCPY(output + seqSz + idSz, algoName, algoSz);
if (tagSz == 2) {
output[seqSz + idSz + algoSz] = ASN_TAG_NULL;
output[seqSz + idSz + algoSz + 1] = 0;
}
return seqSz + idSz + algoSz;
return seqSz + idSz + algoSz + tagSz;
}
@ -3721,7 +3989,7 @@ static int DecodeAltNames(byte* input, int sz, DecodedCert* cert)
/* Consume the rest of this sequence. */
length -= (strLen + idx - lenStartIdx);
if (GetObjectId(input, &idx, &oid, sz) < 0) {
if (GetObjectId(input, &idx, &oid, certAltNameType, sz) < 0) {
WOLFSSL_MSG("\tbad OID");
return ASN_PARSE_E;
}
@ -3972,7 +4240,7 @@ static int DecodeAuthInfo(byte* input, int sz, DecodedCert* cert)
return ASN_PARSE_E;
oid = 0;
if (GetObjectId(input, &idx, &oid, sz) < 0)
if (GetObjectId(input, &idx, &oid, certAuthInfoType, sz) < 0)
return ASN_PARSE_E;
/* Only supporting URIs right now. */
@ -4118,7 +4386,7 @@ static int DecodeExtKeyUsage(byte* input, int sz, DecodedCert* cert)
#endif
while (idx < (word32)sz) {
if (GetObjectId(input, &idx, &oid, sz) < 0)
if (GetObjectId(input, &idx, &oid, certKeyUseType, sz) < 0)
return ASN_PARSE_E;
switch (oid) {
@ -4458,7 +4726,7 @@ static int DecodeCertExtensions(DecodedCert* cert)
}
oid = 0;
if (GetObjectId(input, &idx, &oid, sz) < 0) {
if (GetObjectId(input, &idx, &oid, certExtType, sz) < 0) {
WOLFSSL_MSG("\tfail: OBJECT ID");
return ASN_PARSE_E;
}
@ -4707,7 +4975,7 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm)
}
if ((ret = GetAlgoId(cert->source, &cert->srcIdx, &confirmOID,
cert->maxIdx)) < 0)
sigType, cert->maxIdx)) < 0)
return ret;
if ((ret = GetSignature(cert)) < 0)
@ -7685,7 +7953,7 @@ static int SetAltNamesFromCert(Cert* cert, const byte* der, int derSz)
decoded->srcIdx = startIdx;
if (GetAlgoId(decoded->source, &decoded->srcIdx, &oid,
decoded->maxIdx) < 0) {
certExtType, decoded->maxIdx) < 0) {
ret = ASN_PARSE_E;
break;
}
@ -8444,7 +8712,7 @@ static int DecodeSingleResponse(byte* source,
if (GetSequence(source, &idx, &length, size) < 0)
return ASN_PARSE_E;
/* Skip the hash algorithm */
if (GetAlgoId(source, &idx, &oid, size) < 0)
if (GetAlgoId(source, &idx, &oid, ignoreType, size) < 0)
return ASN_PARSE_E;
/* Save reference to the hash of CN */
if (source[idx++] != ASN_OCTET_STRING)
@ -8564,7 +8832,7 @@ static int DecodeOcspRespExtensions(byte* source,
}
oid = 0;
if (GetObjectId(source, &idx, &oid, sz) < 0) {
if (GetObjectId(source, &idx, &oid, ocspType, sz) < 0) {
WOLFSSL_MSG("\tfail: OBJECT ID");
return ASN_PARSE_E;
}
@ -8717,7 +8985,7 @@ static int DecodeBasicOcspResponse(byte* source, word32* ioIndex,
return ASN_PARSE_E;
/* Get the signature algorithm */
if (GetAlgoId(source, &idx, &resp->sigOID, size) < 0)
if (GetAlgoId(source, &idx, &resp->sigOID, sigType, size) < 0)
return ASN_PARSE_E;
/* Obtain pointer to the start of the signature, and save the size */
@ -8830,7 +9098,7 @@ int OcspResponseDecode(OcspResponse* resp, void* cm)
return ASN_PARSE_E;
/* Check ObjectID for the resposeBytes */
if (GetObjectId(source, &idx, &oid, size) < 0)
if (GetObjectId(source, &idx, &oid, ocspType, size) < 0)
return ASN_PARSE_E;
if (oid != OCSP_BASIC_OID)
return ASN_PARSE_E;
@ -9308,7 +9576,7 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm)
return ASN_PARSE_E;
}
if (GetAlgoId(buff, &idx, &oid, sz) < 0)
if (GetAlgoId(buff, &idx, &oid, ignoreType, sz) < 0)
return ASN_PARSE_E;
if (GetNameHash(buff, &idx, dcrl->issuerHash, sz) < 0)
@ -9352,7 +9620,7 @@ int ParseCRL(DecodedCRL* dcrl, const byte* buff, word32 sz, void* cm)
if (idx != dcrl->sigIndex)
idx = dcrl->sigIndex; /* skip extensions */
if (GetAlgoId(buff, &idx, &dcrl->signatureOID, sz) < 0)
if (GetAlgoId(buff, &idx, &dcrl->signatureOID, sigType, sz) < 0)
return ASN_PARSE_E;
if (GetCRL_Signature(buff, &idx, dcrl, sz) < 0)

View File

@ -129,27 +129,10 @@ WOLFSSL_LOCAL int wc_SetContentType(int pkcs7TypeOID, byte* output)
int wc_GetContentType(const byte* input, word32* inOutIdx, word32* oid,
word32 maxIdx)
{
int length;
word32 i = *inOutIdx;
byte b;
*oid = 0;
WOLFSSL_ENTER("wc_GetContentType");
b = input[i++];
if (b != ASN_OBJECT_ID)
return ASN_OBJECT_ID_E;
if (GetLength(input, &i, &length, maxIdx) < 0)
if (GetObjectId(input, inOutIdx, oid, ignoreType, maxIdx) < 0)
return ASN_PARSE_E;
while(length--) {
*oid += input[i];
i++;
}
*inOutIdx = i;
return 0;
}
@ -1609,7 +1592,7 @@ WOLFSSL_API int wc_PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
XFREE(serialNum, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
if (GetAlgoId(pkiMsg, &idx, &encOID, pkiMsgSz) < 0) {
if (GetAlgoId(pkiMsg, &idx, &encOID, keyType, pkiMsgSz) < 0) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif
@ -1670,7 +1653,7 @@ WOLFSSL_API int wc_PKCS7_DecodeEnvelopedData(PKCS7* pkcs7, byte* pkiMsg,
return ASN_PARSE_E;
}
if (GetAlgoId(pkiMsg, &idx, &encOID, pkiMsgSz) < 0) {
if (GetAlgoId(pkiMsg, &idx, &encOID, blkType, pkiMsgSz) < 0) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(encryptedKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
#endif

View File

@ -198,11 +198,19 @@ enum Misc_ASN {
enum Oid_Types {
hashType = 0,
sigType = 1,
keyType = 2,
curveType = 3,
blkType = 4
hashType = 0,
sigType = 1,
keyType = 2,
curveType = 3,
blkType = 4,
ocspType = 5,
certExtType = 6,
certAuthInfoType = 7,
certPolicyType = 8,
certAltNameType = 9,
certKeyUseType = 10,
kdfType = 11,
ignoreType
};
@ -250,7 +258,6 @@ enum Extensions_Sum {
ALT_NAMES_OID = 131,
CRL_DIST_OID = 145,
AUTH_INFO_OID = 69,
CA_ISSUER_OID = 117,
AUTH_KEY_OID = 149,
SUBJ_KEY_OID = 128,
CERT_POLICY_OID = 146,
@ -585,8 +592,10 @@ WOLFSSL_LOCAL int GetMyVersion(const byte* input, word32* inOutIdx,
int* version);
WOLFSSL_LOCAL int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx,
word32 maxIdx);
WOLFSSL_LOCAL int GetObjectId(const byte* input, word32* inOutIdx, word32* oid,
word32 oidType, word32 maxIdx);
WOLFSSL_LOCAL int GetAlgoId(const byte* input, word32* inOutIdx, word32* oid,
word32 maxIdx);
word32 oidType, word32 maxIdx);
WOLFSSL_LOCAL word32 SetLength(word32 length, byte* output);
WOLFSSL_LOCAL word32 SetSequence(word32 len, byte* output);
WOLFSSL_LOCAL word32 SetOctetString(word32 len, byte* output);