001// SPDX-FileCopyrightText: 2020 Paul Schaub <vanitasvitae@fsfe.org> 002// 003// SPDX-License-Identifier: Apache-2.0 004 005package org.pgpainless.implementation; 006 007import java.io.InputStream; 008import java.security.KeyPair; 009import java.util.Date; 010 011import org.bouncycastle.openpgp.PGPException; 012import org.bouncycastle.openpgp.PGPKeyPair; 013import org.bouncycastle.openpgp.PGPObjectFactory; 014import org.bouncycastle.openpgp.PGPPrivateKey; 015import org.bouncycastle.openpgp.PGPPublicKey; 016import org.bouncycastle.openpgp.PGPSecretKey; 017import org.bouncycastle.openpgp.PGPSessionKey; 018import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory; 019import org.bouncycastle.openpgp.operator.KeyFingerPrintCalculator; 020import org.bouncycastle.openpgp.operator.PBEDataDecryptorFactory; 021import org.bouncycastle.openpgp.operator.PBEKeyEncryptionMethodGenerator; 022import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor; 023import org.bouncycastle.openpgp.operator.PBESecretKeyEncryptor; 024import org.bouncycastle.openpgp.operator.PGPContentSignerBuilder; 025import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilderProvider; 026import org.bouncycastle.openpgp.operator.PGPDataEncryptorBuilder; 027import org.bouncycastle.openpgp.operator.PGPDigestCalculator; 028import org.bouncycastle.openpgp.operator.PGPDigestCalculatorProvider; 029import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory; 030import org.bouncycastle.openpgp.operator.PublicKeyKeyEncryptionMethodGenerator; 031import org.bouncycastle.openpgp.operator.SessionKeyDataDecryptorFactory; 032import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator; 033import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder; 034import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider; 035import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder; 036import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair; 037import org.bouncycastle.openpgp.operator.jcajce.JcePBEDataDecryptorFactoryBuilder; 038import org.bouncycastle.openpgp.operator.jcajce.JcePBEKeyEncryptionMethodGenerator; 039import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; 040import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder; 041import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder; 042import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder; 043import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator; 044import org.bouncycastle.openpgp.operator.jcajce.JceSessionKeyDataDecryptorFactoryBuilder; 045import org.pgpainless.algorithm.HashAlgorithm; 046import org.pgpainless.algorithm.PublicKeyAlgorithm; 047import org.pgpainless.algorithm.SymmetricKeyAlgorithm; 048import org.pgpainless.provider.ProviderFactory; 049import org.pgpainless.util.Passphrase; 050 051public class JceImplementationFactory extends ImplementationFactory { 052 053 public PBESecretKeyEncryptor getPBESecretKeyEncryptor(PGPSecretKey secretKey, Passphrase passphrase) { 054 return new JcePBESecretKeyEncryptorBuilder(secretKey.getKeyEncryptionAlgorithm()) 055 .setProvider(ProviderFactory.getProvider()) 056 .build(passphrase.getChars()); 057 } 058 059 public PBESecretKeyEncryptor getPBESecretKeyEncryptor(SymmetricKeyAlgorithm symmetricKeyAlgorithm, PGPDigestCalculator digestCalculator, Passphrase passphrase) { 060 return new JcePBESecretKeyEncryptorBuilder(symmetricKeyAlgorithm.getAlgorithmId(), digestCalculator) 061 .setProvider(ProviderFactory.getProvider()) 062 .build(passphrase.getChars()); 063 } 064 065 public PBESecretKeyDecryptor getPBESecretKeyDecryptor(Passphrase passphrase) throws PGPException { 066 return new JcePBESecretKeyDecryptorBuilder(getPGPDigestCalculatorProvider()) 067 .setProvider(ProviderFactory.getProvider()) 068 .build(passphrase.getChars()); 069 } 070 071 public PGPDigestCalculatorProvider getPGPDigestCalculatorProvider() 072 throws PGPException { 073 return new JcaPGPDigestCalculatorProviderBuilder() 074 .setProvider(ProviderFactory.getProvider()) 075 .build(); 076 } 077 078 public PGPContentVerifierBuilderProvider getPGPContentVerifierBuilderProvider() { 079 return new JcaPGPContentVerifierBuilderProvider() 080 .setProvider(ProviderFactory.getProvider()); 081 } 082 083 public PGPContentSignerBuilder getPGPContentSignerBuilder(int keyAlgorithm, int hashAlgorithm) { 084 return new JcaPGPContentSignerBuilder(keyAlgorithm, hashAlgorithm) 085 .setProvider(ProviderFactory.getProvider()); 086 } 087 088 public KeyFingerPrintCalculator getKeyFingerprintCalculator() { 089 return new JcaKeyFingerprintCalculator() 090 .setProvider(ProviderFactory.getProvider()); 091 } 092 093 public PBEDataDecryptorFactory getPBEDataDecryptorFactory(Passphrase passphrase) 094 throws PGPException { 095 return new JcePBEDataDecryptorFactoryBuilder(getPGPDigestCalculatorProvider()) 096 .setProvider(ProviderFactory.getProvider()) 097 .build(passphrase.getChars()); 098 } 099 100 public PublicKeyDataDecryptorFactory getPublicKeyDataDecryptorFactory(PGPPrivateKey privateKey) { 101 return new JcePublicKeyDataDecryptorFactoryBuilder() 102 .setProvider(ProviderFactory.getProvider()) 103 .build(privateKey); 104 } 105 106 public PublicKeyKeyEncryptionMethodGenerator getPublicKeyKeyEncryptionMethodGenerator(PGPPublicKey key) { 107 return new JcePublicKeyKeyEncryptionMethodGenerator(key) 108 .setProvider(ProviderFactory.getProvider()); 109 } 110 111 public PBEKeyEncryptionMethodGenerator getPBEKeyEncryptionMethodGenerator(Passphrase passphrase) { 112 return new JcePBEKeyEncryptionMethodGenerator(passphrase.getChars()) 113 .setProvider(ProviderFactory.getProvider()); 114 } 115 116 public PGPDataEncryptorBuilder getPGPDataEncryptorBuilder(int symmetricKeyAlgorithm) { 117 return new JcePGPDataEncryptorBuilder(symmetricKeyAlgorithm) 118 .setProvider(ProviderFactory.getProvider()); 119 } 120 121 public PGPKeyPair getPGPKeyPair(PublicKeyAlgorithm algorithm, KeyPair keyPair, Date creationDate) throws PGPException { 122 return new JcaPGPKeyPair(algorithm.getAlgorithmId(), keyPair, creationDate); 123 } 124 125 public PBESecretKeyEncryptor getPBESecretKeyEncryptor(SymmetricKeyAlgorithm encryptionAlgorithm, HashAlgorithm hashAlgorithm, int s2kCount, Passphrase passphrase) throws PGPException { 126 return new JcePBESecretKeyEncryptorBuilder( 127 encryptionAlgorithm.getAlgorithmId(), 128 getPGPDigestCalculator(hashAlgorithm), 129 s2kCount) 130 .setProvider(ProviderFactory.getProvider()) 131 .build(passphrase.getChars()); 132 } 133 134 @Override 135 public SessionKeyDataDecryptorFactory provideSessionKeyDataDecryptorFactory(PGPSessionKey sessionKey) { 136 return new JceSessionKeyDataDecryptorFactoryBuilder().build(sessionKey); 137 } 138 139 @Override 140 public PGPObjectFactory getPGPObjectFactory(InputStream inputStream) { 141 return new JcaPGPObjectFactory(inputStream); 142 } 143 144 @Override 145 public PGPObjectFactory getPGPObjectFactory(byte[] bytes) { 146 return new JcaPGPObjectFactory(bytes); 147 } 148}