@@ -22,6 +22,8 @@ public class PublicKeyPacket
2222 extends ContainedPacket
2323 implements PublicKeyAlgorithmTags
2424{
25+ public final static int MAX_LEN = 2 * 1024 * 1024 ; // 2mb; McEliece keys can get ~1mb in size, so allow some margin
26+
2527 /**
2628 * OpenPGP v3 keys are deprecated.
2729 * They can only be used with RSA.
@@ -150,6 +152,10 @@ public class PublicKeyPacket
150152 {
151153 // TODO: Use keyOctets to be able to parse unknown keys
152154 keyOctets = StreamUtil .read4OctetLength (in );
155+ if (keyOctets < 0 )
156+ {
157+ throw new MalformedPacketException ("Octet length cannot be negative." );
158+ }
153159 }
154160
155161 parseKey (in , algorithm , keyOctets );
@@ -166,49 +172,56 @@ private void parseKey(BCPGInputStream in, int algorithmId, long optLen)
166172 throws IOException
167173 {
168174
169- switch ( algorithmId )
175+ try
170176 {
171- case RSA_ENCRYPT :
172- case RSA_GENERAL :
173- case RSA_SIGN :
174- key = new RSAPublicBCPGKey (in );
175- break ;
176- case DSA :
177- key = new DSAPublicBCPGKey (in );
178- break ;
179- case ELGAMAL_ENCRYPT :
180- case ELGAMAL_GENERAL :
181- key = new ElGamalPublicBCPGKey (in );
182- break ;
183- case ECDH :
184- key = new ECDHPublicBCPGKey (in );
185- break ;
186- case X25519 :
187- key = new X25519PublicBCPGKey (in );
188- break ;
189- case X448 :
190- key = new X448PublicBCPGKey (in );
191- break ;
192- case ECDSA :
193- key = new ECDSAPublicBCPGKey (in );
194- break ;
195- case EDDSA_LEGACY :
196- key = new EdDSAPublicBCPGKey (in );
197- break ;
198- case Ed25519 :
199- key = new Ed25519PublicBCPGKey (in );
200- break ;
201- case Ed448 :
202- key = new Ed448PublicBCPGKey (in );
203- break ;
204- default :
205- if (version == VERSION_6 || version == LIBREPGP_5 )
177+ switch (algorithmId )
206178 {
207- // with version 5 & 6, we can gracefully handle unknown key types, as the length is known.
208- key = new UnknownBCPGKey ((int ) optLen , in );
179+ case RSA_ENCRYPT :
180+ case RSA_GENERAL :
181+ case RSA_SIGN :
182+ key = new RSAPublicBCPGKey (in );
183+ break ;
184+ case DSA :
185+ key = new DSAPublicBCPGKey (in );
186+ break ;
187+ case ELGAMAL_ENCRYPT :
188+ case ELGAMAL_GENERAL :
189+ key = new ElGamalPublicBCPGKey (in );
190+ break ;
191+ case ECDH :
192+ key = new ECDHPublicBCPGKey (in );
193+ break ;
194+ case X25519 :
195+ key = new X25519PublicBCPGKey (in );
196+ break ;
197+ case X448 :
198+ key = new X448PublicBCPGKey (in );
209199 break ;
200+ case ECDSA :
201+ key = new ECDSAPublicBCPGKey (in );
202+ break ;
203+ case EDDSA_LEGACY :
204+ key = new EdDSAPublicBCPGKey (in );
205+ break ;
206+ case Ed25519 :
207+ key = new Ed25519PublicBCPGKey (in );
208+ break ;
209+ case Ed448 :
210+ key = new Ed448PublicBCPGKey (in );
211+ break ;
212+ default :
213+ if (version == VERSION_6 || version == LIBREPGP_5 )
214+ {
215+ // with version 5 & 6, we can gracefully handle unknown key types, as the length is known.
216+ key = new UnknownBCPGKey ((int )optLen , in );
217+ break ;
218+ }
219+ throw new IOException ("unknown PGP public key algorithm encountered: " + algorithm );
210220 }
211- throw new IOException ("unknown PGP public key algorithm encountered: " + algorithm );
221+ }
222+ catch (RuntimeException e )
223+ {
224+ throw new MalformedPacketException ("Malformed PGP key." , e );
212225 }
213226 }
214227
0 commit comments