package org.primftpd.pojo; import org.apache.commons.codec.binary.Base64; import org.junit.Assert; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigInteger; import java.security.PublicKey; import java.security.interfaces.DSAPublicKey; import java.security.interfaces.ECPublicKey; import java.security.interfaces.RSAPublicKey; import java.util.List; public class KeyParserTests { @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 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 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 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 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)); } protected void assertsRsaKey(RSAPublicKey pubKey) { Assert.assertEquals(new BigInteger("65537"), pubKey.getPublicExponent()); final String modulus = "22840028388110743583131987675136887114153126223124011317437832666" + "25854781992306722377061897219550740787245366580892823047038154958086308817575397" + "86207323511183698710582016112357060923053840856777454937186677760616034425665662" + "82261472797239839649294119764258671908502475664743909024714305171394796349355615" + "01410512875834037603865586850446929492793894140130256172372280205701912961974382" + "44718040286649900869581969011709834002741504113088991590355018061303753262915348" + "56911333402703872012358714368938812147820774134682975669390306870781321673316754" + "378035200080485404740444851779733064858474545694849794752210968120764651"; Assert.assertEquals(new BigInteger(modulus), pubKey.getModulus()); } protected void assertsDsaKey(DSAPublicKey pubKey) { final String y = "4075820517720311789755060432555041302495713535036194101055101600952719" + "8027506134078097330328538489864134942817893994891118803853518548361792777130885" + "0845452847199857520010376744070518762657897263318144714919719488458432611731877" + "3733795914935443964469170020723158291398484608457816805394280489144894060446820" + "2"; final String p = "1562763388678684549676999956870179987376000994454452811488079320239653" + "8931971498715717466033996067243932790630000740882000826960832106054102246126902" + "3050793071435716238554837246001821695252267029019836147068133782812531548770882" + "6153064920839234179080884223223263305562612862165508525479239452754625899807548" + "07"; final String q = "1325486242274701569333126235614816814166592776627"; final String g = "1053939190524437845710740492266780383434946918308472822218659846206636" + "3468617688992758226678340652253001602083786669177050081112107298337364078312067" + "8593218571928390833559198136388601343715984061418418925932387956796945760464070" + "8605211665506462942166129968135830426818793738520715937903855564717876010412364" + "82"; Assert.assertEquals(new BigInteger(y), pubKey.getY()); Assert.assertEquals(new BigInteger(p), pubKey.getParams().getP()); Assert.assertEquals(new BigInteger(q), pubKey.getParams().getQ()); Assert.assertEquals(new BigInteger(g), pubKey.getParams().getG()); } protected void assertsEcdsaKey(ECPublicKey pubKey) { final String x = "48439561293906451759052585252797914202762949526041747995844080717082404635286"; final String y = "36134250956749795798585127919587881956611106672985015071877198253568414405109"; Assert.assertEquals(new BigInteger(x), pubKey.getParams().getGenerator().getAffineX()); Assert.assertEquals(new BigInteger(y), pubKey.getParams().getGenerator().getAffineY()); } protected void assertsEcdsaKey384(ECPublicKey pubKey) { final String x = "26247035095799689268623156744566981891852923491109213387815615900925" + "518854738050089022388053975719786650872476732087"; final String y = "83257109614890299855467512895201081792878530488613155947092059024805" + "03199884419224438643760392947333078086511627871"; Assert.assertEquals(new BigInteger(x), pubKey.getParams().getGenerator().getAffineX()); Assert.assertEquals(new BigInteger(y), pubKey.getParams().getGenerator().getAffineY()); } protected void assertsEcdsaKey521(ECPublicKey pubKey) { final String x = "2661740802050217063228768716723360960729859168756973147706671368418802944" + "996427808491545080627771902352094241225065558662157113545570916814161637315895999846"; final String y = "3757180025770020463545507224491183603594455134769762486694567779615544477" + "440556316691234405012945539562144444537289428522585666729196580810124344277578376784"; Assert.assertEquals(new BigInteger(x), pubKey.getParams().getGenerator().getAffineX()); Assert.assertEquals(new BigInteger(y), pubKey.getParams().getGenerator().getAffineY()); } public static class CommonsBase64Decoder implements Base64Decoder { @Override public byte[] decode(String str) { return Base64.decodeBase64(str); } } }