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}