001// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
002//
003// SPDX-License-Identifier: Apache-2.0
004
005package org.pgpainless.signature.builder;
006
007import javax.annotation.Nullable;
008
009import org.bouncycastle.openpgp.PGPException;
010import org.bouncycastle.openpgp.PGPPublicKey;
011import org.bouncycastle.openpgp.PGPSecretKey;
012import org.bouncycastle.openpgp.PGPSignature;
013import org.bouncycastle.openpgp.PGPUserAttributeSubpacketVector;
014import org.pgpainless.algorithm.SignatureType;
015import org.pgpainless.key.protection.SecretKeyRingProtector;
016import org.pgpainless.signature.subpackets.SelfSignatureSubpackets;
017
018public class SelfSignatureBuilder extends AbstractSignatureBuilder<SelfSignatureBuilder> {
019
020    public SelfSignatureBuilder(PGPSecretKey signingKey, SecretKeyRingProtector protector) throws PGPException {
021        this(SignatureType.GENERIC_CERTIFICATION, signingKey, protector);
022    }
023
024    public SelfSignatureBuilder(SignatureType signatureType, PGPSecretKey signingKey, SecretKeyRingProtector protector)
025            throws PGPException {
026        super(signatureType, signingKey, protector);
027    }
028
029    public SelfSignatureBuilder(
030            PGPSecretKey primaryKey,
031            SecretKeyRingProtector primaryKeyProtector,
032            PGPSignature oldCertification)
033            throws PGPException {
034        super(primaryKey, primaryKeyProtector, oldCertification);
035    }
036
037    public SelfSignatureSubpackets getHashedSubpackets() {
038        return hashedSubpackets;
039    }
040
041    public SelfSignatureSubpackets getUnhashedSubpackets() {
042        return unhashedSubpackets;
043    }
044
045    public void applyCallback(@Nullable SelfSignatureSubpackets.Callback callback) {
046        if (callback != null) {
047            callback.modifyHashedSubpackets(getHashedSubpackets());
048            callback.modifyUnhashedSubpackets(getUnhashedSubpackets());
049        }
050    }
051
052    public PGPSignature build(PGPPublicKey certifiedKey, String userId) throws PGPException {
053        return buildAndInitSignatureGenerator().generateCertification(userId, certifiedKey);
054    }
055
056    public PGPSignature build(PGPPublicKey certifiedKey, PGPUserAttributeSubpacketVector userAttribute)
057            throws PGPException {
058        return buildAndInitSignatureGenerator().generateCertification(userAttribute, certifiedKey);
059    }
060
061    @Override
062    protected boolean isValidSignatureType(SignatureType type) {
063        switch (type) {
064            case GENERIC_CERTIFICATION:
065            case NO_CERTIFICATION:
066            case CASUAL_CERTIFICATION:
067            case POSITIVE_CERTIFICATION:
068            case DIRECT_KEY:
069                return true;
070            default:
071                return false;
072        }
073    }
074}