Skip to content

Commit 88d4eae

Browse files
remove keyboard auth callback and use generic auth callback
1 parent 93ddf8f commit 88d4eae

5 files changed

Lines changed: 51 additions & 68 deletions

File tree

examples/echoserver/echoserver.c

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,14 +1709,17 @@ static void StrListFree(StrList* list)
17091709
}
17101710

17111711

1712-
/* Map user names to passwords */
1712+
/* Map user names to passwords and keyboard auth prompts */
17131713
/* Use arrays for username and p. The password or public key can
17141714
* be hashed and the hash stored here. Then I won't need the type. */
17151715
typedef struct PwMap {
17161716
byte type;
17171717
byte username[32];
17181718
word32 usernameSz;
17191719
byte p[WC_SHA256_DIGEST_SIZE];
1720+
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
1721+
WS_UserAuthData_Keyboard* keyboard;
1722+
#endif
17201723
struct PwMap* next;
17211724
} PwMap;
17221725

@@ -1752,6 +1755,24 @@ static PwMap* PwMapNew(PwMapList* list, byte type, const byte* username,
17521755
}
17531756

17541757

1758+
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
1759+
/* Create new node for list of auths, adding keyboard auth prompts */
1760+
static PwMap* PwMapKeyboardNew(PwMapList* list, byte type, const byte* username,
1761+
word32 usernameSz, const byte* p, word32 pSz,
1762+
WS_UserAuthData_Keyboard* keyboard)
1763+
{
1764+
PwMap* map;
1765+
1766+
map = PwMapNew(list, type, username, usernameSz, p, pSz);
1767+
if (map) {
1768+
map->keyboard = keyboard;
1769+
}
1770+
1771+
return map;
1772+
}
1773+
#endif
1774+
1775+
17551776
static void PwMapListDelete(PwMapList* list)
17561777
{
17571778
if (list != NULL) {
@@ -2013,7 +2034,8 @@ static int LoadPasswdList(StrList* strList, PwMapList* mapList)
20132034
return count;
20142035
}
20152036
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
2016-
static int LoadKeyboardList(StrList* strList, PwMapList* mapList)
2037+
static int LoadKeyboardList(StrList* strList, PwMapList* mapList,
2038+
WS_UserAuthData_Keyboard* kbAuthData)
20172039
{
20182040
char names[256];
20192041
char* passwd;
@@ -2026,9 +2048,10 @@ static int LoadKeyboardList(StrList* strList, PwMapList* mapList)
20262048
*passwd = 0;
20272049
passwd++;
20282050

2029-
PwMapNew(mapList, WOLFSSH_USERAUTH_KEYBOARD,
2051+
PwMapKeyboardNew(mapList, WOLFSSH_USERAUTH_KEYBOARD,
20302052
(byte*)names, (word32)WSTRLEN(names),
2031-
(byte*)passwd, (word32)WSTRLEN(passwd));
2053+
(byte*)passwd, (word32)WSTRLEN(passwd),
2054+
kbAuthData);
20322055
}
20332056
else {
20342057
fprintf(stderr, "Ignoring password: %s\n", names);
@@ -2192,6 +2215,7 @@ static int wsUserAuth(byte authType,
21922215
#endif
21932216
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
21942217
authType != WOLFSSH_USERAUTH_KEYBOARD &&
2218+
authType != WOLFSSH_USERAUTH_KEYBOARD_SETUP &&
21952219
#endif
21962220
authType != WOLFSSH_USERAUTH_PUBLICKEY) {
21972221

@@ -2315,6 +2339,14 @@ static int wsUserAuth(byte authType,
23152339
}
23162340
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
23172341
else if (authData->type == WOLFSSH_USERAUTH_KEYBOARD) {
2342+
if (authType == WOLFSSH_USERAUTH_KEYBOARD_SETUP) {
2343+
/* setup the keyboard auth prompts */
2344+
WMEMCPY(&authData->sf.keyboard, map->keyboard,
2345+
sizeof(WS_UserAuthData_Keyboard));
2346+
return WS_SUCCESS;
2347+
}
2348+
2349+
/* do keyboard auth prompts */
23182350
if (WMEMCMP(map->p, authHash, WC_SHA256_DIGEST_SIZE) == 0) {
23192351
return WOLFSSH_USERAUTH_SUCCESS;
23202352
}
@@ -2338,15 +2370,6 @@ static int wsUserAuth(byte authType,
23382370
return WOLFSSH_USERAUTH_INVALID_USER;
23392371
}
23402372

2341-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
2342-
static int keyboardCallback(WS_UserAuthData_Keyboard *kbAuth, void *ctx)
2343-
{
2344-
WS_UserAuthData_Keyboard *kbAuthData = (WS_UserAuthData_Keyboard*) ctx;
2345-
WMEMCPY(kbAuth, kbAuthData, sizeof(WS_UserAuthData_Keyboard));
2346-
2347-
return WS_SUCCESS;
2348-
}
2349-
#endif
23502373

23512374
#ifdef WOLFSSH_SFTP
23522375
/*
@@ -2800,9 +2823,6 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
28002823

28012824
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
28022825
if (keyboardList) {
2803-
LoadKeyboardList(keyboardList, &pwMapList);
2804-
StrListFree(keyboardList);
2805-
keyboardList = NULL;
28062826
kbAuthData.promptCount = 1;
28072827
kbAuthData.promptName = NULL;
28082828
kbAuthData.promptNameSz = 0;
@@ -2825,7 +2845,9 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
28252845
ES_ERROR("Error allocating promptEcho");
28262846
}
28272847
kbAuthData.promptEcho[0] = 0;
2828-
wolfSSH_SetKeyboardAuthPrompts(ctx, keyboardCallback);
2848+
LoadKeyboardList(keyboardList, &pwMapList, &kbAuthData);
2849+
StrListFree(keyboardList);
2850+
keyboardList = NULL;
28292851
}
28302852
#endif
28312853

@@ -3035,9 +3057,6 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
30353057
#endif
30363058
wolfSSH_SetUserAuthCtx(ssh, &pwMapList);
30373059
wolfSSH_SetKeyingCompletionCbCtx(ssh, (void*)ssh);
3038-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
3039-
wolfSSH_SetKeyboardAuthCtx(ssh, &kbAuthData);
3040-
#endif
30413060

30423061
/* Use the session object for its own highwater callback ctx */
30433062
if (defaultHighwater > 0) {

src/internal.c

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -877,9 +877,6 @@ WOLFSSH_CTX* CtxInit(WOLFSSH_CTX* ctx, byte side, void* heap)
877877
ctx->algoListCipher = cannedEncAlgoNames;
878878
ctx->algoListMac = cannedMacAlgoNames;
879879
ctx->algoListKeyAccepted = cannedKeyAlgoNames;
880-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
881-
ctx->keyboardAuthCb = NULL;
882-
#endif
883880

884881
count = (word32)(sizeof(ctx->privateKey)
885882
/ sizeof(ctx->privateKey[0]));
@@ -13380,24 +13377,18 @@ int SendUserAuthKeyboardRequest(WOLFSSH* ssh, WS_UserAuthData* authData)
1338013377
return WS_BAD_ARGUMENT;
1338113378
}
1338213379

13383-
if (ret == WS_SUCCESS){
13384-
if (ssh->ctx->keyboardAuthCb == NULL) {
13385-
WLOG(WS_LOG_DEBUG, "SendUserAuthKeyboardRequest called with no Cb set");
13386-
return WS_BAD_USAGE;
13387-
}
13388-
else {
13389-
ret = ssh->ctx->keyboardAuthCb(&authData->sf.keyboard,
13390-
ssh->keyboardAuthCtx);
13391-
}
13380+
if (ret == WS_SUCCESS && ssh->ctx->userAuthCb == NULL) {
13381+
WLOG(WS_LOG_DEBUG, "SendUserAuthKeyboardRequest called with no Cb set");
13382+
ret = WS_BAD_USAGE;
1339213383
}
1339313384

1339413385
if (ret == WS_SUCCESS) {
13395-
if (authData->sf.keyboard.promptCount > 0 &&
13396-
(authData->sf.keyboard.prompts == NULL ||
13397-
authData->sf.keyboard.promptLengths == NULL ||
13398-
authData->sf.keyboard.promptEcho == NULL)) {
13399-
ret = WS_BAD_USAGE;
13400-
}
13386+
authData->type = WOLFSSH_USERAUTH_KEYBOARD;
13387+
ret = ssh->ctx->userAuthCb(WOLFSSH_USERAUTH_KEYBOARD_SETUP, authData,
13388+
ssh->userAuthCtx);
13389+
if (ret == WOLFSSH_USERAUTH_SUCCESS) {
13390+
ret = WS_SUCCESS;
13391+
}
1340113392
}
1340213393

1340313394
if (ret == WS_SUCCESS) {
@@ -14957,6 +14948,7 @@ int SendUserAuthRequest(WOLFSSH* ssh, byte authType, int addSig)
1495714948
WMEMSET(keySig_ptr, 0, sizeof(WS_KeySignature));
1495814949
keySig_ptr->keySigId = ID_NONE;
1495914950
keySig_ptr->heap = ssh->ctx->heap;
14951+
1496014952
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
1496114953
/* Callback happens later for keyboard auth */
1496214954
if (authType & WOLFSSH_USERAUTH_KEYBOARD) {
@@ -15128,9 +15120,7 @@ static int GetAllowedAuth(WOLFSSH* ssh, char* authStr)
1512815120

1512915121
typeAllowed |= WOLFSSH_USERAUTH_PASSWORD;
1513015122
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
15131-
if (ssh->ctx && ssh->ctx->keyboardAuthCb) {
15132-
typeAllowed |= WOLFSSH_USERAUTH_KEYBOARD;
15133-
}
15123+
typeAllowed |= WOLFSSH_USERAUTH_KEYBOARD;
1513415124
#endif
1513515125
#if !defined(WOLFSSH_NO_RSA) || !defined(WOLFSSH_NO_ECDSA)
1513615126
typeAllowed |= WOLFSSH_USERAUTH_PUBLICKEY;

src/ssh.c

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,23 +1338,6 @@ int wolfSSH_SendDisconnect(WOLFSSH *ssh, word32 reason)
13381338
return SendDisconnect(ssh, reason);
13391339
}
13401340

1341-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
1342-
void wolfSSH_SetKeyboardAuthPrompts(WOLFSSH_CTX* ctx,
1343-
WS_CallbackKeyboardAuthPrompts cb)
1344-
{
1345-
if (ctx != NULL) {
1346-
ctx->keyboardAuthCb = cb;
1347-
}
1348-
}
1349-
1350-
void wolfSSH_SetKeyboardAuthCtx(WOLFSSH* ssh, void* keyboardAuthCtx)
1351-
{
1352-
if (ssh != NULL) {
1353-
ssh->keyboardAuthCtx = keyboardAuthCtx;
1354-
}
1355-
}
1356-
#endif
1357-
13581341
void wolfSSH_SetUserAuth(WOLFSSH_CTX* ctx, WS_CallbackUserAuth cb)
13591342
{
13601343
if (ctx != NULL) {

wolfssh/internal.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,9 +529,6 @@ struct WOLFSSH_CTX {
529529
WS_CallbackUserAuth userAuthCb; /* User Authentication Callback */
530530
WS_CallbackUserAuthTypes userAuthTypesCb; /* Authentication Types Allowed */
531531
WS_CallbackUserAuthResult userAuthResultCb; /* User Authentication Result */
532-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
533-
WS_CallbackKeyboardAuthPrompts keyboardAuthCb; /* Keyboard auth prompts */
534-
#endif
535532
WS_CallbackHighwater highwaterCb; /* Data Highwater Mark Callback */
536533
WS_CallbackGlobalReq globalReqCb; /* Global Request Callback */
537534
WS_CallbackReqSuccess reqSuccessCb; /* Global Request Success Callback */

wolfssh/ssh.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,6 @@ WOLFSSH_API void wolfSSH_SetUserAuthTypes(WOLFSSH_CTX*,
368368
WOLFSSH_API void wolfSSH_SetUserAuthCtx(WOLFSSH*, void*);
369369
WOLFSSH_API void* wolfSSH_GetUserAuthCtx(WOLFSSH*);
370370

371-
#ifdef WOLFSSH_KEYBOARD_INTERACTIVE
372-
typedef int (*WS_CallbackKeyboardAuthPrompts)(WS_UserAuthData_Keyboard*, void*);
373-
WOLFSSH_API void wolfSSH_SetKeyboardAuthPrompts(WOLFSSH_CTX*,
374-
WS_CallbackKeyboardAuthPrompts);
375-
WOLFSSH_API void wolfSSH_SetKeyboardAuthCtx(WOLFSSH*, void*);
376-
#endif
377-
378371
typedef int (*WS_CallbackUserAuthResult)(byte result,
379372
WS_UserAuthData* authData, void* userAuthResultCtx);
380373
WOLFSSH_API void wolfSSH_SetUserAuthResult(WOLFSSH_CTX* ctx,
@@ -474,6 +467,7 @@ enum WS_FormatTypes {
474467
#define WOLFSSH_USERAUTH_PUBLICKEY 0x02
475468
#define WOLFSSH_USERAUTH_KEYBOARD 0x04
476469
#define WOLFSSH_USERAUTH_NONE 0x08
470+
#define WOLFSSH_USERAUTH_KEYBOARD_SETUP 0x10
477471

478472
enum WS_UserAuthResults
479473
{

0 commit comments

Comments
 (0)