Add Ed25519

1. Add testing key for user barney.
2. Remove some instances of the incorrect macro guard WOLFSSH_NO_ECC. We
   deal in ECDSA or ECDHE separately only.
3. Add WIP function for decoding the OpenSSH format Ed25519 key.
pull/689/head
John Safranek 2024-05-10 11:30:58 -07:00
parent 8f61e26819
commit 9b97927cd8
4 changed files with 47 additions and 5 deletions

7
keys/id_barney 100644
View File

@ -0,0 +1,7 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBs8gsipHiL/VP0nvJOeDeR0EYF9AXtXnjGlGmqHru5NQAAAJghFgrDIRYK
wwAAAAtzc2gtZWQyNTUxOQAAACBs8gsipHiL/VP0nvJOeDeR0EYF9AXtXnjGlGmqHru5NQ
AAAEDuTSTiIfkHZlxI+gjjETACk3F3PPU7jgOHG6NH/THSXWzyCyKkeIv9U/Se8k54N5HQ
RgX0Be1eeMaUaaoeu7k1AAAAEGJhcm5leUBsb2NhbGhvc3QBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

View File

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGzyCyKkeIv9U/Se8k54N5HQRgX0Be1eeMaUaaoeu7k1 barney@localhost

View File

@ -1409,8 +1409,7 @@ static int GetOpenSshKeyRsa(RsaKey* key,
}
#endif
#if !defined(WOLFSSH_NO_ECDSA) && !defined(WOLFSSH_NO_ECC)
#ifndef WOLFSSH_NO_ECDSA
/*
* Utility for GetOpenSshKey() to read in ECDSA keys.
*/
@ -1440,6 +1439,35 @@ static int GetOpenSshKeyEcc(ecc_key* key,
}
#endif
#ifndef WOLFSSH_NO_ED25519
/*
* Utility for GetOpenSshKey() to read in Ed25519 keys.
*/
static int GetOpenSshKeyEd25519(ed25519_key* key,
const byte* buf, word32 len, word32* idx)
{
const byte *name = NULL, *priv = NULL, *pub = NULL;
word32 nameSz = 0, privSz = 0, pubSz = 0;
int ret;
ret = wc_ed25519_init_ex(key, ssh->ctx->heap, INVALID_DEVID);
if (ret == WS_SUCCESS)
ret = GetStringRef(&nameSz, &name, buf, len, idx); /* curve name */
if (ret == WS_SUCCESS)
ret = GetStringRef(&pubSz, &pub, buf, len, idx); /* ENC(A) */
if (ret == WS_SUCCESS)
ret = GetMpint(&privSz, &priv, buf, len, idx); /* k || ENC(A) */
if (ret == WS_SUCCESS)
ret = wc_ecc_import_private_key_ex(priv, privSz, pub, pubSz,
key, ECC_CURVE_DEF);
if (ret != WS_SUCCESS)
ret = WS_ECC_E;
return ret;
}
#endif
/*
* Decodes an OpenSSH format key.
*/
@ -1522,11 +1550,18 @@ static int GetOpenSshKey(WS_KeySignature *key,
str, strSz, &subIdx);
break;
#endif
#if !defined(WOLFSSH_NO_ECDSA) && !defined(WOLFSSH_NO_ECC)
#ifndef WOLFSSH_NO_ECDSA
case ID_ECDSA_SHA2_NISTP256:
case ID_ECDSA_SHA2_NISTP384:
case ID_ECDSA_SHA2_NISTP521:
ret = GetOpenSshKeyEcc(&key->ks.ecc.key,
str, strSz, &subIdx);
break;
#endif
#ifndef WOLFSSH_NO_ED25519
ret = GetOpenSshKeyEd25519(&key->ks.ed25519.key,
str, strSz, &subIdx);
break;
#endif
default:
ret = WS_UNIMPLEMENTED_E;

View File

@ -239,8 +239,7 @@ extern "C" {
#endif
#if defined(WOLFSSH_NO_ECDSA_SHA2_NISTP256) && \
defined(WOLFSSH_NO_ECDSA_SHA2_NISTP384) && \
defined(WOLFSSH_NO_ECDSA_SHA2_NISTP521) && \
!defined(HAVE_ED25519)
defined(WOLFSSH_NO_ECDSA_SHA2_NISTP521)
#undef WOLFSSH_NO_ECDSA
#define WOLFSSH_NO_ECDSA
#endif