try { fis = new FileInputStream(path); keys = KeyParser.parsePublicKeys( fis, new Base64Decoder() {
protected static PublicKey parsePublicKeyDsa(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException { // name is also included in bytes ByteBuffer byteBuffer = ByteBuffer.wrap(keyBytes); int nameLength = byteBuffer.getInt(); byteBuffer.position(nameLength + LENGTH_LENGTH); BigInteger p = readNext(byteBuffer); BigInteger q = readNext(byteBuffer); BigInteger g = readNext(byteBuffer); BigInteger y = readNext(byteBuffer); return createPubKeyDsa(y, p, q, g); }
protected static PublicKey parsePublicKeyEcdsa(String name, byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException, IOException, NoSuchProviderException { ByteBuffer byteBuffer = ByteBuffer.wrap(keyBytes); // https://security.stackexchange.com/questions/129910/ecdsa-why-do-ssh-keygen-and-java-generated-public-keys-have-different-sizes final int coordLength = EC_NAME_TO_COORD_SIZE.get(name); byteBuffer.position(keyBytes.length - 2*coordLength); byte[] xBytes = new byte[coordLength]; byteBuffer.get(xBytes); BigInteger x = new BigInteger(1, xBytes); byteBuffer.position(keyBytes.length - coordLength); byte[] yBytes = new byte[coordLength]; byteBuffer.get(yBytes); BigInteger y = new BigInteger(1, yBytes); return createPubKeyEcdsa(name, x, y); }
protected static PublicKey parsePublicKeyRsa(byte[] keyBytes) throws InvalidKeySpecException, NoSuchAlgorithmException { // name is also included in bytes ByteBuffer byteBuffer = ByteBuffer.wrap(keyBytes); int nameLength = byteBuffer.getInt(); byteBuffer.position(nameLength + LENGTH_LENGTH); BigInteger exponent = readNext(byteBuffer); BigInteger modulus = readNext(byteBuffer); return createPubKeyRsa(exponent, modulus); }
key = parsePublicKeyRsa(keyBytes); } else if (NAME_DSA.equals(name)) { key = parsePublicKeyDsa(keyBytes); } else if (NAME_ECDSA_256.equals(name)) { key = parsePublicKeyEcdsa(name, keyBytes); } else if (NAME_ECDSA_384.equals(name)) { key = parsePublicKeyEcdsa(name, keyBytes); } else if (NAME_ECDSA_521.equals(name)) { key = parsePublicKeyEcdsa(name, keyBytes);
@Test public void parsePubKeyEcdsa521() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/ecdsa.key.pub.521"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); assertsEcdsaKey521((ECPublicKey)keys.get(0)); }
@Test public void noSpaceInKey() throws Exception { String key = "no-space"; InputStream is = new ByteArrayInputStream(key.getBytes("UTF8")); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); Assert.assertTrue(keys.isEmpty()); }
@Test public void parsePubKeyEcdsa() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/ecdsa.key.pub"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); assertsEcdsaKey((ECPublicKey)keys.get(0)); }
@Test public void parsePubKeyEcdsa384() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/ecdsa.key.pub.384"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); assertsEcdsaKey384((ECPublicKey)keys.get(0)); }
@Test public void parsePubKeyRsa() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/rsa.key.pub"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); assertsRsaKey((RSAPublicKey)keys.get(0)); }
@Test public void parsePubKeyDsa() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/dsa.key.pub"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); assertsDsaKey((DSAPublicKey)keys.get(0)); }
@Test public void parseAuthorizedKeys() throws Exception { InputStream is = getClass().getResourceAsStream("/keys/authorized_keys"); List<PublicKey> keys = KeyParser.parsePublicKeys(is, new CommonsBase64Decoder()); Assert.assertEquals(5, keys.size()); assertsRsaKey((RSAPublicKey)keys.get(0)); assertsDsaKey((DSAPublicKey)keys.get(1)); assertsEcdsaKey((ECPublicKey)keys.get(2)); assertsEcdsaKey384((ECPublicKey)keys.get(3)); assertsEcdsaKey521((ECPublicKey)keys.get(4)); }