fix(servo): gate vulnerable RSA private operations
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEowIBAAKCAQEAtsQsUV8QpqrygsY+2+JCQ6Fw8/omM71IM2N/R8pPbzbgOl0p
|
||||
78MZGsgPOQ2HSznjD0FPzsH8oO2B5Uftws04LHb2HJAYlz25+lN5cqfHAfa3fgmC
|
||||
38FfwBkn7l582UtPWZ/wcBOnyCgb3yLcvJrXyrt8QxHJgvWO23ITrUVYszImbXQ6
|
||||
7YGS0YhMrbixRzmo2tpm3JcIBtnHrEUMsT0NfFdfsZhTT8YbxBvA8FdODgEwx7u/
|
||||
vf3J9qbi4+Kv8cvqyJuleIRSjVXPsIMnoejIn04APPKIjpMyQdnWlby7rNyQtE4+
|
||||
CV+jcFjqJbE/Xilcvqxt6DirjFCvYeKYl1uHLwIDAQABAoIBAH7Mg2LA7bB0EWQh
|
||||
XiL3SrnZG6BpAHAM9jaQ5RFNjua9z7suP5YUaSpnegg/FopeUuWWjmQHudl8bg5A
|
||||
ZPgtoLdYoU8XubfUH19I4o1lUXBPVuaeeqn6Yw/HZCjAbSXkVdz8VbesK092ZD/e
|
||||
0/4V/3irsn5lrMSq0L322yfvYKaRDFxKCF7UMnWrGcHZl6Msbv/OffLRk19uYB7t
|
||||
4WGhK1zCfKIfgdLJnD0eoI6Q4wU6sJvvpyTe8NDDo8HpdAwNn3YSahSewKp9gHgg
|
||||
VIQlTZUdsHxM+R+2RUwJZYj9WSTbq+s1nKICUmjQBPnWbrPW963BE5utQPFt3mOe
|
||||
EWRzdsECgYEA3MBhJC1Okq+u5yrFE8plufdwNvm9fg5uYUYafvdlQiXsFTx+XDGm
|
||||
FXpuWhP/bheOh1jByzPZ1rvjF57xiZjkIuzcvtePTs/b5fT82K7CydDchkc8qb0W
|
||||
2dI40h+13e++sUPKYdC9aqjZHzOgl3kOlkDbyRCF3F8mNDujE49rLWcCgYEA0/MU
|
||||
dX5A6VSDb5K+JCNq8vDaBKNGU8GAr2fpYAhtk/3mXLI+/Z0JN0di9ZgeNhhJr2jN
|
||||
11OU/2pOButpsgnkIo2y36cOQPf5dQpSgXZke3iNDld3osuLIuPNJn/3C087AtOq
|
||||
+w4YxZClZLAxiLCqX8SBVrB2IiFCQ70SJ++n8vkCgYEAzmi3rBsNEA1jblVIh1PF
|
||||
wJhD/bOQ4nBd92iUV8m9jZdl4wl4YX4u/IBI9MMkIG24YIe2VOl7s9Rk5+4/jNg/
|
||||
4QQ2998Y6aljxOZJEdZ+3jQELy4m49OhrTRq2ta5t/Z3CMsJTmLe6f9NXWZpr5iK
|
||||
8iVdHOjtMXxqfYaR2jVNEtsCgYAl9uWUQiAoa037v0I1wO5YQ9IZgJGJUSDWynsg
|
||||
C4JtPs5zji4ASY+sCipsqWnH8MPKGrC8QClxMr51ONe+30yw78a5jvfbpU9Wqpmq
|
||||
vOU0xJwnlH1GeMUcY8eMfOFocjG0yOtYeubvBIDLr0/AFzz9WHp+Z69RX7m53nUR
|
||||
GDlyKQKBgDGZVAbUBiB8rerqNbONBAxfipoa4IJ+ntBrFT2DtoIZNbSzaoK+nVbH
|
||||
kbWMJycaV5PVOh1lfAiZeWCxQz5RcZh/RS8USnxyMG1j4dP/wLcbdasI8uRaSC6Y
|
||||
hFHL5HjhLrIo0HRWySS2b2ztBI2FP1M+MaaGFPHDzm2OyZg85yr3
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MIIBCgKCAQEAtsQsUV8QpqrygsY+2+JCQ6Fw8/omM71IM2N/R8pPbzbgOl0p78MZ
|
||||
GsgPOQ2HSznjD0FPzsH8oO2B5Uftws04LHb2HJAYlz25+lN5cqfHAfa3fgmC38Ff
|
||||
wBkn7l582UtPWZ/wcBOnyCgb3yLcvJrXyrt8QxHJgvWO23ITrUVYszImbXQ67YGS
|
||||
0YhMrbixRzmo2tpm3JcIBtnHrEUMsT0NfFdfsZhTT8YbxBvA8FdODgEwx7u/vf3J
|
||||
9qbi4+Kv8cvqyJuleIRSjVXPsIMnoejIn04APPKIjpMyQdnWlby7rNyQtE4+CV+j
|
||||
cFjqJbE/Xilcvqxt6DirjFCvYeKYl1uHLwIDAQAB
|
||||
-----END RSA PUBLIC KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1,51 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MIICCgKCAgEAp6dFcoEeomF+Sehb1zDd4w8QP32I7j92XlQNPdmTu7C6FAAChZ0L
|
||||
QIl0NmN/WLgo6nTfgyFjQHf5nUqi1UyjdYUu9ZdmHTcTzh7ztP1qjiICOORnZoos
|
||||
fuOGHSISrmoevd+oi2LfEPa8957/SsKY+yVj3xuHZDga+bH7DM0IXgJrCtn2choj
|
||||
UXfQOWtIdUrUp1JCJQqHO/L25+48dd1hPjZbpPMhCmzGa5Ci+j92LKaIQIe2v4Fh
|
||||
6xRIGfD1cvIfbI4nPnDUWjZbiygZznNGE8wjsBMpoXkB8XB4QDhh9UxSoFHipYx1
|
||||
wtnYAJG7mAihBsH37LQDThUFi+7HJcX5GdYuqiNLYmKNNGxgu5GecIUdqzhXHm8O
|
||||
12NBKfmU6jaP7nNz397AREXrykf6IO0VQKhgyUi6vJjaWRyh3i4uJVQO+bfLNT9g
|
||||
ITuBSkXTWe+puBHu/wjGWZO/ioXCv+qqftXmtD4YrmBEZM5flhUBNufQn4sk+tQ9
|
||||
eHARjPp7wkh1UG67wyG5d+CGGupQEoYgEh8LOUqc3QpCQRoTUMB3DZddcbAKkENi
|
||||
QMlnoMOlwgoPbed/Pyyv2pTtAUPB9uNPc+DKwnnu63xjdyOisCbIKALhpK66qIRt
|
||||
+Y55GUmHc+DU8xmVb03jqtAO+5oUfWazrBoB01ss+0jUALDnqA3JdVECAwEAAQ==
|
||||
-----END RSA PUBLIC KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2xCxRXxCmqvKC
|
||||
xj7b4kJDoXDz+iYzvUgzY39Hyk9vNuA6XSnvwxkayA85DYdLOeMPQU/Owfyg7YHl
|
||||
R+3CzTgsdvYckBiXPbn6U3lyp8cB9rd+CYLfwV/AGSfuXnzZS09Zn/BwE6fIKBvf
|
||||
Ity8mtfKu3xDEcmC9Y7bchOtRVizMiZtdDrtgZLRiEytuLFHOaja2mbclwgG2ces
|
||||
RQyxPQ18V1+xmFNPxhvEG8DwV04OATDHu7+9/cn2puLj4q/xy+rIm6V4hFKNVc+w
|
||||
gyeh6MifTgA88oiOkzJB2daVvLus3JC0Tj4JX6NwWOolsT9eKVy+rG3oOKuMUK9h
|
||||
4piXW4cvAgMBAAECggEAfsyDYsDtsHQRZCFeIvdKudkboGkAcAz2NpDlEU2O5r3P
|
||||
uy4/lhRpKmd6CD8Wil5S5ZaOZAe52XxuDkBk+C2gt1ihTxe5t9QfX0jijWVRcE9W
|
||||
5p56qfpjD8dkKMBtJeRV3PxVt6wrT3ZkP97T/hX/eKuyfmWsxKrQvfbbJ+9gppEM
|
||||
XEoIXtQydasZwdmXoyxu/8598tGTX25gHu3hYaErXMJ8oh+B0smcPR6gjpDjBTqw
|
||||
m++nJN7w0MOjwel0DA2fdhJqFJ7Aqn2AeCBUhCVNlR2wfEz5H7ZFTAlliP1ZJNur
|
||||
6zWcogJSaNAE+dZus9b3rcETm61A8W3eY54RZHN2wQKBgQDcwGEkLU6Sr67nKsUT
|
||||
ymW593A2+b1+Dm5hRhp+92VCJewVPH5cMaYVem5aE/9uF46HWMHLM9nWu+MXnvGJ
|
||||
mOQi7Ny+149Oz9vl9PzYrsLJ0NyGRzypvRbZ0jjSH7Xd776xQ8ph0L1qqNkfM6CX
|
||||
eQ6WQNvJEIXcXyY0O6MTj2stZwKBgQDT8xR1fkDpVINvkr4kI2ry8NoEo0ZTwYCv
|
||||
Z+lgCG2T/eZcsj79nQk3R2L1mB42GEmvaM3XU5T/ak4G62myCeQijbLfpw5A9/l1
|
||||
ClKBdmR7eI0OV3eiy4si480mf/cLTzsC06r7DhjFkKVksDGIsKpfxIFWsHYiIUJD
|
||||
vRIn76fy+QKBgQDOaLesGw0QDWNuVUiHU8XAmEP9s5DicF33aJRXyb2Nl2XjCXhh
|
||||
fi78gEj0wyQgbbhgh7ZU6Xuz1GTn7j+M2D/hBDb33xjpqWPE5kkR1n7eNAQvLibj
|
||||
06GtNGra1rm39ncIywlOYt7p/01dZmmvmIryJV0c6O0xfGp9hpHaNU0S2wKBgCX2
|
||||
5ZRCIChrTfu/QjXA7lhD0hmAkYlRINbKeyALgm0+znOOLgBJj6wKKmypacfww8oa
|
||||
sLxAKXEyvnU4177fTLDvxrmO99ulT1aqmaq85TTEnCeUfUZ4xRxjx4x84WhyMbTI
|
||||
61h65u8EgMuvT8AXPP1Yen5nr1FfubnedREYOXIpAoGAMZlUBtQGIHyt6uo1s40E
|
||||
DF+Kmhrggn6e0GsVPYO2ghk1tLNqgr6dVseRtYwnJxpXk9U6HWV8CJl5YLFDPlFx
|
||||
mH9FLxRKfHIwbWPh0//Atxt1qwjy5FpILpiEUcvkeOEusijQdFbJJLZvbO0EjYU/
|
||||
Uz4xpoYU8cPObY7JmDznKvc=
|
||||
-----END PRIVATE KEY-----
|
||||
Binary file not shown.
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtsQsUV8QpqrygsY+2+JC
|
||||
Q6Fw8/omM71IM2N/R8pPbzbgOl0p78MZGsgPOQ2HSznjD0FPzsH8oO2B5Uftws04
|
||||
LHb2HJAYlz25+lN5cqfHAfa3fgmC38FfwBkn7l582UtPWZ/wcBOnyCgb3yLcvJrX
|
||||
yrt8QxHJgvWO23ITrUVYszImbXQ67YGS0YhMrbixRzmo2tpm3JcIBtnHrEUMsT0N
|
||||
fFdfsZhTT8YbxBvA8FdODgEwx7u/vf3J9qbi4+Kv8cvqyJuleIRSjVXPsIMnoejI
|
||||
n04APPKIjpMyQdnWlby7rNyQtE4+CV+jcFjqJbE/Xilcvqxt6DirjFCvYeKYl1uH
|
||||
LwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Vendored
+506
@@ -0,0 +1,506 @@
|
||||
//! PKCS#1 encoding tests
|
||||
|
||||
#![cfg(feature = "encoding")]
|
||||
|
||||
use crypto_bigint::{BoxedUint, CtEq};
|
||||
use hex_literal::hex;
|
||||
use rsa::{
|
||||
pkcs1::{DecodeRsaPrivateKey, DecodeRsaPublicKey, EncodeRsaPrivateKey, EncodeRsaPublicKey},
|
||||
traits::{PrivateKeyParts, PublicKeyParts},
|
||||
RsaPrivateKey, RsaPublicKey,
|
||||
};
|
||||
|
||||
#[cfg(feature = "encoding")]
|
||||
use rsa::pkcs1::LineEnding;
|
||||
|
||||
/// RSA-2048 PKCS#1 private key encoded as ASN.1 DER.
|
||||
///
|
||||
/// Note: this key is extracted from the corresponding `rsa2048-priv.der`
|
||||
/// example key in the `pkcs8` crate.
|
||||
const RSA_2048_PRIV_DER: &[u8] = include_bytes!("examples/pkcs1/rsa2048-priv.der");
|
||||
|
||||
/// RSA-4096 PKCS#1 private key encoded as ASN.1 DER
|
||||
const RSA_4096_PRIV_DER: &[u8] = include_bytes!("examples/pkcs1/rsa4096-priv.der");
|
||||
|
||||
/// RSA-2048 PKCS#1 public key encoded as ASN.1 DER.
|
||||
///
|
||||
/// Note: this key is extracted from the corresponding `rsa2048-priv.der`
|
||||
/// example key in the `pkcs8` crate.
|
||||
const RSA_2048_PUB_DER: &[u8] = include_bytes!("examples/pkcs1/rsa2048-pub.der");
|
||||
|
||||
/// RSA-4096 PKCS#1 public key encoded as ASN.1 DER
|
||||
const RSA_4096_PUB_DER: &[u8] = include_bytes!("examples/pkcs1/rsa4096-pub.der");
|
||||
|
||||
/// RSA-2048 PKCS#1 private key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_2048_PRIV_PEM: &str = include_str!("examples/pkcs1/rsa2048-priv.pem");
|
||||
|
||||
/// RSA-4096 PKCS#1 private key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_4096_PRIV_PEM: &str = include_str!("examples/pkcs1/rsa4096-priv.pem");
|
||||
|
||||
/// RSA-2048 PKCS#1 public key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_2048_PUB_PEM: &str = include_str!("examples/pkcs1/rsa2048-pub.pem");
|
||||
|
||||
/// RSA-4096 PKCS#1 public key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_4096_PUB_PEM: &str = include_str!("examples/pkcs1/rsa4096-pub.pem");
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs1_der(RSA_2048_PRIV_DER).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa2048-priv.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"7ECC8362C0EDB0741164215E22F74AB9D91BA06900700CF63690E5114D8EE6BD"
|
||||
"CFBB2E3F9614692A677A083F168A5E52E5968E6407B9D97C6E0E4064F82DA0B7"
|
||||
"58A14F17B9B7D41F5F48E28D6551704F56E69E7AA9FA630FC76428C06D25E455"
|
||||
"DCFC55B7AC2B4F76643FDED3FE15FF78ABB27E65ACC4AAD0BDF6DB27EF60A691"
|
||||
"0C5C4A085ED43275AB19C1D997A32C6EFFCE7DF2D1935F6E601EEDE161A12B5C"
|
||||
"C27CA21F81D2C99C3D1EA08E90E3053AB09BEFA724DEF0D0C3A3C1E9740C0D9F"
|
||||
"76126A149EC0AA7D8078205484254D951DB07C4CF91FB6454C096588FD5924DB"
|
||||
"ABEB359CA2025268D004F9D66EB3D6F7ADC1139BAD40F16DDE639E11647376C1"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"DCC061242D4E92AFAEE72AC513CA65B9F77036F9BD7E0E6E61461A7EF7654225"
|
||||
"EC153C7E5C31A6157A6E5A13FF6E178E8758C1CB33D9D6BBE3179EF18998E422"
|
||||
"ECDCBED78F4ECFDBE5F4FCD8AEC2C9D0DC86473CA9BD16D9D238D21FB5DDEFBE"
|
||||
"B143CA61D0BD6AA8D91F33A097790E9640DBC91085DC5F26343BA3138F6B2D67"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D3F314757E40E954836F92BE24236AF2F0DA04A34653C180AF67E960086D93FD"
|
||||
"E65CB23EFD9D09374762F5981E361849AF68CDD75394FF6A4E06EB69B209E422"
|
||||
"8DB2DFA70E40F7F9750A528176647B788D0E5777A2CB8B22E3CD267FF70B4F3B"
|
||||
"02D3AAFB0E18C590A564B03188B0AA5FC48156B07622214243BD1227EFA7F2F9"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa4096_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs1_der(RSA_4096_PRIV_DER).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa4096-priv.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"A7A74572811EA2617E49E85BD730DDE30F103F7D88EE3F765E540D3DD993BBB0"
|
||||
"BA140002859D0B40897436637F58B828EA74DF8321634077F99D4AA2D54CA375"
|
||||
"852EF597661D3713CE1EF3B4FD6A8E220238E467668A2C7EE3861D2212AE6A1E"
|
||||
"BDDFA88B62DF10F6BCF79EFF4AC298FB2563DF1B8764381AF9B1FB0CCD085E02"
|
||||
"6B0AD9F6721A235177D0396B48754AD4A75242250A873BF2F6E7EE3C75DD613E"
|
||||
"365BA4F3210A6CC66B90A2FA3F762CA6884087B6BF8161EB144819F0F572F21F"
|
||||
"6C8E273E70D45A365B8B2819CE734613CC23B01329A17901F17078403861F54C"
|
||||
"52A051E2A58C75C2D9D80091BB9808A106C1F7ECB4034E15058BEEC725C5F919"
|
||||
"D62EAA234B62628D346C60BB919E70851DAB38571E6F0ED7634129F994EA368F"
|
||||
"EE7373DFDEC04445EBCA47FA20ED1540A860C948BABC98DA591CA1DE2E2E2554"
|
||||
"0EF9B7CB353F60213B814A45D359EFA9B811EEFF08C65993BF8A85C2BFEAAA7E"
|
||||
"D5E6B43E18AE604464CE5F96150136E7D09F8B24FAD43D7870118CFA7BC24875"
|
||||
"506EBBC321B977E0861AEA50128620121F0B394A9CDD0A42411A1350C0770D97"
|
||||
"5D71B00A90436240C967A0C3A5C20A0F6DE77F3F2CAFDA94ED0143C1F6E34F73"
|
||||
"E0CAC279EEEB7C637723A2B026C82802E1A4AEBAA8846DF98E7919498773E0D4"
|
||||
"F319956F4DE3AAD00EFB9A147D66B3AC1A01D35B2CFB48D400B0E7A80DC97551"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"9FE3097B2322B90FAB6606C017A095EBE640C39C100BCEE02F238FA14DAFF38E"
|
||||
"9E57568F1127ED4436126B904631B127EC395BB3EE127EB82C88D2562A7FB55F"
|
||||
"ED8D1450B7E4E2D2F37F5742636FCC6F289963522D5B5706082CADFA01C0EE99"
|
||||
"B4D0E9274D3A992E06974CBE01694686356962AC1959FD9BD447E5B9968C0543"
|
||||
"DF1BF134742AF345CDB2FA1F9371B0D4CF61C68D16D653D8E999D4FD3A16CF97"
|
||||
"8A35AA40E860CDCE09655DD8B4CF19D4141B1E92AD5E51A8E4A5C27FA745611D"
|
||||
"90E49D0E9282222AB6F126643E1C77578816FCE3B98F321D2549F294A470DF84"
|
||||
"53446BF36F985DF25ED8FDE9FDF3073FB27727DF48E9E1FC7056BC78965090B7"
|
||||
"850126406462C8253051EF84E34EE3C3CEB8F96C658C38BE45558D2F64E29D22"
|
||||
"3350555FC1EFA28EC1F4AFB5BA4080F09A86CDC3538C1AD7C972E6D7A3612E68"
|
||||
"45BA9AFBDF19F09060D1A779DE9635E2D2F8E0C510BA24C6C44B30C9BDFAF85B"
|
||||
"E917AEC5D43AFAB1AA3ADD33CC83DA93CAC69218F6A36EB47F199D5424C95FD9"
|
||||
"ED7B1E8BE2AEAA6433B227241316C20EE792650CEB48BFD634446B19D286B4EA"
|
||||
"1722498DA1A36973210EC3824751A5808D9AAEF59C449E19A5077CFECA126BD9"
|
||||
"A8DD4996561D4E27B3609FF82C5B1B21E627845D44961B33B875D5C4FA9FF357"
|
||||
"EF6BE3364969E1337C91B29A07B9A913CDE40CE2D5530C900E73751685E65431"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D0213A79425B665B719118448893EC3275600F63DBF85B77F4E8E99EF302F6E8"
|
||||
"2596048F6DCA772DE6BBF1124DB84B0AFE61B03A8604AB0079ED53F3304797AD"
|
||||
"01B38C44FE27A5A45E378483A804B56A4A967F48F01A866E721E67E4C9A1048A"
|
||||
"F68927FAA43D6A85D93E7BF7074DBA797563FCABE12309B76653C6DB614DC231"
|
||||
"CC556D9F25AC4841A02D31CDF3015B212307F9D0C79FEB5D3956CE53CC8FA165"
|
||||
"1BE60761F19F74672489EAF9F215409F39956E77A82183F1F72BB2FEDDF1B9FB"
|
||||
"FC4AD89EA445809DDBD5BD595277990C0BE9366FBB2ECF7B057CC1C3DC8FB77B"
|
||||
"F8456D07BBC95B3C1815F48E62B81468C3D4D9D96C0F48DAB04993BE8D91EDE5"
|
||||
),
|
||||
2048,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"CE36C6810522ABE5D6465F36EB137DA3B9EA4A5F1D27C6614729EB8E5E2E5CB8"
|
||||
"8E3EF1A473A21944B66557B3DC2CE462E4BF3446CB4990037E5672B1705CBAE8"
|
||||
"1B65BAF967A266DC18EFE80F4DBBFE1A59063205CE2943CADF421CCE74AF7063"
|
||||
"FD1A83AF3C39AF84525F59BDC1FF54815F52AFD1E8D4862B2C3654F6CFA83DC0"
|
||||
"8E2A9D52B9F833C646AF7694467DFC5F7D7AD7B441895FCB7FFBED526324B015"
|
||||
"4A15823F5107C89548EDDCB61DA5308C6CC834D4A0C16DFA6CA1D67B61A65677"
|
||||
"EB1719CD125D0EF0DB8802FB76CFC17577BCB2510AE294E1BF8A9173A2B85C16"
|
||||
"A6B508C98F2D770B7F3DE48D9E720C53E263680B57E7109410015745570652FD"
|
||||
),
|
||||
2048,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_pub_der() {
|
||||
let key = RsaPublicKey::from_pkcs1_der(RSA_2048_PUB_DER).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa2048-pub.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa4096_pub_der() {
|
||||
let key = RsaPublicKey::from_pkcs1_der(RSA_4096_PUB_DER).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa4096-pub.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"A7A74572811EA2617E49E85BD730DDE30F103F7D88EE3F765E540D3DD993BBB0"
|
||||
"BA140002859D0B40897436637F58B828EA74DF8321634077F99D4AA2D54CA375"
|
||||
"852EF597661D3713CE1EF3B4FD6A8E220238E467668A2C7EE3861D2212AE6A1E"
|
||||
"BDDFA88B62DF10F6BCF79EFF4AC298FB2563DF1B8764381AF9B1FB0CCD085E02"
|
||||
"6B0AD9F6721A235177D0396B48754AD4A75242250A873BF2F6E7EE3C75DD613E"
|
||||
"365BA4F3210A6CC66B90A2FA3F762CA6884087B6BF8161EB144819F0F572F21F"
|
||||
"6C8E273E70D45A365B8B2819CE734613CC23B01329A17901F17078403861F54C"
|
||||
"52A051E2A58C75C2D9D80091BB9808A106C1F7ECB4034E15058BEEC725C5F919"
|
||||
"D62EAA234B62628D346C60BB919E70851DAB38571E6F0ED7634129F994EA368F"
|
||||
"EE7373DFDEC04445EBCA47FA20ED1540A860C948BABC98DA591CA1DE2E2E2554"
|
||||
"0EF9B7CB353F60213B814A45D359EFA9B811EEFF08C65993BF8A85C2BFEAAA7E"
|
||||
"D5E6B43E18AE604464CE5F96150136E7D09F8B24FAD43D7870118CFA7BC24875"
|
||||
"506EBBC321B977E0861AEA50128620121F0B394A9CDD0A42411A1350C0770D97"
|
||||
"5D71B00A90436240C967A0C3A5C20A0F6DE77F3F2CAFDA94ED0143C1F6E34F73"
|
||||
"E0CAC279EEEB7C637723A2B026C82802E1A4AEBAA8846DF98E7919498773E0D4"
|
||||
"F319956F4DE3AAD00EFB9A147D66B3AC1A01D35B2CFB48D400B0E7A80DC97551"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa2048_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs1_der(RSA_2048_PRIV_DER).unwrap();
|
||||
let der = key.to_pkcs1_der().unwrap();
|
||||
assert_eq!(der.as_bytes(), RSA_2048_PRIV_DER)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa4096_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs1_der(RSA_4096_PRIV_DER).unwrap();
|
||||
let der = key.to_pkcs1_der().unwrap();
|
||||
assert_eq!(der.as_bytes(), RSA_4096_PRIV_DER)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa2048_pub_der() {
|
||||
let key = RsaPublicKey::from_pkcs1_der(RSA_2048_PUB_DER).unwrap();
|
||||
let der = key.to_pkcs1_der().unwrap();
|
||||
assert_eq!(der.as_ref(), RSA_2048_PUB_DER)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa4096_pub_der() {
|
||||
let key = RsaPublicKey::from_pkcs1_der(RSA_4096_PUB_DER).unwrap();
|
||||
let der = key.to_pkcs1_der().unwrap();
|
||||
assert_eq!(der.as_ref(), RSA_4096_PUB_DER)
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa2048_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs1_pem(RSA_2048_PRIV_PEM).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa2048-priv.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"7ECC8362C0EDB0741164215E22F74AB9D91BA06900700CF63690E5114D8EE6BD"
|
||||
"CFBB2E3F9614692A677A083F168A5E52E5968E6407B9D97C6E0E4064F82DA0B7"
|
||||
"58A14F17B9B7D41F5F48E28D6551704F56E69E7AA9FA630FC76428C06D25E455"
|
||||
"DCFC55B7AC2B4F76643FDED3FE15FF78ABB27E65ACC4AAD0BDF6DB27EF60A691"
|
||||
"0C5C4A085ED43275AB19C1D997A32C6EFFCE7DF2D1935F6E601EEDE161A12B5C"
|
||||
"C27CA21F81D2C99C3D1EA08E90E3053AB09BEFA724DEF0D0C3A3C1E9740C0D9F"
|
||||
"76126A149EC0AA7D8078205484254D951DB07C4CF91FB6454C096588FD5924DB"
|
||||
"ABEB359CA2025268D004F9D66EB3D6F7ADC1139BAD40F16DDE639E11647376C1"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"DCC061242D4E92AFAEE72AC513CA65B9F77036F9BD7E0E6E61461A7EF7654225"
|
||||
"EC153C7E5C31A6157A6E5A13FF6E178E8758C1CB33D9D6BBE3179EF18998E422"
|
||||
"ECDCBED78F4ECFDBE5F4FCD8AEC2C9D0DC86473CA9BD16D9D238D21FB5DDEFBE"
|
||||
"B143CA61D0BD6AA8D91F33A097790E9640DBC91085DC5F26343BA3138F6B2D67"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D3F314757E40E954836F92BE24236AF2F0DA04A34653C180AF67E960086D93FD"
|
||||
"E65CB23EFD9D09374762F5981E361849AF68CDD75394FF6A4E06EB69B209E422"
|
||||
"8DB2DFA70E40F7F9750A528176647B788D0E5777A2CB8B22E3CD267FF70B4F3B"
|
||||
"02D3AAFB0E18C590A564B03188B0AA5FC48156B07622214243BD1227EFA7F2F9"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa4096_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs1_pem(RSA_4096_PRIV_PEM).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa4096-priv.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"A7A74572811EA2617E49E85BD730DDE30F103F7D88EE3F765E540D3DD993BBB0"
|
||||
"BA140002859D0B40897436637F58B828EA74DF8321634077F99D4AA2D54CA375"
|
||||
"852EF597661D3713CE1EF3B4FD6A8E220238E467668A2C7EE3861D2212AE6A1E"
|
||||
"BDDFA88B62DF10F6BCF79EFF4AC298FB2563DF1B8764381AF9B1FB0CCD085E02"
|
||||
"6B0AD9F6721A235177D0396B48754AD4A75242250A873BF2F6E7EE3C75DD613E"
|
||||
"365BA4F3210A6CC66B90A2FA3F762CA6884087B6BF8161EB144819F0F572F21F"
|
||||
"6C8E273E70D45A365B8B2819CE734613CC23B01329A17901F17078403861F54C"
|
||||
"52A051E2A58C75C2D9D80091BB9808A106C1F7ECB4034E15058BEEC725C5F919"
|
||||
"D62EAA234B62628D346C60BB919E70851DAB38571E6F0ED7634129F994EA368F"
|
||||
"EE7373DFDEC04445EBCA47FA20ED1540A860C948BABC98DA591CA1DE2E2E2554"
|
||||
"0EF9B7CB353F60213B814A45D359EFA9B811EEFF08C65993BF8A85C2BFEAAA7E"
|
||||
"D5E6B43E18AE604464CE5F96150136E7D09F8B24FAD43D7870118CFA7BC24875"
|
||||
"506EBBC321B977E0861AEA50128620121F0B394A9CDD0A42411A1350C0770D97"
|
||||
"5D71B00A90436240C967A0C3A5C20A0F6DE77F3F2CAFDA94ED0143C1F6E34F73"
|
||||
"E0CAC279EEEB7C637723A2B026C82802E1A4AEBAA8846DF98E7919498773E0D4"
|
||||
"F319956F4DE3AAD00EFB9A147D66B3AC1A01D35B2CFB48D400B0E7A80DC97551"
|
||||
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"9FE3097B2322B90FAB6606C017A095EBE640C39C100BCEE02F238FA14DAFF38E"
|
||||
"9E57568F1127ED4436126B904631B127EC395BB3EE127EB82C88D2562A7FB55F"
|
||||
"ED8D1450B7E4E2D2F37F5742636FCC6F289963522D5B5706082CADFA01C0EE99"
|
||||
"B4D0E9274D3A992E06974CBE01694686356962AC1959FD9BD447E5B9968C0543"
|
||||
"DF1BF134742AF345CDB2FA1F9371B0D4CF61C68D16D653D8E999D4FD3A16CF97"
|
||||
"8A35AA40E860CDCE09655DD8B4CF19D4141B1E92AD5E51A8E4A5C27FA745611D"
|
||||
"90E49D0E9282222AB6F126643E1C77578816FCE3B98F321D2549F294A470DF84"
|
||||
"53446BF36F985DF25ED8FDE9FDF3073FB27727DF48E9E1FC7056BC78965090B7"
|
||||
"850126406462C8253051EF84E34EE3C3CEB8F96C658C38BE45558D2F64E29D22"
|
||||
"3350555FC1EFA28EC1F4AFB5BA4080F09A86CDC3538C1AD7C972E6D7A3612E68"
|
||||
"45BA9AFBDF19F09060D1A779DE9635E2D2F8E0C510BA24C6C44B30C9BDFAF85B"
|
||||
"E917AEC5D43AFAB1AA3ADD33CC83DA93CAC69218F6A36EB47F199D5424C95FD9"
|
||||
"ED7B1E8BE2AEAA6433B227241316C20EE792650CEB48BFD634446B19D286B4EA"
|
||||
"1722498DA1A36973210EC3824751A5808D9AAEF59C449E19A5077CFECA126BD9"
|
||||
"A8DD4996561D4E27B3609FF82C5B1B21E627845D44961B33B875D5C4FA9FF357"
|
||||
"EF6BE3364969E1337C91B29A07B9A913CDE40CE2D5530C900E73751685E65431"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D0213A79425B665B719118448893EC3275600F63DBF85B77F4E8E99EF302F6E8"
|
||||
"2596048F6DCA772DE6BBF1124DB84B0AFE61B03A8604AB0079ED53F3304797AD"
|
||||
"01B38C44FE27A5A45E378483A804B56A4A967F48F01A866E721E67E4C9A1048A"
|
||||
"F68927FAA43D6A85D93E7BF7074DBA797563FCABE12309B76653C6DB614DC231"
|
||||
"CC556D9F25AC4841A02D31CDF3015B212307F9D0C79FEB5D3956CE53CC8FA165"
|
||||
"1BE60761F19F74672489EAF9F215409F39956E77A82183F1F72BB2FEDDF1B9FB"
|
||||
"FC4AD89EA445809DDBD5BD595277990C0BE9366FBB2ECF7B057CC1C3DC8FB77B"
|
||||
"F8456D07BBC95B3C1815F48E62B81468C3D4D9D96C0F48DAB04993BE8D91EDE5"
|
||||
),
|
||||
2048,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"CE36C6810522ABE5D6465F36EB137DA3B9EA4A5F1D27C6614729EB8E5E2E5CB8"
|
||||
"8E3EF1A473A21944B66557B3DC2CE462E4BF3446CB4990037E5672B1705CBAE8"
|
||||
"1B65BAF967A266DC18EFE80F4DBBFE1A59063205CE2943CADF421CCE74AF7063"
|
||||
"FD1A83AF3C39AF84525F59BDC1FF54815F52AFD1E8D4862B2C3654F6CFA83DC0"
|
||||
"8E2A9D52B9F833C646AF7694467DFC5F7D7AD7B441895FCB7FFBED526324B015"
|
||||
"4A15823F5107C89548EDDCB61DA5308C6CC834D4A0C16DFA6CA1D67B61A65677"
|
||||
"EB1719CD125D0EF0DB8802FB76CFC17577BCB2510AE294E1BF8A9173A2B85C16"
|
||||
"A6B508C98F2D770B7F3DE48D9E720C53E263680B57E7109410015745570652FD"
|
||||
),
|
||||
2048,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa2048_pub_pem() {
|
||||
let key = RsaPublicKey::from_pkcs1_pem(RSA_2048_PUB_PEM).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa2048-pub.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa4096_pub_pem() {
|
||||
let key = RsaPublicKey::from_pkcs1_pem(RSA_4096_PUB_PEM).unwrap();
|
||||
|
||||
// Extracted using:
|
||||
// $ openssl asn1parse -in tests/examples/pkcs1/rsa4096-pub.pem
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"A7A74572811EA2617E49E85BD730DDE30F103F7D88EE3F765E540D3DD993BBB0"
|
||||
"BA140002859D0B40897436637F58B828EA74DF8321634077F99D4AA2D54CA375"
|
||||
"852EF597661D3713CE1EF3B4FD6A8E220238E467668A2C7EE3861D2212AE6A1E"
|
||||
"BDDFA88B62DF10F6BCF79EFF4AC298FB2563DF1B8764381AF9B1FB0CCD085E02"
|
||||
"6B0AD9F6721A235177D0396B48754AD4A75242250A873BF2F6E7EE3C75DD613E"
|
||||
"365BA4F3210A6CC66B90A2FA3F762CA6884087B6BF8161EB144819F0F572F21F"
|
||||
"6C8E273E70D45A365B8B2819CE734613CC23B01329A17901F17078403861F54C"
|
||||
"52A051E2A58C75C2D9D80091BB9808A106C1F7ECB4034E15058BEEC725C5F919"
|
||||
"D62EAA234B62628D346C60BB919E70851DAB38571E6F0ED7634129F994EA368F"
|
||||
"EE7373DFDEC04445EBCA47FA20ED1540A860C948BABC98DA591CA1DE2E2E2554"
|
||||
"0EF9B7CB353F60213B814A45D359EFA9B811EEFF08C65993BF8A85C2BFEAAA7E"
|
||||
"D5E6B43E18AE604464CE5F96150136E7D09F8B24FAD43D7870118CFA7BC24875"
|
||||
"506EBBC321B977E0861AEA50128620121F0B394A9CDD0A42411A1350C0770D97"
|
||||
"5D71B00A90436240C967A0C3A5C20A0F6DE77F3F2CAFDA94ED0143C1F6E34F73"
|
||||
"E0CAC279EEEB7C637723A2B026C82802E1A4AEBAA8846DF98E7919498773E0D4"
|
||||
"F319956F4DE3AAD00EFB9A147D66B3AC1A01D35B2CFB48D400B0E7A80DC97551"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa2048_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs1_pem(RSA_2048_PRIV_PEM).unwrap();
|
||||
let pem = key.to_pkcs1_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_2048_PRIV_PEM)
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa4096_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs1_pem(RSA_4096_PRIV_PEM).unwrap();
|
||||
let pem = key.to_pkcs1_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_4096_PRIV_PEM)
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa2048_pub_pem() {
|
||||
let key = RsaPublicKey::from_pkcs1_pem(RSA_2048_PUB_PEM).unwrap();
|
||||
let pem = key.to_pkcs1_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_2048_PUB_PEM)
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa4096_pub_pem() {
|
||||
let key = RsaPublicKey::from_pkcs1_pem(RSA_4096_PUB_PEM).unwrap();
|
||||
let pem = key.to_pkcs1_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_4096_PUB_PEM)
|
||||
}
|
||||
Vendored
+80
@@ -0,0 +1,80 @@
|
||||
// simple but prevent regression - see https://github.com/RustCrypto/RSA/issues/329
|
||||
#[cfg(feature = "encoding")]
|
||||
#[test]
|
||||
fn signature_stringify() {
|
||||
use pkcs8::DecodePrivateKey;
|
||||
use signature::Signer;
|
||||
|
||||
use rsa::pkcs1v15::SigningKey;
|
||||
use rsa::RsaPrivateKey;
|
||||
|
||||
let pem = include_str!("examples/pkcs8/rsa2048-priv.pem");
|
||||
let private_key = RsaPrivateKey::from_pkcs8_pem(pem).unwrap();
|
||||
let signing_key = SigningKey::<sha2::Sha256>::new(private_key);
|
||||
|
||||
let bytes: &[u8] = b"rsa4096"; // HACK - the criterion is that the signature has leading zeros.
|
||||
let signature = signing_key.sign(bytes);
|
||||
|
||||
let expected = "029E365B60971D5A499FF5E1C288B954D3A5DCF52482CEE46DB90DC860B725A8D6CA031146FA156E9F17579BE6122FFB11DAC35E59B2193D75F7B31CE1442DDE7F4FF7885AD5D6080266E9A33BB4CEC93FCC2B6B885457A0ABF19E2DAA00876F694B37F535F119925CCCF9A17B90AE6CF39F07D7FEFBEECDF1B344C14B728196DDD154230BADDEDA5A7EFF373F6CD3EF6D41789572A7A068E3A252D3B7D5D706C6170D8CFDB48C8E738A4B3BFEA3E15716805E376EBD99EA09C6E82F3CFA13CEB23CD289E8F95C27F489ADC05AAACE8A9276EE7CED3B7A5C7264F0D34FF18CEDC3E91D667FCF9992A8CFDE8562F65FDDE1E06595C27E0F82063839A358C927B2";
|
||||
assert_eq!(format!("{}", signature), expected);
|
||||
assert_eq!(format!("{:x}", signature), expected.to_lowercase());
|
||||
assert_eq!(format!("{:X}", signature), expected);
|
||||
assert_eq!(signature.to_string(), expected);
|
||||
}
|
||||
|
||||
#[cfg(feature = "encoding")]
|
||||
#[test]
|
||||
fn signing_key_new_same_as_from() {
|
||||
use pkcs1::DecodeRsaPrivateKey;
|
||||
use rsa::RsaPrivateKey;
|
||||
use signature::{Keypair, Signer, Verifier};
|
||||
|
||||
// randomly generated key, hardcoded for test repeatability
|
||||
const PRIV_KEY_PKCS1_PEM: &str = "-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEowIBAAKCAQEAwQe5brkkpxrwR/5TJ6JXsUyBzYtbEL/w8u8P6NnxQ8sL4KYp
|
||||
MzzTB6aq1gq7bieYXChg0PIWeTukGaOzZe96KxhT0GbhhYRlukktM/quRrM7nYdm
|
||||
UmXo7+KWU55kfcNOjWKADL/7qmxn6y/+kPmBg83nHdr1Mq6/pNkeHY/1CeGGECl0
|
||||
rg7gfEkssHjZw/uKafA271fX9A/q3LcAeWi7iA01PgmP28BrWb7OQoYVY71kFY11
|
||||
e919VlMh8oXsIV0nXCkYu9dR8Pzq6U4gFASK32fFkKX/djRMljEgss3kR0SWPH7t
|
||||
m5uXX1wRTJ2mRaZh/BmGweIvYCZ5y0+9ESOD1wIDAQABAoIBAAj3NuGxr8YjNi3h
|
||||
3jLlE3WkvBKz+lLY13QxLmf+V3pyn+abUSaUGKkuUJkIfpQrOqRtK7IIzIps/r5C
|
||||
ID8H1IDT7HCtlqQA9kikxXi4mAeoo4g5lcMWAK/Dsn/Hx5sfyzI99PyininYRyth
|
||||
W02YiS96DNYSKXllLHmXrBJrcVI4FqXAz5s7MezU0XYi+jeaVGEP2bd2cHfQJki/
|
||||
pLOKBvA5DGT7HbmMV7Z1qg/zcr/4Py+7qAFC5XsbQIILSMTfC45QFgs1lApnUG8H
|
||||
uIhf5lgZ8m0ouDBb/e1Q04ANtdLLI6EmrR11PwavUmvPvXuedXkv2OvnuAbiJr6g
|
||||
j0I0VaECgYEAyWf2QZrEoZLzVrInZ+VYtov1+jjgFcxW9lHuCJXtTx8hFla13Bmp
|
||||
bc8PoxWb+37jPdrOYPW0yv1sk5VeVkxOJbms0Gn8hpyI+0muQZ3jmwlS0A10T6FL
|
||||
wWECYvrxO8DCaVCQ4V+egLSDb/GMkRgHJF3Dr7g3ep7krXf2eeWILQUCgYEA9VqJ
|
||||
ijMDKw/KX6swyMe3A1nA0MlLBeseXxrwNIJenwRXCzjG3BH6oHW2MGwH0EV7sSoG
|
||||
FR6j7LZbp9I9NvRcAYU/s1qiAX3iX3KIsbZYNtEC6tKn/HClaHLZOhyuE8tjshyD
|
||||
jhK/0rhw7R5VQ1GfJhmuzvwoMFTA0fqZBQpWZCsCgYBA5WO+3dyv50bLT5pM6uR7
|
||||
5Xs7xinGPFJlCh812wFdNj2WEhiFNCuYu1hhhyv8jHUyUBehvGol4iSjJUUBb5La
|
||||
qwpZGV2KDlRBDAu/Dt3w7b8mVL9+jQ144QZA2HT0ePbrsk8Mn5/V/tQ/NMjDU8ex
|
||||
WxkbvLL7qskqb/YWbvRC9QKBgQDUJYvFpmQ36LhozmIpSZ6yU/oHzfWD0Y/6VhWa
|
||||
oZtlTeBhwJ8aDKWz9vQonFCJQns4bgjCXDMLa4aG7p+lk9a2LdwtndF1Dr8dHrCZ
|
||||
UPynsUQffTRpb5FmZd/0gnX2gafbixIpV4brkjV6of7BbaL50702Fgw99hqftVp4
|
||||
ZD7c7wKBgD7uIs6rgpaJzKbf7ejjZSjfLOgHlJhtH6Nejp8KoJRsEQI1ofWyIn7D
|
||||
eMjIuecwLapPwjY2G0/sUW61bqrxgW10wDJHPNllGsZFanzpb7x5o/7eNhzc4qNf
|
||||
Rmb665iB5fwpqmbE/hYKIn7asYQE+V0dkgt8M3qvlJJ5JJbCrJx3
|
||||
-----END RSA PRIVATE KEY-----";
|
||||
|
||||
let priv_key = RsaPrivateKey::from_pkcs1_pem(PRIV_KEY_PKCS1_PEM).unwrap();
|
||||
|
||||
let msg = b"1234";
|
||||
|
||||
let key_via_new = rsa::pkcs1v15::SigningKey::<sha2::Sha256>::new(priv_key.clone());
|
||||
let key_via_from = rsa::pkcs1v15::SigningKey::<sha2::Sha256>::from(priv_key.clone());
|
||||
let sig_via_new = key_via_new.sign(msg);
|
||||
let sig_via_from = key_via_from.sign(msg);
|
||||
assert_eq!(sig_via_new, sig_via_from);
|
||||
|
||||
// each verifies the other
|
||||
assert!(key_via_new
|
||||
.verifying_key()
|
||||
.verify(msg, &sig_via_from)
|
||||
.is_ok());
|
||||
assert!(key_via_from
|
||||
.verifying_key()
|
||||
.verify(msg, &sig_via_new)
|
||||
.is_ok());
|
||||
}
|
||||
Vendored
+329
@@ -0,0 +1,329 @@
|
||||
//! PKCS#8 encoding tests
|
||||
|
||||
#![cfg(feature = "encoding")]
|
||||
|
||||
use crypto_bigint::{BoxedUint, CtEq};
|
||||
use hex_literal::hex;
|
||||
use rsa::{
|
||||
pkcs1v15,
|
||||
pkcs8::{DecodePrivateKey, DecodePublicKey, EncodePrivateKey, EncodePublicKey},
|
||||
pss,
|
||||
traits::{PrivateKeyParts, PublicKeyParts},
|
||||
RsaPrivateKey, RsaPublicKey,
|
||||
};
|
||||
use sha2::Sha256;
|
||||
|
||||
#[cfg(feature = "encoding")]
|
||||
use rsa::pkcs8::LineEnding;
|
||||
|
||||
/// RSA-2048 PKCS#8 private key encoded as ASN.1 DER
|
||||
const RSA_2048_PRIV_DER: &[u8] = include_bytes!("examples/pkcs8/rsa2048-priv.der");
|
||||
|
||||
/// RSA-2048 `SubjectPublicKeyInfo` encoded as ASN.1 DER
|
||||
const RSA_2048_PUB_DER: &[u8] = include_bytes!("examples/pkcs8/rsa2048-pub.der");
|
||||
|
||||
/// RSA-2048 PKCS#8 private key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_2048_PRIV_PEM: &str = include_str!("examples/pkcs8/rsa2048-priv.pem");
|
||||
|
||||
/// RSA-2048 PKCS#8 public key encoded as PEM
|
||||
#[cfg(feature = "encoding")]
|
||||
const RSA_2048_PUB_PEM: &str = include_str!("examples/pkcs8/rsa2048-pub.pem");
|
||||
|
||||
/// RSA-2048 PSS PKCS#8 private key encoded as DER
|
||||
const RSA_2048_PSS_PRIV_DER: &[u8] = include_bytes!("examples/pkcs8/rsa2048-rfc9421-priv.der");
|
||||
|
||||
/// RSA-2048 PSS PKCS#8 public key encoded as DER
|
||||
const RSA_2048_PSS_PUB_DER: &[u8] = include_bytes!("examples/pkcs8/rsa2048-rfc9421-pub.der");
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs8_der(RSA_2048_PRIV_DER).unwrap();
|
||||
|
||||
// Note: matches PKCS#1 test vectors
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 32).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"7ECC8362C0EDB0741164215E22F74AB9D91BA06900700CF63690E5114D8EE6BD"
|
||||
"CFBB2E3F9614692A677A083F168A5E52E5968E6407B9D97C6E0E4064F82DA0B7"
|
||||
"58A14F17B9B7D41F5F48E28D6551704F56E69E7AA9FA630FC76428C06D25E455"
|
||||
"DCFC55B7AC2B4F76643FDED3FE15FF78ABB27E65ACC4AAD0BDF6DB27EF60A691"
|
||||
"0C5C4A085ED43275AB19C1D997A32C6EFFCE7DF2D1935F6E601EEDE161A12B5C"
|
||||
"C27CA21F81D2C99C3D1EA08E90E3053AB09BEFA724DEF0D0C3A3C1E9740C0D9F"
|
||||
"76126A149EC0AA7D8078205484254D951DB07C4CF91FB6454C096588FD5924DB"
|
||||
"ABEB359CA2025268D004F9D66EB3D6F7ADC1139BAD40F16DDE639E11647376C1"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"DCC061242D4E92AFAEE72AC513CA65B9F77036F9BD7E0E6E61461A7EF7654225"
|
||||
"EC153C7E5C31A6157A6E5A13FF6E178E8758C1CB33D9D6BBE3179EF18998E422"
|
||||
"ECDCBED78F4ECFDBE5F4FCD8AEC2C9D0DC86473CA9BD16D9D238D21FB5DDEFBE"
|
||||
"B143CA61D0BD6AA8D91F33A097790E9640DBC91085DC5F26343BA3138F6B2D67"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D3F314757E40E954836F92BE24236AF2F0DA04A34653C180AF67E960086D93FD"
|
||||
"E65CB23EFD9D09374762F5981E361849AF68CDD75394FF6A4E06EB69B209E422"
|
||||
"8DB2DFA70E40F7F9750A528176647B788D0E5777A2CB8B22E3CD267FF70B4F3B"
|
||||
"02D3AAFB0E18C590A564B03188B0AA5FC48156B07622214243BD1227EFA7F2F9"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
|
||||
let _ = pkcs1v15::SigningKey::<Sha256>::from_pkcs8_der(RSA_2048_PRIV_DER).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_pub_der() {
|
||||
let key = RsaPublicKey::from_public_key_der(RSA_2048_PUB_DER).unwrap();
|
||||
|
||||
// Note: matches PKCS#1 test vectors
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
|
||||
let _ = pkcs1v15::VerifyingKey::<Sha256>::from_public_key_der(RSA_2048_PUB_DER).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_pss_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs8_der(RSA_2048_PSS_PRIV_DER).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"AF8B669B7AF6D1677F3DBAAF3F5B36F9012DBE9B91695F18AB8D208D447CCB64"
|
||||
"63C5AE9DA46D865C76CF7EF32CF1CB7E2E1D461F8E71DBC470DD1CB9DE69BEA0"
|
||||
"05E3C90F3A3A70E467937C9586E0803E0EDF0E8CEA902F2E4864F79027753AE2"
|
||||
"7DB2053CD53C3CF30EECECAB1401EA803B339E33C59933AD08470DD99D45A568"
|
||||
"1C870B982CF2FE5A892A96D775D67AAACE2F9B27D72F48A00361D50000DE5652"
|
||||
"DCDDA62CBA2DB4E04B13FBA1C894E139F483923A683649EC0F0BCE8D0A4B2658"
|
||||
"A00E3CE66A9C3B419501D570F65AB868E4FDBFA77E9DBE1B9CD91056494B4377"
|
||||
"D502F266FB17433A9F4B08D08DE3C576A670CE90557AF94F67579A3273A5C8DB"
|
||||
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"9407C8A9FA426289954A17C02A7C1FDA50FD234C0A8E41EC0AD64289FE24025C"
|
||||
"10AAA5BA37EB482F76DD391F9559FD10D590480EDA4EF7552B1BBA5A9ECCAB3C"
|
||||
"445B36B44994F8981323D31E4093D670FE9768ACBA2C862CD04D9C5A0A7C1800"
|
||||
"E0A01B3C96506AD14857D0A7DF82521E7A4DE7ED9E86B7860581ED9301C5B659"
|
||||
"B3785DF2BB96EA45CA8E871F25918981CC3004505CB25E3927539F968C04FD0F"
|
||||
"3B86D0CA4E4E4714D449E39C88F254164B501E4BC66F29BB2ABC847F01FC4E4B"
|
||||
"342FB5A1CF23FAD0F2F7C52F4534E262F66FB3CEDC1821718342E28CD860EC21"
|
||||
"3783DA6236A07A0F332003D30748EC1C12556D7CA7587E8E07DCE1D95EC4A611"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"E55FBA212239C846821579BE7E4D44336C700167A478F542032BEBF506D39453"
|
||||
"82670B7D5B08D48E1B4A46EB22E54ABE21867FB6AD96444E00B386FF14710CB6"
|
||||
"9D80111E3721CBE65CFA8A141A1492D5434BB7538481EBB27462D54EDD1EA55D"
|
||||
"C2230431EE63C4A3609EC28BA67ABEE0DCA1A12E8E796BB5485A331BD27DC509"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"C3EC0875ED7B5B96340A9869DD9674B8CF0E52AD4092B57620A6AEA981DA0F10"
|
||||
"13DF610CE1C8B630C111DA7214128E20FF8DA55B4CD8A2E145A8E370BF4F87C8"
|
||||
"EB203E9752A8A442E562E09F455769B8DA35CCBA2A134F5DE274020B6A7620F0"
|
||||
"3DE276FCBFDE2B0356438DD17DD40152AB80C1277B4849A643CB158AA07ADBC3"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
|
||||
let _ = pss::SigningKey::<Sha256>::from_pkcs8_der(RSA_2048_PSS_PRIV_DER).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn decode_rsa2048_pss_pub_der() {
|
||||
let key = RsaPublicKey::from_public_key_der(RSA_2048_PSS_PUB_DER).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"AF8B669B7AF6D1677F3DBAAF3F5B36F9012DBE9B91695F18AB8D208D447CCB64"
|
||||
"63C5AE9DA46D865C76CF7EF32CF1CB7E2E1D461F8E71DBC470DD1CB9DE69BEA0"
|
||||
"05E3C90F3A3A70E467937C9586E0803E0EDF0E8CEA902F2E4864F79027753AE2"
|
||||
"7DB2053CD53C3CF30EECECAB1401EA803B339E33C59933AD08470DD99D45A568"
|
||||
"1C870B982CF2FE5A892A96D775D67AAACE2F9B27D72F48A00361D50000DE5652"
|
||||
"DCDDA62CBA2DB4E04B13FBA1C894E139F483923A683649EC0F0BCE8D0A4B2658"
|
||||
"A00E3CE66A9C3B419501D570F65AB868E4FDBFA77E9DBE1B9CD91056494B4377"
|
||||
"D502F266FB17433A9F4B08D08DE3C576A670CE90557AF94F67579A3273A5C8DB"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
|
||||
let _ = pss::VerifyingKey::<Sha256>::from_public_key_der(RSA_2048_PSS_PUB_DER).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa2048_priv_der() {
|
||||
let key = RsaPrivateKey::from_pkcs8_der(RSA_2048_PRIV_DER).unwrap();
|
||||
let der = key.to_pkcs8_der().unwrap();
|
||||
assert_eq!(der.as_bytes(), RSA_2048_PRIV_DER);
|
||||
|
||||
let pkcs1v15_key = pkcs1v15::SigningKey::<Sha256>::from_pkcs8_der(RSA_2048_PRIV_DER).unwrap();
|
||||
let pkcs1v15_der = pkcs1v15_key.to_pkcs8_der().unwrap();
|
||||
assert_eq!(pkcs1v15_der.as_bytes(), RSA_2048_PRIV_DER);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn encode_rsa2048_pub_der() {
|
||||
let key = RsaPublicKey::from_public_key_der(RSA_2048_PUB_DER).unwrap();
|
||||
let der = key.to_public_key_der().unwrap();
|
||||
assert_eq!(der.as_ref(), RSA_2048_PUB_DER);
|
||||
|
||||
let pkcs1v15_key =
|
||||
pkcs1v15::VerifyingKey::<Sha256>::from_public_key_der(RSA_2048_PUB_DER).unwrap();
|
||||
let pkcs1v15_der = pkcs1v15_key.to_public_key_der().unwrap();
|
||||
assert_eq!(pkcs1v15_der.as_ref(), RSA_2048_PUB_DER);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa2048_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs8_pem(RSA_2048_PRIV_PEM).unwrap();
|
||||
|
||||
// Note: matches PKCS#1 test vectors
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
assert_eq!(
|
||||
&key.d().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"7ECC8362C0EDB0741164215E22F74AB9D91BA06900700CF63690E5114D8EE6BD"
|
||||
"CFBB2E3F9614692A677A083F168A5E52E5968E6407B9D97C6E0E4064F82DA0B7"
|
||||
"58A14F17B9B7D41F5F48E28D6551704F56E69E7AA9FA630FC76428C06D25E455"
|
||||
"DCFC55B7AC2B4F76643FDED3FE15FF78ABB27E65ACC4AAD0BDF6DB27EF60A691"
|
||||
"0C5C4A085ED43275AB19C1D997A32C6EFFCE7DF2D1935F6E601EEDE161A12B5C"
|
||||
"C27CA21F81D2C99C3D1EA08E90E3053AB09BEFA724DEF0D0C3A3C1E9740C0D9F"
|
||||
"76126A149EC0AA7D8078205484254D951DB07C4CF91FB6454C096588FD5924DB"
|
||||
"ABEB359CA2025268D004F9D66EB3D6F7ADC1139BAD40F16DDE639E11647376C1"
|
||||
)
|
||||
);
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"DCC061242D4E92AFAEE72AC513CA65B9F77036F9BD7E0E6E61461A7EF7654225"
|
||||
"EC153C7E5C31A6157A6E5A13FF6E178E8758C1CB33D9D6BBE3179EF18998E422"
|
||||
"ECDCBED78F4ECFDBE5F4FCD8AEC2C9D0DC86473CA9BD16D9D238D21FB5DDEFBE"
|
||||
"B143CA61D0BD6AA8D91F33A097790E9640DBC91085DC5F26343BA3138F6B2D67"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[0].ct_eq(&expected_prime)));
|
||||
|
||||
let expected_prime = BoxedUint::from_be_slice(
|
||||
&hex!(
|
||||
"D3F314757E40E954836F92BE24236AF2F0DA04A34653C180AF67E960086D93FD"
|
||||
"E65CB23EFD9D09374762F5981E361849AF68CDD75394FF6A4E06EB69B209E422"
|
||||
"8DB2DFA70E40F7F9750A528176647B788D0E5777A2CB8B22E3CD267FF70B4F3B"
|
||||
"02D3AAFB0E18C590A564B03188B0AA5FC48156B07622214243BD1227EFA7F2F9"
|
||||
),
|
||||
1024,
|
||||
)
|
||||
.unwrap();
|
||||
assert!(bool::from(key.primes()[1].ct_eq(&expected_prime)));
|
||||
|
||||
let _ = pkcs1v15::SigningKey::<Sha256>::from_pkcs8_pem(RSA_2048_PRIV_PEM).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn decode_rsa2048_pub_pem() {
|
||||
let key = RsaPublicKey::from_public_key_pem(RSA_2048_PUB_PEM).unwrap();
|
||||
|
||||
// Note: matches PKCS#1 test vectors
|
||||
assert_eq!(
|
||||
&key.n().to_be_bytes()[..],
|
||||
&hex!(
|
||||
"B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36"
|
||||
"E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C"
|
||||
"76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F"
|
||||
"599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332"
|
||||
"266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C"
|
||||
"575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEA"
|
||||
"C89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC"
|
||||
"90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F"
|
||||
)
|
||||
);
|
||||
let expected_e = BoxedUint::from_be_slice(&hex!("010001"), 128).unwrap();
|
||||
assert!(bool::from(key.e().ct_eq(&expected_e)));
|
||||
|
||||
let _ = pkcs1v15::VerifyingKey::<Sha256>::from_public_key_pem(RSA_2048_PUB_PEM).unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa2048_priv_pem() {
|
||||
let key = RsaPrivateKey::from_pkcs8_pem(RSA_2048_PRIV_PEM).unwrap();
|
||||
let pem = key.to_pkcs8_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_2048_PRIV_PEM)
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "encoding")]
|
||||
fn encode_rsa2048_pub_pem() {
|
||||
let key = RsaPublicKey::from_public_key_pem(RSA_2048_PUB_PEM).unwrap();
|
||||
let pem = key.to_public_key_pem(LineEnding::LF).unwrap();
|
||||
assert_eq!(&*pem, RSA_2048_PUB_PEM)
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Seeds for failure cases proptest has generated in the past. It is
|
||||
# automatically read and these particular cases re-run before any
|
||||
# novel cases are generated.
|
||||
#
|
||||
# It is recommended to check this file in to source control so that
|
||||
# everyone who runs the test benefits from these saved cases.
|
||||
cc 6eb8993a76d99005d1cb0f3d848d5390c3e0f4f2de4a7517eccfb477f74e13a0 # shrinks to private_key = RsaPrivateKey { pubkey_components: RsaPublicKey { n: NonZero(BoxedUint(0x8347C96BF9CDBB267650CB931400D5091139DB988E11C5AAF9EAC86BA5D4EA3EEBA0569077555B3FA4CE0D41300461BF8926A34B7993A48B1F3F69CAB3158DFB)), e: 65537, n_params: BoxedMontyParams { modulus: Odd(BoxedUint(0x8347C96BF9CDBB267650CB931400D5091139DB988E11C5AAF9EAC86BA5D4EA3EEBA0569077555B3FA4CE0D41300461BF8926A34B7993A48B1F3F69CAB3158DFB)), one: BoxedUint(0x7CB83694063244D989AF346CEBFF2AF6EEC6246771EE3A55061537945A2B15C1145FA96F88AAA4C05B31F2BECFFB9E4076D95CB4866C5B74E0C096354CEA7205), r2: BoxedUint(0x70E018F6DD63DB9D8182776C303A6B688E9D44CEE054FF801E11E9DEA040862E9E8EC3E4CC0FF3B0D573D09C381621AB35B7C6CDC49098E583F643AAC2238D65), r3: BoxedUint(0x1ADF6E5E9A880615C0CC586BB70BA0D657CF3F1624A68671A192471E75F4CD56A401C11B483909871F0FA8554275EA17ABA04BE17F88AF9B749F44D591277079), mod_neg_inv: Limb(0xD0EBDD5E695C8ACD) } }, d: BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000002F08B129763E3726F88CC9E2CFEFDC637B40776498C1D5480472118C3FC5A08694CCAE7DCBFD25B7850C79332F5F100111BEED9DC0A7B8D8C37EB657E4985081), primes: [BoxedUint(0x981BE188EF711A1E2C840EC3CE9A7F3B7F5BB8E81F09A5A13E00EF2F895F4213), BoxedUint(0xDCF20F8FD566A26BC0FD581259F9A2AABF0ADB6C01F2A5ADD2AEFA0DEAA5C179)], precomputed: Some(PrecomputedValues { dp: BoxedUint(0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053084D3A51F2BC9E2210C87A8CCA7B8FBFFB12D9EB2F79F1A6061E8B2583116F), dq: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007056BB46DCB044A1190D373C8D76FA186AEE7046686F218251FF19B0FDBFADB1), qinv: BoxedMontyForm { montgomery_form: BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000682511332F037EAFDE67A19620CFDC9961A7FF261F4F185D49E5EF21E2686753), params: BoxedMontyParams { modulus: Odd(BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000981BE188EF711A1E2C840EC3CE9A7F3B7F5BB8E81F09A5A13E00EF2F895F4213)), one: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006BB5F6A9EDD4349E0EF3418B86FD1D88DAF170653B6F050CAD2062140743E1EE), r2: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C67CD14A702D9D3E7D7790AE0DB96B7E2DA351552A50382262CF0D0BB51E17D), r3: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C83D6B4CE99FAFBB23D7586BA520C62B5206D43755A767BEBB5764A015BF27D), mod_neg_inv: Limb(0xC61D8CFC698327E5) } }, p_params: BoxedMontyParams { modulus: Odd(BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000981BE188EF711A1E2C840EC3CE9A7F3B7F5BB8E81F09A5A13E00EF2F895F4213)), one: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006BB5F6A9EDD4349E0EF3418B86FD1D88DAF170653B6F050CAD2062140743E1EE), r2: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003C67CD14A702D9D3E7D7790AE0DB96B7E2DA351552A50382262CF0D0BB51E17D), r3: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C83D6B4CE99FAFBB23D7586BA520C62B5206D43755A767BEBB5764A015BF27D), mod_neg_inv: Limb(0xC61D8CFC698327E5) }, q_params: BoxedMontyParams { modulus: Odd(BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000DCF20F8FD566A26BC0FD581259F9A2AABF0ADB6C01F2A5ADD2AEFA0DEAA5C179)), one: BoxedUint(0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007FFB34771D54239EC9DEDC1D2108D7D70D73B05E764B8E38EEE1014C49C29BF5), r2: BoxedUint(0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A29B3272D65244B833205BCB2F0670190F04A5C945B416487C3F470C9A6126F6), r3: BoxedUint(0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033E334261962415DBDE417A3E2844C84E5252176396B638A3873E3B5A75352DE), mod_neg_inv: Limb(0x6092436DE4BA2737) } }) }, msg = []
|
||||
Vendored
+44
@@ -0,0 +1,44 @@
|
||||
//! Property-based tests.
|
||||
|
||||
#![cfg(feature = "hazmat")]
|
||||
|
||||
use proptest::prelude::*;
|
||||
use rand::rngs::ChaCha8Rng;
|
||||
use rand_core::SeedableRng;
|
||||
use rsa::{
|
||||
pkcs1v15,
|
||||
signature::{Keypair, SignatureEncoding, Signer, Verifier},
|
||||
RsaPrivateKey,
|
||||
};
|
||||
use sha2::Sha256;
|
||||
|
||||
prop_compose! {
|
||||
// WARNING: do *NOT* copy and paste this code. It's insecure and optimized for test speed.
|
||||
fn private_key()(seed in any::<[u8; 32]>()) -> RsaPrivateKey {
|
||||
let mut rng = ChaCha8Rng::from_seed(seed);
|
||||
RsaPrivateKey::new_unchecked(&mut rng, 512).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
proptest! {
|
||||
#[test]
|
||||
fn pkcs1v15_sign_roundtrip(private_key in private_key(), msg in any::<Vec<u8>>()) {
|
||||
let signing_key = pkcs1v15::SigningKey::<Sha256>::new(private_key);
|
||||
let signature_bytes = signing_key.sign(&msg).to_bytes();
|
||||
|
||||
let verifying_key = signing_key.verifying_key();
|
||||
let signature = pkcs1v15::Signature::try_from(&*signature_bytes).unwrap();
|
||||
prop_assert!(verifying_key.verify(&msg, &signature).is_ok());
|
||||
}
|
||||
|
||||
// TODO(tarcieri): debug why these are failing
|
||||
// #[test]
|
||||
// fn pss_sign_roundtrip(private_key in private_key(), msg in any::<Vec<u8>>()) {
|
||||
// let signing_key = pss::SigningKey::<Sha256>::new(private_key);
|
||||
// let signature_bytes = signing_key.sign(&msg).to_bytes();
|
||||
//
|
||||
// let verifying_key = signing_key.verifying_key();
|
||||
// let signature = pss::Signature::try_from(&*signature_bytes).unwrap();
|
||||
// prop_assert!(verifying_key.verify(&msg, &signature).is_ok());
|
||||
// }
|
||||
}
|
||||
Vendored
+272
@@ -0,0 +1,272 @@
|
||||
//! Executes tests based on the wycheproof testsuite.
|
||||
|
||||
#![cfg(feature = "encoding")]
|
||||
|
||||
// This implementation here is based on
|
||||
// <https://github.com/ctz/graviola/blob/main/graviola/tests/wycheproof.rs>
|
||||
|
||||
use std::fs::File;
|
||||
|
||||
use pkcs1::DecodeRsaPublicKey;
|
||||
use rsa::{
|
||||
pkcs1v15, pss,
|
||||
signature::{Error as SignatureError, Verifier},
|
||||
RsaPublicKey,
|
||||
};
|
||||
use rstest::rstest;
|
||||
use serde::Deserialize;
|
||||
use sha1::Sha1;
|
||||
use sha2::{Sha224, Sha256, Sha384, Sha512};
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
struct TestFile {
|
||||
#[serde(rename(deserialize = "testGroups"))]
|
||||
groups: Vec<TestGroup>,
|
||||
header: Vec<String>,
|
||||
algorithm: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
struct TestGroup {
|
||||
#[serde(rename(deserialize = "type"))]
|
||||
typ: String,
|
||||
|
||||
#[serde(default, rename(deserialize = "publicKeyAsn"), with = "hex::serde")]
|
||||
public_key_asn: Vec<u8>,
|
||||
|
||||
#[serde(default)]
|
||||
sha: String,
|
||||
|
||||
#[serde(default, rename(deserialize = "mgfSha"))]
|
||||
mgf_sha: String,
|
||||
|
||||
#[serde(default, rename(deserialize = "sLen"))]
|
||||
salt_len: usize,
|
||||
|
||||
tests: Vec<Test>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
struct Test {
|
||||
#[serde(rename(deserialize = "tcId"))]
|
||||
#[allow(unused)] // for Debug
|
||||
id: usize,
|
||||
#[allow(unused)] // for Debug
|
||||
comment: String,
|
||||
#[serde(default, with = "hex::serde")]
|
||||
msg: Vec<u8>,
|
||||
#[serde(default, with = "hex::serde")]
|
||||
sig: Vec<u8>,
|
||||
result: ExpectedResult,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Deserialize, Debug, PartialEq)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
enum ExpectedResult {
|
||||
Valid,
|
||||
Invalid,
|
||||
Acceptable,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Summary {
|
||||
started: usize,
|
||||
skipped: usize,
|
||||
failed: usize,
|
||||
in_test: bool,
|
||||
}
|
||||
|
||||
impl Summary {
|
||||
fn new() -> Self {
|
||||
Self {
|
||||
started: 0,
|
||||
skipped: 0,
|
||||
failed: 0,
|
||||
in_test: false,
|
||||
}
|
||||
}
|
||||
|
||||
fn fail(&mut self, test: Test, res: Option<SignatureError>) {
|
||||
if self.in_test {
|
||||
eprintln!(
|
||||
" failed: {}: expected {:?}, got {:?}",
|
||||
test.id, test.result, res
|
||||
);
|
||||
self.failed += 1;
|
||||
self.in_test = false;
|
||||
}
|
||||
}
|
||||
|
||||
fn group(&mut self, group: &TestGroup) {
|
||||
println!(" group: {:?}", group.typ);
|
||||
self.in_test = false;
|
||||
}
|
||||
|
||||
fn start(&mut self, test: &Test) {
|
||||
println!(" test {}:", test.id);
|
||||
self.started += 1;
|
||||
self.in_test = true;
|
||||
}
|
||||
|
||||
fn skipped(&mut self, why: &str) {
|
||||
if self.in_test {
|
||||
println!(" skipped: {why}");
|
||||
self.skipped += 1;
|
||||
self.in_test = false;
|
||||
} else {
|
||||
println!(" skipped group: {why}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Summary {
|
||||
fn drop(&mut self) {
|
||||
let passed = self.started - self.skipped - self.failed;
|
||||
println!(
|
||||
"DONE: started {} passed {} skipped {} failed {}",
|
||||
self.started, passed, self.skipped, self.failed
|
||||
);
|
||||
assert!(passed > 0, "no tests have passed");
|
||||
|
||||
if self.failed > 0 {
|
||||
panic!("{} tests failed", self.failed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("rsa_signature_2048_sha256_test.json")]
|
||||
#[case("rsa_signature_2048_sha384_test.json")]
|
||||
#[case("rsa_signature_2048_sha512_test.json")]
|
||||
#[case("rsa_signature_3072_sha256_test.json")]
|
||||
#[case("rsa_signature_3072_sha384_test.json")]
|
||||
#[case("rsa_signature_3072_sha512_test.json")]
|
||||
#[case("rsa_signature_4096_sha256_test.json")]
|
||||
#[case("rsa_signature_4096_sha384_test.json")]
|
||||
#[case("rsa_signature_4096_sha512_test.json")]
|
||||
// #[case("rsa_signature_8192_sha256_test.json")] TODO: needs disabling of maxsize
|
||||
// #[case("rsa_signature_8192_sha384_test.json")] TODO: needs disabling of maxsize
|
||||
// #[case("rsa_signature_8192_sha512_test.json")] TODO: needs disabling of maxsize
|
||||
fn test_rsa_pkcs1_verify(#[case] file: &str) {
|
||||
let path = format!("thirdparty/wycheproof/testvectors_v1/{file}");
|
||||
let data_file = File::open(&path)
|
||||
.expect("failed to open data file (try running `git submodule update --init`)");
|
||||
|
||||
println!("Loading file: {path}");
|
||||
|
||||
let tests: TestFile = serde_json::from_reader(data_file).expect("invalid test JSON");
|
||||
|
||||
println!("{}:\n{}\n", tests.algorithm, tests.header.join(""));
|
||||
let mut summary = Summary::new();
|
||||
|
||||
for group in tests.groups {
|
||||
summary.group(&group);
|
||||
|
||||
let key = RsaPublicKey::from_pkcs1_der(&group.public_key_asn).unwrap();
|
||||
println!("key is {:?}", key);
|
||||
|
||||
for test in group.tests {
|
||||
summary.start(&test);
|
||||
|
||||
let sig = pkcs1v15::Signature::try_from(&test.sig[..]).expect("invalid signature");
|
||||
let result = match group.sha.as_ref() {
|
||||
"SHA-256" => {
|
||||
let vk = pkcs1v15::VerifyingKey::<Sha256>::new(key.clone());
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-384" => {
|
||||
let vk = pkcs1v15::VerifyingKey::<Sha384>::new(key.clone());
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-512" => {
|
||||
let vk = pkcs1v15::VerifyingKey::<Sha512>::new(key.clone());
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
other => panic!("unhandled sha {other:?}"),
|
||||
};
|
||||
|
||||
match (test.result, &result) {
|
||||
(ExpectedResult::Valid, Ok(())) => {}
|
||||
(ExpectedResult::Invalid | ExpectedResult::Acceptable, Err(_err)) => {}
|
||||
_ => summary.fail(test, result.err()),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case("rsa_pss_2048_sha256_mgf1_0_test.json")]
|
||||
#[case("rsa_pss_2048_sha256_mgf1_32_test.json")]
|
||||
#[case("rsa_pss_2048_sha384_mgf1_48_test.json")]
|
||||
#[case("rsa_pss_3072_sha256_mgf1_32_test.json")]
|
||||
#[case("rsa_pss_4096_sha256_mgf1_32_test.json")]
|
||||
#[case("rsa_pss_4096_sha384_mgf1_48_test.json")]
|
||||
#[case("rsa_pss_4096_sha512_mgf1_64_test.json")]
|
||||
#[case("rsa_pss_misc_test.json")]
|
||||
fn test_rsa_pss_verify(#[case] file: &str) {
|
||||
let path = format!("thirdparty/wycheproof/testvectors_v1/{file}");
|
||||
let data_file = File::open(&path)
|
||||
.expect("failed to open data file (try running `git submodule update --init`)");
|
||||
|
||||
println!("Loading file: {path}");
|
||||
|
||||
let tests: TestFile = serde_json::from_reader(data_file).expect("invalid test JSON");
|
||||
|
||||
println!("{}:\n{}\n", tests.algorithm, tests.header.join(""));
|
||||
let mut summary = Summary::new();
|
||||
|
||||
for group in tests.groups {
|
||||
summary.group(&group);
|
||||
|
||||
let key = rsa::RsaPublicKey::from_pkcs1_der(&group.public_key_asn).unwrap();
|
||||
println!("key is {:?}", key);
|
||||
|
||||
for test in group.tests {
|
||||
summary.start(&test);
|
||||
|
||||
if group.sha != group.mgf_sha {
|
||||
summary.skipped(&format!(
|
||||
"pss with sha={} mgf={} salt_len={} not supported",
|
||||
group.sha, group.mgf_sha, group.salt_len,
|
||||
));
|
||||
}
|
||||
let sig = pss::Signature::try_from(&test.sig[..]).expect("invalid signature");
|
||||
let result = match group.sha.as_ref() {
|
||||
"SHA-1" => {
|
||||
let vk =
|
||||
pss::VerifyingKey::<Sha1>::new_with_salt_len(key.clone(), group.salt_len);
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-256" => {
|
||||
let vk =
|
||||
pss::VerifyingKey::<Sha256>::new_with_salt_len(key.clone(), group.salt_len);
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-224" => {
|
||||
let vk =
|
||||
pss::VerifyingKey::<Sha224>::new_with_salt_len(key.clone(), group.salt_len);
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-384" => {
|
||||
let vk =
|
||||
pss::VerifyingKey::<Sha384>::new_with_salt_len(key.clone(), group.salt_len);
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
"SHA-512" => {
|
||||
let vk =
|
||||
pss::VerifyingKey::<Sha512>::new_with_salt_len(key.clone(), group.salt_len);
|
||||
vk.verify(&test.msg, &sig)
|
||||
}
|
||||
other => panic!("unhandled sha {other:?}"),
|
||||
};
|
||||
|
||||
match (test.result, &result) {
|
||||
(ExpectedResult::Valid, Ok(())) => {}
|
||||
(ExpectedResult::Invalid | ExpectedResult::Acceptable, Err(_err)) => {}
|
||||
_ => {
|
||||
summary.fail(test, result.err());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user