3
3
import org .bouncycastle .bcpg .PublicKeyPacket ;
4
4
import org .bouncycastle .bcpg .PublicKeyUtils ;
5
5
import org .bouncycastle .bcpg .SecretKeyPacket ;
6
+ import org .bouncycastle .bcpg .SignaturePacket ;
6
7
import org .bouncycastle .bcpg .SignatureSubpacketTags ;
7
8
import org .bouncycastle .bcpg .sig .Features ;
8
9
import org .bouncycastle .bcpg .sig .KeyFlags ;
12
13
import org .bouncycastle .openpgp .PGPSecretKey ;
13
14
import org .bouncycastle .openpgp .PGPSecretKeyRing ;
14
15
import org .bouncycastle .openpgp .PGPSignature ;
16
+ import org .bouncycastle .openpgp .PGPSignatureSubpacketVector ;
15
17
import org .bouncycastle .openpgp .api .OpenPGPV6KeyGenerator ;
16
18
import org .bouncycastle .openpgp .api .bc .BcOpenPGPV6KeyGenerator ;
17
19
import org .bouncycastle .openpgp .api .jcajce .JcaOpenPGPV6KeyGenerator ;
@@ -37,24 +39,24 @@ public void performTest()
37
39
throws Exception
38
40
{
39
41
// Run tests using the BC implementation
40
- performTests (new ImplementationProvider ()
42
+ performTests (new APIProvider ()
41
43
{
42
44
@ Override
43
- public OpenPGPV6KeyGenerator get (int signatureHashAlgorithm ,
44
- Date creationTime ,
45
- boolean aeadProtection )
45
+ public OpenPGPV6KeyGenerator getKeyGenerator (int signatureHashAlgorithm ,
46
+ Date creationTime ,
47
+ boolean aeadProtection )
46
48
{
47
49
return new BcOpenPGPV6KeyGenerator (signatureHashAlgorithm , creationTime , aeadProtection );
48
50
}
49
51
});
50
52
51
53
// Run tests using the JCA/JCE implementation
52
- performTests (new ImplementationProvider ()
54
+ performTests (new APIProvider ()
53
55
{
54
56
@ Override
55
- public OpenPGPV6KeyGenerator get (int signatureHashAlgorithm ,
56
- Date creationTime ,
57
- boolean aeadProtection )
57
+ public OpenPGPV6KeyGenerator getKeyGenerator (int signatureHashAlgorithm ,
58
+ Date creationTime ,
59
+ boolean aeadProtection )
58
60
throws PGPException
59
61
{
60
62
return new JcaOpenPGPV6KeyGenerator (signatureHashAlgorithm , creationTime , aeadProtection ,
@@ -63,41 +65,50 @@ public OpenPGPV6KeyGenerator get(int signatureHashAlgorithm,
63
65
});
64
66
}
65
67
66
- private void performTests (ImplementationProvider implementationProvider )
68
+ private void performTests (APIProvider apiProvider )
67
69
throws PGPException , IOException
68
70
{
69
- testGenerateSignOnlyKeyBaseCase (implementationProvider );
70
- testGenerateAEADProtectedSignOnlyKey (implementationProvider );
71
- testGenerateCFBProtectedSignOnlyKey (implementationProvider );
71
+ testGenerateSignOnlyKeyBaseCase (apiProvider );
72
+ testGenerateAEADProtectedSignOnlyKey (apiProvider );
73
+ testGenerateCFBProtectedSignOnlyKey (apiProvider );
72
74
73
- testGenerateClassicKeyBaseCase (implementationProvider );
74
- testGenerateProtectedTypicalKey (implementationProvider );
75
+ testGenerateClassicKeyBaseCase (apiProvider );
76
+ testGenerateProtectedTypicalKey (apiProvider );
75
77
76
- testGenerateCustomKey (implementationProvider );
78
+ testGenerateCustomKey (apiProvider );
77
79
}
78
80
79
- private void testGenerateSignOnlyKeyBaseCase (ImplementationProvider implementationProvider )
81
+ private void testGenerateSignOnlyKeyBaseCase (APIProvider apiProvider )
80
82
throws PGPException
81
83
{
82
- OpenPGPV6KeyGenerator generator = implementationProvider . get ();
84
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator ();
83
85
PGPSecretKeyRing secretKeys = generator .signOnlyKey ();
84
86
85
87
Iterator <PGPSecretKey > it = secretKeys .getSecretKeys ();
86
88
PGPSecretKey primaryKey = it .next ();
87
89
isFalse ("sign-only key MUST consists of only a single key" , it .hasNext ());
88
90
PGPSignature directKeySignature = primaryKey .getPublicKey ().getKeySignatures ().next ();
89
91
isNotNull ("Key MUST have direct-key signature" , directKeySignature );
92
+ isEquals ("Direct-key signature MUST be version 6" ,
93
+ SignaturePacket .VERSION_6 , directKeySignature .getVersion ());
94
+ PGPSignatureSubpacketVector hPackets = directKeySignature .getHashedSubPackets ();
95
+ isNotNull ("Subpackets MUST contain issuer-fingerprint subpacket" ,
96
+ hPackets .getIssuerFingerprint ());
97
+ isFalse ("Subpackets MUST NOT contain issuer-key-id subpacket" ,
98
+ hPackets .hasSubpacket (SignatureSubpacketTags .ISSUER_KEY_ID ));
99
+ isNotNull ("Subpackets MUST contain signature creation-time subpacket" ,
100
+ hPackets .getSignatureCreationTime ());
90
101
isEquals ("Sign-Only primary key MUST carry CS flags" ,
91
- KeyFlags .CERTIFY_OTHER | KeyFlags .SIGN_DATA , directKeySignature . getHashedSubPackets () .getKeyFlags ());
102
+ KeyFlags .CERTIFY_OTHER | KeyFlags .SIGN_DATA , hPackets .getKeyFlags ());
92
103
93
104
isEquals ("Key version mismatch" , 6 , primaryKey .getPublicKey ().getVersion ());
94
105
isEquals ("Key MUST be unprotected" , SecretKeyPacket .USAGE_NONE , primaryKey .getS2KUsage ());
95
106
}
96
107
97
- private void testGenerateAEADProtectedSignOnlyKey (ImplementationProvider implementationProvider )
108
+ private void testGenerateAEADProtectedSignOnlyKey (APIProvider apiProvider )
98
109
throws PGPException
99
110
{
100
- OpenPGPV6KeyGenerator generator = implementationProvider . get (true );
111
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator (true );
101
112
PGPSecretKeyRing secretKeys = generator .signOnlyKey ("passphrase" .toCharArray ());
102
113
103
114
Iterator <PGPSecretKey > it = secretKeys .getSecretKeys ();
@@ -111,10 +122,10 @@ private void testGenerateAEADProtectedSignOnlyKey(ImplementationProvider impleme
111
122
.build ("passphrase" .toCharArray ())));
112
123
}
113
124
114
- private void testGenerateCFBProtectedSignOnlyKey (ImplementationProvider implementationProvider )
125
+ private void testGenerateCFBProtectedSignOnlyKey (APIProvider apiProvider )
115
126
throws PGPException
116
127
{
117
- OpenPGPV6KeyGenerator generator = implementationProvider . get (false );
128
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator (false );
118
129
PGPSecretKeyRing secretKeys = generator .signOnlyKey ("passphrase" .toCharArray ());
119
130
120
131
Iterator <PGPSecretKey > it = secretKeys .getSecretKeys ();
@@ -128,11 +139,11 @@ private void testGenerateCFBProtectedSignOnlyKey(ImplementationProvider implemen
128
139
.build ("passphrase" .toCharArray ())));
129
140
}
130
141
131
- private void testGenerateClassicKeyBaseCase (ImplementationProvider provider )
142
+ private void testGenerateClassicKeyBaseCase (APIProvider apiProvider )
132
143
throws PGPException
133
144
{
134
145
Date creationTime = currentTimeRounded ();
135
- OpenPGPV6KeyGenerator generator = provider . get (creationTime );
146
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator (creationTime );
136
147
PGPSecretKeyRing secretKeys = generator
137
148
.
classicKey (
"Alice <[email protected] >" ,
null );
138
149
@@ -187,11 +198,11 @@ private void testGenerateClassicKeyBaseCase(ImplementationProvider provider)
187
198
}
188
199
}
189
200
190
- private void testGenerateProtectedTypicalKey (ImplementationProvider provider )
201
+ private void testGenerateProtectedTypicalKey (APIProvider apiProvider )
191
202
throws PGPException
192
203
{
193
204
Date creationTime = currentTimeRounded ();
194
- OpenPGPV6KeyGenerator generator = provider . get (creationTime );
205
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator (creationTime );
195
206
PGPSecretKeyRing secretKeys = generator
196
207
.
classicKey (
"Alice <[email protected] >" ,
"passphrase" .
toCharArray ());
197
208
@@ -218,11 +229,11 @@ private void testGenerateProtectedTypicalKey(ImplementationProvider provider)
218
229
}
219
230
}
220
231
221
- private void testGenerateCustomKey (ImplementationProvider implementationProvider )
232
+ private void testGenerateCustomKey (APIProvider apiProvider )
222
233
throws PGPException
223
234
{
224
235
Date creationTime = currentTimeRounded ();
225
- OpenPGPV6KeyGenerator generator = implementationProvider . get (creationTime );
236
+ OpenPGPV6KeyGenerator generator = apiProvider . getKeyGenerator (creationTime );
226
237
227
238
PGPSecretKeyRing secretKey = generator
228
239
.withPrimaryKey (
@@ -258,27 +269,27 @@ private void testGenerateCustomKey(ImplementationProvider implementationProvider
258
269
.build ();
259
270
}
260
271
261
- private abstract static class ImplementationProvider
272
+ private abstract static class APIProvider
262
273
{
263
- public OpenPGPV6KeyGenerator get ()
274
+ public OpenPGPV6KeyGenerator getKeyGenerator ()
264
275
throws PGPException
265
276
{
266
- return get (new Date ());
277
+ return getKeyGenerator (new Date ());
267
278
}
268
279
269
- public OpenPGPV6KeyGenerator get (Date creationTime )
280
+ public OpenPGPV6KeyGenerator getKeyGenerator (Date creationTime )
270
281
throws PGPException
271
282
{
272
- return get (OpenPGPV6KeyGenerator .DEFAULT_SIGNATURE_HASH_ALGORITHM , creationTime , true );
283
+ return getKeyGenerator (OpenPGPV6KeyGenerator .DEFAULT_SIGNATURE_HASH_ALGORITHM , creationTime , true );
273
284
}
274
285
275
- public OpenPGPV6KeyGenerator get (boolean aeadProtection )
286
+ public OpenPGPV6KeyGenerator getKeyGenerator (boolean aeadProtection )
276
287
throws PGPException
277
288
{
278
- return get (OpenPGPV6KeyGenerator .DEFAULT_SIGNATURE_HASH_ALGORITHM , new Date (), aeadProtection );
289
+ return getKeyGenerator (OpenPGPV6KeyGenerator .DEFAULT_SIGNATURE_HASH_ALGORITHM , new Date (), aeadProtection );
279
290
}
280
291
281
- public abstract OpenPGPV6KeyGenerator get (int signatureHashAlgorithm , Date creationTime , boolean aeadProtection )
292
+ public abstract OpenPGPV6KeyGenerator getKeyGenerator (int signatureHashAlgorithm , Date creationTime , boolean aeadProtection )
282
293
throws PGPException ;
283
294
}
284
295
0 commit comments