Skip to content

Commit 5e613d2

Browse files
committed
Reuse parseEphemeralKeyAndKeyEnc methods
1 parent e0222af commit 5e613d2

1 file changed

Lines changed: 11 additions & 56 deletions

File tree

‎pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPublicKeyDataDecryptorFactory.java‎

Lines changed: 11 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -167,22 +167,9 @@ private byte[] recoverECDHSessionData(byte[][] secKeyData,
167167
AsymmetricKeyParameter privKey)
168168
throws PGPException, IOException, InvalidCipherTextException
169169
{
170-
byte[] enc = secKeyData[0];
171-
byte[] pEnc;
172-
byte[] keyEnc;
173-
// the two length octets themselves
174-
checkRange(2, enc);
175-
int pLen = ((((enc[0] & 0xff) << 8) + (enc[1] & 0xff)) + 7) / 8;
176-
checkRange(2 + pLen + 1, enc);
177-
178-
pEnc = new byte[pLen];
179-
System.arraycopy(enc, 2, pEnc, 0, pLen);
180-
181-
int keyLen = enc[pLen + 2] & 0xff;
182-
checkRange(2 + pLen + 1 + keyLen, enc);
183-
184-
keyEnc = new byte[keyLen];
185-
System.arraycopy(enc, 2 + pLen + 1, keyEnc, 0, keyLen);
170+
byte[][] pEncAndKeyEnc = parseECDHEncSessionKey(secKeyData[0]);
171+
byte[] pEnc = pEncAndKeyEnc[0];
172+
byte[] keyEnc = pEncAndKeyEnc[1];
186173

187174
byte[] secret;
188175
RFC6637KDFCalculator rfc6637KDFCalculator;
@@ -246,26 +233,10 @@ private byte[] recoverX448SessionData(byte[][] secKeyData,
246233
AsymmetricKeyParameter privKey)
247234
throws PGPException, InvalidCipherTextException
248235
{
249-
byte[] enc = secKeyData[0];
250-
int pLen = X448PublicBCPGKey.LENGTH;
251-
byte[] ephemeralKey = Arrays.copyOf(enc, pLen);
252-
253-
// size of following fields
254-
checkRange(pLen + 1, enc);
255-
int size = enc[pLen] & 0xff;
256-
checkRange(pLen + 1 + size, enc);
257-
258-
// encrypted session key
259-
boolean includesSesKeyAlg = containsSKAlg(pkeskVersion);
260-
if (includesSesKeyAlg && size < 1)
261-
{
262-
// a v3 PKESK's size octet covers the symmetric algorithm octet plus the wrapped key, so a
263-
// declared size of zero leaves no room for it - guard before the length arithmetic underflows
264-
throw new PGPException("encoded length out of range");
265-
}
266-
int sesKeyLen = size - (includesSesKeyAlg ? 1 : 0);
267-
int sesKeyOff = pLen + 1 + (includesSesKeyAlg ? 1 : 0);
268-
byte[] keyEnc = Arrays.copyOfRange(enc, sesKeyOff, sesKeyOff + sesKeyLen);
236+
byte[][] ephemeralKeyAndKeyEnc = parseXDHEncSessionKey(secKeyData[0], X448PublicBCPGKey.LENGTH,
237+
containsSKAlg(pkeskVersion));
238+
byte[] ephemeralKey = ephemeralKeyAndKeyEnc[0];
239+
byte[] keyEnc = ephemeralKeyAndKeyEnc[1];
269240

270241
byte[] secret = getCryptoCallback(privKey).decrypt(PublicKeyAlgorithmTags.X448, new X448PublicKeyParameters(ephemeralKey));
271242

@@ -281,26 +252,10 @@ private byte[] recoverX25519SessionData(byte[][] secKeyData,
281252
AsymmetricKeyParameter privKey)
282253
throws PGPException, InvalidCipherTextException
283254
{
284-
byte[] enc = secKeyData[0];
285-
int pLen = X25519PublicBCPGKey.LENGTH;
286-
byte[] ephemeralKey = Arrays.copyOf(enc, pLen);
287-
288-
// size of following fields
289-
checkRange(pLen + 1, enc);
290-
int size = enc[pLen] & 0xff;
291-
checkRange(pLen + 1 + size, enc);
292-
293-
// encrypted session key
294-
boolean includesSesKeyAlg = containsSKAlg(pkeskVersion);
295-
if (includesSesKeyAlg && size < 1)
296-
{
297-
// a v3 PKESK's size octet covers the symmetric algorithm octet plus the wrapped key, so a
298-
// declared size of zero leaves no room for it - guard before the length arithmetic underflows
299-
throw new PGPException("encoded length out of range");
300-
}
301-
int sesKeyLen = size - (includesSesKeyAlg ? 1 : 0);
302-
int sesKeyOff = pLen + 1 + (includesSesKeyAlg ? 1 : 0);
303-
byte[] keyEnc = Arrays.copyOfRange(enc, sesKeyOff, sesKeyOff + sesKeyLen);
255+
byte[][] ephemeralKeyAndKeyEnc = parseXDHEncSessionKey(secKeyData[0], X25519PublicBCPGKey.LENGTH,
256+
containsSKAlg(pkeskVersion));
257+
byte[] ephemeralKey = ephemeralKeyAndKeyEnc[0];
258+
byte[] keyEnc = ephemeralKeyAndKeyEnc[1];
304259

305260
byte[] secret = getCryptoCallback(privKey)
306261
.decrypt(PublicKeyAlgorithmTags.X25519, new X25519PublicKeyParameters(ephemeralKey));

0 commit comments

Comments
 (0)