@@ -187,6 +187,67 @@ int wolfSSH_MakeEcdsaKey(byte* out, word32 outSz, word32 size)
187187}
188188
189189
190+ int wolfSSH_MakeEd25519Key (byte * out , word32 outSz , word32 size )
191+ {
192+ #ifndef WOLFSSH_NO_ED25519
193+
194+ int ret = WS_SUCCESS ;
195+ WC_RNG rng ;
196+
197+ WLOG (WS_LOG_DEBUG , "Entering wolfSSH_MakeEd25519Key()" );
198+
199+ if (wc_InitRng (& rng ) != 0 ) {
200+ WLOG (WS_LOG_DEBUG , "Couldn't create RNG" );
201+ ret = WS_CRYPTO_FAILED ;
202+ }
203+
204+ if (ret == WS_SUCCESS ) {
205+ ed25519_key key ;
206+
207+ if (wc_ed25519_init (& key ) != 0 )
208+ ret = WS_CRYPTO_FAILED ;
209+
210+ if (ret == WS_SUCCESS ) {
211+ ret = wc_ed25519_make_key (& rng , size /8 , & key );
212+ if (ret != 0 ) {
213+ WLOG (WS_LOG_DEBUG , "ED25519 key generation failed" );
214+ ret = WS_CRYPTO_FAILED ;
215+ }
216+ else
217+ ret = WS_SUCCESS ;
218+ }
219+
220+ if (ret == WS_SUCCESS ) {
221+ int keySz ;
222+
223+ keySz = wc_Ed25519KeyToDer (& key , out , outSz );
224+ if (keySz < 0 ) {
225+ WLOG (WS_LOG_DEBUG , "ED25519 key to DER failed" );
226+ ret = WS_CRYPTO_FAILED ;
227+ }
228+ else
229+ ret = keySz ;
230+ }
231+
232+ wc_ed25519_free (& key );
233+
234+ if (wc_FreeRng (& rng ) != 0 ) {
235+ WLOG (WS_LOG_DEBUG , "Couldn't free RNG" );
236+ ret = WS_CRYPTO_FAILED ;
237+ }
238+ }
239+
240+ WLOG (WS_LOG_DEBUG , "Leaving wolfSSH_MakeEd25519Key(), ret = %d" , ret );
241+ return ret ;
242+ #else
243+ WOLFSSH_UNUSED (out );
244+ WOLFSSH_UNUSED (outSz );
245+ WOLFSSH_UNUSED (size );
246+ return WS_NOT_COMPILED ;
247+ #endif
248+ }
249+
250+
190251#else /* WOLFSSL_KEY_GEN */
191252 #error "wolfSSH keygen requires that keygen is enabled in wolfSSL, use --enable-keygen or #define WOLFSSL_KEY_GEN."
192253#endif /* WOLFSSL_KEY_GEN */
0 commit comments