From 14e13599f60c4ff4159317df429efb642b79a56d Mon Sep 17 00:00:00 2001 From: Ignas Mikalajunas Date: Thu, 7 Dec 2023 23:49:38 +0200 Subject: [PATCH] Added tests for PublicKeyDecoder --- .../db/repositories/PublicKeyDecoder.java | 8 +++- .../repositories/PublicKeyDecoderTest.groovy | 39 +++++++++++++++++++ src/test/resources/fixtures/ssh_keys.yaml | 11 ++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/test/groovy/lt/pow/nukagit/db/repositories/PublicKeyDecoderTest.groovy create mode 100644 src/test/resources/fixtures/ssh_keys.yaml diff --git a/src/main/java/lt/pow/nukagit/db/repositories/PublicKeyDecoder.java b/src/main/java/lt/pow/nukagit/db/repositories/PublicKeyDecoder.java index 7911285..c5b1a01 100644 --- a/src/main/java/lt/pow/nukagit/db/repositories/PublicKeyDecoder.java +++ b/src/main/java/lt/pow/nukagit/db/repositories/PublicKeyDecoder.java @@ -26,7 +26,13 @@ public PublicKeyData decodePublicKey(String keyLine) throws InvalidKeyStringExce String[] parts = keyLine.split(" "); for (String part : parts) { if (part.startsWith("AAAA")) { - byte[] decodeBuffer = Base64.getDecoder().decode(part.getBytes(StandardCharsets.UTF_8)); + byte[] decodeBuffer; + try { + decodeBuffer = Base64.getDecoder().decode(part.getBytes(StandardCharsets.UTF_8)); + } catch (IllegalArgumentException e) { + throw new InvalidKeyStringException("Key string is not a valid base64 string", e); + } + ByteBuffer bb = ByteBuffer.wrap(decodeBuffer); /* using 4 bytes from bb to generate integer which gives us length of key- format type, in this case len=7 as "ssh-rsa" has 7 chars diff --git a/src/test/groovy/lt/pow/nukagit/db/repositories/PublicKeyDecoderTest.groovy b/src/test/groovy/lt/pow/nukagit/db/repositories/PublicKeyDecoderTest.groovy new file mode 100644 index 0000000..0e7c6df --- /dev/null +++ b/src/test/groovy/lt/pow/nukagit/db/repositories/PublicKeyDecoderTest.groovy @@ -0,0 +1,39 @@ +package lt.pow.nukagit.db.repositories + + +import org.yaml.snakeyaml.Yaml +import spock.lang.Shared +import spock.lang.Specification + +class PublicKeyDecoderTest extends Specification { + @Shared + List validKeys + + @Shared + List invalidKeys + + PublicKeyDecoder decoder = new PublicKeyDecoder() + + def setupSpec() { + def keyFile = new File(getClass().getResource('/fixtures/ssh_keys.yaml').toURI()) + Map> yaml = new Yaml().load(keyFile.newReader()) + validKeys = yaml.get("valid") + invalidKeys = yaml.get("invalid") + } + + def "test valid keys"() { + expect: + decoder.decodePublicKey(key) != null + where: + key << validKeys + } + + def "test invalid keys"() { + when: + decoder.decodePublicKey(key) + then: + thrown(InvalidKeyStringException) + where: + key << invalidKeys + } +} diff --git a/src/test/resources/fixtures/ssh_keys.yaml b/src/test/resources/fixtures/ssh_keys.yaml new file mode 100644 index 0000000..ca4d103 --- /dev/null +++ b/src/test/resources/fixtures/ssh_keys.yaml @@ -0,0 +1,11 @@ +valid: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCru5hiXJ19y0AF1euGURC3ikNgYzXKaSUzK5EpcyJ9uu/ivQP9KoZBuMMBkLxf4V5n4SdyjFWzIGQLt6kJp6HxxGxrZnl8pL6noBbH5GerPqBhK02RMop145gkHJlV6ZoVhJ2flgUL8Pw2Dof+BwsE17YiKDdJaBs9kNry6d+Gp5OsRJH4NRweQaxN8V8IW+gMKTVyEKVbn3L5CkjgLNydpnLBIPv9IjZTH1yLamVm0Jm+k4fZWyloLQ+hXBD3V8KdyBbNfqjXVDSRELzcBzREQ8AjZh10knLFxoSxkbBEfNX1GQWjCzbqQMYyJQRCHWQSQ9YIQOIxZV/NqaHBzXsP + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCRhRpMhQSPJI4hK5wHm5eeTi4Kh+hCbVn7r0qDl4J8jgEB5/7Ni/RRgAa22hG0N07vAi+K4qgsH2bolldCDW2/iIGGlXdNHUKULgvs+I2zLm8ewJ0dCzf2l5mlKyue4ZmuMiPfB06zE8px44ABZE7beRi34z37n7wH2N+sewQ2gtZJgNsw8IQ/kPN1xsSV/51i2gNaOTyZlTwzYAcv8dJdw2JvUe1T7Wc0ffroHPurLLGafgFMQyQ1QTvy5ZxbHMvBlBkXhwPAB3MN89x3dlrqlni98U4m2aefdpI82z4mRTaJeQVmeuUiIq6brh6Tcg7EjqZeXG9oOyM2quorbdXN + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCp1CZR7wooITs0mMkWttKeV7ko3gpzWBxVnDouG1oCy4gUmDxYDTx3wEltI8DWW1pw2B7i2kmb1sYSepMLc5/N2cflbsoxJlQtg8oS/9RVsFMnjPXNPF1SkY+DBpBjSFzgj6JUtM3WIE16DTF2FBTEPZB47mRy58mMexmPdtjpuSlY+14q9EhZJiAhbbhdzPJSIcvCMua8lQ4AGEx1gWO9ror58xJql8VbfdqY9xwwWQOdpQBTugpNnEaYMSFuBOAcE/WLGdDfQKIGc1v0dM2i++HzxGPPGjd9EhUl6luUhke2dAe78pcRXk9i1e6WvRV59gV/mkSx6FqYKavFABqDFl7NT3qKiU9XEdEClxYDVRIFftJM11AOH5vne1Te+mZvr6+EJGdTZcLI8xOxfAxepYBl5hATZ7eS8zcvfq3SjU3B//cL72lwbcSiQk976oQilRpOFY+IKuB2ODxd6BhW1ut2o3Vd6Irfbi2TIhFqV0/m92pcsKhhmgBWyMvwSDE7HmRX9Lop1l5CWOCR97CN1As5aGpFVbZVlpSShL4H3WkSW/tkXpu3PCe3kPvbU1PJNKttQP4nrSgleXZFmnh2X1+iCl1Zan5wTAP1OePDHeHAJ6na8ptCxMG88+H8JX/oEC2ziqET79EmMXUpMZuSATP/Fv0yxXU/0OiWXYionQ== + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDAXODOPnHzhek5iDVyWOCNOnLm5BgADgp1F2XMfE66ezDzg4yIXfk8aCs/kdxY8A9JBFm9a1XBliFRL7O4wN/Cbl59T5OYN9SJHUgHdVqdgACLgohmOCP5VMmb1hQzc/eRKILJp4ZwY4VlzX7+WBn4qsD2UBtZVHZNbQ3WW69hIzq/yRAi08yk53aUU/lXSZnvJWcXaCLpQOJpM2AMcrjnTE9p3q3tOazPf6Xd+ps7ICKWUkU4FgTjcRnL7gauGZI6TzdYUZgqbRGBmgPUe0RDswqmzrQLHseUjHs4ikKefyLsFS/rtcH7809EgESQgL2/QYQD20+X40wFODJlEj0v76eyanCgjBsaBE0LCjRXWRig5Jut8JhLOkZGET6DiPa0QDDYnG8OvasjgnN1UqwEMPVHsQZ4DukLGJr2EdciyuR8UI0Ya3BbsyW7URcs938hXqSqEZm2J9bzAC9XcInQ07LfVBjTM8Zvrdq6+mmWlE6J5pJqEh2aWPM7w7i4kdGVyN0g9vzI4BLLTiRk4pwSdLZ1ryHoKdLGQOZHglUbWZcX0zBet6CPIHXtGXLSDCJLztRRxpXN3Gzivez6dWMajtxciGc9uRj0h0O+zGLH4NhbNCR8NgDlKWJqMwz1IHlhi9od1YssIM2T3ACpqb8mcxSeMuIgzAt5QJ773HJfsQ== + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQClcSOqeibzOSra3bNbbgtH2aViYOhOuUZSdGtEPdjstJe3Edi1EVpUUC45UVLP27SMyMN7qicrdl94U6b6N7HSqCSYp7cP3bEXy+O3+XAyrAvHZH+g8v1IqOpsHvP2D5ytXS8t8Kazy7Y2l7Cmx6BDK1il7pL8JViBkHOxbnzJyw== +invalid: + - ssh-dss AAAAB3NzaC1kc3MAAABBAPymgs6OEsq6Ju/M9xEOUm2weLBe3svNHrSiCPOuFheuAfNbkaR+bfY0E8XhLtCJm80TKs1Q2ZFRvcQ+5zdZLhcAAAAVAJYu3cw2nLqOuyYO5rahJtk0bjjFAAAAQGeEcbJ6nPRO6RpJxRR9samq8kTwWkNNZIaTHS0UJxueNQMLcf1z2heQabMuKTVjDhwgYjVNDaIKbEFuUL55TKQAAABBAMG7Jr2vjth8G90DFV0Zf2EpewTsGeib4ISuhcIEgM7y40z+FYOaepSxw+Fhr5hUA+nYPVFOPNSyBsedpcyGtwE= + - ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBTkovxctQwuZs1ugYwLvl42z0xiQyA0M8pZx9vbLIZyI+bHowu0NZJS8tNWfkokvIPthvWMSDxkgeLsdoObYiM= + - ssh-rsa NOTAKEY + - ssh-rsa AAAAB3NzaC1....il7pL8JViBkHOxbnzJyw==