package com.github.signed.tryanderror.sftp; import net.schmizz.sshj.common.KeyType; import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.Test; import java.io.IOException; import java.math.BigInteger; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.spec.DSAPublicKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class LoadPublicKeyFromKnownHosts_Test { private final BigInteger y = new BigInteger("18226708153648715711288874856052985268113303959121736442781051674059176370996402024446715347011127200085029534002879241134794751792794374977362557950732424250028476206807864978099939804631704654672032856670483093723026555234069198194514575599154150815422312588086704804758323913258088757583867862120211692754"); private final BigInteger p = new BigInteger("169681939708027790944661846904714852379361462648127669771054435709970244636023330464075771363639741799176245656362610906393475051074915187029090777848884285108353074118793606929636867806219447783707900195022671939556774784852768934498078014217821638033168613366966535532498666539726280024877551527822112757821"); private final BigInteger q = new BigInteger("1322074206163278206825028169808530589813184389963"); private final BigInteger g = new BigInteger("60300140882990912410847678092832826153739741326146732167996083167044227787908017715655778544971212345361787278649161124050108491159412866658592147238369664583814007701576363536594080820414541946989857244242273262755638195274761146731910475363368314302848413403090018971179671466673150272503410454506851181264"); @Test public void someTest() throws Exception { String lineFromKnownHosts = "|1|0SbajyQO4/FyeCqeQP1WMRAm5ko=|tt9eyFzqWlTQJeMgfRSGNgbnCqw= ssh-dss AAAAB3NzaC1kc3MAAACBAPGilhrKurL/VMDUga1yTZPlh4QX/ydFiWWS3u8wNkN2xuTIvGQCUXI2oM/OjPpPXKQvmrETvbmJ4o+Yg9zOXaEFu5Oh9dFzXVSKWHmZ+ooZQDxNMhc/OWlrP3o0B3Vq/j7VQv4KvjWkU1QgUbbxryCwanBrCofwuABBm53pWpg9AAAAFQDnk9uVyDAjcx+Ci06G2W8Yx4vjSwAAAIBV3sjEhhzduD/0ZNKYEmUpLmPO3Q1QF79W9qM1WYk4xA0YmIziLkArT7vhbhImMHM+v6uG0PpGC14pfvNKvw0v2Oa/MBAZCaj9Zf3lip9quwPQNZxhP/uG04PAKL4FTIXwzisklghMN+34TPmYIr4xPOuqmkxdpyWPzlYWMs6i0AAAAIAZ9KhcSOrfwgAAVhR+h8KbQtloW2euUy5dcg84lh+lavpImPpUG3JB9gKCKW6nWFYnsGtgwiLcspr0uZEB7SMZgadBhsrf7cbL5DfNyRutzxiyyr+R9y70bNqbknwF6i2X9eP++UHVxJwIPLjy3TfRQPBKH6AuSXUO6aG6+Rg80g=="; doStuff(lineFromKnownHosts); } @Test public void someOtherTest() throws Exception { String lineFromKnownHosts = "[localhost]:2022 ssh-dss AAAAB3NzaC1kc3MAAACBAPGilhrKurL/VMDUga1yTZPlh4QX/ydFiWWS3u8wNkN2xuTIvGQCUXI2oM/OjPpPXKQvmrETvbmJ4o+Yg9zOXaEFu5Oh9dFzXVSKWHmZ+ooZQDxNMhc/OWlrP3o0B3Vq/j7VQv4KvjWkU1QgUbbxryCwanBrCofwuABBm53pWpg9AAAAFQDnk9uVyDAjcx+Ci06G2W8Yx4vjSwAAAIBV3sjEhhzduD/0ZNKYEmUpLmPO3Q1QF79W9qM1WYk4xA0YmIziLkArT7vhbhImMHM+v6uG0PpGC14pfvNKvw0v2Oa/MBAZCaj9Zf3lip9quwPQNZxhP/uG04PAKL4FTIXwzisklghMN+34TPmYIr4xPOuqmkxdpyWPzlYWMs6i0AAAAIAZ9KhcSOrfwgAAVhR+h8KbQtloW2euUy5dcg84lh+lavpImPpUG3JB9gKCKW6nWFYnsGtgwiLcspr0uZEB7SMZgadBhsrf7cbL5DfNyRutzxiyyr+R9y70bNqbknwF6i2X9eP++UHVxJwIPLjy3TfRQPBKH6AuSXUO6aG6+Rg80g=="; doStuff(lineFromKnownHosts); } private void doStuff(String lineFromKnownHosts) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { OpenSSHKnownHosts.HostEntry hostEntry = OpenSSHKnownHosts.EntryFactory.parseEntry(lineFromKnownHosts); KeyFactory dsa = KeyFactory.getInstance("DSA", new BouncyCastleProvider()); KeySpec spec = new DSAPublicKeySpec(y, p, q, g); PublicKey publicKey = dsa.generatePublic(spec); System.out.println(hostEntry.getLine()); assertThat(hostEntry.verify(publicKey), is(true)); assertThat(hostEntry.appliesTo(KeyType.DSA, "[localhost]:2022"), is(true)); } }