@@ -336,7 +336,7 @@ int ssl3_connect(SSL *s)
336
336
}
337
337
#endif
338
338
/* Check if it is anon DH/ECDH, SRP auth */
339
- /* or PSK */
339
+ /* or plain PSK */
340
340
if (!(s -> s3 -> tmp .new_cipher -> algorithm_auth & (SSL_aNULL |SSL_aSRP )) &&
341
341
!(s -> s3 -> tmp .new_cipher -> algorithm_mkey & SSL_kPSK ))
342
342
{
@@ -1402,9 +1402,9 @@ int ssl3_get_key_exchange(SSL *s)
1402
1402
if (s -> s3 -> tmp .message_type != SSL3_MT_SERVER_KEY_EXCHANGE )
1403
1403
{
1404
1404
#ifndef OPENSSL_NO_PSK
1405
- /* In plain PSK ciphersuite , ServerKeyExchange can be
1405
+ /* In PSK ciphersuites , ServerKeyExchange can be
1406
1406
omitted if no identity hint is sent. Set
1407
- session->sess_cert anyway to avoid problems
1407
+ session->sess_cert for plain PSK anyway to avoid problems
1408
1408
later.*/
1409
1409
if (s -> s3 -> tmp .new_cipher -> algorithm_mkey & SSL_kPSK )
1410
1410
{
@@ -1458,7 +1458,12 @@ int ssl3_get_key_exchange(SSL *s)
1458
1458
al = SSL_AD_DECODE_ERROR ;
1459
1459
1460
1460
#ifndef OPENSSL_NO_PSK
1461
- if (alg_k & SSL_kPSK )
1461
+ /* handle PSK identity hint */
1462
+ if (alg_k & (SSL_kPSK
1463
+ #ifndef OPENSSL_NO_RSA
1464
+ |SSL_kRSAPSK
1465
+ #endif
1466
+ ))
1462
1467
{
1463
1468
char tmp_id_hint [PSK_MAX_IDENTITY_LEN + 1 ];
1464
1469
@@ -1635,7 +1640,11 @@ int ssl3_get_key_exchange(SSL *s)
1635
1640
else
1636
1641
#endif /* !OPENSSL_NO_SRP */
1637
1642
#ifndef OPENSSL_NO_RSA
1638
- if (alg_k & SSL_kRSA )
1643
+ if (alg_k & (SSL_kRSA
1644
+ #ifndef OPENSSL_NO_PSK
1645
+ |SSL_kRSAPSK
1646
+ #endif
1647
+ ))
1639
1648
{
1640
1649
if ((rsa = RSA_new ()) == NULL )
1641
1650
{
@@ -2038,8 +2047,16 @@ fprintf(stderr, "USING TLSv1.2 HASH %s\n", EVP_MD_name(md));
2038
2047
}
2039
2048
else
2040
2049
{
2041
- /* aNULL, aSRP or kPSK do not need public keys */
2042
- if (!(alg_a & (SSL_aNULL |SSL_aSRP )) && !(alg_k & SSL_kPSK ))
2050
+ /* aNULL, aSRP, kPSK or kRSAPSK do not need public keys */
2051
+ if (!(alg_a & (SSL_aNULL |SSL_aSRP ))
2052
+ #ifndef OPENSSL_NO_PSK
2053
+ && !(alg_k & (SSL_kPSK
2054
+ #ifndef OPENSSL_NO_RSA
2055
+ |SSL_kRSAPSK
2056
+ #endif
2057
+ ))
2058
+ #endif
2059
+ )
2043
2060
{
2044
2061
/* Might be wrong key type, check it */
2045
2062
if (ssl3_check_cert_and_algorithm (s ))
@@ -3109,15 +3126,19 @@ int ssl3_send_client_key_exchange(SSL *s)
3109
3126
}
3110
3127
#endif
3111
3128
#ifndef OPENSSL_NO_PSK
3112
- else if (alg_k & SSL_kPSK )
3129
+ else if (alg_k & SSL_kPSK
3130
+ #ifndef OPENSSL_NO_RSA
3131
+ || alg_k & SSL_kRSAPSK
3132
+ #endif
3133
+ )
3113
3134
{
3114
3135
/* The callback needs PSK_MAX_IDENTITY_LEN + 1 bytes
3115
3136
* to return a \0-terminated identity. The last byte
3116
3137
* is for us for simulating strnlen. */
3117
3138
char identity [PSK_MAX_IDENTITY_LEN + 2 ];
3118
3139
size_t identity_len ;
3119
- unsigned char * t = NULL ;
3120
3140
unsigned char psk_or_pre_ms [PSK_MAX_PSK_LEN * 2 + 4 ];
3141
+ unsigned char * t = psk_or_pre_ms ;
3121
3142
unsigned int pre_ms_len = 0 , psk_len = 0 ;
3122
3143
int psk_err = 1 ;
3123
3144
@@ -3153,14 +3174,36 @@ int ssl3_send_client_key_exchange(SSL *s)
3153
3174
ERR_R_INTERNAL_ERROR );
3154
3175
goto psk_err ;
3155
3176
}
3156
- /* create PSK pre_master_secret */
3157
- pre_ms_len = 2 + psk_len + 2 + psk_len ;
3158
- t = psk_or_pre_ms ;
3159
- memmove (psk_or_pre_ms + psk_len + 4 , psk_or_pre_ms , psk_len );
3160
- s2n (psk_len , t );
3161
- memset (t , 0 , psk_len );
3162
- t += psk_len ;
3163
- s2n (psk_len , t );
3177
+
3178
+ if (alg_k & SSL_kPSK )
3179
+ {
3180
+ /* create PSK pre_master_secret */
3181
+ pre_ms_len = 2 + psk_len + 2 + psk_len ;
3182
+ memmove (psk_or_pre_ms + psk_len + 4 , psk_or_pre_ms , psk_len );
3183
+ s2n (psk_len , t );
3184
+ memset (t , 0 , psk_len );
3185
+ t += psk_len ;
3186
+ s2n (psk_len , t );
3187
+ }
3188
+ #ifndef OPENSSL_NO_RSA
3189
+ else if (alg_k & SSL_kRSAPSK )
3190
+ {
3191
+ const unsigned int pre_ms_prefix = 48 ;
3192
+
3193
+ pre_ms_len = 2 + 2 + 46 + 2 + psk_len ;
3194
+ memmove (psk_or_pre_ms + 52 , psk_or_pre_ms , psk_len );
3195
+ s2n (pre_ms_prefix , t );
3196
+
3197
+ psk_or_pre_ms [2 ] = s -> client_version >> 8 ;
3198
+ psk_or_pre_ms [3 ] = s -> client_version & 0xff ;
3199
+ t += 2 ;
3200
+
3201
+ if (RAND_bytes (psk_or_pre_ms + 4 , 46 ) <= 0 )
3202
+ goto psk_err ;
3203
+ t += 46 ;
3204
+ s2n (psk_len , t );
3205
+ }
3206
+ #endif
3164
3207
3165
3208
if (s -> session -> psk_identity_hint != NULL )
3166
3209
OPENSSL_free (s -> session -> psk_identity_hint );
@@ -3187,10 +3230,51 @@ int ssl3_send_client_key_exchange(SSL *s)
3187
3230
s -> method -> ssl3_enc -> generate_master_secret (s ,
3188
3231
s -> session -> master_key ,
3189
3232
psk_or_pre_ms , pre_ms_len );
3233
+
3190
3234
s2n (identity_len , p );
3191
3235
memcpy (p , identity , identity_len );
3236
+ p += identity_len ;
3237
+
3192
3238
n = 2 + identity_len ;
3239
+
3240
+ #ifndef OPENSSL_NO_RSA
3241
+ if (alg_k & SSL_kRSAPSK )
3242
+ {
3243
+ RSA * rsa ;
3244
+ int enc_n ;
3245
+
3246
+ if (s -> session -> sess_cert -> peer_rsa_tmp != NULL )
3247
+ {
3248
+ rsa = s -> session -> sess_cert -> peer_rsa_tmp ;
3249
+ }
3250
+ else
3251
+ {
3252
+ pkey = X509_get_pubkey (s -> session -> sess_cert -> peer_pkeys [SSL_PKEY_RSA_ENC ].x509 );
3253
+ if ((pkey == NULL ) ||
3254
+ (pkey -> type != EVP_PKEY_RSA ) ||
3255
+ (pkey -> pkey .rsa == NULL ))
3256
+ {
3257
+ SSLerr (SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE , ERR_R_INTERNAL_ERROR );
3258
+ goto psk_err ;
3259
+ }
3260
+ rsa = pkey -> pkey .rsa ;
3261
+ EVP_PKEY_free (pkey );
3262
+ }
3263
+
3264
+ enc_n = RSA_public_encrypt (48 , psk_or_pre_ms + 2 , p + 2 , rsa , RSA_PKCS1_PADDING );
3265
+ if (enc_n <= 0 )
3266
+ {
3267
+ SSLerr (SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE , SSL_R_BAD_RSA_ENCRYPT );
3268
+ goto psk_err ;
3269
+ }
3270
+ n += enc_n ;
3271
+
3272
+ s2n (enc_n , p );
3273
+ n += 2 ;
3274
+ }
3275
+ #endif
3193
3276
psk_err = 0 ;
3277
+
3194
3278
psk_err :
3195
3279
OPENSSL_cleanse (identity , sizeof (identity ));
3196
3280
OPENSSL_cleanse (psk_or_pre_ms , sizeof (psk_or_pre_ms ));
@@ -3597,7 +3681,11 @@ int ssl3_check_cert_and_algorithm(SSL *s)
3597
3681
}
3598
3682
#endif
3599
3683
#ifndef OPENSSL_NO_RSA
3600
- if ((alg_k & SSL_kRSA ) &&
3684
+ if ((alg_k & (SSL_kRSA
3685
+ #ifndef OPENSSL_NO_PSK
3686
+ |SSL_kRSAPSK
3687
+ #endif
3688
+ )) &&
3601
3689
!(has_bits (i ,EVP_PK_RSA |EVP_PKT_ENC ) || (rsa != NULL )))
3602
3690
{
3603
3691
SSLerr (SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM ,SSL_R_MISSING_RSA_ENCRYPTING_CERT );
@@ -3630,7 +3718,11 @@ int ssl3_check_cert_and_algorithm(SSL *s)
3630
3718
if (SSL_C_IS_EXPORT (s -> s3 -> tmp .new_cipher ) && !has_bits (i ,EVP_PKT_EXP ))
3631
3719
{
3632
3720
#ifndef OPENSSL_NO_RSA
3633
- if (alg_k & SSL_kRSA )
3721
+ if (alg_k & (SSL_kRSA
3722
+ #ifndef OPENSSL_NO_PSK
3723
+ |SSL_kRSAPSK
3724
+ #endif
3725
+ ))
3634
3726
{
3635
3727
if (rsa == NULL
3636
3728
|| RSA_size (rsa )* 8 > SSL_C_EXPORT_PKEYLENGTH (s -> s3 -> tmp .new_cipher ))
0 commit comments