| package org.bouncycastle.asn1.cms; |
| |
| import org.bouncycastle.asn1.ASN1EncodableVector; |
| import org.bouncycastle.asn1.ASN1Object; |
| import org.bouncycastle.asn1.ASN1Primitive; |
| import org.bouncycastle.asn1.ASN1Sequence; |
| import org.bouncycastle.asn1.ASN1TaggedObject; |
| import org.bouncycastle.asn1.DERSequence; |
| import org.bouncycastle.asn1.DERTaggedObject; |
| import org.bouncycastle.asn1.x509.AlgorithmIdentifier; |
| |
| /** |
| * From RFC 6211 |
| * <pre> |
| * CMSAlgorithmProtection ::= SEQUENCE { |
| * digestAlgorithm DigestAlgorithmIdentifier, |
| * signatureAlgorithm [1] SignatureAlgorithmIdentifier OPTIONAL, |
| * macAlgorithm [2] MessageAuthenticationCodeAlgorithm |
| * OPTIONAL |
| * } |
| * (WITH COMPONENTS { signatureAlgorithm PRESENT, |
| * macAlgorithm ABSENT } | |
| * WITH COMPONENTS { signatureAlgorithm ABSENT, |
| * macAlgorithm PRESENT }) |
| * </pre> |
| */ |
| public class CMSAlgorithmProtection |
| extends ASN1Object |
| { |
| public static final int SIGNATURE = 1; |
| public static final int MAC = 2; |
| |
| private final AlgorithmIdentifier digestAlgorithm; |
| private final AlgorithmIdentifier signatureAlgorithm; |
| private final AlgorithmIdentifier macAlgorithm; |
| |
| public CMSAlgorithmProtection(AlgorithmIdentifier digestAlgorithm, int type, AlgorithmIdentifier algorithmIdentifier) |
| { |
| if (digestAlgorithm == null || algorithmIdentifier == null) |
| { |
| throw new NullPointerException("AlgorithmIdentifiers cannot be null"); |
| } |
| |
| this.digestAlgorithm = digestAlgorithm; |
| |
| if (type == 1) |
| { |
| this.signatureAlgorithm = algorithmIdentifier; |
| this.macAlgorithm = null; |
| } |
| else if (type == 2) |
| { |
| this.signatureAlgorithm = null; |
| this.macAlgorithm = algorithmIdentifier; |
| } |
| else |
| { |
| throw new IllegalArgumentException("Unknown type: " + type); |
| } |
| } |
| |
| private CMSAlgorithmProtection(ASN1Sequence sequence) |
| { |
| if (sequence.size() != 2) |
| { |
| throw new IllegalArgumentException("Sequence wrong size: One of signatureAlgorithm or macAlgorithm must be present"); |
| } |
| |
| this.digestAlgorithm = AlgorithmIdentifier.getInstance(sequence.getObjectAt(0)); |
| |
| ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(sequence.getObjectAt(1)); |
| if (tagged.getTagNo() == 1) |
| { |
| this.signatureAlgorithm = AlgorithmIdentifier.getInstance(tagged, false); |
| this.macAlgorithm = null; |
| } |
| else if (tagged.getTagNo() == 2) |
| { |
| this.signatureAlgorithm = null; |
| |
| this.macAlgorithm = AlgorithmIdentifier.getInstance(tagged, false); |
| } |
| else |
| { |
| throw new IllegalArgumentException("Unknown tag found: " + tagged.getTagNo()); |
| } |
| } |
| |
| public static CMSAlgorithmProtection getInstance( |
| Object obj) |
| { |
| if (obj instanceof CMSAlgorithmProtection) |
| { |
| return (CMSAlgorithmProtection)obj; |
| } |
| else if (obj != null) |
| { |
| return new CMSAlgorithmProtection(ASN1Sequence.getInstance(obj)); |
| } |
| |
| return null; |
| } |
| |
| |
| public AlgorithmIdentifier getDigestAlgorithm() |
| { |
| return digestAlgorithm; |
| } |
| |
| public AlgorithmIdentifier getMacAlgorithm() |
| { |
| return macAlgorithm; |
| } |
| |
| public AlgorithmIdentifier getSignatureAlgorithm() |
| { |
| return signatureAlgorithm; |
| } |
| |
| public ASN1Primitive toASN1Primitive() |
| { |
| ASN1EncodableVector v = new ASN1EncodableVector(); |
| |
| v.add(digestAlgorithm); |
| if (signatureAlgorithm != null) |
| { |
| v.add(new DERTaggedObject(false, 1, signatureAlgorithm)); |
| } |
| if (macAlgorithm != null) |
| { |
| v.add(new DERTaggedObject(false, 2, macAlgorithm)); |
| } |
| |
| return new DERSequence(v); |
| } |
| } |