Skip to content

Commit 1e054b9

Browse files
Merge pull request #7302 from dgarske/pk_psk
Support for Public Key (PK) callbacks with PSK
2 parents d2fd937 + 11303ab commit 1e054b9

4 files changed

Lines changed: 182 additions & 137 deletions

File tree

src/internal.c

Lines changed: 80 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -31464,23 +31464,13 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3146431464
case psk_kea:
3146531465
{
3146631466
byte* pms = ssl->arrays->preMasterSecret;
31467-
int cbret = (int)ssl->options.client_psk_cb(ssl,
31467+
ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
3146831468
ssl->arrays->server_hint, ssl->arrays->client_identity,
3146931469
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
31470-
31471-
if (cbret == 0 || cbret > MAX_PSK_KEY_LEN) {
31472-
if (cbret != USE_HW_PSK) {
31473-
ERROR_OUT(PSK_KEY_ERROR, exit_scke);
31474-
}
31475-
}
31476-
31477-
if (cbret == USE_HW_PSK) {
31478-
/* USE_HW_PSK indicates that the hardware has the PSK
31479-
* and generates the premaster secret. */
31480-
ssl->arrays->psk_keySz = 0;
31481-
}
31482-
else {
31483-
ssl->arrays->psk_keySz = (word32)cbret;
31470+
if (ssl->arrays->psk_keySz == 0 ||
31471+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
31472+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
31473+
ERROR_OUT(PSK_KEY_ERROR, exit_scke);
3148431474
}
3148531475

3148631476
/* Ensure the buffer is null-terminated. */
@@ -31492,7 +31482,7 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3149231482
XMEMCPY(args->encSecret, ssl->arrays->client_identity,
3149331483
args->encSz);
3149431484
ssl->options.peerAuthGood = 1;
31495-
if (cbret != USE_HW_PSK) {
31485+
if ((int)ssl->arrays->psk_keySz > 0) {
3149631486
/* CLIENT: Pre-shared Key for peer authentication. */
3149731487

3149831488
/* make psk pre master secret */
@@ -31508,8 +31498,8 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3150831498
ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
3150931499
+ (2 * OPAQUE16_LEN);
3151031500
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
31511-
ssl->arrays->psk_keySz = 0; /* No further need */
3151231501
}
31502+
ssl->arrays->psk_keySz = 0; /* No further need */
3151331503
break;
3151431504
}
3151531505
#endif /* !NO_PSK */
@@ -31520,12 +31510,14 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3152031510
args->output = args->encSecret;
3152131511

3152231512
ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
31523-
ssl->arrays->server_hint, ssl->arrays->client_identity,
31524-
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
31513+
ssl->arrays->server_hint, ssl->arrays->client_identity,
31514+
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
3152531515
if (ssl->arrays->psk_keySz == 0 ||
31526-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
31516+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
31517+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
3152731518
ERROR_OUT(PSK_KEY_ERROR, exit_scke);
3152831519
}
31520+
3152931521
ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
3153031522
esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
3153131523

@@ -31601,12 +31593,14 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3160131593

3160231594
/* Send PSK client identity */
3160331595
ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
31604-
ssl->arrays->server_hint, ssl->arrays->client_identity,
31605-
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
31596+
ssl->arrays->server_hint, ssl->arrays->client_identity,
31597+
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
3160631598
if (ssl->arrays->psk_keySz == 0 ||
31607-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
31599+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
31600+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
3160831601
ERROR_OUT(PSK_KEY_ERROR, exit_scke);
3160931602
}
31603+
3161031604
ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
3161131605
esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
3161231606
if (esSz > MAX_PSK_ID_LEN) {
@@ -31626,7 +31620,7 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3162631620
args->length = MAX_ENCRYPT_SZ;
3162731621

3162831622
/* Create shared ECC key leaving room at the beginning
31629-
of buffer for size of shared key. */
31623+
* of buffer for size of shared key. */
3163031624
ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
3163131625

3163231626
#ifdef HAVE_CURVE25519
@@ -32017,13 +32011,15 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3201732011
pms += ssl->arrays->preMasterSz;
3201832012

3201932013
/* make psk pre master secret */
32020-
/* length of key + length 0s + length of key + key */
32021-
c16toa((word16)ssl->arrays->psk_keySz, pms);
32022-
pms += OPAQUE16_LEN;
32023-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32024-
ssl->arrays->preMasterSz +=
32025-
ssl->arrays->psk_keySz + OPAQUE16_LEN;
32026-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32014+
if ((int)ssl->arrays->psk_keySz > 0) {
32015+
/* length of key + length 0s + length of key + key */
32016+
c16toa((word16)ssl->arrays->psk_keySz, pms);
32017+
pms += OPAQUE16_LEN;
32018+
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32019+
ssl->arrays->preMasterSz +=
32020+
ssl->arrays->psk_keySz + OPAQUE16_LEN;
32021+
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32022+
}
3202732023
ssl->arrays->psk_keySz = 0; /* No further need */
3202832024
break;
3202932025
}
@@ -32044,18 +32040,19 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3204432040
args->encSz += args->length + OPAQUE8_LEN;
3204532041

3204632042
/* Create pre master secret is the concatenation of
32047-
eccSize + eccSharedKey + pskSize + pskKey */
32043+
* eccSize + eccSharedKey + pskSize + pskKey */
3204832044
c16toa((word16)ssl->arrays->preMasterSz, pms);
3204932045
ssl->arrays->preMasterSz += OPAQUE16_LEN;
3205032046
pms += ssl->arrays->preMasterSz;
3205132047

32052-
c16toa((word16)ssl->arrays->psk_keySz, pms);
32053-
pms += OPAQUE16_LEN;
32054-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32055-
ssl->arrays->preMasterSz +=
32056-
ssl->arrays->psk_keySz + OPAQUE16_LEN;
32048+
if ((int)ssl->arrays->psk_keySz > 0) {
32049+
c16toa((word16)ssl->arrays->psk_keySz, pms);
32050+
pms += OPAQUE16_LEN;
32051+
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32052+
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
3205732053

32058-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32054+
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
32055+
}
3205932056
ssl->arrays->psk_keySz = 0; /* No further need */
3206032057
break;
3206132058
}
@@ -38691,31 +38688,35 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
3869138688
MAX_PSK_KEY_LEN);
3869238689

3869338690
if (ssl->arrays->psk_keySz == 0 ||
38694-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
38695-
#if defined(WOLFSSL_EXTRA_ALERTS) || \
38696-
defined(WOLFSSL_PSK_IDENTITY_ALERT)
38697-
SendAlert(ssl, alert_fatal,
38698-
unknown_psk_identity);
38699-
#endif
38691+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
38692+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
38693+
#if defined(WOLFSSL_EXTRA_ALERTS) || \
38694+
defined(WOLFSSL_PSK_IDENTITY_ALERT)
38695+
SendAlert(ssl, alert_fatal,
38696+
unknown_psk_identity);
38697+
#endif
3870038698
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
3870138699
}
3870238700
/* SERVER: Pre-shared Key for peer authentication. */
3870338701
ssl->options.peerAuthGood = 1;
3870438702

3870538703
/* make psk pre master secret */
38706-
/* length of key + length 0s + length of key + key */
38707-
c16toa((word16) ssl->arrays->psk_keySz, pms);
38708-
pms += OPAQUE16_LEN;
38704+
if ((int)ssl->arrays->psk_keySz > 0) {
38705+
/* length of key + length 0s + length of key + key */
38706+
c16toa((word16) ssl->arrays->psk_keySz, pms);
38707+
pms += OPAQUE16_LEN;
3870938708

38710-
XMEMSET(pms, 0, ssl->arrays->psk_keySz);
38711-
pms += ssl->arrays->psk_keySz;
38709+
XMEMSET(pms, 0, ssl->arrays->psk_keySz);
38710+
pms += ssl->arrays->psk_keySz;
3871238711

38713-
c16toa((word16) ssl->arrays->psk_keySz, pms);
38714-
pms += OPAQUE16_LEN;
38712+
c16toa((word16) ssl->arrays->psk_keySz, pms);
38713+
pms += OPAQUE16_LEN;
3871538714

38716-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
38717-
ssl->arrays->preMasterSz =
38718-
(ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
38715+
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
38716+
ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
38717+
(OPAQUE16_LEN * 2);
38718+
}
38719+
ssl->arrays->psk_keySz = 0; /* no further need */
3871938720
break;
3872038721
}
3872138722
#endif /* !NO_PSK */
@@ -39530,24 +39531,27 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
3953039531
MAX_PSK_KEY_LEN);
3953139532

