diff options
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r-- | src/lib/libssl/t1_lib.c | 191 |
1 files changed, 18 insertions, 173 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c index 1cb0cfb453..1fc433cca1 100644 --- a/src/lib/libssl/t1_lib.c +++ b/src/lib/libssl/t1_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: t1_lib.c,v 1.148 2018/11/08 20:55:18 jsing Exp $ */ | 1 | /* $OpenBSD: t1_lib.c,v 1.149 2018/11/09 00:34:55 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -119,6 +119,7 @@ | |||
119 | #include "ssl_locl.h" | 119 | #include "ssl_locl.h" |
120 | 120 | ||
121 | #include "bytestring.h" | 121 | #include "bytestring.h" |
122 | #include "ssl_sigalgs.h" | ||
122 | #include "ssl_tlsext.h" | 123 | #include "ssl_tlsext.h" |
123 | 124 | ||
124 | static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen, | 125 | static int tls_decrypt_ticket(SSL *s, const unsigned char *tick, int ticklen, |
@@ -604,43 +605,6 @@ tls1_check_ec_server_key(SSL *s) | |||
604 | return tls1_check_ec_key(s, &curve_id, &comp_id); | 605 | return tls1_check_ec_key(s, &curve_id, &comp_id); |
605 | } | 606 | } |
606 | 607 | ||
607 | /* | ||
608 | * List of supported signature algorithms and hashes. Should make this | ||
609 | * customisable at some point, for now include everything we support. | ||
610 | */ | ||
611 | |||
612 | static unsigned char tls12_sigalgs[] = { | ||
613 | TLSEXT_hash_sha512, TLSEXT_signature_rsa, | ||
614 | TLSEXT_hash_sha512, TLSEXT_signature_ecdsa, | ||
615 | #ifndef OPENSSL_NO_GOST | ||
616 | TLSEXT_hash_streebog_512, TLSEXT_signature_gostr12_512, | ||
617 | #endif | ||
618 | |||
619 | TLSEXT_hash_sha384, TLSEXT_signature_rsa, | ||
620 | TLSEXT_hash_sha384, TLSEXT_signature_ecdsa, | ||
621 | |||
622 | TLSEXT_hash_sha256, TLSEXT_signature_rsa, | ||
623 | TLSEXT_hash_sha256, TLSEXT_signature_ecdsa, | ||
624 | |||
625 | #ifndef OPENSSL_NO_GOST | ||
626 | TLSEXT_hash_streebog_256, TLSEXT_signature_gostr12_256, | ||
627 | TLSEXT_hash_gost94, TLSEXT_signature_gostr01, | ||
628 | #endif | ||
629 | |||
630 | TLSEXT_hash_sha224, TLSEXT_signature_rsa, | ||
631 | TLSEXT_hash_sha224, TLSEXT_signature_ecdsa, | ||
632 | |||
633 | TLSEXT_hash_sha1, TLSEXT_signature_rsa, | ||
634 | TLSEXT_hash_sha1, TLSEXT_signature_ecdsa, | ||
635 | }; | ||
636 | |||
637 | void | ||
638 | tls12_get_req_sig_algs(SSL *s, unsigned char **sigalgs, size_t *sigalgs_len) | ||
639 | { | ||
640 | *sigalgs = tls12_sigalgs; | ||
641 | *sigalgs_len = sizeof(tls12_sigalgs); | ||
642 | } | ||
643 | |||
644 | int | 608 | int |
645 | ssl_check_clienthello_tlsext_early(SSL *s) | 609 | ssl_check_clienthello_tlsext_early(SSL *s) |
646 | { | 610 | { |
@@ -1036,115 +1000,11 @@ tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen, | |||
1036 | return 2; | 1000 | return 2; |
1037 | } | 1001 | } |
1038 | 1002 | ||
1039 | /* Tables to translate from NIDs to TLS v1.2 ids */ | ||
1040 | |||
1041 | typedef struct { | ||
1042 | int nid; | ||
1043 | int id; | ||
1044 | } tls12_lookup; | ||
1045 | |||
1046 | static tls12_lookup tls12_md[] = { | ||
1047 | {NID_md5, TLSEXT_hash_md5}, | ||
1048 | {NID_sha1, TLSEXT_hash_sha1}, | ||
1049 | {NID_sha224, TLSEXT_hash_sha224}, | ||
1050 | {NID_sha256, TLSEXT_hash_sha256}, | ||
1051 | {NID_sha384, TLSEXT_hash_sha384}, | ||
1052 | {NID_sha512, TLSEXT_hash_sha512}, | ||
1053 | {NID_id_GostR3411_94, TLSEXT_hash_gost94}, | ||
1054 | {NID_id_tc26_gost3411_2012_256, TLSEXT_hash_streebog_256}, | ||
1055 | {NID_id_tc26_gost3411_2012_512, TLSEXT_hash_streebog_512} | ||
1056 | }; | ||
1057 | |||
1058 | static tls12_lookup tls12_sig[] = { | ||
1059 | {EVP_PKEY_RSA, TLSEXT_signature_rsa}, | ||
1060 | {EVP_PKEY_EC, TLSEXT_signature_ecdsa}, | ||
1061 | {EVP_PKEY_GOSTR01, TLSEXT_signature_gostr01}, | ||
1062 | }; | ||
1063 | |||
1064 | static int | ||
1065 | tls12_find_id(int nid, tls12_lookup *table, size_t tlen) | ||
1066 | { | ||
1067 | size_t i; | ||
1068 | for (i = 0; i < tlen; i++) { | ||
1069 | if (table[i].nid == nid) | ||
1070 | return table[i].id; | ||
1071 | } | ||
1072 | return -1; | ||
1073 | } | ||
1074 | |||
1075 | int | ||
1076 | tls12_get_hashid(const EVP_MD *md) | ||
1077 | { | ||
1078 | if (md == NULL) | ||
1079 | return -1; | ||
1080 | |||
1081 | return tls12_find_id(EVP_MD_type(md), tls12_md, | ||
1082 | sizeof(tls12_md) / sizeof(tls12_lookup)); | ||
1083 | } | ||
1084 | |||
1085 | int | ||
1086 | tls12_get_sigid(const EVP_PKEY *pk) | ||
1087 | { | ||
1088 | if (pk == NULL) | ||
1089 | return -1; | ||
1090 | |||
1091 | return tls12_find_id(pk->type, tls12_sig, | ||
1092 | sizeof(tls12_sig) / sizeof(tls12_lookup)); | ||
1093 | } | ||
1094 | |||
1095 | int | ||
1096 | tls12_get_hashandsig(CBB *cbb, const EVP_PKEY *pk, const EVP_MD *md) | ||
1097 | { | ||
1098 | int hash_id, sig_id; | ||
1099 | |||
1100 | if ((hash_id = tls12_get_hashid(md)) == -1) | ||
1101 | return 0; | ||
1102 | if ((sig_id = tls12_get_sigid(pk)) == -1) | ||
1103 | return 0; | ||
1104 | |||
1105 | if (!CBB_add_u8(cbb, hash_id)) | ||
1106 | return 0; | ||
1107 | if (!CBB_add_u8(cbb, sig_id)) | ||
1108 | return 0; | ||
1109 | |||
1110 | return 1; | ||
1111 | } | ||
1112 | |||
1113 | const EVP_MD * | ||
1114 | tls12_get_hash(unsigned char hash_alg) | ||
1115 | { | ||
1116 | switch (hash_alg) { | ||
1117 | case TLSEXT_hash_sha1: | ||
1118 | return EVP_sha1(); | ||
1119 | case TLSEXT_hash_sha224: | ||
1120 | return EVP_sha224(); | ||
1121 | case TLSEXT_hash_sha256: | ||
1122 | return EVP_sha256(); | ||
1123 | case TLSEXT_hash_sha384: | ||
1124 | return EVP_sha384(); | ||
1125 | case TLSEXT_hash_sha512: | ||
1126 | return EVP_sha512(); | ||
1127 | #ifndef OPENSSL_NO_GOST | ||
1128 | case TLSEXT_hash_gost94: | ||
1129 | return EVP_gostr341194(); | ||
1130 | case TLSEXT_hash_streebog_256: | ||
1131 | return EVP_streebog256(); | ||
1132 | case TLSEXT_hash_streebog_512: | ||
1133 | return EVP_streebog512(); | ||
1134 | #endif | ||
1135 | default: | ||
1136 | return NULL; | ||
1137 | } | ||
1138 | } | ||
1139 | |||
1140 | /* Set preferred digest for each key type */ | 1003 | /* Set preferred digest for each key type */ |
1141 | |||
1142 | int | 1004 | int |
1143 | tls1_process_sigalgs(SSL *s, CBS *cbs) | 1005 | tls1_process_sigalgs(SSL *s, CBS *cbs) |
1144 | { | 1006 | { |
1145 | const EVP_MD *md; | ||
1146 | CERT *c = s->cert; | 1007 | CERT *c = s->cert; |
1147 | int idx; | ||
1148 | 1008 | ||
1149 | /* Extension ignored for inappropriate versions */ | 1009 | /* Extension ignored for inappropriate versions */ |
1150 | if (!SSL_USE_SIGALGS(s)) | 1010 | if (!SSL_USE_SIGALGS(s)) |
@@ -1153,53 +1013,38 @@ tls1_process_sigalgs(SSL *s, CBS *cbs) | |||
1153 | c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL; | 1013 | c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL; |
1154 | c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL; | 1014 | c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL; |
1155 | c->pkeys[SSL_PKEY_ECC].digest = NULL; | 1015 | c->pkeys[SSL_PKEY_ECC].digest = NULL; |
1016 | #ifndef OPENSSL_NO_GOST | ||
1156 | c->pkeys[SSL_PKEY_GOST01].digest = NULL; | 1017 | c->pkeys[SSL_PKEY_GOST01].digest = NULL; |
1157 | 1018 | #endif | |
1158 | while (CBS_len(cbs) > 0) { | 1019 | while (CBS_len(cbs) > 0) { |
1159 | uint8_t hash_alg, sig_alg; | 1020 | const EVP_MD *md; |
1021 | uint16_t sig_alg; | ||
1022 | const struct ssl_sigalg *sigalg; | ||
1160 | 1023 | ||
1161 | if (!CBS_get_u8(cbs, &hash_alg) || !CBS_get_u8(cbs, &sig_alg)) | 1024 | if (!CBS_get_u16(cbs, &sig_alg)) |
1162 | return 0; | 1025 | return 0; |
1163 | 1026 | ||
1164 | switch (sig_alg) { | 1027 | if ((sigalg = ssl_sigalg_lookup(sig_alg)) != NULL && |
1165 | case TLSEXT_signature_rsa: | 1028 | c->pkeys[sigalg->pkey_idx].digest == NULL) { |
1166 | idx = SSL_PKEY_RSA_SIGN; | 1029 | md = sigalg->md(); |
1167 | break; | 1030 | c->pkeys[sigalg->pkey_idx].digest = md; |
1168 | case TLSEXT_signature_ecdsa: | 1031 | if (sigalg->pkey_idx == SSL_PKEY_RSA_SIGN) |
1169 | idx = SSL_PKEY_ECC; | 1032 | c->pkeys[SSL_PKEY_RSA_ENC].digest = md; |
1170 | break; | ||
1171 | case TLSEXT_signature_gostr01: | ||
1172 | case TLSEXT_signature_gostr12_256: | ||
1173 | case TLSEXT_signature_gostr12_512: | ||
1174 | idx = SSL_PKEY_GOST01; | ||
1175 | break; | ||
1176 | default: | ||
1177 | continue; | ||
1178 | } | 1033 | } |
1179 | |||
1180 | if (c->pkeys[idx].digest == NULL) { | ||
1181 | md = tls12_get_hash(hash_alg); | ||
1182 | if (md) { | ||
1183 | c->pkeys[idx].digest = md; | ||
1184 | if (idx == SSL_PKEY_RSA_SIGN) | ||
1185 | c->pkeys[SSL_PKEY_RSA_ENC].digest = md; | ||
1186 | } | ||
1187 | } | ||
1188 | |||
1189 | } | 1034 | } |
1190 | 1035 | ||
1191 | /* | 1036 | /* |
1192 | * Set any remaining keys to default values. NOTE: if alg is not | 1037 | * Set any remaining keys to default values. NOTE: if alg is not |
1193 | * supported it stays as NULL. | 1038 | * supported it stays as NULL. |
1194 | */ | 1039 | */ |
1195 | if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest) { | 1040 | if (c->pkeys[SSL_PKEY_RSA_SIGN].digest == NULL) |
1196 | c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1(); | 1041 | c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1(); |
1042 | if (c->pkeys[SSL_PKEY_RSA_ENC].digest == NULL) | ||
1197 | c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1(); | 1043 | c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1(); |
1198 | } | 1044 | if (c->pkeys[SSL_PKEY_ECC].digest == NULL) |
1199 | if (!c->pkeys[SSL_PKEY_ECC].digest) | ||
1200 | c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1(); | 1045 | c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1(); |
1201 | #ifndef OPENSSL_NO_GOST | 1046 | #ifndef OPENSSL_NO_GOST |
1202 | if (!c->pkeys[SSL_PKEY_GOST01].digest) | 1047 | if (c->pkeys[SSL_PKEY_GOST01].digest == NULL) |
1203 | c->pkeys[SSL_PKEY_GOST01].digest = EVP_gostr341194(); | 1048 | c->pkeys[SSL_PKEY_GOST01].digest = EVP_gostr341194(); |
1204 | #endif | 1049 | #endif |
1205 | return 1; | 1050 | return 1; |