@@ -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