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