1111import org .bouncycastle .jce .provider .BouncyCastleProvider ;
1212import org .bouncycastle .openpgp .PGPException ;
1313import org .bouncycastle .openpgp .PGPKeyPair ;
14- import org .bouncycastle .openpgp .PGPPrivateKey ;
1514import org .bouncycastle .openpgp .PGPPublicKey ;
1615import org .bouncycastle .openpgp .api .KeyPassphraseProvider ;
1716import org .bouncycastle .openpgp .api .OpenPGPKey ;
2019import org .bouncycastle .openpgp .operator .jcajce .JcaPGPKeyConverter ;
2120import org .bouncycastle .openpgp .smartcard .OpenPGPSmartCardBackend ;
2221import org .bouncycastle .openpgp .smartcard .card .CardException ;
23- import org .bouncycastle .openpgp .smartcard .yubikey .operator .YubikeyPublicKeyDataDecryptorFactory ;
22+ import org .bouncycastle .openpgp .smartcard .yubikey .operator .bc .BcYubikeyPublicKeyDataDecryptorFactory ;
23+ import org .bouncycastle .openpgp .smartcard .yubikey .operator .jcajce .JceYubikeyPublicKeyDataDecryptorFactoryBuilder ;
2424import org .bouncycastle .util .Arrays ;
2525
2626import java .security .NoSuchAlgorithmException ;
@@ -40,42 +40,57 @@ public class YubikeySmartCardBackend
4040{
4141 private static final int X25519_SCALAR_SIZE = 32 ;
4242
43+ private final YubikeyDecryptorFactoryProvider decryptorFactoryProvider ;
4344 private final JcaPGPKeyConverter converter ;
4445 private final JcaKeyFingerprintCalculator fingerprintCalculator ;
4546 private final Set <Integer > allowedCardSerials = new HashSet <>();
4647 private final YubiKitManager manager ;
4748
4849 public static YubikeySmartCardBackend createInstance ()
4950 {
50- return createInstance (new YubiKitManager ());
51+ return createInstance (bcImpl ());
5152 }
5253
53- public static YubikeySmartCardBackend createInstance (YubiKitManager yubiKitManager )
54+ public static YubikeySmartCardBackend createInstance (YubikeyDecryptorFactoryProvider decryptorFactoryProvider )
5455 {
55- return createInstance (yubiKitManager , new BouncyCastleProvider ());
56+ return createInstance (new YubiKitManager (),
57+ decryptorFactoryProvider );
5658 }
5759
5860 public static YubikeySmartCardBackend createInstance (YubiKitManager yubiKitManager ,
59- BouncyCastleProvider provider )
61+ YubikeyDecryptorFactoryProvider decryptorFactoryProvider )
6062 {
61- return new YubikeySmartCardBackend (yubiKitManager ,
63+ return createInstance (yubiKitManager ,
64+ new BouncyCastleProvider (),
65+ decryptorFactoryProvider );
66+ }
67+
68+ public static YubikeySmartCardBackend createInstance (YubiKitManager yubiKitManager ,
69+ BouncyCastleProvider provider ,
70+ YubikeyDecryptorFactoryProvider decryptorFactoryProvider )
71+ {
72+ return new YubikeySmartCardBackend (
73+ yubiKitManager ,
6274 new JcaPGPKeyConverter ().setProvider (provider ),
63- new JcaKeyFingerprintCalculator ().setProvider (provider ));
75+ new JcaKeyFingerprintCalculator ().setProvider (provider ),
76+ decryptorFactoryProvider );
6477 }
6578
6679 public YubikeySmartCardBackend (YubiKitManager yubiKitManager ,
6780 JcaPGPKeyConverter keyConverter ,
68- JcaKeyFingerprintCalculator fingerprintCalculator )
81+ JcaKeyFingerprintCalculator fingerprintCalculator ,
82+ YubikeyDecryptorFactoryProvider decryptorFactoryProvider )
6983 {
7084 this .manager = yubiKitManager ;
7185 this .converter = keyConverter ;
7286 this .fingerprintCalculator = fingerprintCalculator ;
87+ this .decryptorFactoryProvider = decryptorFactoryProvider ;
7388 }
7489
7590 @ Override
7691 public String getName ()
7792 {
78- return "Yubikit" ;
93+ return "Yubikit " + decryptorFactoryProvider . getName () ;
7994 }
8095
8196 /**
@@ -130,7 +145,7 @@ public PublicKeyDataDecryptorFactory providePublicKeyDataDecryptorFactory(
130145 KeyPassphraseProvider userPinProvider )
131146 throws PGPException
132147 {
133- return new YubikeyPublicKeyDataDecryptorFactory (secretKey , card , userPinProvider );
148+ return decryptorFactoryProvider . provide (secretKey , card , userPinProvider );
134149 }
135150
136151 /**
@@ -276,4 +291,58 @@ private PGPPublicKey bruteForcePublicKey(PublicKey pk, Date creationTime,
276291 }
277292 return null ;
278293 }
294+
295+ public interface YubikeyDecryptorFactoryProvider
296+ {
297+ PublicKeyDataDecryptorFactory provide (OpenPGPKey .OpenPGPSecretKey secretKey ,
298+ YubikeyOpenPGPSmartCard card ,
299+ KeyPassphraseProvider userPinProvider )
300+ throws PGPException ;
301+
302+ String getName ();
303+ }
304+
305+ public static YubikeyDecryptorFactoryProvider bcImpl ()
306+ {
307+ return new YubikeyDecryptorFactoryProvider ()
308+ {
309+ @ Override
310+ public PublicKeyDataDecryptorFactory provide (OpenPGPKey .OpenPGPSecretKey secretKey ,
311+ YubikeyOpenPGPSmartCard card ,
312+ KeyPassphraseProvider userPinProvider )
313+ throws PGPException
314+ {
315+ return new BcYubikeyPublicKeyDataDecryptorFactory (secretKey , card , userPinProvider );
316+ }
317+
318+ @ Override
319+ public String getName ()
320+ {
321+ return "BCYK" ;
322+ }
323+ };
324+ }
325+
326+ public static YubikeyDecryptorFactoryProvider jceImpl ()
327+ {
328+ return new YubikeyDecryptorFactoryProvider ()
329+ {
330+ @ Override
331+ public PublicKeyDataDecryptorFactory provide (OpenPGPKey .OpenPGPSecretKey secretKey ,
332+ YubikeyOpenPGPSmartCard card ,
333+ KeyPassphraseProvider userPinProvider )
334+ throws PGPException
335+ {
336+ return new JceYubikeyPublicKeyDataDecryptorFactoryBuilder (card , userPinProvider )
337+ .setProvider (new BouncyCastleProvider ())
338+ .build (secretKey );
339+ }
340+
341+ @ Override
342+ public String getName ()
343+ {
344+ return "JCYK" ;
345+ }
346+ };
347+ }
279348}
0 commit comments