Skip to content

Commit 7000b5d

Browse files
authored
Merge pull request #2279 from alex/rsa-check-key
Ensure Rsa::check_key doesn't leave errors on the stack
2 parents 3e75287 + 149f662 commit 7000b5d

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

openssl/src/rsa.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,14 +234,18 @@ where
234234

235235
/// Validates RSA parameters for correctness
236236
#[corresponds(RSA_check_key)]
237-
#[allow(clippy::unnecessary_cast)]
238237
pub fn check_key(&self) -> Result<bool, ErrorStack> {
239238
unsafe {
240-
let result = ffi::RSA_check_key(self.as_ptr()) as i32;
241-
if result == -1 {
242-
Err(ErrorStack::get())
239+
let result = ffi::RSA_check_key(self.as_ptr());
240+
if result != 1 {
241+
let errors = ErrorStack::get();
242+
if errors.errors().is_empty() {
243+
Ok(false)
244+
} else {
245+
Err(errors)
246+
}
243247
} else {
244-
Ok(result == 1)
248+
Ok(true)
245249
}
246250
}
247251
}
@@ -849,4 +853,21 @@ mod test {
849853
let e = BigNum::from_u32(0x10001).unwrap();
850854
Rsa::generate_with_e(2048, &e).unwrap();
851855
}
856+
857+
#[test]
858+
fn test_check_key() {
859+
let k = Rsa::private_key_from_pem_passphrase(
860+
include_bytes!("../test/rsa-encrypted.pem"),
861+
b"mypass",
862+
)
863+
.unwrap();
864+
assert!(matches!(k.check_key(), Ok(true)));
865+
assert!(ErrorStack::get().errors().is_empty());
866+
867+
// BoringSSL simply rejects this key, because its corrupted!
868+
if let Ok(k) = Rsa::private_key_from_pem(include_bytes!("../test/corrupted-rsa.pem")) {
869+
assert!(matches!(k.check_key(), Ok(false) | Err(_)));
870+
assert!(ErrorStack::get().errors().is_empty());
871+
}
872+
}
852873
}

openssl/test/corrupted-rsa.pem

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCyiHMQLLOSG6T6
3+
AYpMTJj9f4WzXQF0+T0Ri/Mk6vcJMQdnLMrlEMIJA/4iCn32zvpQ0raYcuZZoyso
4+
/Svqg7tAeC3aQ/iFopYWfaR+SDMEnpKMl26qwiIxlPcj9J8hAQw/9WA7YneBXq+T
5+
ypONX4EeDn+bsp/mSNSZKYJBmwXevQ9xbnOOxmBrVd5OS07ZwYuQXy8uVsYe4IXX
6+
7/F+BIyULnIlUxRcVRjKp9++PeS53KLJX04H6HeqUiWC8Ntd+DuD3df0a067L38o
7+
sc+CVzwKXqvh75RwlXCR4/B3D9qEqSYmY7lxp9vA3hirWcSJn0xUIbHb7q1hzE0H
8+
rL65mLwnAgMBAAECggEADePYJpKBGBAm35KTcB3ngJWAJp/I92ZVbieNb7peJOzC
9+
btsJIBWT2xVgm2+7NCK5+Tl486xrfTQuLUlhNiTbQof3HUumKr4nCjHqmdlD1YtW
10+
yzG+7kceAkMyOoMThwL+Bn3bPP42CQPVCjJmahyGPvs8H2DK2E+jRr/4KTgxQTki
11+
s/MXmJa4+xhvfF4CmFVj8imkKCyUTFoaqvYevHDMrJ3cohXFONBPv0MT8X/Y0sgw
12+
UVaZ1aw3dbLC2PBpZFotILGxch2rODXgOcer/GBC41aGQTBB8mLPwKb6KMh0xdPd
13+
1E5NwyODA3YJ6W3fGe8WE0MIHoYlOkX+ukf4W4+U0wKBgQDhueBkZwrd1HdhqwhG
14+
QKt1/itCx24Go75G/+5vJUCB4bcdaJP49aH0/H4BiSsKI8r+GVsVJcrKP8h3tgjw
15+
hhuLLPSaWi9TiUsWeDTw0JrAJc7w6hwL1EYbnwcto5mRQdbfugitlkhh17yUmgdj
16+
gczAKLfV3igxslnR67iNOEYrlwKBgQDKejyWNnxhBJoXerpR/hijoXhMaHqV6Z7T
17+
gUy6F0BiJ5CqN+TOTaC17CEnsMmI28o1rWJ6bIKwOUPFXOE9Z5gyxuIJhY9M8n30
18+
iwm/Ug2oBTFAdZQyyCuCmPiNURnGo+Hhu1EtVwMWLt3Z0L+/DdI6pgPX8mG0NNZm
19+
+pS96Lg9owKBgHOzCslr5638kZSGTh90Vm6McTAxeLv+gjFyTYy6022/fFSenfom
20+
LXWdVhkDbgQshIfqBz23uVIhj2eM7tgaZVPZHydewpNW9B34T2qAAlIrDv99gBKw
21+
I59UzCEgkj5aOQFEId6YAVHlesvQh6kBhymXtWLyFDgk6tUmtdns1krRAoGBAJj0
22+
pnhDSMpxk4ZRLBdsgGh8PkhaVOCSz2yvrKqXjgeYI+yytKI0ekdzzcgSAOzmPGc4
23+
R8B74G4HlG6vr2eXrp4NKAxRXOOf/A6UShTBg5d99KrhJ8cE9/l8XadDsNkiTC0e
24+
OECsDqTfWrCExZUqd7neV+D2NWDQ2XaJrXuZJjVJAoGAIGA5ktXIxWIDeXkxo06b
25+
nHeTEmOAgER/5UIikHnoSAnXo5JNZyFxqoylthWuA1fMPQw/UphAeawDwEXVKp1J
26+
NEhLUfVAO/p1RBUsQi8LQVoO9Nql5u5dFjqoCnlRv5tbeAAzZH5magZk7/1rOS5T
27+
Cj7WW2zW+iL20suUmXfCQGU=
28+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)