diff --git a/src/tls/pkcs1.c b/src/tls/pkcs1.c index bbdb0d72d..5761dfed0 100644 --- a/src/tls/pkcs1.c +++ b/src/tls/pkcs1.c @@ -244,6 +244,8 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk, os_free(decrypted); return -1; } + wpa_hexdump(MSG_MSGDUMP, "PKCS #1: DigestInfo", + hdr.payload, hdr.length); pos = hdr.payload; end = pos + hdr.length; @@ -265,6 +267,8 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk, os_free(decrypted); return -1; } + wpa_hexdump(MSG_MSGDUMP, "PKCS #1: DigestAlgorithmIdentifier", + hdr.payload, hdr.length); da_end = hdr.payload + hdr.length; if (asn1_get_oid(hdr.payload, hdr.length, &oid, &next)) { @@ -273,6 +277,23 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk, os_free(decrypted); return -1; } + wpa_hexdump(MSG_MSGDUMP, "PKCS #1: Digest algorithm parameters", + next, da_end - next); + + /* + * RFC 5754: The correct encoding for the SHA2 algorithms would be to + * omit the parameters, but there are implementation that encode these + * as a NULL element. Allow these two cases and reject anything else. + */ + if (da_end > next && + (asn1_get_next(next, da_end - next, &hdr) < 0 || + !asn1_is_null(&hdr) || + hdr.payload + hdr.length != da_end)) { + wpa_printf(MSG_DEBUG, + "PKCS #1: Unexpected digest algorithm parameters"); + os_free(decrypted); + return -1; + } if (!asn1_oid_equal(&oid, hash_alg)) { char txt[100], txt2[100]; diff --git a/src/tls/x509v3.c b/src/tls/x509v3.c index a8944dd2f..df337ec4d 100644 --- a/src/tls/x509v3.c +++ b/src/tls/x509v3.c @@ -1964,6 +1964,7 @@ int x509_check_signature(struct x509_certificate *issuer, os_free(data); return -1; } + wpa_hexdump(MSG_MSGDUMP, "X509: DigestInfo", hdr.payload, hdr.length); pos = hdr.payload; end = pos + hdr.length; @@ -1985,6 +1986,8 @@ int x509_check_signature(struct x509_certificate *issuer, os_free(data); return -1; } + wpa_hexdump(MSG_MSGDUMP, "X509: DigestAlgorithmIdentifier", + hdr.payload, hdr.length); da_end = hdr.payload + hdr.length; if (asn1_get_oid(hdr.payload, hdr.length, &oid, &next)) { @@ -1992,6 +1995,23 @@ int x509_check_signature(struct x509_certificate *issuer, os_free(data); return -1; } + wpa_hexdump(MSG_MSGDUMP, "X509: Digest algorithm parameters", + next, da_end - next); + + /* + * RFC 5754: The correct encoding for the SHA2 algorithms would be to + * omit the parameters, but there are implementation that encode these + * as a NULL element. Allow these two cases and reject anything else. + */ + if (da_end > next && + (asn1_get_next(next, da_end - next, &hdr) < 0 || + !asn1_is_null(&hdr) || + hdr.payload + hdr.length != da_end)) { + wpa_printf(MSG_DEBUG, + "X509: Unexpected digest algorithm parameters"); + os_free(data); + return -1; + } if (x509_sha1_oid(&oid)) { if (signature->oid.oid[6] != 5 /* sha-1WithRSAEncryption */) {