Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit c343de7

Browse files
committed
Add tests which use an unusual RSA Exponent value (0x01B1).
1 parent 81ab210 commit c343de7

File tree

3 files changed

+177
-0
lines changed

3 files changed

+177
-0
lines changed

src/System.Security.Cryptography.RSA/tests/EncryptDecrypt.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,40 @@ public static void DecryptSavedAnswer()
4141
Assert.Equal(TestData.HelloBytes, output);
4242
}
4343

44+
[Fact]
45+
public static void DecryptSavedAnswerUnusualExponent()
46+
{
47+
byte[] cipherBytes =
48+
{
49+
0x55, 0x64, 0x05, 0xF7, 0xBF, 0x99, 0xD8, 0x07,
50+
0xD0, 0xAC, 0x1B, 0x1B, 0x60, 0x92, 0x57, 0x95,
51+
0x5D, 0xA4, 0x5B, 0x55, 0x0E, 0x12, 0x90, 0x24,
52+
0x86, 0x35, 0xEE, 0x6D, 0xB3, 0x46, 0x3A, 0xB0,
53+
0x3D, 0x67, 0xCF, 0xB3, 0xFA, 0x61, 0xBB, 0x90,
54+
0x6D, 0x6D, 0xF8, 0x90, 0x5D, 0x67, 0xD1, 0x8F,
55+
0x99, 0x6C, 0x31, 0xA2, 0x2C, 0x8E, 0x99, 0x7E,
56+
0x75, 0xC5, 0x26, 0x71, 0xD1, 0xB0, 0xA5, 0x41,
57+
0x67, 0x19, 0xF7, 0x40, 0x04, 0xBE, 0xB2, 0xC0,
58+
0x97, 0xFB, 0xF6, 0xD4, 0xEF, 0x48, 0x5B, 0x93,
59+
0x81, 0xF8, 0xE1, 0x6A, 0x0E, 0xA0, 0x74, 0x6B,
60+
0x99, 0xC6, 0x23, 0xF5, 0x02, 0xDE, 0x47, 0x49,
61+
0x1E, 0x9D, 0xAE, 0x55, 0x20, 0xB5, 0xDE, 0xA0,
62+
0x04, 0x32, 0x37, 0x4B, 0x24, 0xE4, 0x64, 0x1B,
63+
0x1B, 0x4B, 0xC0, 0xC7, 0x30, 0x08, 0xA6, 0xAE,
64+
0x50, 0x86, 0x08, 0x34, 0x70, 0xE5, 0xB0, 0x3B,
65+
};
66+
67+
byte[] output;
68+
69+
using (var rsa = new RSACryptoServiceProvider())
70+
{
71+
rsa.ImportParameters(TestData.UnusualExponentParameters);
72+
output = rsa.Decrypt(cipherBytes, true);
73+
}
74+
75+
Assert.Equal(TestData.HelloBytes, output);
76+
}
77+
4478
[Fact]
4579
public static void RsaCryptRoundtrip()
4680
{
@@ -100,5 +134,23 @@ public static void LargeKeyCryptRoundtrip()
100134

101135
Assert.Equal(TestData.HelloBytes, output);
102136
}
137+
138+
[Fact]
139+
public static void UnusualExponentCryptRoundtrip()
140+
{
141+
byte[] crypt;
142+
byte[] output;
143+
144+
using (var rsa = new RSACryptoServiceProvider())
145+
{
146+
rsa.ImportParameters(TestData.UnusualExponentParameters);
147+
148+
crypt = rsa.Encrypt(TestData.HelloBytes, true);
149+
output = rsa.Decrypt(crypt, true);
150+
}
151+
152+
Assert.NotEqual(crypt, output);
153+
Assert.Equal(TestData.HelloBytes, output);
154+
}
103155
}
104156
}

src/System.Security.Cryptography.RSA/tests/ImportExport.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,30 @@ public static void LargeKeyImportExport()
9393
}
9494
}
9595

96+
[Fact]
97+
public static void UnusualExponentImportExport()
98+
{
99+
// Most choices for the Exponent value in an RSA key use a Fermat prime.
100+
// Since a Fermat prime is 2^(2^m) + 1, it always only has two bits set, and
101+
// frequently has the form { 0x01, [some number of 0x00s], 0x01 }, which has the same
102+
// representation in both big- and little-endian.
103+
//
104+
// The only real requirement for an Exponent value is that it be coprime to (p-1)(q-1).
105+
// So here we'll use the (non-Fermat) prime value 433 (0x01B1) to ensure big-endian export.
106+
RSAParameters unusualExponentParameters = TestData.UnusualExponentParameters;
107+
RSAParameters exported;
108+
109+
using (RSA rsa = new RSACryptoServiceProvider())
110+
{
111+
rsa.ImportParameters(unusualExponentParameters);
112+
exported = rsa.ExportParameters(true);
113+
}
114+
115+
// Exponent is the most likely to fail, the rest just otherwise ensure that Export
116+
// isn't losing data.
117+
AssertKeyEquals(ref unusualExponentParameters, ref exported);
118+
}
119+
96120
[Fact]
97121
public static void ImportReset()
98122
{

src/System.Security.Cryptography.RSA/tests/TestData.cs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,107 @@ internal class TestData
15381538
}
15391539
};
15401540

