check for surplus bytes in EM structure after the digestInfo

This commit is contained in:
Andreas Steffen
2007-09-11 20:45:59 +00:00
parent 2f9f5149c4
commit e5f33737ab
+41 -26
View File
@@ -49,11 +49,12 @@ static const asn1Object_t pubkeyObjects[] = {
/* ASN.1 definition of digestInfo */ /* ASN.1 definition of digestInfo */
static const asn1Object_t digestInfoObjects[] = { static const asn1Object_t digestInfoObjects[] = {
{ 0, "digestInfo", ASN1_SEQUENCE, ASN1_NONE }, /* 0 */ { 0, "digestInfo", ASN1_SEQUENCE, ASN1_OBJ }, /* 0 */
{ 1, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 1 */ { 1, "digestAlgorithm", ASN1_EOC, ASN1_RAW }, /* 1 */
{ 1, "digest", ASN1_OCTET_STRING, ASN1_BODY }, /* 2 */ { 1, "digest", ASN1_OCTET_STRING, ASN1_BODY }, /* 2 */
}; };
#define DIGEST_INFO 0
#define DIGEST_INFO_ALGORITHM 1 #define DIGEST_INFO_ALGORITHM 1
#define DIGEST_INFO_DIGEST 2 #define DIGEST_INFO_DIGEST 2
#define DIGEST_INFO_ROOF 3 #define DIGEST_INFO_ROOF 3
@@ -214,36 +215,50 @@ static status_t verify_emsa_pkcs1_signature(const private_rsa_public_key_t *this
{ {
goto end; goto end;
} }
if (objectID == DIGEST_INFO_ALGORITHM) switch (objectID)
{ {
int hash_oid = parse_algorithmIdentifier(object, level+1, NULL); case DIGEST_INFO:
if (object.len != em.len)
{
/* surplus bytes after the digestInfo object */
goto end;
}
break;
case DIGEST_INFO_ALGORITHM:
{
int hash_oid = parse_algorithmIdentifier(object, level+1, NULL);
hash_algorithm = hasher_algorithm_from_oid(hash_oid); hash_algorithm = hasher_algorithm_from_oid(hash_oid);
if (hash_algorithm == HASH_UNKNOWN if (hash_algorithm == HASH_UNKNOWN
|| (algorithm != HASH_UNKNOWN && hash_algorithm != algorithm)) || (algorithm != HASH_UNKNOWN && hash_algorithm != algorithm))
{ {
goto end; goto end;
} }
} }
else if (objectID == DIGEST_INFO_DIGEST) break;
{ case DIGEST_INFO_DIGEST:
chunk_t hash; {
hasher_t *hasher = hasher_create(hash_algorithm); chunk_t hash;
hasher_t *hasher = hasher_create(hash_algorithm);
if (object.len != hasher->get_hash_size(hasher)) if (object.len != hasher->get_hash_size(hasher))
{ {
/* wrong hash size */ /* wrong hash size */
hasher->destroy(hasher); hasher->destroy(hasher);
goto end; goto end;
} }
/* build our own hash */ /* build our own hash */
hasher->allocate_hash(hasher, data, &hash); hasher->allocate_hash(hasher, data, &hash);
hasher->destroy(hasher); hasher->destroy(hasher);
/* compare the hashes */ /* compare the hashes */
res = memeq(object.ptr, hash.ptr, hash.len) ? SUCCESS : FAILED; res = memeq(object.ptr, hash.ptr, hash.len) ? SUCCESS : FAILED;
free(hash.ptr); free(hash.ptr);
}
break;
default:
break;
} }
objectID++; objectID++;
} }