Skip to content

Commit

Permalink
X.509: Fix self-signed determination
Browse files Browse the repository at this point in the history
There's a bug in the code determining whether a certificate is self-signed
or not: if they have neither AKID nor SKID then we just assume that the
cert is self-signed, which may not be true.

Fix this by checking that the raw subject name matches the raw issuer name
and that the public key algorithm for the key and signature are both the
same in addition to requiring that the AKID bits match.

Signed-off-by: David Howells <[email protected]>
  • Loading branch information
dhowells committed Apr 6, 2016
1 parent 6c2dc5a commit ad3043f
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions crypto/asymmetric_keys/x509_public_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,11 @@ int x509_check_for_self_signed(struct x509_certificate *cert)

pr_devel("==>%s()\n", __func__);

if (cert->raw_subject_size != cert->raw_issuer_size ||
memcmp(cert->raw_subject, cert->raw_issuer,
cert->raw_issuer_size) != 0)
goto not_self_signed;

if (cert->sig->auth_ids[0] || cert->sig->auth_ids[1]) {
/* If the AKID is present it may have one or two parts. If
* both are supplied, both must match.
Expand All @@ -246,6 +251,10 @@ int x509_check_for_self_signed(struct x509_certificate *cert)
goto out;
}

ret = -EKEYREJECTED;
if (cert->pub->pkey_algo != cert->sig->pkey_algo)
goto out;

ret = public_key_verify_signature(cert->pub, cert->sig);
if (ret < 0) {
if (ret == -ENOPKG) {
Expand Down

0 comments on commit ad3043f

Please sign in to comment.