diff options
-rw-r--r-- | networking/tls.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/networking/tls.c b/networking/tls.c index 99722cfb4..c8d9e9697 100644 --- a/networking/tls.c +++ b/networking/tls.c | |||
@@ -1082,6 +1082,8 @@ static void find_key_in_der_cert(tls_state_t *tls, uint8_t *der, int len) | |||
1082 | * We need Certificate.tbsCertificate.subjectPublicKeyInfo.publicKey | 1082 | * We need Certificate.tbsCertificate.subjectPublicKeyInfo.publicKey |
1083 | */ | 1083 | */ |
1084 | uint8_t *end = der + len; | 1084 | uint8_t *end = der + len; |
1085 | uint8_t tag_class, pc, tag_number; | ||
1086 | int version_present; | ||
1085 | 1087 | ||
1086 | /* enter "Certificate" item: [der, end) will be only Cert */ | 1088 | /* enter "Certificate" item: [der, end) will be only Cert */ |
1087 | der = enter_der_item(der, &end); | 1089 | der = enter_der_item(der, &end); |
@@ -1089,8 +1091,24 @@ static void find_key_in_der_cert(tls_state_t *tls, uint8_t *der, int len) | |||
1089 | /* enter "tbsCertificate" item: [der, end) will be only tbsCert */ | 1091 | /* enter "tbsCertificate" item: [der, end) will be only tbsCert */ |
1090 | der = enter_der_item(der, &end); | 1092 | der = enter_der_item(der, &end); |
1091 | 1093 | ||
1094 | /* | ||
1095 | * Skip version field only if it is present. For a v1 certificate, the | ||
1096 | * version field won't be present since v1 is the default value for the | ||
1097 | * version field and fields with default values should be omitted (see | ||
1098 | * RFC 5280 sections 4.1 and 4.1.2.1). If the version field is present | ||
1099 | * it will have a tag class of 2 (context-specific), bit 6 as 1 | ||
1100 | * (constructed), and a tag number of 0 (see ITU-T X.690 sections 8.1.2 | ||
1101 | * and 8.14). | ||
1102 | */ | ||
1103 | tag_class = der[0] >> 6; /* bits 8-7 */ | ||
1104 | pc = (der[0] & 32) >> 5; /* bit 6 */ | ||
1105 | tag_number = der[0] & 31; /* bits 5-1 */ | ||
1106 | version_present = tag_class == 2 && pc == 1 && tag_number == 0; | ||
1107 | if (version_present) { | ||
1108 | der = skip_der_item(der, end); /* version */ | ||
1109 | } | ||
1110 | |||
1092 | /* skip up to subjectPublicKeyInfo */ | 1111 | /* skip up to subjectPublicKeyInfo */ |
1093 | der = skip_der_item(der, end); /* version */ | ||
1094 | der = skip_der_item(der, end); /* serialNumber */ | 1112 | der = skip_der_item(der, end); /* serialNumber */ |
1095 | der = skip_der_item(der, end); /* signatureAlgo */ | 1113 | der = skip_der_item(der, end); /* signatureAlgo */ |
1096 | der = skip_der_item(der, end); /* issuer */ | 1114 | der = skip_der_item(der, end); /* issuer */ |