Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
640 changes: 498 additions & 142 deletions Cargo.lock

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,7 @@ wasm-bindgen-test = "0.3.45"
wiremock = ">=0.6.0, <0.7"
zxcvbn = ">=3.0.1, <4.0"

# There is an incompatibility when using pkcs5 and chacha20 on wasm builds. This can be removed once a new
# rustcrypto-formats crate version is released since the fix has been upstreamed.
# https://github.com/RustCrypto/formats/pull/1625
[patch.crates-io]
pkcs5 = { git = "https://github.com/bitwarden/rustcrypto-formats.git", rev = "2b27c63034217dd126bbf5ed874da51b84f8c705" }

uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "6d46b3f756dde3213357c477d86771a0fc5da7b4" }
uniffi_core = { git = "https://github.com/mozilla/uniffi-rs", rev = "6d46b3f756dde3213357c477d86771a0fc5da7b4" }
Expand Down
21 changes: 12 additions & 9 deletions crates/bitwarden-ssh/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,24 @@ keywords.workspace = true
wasm = [
"bitwarden-error/wasm",
"dep:tsify",
"dep:wasm-bindgen"
"dep:wasm-bindgen",
"getrandom/wasm_js"
] # WASM support
uniffi = ["dep:uniffi"] # Uniffi bindings

