putty-key 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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