1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.asn1.cms;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Encodable;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1EncodableVector;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1OctetString;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Sequence;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.ASN1TaggedObject;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERGeneralizedTime;
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERObject;
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DEROctetString;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.asn1.DERSequence;
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class KEKIdentifier
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    extends ASN1Encodable
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private ASN1OctetString    keyIdentifier;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private DERGeneralizedTime date;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private OtherKeyAttribute  other;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public KEKIdentifier(
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]              keyIdentifier,
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DERGeneralizedTime  date,
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        OtherKeyAttribute   other)
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.keyIdentifier = new DEROctetString(keyIdentifier);
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.date = date;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.other = other;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public KEKIdentifier(
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ASN1Sequence seq)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        keyIdentifier = (ASN1OctetString)seq.getObjectAt(0);
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        switch (seq.size())
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 1:
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 2:
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (seq.getObjectAt(1) instanceof DERGeneralizedTime)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                date = (DERGeneralizedTime)seq.getObjectAt(1);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                other = OtherKeyAttribute.getInstance(seq.getObjectAt(1));
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        case 3:
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            date  = (DERGeneralizedTime)seq.getObjectAt(1);
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            other = OtherKeyAttribute.getInstance(seq.getObjectAt(2));
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        default:
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new IllegalArgumentException("Invalid KEKIdentifier");
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return a KEKIdentifier object from a tagged object.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the tagged object holding the object we want.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param explicit true if the object is meant to be explicitly
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *              tagged false otherwise.
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IllegalArgumentException if the object held by the
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *          tagged object cannot be converted.
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static KEKIdentifier getInstance(
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ASN1TaggedObject obj,
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean explicit)
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getInstance(ASN1Sequence.getInstance(obj, explicit));
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return a KEKIdentifier object from the given object.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param obj the object we want converted.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @exception IllegalArgumentException if the object cannot be converted.
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static KEKIdentifier getInstance(
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object obj)
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj == null || obj instanceof KEKIdentifier)
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (KEKIdentifier)obj;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof ASN1Sequence)
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new KEKIdentifier((ASN1Sequence)obj);
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throw new IllegalArgumentException("Invalid KEKIdentifier: " + obj.getClass().getName());
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ASN1OctetString getKeyIdentifier()
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return keyIdentifier;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DERGeneralizedTime getDate()
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return date;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public OtherKeyAttribute getOther()
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return other;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Produce an object suitable for an ASN1OutputStream.
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <pre>
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * KEKIdentifier ::= SEQUENCE {
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     keyIdentifier OCTET STRING,
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     date GeneralizedTime OPTIONAL,
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     other OtherKeyAttribute OPTIONAL
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </pre>
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public DERObject toASN1Object()
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ASN1EncodableVector  v = new ASN1EncodableVector();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        v.add(keyIdentifier);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (date != null)
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            v.add(date);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (other != null)
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            v.add(other);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new DERSequence(v);
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
140