3953239533
if (ssl->arrays->psk_keySz == 0 ||
39533-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
39534-
#if defined(WOLFSSL_EXTRA_ALERTS) || \
39535-
defined(WOLFSSL_PSK_IDENTITY_ALERT)
39536-
SendAlert(ssl, alert_fatal,
39537-
unknown_psk_identity);
39538-
#endif
39534+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
39535+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
39536+
#if defined(WOLFSSL_EXTRA_ALERTS) || \
39537+
defined(WOLFSSL_PSK_IDENTITY_ALERT)
39538+
SendAlert(ssl, alert_fatal,
39539+
unknown_psk_identity);
39540+
#endif
3953939541
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
3954039542
}
3954139543
/* SERVER: Pre-shared Key for peer authentication. */
3954239544
ssl->options.peerAuthGood = 1;
3954339545

39544-
c16toa((word16) ssl->arrays->psk_keySz, pms);
39545-
pms += OPAQUE16_LEN;
39546+
if ((int)ssl->arrays->psk_keySz > 0) {
39547+
c16toa((word16) ssl->arrays->psk_keySz, pms);
39548+
pms += OPAQUE16_LEN;
3954639549

39547-
XMEMCPY(pms, ssl->arrays->psk_key,
39548-
ssl->arrays->psk_keySz);
39549-
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
39550-
OPAQUE16_LEN;
39550+
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
39551+
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
39552+
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
39553+
}
39554+
ssl->arrays->psk_keySz = 0; /* no further need */
3955139555
break;
3955239556
}
3955339557
#endif /* !NO_DH && !NO_PSK */
@@ -39573,18 +39577,21 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
3957339577
MAX_PSK_KEY_LEN);
3957439578

