Commit dd2f6c44 authored by David Howells's avatar David Howells

X.509: If available, use the raw subjKeyId to form the key description

Module signing matches keys by comparing against the key description exactly.
However, the way the key description gets constructed got changed to be
composed of the subject name plus the certificate serial number instead of the
subject name and the subjectKeyId.  I changed this to avoid problems with
certificates that don't *have* a subjectKeyId.

Instead, if available, use the raw subjectKeyId to form the key description
and only use the serial number if the subjectKeyId doesn't exist.
Reported-by: default avatarDmitry Kasatkin <d.kasatkin@samsung.com>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 40b50e80
...@@ -435,6 +435,8 @@ int x509_process_extension(void *context, size_t hdrlen, ...@@ -435,6 +435,8 @@ int x509_process_extension(void *context, size_t hdrlen,
v += 2; v += 2;
vlen -= 2; vlen -= 2;
ctx->cert->raw_skid_size = vlen;
ctx->cert->raw_skid = v;
kid = asymmetric_key_generate_id(v, vlen, kid = asymmetric_key_generate_id(v, vlen,
ctx->cert->raw_subject, ctx->cert->raw_subject,
ctx->cert->raw_subject_size); ctx->cert->raw_subject_size);
......
...@@ -34,6 +34,8 @@ struct x509_certificate { ...@@ -34,6 +34,8 @@ struct x509_certificate {
const void *raw_issuer; /* Raw issuer name in ASN.1 */ const void *raw_issuer; /* Raw issuer name in ASN.1 */
const void *raw_subject; /* Raw subject name in ASN.1 */ const void *raw_subject; /* Raw subject name in ASN.1 */
unsigned raw_subject_size; unsigned raw_subject_size;
unsigned raw_skid_size;
const void *raw_skid; /* Raw subjectKeyId in ASN.1 */
unsigned index; unsigned index;
bool seen; /* Infinite recursion prevention */ bool seen; /* Infinite recursion prevention */
bool verified; bool verified;
......
...@@ -279,8 +279,13 @@ static int x509_key_preparse(struct key_preparsed_payload *prep) ...@@ -279,8 +279,13 @@ static int x509_key_preparse(struct key_preparsed_payload *prep)
/* Propose a description */ /* Propose a description */
sulen = strlen(cert->subject); sulen = strlen(cert->subject);
if (cert->raw_skid) {
srlen = cert->raw_skid_size;
q = cert->raw_skid;
} else {
srlen = cert->raw_serial_size; srlen = cert->raw_serial_size;
q = cert->raw_serial; q = cert->raw_serial;
}
if (srlen > 1 && *q == 0) { if (srlen > 1 && *q == 0) {
srlen--; srlen--;
q++; q++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment