putty-key 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +3 -0
  3. data.tar.gz.sig +1 -0
  4. data/.yardopts +7 -0
  5. data/CHANGES.md +4 -0
  6. data/Gemfile +14 -0
  7. data/LICENSE +19 -0
  8. data/README.md +137 -0
  9. data/Rakefile +110 -0
  10. data/lib/putty/key.rb +25 -0
  11. data/lib/putty/key/error.rb +26 -0
  12. data/lib/putty/key/openssl.rb +182 -0
  13. data/lib/putty/key/ppk.rb +374 -0
  14. data/lib/putty/key/util.rb +128 -0
  15. data/lib/putty/key/version.rb +6 -0
  16. data/putty-key.gemspec +29 -0
  17. data/test/fixtures/dss-1024-encrypted.ppk +17 -0
  18. data/test/fixtures/dss-1024.pem +12 -0
  19. data/test/fixtures/dss-1024.ppk +17 -0
  20. data/test/fixtures/ecdsa-secp256k1.pem +5 -0
  21. data/test/fixtures/ecdsa-sha2-nistp256-encrypted.ppk +10 -0
  22. data/test/fixtures/ecdsa-sha2-nistp256.pem +5 -0
  23. data/test/fixtures/ecdsa-sha2-nistp256.ppk +10 -0
  24. data/test/fixtures/ecdsa-sha2-nistp384-encrypted.ppk +11 -0
  25. data/test/fixtures/ecdsa-sha2-nistp384.pem +6 -0
  26. data/test/fixtures/ecdsa-sha2-nistp384.ppk +11 -0
  27. data/test/fixtures/ecdsa-sha2-nistp521-encrypted.ppk +12 -0
  28. data/test/fixtures/ecdsa-sha2-nistp521.pem +7 -0
  29. data/test/fixtures/ecdsa-sha2-nistp521.ppk +12 -0
  30. data/test/fixtures/rsa-2048-encrypted.ppk +26 -0
  31. data/test/fixtures/rsa-2048.pem +27 -0
  32. data/test/fixtures/rsa-2048.ppk +26 -0
  33. data/test/fixtures/test-blank-comment.ppk +11 -0
  34. data/test/fixtures/test-encrypted.ppk +11 -0
  35. data/test/fixtures/test-invalid-blob-lines.ppk +11 -0
  36. data/test/fixtures/test-invalid-encryption-type.ppk +11 -0
  37. data/test/fixtures/test-invalid-format-1.ppk +11 -0
  38. data/test/fixtures/test-invalid-format-3.ppk +11 -0
  39. data/test/fixtures/test-invalid-private-mac.ppk +11 -0
  40. data/test/fixtures/test-truncated.ppk +10 -0
  41. data/test/fixtures/test-unix-line-endings.ppk +11 -0
  42. data/test/fixtures/test.ppk +11 -0
  43. data/test/openssl_test.rb +252 -0
  44. data/test/ppk_test.rb +247 -0
  45. data/test/test_helper.rb +81 -0
  46. data/test/util_test.rb +180 -0
  47. data/test/version_test.rb +7 -0
  48. metadata +124 -0
  49. metadata.gz.sig +0 -0
