Skip to content

Commit f49e57f

Browse files
Merge pull request #37 from Mastercard/fix/tag-length
Fix RSA parameter lengths
2 parents 4068459 + d768338 commit f49e57f

File tree

4 files changed

+55
-6
lines changed

4 files changed

+55
-6
lines changed

Mastercard.Developer.ClientEncryption.Core/Utils/RsaKeyUtils.cs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,31 @@ private static RSA ReadPkcs1Key(byte[] pkcs1Bytes)
148148
throw new ArgumentException("Failed to parse PKCS#1 key, 0x00 was expected!");
149149
}
150150

151+
byte[] padded(byte[] array, int totalLength)
152+
{
153+
var currentLength = array.Length;
154+
if(currentLength >= totalLength) {
155+
return array;
156+
}
157+
158+
var paddedArray = new byte[totalLength];
159+
Array.Copy(array, 0, paddedArray, totalLength - currentLength, currentLength);
160+
161+
return paddedArray;
162+
}
163+
151164
var modulus = reader.ReadBytes(GetIntegerSize(reader));
165+
166+
var modulusLength = modulus.Length;
167+
var modulusHalfLength = (modulus.Length + 1) / 2; // half length rounded up
168+
152169
var publicExponent = reader.ReadBytes(GetIntegerSize(reader));
153-
var privateExponent = reader.ReadBytes(GetIntegerSize(reader));
154-
var prime1 = reader.ReadBytes(GetIntegerSize(reader));
155-
var prime2 = reader.ReadBytes(GetIntegerSize(reader));
156-
var exponent1 = reader.ReadBytes(GetIntegerSize(reader));
157-
var exponent2 = reader.ReadBytes(GetIntegerSize(reader));
158-
var coefficient = reader.ReadBytes(GetIntegerSize(reader));
170+
var privateExponent = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusLength);
171+
var prime1 = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusHalfLength);
172+
var prime2 = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusHalfLength);
173+
var exponent1 = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusHalfLength);
174+
var exponent2 = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusHalfLength);
175+
var coefficient = padded(reader.ReadBytes(GetIntegerSize(reader)), modulusHalfLength);
159176

