diff --git a/src/crypto.h b/src/crypto.h index fdf3e2a4..58a621e8 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -184,9 +184,15 @@ _libssh2_ed25519_verify(libssh2_ed25519_ctx *ctx, const uint8_t *s, size_t s_len, const uint8_t *m, size_t m_len); int -_libssh2_ed25519_new_private(libssh2_ed25519_ctx **ec_ctx, +_libssh2_ed25519_new_private(libssh2_ed25519_ctx **ed_ctx, LIBSSH2_SESSION *session, const char *filename, const uint8_t *passphrase); + +int +_libssh2_ed25519_new_public(libssh2_ed25519_ctx **ed_ctx, + LIBSSH2_SESSION *session, + const char *raw_pub_key, const uint8_t key_len); + int _libssh2_ed25519_sign(libssh2_ed25519_ctx *ctx, LIBSSH2_SESSION *session, uint8_t **out_sig, size_t *out_sig_len, diff --git a/src/hostkey.c b/src/hostkey.c index 41b251b0..f76eea25 100644 --- a/src/hostkey.c +++ b/src/hostkey.c @@ -795,9 +795,8 @@ hostkey_method_ssh_ed25519_init(LIBSSH2_SESSION * session, size_t hostkey_data_len, void **abstract) { - const unsigned char *s; + const char *s; unsigned long len, key_len; - EVP_PKEY *public_key = NULL; libssh2_ed25519_ctx *ctx = NULL; if(*abstract) { @@ -823,17 +822,10 @@ hostkey_method_ssh_ed25519_init(LIBSSH2_SESSION * session, key_len = _libssh2_ntohu32(s); s += 4; - public_key = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, (const unsigned char*)s, key_len); - if(public_key == NULL) { - return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "could not create ED25519 public key"); + if(_libssh2_ed25519_new_public(&ctx, session, s, key_len) != 0) { + return -1; } - ctx = _libssh2_ed25519_new_ctx(); - if(ctx == NULL) { - return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "could not alloc public/private key"); - } - - ctx->public_key = public_key; *abstract = ctx; return 0; diff --git a/src/openssl.c b/src/openssl.c index 64a2a12c..36170b73 100644 --- a/src/openssl.c +++ b/src/openssl.c @@ -1774,6 +1774,37 @@ _libssh2_ed25519_new_private_frommemory(libssh2_ed25519_ctx ** ed_ctx, filedata, filedata_len, passphrase); } +int +_libssh2_ed25519_new_public(libssh2_ed25519_ctx ** ed_ctx, + LIBSSH2_SESSION * session, + const char *raw_pub_key, const uint8_t key_len) +{ + libssh2_ed25519_ctx *ctx = NULL; + EVP_PKEY *public_key = NULL; + + if(ed_ctx == NULL) + return -1; + + public_key = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL, (const unsigned char*)raw_pub_key, key_len); + if(public_key == NULL) { + return _libssh2_error(session, LIBSSH2_ERROR_PROTO, "could not create ED25519 public key"); + } + + ctx = _libssh2_ed25519_new_ctx(); + if(ctx == NULL) { + return _libssh2_error(session, LIBSSH2_ERROR_ALLOC, "could not alloc public/private key"); + } + + ctx->public_key = public_key; + + if(ed_ctx != NULL) + *ed_ctx = ctx; + else if(ctx != NULL) + _libssh2_ed25519_free(ctx); + + return 0; +} + #endif /* LIBSSH2_ED25519 */ int