@@ -71,4 +71,165 @@ def test_dsa_sys_sign_verify
71
71
assert dsa . sysverify ( digest , sig ) . eql? ( true )
72
72
end
73
73
74
+ def test_DSAPrivateKey
75
+ # OpenSSL DSAPrivateKey format; similar to RSAPrivateKey
76
+ dsa512 = Fixtures . pkey ( "dsa512" )
77
+ asn1 = OpenSSL ::ASN1 ::Sequence ( [
78
+ OpenSSL ::ASN1 ::Integer ( 0 ) ,
79
+ OpenSSL ::ASN1 ::Integer ( dsa512 . p ) ,
80
+ OpenSSL ::ASN1 ::Integer ( dsa512 . q ) ,
81
+ OpenSSL ::ASN1 ::Integer ( dsa512 . g ) ,
82
+ OpenSSL ::ASN1 ::Integer ( dsa512 . pub_key ) ,
83
+ OpenSSL ::ASN1 ::Integer ( dsa512 . priv_key )
84
+ ] )
85
+ key = OpenSSL ::PKey ::DSA . new ( asn1 . to_der )
86
+ assert_predicate key , :private?
87
+ assert_same_dsa dsa512 , key
88
+
89
+ pem = <<~EOF
90
+ -----BEGIN DSA PRIVATE KEY-----
91
+ MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
92
+ RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
93
+ AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
94
+ S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
95
+ Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
96
+ 55jreJD3Se3slps=
97
+ -----END DSA PRIVATE KEY-----
98
+ EOF
99
+ key = OpenSSL ::PKey ::DSA . new ( pem )
100
+ assert_same_dsa dsa512 , key
101
+
102
+ assert_equal asn1 . to_der , dsa512 . to_der
103
+ assert_equal pem , dsa512 . export
104
+ end
105
+
106
+ def test_DSAPrivateKey_encrypted
107
+ # key = abcdef
108
+ dsa512 = Fixtures . pkey ( "dsa512" )
109
+ pem = <<~EOF
110
+ -----BEGIN DSA PRIVATE KEY-----
111
+ Proc-Type: 4,ENCRYPTED
112
+ DEK-Info: AES-128-CBC,F8BB7BFC7EAB9118AC2E3DA16C8DB1D9
113
+
114
+ D2sIzsM9MLXBtlF4RW42u2GB9gX3HQ3prtVIjWPLaKBYoToRUiv8WKsjptfZuLSB
115
+ 74ZPdMS7VITM+W1HIxo/tjS80348Cwc9ou8H/E6WGat8ZUk/igLOUEII+coQS6qw
116
+ QpuLMcCIavevX0gjdjEIkojBB81TYDofA1Bp1z1zDI/2Zhw822xapI79ZF7Rmywt
117
+ OSyWzFaGipgDpdFsGzvT6//z0jMr0AuJVcZ0VJ5lyPGQZAeVBlbYEI4T72cC5Cz7
118
+ XvLiaUtum6/sASD2PQqdDNpgx/WA6Vs1Po2kIUQIM5TIwyJI0GdykZcYm6xIK/ta
119
+ Wgx6c8K+qBAIVrilw3EWxw==
120
+ -----END DSA PRIVATE KEY-----
121
+ EOF
122
+ key = OpenSSL ::PKey ::DSA . new ( pem , "abcdef" )
123
+ assert_same_dsa dsa512 , key
124
+ key = OpenSSL ::PKey ::DSA . new ( pem ) { "abcdef" }
125
+ assert_same_dsa dsa512 , key
126
+
127
+ cipher = OpenSSL ::Cipher . new ( "aes-128-cbc" )
128
+ exported = dsa512 . to_pem ( cipher , "abcdef\0 \1 " )
129
+ assert_same_dsa dsa512 , OpenSSL ::PKey ::DSA . new ( exported , "abcdef\0 \1 " )
130
+ assert_raise ( OpenSSL ::PKey ::DSAError ) {
131
+ OpenSSL ::PKey ::DSA . new ( exported , "abcdef" )
132
+ }
133
+ end
134
+
135
+ def test_PUBKEY
136
+ dsa512 = Fixtures . pkey ( "dsa512" )
137
+ asn1 = OpenSSL ::ASN1 ::Sequence ( [
138
+ OpenSSL ::ASN1 ::Sequence ( [
139
+ OpenSSL ::ASN1 ::ObjectId ( "DSA" ) ,
140
+ OpenSSL ::ASN1 ::Sequence ( [
141
+ OpenSSL ::ASN1 ::Integer ( dsa512 . p ) ,
142
+ OpenSSL ::ASN1 ::Integer ( dsa512 . q ) ,
143
+ OpenSSL ::ASN1 ::Integer ( dsa512 . g )
144
+ ] )
145
+ ] ) ,
146
+ OpenSSL ::ASN1 ::BitString ( OpenSSL ::ASN1 ::Integer ( dsa512 . pub_key ) . to_der )
147
+ ] )
148
+ key = OpenSSL ::PKey ::DSA . new ( asn1 . to_der )
149
+ assert_not_predicate key , :private?
150
+ assert_same_dsa dup_public ( dsa512 ) , key
151
+
152
+ ##
153
+ der = "0\x81 \xF1 0\x81 \xA8 \x06 \a *\x86 H\xCE 8\x04 \x01 0\x81 \x9C \x02 A\x00 \xE6 Px\x1A \xF1 0\x8E \xBB \f \x94 `\xEA \x1A \xCC kn\xA7 \x85 F\x1E \xA8 \xF4 \xE5 \xAD \xE8 X\x13 b!\x04 \x1D \xA3 \x98 \x86 B1\xBF C\xA4 E\x93 \xC3 7\x03 \x86 \xF7 \xDE \xE6 \x0E 0g\xBC 2u\x8B \x9E \x8E \x99 -\xCC m9\xE8 \xBF \x02 \x15 \x00 \x98 .o\xF6 \x83 \xAD \xC1 \xE0 6F\x1F \xB5 2j\xB7 \x1A \e .\x83 \x02 @}\x1D \xD1 p\xFF {]\xF0 \xAE %\xD4 VG\xBF \xB4 \xC2 e\xE2 wd\xB6 \xFB t]\xD3 Z\x81 \x94 ?M7D*\xA8 \x8E -\xFF \x94 wJ\xA1 WS@\xDB \x91 K\xF9 \xBA \x0E P\xB0 \x86 4c\x89 \x0F \xE5 \x05 \x18 \x02 ,'\x1A \x03 D\x00 \x02 A\x00 \x8C \xDF =\xD4 \x90 c\xCE \x93 #\xE1 \xB5 \xA0 \xB0 \x00 \xA6 2\b \x05 \x7F \x9E \xC3 KD\xE2 \xFB \x9F \xBE CUA\xF2 \xA9 \t 7\xBA \xC0 \xEF \xFD \x87 \xAC $w\x81 ;\x16 5\xBD X\x84 \v '\x16 \xCA \x1E F\xC7 \x02 \xF8 \xBC W\xA1 x\xBD 8"
154
+ pp OpenSSL ::ASN1 . decode ( key . to_der ) if $DEBUG
155
+ assert_equal der , key . to_der
156
+
157
+ pem = <<~EOF
158
+ -----BEGIN PUBLIC KEY-----
159
+ MIHxMIGoBgcqhkjOOAQBMIGcAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgT
160
+ YiEEHaOYhkIxv0OkRZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB
161
+ 4DZGH7UyarcaGy6DAkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqo
162
+ ji3/lHdKoVdTQNuRS/m6DlCwhjRjiQ/lBRgCLCcaA0QAAkEAjN891JBjzpMj4bWg
163
+ sACmMggFf57DS0Ti+5++Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxX
164
+ oXi9OA==
165
+ -----END PUBLIC KEY-----
166
+ EOF
167
+ key = OpenSSL ::PKey ::DSA . new ( pem )
168
+ assert_same_dsa dup_public ( dsa512 ) , key
169
+
170
+ ##
171
+ assert_equal der , key . to_der
172
+
173
+ dup_der = dup_public ( dsa512 ) . to_der
174
+ # pp OpenSSL::ASN1.decode(dup_der)
175
+ assert_equal asn1 . to_der . size , dup_der . size
176
+ assert_equal asn1 . to_der . encoding , dup_der . encoding
177
+ # TODO smt slightly weird with to_der:
178
+ #assert_equal asn1.to_der, dup_der
179
+ assert_equal asn1 . value [ 1 ] . value , OpenSSL ::ASN1 . decode ( dup_der ) . value [ 1 ] . value
180
+ assert_equal asn1 . value [ 0 ] . value [ 0 ] . value , OpenSSL ::ASN1 . decode ( dup_der ) . value [ 0 ] . value [ 0 ] . value
181
+ assert_equal asn1 . value [ 0 ] . value [ 1 ] . value [ 0 ] . value , OpenSSL ::ASN1 . decode ( dup_der ) . value [ 0 ] . value [ 1 ] . value [ 0 ] . value
182
+ assert_equal asn1 . value [ 0 ] . value [ 1 ] . value [ 1 ] . value , OpenSSL ::ASN1 . decode ( dup_der ) . value [ 0 ] . value [ 1 ] . value [ 1 ] . value
183
+ assert_equal asn1 . value [ 0 ] . value [ 1 ] . value [ 2 ] . value , OpenSSL ::ASN1 . decode ( dup_der ) . value [ 0 ] . value [ 1 ] . value [ 2 ] . value
184
+
185
+ assert_equal pem , dup_public ( dsa512 ) . export
186
+ end
187
+
188
+ def test_read_DSAPublicKey_pem
189
+ # NOTE: where is the standard? PKey::DSA.new can read only PEM
190
+ p = 12260055936871293565827712385212529106400444521449663325576634579961635627321079536132296996623400607469624537382977152381984332395192110731059176842635699
191
+ q = 979494906553787301107832405790107343409973851677
192
+ g = 3731695366899846297271147240305742456317979984190506040697507048095553842519347835107669437969086119948785140453492839427038591924536131566350847469993845
193
+ y = 10505239074982761504240823422422813362721498896040719759460296306305851824586095328615844661273887569281276387605297130014564808567159023649684010036304695
194
+ pem = <<-EOF
195
+ -----BEGIN DSA PUBLIC KEY-----
196
+ MIHfAkEAyJSJ+g+P/knVcgDwwTzC7Pwg/pWs2EMd/r+lYlXhNfzg0biuXRul8VR4
197
+ VUC/phySExY0PdcqItkR/xYAYNMbNwJBAOoV57X0FxKO/PrNa/MkoWzkCKV/hzhE
198
+ p0zbFdsicw+hIjJ7S6Sd/FlDlo89HQZ2FuvWJ6wGLM1j00r39+F2qbMCFQCrkhIX
199
+ SG+is37hz1IaBeEudjB2HQJAR0AloavBvtsng8obsjLb7EKnB+pSeHr/BdIQ3VH7
200
+ fWLOqqkzFeRrYMDzUpl36XktY6Yq8EJYlW9pCMmBVNy/dQ==
201
+ -----END DSA PUBLIC KEY-----
202
+ EOF
203
+ key = OpenSSL ::PKey ::DSA . new ( pem )
204
+ assert ( key . public? )
205
+ assert ( !key . private? )
206
+ assert_equal ( p , key . p )
207
+ assert_equal ( q , key . q )
208
+ assert_equal ( g , key . g )
209
+ assert_equal ( y , key . pub_key )
210
+ assert_equal ( nil , key . priv_key )
211
+ end
212
+
213
+ private
214
+
215
+ def assert_same_dsa ( expected , key )
216
+ check_component ( expected , key , [ :p , :q , :g , :pub_key , :priv_key ] )
217
+ end
218
+
219
+ def check_component ( base , test , keys )
220
+ keys . each { |comp | assert_equal base . send ( comp ) , test . send ( comp ) }
221
+ end
222
+
223
+ def dup_public ( key )
224
+ case key
225
+ when OpenSSL ::PKey ::DSA
226
+ dsa = OpenSSL ::PKey ::DSA . new
227
+ dsa . set_pqg ( key . p , key . q , key . g )
228
+ dsa . set_key ( key . pub_key , nil )
229
+ dsa
230
+ else
231
+ raise "unknown key type: #{ key . class } "
232
+ end
233
+ end
234
+
74
235
end
0 commit comments