diff options
| author | jsing <> | 2016-11-04 15:05:29 +0000 |
|---|---|---|
| committer | jsing <> | 2016-11-04 15:05:29 +0000 |
| commit | 69c9ad60f0c7bbe10b0e5febecf2247f69c988ba (patch) | |
| tree | 7f4f22dc7a59c5f9b343f147031d401f6e014ab1 /src | |
| parent | 019fd806c1ec95baf804a2ef35972faa66bc24a8 (diff) | |
| download | openbsd-69c9ad60f0c7bbe10b0e5febecf2247f69c988ba.tar.gz openbsd-69c9ad60f0c7bbe10b0e5febecf2247f69c988ba.tar.bz2 openbsd-69c9ad60f0c7bbe10b0e5febecf2247f69c988ba.zip | |
Convert ssl3_get_server_kex_dhe() to CBS.
ok beck@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/s3_clnt.c | 61 |
1 files changed, 19 insertions, 42 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c index e9db8e27c2..8e02239392 100644 --- a/src/lib/libssl/s3_clnt.c +++ b/src/lib/libssl/s3_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s3_clnt.c,v 1.140 2016/11/03 13:20:35 jsing Exp $ */ | 1 | /* $OpenBSD: s3_clnt.c,v 1.141 2016/11/04 15:05:29 jsing 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 | * |
| @@ -1094,68 +1094,47 @@ err: | |||
| 1094 | static int | 1094 | static int |
| 1095 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | 1095 | ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) |
| 1096 | { | 1096 | { |
| 1097 | CBS cbs, dhp, dhg, dhpk; | ||
| 1097 | BN_CTX *bn_ctx = NULL; | 1098 | BN_CTX *bn_ctx = NULL; |
| 1098 | SESS_CERT *sc = NULL; | 1099 | SESS_CERT *sc = NULL; |
| 1099 | DH *dh = NULL; | 1100 | DH *dh = NULL; |
| 1100 | int al, i, param_len; | 1101 | long alg_a; |
| 1101 | unsigned char *p; | 1102 | int al; |
| 1102 | long alg_a, n; | ||
| 1103 | 1103 | ||
| 1104 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; | 1104 | alg_a = s->s3->tmp.new_cipher->algorithm_auth; |
| 1105 | n = *nn; | ||
| 1106 | p = *pp; | ||
| 1107 | sc = s->session->sess_cert; | 1105 | sc = s->session->sess_cert; |
| 1108 | 1106 | ||
| 1107 | if (*nn < 0) | ||
| 1108 | goto err; | ||
| 1109 | |||
| 1110 | CBS_init(&cbs, *pp, *nn); | ||
| 1111 | |||
| 1109 | if ((dh = DH_new()) == NULL) { | 1112 | if ((dh = DH_new()) == NULL) { |
| 1110 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_DH_LIB); | 1113 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_DH_LIB); |
| 1111 | goto err; | 1114 | goto err; |
| 1112 | } | 1115 | } |
| 1113 | if (2 > n) | 1116 | |
| 1117 | if (!CBS_get_u16_length_prefixed(&cbs, &dhp)) | ||
| 1114 | goto truncated; | 1118 | goto truncated; |
| 1115 | n2s(p, i); | 1119 | if ((dh->p = BN_bin2bn(CBS_data(&dhp), CBS_len(&dhp), NULL)) == NULL) { |
| 1116 | param_len = i + 2; | ||
| 1117 | if (param_len > n) { | ||
| 1118 | al = SSL_AD_DECODE_ERROR; | ||
| 1119 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_P_LENGTH); | ||
| 1120 | goto f_err; | ||
| 1121 | } | ||
| 1122 | if (!(dh->p = BN_bin2bn(p, i, NULL))) { | ||
| 1123 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1120 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); |
| 1124 | goto err; | 1121 | goto err; |
| 1125 | } | 1122 | } |
| 1126 | p += i; | ||
| 1127 | 1123 | ||
| 1128 | if (param_len + 2 > n) | 1124 | if (!CBS_get_u16_length_prefixed(&cbs, &dhg)) |
| 1129 | goto truncated; | 1125 | goto truncated; |
| 1130 | n2s(p, i); | 1126 | if ((dh->g = BN_bin2bn(CBS_data(&dhg), CBS_len(&dhg), NULL)) == NULL) { |
| 1131 | param_len += i + 2; | ||
| 1132 | if (param_len > n) { | ||
| 1133 | al = SSL_AD_DECODE_ERROR; | ||
| 1134 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_G_LENGTH); | ||
| 1135 | goto f_err; | ||
| 1136 | } | ||
| 1137 | if (!(dh->g = BN_bin2bn(p, i, NULL))) { | ||
| 1138 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1127 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); |
| 1139 | goto err; | 1128 | goto err; |
| 1140 | } | 1129 | } |
| 1141 | p += i; | ||
| 1142 | 1130 | ||
| 1143 | if (param_len + 2 > n) | 1131 | if (!CBS_get_u16_length_prefixed(&cbs, &dhpk)) |
| 1144 | goto truncated; | 1132 | goto truncated; |
| 1145 | n2s(p, i); | 1133 | if ((dh->pub_key = BN_bin2bn(CBS_data(&dhpk), CBS_len(&dhpk), |
| 1146 | param_len += i + 2; | 1134 | NULL)) == NULL) { |
| 1147 | if (param_len > n) { | ||
| 1148 | al = SSL_AD_DECODE_ERROR; | ||
| 1149 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, | ||
| 1150 | SSL_R_BAD_DH_PUB_KEY_LENGTH); | ||
| 1151 | goto f_err; | ||
| 1152 | } | ||
| 1153 | if (!(dh->pub_key = BN_bin2bn(p, i, NULL))) { | ||
| 1154 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); | 1135 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_BN_LIB); |
| 1155 | goto err; | 1136 | goto err; |
| 1156 | } | 1137 | } |
| 1157 | p += i; | ||
| 1158 | n -= param_len; | ||
| 1159 | 1138 | ||
| 1160 | /* | 1139 | /* |
| 1161 | * Check the strength of the DH key just constructed. | 1140 | * Check the strength of the DH key just constructed. |
| @@ -1176,16 +1155,14 @@ ssl3_get_server_kex_dhe(SSL *s, EVP_PKEY **pkey, unsigned char **pp, long *nn) | |||
| 1176 | 1155 | ||
| 1177 | sc->peer_dh_tmp = dh; | 1156 | sc->peer_dh_tmp = dh; |
| 1178 | 1157 | ||
| 1179 | *nn = n; | 1158 | *nn = CBS_len(&cbs); |
| 1180 | *pp = p; | 1159 | *pp = (unsigned char *)CBS_data(&cbs); |
| 1181 | 1160 | ||
| 1182 | return (1); | 1161 | return (1); |
| 1183 | 1162 | ||
| 1184 | truncated: | 1163 | truncated: |
| 1185 | al = SSL_AD_DECODE_ERROR; | 1164 | al = SSL_AD_DECODE_ERROR; |
| 1186 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); | 1165 | SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_PACKET_LENGTH); |
| 1187 | |||
| 1188 | f_err: | ||
| 1189 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 1166 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
| 1190 | 1167 | ||
| 1191 | err: | 1168 | err: |