@@ -0,0 +1,6 @@
1
+ module PuTTY
2
+ module Key
3
+ # The PuTTY::Key version number.
4
+ VERSION = '1.0.0'
5
+ end
6
+ end
data/putty-key.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.join('..', 'lib', 'putty', 'key', 'version'), __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'putty-key'
5
+ s.version = PuTTY::Key::VERSION
6
+ s.summary = 'Reads and writes PuTTY private key (.ppk) files. Refines OpenSSL::PKey to allow key conversion.'
7
+ s.description = <<-EOF
8
+ PuTTY::Key is a pure-Ruby implementation of the PuTTY private key (ppk) format,
9
+ handling reading and writing .ppk files. It includes a refinement to Ruby's
10
+ OpenSSL library to add support for converting DSA, EC and RSA private keys to
11
+ and from PuTTY private key files. This allows OpenSSH ecdsa, ssh-dss and ssh-rsa
12
+ private keys to be converted to and from PuTTY's private key format.
13
+ EOF
14
+ s.author = 'Philip Ross'
15
+ s.email = 'phil.ross@gmail.com'
16
+ s.homepage = 'https://github.com/philr/putty-key'
17
+ s.license = 'MIT'
18
+ s.files = %w(CHANGES.md Gemfile LICENSE README.md Rakefile putty-key.gemspec .yardopts) +
19
+ Dir['lib/**/*.rb'] +
20
+ Dir['test/**/*.rb'] +
21
+ Dir['test/fixtures/*']
22
+ s.platform = Gem::Platform::RUBY
23
+ s.require_path = 'lib'
24
+ s.rdoc_options << '--title' << 'PuTTY::Key' <<
25
+ '--main' << 'README.md' <<
26
+ '--markup' << 'markdown'
27
+ s.extra_rdoc_files = ['CHANGES.md', 'LICENSE', 'README.md']
28
+ s.required_ruby_version = '>= 2.1.0'
29
+ end
@@ -0,0 +1,17 @@
1
+ PuTTY-User-Key-File-2: ssh-dss
2
+ Encryption: aes256-cbc
3
+ Comment: 1024 bit DSS key
4
+ Public-Lines: 10
5
+ AAAAB3NzaC1kc3MAAACBAL+4+EeuubcbNP48XJONq1SgPngZFjDKu+MiDCMDNtzw
6
+ bqsGDIRTolPKYs9toCRMyJBOv2p4wAKY7EweNT5ka110gaxmZ1LGsCIBOPiF6lvI
7
+ Iqidqi6S0boZVmjb4WA5DW5qu8XMAJIxGHuqrBOSVesRp6A1MROYpR0qQsXq/HOJ
8
+ AAAAFQDIvmNb+BUDk9eq82asXwWS9rcq5wAAAIAx6uiaV2jauJa0fisi3p8VIayo
9
+ 8EAVLIyjDg8cRzEtE5Fagdq1n1gQd0EJvYVwwsEdacLxA/VI1DqzyPb9cj8THqKi
10
+ b36itdWrSzKYVY5TAvdKYOLcYlRbT51c9Bu+SqPOHQFAgS38YzbZfoar5oevnLyk
11
+ nhDgnlogrMk/OkUZoQAAAIEAvBTb2ZdpeawFZ7kxY+n3whqjslqBPTZwZhoZI6+D
12
+ JmrOFcmFqN/XtxYul2F8M05GigjRjM6onmDx73nUqoGuRINOqdKVuu4D9dB1vw70
13
+ tg1y39Z46MsFdGKWquy1C2+nm2//jxbEc/dAxOHL20pGA8lSG7NRlUfX4vpmpLw1
14
+ UeI=
15
+ Private-Lines: 1
16
+ f/XUfRLYdOG1yxjJbggfTkODkvUl1PaUrKrkgltN9n8=
17
+ Private-MAC: a2fd21e9a1e9dd7eeebbad996ae73e4d4eff72e9
@@ -0,0 +1,12 @@
1
+ -----BEGIN DSA PRIVATE KEY-----
2
+ MIIBvAIBAAKBgQC/uPhHrrm3GzT+PFyTjatUoD54GRYwyrvjIgwjAzbc8G6rBgyE
3
+ U6JTymLPbaAkTMiQTr9qeMACmOxMHjU+ZGtddIGsZmdSxrAiATj4hepbyCKonaou
4
+ ktG6GVZo2+FgOQ1uarvFzACSMRh7qqwTklXrEaegNTETmKUdKkLF6vxziQIVAMi+
5
+ Y1v4FQOT16rzZqxfBZL2tyrnAoGAMeromldo2riWtH4rIt6fFSGsqPBAFSyMow4P
6
+ HEcxLRORWoHatZ9YEHdBCb2FcMLBHWnC8QP1SNQ6s8j2/XI/Ex6iom9+orXVq0sy
7
+ mFWOUwL3SmDi3GJUW0+dXPQbvkqjzh0BQIEt/GM22X6Gq+aHr5y8pJ4Q4J5aIKzJ
8
+ PzpFGaECgYEAvBTb2ZdpeawFZ7kxY+n3whqjslqBPTZwZhoZI6+DJmrOFcmFqN/X
9
+ txYul2F8M05GigjRjM6onmDx73nUqoGuRINOqdKVuu4D9dB1vw70tg1y39Z46MsF
10
+ dGKWquy1C2+nm2//jxbEc/dAxOHL20pGA8lSG7NRlUfX4vpmpLw1UeICFQCl3JfI
11
+ KDbnArDjCLHs6372hyeAPA==
12
+ -----END DSA PRIVATE KEY-----
@@ -0,0 +1,17 @@
1
+ PuTTY-User-Key-File-2: ssh-dss
2
+ Encryption: none
3
+ Comment: 1024 bit DSS key
4
+ Public-Lines: 10
5
+ AAAAB3NzaC1kc3MAAACBAL+4+EeuubcbNP48XJONq1SgPngZFjDKu+MiDCMDNtzw
6
+ bqsGDIRTolPKYs9toCRMyJBOv2p4wAKY7EweNT5ka110gaxmZ1LGsCIBOPiF6lvI
7
+ Iqidqi6S0boZVmjb4WA5DW5qu8XMAJIxGHuqrBOSVesRp6A1MROYpR0qQsXq/HOJ
8
+ AAAAFQDIvmNb+BUDk9eq82asXwWS9rcq5wAAAIAx6uiaV2jauJa0fisi3p8VIayo
9
+ 8EAVLIyjDg8cRzEtE5Fagdq1n1gQd0EJvYVwwsEdacLxA/VI1DqzyPb9cj8THqKi
10
+ b36itdWrSzKYVY5TAvdKYOLcYlRbT51c9Bu+SqPOHQFAgS38YzbZfoar5oevnLyk
11
+ nhDgnlogrMk/OkUZoQAAAIEAvBTb2ZdpeawFZ7kxY+n3whqjslqBPTZwZhoZI6+D
12
+ JmrOFcmFqN/XtxYul2F8M05GigjRjM6onmDx73nUqoGuRINOqdKVuu4D9dB1vw70
13
+ tg1y39Z46MsFdGKWquy1C2+nm2//jxbEc/dAxOHL20pGA8lSG7NRlUfX4vpmpLw1
14
+ UeI=
15
+ Private-Lines: 1
16
+ AAAAFQCl3JfIKDbnArDjCLHs6372hyeAPA==
17
+ Private-MAC: 08a095e136062f3005386f26c6aea1e00d72cad5
@@ -0,0 +1,5 @@
1
+ -----BEGIN EC PRIVATE KEY-----
2
+ MHQCAQEEIMIAssjzKsy+rPCg3oQ7b7lwggjH/srTvaccBVNRk6LxoAcGBSuBBAAK
3
+ oUQDQgAE24DQeX9/AazJ3NvCByQ4KaPmcnRgJevMNz47ZiAmYYkwoKQOxFN3Gl+g
4
+ iJxyn/IfzIA4ihaR8I3SlT7A+ulHVw==
5
+ -----END EC PRIVATE KEY-----
@@ -0,0 +1,10 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp256
2
+ Encryption: aes256-cbc
3
+ Comment: ECDSA NIST P-256 Key
4
+ Public-Lines: 3
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCQ3DddjuXAE
6
+ JBGEdbNJMuQ6J4ygr3Y6T6i7lSYSilJx+bpS2G2CBDywgH/tRCTEKEWDfuDMWIBD
7
+ 8CFx/Ll+GYI=
8
+ Private-Lines: 1
9
+ gxt0kaX6X+MtVMSrtEY2jRhqohF8BfXkGgnjPIesEfg52oI2hBWScmzPa1oeSq3S
10
+ Private-MAC: 26ae5e506735b389f7c3d39b291e01b4183442a6
@@ -0,0 +1,5 @@
1
+ -----BEGIN EC PRIVATE KEY-----
2
+ MHcCAQEEINLd2sKCIi+YRq6kOAbDpoTLytFWUGov9CB1BCEmuuVDoAoGCCqGSM49
3
+ AwEHoUQDQgAEJDcN12O5cAQkEYR1s0ky5DonjKCvdjpPqLuVJhKKUnH5ulLYbYIE
4
+ PLCAf+1EJMQoRYN+4MxYgEPwIXH8uX4Zgg==
5
+ -----END EC PRIVATE KEY-----
@@ -0,0 +1,10 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp256
2
+ Encryption: none
3
+ Comment: ECDSA NIST P-256 Key
4
+ Public-Lines: 3
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCQ3DddjuXAE
6
+ JBGEdbNJMuQ6J4ygr3Y6T6i7lSYSilJx+bpS2G2CBDywgH/tRCTEKEWDfuDMWIBD
7
+ 8CFx/Ll+GYI=
8
+ Private-Lines: 1
9
+ AAAAIQDS3drCgiIvmEaupDgGw6aEy8rRVlBqL/QgdQQhJrrlQw==
10
+ Private-MAC: fa55024b8a317064ff3502192181a8a30ae2ceb2
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp384
2
+ Encryption: aes256-cbc
3
+ Comment: ECDSA NIST P-384 Key
4
+ Public-Lines: 3
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBGVcWqtNFCVp
6
+ X/65SBYMlSuHi++wFIcl4iXp9rp6pAGfxK4Z1IZhBmKARMbIAWbWvZX5Gho/fJjJ
7
+ WwrQOsV9hVjYsfL6icBDOc/GFxq7mPxYq7ZJfypvsa6sAXRcPX4OjQ==
8
+ Private-Lines: 2
9
+ DhMmJHbWO+eRtFTcVfM5thmsDO/AagTQQBAaePyPWoxdFZp8mHf5UvIxoXcz2MpA
10
+ wBu0qnCC+XxxPkR8+t0GpA==
11
+ Private-MAC: 3e2e02a07089bf0302e76ee43a3da89eb0571fb8
@@ -0,0 +1,6 @@
1
+ -----BEGIN EC PRIVATE KEY-----
2
+ MIGkAgEBBDDd4/iUv3slRIozZ7C5xoH0D9SYQCQ8k4oWQx5AYB2ZI3D+FHfGE7OP
3
+ hutQaprDANegBwYFK4EEACKhZANiAARlXFqrTRQlaV/+uUgWDJUrh4vvsBSHJeIl
4
+ 6fa6eqQBn8SuGdSGYQZigETGyAFm1r2V+RoaP3yYyVsK0DrFfYVY2LHy+onAQznP
5
+ xhcau5j8WKu2SX8qb7GurAF0XD1+Do0=
6
+ -----END EC PRIVATE KEY-----
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp384
2
+ Encryption: none
3
+ Comment: ECDSA NIST P-384 Key
4
+ Public-Lines: 3
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBGVcWqtNFCVp
6
+ X/65SBYMlSuHi++wFIcl4iXp9rp6pAGfxK4Z1IZhBmKARMbIAWbWvZX5Gho/fJjJ
7
+ WwrQOsV9hVjYsfL6icBDOc/GFxq7mPxYq7ZJfypvsa6sAXRcPX4OjQ==
8
+ Private-Lines: 2
9
+ AAAAMQDd4/iUv3slRIozZ7C5xoH0D9SYQCQ8k4oWQx5AYB2ZI3D+FHfGE7OPhutQ
10
+ aprDANc=
11
+ Private-MAC: c0b0522f17c6039ab23ffd8f93a817ff4a4726e6
@@ -0,0 +1,12 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp521
2
+ Encryption: aes256-cbc
3
+ Comment: ECDSA NIST P-521 Key
4
+ Public-Lines: 4
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAENbRFAy4lK
6
+ C/5rByU7cvbu/ImvKFOhmFTny7UUiv1KBaRaX104i9HpFqSAntOT2/SQ0KDMJ9Dm
7
+ nLkDp8MfQRFeJwFtFnyvu/4faSO5S64ftLsRuEuOulaKEwQKl4ncNY0Zyjf9OjZq
8
+ ETY9r6SbRQuAtKeDsL7bXgRAv75++JVZV7NwAA==
9
+ Private-Lines: 2
10
+ TRdZJW1Ek+k/NGr1GMslLohx3zwJro6Izi291LQ0ItkH5enhPENcSkqWyTEHveNP
11
+ r4PZTP2SnFrUwuSDqQBjqL++GVDAV6sWE6qlIhFxrcA=
12
+ Private-MAC: 7e6a2b46dece1d1bf524fc372b285e1e8c96cbee
@@ -0,0 +1,7 @@
1
+ -----BEGIN EC PRIVATE KEY-----
2
+ MIHbAgEBBEGdsLUosFN7QpT9JYWH7BtxcUg73MFZJpc4P1aSOObYbyv2CE0iEs7i
3
+ eOORoIF6upoa/Sz1uXfdxhD7i8euiLa5AKAHBgUrgQQAI6GBiQOBhgAEAQ1tEUDL
4
+ iUoL/msHJTty9u78ia8oU6GYVOfLtRSK/UoFpFpfXTiL0ekWpICe05Pb9JDQoMwn
5
+ 0OacuQOnwx9BEV4nAW0WfK+7/h9pI7lLrh+0uxG4S466VooTBAqXidw1jRnKN/06
6
+ NmoRNj2vpJtFC4C0p4OwvtteBEC/vn74lVlXs3AA
7
+ -----END EC PRIVATE KEY-----
@@ -0,0 +1,12 @@
1
+ PuTTY-User-Key-File-2: ecdsa-sha2-nistp521
2
+ Encryption: none
3
+ Comment: ECDSA NIST P-521 Key
4
+ Public-Lines: 4
5
+ AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAENbRFAy4lK
6
+ C/5rByU7cvbu/ImvKFOhmFTny7UUiv1KBaRaX104i9HpFqSAntOT2/SQ0KDMJ9Dm
7
+ nLkDp8MfQRFeJwFtFnyvu/4faSO5S64ftLsRuEuOulaKEwQKl4ncNY0Zyjf9OjZq
8
+ ETY9r6SbRQuAtKeDsL7bXgRAv75++JVZV7NwAA==
9
+ Private-Lines: 2
10
+ AAAAQgCdsLUosFN7QpT9JYWH7BtxcUg73MFZJpc4P1aSOObYbyv2CE0iEs7ieOOR
11
+ oIF6upoa/Sz1uXfdxhD7i8euiLa5AA==
12
+ Private-MAC: 5bc82292bfaecfaaef3e189e7bcfccd9573b0488
@@ -0,0 +1,26 @@
1
+ PuTTY-User-Key-File-2: ssh-rsa
2
+ Encryption: aes256-cbc
3
+ Comment: 2048 bit RSA key
4
+ Public-Lines: 6
5
+ AAAAB3NzaC1yc2EAAAABJQAAAQEAhcwsATtpPNlaXcGwb1QRVgvRxGia+XOZLTJO
6
+ eLdTMvy18XPR6ExVxXvJEnllJKFLCpnBAo/I9z7lkNjXMS2s6HVSlp7kU79HfDE8
7
+ m5dwAh7xPl1t+ClJUBiXmwm11z/UznkPnmA3O7JNImhkZjWVUXTFVC/hLRRALdwb
8
+ GRz+vcKp6cHtkVmH5e4gRUf8E7T28uJhP7oonLpY1b2POpDChOGNT3PeSM68i8dp
9
+ 4hjyhkI8OQD8Tmiuxw+e+vNw+dH9y9CjHwMdLC2sVpB2QXDrNc5zpp9Zth5LXHYh
10
+ lQVk3iuHlnyem5KgsuTL23+kJyK2OtpwOUb63mYiDzVbYPCw1Q==
11
+ Private-Lines: 14
12
+ Ph1M5YzOkAHx7SiNwS5gEREEEXfoAFfv+bOEoPVotv5tykXSAkg6F6eIRG4QrB7M
13
+ jXN1J2eA94qSxWvg4AuSrrDMKOP6hDIZ3RTo5omZW7iOxR9n19GvojGGqpy06HSh
14
+ E9Y1pvNBj8M5IchLQoEgCp8qnwpR3qnhEn9F981rGyYUVqC5SK2evLcMXpn3xYyk
15
+ FpPEm3aP6V6i+PFKTLwOyZDTwI69Po8dM5yVL7AK3twDLnPYwgmD+FpUG/x/UiTd
16
+ EWgX/txl7FtSmAOOYrY6Ible1I5RizAih+bWRBinEbJq0c/FjSaHFBmE4x0e18RS
17
+ mOw3VHrukY7R1R4UZnh+driNBmQm4RS/C9bIjInJEs3njCn2tY0OvlWT4PVLUkhy
18
+ XyJI5ezqAvQO6aiKxR1ELZU2qOejQi8Yu1DIgHzK6WafPkgrrsUeMQatT9JoZoVO
19
+ yGTBPfGAjALyDWT3pNP9bPIHa1/HzV6q/pbzlVFu8m1NV7pBr+i0qF5g+bUzSzsl
20
+ JJ5lfNY3dW46YLHJ5V1D7TAeQB9Hb4xXcZo39YB4eVBQYhjlNvmY4lhwX9OuxgQd
21
+ Oft5PeiUu/R64va+WaaGb0DxyrDC/ZCN71ZaBDLOpgg7HVpEcIbvsz3OUgJ2kDag
22
+ l6t/6+arO0F2golwnM4QDdZXpi07RgvqnQiN5ik1ruQvOymhI/pBkhoHHEvZMvuR
23
+ lviDAvcB90pUC5e5YDVja1kkheMbEiWGU+m6GQ7suCC81Y76qx0s49wp8NI5BTLX
24
+ KAjcXP2cjOyRR7hkhm+pP4lLIjTGqrQJkPTL+/sANgBUz8bAcJlBBitBFCdJNfYs
25
+ vCQcLIDMBts6cZzPtmGS4L/aBa2V+sOEY2Iy2nw3ON4GJkdbbCG5lK6pTAYJ/Ybk
26
+ Private-MAC: 6713a251801931475ec30fc04a56e46fcc3edc06
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEoQIBAAKCAQEAhcwsATtpPNlaXcGwb1QRVgvRxGia+XOZLTJOeLdTMvy18XPR
3
+ 6ExVxXvJEnllJKFLCpnBAo/I9z7lkNjXMS2s6HVSlp7kU79HfDE8m5dwAh7xPl1t
4
+ +ClJUBiXmwm11z/UznkPnmA3O7JNImhkZjWVUXTFVC/hLRRALdwbGRz+vcKp6cHt
5
+ kVmH5e4gRUf8E7T28uJhP7oonLpY1b2POpDChOGNT3PeSM68i8dp4hjyhkI8OQD8
6
+ Tmiuxw+e+vNw+dH9y9CjHwMdLC2sVpB2QXDrNc5zpp9Zth5LXHYhlQVk3iuHlnye
7
+ m5KgsuTL23+kJyK2OtpwOUb63mYiDzVbYPCw1QIBJQKCAQBsfAgA/70clI51iEnd
8
+ ucjd+77WmgEdSPi83K5UCkN1cvRi6ElUkOuZM+8jvF/Ygsc5BwsygmuYCXvdOjHw
9
+ heYkQ3NlXjyW7h5JBVO8bPMIo3d+rJ5aglceWSD6Pzl+GBRUYihW5jqfGvJu7NvI
10
+ fnkRnPMF/U7KmsxA2/pLtqUIjssgjq56sn5LQU87b+j/QjSRe7Ekr9B/QqydvZy9
11
+ jOOQVH6DFtyCUc+OPqQ4UPrAGHbcS6s+vU0gaht+ZAoRMgvinTV5oVPkXocc7NuH
12
+ WUBzOGuZlpM9T2qWEFgz1dtKZlcW5g86NfShwJiiCBYJNRD6BJH1gDZhmMBuwp9I
13
+ hbytAoGBAOl/jfwpsVrKFgXMmdDbiBoYxHZulLiwyygU+hnOlYvAZ6nwYflUNkM5
14
+ M/nokPhzcfvIGMewcIpCTQdXOdP1grfTidaaPVE4EOdWzHWzCOjtfZwX+YnzTNxP
15
+ yQoh+wusgO6QvNNezK0WBFf6M0Adwi+qUGe1COmERpve/+uipEZ1AoGBAJKw+2+M
16
+ EE0UXONrG5zsSiSNFm4090Qbx6AgWZqCM9nWvFhoD0x2AF+8vaVvzsTQj/Ic8UfQ
17
+ lzRUP7n/T0xVgHuT/F/mOo8nQckGwgLe8WX+ejC3n01dmidTmO7u1+zecKUULJZS
18
+ 2L1d6mJMqNFka+CPYkNvDt9ZOHa4q81tYzThAoGAfjccUPPxKigL53WDk32VrT3R
19
+ +tP9XOnxRhktPmHUS4qY5jy/VlcIkwop7t6TjTd74gtLqjXb97Uit9wfQiPX9Kmy
20
+ Snzi38tHaEqYCEUZkqnjCERPiNaKaT/iSqqVicUHbDKPlNlMCohxDPXyMH7J1JNp
21
+ u4RzhSTn5Y1MEKrxA30CgYBDZhKo330cfvo++dxBLkuUQNL0XYZdkDkgDt0Po5tI
22
+ aZTOrFoOX7r7jhHyEMbJIY4+zwcTKHzS2pnR/67QC5vlwIi2cLMfLbZxHsfXzjeP
23
+ uhx3P5w4TZnat7T4KIy48JSe38F1gAK33wrTN/qJuISXm9MzvWeyukpgD6jh2FAt
24
+ DQKBgQC/5RuZwGiLA6IBz/4Y5uutSOz9vGgoUJTd/6ee8pAUHnkbCoKMrSUBw7DU
25
+ aXtYdaP6zmls6eqP2X+k431Z9TfeyTLJ5BmeJYTguk//ITi6u9B5wUD/0eyBRhK1
26
+ t46BcED4Ib231qM2dFLelVyazF0C9ooSytfH6SAMLj/VD2jKYg==
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,26 @@
1
+ PuTTY-User-Key-File-2: ssh-rsa
2
+ Encryption: none
3
+ Comment: 2048 bit RSA key
4
+ Public-Lines: 6
5
+ AAAAB3NzaC1yc2EAAAABJQAAAQEAhcwsATtpPNlaXcGwb1QRVgvRxGia+XOZLTJO
6
+ eLdTMvy18XPR6ExVxXvJEnllJKFLCpnBAo/I9z7lkNjXMS2s6HVSlp7kU79HfDE8
7
+ m5dwAh7xPl1t+ClJUBiXmwm11z/UznkPnmA3O7JNImhkZjWVUXTFVC/hLRRALdwb
8
+ GRz+vcKp6cHtkVmH5e4gRUf8E7T28uJhP7oonLpY1b2POpDChOGNT3PeSM68i8dp
9
+ 4hjyhkI8OQD8Tmiuxw+e+vNw+dH9y9CjHwMdLC2sVpB2QXDrNc5zpp9Zth5LXHYh
10
+ lQVk3iuHlnyem5KgsuTL23+kJyK2OtpwOUb63mYiDzVbYPCw1Q==
11
+ Private-Lines: 14
12
+ AAABAGx8CAD/vRyUjnWISd25yN37vtaaAR1I+LzcrlQKQ3Vy9GLoSVSQ65kz7yO8
13
+ X9iCxzkHCzKCa5gJe906MfCF5iRDc2VePJbuHkkFU7xs8wijd36snlqCVx5ZIPo/
14
+ OX4YFFRiKFbmOp8a8m7s28h+eRGc8wX9TsqazEDb+ku2pQiOyyCOrnqyfktBTztv
15
+ 6P9CNJF7sSSv0H9CrJ29nL2M45BUfoMW3IJRz44+pDhQ+sAYdtxLqz69TSBqG35k
16
+ ChEyC+KdNXmhU+Rehxzs24dZQHM4a5mWkz1PapYQWDPV20pmVxbmDzo19KHAmKII
17
+ Fgk1EPoEkfWANmGYwG7Cn0iFvK0AAACBAOl/jfwpsVrKFgXMmdDbiBoYxHZulLiw
18
+ yygU+hnOlYvAZ6nwYflUNkM5M/nokPhzcfvIGMewcIpCTQdXOdP1grfTidaaPVE4
19
+ EOdWzHWzCOjtfZwX+YnzTNxPyQoh+wusgO6QvNNezK0WBFf6M0Adwi+qUGe1COmE
20
+ Rpve/+uipEZ1AAAAgQCSsPtvjBBNFFzjaxuc7EokjRZuNPdEG8egIFmagjPZ1rxY
21
+ aA9MdgBfvL2lb87E0I/yHPFH0Jc0VD+5/09MVYB7k/xf5jqPJ0HJBsIC3vFl/now
22
+ t59NXZonU5ju7tfs3nClFCyWUti9XepiTKjRZGvgj2JDbw7fWTh2uKvNbWM04QAA
23
+ AIEAv+UbmcBoiwOiAc/+GObrrUjs/bxoKFCU3f+nnvKQFB55GwqCjK0lAcOw1Gl7
24
+ WHWj+s5pbOnqj9l/pON9WfU33skyyeQZniWE4LpP/yE4urvQecFA/9HsgUYStbeO
25
+ gXBA+CG9t9ajNnRS3pVcmsxdAvaKEsrXx+kgDC4/1Q9oymI=
26
+ Private-MAC: 1121fbfa29150e2de19fb38ad23e0dc798897e57
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment:
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: 5ac70efe792f98c8dbce691365f8730db87056af
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: aes256-cbc
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ UPH0kPARB9c5B/l+9h87cpgeOM8DV2Aq4dtmnXkfmJCT/FobQwH3j3pOzlUfyfWq
9
+ 0vn0K0ijtguqf5k2iUQPAm9Htg/jIz6mQSlt64ywKmdjtwCzqABmIOxNLNlW/KpN
10
+ W178Ce6CrFYzStolWz1Lm6hYMs8Cr5eaWWQo/8Yr82U=
11
+ Private-MAC: f902208f2435849375143780bc8dfcc344e57a13
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: -2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: f3045e1abe1fd459117eec9d0eed18661b4274bb
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: camellia256-cbc
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ O4jfhfwamnLbbSs/DxTd+nZNFRcBC2XuPBD8VbSRNmLpx57FGVPiLvgYH5Ot8zhb
9
+ +90J6pY2hO6M2bQsQNoqMwDB0K/0bSG3ignWN4XKXJOofpmn2o8gBv7xfmJ++2Ni
10
+ qAdfPt1qZXIb7Yp4weFQiAWJ6m0ysDIS7Xnwv/uZLRc=
11
+ Private-MAC: 435b5081a0f34cee896e0783db15e9e832a9de31
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-1: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: f3045e1abe1fd459117eec9d0eed18661b4274bb
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-3: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: f3045e1abe1fd459117eec9d0eed18661b4274bb
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: a89e0b76bb00232fd21871875bcd319cff3116ea
@@ -0,0 +1,10 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: f3045e1abe1fd459117eec9d0eed18661b4274bb
@@ -0,0 +1,11 @@
1
+ PuTTY-User-Key-File-2: test
2
+ Encryption: none
3
+ Comment: This is a test ppk file
4
+ Public-Lines: 2
5
+ AAAABHRlc3QAAABKVGhpcyBpcyB0aGUgcHVibGljIGJsb2IgZnJvbSBhIHBwayBm
6
+ aWxlIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4=
7
+ Private-Lines: 3
8
+ AAAAd1RoaXMgaXMgdGhlIHByaXZhdGUgYmxvYiBmcm9tIGEgcHBrIGZpbGUgY3Jl
9
+ YXRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBpcyBzbGlnaHRseSBs
10
+ b25nZXIgdGhhbiB0aGUgcHVibGljIGJsb2Iu
11
+ Private-MAC: f3045e1abe1fd459117eec9d0eed18661b4274bb
@@ -0,0 +1,252 @@
1
+ require 'test_helper'
2
+
3
+ if TEST_TYPE == :refinement
4
+ # JRuby 9.0.5.0 ignores the conditional and imports the refinements
5
+ # regardless. Use send to prevent this.
6
+ send(:using, PuTTY::Key)
7
+ end
8
+
9
+ class OpenSSLTest < Minitest::Test
10
+ def test_from_ppk_nil
11
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(nil) }
12
+ end
13
+
14
+ def test_from_ppk_unsupported_algorithm
15
+ ppk = PuTTY::Key::PPK.new(fixture_path('test.ppk'))
16
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
17
+ end
18
+
19
+ def test_from_ppk_rsa
20
+ ppk = PuTTY::Key::PPK.new(fixture_path('rsa-2048.ppk'))
21
+ pkey = OpenSSL::PKey.from_ppk(ppk)
22
+ assert_kind_of(OpenSSL::PKey::RSA, pkey)
23
+ assert_equal(load_fixture('rsa-2048.pem'), pkey.to_pem)
24
+ end
25
+
26
+ def test_from_ppk_rsa_encrypted
27
+ ppk = PuTTY::Key::PPK.new(fixture_path('rsa-2048-encrypted.ppk'), 'Test Passphrase')
28
+ pkey = OpenSSL::PKey.from_ppk(ppk)
29
+ assert_kind_of(OpenSSL::PKey::RSA, pkey)
30
+ assert_equal(load_fixture('rsa-2048.pem'), pkey.to_pem)
31
+ end
32
+
33
+ def test_from_ppk_dss
34
+ ppk = PuTTY::Key::PPK.new(fixture_path('dss-1024.ppk'))
35
+ pkey = OpenSSL::PKey.from_ppk(ppk)
36
+ assert_kind_of(OpenSSL::PKey::DSA, pkey)
37
+ assert_equal(load_fixture('dss-1024.pem'), pkey.to_pem)
38
+ end
39
+
40
+ def test_from_ppk_dss_encrypted
41
+ ppk = PuTTY::Key::PPK.new(fixture_path('dss-1024-encrypted.ppk'), 'Test Passphrase')
42
+ pkey = OpenSSL::PKey.from_ppk(ppk)
43
+ assert_kind_of(OpenSSL::PKey::DSA, pkey)
44
+ assert_equal(load_fixture('dss-1024.pem'), pkey.to_pem)
45
+ end
46
+
47
+ # jruby-openssl doesn't include an EC class (version 0.9.16)
48
+ if defined?(OpenSSL::PKey::EC)
49
+ def test_from_ppk_ecdsa_sha2_nistp256
50
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp256.ppk'))
51
+ pkey = OpenSSL::PKey.from_ppk(ppk)
52
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
53
+ assert_equal(load_fixture('ecdsa-sha2-nistp256.pem'), pkey.to_pem)
54
+ end
55
+
56
+ def test_from_ppk_ecdsa_sha2_nistp256_encrypted
57
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp256-encrypted.ppk'), 'Test Passphrase')
58
+ pkey = OpenSSL::PKey.from_ppk(ppk)
59
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
60
+ assert_equal(load_fixture('ecdsa-sha2-nistp256.pem'), pkey.to_pem)
61
+ end
62
+
63
+ def test_from_ppk_ecdsa_sha2_nistp384
64
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp384.ppk'))
65
+ pkey = OpenSSL::PKey.from_ppk(ppk)
66
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
67
+ assert_equal(load_fixture('ecdsa-sha2-nistp384.pem'), pkey.to_pem)
68
+ end
69
+
70
+ def test_from_ppk_ecdsa_sha2_nistp384_encrypted
71
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp384-encrypted.ppk'), 'Test Passphrase')
72
+ pkey = OpenSSL::PKey.from_ppk(ppk)
73
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
74
+ assert_equal(load_fixture('ecdsa-sha2-nistp384.pem'), pkey.to_pem)
75
+ end
76
+
77
+ def test_from_ppk_ecdsa_sha2_nistp521
78
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp521.ppk'))
79
+ pkey = OpenSSL::PKey.from_ppk(ppk)
80
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
81
+ assert_equal(load_fixture('ecdsa-sha2-nistp521.pem'), pkey.to_pem)
82
+ end
83
+
84
+ def test_from_ppk_ecdsa_sha2_nistp521_encrypted
85
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp521-encrypted.ppk'), 'Test Passphrase')
86
+ pkey = OpenSSL::PKey.from_ppk(ppk)
87
+ assert_kind_of(OpenSSL::PKey::EC, pkey)
88
+ assert_equal(load_fixture('ecdsa-sha2-nistp521.pem'), pkey.to_pem)
89
+ end
90
+ else
91
+ def test_from_ppk_ecdsa_sha2_nistp256
92
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp256.ppk'))
93
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
94
+ end
95
+
96
+ def test_from_ppk_ecdsa_sha2_nistp256_encrypted
97
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp256-encrypted.ppk'), 'Test Passphrase')
98
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
99
+ end
100
+
101
+ def test_from_ppk_ecdsa_sha2_nistp384
102
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp384.ppk'))
103
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
104
+ end
105
+
106
+ def test_from_ppk_ecdsa_sha2_nistp384_encrypted
107
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp384-encrypted.ppk'), 'Test Passphrase')
108
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
109
+ end
110
+
111
+ def test_from_ppk_ecdsa_sha2_nistp521
112
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp521.ppk'))
113
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
114
+ end
115
+
116
+ def test_from_ppk_ecdsa_sha2_nistp521_encrypted
117
+ ppk = PuTTY::Key::PPK.new(fixture_path('ecdsa-sha2-nistp521-encrypted.ppk'), 'Test Passphrase')
118
+ assert_raises(ArgumentError) { OpenSSL::PKey.from_ppk(ppk) }
119
+ end
120
+ end
121
+
122
+ def pem_to_ppk(fixture, type = nil)
123
+ pem = load_fixture(fixture)
124
+
125
+ # Accessing OpenSSL::PKey::EC#public_key raises a warning when the key was
126
+ # loaded with OpenSSL::PKey.read(pem), but doesn't when instantiated with
127
+ # OpenSSL::PKey::EC.new(pem) (Ruby 2.3.0).
128
+ pkey = type ? type.new(pem) : OpenSSL::PKey.read(pem)
129
+
130
+ pkey.to_ppk.tap do |ppk|
131
+ assert_nil(ppk.comment)
132
+ end
133
+ end
134
+
135
+ def test_to_ppk_rsa
136
+ ppk = pem_to_ppk('rsa-2048.pem')
137
+ ppk.comment = '2048 bit RSA key'
138
+ temp_file_name do |file|
139
+ ppk.save(file)
140
+ assert_identical_to_fixture('rsa-2048.ppk', file)
141
+ end
142
+ end
143
+
144
+ def test_to_ppk_rsa_encrypted
145
+ ppk = pem_to_ppk('rsa-2048.pem')
146
+ ppk.comment = '2048 bit RSA key'
147
+ temp_file_name do |file|
148
+ ppk.save(file, 'Test Passphrase')
149
+ assert_identical_to_fixture('rsa-2048-encrypted.ppk', file)
150
+ end
151
+ end
152
+
153
+ def test_to_ppk_rsa_uninitialized
154
+ pkey = OpenSSL::PKey::RSA.new
155
+ assert_raises(PuTTY::Key::InvalidStateError) { pkey.to_ppk }
156
+ end
157
+
158
+ def test_to_ppk_dss
159
+ ppk = pem_to_ppk('dss-1024.pem')
160
+ ppk.comment = '1024 bit DSS key'
161
+ temp_file_name do |file|
162
+ ppk.save(file)
163
+ assert_identical_to_fixture('dss-1024.ppk', file)
164
+ end
165
+ end
166
+
167
+ def test_to_ppk_dss_encrypted
168
+ ppk = pem_to_ppk('dss-1024.pem')
169
+ ppk.comment = '1024 bit DSS key'
170
+ temp_file_name do |file|
171
+ ppk.save(file, 'Test Passphrase')
172
+ assert_identical_to_fixture('dss-1024-encrypted.ppk', file)
173
+ end
174
+ end
175
+
176
+ def test_to_ppk_dss_uninitialized
177
+ pkey = OpenSSL::PKey::DSA.new
178
+ assert_raises(PuTTY::Key::InvalidStateError) { pkey.to_ppk }
179
+ end
180
+
181
+ # jruby-openssl doesn't include an EC class (version 0.9.15)
182
+ if defined?(OpenSSL::PKey::EC)
183
+ def test_to_ppk_ecdsa_sha2_nistp256
184
+ ppk = pem_to_ppk('ecdsa-sha2-nistp256.pem', OpenSSL::PKey::EC)
185
+ ppk.comment = 'ECDSA NIST P-256 Key'
186
+ temp_file_name do |file|
187
+ ppk.save(file)
188
+ assert_identical_to_fixture('ecdsa-sha2-nistp256.ppk', file)
189
+ end
190
+ end
191
+
192
+ def test_to_ppk_ecdsa_sha2_nistp256_encrypted
193
+ ppk = pem_to_ppk('ecdsa-sha2-nistp256.pem', OpenSSL::PKey::EC)
194
+ ppk.comment = 'ECDSA NIST P-256 Key'
195
+ temp_file_name do |file|
196
+ ppk.save(file, 'Test Passphrase')
197
+ assert_identical_to_fixture('ecdsa-sha2-nistp256-encrypted.ppk', file)
198
+ end
199
+ end
200
+
201
+ def test_to_ppk_ecdsa_sha2_nistp384
202
+ ppk = pem_to_ppk('ecdsa-sha2-nistp384.pem', OpenSSL::PKey::EC)
203
+ ppk.comment = 'ECDSA NIST P-384 Key'
204
+ temp_file_name do |file|
205
+ ppk.save(file)
206
+ assert_identical_to_fixture('ecdsa-sha2-nistp384.ppk', file)
207
+ end
208
+ end
209
+
210
+ def test_to_ppk_ecdsa_sha2_nistp384_encrypted
211
+ ppk = pem_to_ppk('ecdsa-sha2-nistp384.pem', OpenSSL::PKey::EC)
212
+ ppk.comment = 'ECDSA NIST P-384 Key'
213
+ temp_file_name do |file|
214
+ ppk.save(file, 'Test Passphrase')
215
+ assert_identical_to_fixture('ecdsa-sha2-nistp384-encrypted.ppk', file)
216
+ end
217
+ end
218
+
219
+ def test_to_ppk_ecdsa_sha2_nistp521
220
+ ppk = pem_to_ppk('ecdsa-sha2-nistp521.pem', OpenSSL::PKey::EC)
221
+ ppk.comment = 'ECDSA NIST P-521 Key'
222
+ temp_file_name do |file|
223
+ ppk.save(file)
224
+ assert_identical_to_fixture('ecdsa-sha2-nistp521.ppk', file)
225
+ end
226
+ end
227
+
228
+ def test_to_ppk_ecdsa_sha2_nistp521_encrypted
229
+ ppk = pem_to_ppk('ecdsa-sha2-nistp521.pem', OpenSSL::PKey::EC)
230
+ ppk.comment = 'ECDSA NIST P-521 Key'
231
+ temp_file_name do |file|
232
+ ppk.save(file, 'Test Passphrase')
233
+ assert_identical_to_fixture('ecdsa-sha2-nistp521-encrypted.ppk', file)
234
+ end
235
+ end
236
+
237
+ def test_to_ppk_unsupported_ec_curve
238
+ pkey = OpenSSL::PKey::EC.new(load_fixture('ecdsa-secp256k1.pem'))
239
+ assert_raises(PuTTY::Key::UnsupportedCurveError) { pkey.to_ppk }
240
+ end
241
+
242
+ def test_to_ppk_uninitialized_ec_key
243
+ pkey = OpenSSL::PKey::EC.new('prime256v1')
244
+ assert_raises(PuTTY::Key::InvalidStateError) { pkey.to_ppk }
245
+ end
246
+
247
+ def test_to_ppk_uninitialized_ec_key_no_curve
248
+ pkey = OpenSSL::PKey::EC.new
249
+ assert_raises(PuTTY::Key::InvalidStateError) { pkey.to_ppk }
250
+ end
251
+ end
252
+ end