Skip to content

Commit 59f40d4

Browse files
authored
[BEEEP] Update bitwarden-ssh RustCrypto dependencies, fixing imports of various SSH keys (#536)
## 🎟️ Tracking https://bitwarden.atlassian.net/browse/PM-27518 Fixes: bitwarden/clients#17028 bitwarden/clients#14076 ## 📔 Objective Updates the `bitwarden-ssh` dependencies to `rc` releases from RustCrypto. This allows us to: - Drop our PKCS5 patch crate - Fix import of putty keys - Fix import of various other broken keys (linewidth issues and others) It also replaces the RSA crate that has a vulnerability (timing attack) - though, it is unlikely that this actually affects import / was abusable. RSA key generation test vectors are broken because the underlying RSA generation algorithm changed with rustcrypto's massive re-implementation of RSA, hence new test keys are provided. Note: This pins the dependencies to be different from the workspace crates, as those are not yet ready to be updated. Eventually we will update those bit-by-bit too and then drop the dependency pinning. ## ⏰ Reminders before review - Contributor guidelines followed - All formatters and local linters executed and passed - Written new unit and / or integration tests where applicable - Protected functional changes with optionality (feature flags) - Used internationalization (i18n) for all UI strings - CI builds passed - Communicated to DevOps any deployment requirements - Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team ## 🦮 Reviewer guidelines <!-- Suggested interactions but feel free to use (or not) as you desire! --> - 👍 (`:+1:`) or similar for great changes - 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info - ❓ (`:question:`) for questions - 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion - 🎨 (`:art:`) for suggestions / improvements - ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or concerns needing attention - 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or indications of technical debt - ⛏ (`:pick:`) for minor or nitpick changes
1 parent 0107af7 commit 59f40d4

File tree

13 files changed

+620
-271
lines changed

13 files changed

+620
-271
lines changed

Cargo.lock

Lines changed: 464 additions & 122 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,7 @@ wasm-bindgen-test = "0.3.55"
9595
wiremock = ">=0.6.0, <0.7"
9696
zxcvbn = ">=3.0.1, <4.0"
9797

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

104100
uniffi = { git = "https://github.com/mozilla/uniffi-rs", rev = "6d46b3f756dde3213357c477d86771a0fc5da7b4" }
105101
uniffi_core = { git = "https://github.com/mozilla/uniffi-rs", rev = "6d46b3f756dde3213357c477d86771a0fc5da7b4" }

crates/bitwarden-ssh/Cargo.toml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,26 @@ keywords.workspace = true
1919
wasm = [
2020
"bitwarden-error/wasm",
2121
"dep:tsify",
22-
"dep:wasm-bindgen"
22+
"dep:wasm-bindgen",
23+
"getrandom/wasm_js"
2324
] # WASM support
2425
uniffi = ["dep:uniffi"] # Uniffi bindings
2526

2627
[dependencies]
2728
bitwarden-error = { workspace = true }
2829
bitwarden-vault = { workspace = true }
29-
ed25519 = { version = ">=2.2.3, <3.0", features = ["pkcs8"] }
30-
ed25519-dalek = { workspace = true, features = ["pkcs8"] }
31-
pem-rfc7468 = "0.7.0"
32-
pkcs8 = { version = ">=0.10.2, <0.11", features = ["encryption"] }
33-
rand = ">=0.8.5, <0.9"
34-
rsa = ">=0.9.2, <0.10"
30+
block-padding = { version = "=0.4.1" }
31+
ed25519 = { version = "3.0.0-rc.2", features = ["pkcs8"] }
32+
ed25519-dalek = { version = "=3.0.0-pre.2", features = ["alloc", "pkcs8"] }
33+
getrandom = { version = "=0.3.3" }
34+
pem-rfc7468 = "1.0.0-rc.3"
35+
pkcs8 = { version = "=0.11.0-rc.8", features = ["encryption"] }
36+
rand = "0.10.0-rc.5"
37+
rand_core = "0.10.0-rc.2"
38+
rsa = "0.10.0-rc.10"
3539
serde.workspace = true
36-
ssh-key = { version = ">=0.6.7, <0.7", features = [
40+
ssh-cipher = "0.3.0-rc.4"
41+
ssh-key = { version = "0.7.0-rc.4", features = [
3742
"ed25519",
3843
"encryption",
3944
"rsa",
@@ -44,7 +49,7 @@ uniffi = { workspace = true, optional = true }
4449
wasm-bindgen = { workspace = true, optional = true }
4550

4651
[dev-dependencies]
47-
rand_chacha = "0.3.1"
52+
rand_chacha = "0.10.0-rc.1"
4853

4954
[lints]
5055
workspace = true
Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
-----BEGIN OPENSSH PRIVATE KEY-----
22
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
3-
NhAAAAAwEAAQAAAYEAtdNHSX2k5hYFbB4co3CTzdD76Zk18BPuU8Z1xo4cLcXK/DVvDMSJ
4-
SG635FnUIIsDY4g6cua9f6X55nx3KgM1NaMBMEy/XApKpS1ap2UEzqoOl+g0pjTt5JeTLl
5-
8HMgKCmlu5aAK/qi/kYdCwNQ2T7lyn+X0v2oUn0/nJUMsnDN+UQr9ZRA4606tduTcqGwpK
6-
NDk60HgAVOjaNbWcsPavabMsZpFyJc4PeDHmWqZpy6/vdbePDLa6cc+Ktc4NepZeRrEJdB
7-
Xfo6Z+FGs+YYU0jWfi7Pfk/MPYFIFQP2GG0c/w6IIVkLdDr+euvM27yk9x0RDGe9YTcg37
8-
Xy8Gy5Bn4J0lRB3IGEirvcMGQeqNLMvoGxT7F15Eu3VTZKuRhrp8vDYpcOEgs8hkSEoV1F
9-
lYIa+3MwCQ8wJYTB15l+WhCEAAwk0SAL8G7v4D45GdmxtCKaCRK0UHYMJKFk8xFP9nmmZj
10-
Occ+MillCzCh1z4Jj3MdDNriza5AiY/EKXq06xn7AAAFeDdirUw3Yq1MAAAAB3NzaC1yc2
11-
EAAAGBALXTR0l9pOYWBWweHKNwk83Q++mZNfAT7lPGdcaOHC3Fyvw1bwzEiUhut+RZ1CCL
12-
A2OIOnLmvX+l+eZ8dyoDNTWjATBMv1wKSqUtWqdlBM6qDpfoNKY07eSXky5fBzICgppbuW
13-
gCv6ov5GHQsDUNk+5cp/l9L9qFJ9P5yVDLJwzflEK/WUQOOtOrXbk3KhsKSjQ5OtB4AFTo
14-
2jW1nLD2r2mzLGaRciXOD3gx5lqmacuv73W3jwy2unHPirXODXqWXkaxCXQV36OmfhRrPm
15-
GFNI1n4uz35PzD2BSBUD9hhtHP8OiCFZC3Q6/nrrzNu8pPcdEQxnvWE3IN+18vBsuQZ+Cd
16-
JUQdyBhIq73DBkHqjSzL6BsU+xdeRLt1U2SrkYa6fLw2KXDhILPIZEhKFdRZWCGvtzMAkP
17-
MCWEwdeZfloQhAAMJNEgC/Bu7+A+ORnZsbQimgkStFB2DCShZPMRT/Z5pmYznHPjIpZQsw
18-
odc+CY9zHQza4s2uQImPxCl6tOsZ+wAAAAMBAAEAAAGBAIeywd5ALiQlxTA2nOsBpt2RHa
19-
DuXknpphHR6K4h+zfSCTcHbfSabVaogweiXuVWulW7ItwEBuNQbNwuggTR1hFMsSNp89ru
20-
N11lJuYNR3QxiKiofTqZ//19fjO6ajVRmEU5NXtBqeeKzKiPxiIiGwhnEFnrqx4sCFh0cG
21-
Gi7Gb4Kb9S7X0UHaVBnLYRTJRXrp+hIprZJG46RjiVbPbJdIqvVPDLleRPEE6E90UqM4T3
22-
rgAt2U4ExcsQuJYMzRRzSXDQ6mO3qr4JhO3D5SfqqBpD9lXjtw4KRiV4tvxpVYAwMymJcf
23-
gC4gVZfAo3MX8NsWjyFLlDxB0cW18oDf7p0tzgjNbr1d8V3bM30xI52gbZCBuRnhUrh0jn
24-
JJLQo+gRxqLUtDVXo6Y1VCsE/0FjcqrjYu1d7NrnLdG/Igrvo2bz4D3gGA8wWXTGW8vVTz
25-
gW3aj4SyI/x0DK5Agr6uigYEe4l7o2BAYHho3/YBwPBz0ZUQuIyJY0uBoY8265xkcaiQAA
26-
AMAF2fIw31jVrEmj/7xoxFLt78ATFh7n/hpCpczO6dGPEQPkd0LjsQars/6uws5AHaBpVQ
27-
3hfrBwidlwkWgwMCx0Tz9T8Q2mzUwoaaWZZ8QxhqglFzkCxWeQOegjTxciecD/JQ4JFfaO
28-
Ew6yz7xvf8KPJrOINeqgWKL+CR7qhVfntWf5uDO8yTGStfk3rFMvkRv8+QGpZJ24g/hOsd
29-
TKDUgNZX1YGT+TxnxxCRjilMzWcWZOHWIKaXjDcSs0xxPPLQIAAADBANG/vxPbYPx85+Ih
30-
puHn5Kbe5Nav4dojCoABqEwEY3IgTuxPOeMKvLVK67mYTTB85DicIsoTLpkHSFfl0l5cgN
31-
pk1Xv3jwq8zMfK/x3Pnpoy55H9iUordZ+ihHyaN5XBUEloc1oIQc0p/g5vVOMl+magd94M
32-
/g6hQ9SxexNvyBaIJeSRLZH7VEPq/FvMfPgOkO1dE0G3fmSNKirYyym0JlfHt069A3nWJC
33-
ubwEZiOQyvPYQgf/Kp8jHgekhLOPHefwAAAMEA3es/2izSNcWTX7LTsheWsNQo+E5RywUQ
34-
g4UyS4NbdrpJjuOCEevjzXtwqupLVpCLdOthLc9H5C1m9yBaR2y5T+hBAPildGKjfeCWqt
35-
wuIsiS+W9+HkZty8Rq3+V56CaFw2/NftTt9xBnfaT1DMJad9l6wTOlsDOKV3qhKzI6SHGt
36-
L2ScS9dRGcY6Xf3hIs+c5vXQRYpzG/zS0URAMzkpVyHsESe/dYwIswpmRC4Mq3DbI2jFlZ
37-
92BGVXBMaMQH6FAAAAAAEC
3+
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
37+
Ok0DjGumEWfhSHAAAAAAEC
3838
-----END OPENSSH PRIVATE KEY-----
Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,49 @@
11
-----BEGIN OPENSSH PRIVATE KEY-----
22
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
3-
NhAAAAAwEAAQAAAgEAvn9WSzMTT3mYdvUp8fp+2fkH/ozjMcxQGT78pcCQQ3lienR7m5uh
4-
OiD/9av3F44YPpSKykMnIfmLU1pZigKQdZvNPAbtC0eg9qcZxmrzRzaDwVq6AkaHcIj+QO
5-
9lhNkcMOn2IEU52a11NeX2xZIfVF3zAHNxstLoO8U9j1HBNwAYdZJ2nDim0ayAXf9mZWgK
6-
g3IL+EJSoFrzftDc6BEQ0psdESVB+z2SFt8joo1wTcFQi3OzORgGNW/ME/BJQvTt4j7Upi
7-
+ebrlTwYm43War+hrWIdfL4lxtmnVHYHFO0zELdOmPsN2+AzEYJ6vEkukcpql17L/c6HcR
8-
VogGDezvPoygoFbNefnUdCWbBZOb5LtCbhWZmutbwH5YiYCCWuZ39dlqO+9ip6xrAK+7ox
9-
JMSBzG7kLgF2uVt/w/XOhjDyiKzgCS8zBK868/LdAJtqAhARY8x6e9DDu3ghWFDI8e0iEK
10-
kwBAZMGLJhT4lSTgiKwizcIQsx5aZ54RznGdGhTNkrwL7mWg7USW1gDmSHHNy7rgKxNhbu
11-
ycOAKICCllTESZtmYocRkcJOW8vW3p0zmjdjIYLg/3q7JcscbDg+JDgSYvCIFqrm0tiurG
12-
RjlHCk4JUcExUA42W5QZox0nybw3zD/xjm8IstiC1sg6UXj4e49jxlEs0463WKOkr5n4BN
13-
8AAAc455bHt+eWx7cAAAAHc3NoLXJzYQAAAgEAvn9WSzMTT3mYdvUp8fp+2fkH/ozjMcxQ
14-
GT78pcCQQ3lienR7m5uhOiD/9av3F44YPpSKykMnIfmLU1pZigKQdZvNPAbtC0eg9qcZxm
15-
rzRzaDwVq6AkaHcIj+QO9lhNkcMOn2IEU52a11NeX2xZIfVF3zAHNxstLoO8U9j1HBNwAY
16-
dZJ2nDim0ayAXf9mZWgKg3IL+EJSoFrzftDc6BEQ0psdESVB+z2SFt8joo1wTcFQi3OzOR
17-
gGNW/ME/BJQvTt4j7Upi+ebrlTwYm43War+hrWIdfL4lxtmnVHYHFO0zELdOmPsN2+AzEY
18-
J6vEkukcpql17L/c6HcRVogGDezvPoygoFbNefnUdCWbBZOb5LtCbhWZmutbwH5YiYCCWu
19-
Z39dlqO+9ip6xrAK+7oxJMSBzG7kLgF2uVt/w/XOhjDyiKzgCS8zBK868/LdAJtqAhARY8
20-
x6e9DDu3ghWFDI8e0iEKkwBAZMGLJhT4lSTgiKwizcIQsx5aZ54RznGdGhTNkrwL7mWg7U
21-
SW1gDmSHHNy7rgKxNhbuycOAKICCllTESZtmYocRkcJOW8vW3p0zmjdjIYLg/3q7JcscbD
22-
g+JDgSYvCIFqrm0tiurGRjlHCk4JUcExUA42W5QZox0nybw3zD/xjm8IstiC1sg6UXj4e4
23-
9jxlEs0463WKOkr5n4BN8AAAADAQABAAACAHisG1L5oNLoeP9qIE8L2k1j5n+GaelCvr6v
24-
WsX47KoBe7OMlDynYoN7IglTDOxb89m4qQ6laWWpOWvswOme5DnMHz9WN9S8ZCe7BKXfXA
25-
qRavcR7ODCIsvTzBQAUnPMQIJvwp0AnTvaGHSzHxZakQQVm3h+qNiZp8ktEej25glcQyI/
26-
TGl7rZkGyC5DOm8kb/yCQzjZcpPn6XU9A6LyJJD0933D9z8a6q8YXO9831YyDj64ZSDWqi
27-
AxmLpMrWv/0a1PFc/MPHVxarAf+P4vKuP9GgZIN/xFhpygjD14qXE5EUPXLFHitZo6AE4p
28-
DhXuG1sr3+rAQ0TzIAWLlyI9I/OIodFHUJKDY3HCvCyHYP8k4xNqj9xWyp9USsjwgVj6nl
29-
htMY5AbP8l/uJhYXEgvZxYN9CCKkdb2mB6c1++XrVh2plPM7nFKEAtv316FRRKFRZN3eqq
30-
e0JQZl9wnfiVjA5ecYKYFVbmscFiZ+hEAR7odLf9BfhdCnKsLucbeZ0AR+SvJ9QVhs+EWa
31-
jvEpw/ihHQDSPabjduHOtAzY61L63wut42J6KCCXacW93itrlDJ1CHhDO8e7Ilo+t7G4Ck
32-
rtMk7/r9aaxZ6tY5TDywFjXewcAqw1aZo0OnNuW+oqVrenUNCQiYLt/Y4cfrvCTQP+i0bs
33-
WZIKJ9GXpmDcrszVShAAABAB6zwyso3FkNbibOX/qIHYMJd0qrBgVZ2RJPjLkrI+7KNRme
34-
Uxgr+/hheFt13wlHTFxLWGSsNwPuRNCmosgC1XKhygsryBo9UcNTekwGHzaJFk3Jyxw3kl
35-
htOpW3z87Dq59G5y7jt0DeX755HFh28HvgqCDj2b4fPGEDAzcjDz20MxOFzGyZQWSKIy+u
36-
4kw0DJx5c84XCChOYn09syX+0dQE30lid3aDjG5+dqgFityj+cvNB/9AiA/QfHbIBAVRR1
37-
U6uZIbFyujcYV9HtmA7ZKE+WyCGmdJUd8+0mpcGsAyKTR0EqqGnQKqf33ymJmf3gPkAm04
38-
oiIVE/24tJUAC24AAAEBAOO3m2BrCAZHoW3zYbkYRHsExrbPKNgwG1DE8Dlh1e9/vw3Tqt
39-
Cktvxrpga1xI1iLvyrFkYmTYD95LOdJtdoj2b8DPUJchYhf6+qu4iBEDhlRY0XHpjERuQI
40-
nJXKT3vuObn8JPpiOCx0YREBq/mXkU0R7G6HFQVXd60hgC71haSjXZL/vHrJ1pBq+Dca/X
41-
oooU3cKEkVMeNB2/fKLAQqQLbBxcc+wbvmedMyzrgq0StSJ79pEhCO/OE/nvnNzU/FlkVn
42-
1tx83bsb1hL51wq0g6mUzHMOg6SXCotH4QCEAI0t1Dd/JhtJJCJzMB8KRMTsuvMeXFeYKy
43-
YbMur0dd2Yzm8AAAEBANYoTmEbr6vrwS9iCaoS0FTZBY15qnA3WsSfeVC7inWQkXHijaFH
44-
JW9w1Tqjcxk80gu9cXnxYdaaY3Zju0gY+zeaHipxcWjIsxMvXuzzkVbyKVE3UVtZjfORE5
45-
fbMPuBuLrrt/efsIzfBkFnuMgSGQld8hgvj3bzyCt8TPzdT7H8dYHEbayXL3+CQar29i2E
46-
+xqSEWH3n5Fxu/meW8xxmuWRjODblZ1zrI2vmg2rcr4IeGfQcZCzNnuVpSxiuzbkgOi8+5
47-
SiFJQOUGJywXoxLsVP9ERqHHctUM8709l1yj5dAlcbBm1kQcL4ROHuUW6dClDb1oq/7h83
48-
lPX5us1SaJEAAAAAAQID
3+
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
48+
mkE8S98svzMAAAAAAQID
4949
-----END OPENSSH PRIVATE KEY-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOnT/3MUELJmzkEWpcIk3mLUNNqfM8YelR6jYs/wWZD3 eddsa-key-20241118
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
3+
QyNTUxOQAAACDlG3DfOiDggnpz9fbC7Q+6e7jOiHX3Xv5AYxeSuFc4/gAAAJg95O0uPeTt
4+
LgAAAAtzc2gtZWQyNTUxOQAAACDlG3DfOiDggnpz9fbC7Q+6e7jOiHX3Xv5AYxeSuFc4/g
5+
AAAEAei2GY/cf5G6F8B8GSqfzP2NdOqXQYTpnLTt1M+vZZfuUbcN86IOCCenP19sLtD7p7
6+
uM6Idfde/kBjF5K4Vzj+AAAADjI1NDk2QLuou/CkzlBDAQIDBAUGBw==
7+
-----END OPENSSH PRIVATE KEY-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOUbcN86IOCCenP19sLtD7p7uM6Idfde/kBjF5K4Vzj+ 25496@
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCii2BMtwqNKA8tLb5FPdkSWGS0vULAjIz/7cioSrTR+X+tEcFPyi2SVXct3sM5HnQdVlKhXS72qzRY53FyMQmUkAIMKWbFmYWvQFD8TbJXnHO4xmPcyP58vbqNOYze55EdnS1Tm5tIW8g0gXIMYbvQXtWCSkEDzOy+KKd4xJS3WIg+L/p94vqHtAAVSTol1Amk9Oz01vb4MBD2UxLbrXhzEteR9QhcDg28cx9kZ1R2rWYEkgBZng88nqdpRy7SVViO5UQA4ThSgfGvpiVbjLIAX8jVhcEWlwcbs/R6C+Cd5M+WLlbO6bRcOw4+K+qvrPYTmTufPIZdRo/kyNF8MNUv rsa-key-20241118

crates/bitwarden-ssh/src/export.rs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,9 @@
11
use pkcs8::EncodePrivateKey;
22
use rsa::RsaPrivateKey;
3-
use ssh_key::{PrivateKey, private::RsaKeypair};
3+
use ssh_key::PrivateKey;
44

55
use crate::error::SshKeyExportError;
66

7-
/// Convert RSA keypair to PKCS#8 DER format
8-
// There is a known defect in going RsaPrivateKey -> pkcs8::PrivateKey
9-
// https://github.com/RustCrypto/SSH/pull/218
10-
fn convert_rsa_keypair(keypair: &RsaKeypair) -> Result<RsaPrivateKey, ssh_key::Error> {
11-
Ok(rsa::RsaPrivateKey::from_components(
12-
rsa::BigUint::try_from(&keypair.public.n)?,
13-
rsa::BigUint::try_from(&keypair.public.e)?,
14-
rsa::BigUint::try_from(&keypair.private.d)?,
15-
vec![
16-
rsa::BigUint::try_from(&keypair.private.p)?,
17-
rsa::BigUint::try_from(&keypair.private.q)?,
18-
],
19-
)?)
20-
}
21-
227
/// Convert an OpenSSH private key to PKCS#8 DER format
238
///
249
/// This is primarily used for exporting SSH keys to other credential managers using Credential
@@ -40,12 +25,17 @@ pub fn export_pkcs8_der_key(private_key: &str) -> Result<Vec<u8>, SshKeyExportEr
4025
.as_bytes()
4126
.to_vec())
4227
}
43-
ssh_key::private::KeypairData::Rsa(keypair) => Ok(convert_rsa_keypair(keypair)
44-
.map_err(|_| SshKeyExportError::KeyConversion)?
45-
.to_pkcs8_der()
46-
.map_err(|_| SshKeyExportError::KeyConversion)?
47-
.as_bytes()
48-
.to_vec()),
28+
ssh_key::private::KeypairData::Rsa(keypair) => {
29+
let rk: RsaPrivateKey = keypair
30+
.try_into()
31+
.map_err(|_| SshKeyExportError::KeyConversion)?;
32+
33+
Ok(rk
34+
.to_pkcs8_der()
35+
.map_err(|_| SshKeyExportError::KeyConversion)?
36+
.as_bytes()
37+
.to_vec())
38+
}
4939
_ => Err(SshKeyExportError::KeyConversion),
5040
}
5141
}

0 commit comments

Comments
 (0)