1541+
public static readonly RSAParameters UnusualExponentParameters = new RSAParameters()
1542+
{
1543+
Modulus = new byte[]
1544+
{
1545+
0xF6, 0xBA, 0x82, 0x83, 0x26, 0x0C, 0x39, 0x91,
1546+
0x1B, 0x8B, 0x5D, 0xB1, 0x8A, 0x0F, 0xF3, 0x6A,
1547+
0x78, 0xD5, 0x59, 0xA8, 0x0D, 0x64, 0x29, 0x3D,
1548+
0xD0, 0x0C, 0x35, 0x87, 0x56, 0x00, 0x9B, 0x3C,
1549+
0xE8, 0x91, 0xE1, 0xC2, 0x08, 0xAE, 0xDB, 0x9C,
1550+
0x15, 0xAB, 0xB5, 0x24, 0x94, 0x10, 0x08, 0xF7,
1551+
0x53, 0xCE, 0xD7, 0x7C, 0xCF, 0x75, 0xCF, 0x17,
1552+
0x45, 0x3F, 0x4C, 0xD1, 0x02, 0x92, 0x11, 0xCB,
1553+
0x31, 0xDF, 0xB5, 0xED, 0x6B, 0x23, 0x8F, 0x8D,
1554+
0x96, 0x37, 0x8E, 0x1A, 0x81, 0x20, 0x71, 0x49,
1555+
0x17, 0x05, 0xE0, 0x43, 0x1D, 0xA4, 0xD7, 0x7B,
1556+
0xB9, 0x99, 0x0A, 0xA9, 0x0B, 0x2F, 0x80, 0x89,
1557+
0x9B, 0xF1, 0x79, 0xDA, 0xC9, 0x50, 0xF6, 0xD5,
1558+
0x2D, 0xBC, 0xBF, 0xAF, 0xDA, 0x2D, 0xEF, 0x2A,
1559+
0x35, 0x29, 0xC5, 0xBC, 0x88, 0x32, 0xE5, 0xAD,
1560+
0x4E, 0x5C, 0x8F, 0x5C, 0xD0, 0x1E, 0x8E, 0x93,
1561+
},
1562+
Exponent = new byte[]
1563+
{
1564+
0x01, 0xB1,
1565+
},
1566+
D = new byte[]
1567+
{
1568+
0x7D, 0x5B, 0xCE, 0x6E, 0x62, 0x8E, 0x31, 0x59,
1569+
0xB0, 0x94, 0xD9, 0xE0, 0x69, 0x9E, 0xDD, 0xD1,
1570+
0x96, 0xAB, 0x11, 0xC3, 0xF1, 0x85, 0x11, 0xFF,
1571+
0x7A, 0xD9, 0xDC, 0x86, 0xFA, 0x9F, 0xF0, 0x47,
1572+
0x26, 0x59, 0x7D, 0xEF, 0xE3, 0x4D, 0x9B, 0xEB,
1573+
0xFA, 0x74, 0xCD, 0x8C, 0xF7, 0xDD, 0x94, 0x39,
1574+
0x14, 0xB4, 0xC4, 0xFC, 0x9B, 0x11, 0xE1, 0x3C,
1575+
0xE5, 0x1A, 0xD7, 0x36, 0xC2, 0x0B, 0x8B, 0xB2,
1576+
0x82, 0x93, 0x62, 0x80, 0x02, 0x30, 0xAF, 0x15,
1577+
0x9E, 0x5A, 0x39, 0x7C, 0x6F, 0xCA, 0x09, 0xC9,
1578+
0xD8, 0xC5, 0x21, 0x88, 0x8D, 0x52, 0xEE, 0x3A,
1579+
0x50, 0x4D, 0xB3, 0xFA, 0xA0, 0x88, 0x0D, 0x67,
1580+
0xDE, 0x9D, 0x68, 0x32, 0x03, 0xC8, 0x35, 0xCE,
1581+
0x73, 0x38, 0x19, 0xED, 0x38, 0xFE, 0xD2, 0x5C,
1582+
0xD6, 0x12, 0xF0, 0x17, 0x33, 0x99, 0x0D, 0x1F,
1583+
0xFB, 0x3D, 0xA1, 0x35, 0x24, 0x03, 0x16, 0xB1,
1584+
},
1585+
P = new byte[]
1586+
{
1587+
0xFE, 0xF8, 0x94, 0xF4, 0xC5, 0x2D, 0x9A, 0xA9,
1588+
0xA5, 0x40, 0x6E, 0x27, 0xE9, 0x27, 0x46, 0xCF,
1589+
0x29, 0xB4, 0xBD, 0x93, 0xE1, 0x99, 0x29, 0xA5,
1590+
0xDA, 0x8B, 0x76, 0x28, 0xE3, 0xD1, 0x84, 0xFF,
1591+
0x00, 0x19, 0xFD, 0xD3, 0x8C, 0x41, 0xDE, 0xF9,
1592+
0x63, 0xC6, 0x7C, 0x85, 0x5A, 0x70, 0x37, 0x6F,
1593+
0x6D, 0x9C, 0x96, 0x4A, 0xD8, 0x0C, 0x37, 0x1D,
1594+
0x04, 0xB4, 0xAB, 0x34, 0x41, 0xC0, 0x72, 0x8D,
1595+
},
1596+
DP = new byte[]
1597+
{
1598+
0x74, 0x00, 0xC3, 0x79, 0x69, 0xAC, 0x1A, 0x06,
1599+
0x3C, 0x67, 0x37, 0x70, 0x29, 0xA2, 0x20, 0xCE,
1600+
0x95, 0xA2, 0xA3, 0x1C, 0x42, 0x93, 0x22, 0x51,
1601+
0xF6, 0x0D, 0xC9, 0x90, 0x88, 0xC2, 0x0E, 0xFB,
1602+
0xFF, 0x74, 0x78, 0xCD, 0x9F, 0x97, 0x2B, 0x81,
1603+
0x6D, 0x3F, 0x1B, 0xAE, 0xC7, 0x00, 0xCC, 0xF4,
1604+
0x06, 0xB5, 0xCC, 0xF3, 0x58, 0x3E, 0x50, 0xA6,
1605+
0x54, 0x52, 0x32, 0xB2, 0x15, 0xA3, 0x3B, 0xCD,
1606+
},
1607+
Q = new byte[]
1608+
{
1609+
0xF7, 0xB9, 0x69, 0x93, 0xFA, 0x16, 0x23, 0x46,
1610+
0x31, 0x27, 0x4A, 0xBB, 0x5A, 0x34, 0xD3, 0xB8,
1611+
0x4A, 0xD1, 0xCC, 0xE7, 0x21, 0x3D, 0x66, 0xEC,
1612+
0x68, 0x90, 0x92, 0xD9, 0xDB, 0x1F, 0x01, 0xBD,
1613+
0x02, 0xC9, 0x3E, 0x14, 0x82, 0x6A, 0x47, 0x8E,
1614+
0xC4, 0x47, 0xD8, 0x48, 0x79, 0x74, 0x66, 0x7F,
1615+
0x68, 0x08, 0x7E, 0x77, 0x39, 0x24, 0x80, 0xF3,
1616+
0x16, 0x83, 0x89, 0xC8, 0x1C, 0x6F, 0x4D, 0x9F,
1617+
},
1618+
DQ = new byte[]
1619+
{
1620+
0x32, 0xEA, 0xFC, 0xDE, 0x90, 0x39, 0xC2, 0xAB,
1621+
0x1A, 0x10, 0xF1, 0xCC, 0xA4, 0x92, 0xD6, 0xF8,
1622+
0xF2, 0x68, 0x9C, 0x38, 0xF7, 0x75, 0xDB, 0xCE,
1623+
0x72, 0xE7, 0xEA, 0x28, 0x0C, 0x85, 0x7C, 0x83,
1624+
0xAC, 0x07, 0x12, 0xAC, 0x1F, 0x89, 0x22, 0x37,
1625+
0xF3, 0x22, 0x47, 0x0F, 0x7C, 0xE1, 0x88, 0x5B,
1626+
0x38, 0xDB, 0x50, 0xFA, 0x5A, 0x60, 0xC7, 0x24,
1627+
0x5D, 0xE7, 0x02, 0x4E, 0x60, 0xE4, 0x9F, 0x9F,
1628+
},
1629+
InverseQ = new byte[]
1630+
{
1631+
0xB1, 0xE1, 0x44, 0xDD, 0xFB, 0x21, 0xA7, 0xF8,
1632+
0x54, 0x8E, 0x05, 0x1D, 0x11, 0x2B, 0xC3, 0xE3,
1633+
0x56, 0x29, 0x17, 0xEB, 0xD9, 0x9B, 0x3D, 0xAA,
1634+
0xBA, 0x8E, 0x55, 0x68, 0x00, 0xD8, 0x10, 0x04,
1635+
0xD6, 0x53, 0x8D, 0xE4, 0xBE, 0x81, 0xF6, 0x20,
1636+
0x73, 0xF3, 0x7C, 0xAB, 0xB4, 0x61, 0x2D, 0xD8,
1637+
0x81, 0x32, 0x0C, 0x1C, 0xFD, 0xCB, 0xB0, 0xAB,
1638+
0x22, 0x5F, 0x7B, 0x41, 0xD8, 0x32, 0x59, 0xA3,
1639+
},
1640+
};
1641+
15411642
public static readonly RSAParameters CspTestKey = new RSAParameters
15421643
{
15431644
Modulus = ByteUtils.HexToByteArray("e06aac9ec3e98bae9ebaf921eb7898f34a58a6a4f6370a9d767cd1f0492e7969b4defdb11b1795a63fefb3359b55c392ecb22f5791e1d925ea5cf74bc5094ddc0164ebb021028423151c7641181940112b0d46e9562d3cec8364d58be8d9c84910e196fa458f633cf6431354df98b773c32c0cf6d18147222a96824b64019ae1"),

0 commit comments

Comments
 (0)