160177
var rsa = CreateRsa();
161178
rsa.ImportParameters(new RSAParameters

Mastercard.Developer.ClientEncryption.Tests/Mastercard.Developer.ClientEncryption.Tests.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@
6868
<Link>_Resources\Keys\Pkcs1\test_key_pkcs1-2048.pem</Link>
6969
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
7070
</EmbeddedResource>
71+
<EmbeddedResource Include=".\Tests\_Resources\Keys\Pkcs1\test_key_pkcs1-2048_uneven_length.pem">
72+
<Link>_Resources\Keys\Pkcs1\test_key_pkcs1-2048_uneven_length.pem</Link>
73+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
74+
</EmbeddedResource>
7175
<EmbeddedResource Include=".\Tests\_Resources\Keys\Pkcs1\test_key_pkcs1-4096.pem">
7276
<Link>_Resources\Keys\Pkcs1\test_key_pkcs1-4096.pem</Link>
7377
<CopyToOutputDirectory>Always</CopyToOutputDirectory>

Mastercard.Developer.ClientEncryption.Tests/Tests/Utils/RsaKeyUtilsTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public void TestReadPrivateKeyFile(string keyPath, int expectedKeySize)
4444
[DataRow("./_Resources/Keys/Pkcs1/test_key_pkcs1-512.pem", 512)]
4545
[DataRow("./_Resources/Keys/Pkcs1/test_key_pkcs1-1024.pem", 1024)]
4646
[DataRow("./_Resources/Keys/Pkcs1/test_key_pkcs1-2048.pem", 2048)]
47+
[DataRow("./_Resources/Keys/Pkcs1/test_key_pkcs1-2048_uneven_length.pem", 2048)]
4748
[DataRow("./_Resources/Keys/Pkcs1/test_key_pkcs1-4096.pem", 4096)]
4849
public void TestReadPrivateKey(string keyPath, int expectedKeySize)
4950
{
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpAIBAAKCAQEAvyWF3MO6BkKPopRSKWHTTutHMd19BrTEhHoR1UDu6T5eJj7M
3+
+/iAFr7+Or7WxykNi7tqZ5HIcLYNbgvxhpaTNATg+gYA975LhixGafjFIR4Npxux
4+
ub4FRiHMQLB9I+xtjPkT5YCK4W0FGq6WAlQdqmbkGA+tPgkwEPTUUzYddsfXExIh
5+
FYAtOUHGnvbpcUUzsAo8VEd2n5b0+BPybC/2CZkNe6DEztVWQmw+/S/7mzE1XMEZ
6+
ECo9blPkuPeZseWtvZQiV1SqPLww0tPzJDT31rZKXcXfF84SMs5VMqBBMgxi3Lqs
7+
SXoGLjVZIq1sZzulw/MfzMf4CnkvptOuHpQUOQIDAQABAoIBAQCNUyno8tGsZS7u
8+
vakNraV1OSGXbcJN3gNaS4K54FuEGje0IUSfm7jgmHARcR4NfH3mbTgbwT6ojwHn
9+
hNTrhJLrqBvK3/uBMLJYTo31NhhSBw1jG2fJBASUONLylUrA78KDs3kRe3uzdk6K
10+
zrBZmM2iOpa0b4rQTiy6rLn7mAwq0Ad59gHMyY63m9wCgKrD12ZFP5x8K56RHxQr
11+
NlqzafqVvboNSQ9XSLat/GgT1aEGcFqXyd1R/3T+wScAX5QkUb4YI2Y5xVlbwxvb
12+
er4s0hMpUAhDte6oRK6AIwCmg+G9WBJEiwZ8u4/5o3QZiBxwgENCXyvEjzBYV1Vi
13+
q9vwcnqtAoGBAPXArBqnJUXtCP1fsEVNJbgCT4HiZxqeZVh345MJLTkm38eBqAKf
14+
7Lr5RzTDnNlzY2qFqwinDYtD1kC8AcvLPt/MEzApPKC9/8oVi62v0sSdrglzICLg
15+
7WREwQ9W4dffqiXF12Bev1RDDMAUTXiZnslQlInp4BPuJrpcUplMGjtXAoGBAMcd
16+
8vpwbfUg3/4VQ+XTOZZKz8tF7KMcpqoWoHZpkv3kawIiVygILp162AKBPCMz/Nmg
17+
k5KNvfef9k3gcSu6D8EMLnec7EUa/FSoMDqjBzI3h+DIrNAVaA2siBVNc9I0KMT7
18+
YxJk5iFR9+oBl/BrLT+Xw3aS7Z0C17lwjuYrYALvAoGAAP5jc8QjQXIg7C1b4Bvc
19+
wC66NZM9yXzEeiQZ9nk+BpIiq4LZtBEDewoRAKSd2L8/sqmRtHpAcsS2K4jp1PIg
20+
cfU4SqSQCzJZe2603uHsH0Fn97/QbHOuYg5pHW/DgAT2giqXoVsguO2AerJaUdeF
21+
Ldk2kIwyjMIUxAIlj1sgbAcCgYBDEbB1cQdoqSEp2YncURC1sg9aHfyAyeNE5ug3
22+
2onboWP1/RE0d8UT4HwAI/3Ysbs6pt7uX3YcgbIaOz6DhxGlafAA9EeVY2iZL2nH
23+
ZoCXBqNrMM0c7gj1iibwXf1kUZNl/nM5j+kAUjbaiJzgK4m7QOhi+Uy2NW3qlaJc
24+
n0Gg2wKBgQCqWjP97Dwv0nyr3vnM+49B7BL7PYldjIy2RCwHYCN/JwfaihLt+EZ1
25+
ZhCDk9S0aANGjKrZB8bUdGq9DY6cPO4QJjmtfVmdHWT8XIP5mrYbUob4fTvcP1UH
26+
nN/hiGpa1AvhNoU4MQ2OGiK87mBPtfD5nwQh6aNnvglmFUjpL6FaWA==
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)