@@ -103,4 +103,101 @@ def test_read_private_key_with_password
103
103
assert key . is_a? ( OpenSSL ::PKey ::RSA )
104
104
end
105
105
106
+ def test_RSAPrivateKey_encrypted
107
+ rsa1024 = Fixtures . pkey ( "rsa1024" )
108
+ # key = abcdef
109
+ pem = <<~EOF
110
+ -----BEGIN RSA PRIVATE KEY-----
111
+ Proc-Type: 4,ENCRYPTED
112
+ DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0
113
+
114
+ zgJniZZQfvv8TFx3LzV6zhAQVayvQVZlAYqFq2yWbbxzF7C+IBhKQle9IhUQ9j/y
115
+ /jkvol550LS8vZ7TX5WxyDLe12cdqzEvpR6jf3NbxiNysOCxwG4ErhaZGP+krcoB
116
+ ObuL0nvls/+3myy5reKEyy22+0GvTDjaChfr+FwJjXMG+IBCLscYdgZC1LQL6oAn
117
+ 9xY5DH3W7BW4wR5ttxvtN32TkfVQh8xi3jrLrduUh+hV8DTiAiLIhv0Vykwhep2p
118
+ WZA+7qbrYaYM8GLLgLrb6LfBoxeNxAEKiTpl1quFkm+Hk1dKq0EhVnxHf92x0zVF
119
+ jRGZxAMNcrlCoE4f5XK45epVZSZvihdo1k73GPbp84aZ5P/xlO4OwZ3i4uCQXynl
120
+ jE9c+I+4rRWKyPz9gkkqo0+teJL8ifeKt/3ab6FcdA0aArynqmsKJMktxmNu83We
121
+ YVGEHZPeOlyOQqPvZqWsLnXQUfg54OkbuV4/4mWSIzxFXdFy/AekSeJugpswMXqn
122
+ oNck4qySNyfnlyelppXyWWwDfVus9CVAGZmJQaJExHMT/rQFRVchlmY0Ddr5O264
123
+ gcjv90o1NBOc2fNcqjivuoX7ROqys4K/YdNQ1HhQ7usJghADNOtuLI8ZqMh9akXD
124
+ Eqp6Ne97wq1NiJj0nt3SJlzTnOyTjzrTe0Y+atPkVKp7SsjkATMI9JdhXwGhWd7a
125
+ qFVl0owZiDasgEhyG2K5L6r+yaJLYkPVXZYC/wtWC3NEchnDWZGQcXzB4xROCQkD
126
+ OlWNYDkPiZioeFkA3/fTMvG4moB2Pp9Q4GU5fJ6k43Ccu1up8dX/LumZb4ecg5/x
127
+ -----END RSA PRIVATE KEY-----
128
+ EOF
129
+ key = OpenSSL ::PKey ::RSA . new ( pem , "abcdef" )
130
+ assert_same_rsa rsa1024 , key
131
+ key = OpenSSL ::PKey ::RSA . new ( pem ) { "abcdef" }
132
+ assert_same_rsa rsa1024 , key
133
+ assert_predicate key , :private?
134
+
135
+ ##
136
+ der = "0\x82 \x02 ^\x02 \x01 \x00 \x02 \x81 \x81 \x00 \xCB \xC2 \xC4 \xB0 \xD4 @\xA7 >\xD4 \xFE >C\xA0 \x1E \x17 \x06 \x03 \xBD g\xC0 -\xBF \x9C \xBF 9T\x11 \xA7 F\xA0 \xF1 :\xA8 \xD5 \x87 \xB0 \xB1 h\xA3 \xC4 E\x81 \xEC \x93 \x80 O\n A7n\xBB S\x84 \xF5 \x9C \xF6 H\xC7 \x11 \x04 ;\xB9 \xFF X\xD6 \xB6 \xC2 \xCF IZ\xC8 \xDA \x87 \xCB ,\x10 \x11 R\xC5 \x9A \x9D \\ \xA4 \x8B \x7F Cx\x1E .\xFF \x19 \x0F \xDA b\x86 \x8C \n $<\x8C \x0E #z\x02 \xB6 \x14 \x99 \x97 3\xBD n=\xEF \xA3 \x14 \xDF \xE9 y\xE0 N\xA5 \x17 \xF2 _\x14 E9\x87 \x02 \x03 \x01 \x00 \x01 \x02 \x81 \x81 \x00 \xA4 \xA5 \xFC \xC4 \x1A \xAF '\xB5 \xC8 \xEC \xAC \xA9 ~\x8F \xF1 \xF0 \xC5 B\xDE \xBC V\xFB W\x90 \xD9 \xA5 J\" \x8E \x1A \xEC \xF2 \x86 \x8D \f \xF9 ER\x15 \xCB :\x93 R\xF4 \x99 \xA0 \xC4 \xDB \x90 \f eH\x86 \xCE \xE5 \x87 \xC9 \xA5 9\xE5 \xDE \xD1 \\ 8\x1E \xB2 @\xCC j@\xF5 \xBF \xA6 ^\x8D \x8B q&D\x97 lD\xCE L\xB0 \xF0 Qd\xE7 \xEB _\x13 \x82 v\xF5 \xEE \xD5 5\x8E KT\xB5 N\xBB \xC4 \xAF \xF4 \xF2 /\xD7 \xA1 \xD9 `\x9D \b l\xE9 Z\a N\xE0 \xA1 \xDC {\xBB \xEC \xEE \x91 \x02 A\x00 \xEF \xE8 1\xA8 \e \x99 G\x9E \xF6 \xEF \x8F \xDA \x92 %\xBF J\xE5 \xE6 \xD1 %\xCF \x12 \xF8 \xB2 ;S.I\x1C -#\xCE \xC1 \xD3 `\xF4 \xAA \x05 |\x0F U\a Fn\x00 \x84 \xC9 \xC9 \xF0 \xC0 \xAC \xD7 \xCD =\x90 \xC4 \x04 &$\x14 \n \xBA }\x99 \x02 A\x00 \xD9 m\xDA x\x01 ;^.\xB3 \xA3 g\x86 \xE0 ,xP\xD3 \a 0\x87 _\x05 \x14 \xBB V\n \x1E \x93 \f \x9B \x1A g\x1A \xA6 \xA5 th\x17 \xB0 \xE6 A\xDE X\t \xB1 ?U\x94 g\xF7 `f\x1D \x90 \xB4 \xCD U\xBA @\xA9 J\xA4 \x1F \x02 A\x00 \xE2 K\t \e \xE2 \xFC \x90 |7\xBC \xFC \xDA T\xE4 \xDA -\xD1 \xF2 \b \xF2 ;\x03 P&\xFE \xA2 \x95 \x94 L\xC9 \x9F o\x15 \x91 GqA6\xEF 0\x9F )\xBF \x9B _M\xE1 \xF1 c\xF0 \xBA \x98 \xCC u\xF8 )\x8D (T\xFB \xBA \xAA \xF2 q\x02 A\x00 \xC1 \xAE l\x9C \xD7 \xA4 \x15 \xCA \x8E 4\xB2 \x04 \xE0 n\\ \xA2 \xCA \xC8 \xAD \xBE \xF8 \xB2 \xA2 \xFC \x19 \xB1 \x9B \xF8 \xAB \x93 \x02 \x9A \xF3 \x8F \x9C \xF5 +\xC0 f\xD1 E\xBD \x95 8\xD5 \x0E 0\xE2 \xA9 \x16 e\xF6 R/\xEC u?\xFE x\xFB \x14 \xC5 K\x02 @cQq\x03 \xF3 w@\xF0 \x97 \n 3\xE1 \xE5 \x8A \x85 \xC4 \x03 \x10 \xB3 eUa7\xE0 \xFA \xDD \f \x11 \xC2 Ct\xF3 \x10 \x0F \x92 W\xEA \x0E G*q\xC5 \x83 i\x99 \xB6 \x85 \xD0 \xAD i\x89 J~\xE9 \xF0 bJ\xF3 #S\xA2 \x91 \x04 \xAC "
137
+ pp OpenSSL ::ASN1 . decode ( key . to_der ) if $DEBUG
138
+ assert_equal der , key . to_der
139
+
140
+ cipher = OpenSSL ::Cipher . new ( "aes-128-cbc" )
141
+ exported = rsa1024 . to_pem ( cipher , "abcdef\0 \1 " )
142
+ assert_same_rsa rsa1024 , OpenSSL ::PKey ::RSA . new ( exported , "abcdef\0 \1 " )
143
+ assert_raise ( OpenSSL ::PKey ::RSAError ) {
144
+ OpenSSL ::PKey ::RSA . new ( exported , "abcdef" )
145
+ }
146
+ end
147
+
148
+ def test_RSAPublicKey
149
+ rsa1024 = Fixtures . pkey ( "rsa1024" )
150
+
151
+ asn1 = OpenSSL ::ASN1 ::Sequence ( [ OpenSSL ::ASN1 ::Integer ( rsa1024 . n ) , OpenSSL ::ASN1 ::Integer ( rsa1024 . e ) ] )
152
+
153
+ key = OpenSSL ::PKey ::RSA . new ( asn1 . to_der )
154
+ assert_not_predicate key , :private?
155
+ n = 143085709396403084580358323862163416700436550432664688288860593156058579474547937626086626045206357324274536445865308750491138538454154232826011964045825759324933943290377903384882276841880081931690695505836279972214003660451338124170055999155993192881685495391496854691199517389593073052473319331505702779271
156
+ assert_equal n , key . n
157
+ assert_same_rsa dup_public ( rsa1024 ) , key
158
+
159
+ ##
160
+ der = "0\x81 \x9F 0\r \x06 \t *\x86 H\x86 \xF7 \r \x01 \x01 \x01 \x05 \x00 \x03 \x81 \x8D \x00 0\x81 \x89 \x02 \x81 \x81 \x00 \xCB \xC2 \xC4 \xB0 \xD4 @\xA7 >\xD4 \xFE >C\xA0 \x1E \x17 \x06 \x03 \xBD g\xC0 -\xBF \x9C \xBF 9T\x11 \xA7 F\xA0 \xF1 :\xA8 \xD5 \x87 \xB0 \xB1 h\xA3 \xC4 E\x81 \xEC \x93 \x80 O\n A7n\xBB S\x84 \xF5 \x9C \xF6 H\xC7 \x11 \x04 ;\xB9 \xFF X\xD6 \xB6 \xC2 \xCF IZ\xC8 \xDA \x87 \xCB ,\x10 \x11 R\xC5 \x9A \x9D \\ \xA4 \x8B \x7F Cx\x1E .\xFF \x19 \x0F \xDA b\x86 \x8C \n $<\x8C \x0E #z\x02 \xB6 \x14 \x99 \x97 3\xBD n=\xEF \xA3 \x14 \xDF \xE9 y\xE0 N\xA5 \x17 \xF2 _\x14 E9\x87 \x02 \x03 \x01 \x00 \x01 "
161
+ pp OpenSSL ::ASN1 . decode ( key . to_der ) if $DEBUG
162
+ assert_equal der , key . to_der
163
+
164
+ pem = <<~EOF
165
+ -----BEGIN RSA PUBLIC KEY-----
166
+ MIGJAoGBAMvCxLDUQKc+1P4+Q6AeFwYDvWfALb+cvzlUEadGoPE6qNWHsLFoo8RF
167
+ geyTgE8KQTduu1OE9Zz2SMcRBDu5/1jWtsLPSVrI2ofLLBARUsWanVyki39DeB4u
168
+ /xkP2mKGjAokPIwOI3oCthSZlzO9bj3voxTf6XngTqUX8l8URTmHAgMBAAE=
169
+ -----END RSA PUBLIC KEY-----
170
+ EOF
171
+ key = OpenSSL ::PKey ::RSA . new ( pem )
172
+ assert_not_predicate key , :private?
173
+ assert_same_rsa dup_public ( rsa1024 ) , key
174
+
175
+ ##
176
+ assert_equal der , key . to_der
177
+
178
+ expected = "b48c0b2bbd35b906c5af4e46ed7355e4aaeadc99"
179
+ assert_equal expected , OpenSSL ::Digest ::SHA1 . hexdigest ( key . to_der )
180
+ end
181
+
182
+ private
183
+
184
+ def assert_same_rsa ( expected , key )
185
+ check_component ( expected , key , [ :n , :e , :d , :p , :q , :dmp1 , :dmq1 , :iqmp ] )
186
+ end
187
+
188
+ def check_component ( base , test , keys )
189
+ keys . each { |comp | assert_equal base . send ( comp ) , test . send ( comp ) }
190
+ end
191
+
192
+ def dup_public ( key )
193
+ case key
194
+ when OpenSSL ::PKey ::RSA
195
+ rsa = OpenSSL ::PKey ::RSA . new
196
+ rsa . set_key ( key . n , key . e , nil )
197
+ rsa
198
+ else
199
+ raise "unknown key type: #{ key . class } "
200
+ end
201
+ end
202
+
106
203
end
0 commit comments