1 package org.bouncycastle.pkcs; 2 3 import org.bouncycastle.asn1.ASN1Encodable; 4 import org.bouncycastle.asn1.ASN1Primitive; 5 import org.bouncycastle.asn1.ASN1Sequence; 6 import org.bouncycastle.asn1.ASN1TaggedObject; 7 import org.bouncycastle.asn1.pkcs.Attribute; 8 import org.bouncycastle.asn1.x500.X500Name; 9 import org.bouncycastle.asn1.x509.AlgorithmIdentifier; 10 import org.bouncycastle.asn1.x509.Extensions; 11 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; 12 13 /** 14 * The delta certificate request attribute defined in: https://datatracker.ietf.org/doc/draft-bonnell-lamps-chameleon-certs/ 15 */ 16 public class DeltaCertificateRequestAttributeValue 17 implements ASN1Encodable 18 { 19 private final X500Name subject; 20 private final SubjectPublicKeyInfo subjectPKInfo; 21 private final Extensions extensions; 22 private final AlgorithmIdentifier signatureAlgorithm; 23 private final ASN1Sequence attrSeq; 24 DeltaCertificateRequestAttributeValue(Attribute attribute)25 public DeltaCertificateRequestAttributeValue(Attribute attribute) 26 { 27 this(ASN1Sequence.getInstance(attribute.getAttributeValues()[0])); 28 } 29 DeltaCertificateRequestAttributeValue(ASN1Sequence attrSeq)30 DeltaCertificateRequestAttributeValue(ASN1Sequence attrSeq) 31 { 32 this.attrSeq = attrSeq; 33 // TODO: validate attribute size 34 35 int idx = 0; 36 if (attrSeq.getObjectAt(0) instanceof ASN1TaggedObject) 37 { 38 subject = X500Name.getInstance(ASN1TaggedObject.getInstance(attrSeq.getObjectAt(0)), true); 39 idx++; 40 } 41 else 42 { 43 subject = null; 44 } 45 46 subjectPKInfo = SubjectPublicKeyInfo.getInstance(attrSeq.getObjectAt(idx)); 47 idx++; 48 49 Extensions ext = null; 50 AlgorithmIdentifier sigAlg = null; 51 52 if (idx != attrSeq.size()) 53 { 54 while (idx < attrSeq.size()) 55 { 56 ASN1TaggedObject tagObj = ASN1TaggedObject.getInstance(attrSeq.getObjectAt(idx)); 57 if (tagObj.getTagNo() == 1) 58 { 59 ext = Extensions.getInstance(tagObj, false); 60 } 61 else if (tagObj.getTagNo() == 2) 62 { 63 sigAlg = AlgorithmIdentifier.getInstance(tagObj, false); 64 } 65 else 66 { 67 throw new IllegalArgumentException("unknown tag"); 68 } 69 idx++; 70 } 71 } 72 73 this.extensions = ext; 74 this.signatureAlgorithm = sigAlg; 75 } 76 getSubject()77 public X500Name getSubject() 78 { 79 return subject; 80 } 81 getSubjectPKInfo()82 public SubjectPublicKeyInfo getSubjectPKInfo() 83 { 84 return subjectPKInfo; 85 } 86 getExtensions()87 public Extensions getExtensions() 88 { 89 return extensions; 90 } 91 getSignatureAlgorithm()92 public AlgorithmIdentifier getSignatureAlgorithm() 93 { 94 return signatureAlgorithm; 95 } 96 97 @Override toASN1Primitive()98 public ASN1Primitive toASN1Primitive() 99 { 100 return attrSeq; 101 } 102 } 103