[dependencies]
bitwarden-error = { workspace = true }
bitwarden-vault = { workspace = true }
ed25519 = { version = ">=2.2.3, <3.0", features = ["pkcs8"] }
ed25519-dalek = { workspace = true, features = ["pkcs8"] }
pem-rfc7468 = "0.7.0"
pkcs8 = { version = ">=0.10.2, <0.11", features = ["encryption"] }
rand = ">=0.8.5, <0.9"
rsa = ">=0.9.2, <0.10"
block-padding = { version = "=0.4.0-rc.4" }
ed25519 = { version = "3.0.0-rc.1", features = ["pkcs8"] }
ed25519-dalek = { version = "=3.0.0-pre.1", features = ["alloc", "pkcs8"] }
getrandom = { version = "=0.3.3" }
pem-rfc7468 = "1.0.0-rc.3"
pkcs8 = { version = "=0.11.0-rc.7", features = ["encryption"] }
rand = "0.9.2"
rsa = "0.10.0-rc.9"
serde.workspace = true
ssh-key = { version = ">=0.6.7, <0.7", features = [
ssh-key = { version = "0.7.0-rc.3", features = [
"ed25519",
"encryption",
"rsa",
Expand All @@ -44,7 +47,7 @@ uniffi = { workspace = true, optional = true }
wasm-bindgen = { workspace = true, optional = true }

[dev-dependencies]
rand_chacha = "0.3.1"
rand_chacha = "0.9.0"

[lints]
workspace = true
70 changes: 35 additions & 35 deletions crates/bitwarden-ssh/resources/generator/rsa3072_key
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
92BGVXBMaMQH6FAAAAAAEC
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
Ok0DjGumEWfhSHAAAAAAEC
-----END OPENSSH PRIVATE KEY-----
92 changes: 46 additions & 46 deletions crates/bitwarden-ssh/resources/generator/rsa4096_key
Original file line number Diff line number Diff line change
@@ -1,49 +1,49 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAvn9WSzMTT3mYdvUp8fp+2fkH/ozjMcxQGT78pcCQQ3lienR7m5uh
OiD/9av3F44YPpSKykMnIfmLU1pZigKQdZvNPAbtC0eg9qcZxmrzRzaDwVq6AkaHcIj+QO
9lhNkcMOn2IEU52a11NeX2xZIfVF3zAHNxstLoO8U9j1HBNwAYdZJ2nDim0ayAXf9mZWgK
g3IL+EJSoFrzftDc6BEQ0psdESVB+z2SFt8joo1wTcFQi3OzORgGNW/ME/BJQvTt4j7Upi
+ebrlTwYm43War+hrWIdfL4lxtmnVHYHFO0zELdOmPsN2+AzEYJ6vEkukcpql17L/c6HcR
VogGDezvPoygoFbNefnUdCWbBZOb5LtCbhWZmutbwH5YiYCCWuZ39dlqO+9ip6xrAK+7ox
JMSBzG7kLgF2uVt/w/XOhjDyiKzgCS8zBK868/LdAJtqAhARY8x6e9DDu3ghWFDI8e0iEK
kwBAZMGLJhT4lSTgiKwizcIQsx5aZ54RznGdGhTNkrwL7mWg7USW1gDmSHHNy7rgKxNhbu
ycOAKICCllTESZtmYocRkcJOW8vW3p0zmjdjIYLg/3q7JcscbDg+JDgSYvCIFqrm0tiurG
RjlHCk4JUcExUA42W5QZox0nybw3zD/xjm8IstiC1sg6UXj4e49jxlEs0463WKOkr5n4BN
8AAAc455bHt+eWx7cAAAAHc3NoLXJzYQAAAgEAvn9WSzMTT3mYdvUp8fp+2fkH/ozjMcxQ
GT78pcCQQ3lienR7m5uhOiD/9av3F44YPpSKykMnIfmLU1pZigKQdZvNPAbtC0eg9qcZxm
rzRzaDwVq6AkaHcIj+QO9lhNkcMOn2IEU52a11NeX2xZIfVF3zAHNxstLoO8U9j1HBNwAY
dZJ2nDim0ayAXf9mZWgKg3IL+EJSoFrzftDc6BEQ0psdESVB+z2SFt8joo1wTcFQi3OzOR
gGNW/ME/BJQvTt4j7Upi+ebrlTwYm43War+hrWIdfL4lxtmnVHYHFO0zELdOmPsN2+AzEY
J6vEkukcpql17L/c6HcRVogGDezvPoygoFbNefnUdCWbBZOb5LtCbhWZmutbwH5YiYCCWu
Z39dlqO+9ip6xrAK+7oxJMSBzG7kLgF2uVt/w/XOhjDyiKzgCS8zBK868/LdAJtqAhARY8
x6e9DDu3ghWFDI8e0iEKkwBAZMGLJhT4lSTgiKwizcIQsx5aZ54RznGdGhTNkrwL7mWg7U
SW1gDmSHHNy7rgKxNhbuycOAKICCllTESZtmYocRkcJOW8vW3p0zmjdjIYLg/3q7JcscbD
g+JDgSYvCIFqrm0tiurGRjlHCk4JUcExUA42W5QZox0nybw3zD/xjm8IstiC1sg6UXj4e4
9jxlEs0463WKOkr5n4BN8AAAADAQABAAACAHisG1L5oNLoeP9qIE8L2k1j5n+GaelCvr6v
WsX47KoBe7OMlDynYoN7IglTDOxb89m4qQ6laWWpOWvswOme5DnMHz9WN9S8ZCe7BKXfXA
qRavcR7ODCIsvTzBQAUnPMQIJvwp0AnTvaGHSzHxZakQQVm3h+qNiZp8ktEej25glcQyI/
TGl7rZkGyC5DOm8kb/yCQzjZcpPn6XU9A6LyJJD0933D9z8a6q8YXO9831YyDj64ZSDWqi
AxmLpMrWv/0a1PFc/MPHVxarAf+P4vKuP9GgZIN/xFhpygjD14qXE5EUPXLFHitZo6AE4p
DhXuG1sr3+rAQ0TzIAWLlyI9I/OIodFHUJKDY3HCvCyHYP8k4xNqj9xWyp9USsjwgVj6nl
htMY5AbP8l/uJhYXEgvZxYN9CCKkdb2mB6c1++XrVh2plPM7nFKEAtv316FRRKFRZN3eqq
e0JQZl9wnfiVjA5ecYKYFVbmscFiZ+hEAR7odLf9BfhdCnKsLucbeZ0AR+SvJ9QVhs+EWa
jvEpw/ihHQDSPabjduHOtAzY61L63wut42J6KCCXacW93itrlDJ1CHhDO8e7Ilo+t7G4Ck
rtMk7/r9aaxZ6tY5TDywFjXewcAqw1aZo0OnNuW+oqVrenUNCQiYLt/Y4cfrvCTQP+i0bs
WZIKJ9GXpmDcrszVShAAABAB6zwyso3FkNbibOX/qIHYMJd0qrBgVZ2RJPjLkrI+7KNRme
Uxgr+/hheFt13wlHTFxLWGSsNwPuRNCmosgC1XKhygsryBo9UcNTekwGHzaJFk3Jyxw3kl
htOpW3z87Dq59G5y7jt0DeX755HFh28HvgqCDj2b4fPGEDAzcjDz20MxOFzGyZQWSKIy+u
4kw0DJx5c84XCChOYn09syX+0dQE30lid3aDjG5+dqgFityj+cvNB/9AiA/QfHbIBAVRR1
U6uZIbFyujcYV9HtmA7ZKE+WyCGmdJUd8+0mpcGsAyKTR0EqqGnQKqf33ymJmf3gPkAm04
oiIVE/24tJUAC24AAAEBAOO3m2BrCAZHoW3zYbkYRHsExrbPKNgwG1DE8Dlh1e9/vw3Tqt
Cktvxrpga1xI1iLvyrFkYmTYD95LOdJtdoj2b8DPUJchYhf6+qu4iBEDhlRY0XHpjERuQI
nJXKT3vuObn8JPpiOCx0YREBq/mXkU0R7G6HFQVXd60hgC71haSjXZL/vHrJ1pBq+Dca/X
oooU3cKEkVMeNB2/fKLAQqQLbBxcc+wbvmedMyzrgq0StSJ79pEhCO/OE/nvnNzU/FlkVn
1tx83bsb1hL51wq0g6mUzHMOg6SXCotH4QCEAI0t1Dd/JhtJJCJzMB8KRMTsuvMeXFeYKy
YbMur0dd2Yzm8AAAEBANYoTmEbr6vrwS9iCaoS0FTZBY15qnA3WsSfeVC7inWQkXHijaFH
JW9w1Tqjcxk80gu9cXnxYdaaY3Zju0gY+zeaHipxcWjIsxMvXuzzkVbyKVE3UVtZjfORE5
fbMPuBuLrrt/efsIzfBkFnuMgSGQld8hgvj3bzyCt8TPzdT7H8dYHEbayXL3+CQar29i2E
+xqSEWH3n5Fxu/meW8xxmuWRjODblZ1zrI2vmg2rcr4IeGfQcZCzNnuVpSxiuzbkgOi8+5
SiFJQOUGJywXoxLsVP9ERqHHctUM8709l1yj5dAlcbBm1kQcL4ROHuUW6dClDb1oq/7h83
lPX5us1SaJEAAAAAAQID
NhAAAAAwEAAQAAAgEAr2pW4awQce0BepReDs4fLO/q+fezoCSIPYrIqHGEFYlnVBzEIGyH
zd4ZgQYmZmbbRhyHMR67Pa75FPrtyT/hYUCa+8XUNpQjP1K39WMOrxZTCwOE669I7TV3Xs
SsZ6x4d+2skkiK+rmditnwjvOuuIsm113RzJkwb5NHTklTFLE0Cs36oAVOXa0kRyFX0Yyg
WSvMpNITF2ZbaCNcEyMQNhkrN1VuTLK58y4YuN1h7fHMmsb6IEhyK5LTm2gVGjNzizOI9P
Winbbz2woeV38QVJ2+51v5KMpJFdI0DunnFaBLzuCFmRAhns0jOLO0NibpCLoAe2HlmUU3
1I5TtTQCNZxdw1CYC2tliKlzjaT8p43nyFYkaVTrIVihaIeHJVuDEKYnvcBjR63B1jLyCi
msdNwZVuIiCdG1+lsvvLZ84q8Iye0WPTizRfWglZ4eqFY+V2q1KNEAjErxIHG0dP3fWgHN
35WU9LfZ+3inGDaj7/QkC1Wwtga/uycaxahV6Fch/+C5zlOdrqL5cIzIFHclpt7lJW5tzx
26nPmSI/azvKjlwKWCpTp1VDt4motvzlPS5Mwquvg3/eNX42YVa6NZM6f+oL5bQQ6ZvaX2
DLginkMvNH/qbCl667XX7A+dlnEOPJlC1FiJmWfDRHMNLrexeopTM7y2nqmOL9RG1NNflF
sAAAc48VezOfFXszkAAAAHc3NoLXJzYQAAAgEAr2pW4awQce0BepReDs4fLO/q+fezoCSI
PYrIqHGEFYlnVBzEIGyHzd4ZgQYmZmbbRhyHMR67Pa75FPrtyT/hYUCa+8XUNpQjP1K39W
MOrxZTCwOE669I7TV3XsSsZ6x4d+2skkiK+rmditnwjvOuuIsm113RzJkwb5NHTklTFLE0
Cs36oAVOXa0kRyFX0YygWSvMpNITF2ZbaCNcEyMQNhkrN1VuTLK58y4YuN1h7fHMmsb6IE
hyK5LTm2gVGjNzizOI9PWinbbz2woeV38QVJ2+51v5KMpJFdI0DunnFaBLzuCFmRAhns0j
OLO0NibpCLoAe2HlmUU31I5TtTQCNZxdw1CYC2tliKlzjaT8p43nyFYkaVTrIVihaIeHJV
uDEKYnvcBjR63B1jLyCimsdNwZVuIiCdG1+lsvvLZ84q8Iye0WPTizRfWglZ4eqFY+V2q1
KNEAjErxIHG0dP3fWgHN35WU9LfZ+3inGDaj7/QkC1Wwtga/uycaxahV6Fch/+C5zlOdrq
L5cIzIFHclpt7lJW5tzx26nPmSI/azvKjlwKWCpTp1VDt4motvzlPS5Mwquvg3/eNX42YV
a6NZM6f+oL5bQQ6ZvaX2DLginkMvNH/qbCl667XX7A+dlnEOPJlC1FiJmWfDRHMNLrexeo
pTM7y2nqmOL9RG1NNflFsAAAADAQABAAACAGO809+GpOcR+ihHWd+TJTi4xWMRiwmAHBLZ
6VOVD6PrN1wk6wMAkorkQJ4S8ByDWSPZLqkoLxBYf3mFX1RxROW2BSkoh4vs2Mm1b7FPfF
bjG56Ehrw3MwDkyJWSv/BGqUyPT/Lw2kzK4x/C4Tt2pJ57SD9mMdbiNx8Jn56MpHd8dfm6
ukjoG3G584maFMOp8LYi6D3C0GYapdhlWoHrCtmnn+HbalajvITfbeEWxwqy1EIg5rEaYA
gUeMrA+FaocIbya2nUjHyePLMLYssfDRr/gj8sFVQzCDEnDsB4EBNEzDW5hVzNRkBzpRYl
X072+sMidwmwVQq7x43Myx2Zj7MYgwm9dELgjhY4t9zAm2C6Y+rV0yNBRWJS9IoTfsU9Qw
rguksJHYm8bOMYF4v5wgyRkSnRgZ1zOrGiLclH3Duwo+AFgnCs11lTfCZ0wG5PohLGQ7ve
4NJrEySYkFF+6iDsjB3gdasC5oxlQzOeh0TyYYEU3lYp5BDlgn3Uxm3KZnmgRSbv1Vwn9T
kDx/qy2cSvj2ptpFzr1FlDzkYrsRhrgqBF46nR07rA3btsNKoXhW8H1JvECwlnPx2oQNc7
etWMZ8gNwYEmEkOLPFMSCwrqpxoqYOOtXXFJMQTVIITKC7e7pkEwNPe1klpqMpk2lBEa4q
jrGvbLbltqWUBpCngRAAABAD+OxHz+6C+ei7lgqNFkEKfcRhQszd8HMp+F7sDUQDGJN/y/
x7WLCGMbncOo7RKgGD9j+qkxUrVDCnodOGEzpnPexMCYHWtyJdX1zaMufqB2jN9Ger2uz8
kPjRp67fCj0BOqHmJt9lyzflXXs4PCSf8/ZCqQFXsH1XeVTxZQPUXGSeQNXe2Mnmhg1jEA
EZrh8+V/6HPMXSs3AtebeAl2NvNC8ULKH+BOnee1wb9qaCwZeLK6IAL53LM2udcZrJ6Jvh
YBG4X8GnAXsBGODHVZHswggIAutccpLVV0iY6t11SmsUdjDo5mfLWp6lagmhepfzd9SHU3
CeLd3GBdyCE/GoQAAAEBAN8lcsudXtOSWGPE78zc1O8wsuREMrhaDeGrbIti9QLSjGwNGI
ej0JYCM9oYc+IY+tX2u/1sY6TQOMa6YRZ+EOAcwk4FrlykpzjS5PFCp7AQFlH5y0ikYAzM
LfW30N2f9auozJYVNUZIPmmX/qbTv2hdQrbBkOmLjlPM3kt81gyyFpPmF7CmRCfAUVGQyk
Ye6UPIjBuXuALGEfFMoc2NJUK0icBMIYUVFczLvRm36yjGPRfgjDNx/Ib+dD4gQYjVC74m
E0Ev6AthGWneoCyfYjp5jPqsNCjoLMDjetJ5+GQFXxWuLqWJAH4UdOBJu8MpBNWDJl8Szh
+BU/lVB2qa9jkAAAEBAMk94KhHFn8nnBX2P2smbfDCmnVU6HYolbZaIt6PUOBGjSVa8bQa
bRjX79zFlLRJw+hSIvNqWnDM6HOk3kacrviQh4hnak8OKJuHQ+pjfnJkLoD7YUCFjJ+3Xy
E/VCEMEQ8+yTkdW6weguson372MRIOXCO+aIrbDQpaBS8T4CBndgBPPHPEVkDth9eSgew9
ZTaPeURx5J9hk9v7tcvqPKep8aXyX0JjNvJbk4B9B4C1e9D7UuFVcVkaZRwHHNeUnc8x0A
PhiUHaXbI1tIp7OWln6eqjZOWBF5qlPmt39IORToR7EG4BRyz7Vjki4OqlI0B57h9LcEJY
mkE8S98svzMAAAAAAQID
-----END OPENSSH PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOnT/3MUELJmzkEWpcIk3mLUNNqfM8YelR6jYs/wWZD3 eddsa-key-20241118
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDlG3DfOiDggnpz9fbC7Q+6e7jOiHX3Xv5AYxeSuFc4/gAAAJg95O0uPeTt
LgAAAAtzc2gtZWQyNTUxOQAAACDlG3DfOiDggnpz9fbC7Q+6e7jOiHX3Xv5AYxeSuFc4/g
AAAEAei2GY/cf5G6F8B8GSqfzP2NdOqXQYTpnLTt1M+vZZfuUbcN86IOCCenP19sLtD7p7
uM6Idfde/kBjF5K4Vzj+AAAADjI1NDk2QLuou/CkzlBDAQIDBAUGBw==
-----END OPENSSH PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOUbcN86IOCCenP19sLtD7p7uM6Idfde/kBjF5K4Vzj+ 25496@
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCii2BMtwqNKA8tLb5FPdkSWGS0vULAjIz/7cioSrTR+X+tEcFPyi2SVXct3sM5HnQdVlKhXS72qzRY53FyMQmUkAIMKWbFmYWvQFD8TbJXnHO4xmPcyP58vbqNOYze55EdnS1Tm5tIW8g0gXIMYbvQXtWCSkEDzOy+KKd4xJS3WIg+L/p94vqHtAAVSTol1Amk9Oz01vb4MBD2UxLbrXhzEteR9QhcDg28cx9kZ1R2rWYEkgBZng88nqdpRy7SVViO5UQA4ThSgfGvpiVbjLIAX8jVhcEWlwcbs/R6C+Cd5M+WLlbO6bRcOw4+K+qvrPYTmTufPIZdRo/kyNF8MNUv rsa-key-20241118
34 changes: 12 additions & 22 deletions crates/bitwarden-ssh/src/export.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,9 @@
use pkcs8::EncodePrivateKey;
use rsa::RsaPrivateKey;
use ssh_key::{PrivateKey, private::RsaKeypair};
use ssh_key::PrivateKey;

use crate::error::SshKeyExportError;

/// Convert RSA keypair to PKCS#8 DER format
// There is a known defect in going RsaPrivateKey -> pkcs8::PrivateKey
// https://github.com/RustCrypto/SSH/pull/218
fn convert_rsa_keypair(keypair: &RsaKeypair) -> Result<RsaPrivateKey, ssh_key::Error> {
Ok(rsa::RsaPrivateKey::from_components(
rsa::BigUint::try_from(&keypair.public.n)?,
rsa::BigUint::try_from(&keypair.public.e)?,
rsa::BigUint::try_from(&keypair.private.d)?,
vec![
rsa::BigUint::try_from(&keypair.private.p)?,
rsa::BigUint::try_from(&keypair.private.q)?,
],
)?)
}

/// Convert an OpenSSH private key to PKCS#8 DER format
///
/// This is primarily used for exporting SSH keys to other credential managers using Credential
Expand All @@ -40,12 +25,17 @@ pub fn export_pkcs8_der_key(private_key: &str) -> Result<Vec<u8>, SshKeyExportEr
.as_bytes()
.to_vec())
}
ssh_key::private::KeypairData::Rsa(keypair) => Ok(convert_rsa_keypair(keypair)
.map_err(|_| SshKeyExportError::KeyConversion)?
.to_pkcs8_der()
.map_err(|_| SshKeyExportError::KeyConversion)?
.as_bytes()
.to_vec()),
ssh_key::private::KeypairData::Rsa(keypair) => {
let rk: RsaPrivateKey = keypair
.try_into()
.map_err(|_| SshKeyExportError::KeyConversion)?;

Ok(rk
.to_pkcs8_der()
.map_err(|_| SshKeyExportError::KeyConversion)?
.as_bytes()
.to_vec())
}
_ => Err(SshKeyExportError::KeyConversion),
}
}
Expand Down
9 changes: 5 additions & 4 deletions crates/bitwarden-ssh/src/generator.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use bitwarden_vault::SshKeyView;
use rand::CryptoRng;
use serde::{Deserialize, Serialize};
use ssh_key::{Algorithm, rand_core::CryptoRngCore};
use ssh_key::Algorithm;
#[cfg(feature = "wasm")]
use tsify::Tsify;

Expand All @@ -26,13 +27,13 @@ pub enum KeyAlgorithm {
pub fn generate_sshkey(
key_algorithm: KeyAlgorithm,
) -> Result<SshKeyView, error::KeyGenerationError> {
let rng = rand::thread_rng();
let rng = rand::rng();
generate_sshkey_internal(key_algorithm, rng)
}

fn generate_sshkey_internal(
key_algorithm: KeyAlgorithm,
mut rng: impl CryptoRngCore,
mut rng: impl CryptoRng,
) -> Result<SshKeyView, error::KeyGenerationError> {
let private_key = match key_algorithm {
KeyAlgorithm::Ed25519 => ssh_key::PrivateKey::random(&mut rng, Algorithm::Ed25519)
Expand All @@ -45,7 +46,7 @@ fn generate_sshkey_internal(
}

fn create_rsa_key(
mut rng: impl CryptoRngCore,
mut rng: impl CryptoRng,
bits: usize,
) -> Result<ssh_key::PrivateKey, error::KeyGenerationError> {
let rsa_keypair = ssh_key::private::RsaKeypair::random(&mut rng, bits)
Expand Down
Loading
Loading