Skip to content

Commit 56d5254

Browse files
committed
Tighten private key checking to reveal padding issue
1 parent 3ec45e1 commit 56d5254

File tree

3 files changed

+36
-27
lines changed

3 files changed

+36
-27
lines changed

src/Renci.SshNet/Security/Cryptography/DsaKey.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,19 @@ public DsaKey(byte[] privateKeyData)
113113
{
114114
ThrowHelper.ThrowIfNull(privateKeyData);
115115

116-
var der = new AsnReader(privateKeyData, AsnEncodingRules.DER).ReadSequence();
117-
_ = der.ReadInteger(); // skip version
116+
var keyReader = new AsnReader(privateKeyData, AsnEncodingRules.DER);
117+
var sequenceReader = keyReader.ReadSequence();
118+
keyReader.ThrowIfNotEmpty();
118119

119-
P = der.ReadInteger();
120-
Q = der.ReadInteger();
121-
G = der.ReadInteger();
122-
Y = der.ReadInteger();
123-
X = der.ReadInteger();
120+
_ = sequenceReader.ReadInteger(); // skip version
124121

125-
der.ThrowIfNotEmpty();
122+
P = sequenceReader.ReadInteger();
123+
Q = sequenceReader.ReadInteger();
124+
G = sequenceReader.ReadInteger();
125+
Y = sequenceReader.ReadInteger();
126+
X = sequenceReader.ReadInteger();
127+
128+
sequenceReader.ThrowIfNotEmpty();
126129

127130
DSA = LoadDSA();
128131
}

src/Renci.SshNet/Security/Cryptography/EcdsaKey.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,18 +218,21 @@ public EcdsaKey(string curve, byte[] publickey, byte[] privatekey)
218218
/// <param name="data">DER encoded private key data.</param>
219219
public EcdsaKey(byte[] data)
220220
{
221-
var der = new AsnReader(data, AsnEncodingRules.DER).ReadSequence();
222-
_ = der.ReadInteger(); // skip version
221+
var keyReader = new AsnReader(data, AsnEncodingRules.DER);
222+
var sequenceReader = keyReader.ReadSequence();
223+
keyReader.ThrowIfNotEmpty();
223224

224-
var privatekey = der.ReadOctetString().TrimLeadingZeros();
225+
_ = sequenceReader.ReadInteger(); // skip version
225226

226-
var s0 = der.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true));
227+
var privatekey = sequenceReader.ReadOctetString().TrimLeadingZeros();
228+
229+
var s0 = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true));
227230
var curve = s0.ReadObjectIdentifier();
228231

229-
var s1 = der.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 1, isConstructed: true));
232+
var s1 = sequenceReader.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 1, isConstructed: true));
230233
var pubkey = s1.ReadBitString(out _);
231234

232-
der.ThrowIfNotEmpty();
235+
sequenceReader.ThrowIfNotEmpty();
233236

234237
_impl = Import(curve, pubkey, privatekey);
235238
}

src/Renci.SshNet/Security/Cryptography/RsaKey.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,22 @@ public RsaKey(byte[] privateKeyData)
161161
{
162162
ThrowHelper.ThrowIfNull(privateKeyData);
163163

164-
var der = new AsnReader(privateKeyData, AsnEncodingRules.DER).ReadSequence();
165-
_ = der.ReadInteger(); // skip version
166-
167-
Modulus = der.ReadInteger();
168-
Exponent = der.ReadInteger();
169-
D = der.ReadInteger();
170-
P = der.ReadInteger();
171-
Q = der.ReadInteger();
172-
DP = der.ReadInteger();
173-
DQ = der.ReadInteger();
174-
InverseQ = der.ReadInteger();
175-
176-
der.ThrowIfNotEmpty();
164+
var keyReader = new AsnReader(privateKeyData, AsnEncodingRules.DER);
165+
var sequenceReader = keyReader.ReadSequence();
166+
keyReader.ThrowIfNotEmpty();
167+
168+
_ = sequenceReader.ReadInteger(); // skip version
169+
170+
Modulus = sequenceReader.ReadInteger();
171+
Exponent = sequenceReader.ReadInteger();
172+
D = sequenceReader.ReadInteger();
173+
P = sequenceReader.ReadInteger();
174+
Q = sequenceReader.ReadInteger();
175+
DP = sequenceReader.ReadInteger();
176+
DQ = sequenceReader.ReadInteger();
177+
InverseQ = sequenceReader.ReadInteger();
178+
179+
sequenceReader.ThrowIfNotEmpty();
177180

178181
RSA = RSA.Create();
179182
RSA.ImportParameters(GetRSAParameters());

0 commit comments

Comments
 (0)