20
20
import org .bouncycastle .openpgp .PGPPrivateKey ;
21
21
import org .bouncycastle .openpgp .PGPPublicKey ;
22
22
import org .bouncycastle .openpgp .PGPPublicKeyRing ;
23
- import org .bouncycastle .openpgp .PGPSecretKey ;
24
- import org .bouncycastle .openpgp .PGPSecretKeyRing ;
25
23
import org .bouncycastle .openpgp .PGPSignature ;
26
24
import org .bouncycastle .openpgp .PGPSignatureGenerator ;
27
25
import org .bouncycastle .openpgp .operator .PBEKeyEncryptionMethodGenerator ;
28
- import org .bouncycastle .openpgp .operator .PBESecretKeyDecryptor ;
29
26
import org .bouncycastle .openpgp .operator .PGPDataEncryptorBuilder ;
30
27
import org .bouncycastle .openpgp .operator .PublicKeyKeyEncryptionMethodGenerator ;
31
28
35
32
import java .util .ArrayList ;
36
33
import java .util .Date ;
37
34
import java .util .Iterator ;
38
- import java .util .LinkedHashSet ;
39
35
import java .util .List ;
40
- import java .util .Set ;
41
36
import java .util .Stack ;
42
37
import java .util .stream .Collectors ;
43
38
@@ -106,21 +101,9 @@ else if (configuration.recipients.isEmpty())
106
101
private HashAlgorithmNegotiator hashAlgorithmNegotiator =
107
102
(key , subkey ) -> HashAlgorithmTags .SHA512 ;
108
103
109
- private SubkeySelector encryptionKeySelector = certificate ->
110
- {
111
- List <OpenPGPCertificate .OpenPGPComponentKey > encryptionKeys = certificate .getEncryptionKeys ();
112
- return encryptionKeys .stream ()
113
- .map (OpenPGPCertificate .OpenPGPComponentKey ::getKeyIdentifier )
114
- .collect (Collectors .toList ());
115
- };
104
+ private SubkeySelector encryptionKeySelector = OpenPGPCertificate ::getEncryptionKeys ;
116
105
117
- private SubkeySelector signingKeySelector = certificate ->
118
- {
119
- List <OpenPGPCertificate .OpenPGPComponentKey > signingKeys = certificate .getSigningKeys ();
120
- return signingKeys .stream ()
121
- .map (OpenPGPCertificate .OpenPGPComponentKey ::getKeyIdentifier )
122
- .collect (Collectors .toList ());
123
- };
106
+ private SubkeySelector signingKeySelector = OpenPGPCertificate ::getSigningKeys ;
124
107
125
108
// Literal Data metadata
126
109
private Date fileModificationDate = null ;
@@ -217,7 +200,7 @@ public OpenPGPMessageGenerator setHashAlgorithmNegotiator(HashAlgorithmNegotiato
217
200
* @param recipientCertificate recipient certificate (public key)
218
201
* @return this
219
202
*/
220
- public OpenPGPMessageGenerator addEncryptionCertificate (PGPPublicKeyRing recipientCertificate )
203
+ public OpenPGPMessageGenerator addEncryptionCertificate (OpenPGPCertificate recipientCertificate )
221
204
{
222
205
return addEncryptionCertificate (recipientCertificate , encryptionKeySelector );
223
206
}
@@ -231,9 +214,9 @@ public OpenPGPMessageGenerator addEncryptionCertificate(PGPPublicKeyRing recipie
231
214
* @param subkeySelector selector for encryption subkeys
232
215
* @return this
233
216
*/
234
- public OpenPGPMessageGenerator addEncryptionCertificate (PGPPublicKeyRing recipientCertificate , SubkeySelector subkeySelector )
217
+ public OpenPGPMessageGenerator addEncryptionCertificate (OpenPGPCertificate recipientCertificate , SubkeySelector subkeySelector )
235
218
{
236
- config .recipients .add (new Recipient (recipientCertificate , subkeySelector , implementation ));
219
+ config .recipients .add (new Recipient (recipientCertificate , subkeySelector ));
237
220
return this ;
238
221
}
239
222
@@ -258,8 +241,8 @@ public OpenPGPMessageGenerator addEncryptionPassphrase(char[] passphrase)
258
241
* @return this
259
242
*/
260
243
public OpenPGPMessageGenerator addSigningKey (
261
- PGPSecretKeyRing signingKey ,
262
- PBESecretKeyDecryptorProvider signingKeyDecryptorProvider )
244
+ OpenPGPKey signingKey ,
245
+ SecretKeyPassphraseProvider signingKeyDecryptorProvider )
263
246
{
264
247
return addSigningKey (signingKey , signingKeyDecryptorProvider , signingKeySelector );
265
248
}
@@ -273,11 +256,11 @@ public OpenPGPMessageGenerator addSigningKey(
273
256
* @return this
274
257
*/
275
258
public OpenPGPMessageGenerator addSigningKey (
276
- PGPSecretKeyRing signingKey ,
277
- PBESecretKeyDecryptorProvider signingKeyDecryptorProvider ,
259
+ OpenPGPKey signingKey ,
260
+ SecretKeyPassphraseProvider signingKeyDecryptorProvider ,
278
261
SubkeySelector subkeySelector )
279
262
{
280
- config .signingKeys .add (new Signer (signingKey , signingKeyDecryptorProvider , subkeySelector , implementation ));
263
+ config .signingKeys .add (new Signer (signingKey , signingKeyDecryptorProvider , subkeySelector ));
281
264
return this ;
282
265
}
283
266
@@ -447,18 +430,16 @@ private void applySignatures(OpenPGPMessageOutputStream.Builder builder)
447
430
Stack <PGPSignatureGenerator > signatureGenerators = new Stack <>();
448
431
for (Signer s : config .signingKeys )
449
432
{
450
- for (PGPSecretKey signingSubkey : s .signingSubkeys ())
433
+ for (OpenPGPKey . OpenPGPSecretKey signingSubkey : s .signingSubkeys ())
451
434
{
452
435
int hashAlgorithm = hashAlgorithmNegotiator .negotiateHashAlgorithm (s .signingKey , signingSubkey );
453
436
PGPSignatureGenerator sigGen = new PGPSignatureGenerator (
454
- implementation .pgpContentSignerBuilder (signingSubkey .getPublicKey ().getAlgorithm (), hashAlgorithm ),
455
- signingSubkey .getPublicKey ());
456
-
457
- PBESecretKeyDecryptor decryptor = s .decryptorProvider == null ? null :
458
- s .decryptorProvider .provideDecryptor (signingSubkey );
459
- PGPPrivateKey privKey = signingSubkey .extractPrivateKey (decryptor );
437
+ implementation .pgpContentSignerBuilder (signingSubkey .getPGPSecretKey ().getPublicKey ().getAlgorithm (), hashAlgorithm ),
438
+ signingSubkey .getPGPSecretKey ().getPublicKey ());
439
+ char [] passphrase = signingSubkey .isLocked () ? s .passphraseProvider .providePassphrase (signingSubkey ) : null ;
440
+ PGPPrivateKey privateKey = signingSubkey .unlock (passphrase );
460
441
461
- sigGen .init (PGPSignature .BINARY_DOCUMENT , privKey );
442
+ sigGen .init (PGPSignature .BINARY_DOCUMENT , privateKey );
462
443
signatureGenerators .push (sigGen );
463
444
}
464
445
}
@@ -561,7 +542,7 @@ public interface EncryptionNegotiator
561
542
562
543
public interface HashAlgorithmNegotiator
563
544
{
564
- int negotiateHashAlgorithm (OpenPGPKey key , PGPSecretKey subkey );
545
+ int negotiateHashAlgorithm (OpenPGPKey key , OpenPGPCertificate . OpenPGPComponentKey subkey );
565
546
}
566
547
567
548
public static class Configuration
@@ -617,18 +598,11 @@ public Recipient(OpenPGPCertificate certificate, SubkeySelector subkeySelector)
617
598
*/
618
599
public List <PGPPublicKey > encryptionSubkeys ()
619
600
{
620
- // we first construct a set, so that we don't accidentally encrypt the message multiple times for the
621
- // same subkey (e.g. if wildcards KeyIdentifiers are used).
622
- Set <PGPPublicKey > encryptionKeys = new LinkedHashSet <>();
623
- for (KeyIdentifier identifier : subkeySelector .select (certificate ))
624
- {
625
- Iterator <PGPPublicKey > selected = certificate .getPGPKeyRing ().getPublicKeys (identifier );
626
- while (selected .hasNext ())
627
- {
628
- encryptionKeys .add (selected .next ());
629
- }
630
- }
631
- return new ArrayList <>(encryptionKeys );
601
+ return subkeySelector .select (certificate )
602
+ .stream ()
603
+ .map (OpenPGPCertificate .OpenPGPComponentKey ::getPGPPublicKey )
604
+ .distinct ()
605
+ .collect (Collectors .toList ());
632
606
}
633
607
}
634
608
@@ -638,48 +612,25 @@ public List<PGPPublicKey> encryptionSubkeys()
638
612
static class Signer
639
613
{
640
614
private final OpenPGPKey signingKey ;
641
- private final PBESecretKeyDecryptorProvider decryptorProvider ;
615
+ private final SecretKeyPassphraseProvider passphraseProvider ;
642
616
private final SubkeySelector subkeySelector ;
643
617
644
- /**
645
- * Create a {@link Signer}.
646
- *
647
- * @param signingKey OpenPGP key
648
- * @param decryptorProvider provider for decryptors to unlock the signing subkeys
649
- * @param subkeySelector selector to select the signing subkey
650
- */
651
- public Signer (PGPSecretKeyRing signingKey ,
652
- PBESecretKeyDecryptorProvider decryptorProvider ,
653
- SubkeySelector subkeySelector ,
654
- OpenPGPImplementation implementation )
655
- {
656
- this (new OpenPGPKey (signingKey , implementation ),
657
- decryptorProvider , subkeySelector );
658
- }
659
-
660
618
public Signer (OpenPGPKey signingKey ,
661
- PBESecretKeyDecryptorProvider decryptorProvider ,
619
+ SecretKeyPassphraseProvider passphraseProvider ,
662
620
SubkeySelector subkeySelector )
663
621
{
664
622
this .signingKey = signingKey ;
665
- this .decryptorProvider = decryptorProvider ;
623
+ this .passphraseProvider = passphraseProvider ;
666
624
this .subkeySelector = subkeySelector ;
667
625
}
668
626
669
- public List <PGPSecretKey > signingSubkeys ()
627
+ public List <OpenPGPKey . OpenPGPSecretKey > signingSubkeys ()
670
628
{
671
- // we first construct a set, so that we don't accidentally sign the message multiple times using the
672
- // same subkey (e.g. if wildcards KeyIdentifiers are used).
673
- Set <PGPSecretKey > signingKeys = new LinkedHashSet <>();
674
- for (KeyIdentifier identifier : subkeySelector .select (signingKey ))
675
- {
676
- Iterator <PGPSecretKey > selected = signingKey .getPGPKeyRing ().getSecretKeys (identifier );
677
- while (selected .hasNext ())
678
- {
679
- signingKeys .add (selected .next ());
680
- }
681
- }
682
- return new ArrayList <>(signingKeys );
629
+ return subkeySelector .select (signingKey )
630
+ .stream ()
631
+ .map (signingKey ::getSecretKey )
632
+ .distinct ()
633
+ .collect (Collectors .toList ());
683
634
}
684
635
}
685
636
@@ -806,11 +757,11 @@ public interface SubkeySelector
806
757
* @param certificate OpenPGP key or certificate
807
758
* @return non-null list of identifiers
808
759
*/
809
- List <KeyIdentifier > select (OpenPGPCertificate certificate );
760
+ List <OpenPGPCertificate . OpenPGPComponentKey > select (OpenPGPCertificate certificate );
810
761
}
811
762
812
- public interface PBESecretKeyDecryptorProvider
763
+ public interface SecretKeyPassphraseProvider
813
764
{
814
- PBESecretKeyDecryptor provideDecryptor ( PGPSecretKey key );
765
+ char [] providePassphrase ( OpenPGPKey . OpenPGPSecretKey key );
815
766
}
816
767
}
0 commit comments