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}