• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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