3957539579
if (ssl->arrays->psk_keySz == 0 ||
39576-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
39580+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
39581+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
3957739582
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
3957839583
}
3957939584
/* SERVER: Pre-shared Key for peer authentication. */
3958039585
ssl->options.peerAuthGood = 1;
39586+
if ((int)ssl->arrays->psk_keySz > 0) {
39587+
c16toa((word16) ssl->arrays->psk_keySz, pms);
39588+
pms += OPAQUE16_LEN;
3958139589

39582-
c16toa((word16) ssl->arrays->psk_keySz, pms);
39583-
pms += OPAQUE16_LEN;
39584-
39585-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
39586-
ssl->arrays->preMasterSz +=
39587-
ssl->arrays->psk_keySz + OPAQUE16_LEN;
39590+
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
39591+
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
39592+
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
39593+
}
39594+
ssl->arrays->psk_keySz = 0; /* no further need */
3958839595
break;
3958939596
}
3959039597
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */

src/tls.c

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13341,7 +13341,7 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1334113341
else
1334213342
#endif
1334313343
if (ssl->options.client_psk_cb != NULL ||
13344-
ssl->options.client_psk_tls13_cb != NULL) {
13344+
ssl->options.client_psk_tls13_cb != NULL) {
1334513345
/* Default cipher suite. */
1334613346
byte cipherSuite0 = TLS13_BYTE;
1334713347
byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
@@ -13363,42 +13363,38 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1336313363
ssl->arrays->server_hint, ssl->arrays->client_identity,
1336413364
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
1336513365
}
13366-
#if defined(OPENSSL_EXTRA)
13367-
/* OpenSSL treats 0 as a PSK key length of 0
13368-
* and meaning no PSK available.
13369-
*/
13370-
if (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
13371-
return PSK_KEY_ERROR;
13372-
}
13373-
if (ssl->arrays->psk_keySz > 0) {
13374-
#else
13375-
if (ssl->arrays->psk_keySz == 0 ||
13376-
ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
13377-
return PSK_KEY_ERROR;
13366+
if (
13367+
#ifndef OPENSSL_EXTRA
13368+
/* OpenSSL treats a PSK key length of 0
13369+
* to indicate no PSK available.
13370+
*/
13371+
ssl->arrays->psk_keySz == 0 ||
13372+
#endif
13373+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
13374+
(int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
13375+
ret = PSK_KEY_ERROR;
1337813376
}
13379-
#endif
13380-
ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
13381-
13382-
ssl->options.cipherSuite0 = cipherSuite0;
13383-
ssl->options.cipherSuite = cipherSuite;
13384-
(void)cipherSuiteFlags;
13385-
ret = SetCipherSpecs(ssl);
13386-
if (ret != 0)
13387-
return ret;
13377+
else {
13378+
ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
1338813379

13389-
ret = TLSX_PreSharedKey_Use(&ssl->extensions,
13390-
(byte*)ssl->arrays->client_identity,
13391-
(word16)XSTRLEN(ssl->arrays->client_identity),
13392-
0, ssl->specs.mac_algorithm,
13393-
cipherSuite0, cipherSuite, 0,
13394-
NULL, ssl->heap);
13380+
ssl->options.cipherSuite0 = cipherSuite0;
13381+
ssl->options.cipherSuite = cipherSuite;
13382+
(void)cipherSuiteFlags;
13383+
ret = SetCipherSpecs(ssl);
13384+
if (ret == 0) {
13385+
ret = TLSX_PreSharedKey_Use(
13386+
&ssl->extensions,
13387+
(byte*)ssl->arrays->client_identity,
13388+
(word16)XSTRLEN(ssl->arrays->client_identity),
13389+
0, ssl->specs.mac_algorithm,
13390+
cipherSuite0, cipherSuite, 0,
13391+
NULL, ssl->heap);
13392+
}
13393+
if (ret == 0)
13394+
usingPSK = 1;
13395+
}
1339513396
if (ret != 0)
1339613397
return ret;
13397-
13398-
usingPSK = 1;
13399-
#if defined(OPENSSL_EXTRA)
13400-
}
13401-
#endif
1340213398
}
1340313399
#endif /* !NO_PSK */
1340413400
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)

0 commit comments

Comments
 (0)