class FilePublicKeyProvider extends AbstractKeyPairProvider {

  public Iterable<KeyPair> loadKeys() {
    if (!SecurityUtils.isBouncyCastleRegistered()) {
      throw new IllegalStateException("BouncyCastle must be registered as a JCE provider");
    }
    List<KeyPair> keys = new ArrayList<KeyPair>();
    for (String file : files) {
      try {
          Object o = KeyPairUtils.readKey(new InputStreamReader(new FileInputStream(file)));
          if (o instanceof KeyPair) {
            keys.add(new KeyPair(((KeyPair)o).getPublic(), null));
          } else if (o instanceof PublicKey) {
            keys.add(new KeyPair((PublicKey)o, null));
          } else if (o instanceof PEMKeyPair) {
            PEMKeyPair keyPair = (PEMKeyPair)o;
            keys.add(convertPemKeyPair(keyPair));
          } else if (o instanceof SubjectPublicKeyInfo) {
            PEMKeyPair keyPair = new PEMKeyPair((SubjectPublicKeyInfo) o, null);
            keys.add(convertPemKeyPair(keyPair));
          } else {
            throw new UnsupportedOperationException(String.format("Key type %s not supported.", o.getClass().getName()));
          }
      }
      catch (Exception e) {
        LOG.info("Unable to read key {}: {}", file, e);
      }
    }
    return keys;
  }

}

class FilePublicKeyProviderTest {

  @Test
  public void test() {

    String pubKeyFile = Thread.currentThread().getContextClassLoader().getResource("test_authorized_key.pem").getFile();
    assertTrue(new File(pubKeyFile).exists());
    FilePublicKeyProvider SUT = new FilePublicKeyProvider(new String[]{pubKeyFile});
    assertTrue(SUT.loadKeys().iterator().hasNext());
  }

}