aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/tls.c20
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 */