summaryrefslogtreecommitdiff
path: root/test/authentication/test_ed25519.rb
blob: d0d0e9eddb7870dd616d692351d145316fa81319 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
unless ENV['NET_SSH_NO_ED25519']

  require_relative '../common'
  require 'net/ssh/authentication/ed25519_loader'
  require 'net/ssh/key_factory'
  require 'base64'

  module Authentication
    class TestED25519 < NetSSHTest
      def setup
        raise "No ED25519 set NET_SSH_NO_ED25519 to ignore this test" unless Net::SSH::Authentication::ED25519Loader::LOADED
      end

      def test_no_pwd_key
        pub = Net::SSH::Buffer.new(Base64.decode64(public_key_no_pwd.split(' ')[1]))
        _type = pub.read_string
        pub_data = pub.read_string
        priv = private_key_no_pwd

        pub_key = Net::SSH::Authentication::ED25519::PubKey.new(pub_data)
        priv_key = Net::SSH::Authentication::ED25519::PrivKey.read(priv, nil)

        shared_secret = "Hello"
        signed = priv_key.ssh_do_sign(shared_secret)
        self.assert_equal(true, pub_key.ssh_do_verify(signed, shared_secret))
        self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
        self.assert_equal(pub_key.fingerprint, key_fingerprint_md5_no_pwd)
        self.assert_equal(pub_key.fingerprint('sha256'), key_fingerprint_sha256_no_pwd)
      end

      def test_no_pwd_key_with_newlines
        pub = Net::SSH::Buffer.new(Base64.decode64(public_key_no_pwd.split(' ')[1]))
        _type = pub.read_string
        pub_data = pub.read_string
        priv = private_key_no_pwd_with_newlines

        pub_key = Net::SSH::Authentication::ED25519::PubKey.new(pub_data)
        priv_key = Net::SSH::Authentication::ED25519::PrivKey.read(priv, nil)

        shared_secret = "Hello"
        signed = priv_key.ssh_do_sign(shared_secret)
        self.assert_equal(true, pub_key.ssh_do_verify(signed, shared_secret))
        self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
        self.assert_equal(pub_key.fingerprint, key_fingerprint_md5_no_pwd)
        self.assert_equal(pub_key.fingerprint('sha256'), key_fingerprint_sha256_no_pwd)
      end

      def test_pwd_key
        if defined?(JRUBY_VERSION)
          puts "Skipping password protected ED25519 for JRuby"
          return
        end
        pub = Net::SSH::Buffer.new(Base64.decode64(public_key_pwd.split(' ')[1]))
        _type = pub.read_string
        pub_data = pub.read_string
        priv = private_key_pwd

        pub_key = Net::SSH::Authentication::ED25519::PubKey.new(pub_data)
        priv_key = Net::SSH::Authentication::ED25519::PrivKey.read(priv, 'pwd')

        shared_secret = "Hello"
        signed = priv_key.ssh_do_sign(shared_secret)
        self.assert_equal(true, pub_key.ssh_do_verify(signed, shared_secret))
        self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
        self.assert_equal(pub_key.fingerprint, key_fingerprint_md5_pwd)
        self.assert_equal(pub_key.fingerprint('sha256'), key_fingerprint_sha256_pwd)
      end

      def test_pwd_key_should_ask
        pub = Net::SSH::Buffer.new(Base64.decode64(public_key_pwd.split(' ')[1]))
        _type = pub.read_string
        pub_data = pub.read_string
        priv = private_key_pwd

        prompt = OpenStruct.new
        def prompt.start(opts)
          prompter = OpenStruct.new
          def prompter.ask(*opts)
            return "pwd"
          end
          prompter
        end

        pub_key = Net::SSH::Authentication::ED25519::PubKey.new(pub_data)
        priv_key = Net::SSH::KeyFactory.load_data_private_key(priv, nil, true, "", prompt)

        shared_secret = "Hello"
        signed = priv_key.ssh_do_sign(shared_secret)
        self.assert_equal(true, pub_key.ssh_do_verify(signed, shared_secret))
        self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
        self.assert_equal(pub_key.fingerprint, key_fingerprint_md5_pwd)
        self.assert_equal(pub_key.fingerprint('sha256'), key_fingerprint_sha256_pwd)
      end

      def private_key_pwd
        @pwd_key = <<~EOF
          -----BEGIN OPENSSH PRIVATE KEY-----
          b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABBxwCvr3V
          /8pWhC/xvTnGJhAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFc
          aZ10TPUbkIvmaFXwYRoOS5qE8MciAAAAsNUAhbNQKwNcOr0eNq3nhtjoyeVyH8hRrpWsiY
          46vPiECi6R6OdYGSd7W3fdzUDeyOYCY9ZVIjAzENG+9FsygYzMi6XCuw00OuDFLUp4fL4K
          i/coUIVqouB4TPQAmsCVXiIRVTWQtRG0kWfFaV3qRt/bc22ZCvCT6ZZ1UmtulqqfUhSlKM
          oPcTikV1iWH5Xc+GxRFRRGTN/6HvBf0AKDB1kMXlDhGnBnHGeNH1pk44xG
          -----END OPENSSH PRIVATE KEY-----
        EOF
      end

      def public_key_pwd
        'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFcaZ10TPUbkIvmaFXwYRoOS5qE8Mci vagrant@vagrant-ubuntu-trusty-64'
      end

      def key_fingerprint_md5_pwd
        'c8:89:92:60:12:1b:01:5e:ca:58:55:68:7e:5e:1a:f1'
      end

      def key_fingerprint_sha256_pwd
        'SHA256:Uz5Qk/fB+f8Bu7FTxNcDh7+atpB29Q3tBBJX/gnUfGw'
      end

      def private_key_no_pwd
        @anonymous_key = <<~EOF
          -----BEGIN OPENSSH PRIVATE KEY-----
          b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
          QyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQAAAKjlHzLo5R8y
          6AAAAAtzc2gtZWQyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQ
          AAAEBPrD+n4901Y+NYJ2sry+EWRdltGFhMISvp91TywJ//mTB2NBh4GJPPUN1kXPMu8b63
          3Xcv55WoKC3OkBjFAbzJAAAAIHZhZ3JhbnRAdmFncmFudC11YnVudHUtdHJ1c3R5LTY0AQ
          IDBAU=
          -----END OPENSSH PRIVATE KEY-----
        EOF
      end

      def private_key_no_pwd_with_newlines
        @anonymous_key = <<~EOF
          -----BEGIN OPENSSH PRIVATE KEY-----
          b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
          QyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQAAAKjlHzLo5R8y
          6AAAAAtzc2gtZWQyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQ
          AAAEBPrD+n4901Y+NYJ2sry+EWRdltGFhMISvp91TywJ//mTB2NBh4GJPPUN1kXPMu8b63
          3Xcv55WoKC3OkBjFAbzJAAAAIHZhZ3JhbnRAdmFncmFudC11YnVudHUtdHJ1c3R5LTY0AQ
          IDBAU=
          -----END OPENSSH PRIVATE KEY-----


        EOF
      end

      def public_key_no_pwd
        'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDB2NBh4GJPPUN1kXPMu8b633Xcv55WoKC3OkBjFAbzJ vagrant@vagrant-ubuntu-trusty-64'
      end

      def key_fingerprint_md5_no_pwd
        '2f:7f:97:21:76:a4:0f:38:c4:fe:d8:b4:6a:39:72:30'
      end

      def key_fingerprint_sha256_no_pwd
        'SHA256:u6mXnY8P1b0FODGp8mckqOB33u8+jvkSCtJbD5Q9klg'
      end
    end
  end

end