001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 012import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 014 015public class EncryptedValue 016 extends ASN1Object 017{ 018 private AlgorithmIdentifier intendedAlg; 019 private AlgorithmIdentifier symmAlg; 020 private DERBitString encSymmKey; 021 private AlgorithmIdentifier keyAlg; 022 private ASN1OctetString valueHint; 023 private DERBitString encValue; 024 025 private EncryptedValue(ASN1Sequence seq) 026 { 027 int index = 0; 028 while (seq.getObjectAt(index) instanceof ASN1TaggedObject) 029 { 030 ASN1TaggedObject tObj = (ASN1TaggedObject)seq.getObjectAt(index); 031 032 switch (tObj.getTagNo()) 033 { 034 case 0: 035 intendedAlg = AlgorithmIdentifier.getInstance(tObj, false); 036 break; 037 case 1: 038 symmAlg = AlgorithmIdentifier.getInstance(tObj, false); 039 break; 040 case 2: 041 encSymmKey = DERBitString.getInstance(tObj, false); 042 break; 043 case 3: 044 keyAlg = AlgorithmIdentifier.getInstance(tObj, false); 045 break; 046 case 4: 047 valueHint = ASN1OctetString.getInstance(tObj, false); 048 break; 049 } 050 index++; 051 } 052 053 encValue = DERBitString.getInstance(seq.getObjectAt(index)); 054 } 055 056 public static EncryptedValue getInstance(Object o) 057 { 058 if (o instanceof EncryptedValue) 059 { 060 return (EncryptedValue)o; 061 } 062 else if (o != null) 063 { 064 return new EncryptedValue(ASN1Sequence.getInstance(o)); 065 } 066 067 return null; 068 } 069 070 public EncryptedValue( 071 AlgorithmIdentifier intendedAlg, 072 AlgorithmIdentifier symmAlg, 073 DERBitString encSymmKey, 074 AlgorithmIdentifier keyAlg, 075 ASN1OctetString valueHint, 076 DERBitString encValue) 077 { 078 if (encValue == null) 079 { 080 throw new IllegalArgumentException("'encValue' cannot be null"); 081 } 082 083 this.intendedAlg = intendedAlg; 084 this.symmAlg = symmAlg; 085 this.encSymmKey = encSymmKey; 086 this.keyAlg = keyAlg; 087 this.valueHint = valueHint; 088 this.encValue = encValue; 089 } 090 091 public AlgorithmIdentifier getIntendedAlg() 092 { 093 return intendedAlg; 094 } 095 096 public AlgorithmIdentifier getSymmAlg() 097 { 098 return symmAlg; 099 } 100 101 public DERBitString getEncSymmKey() 102 { 103 return encSymmKey; 104 } 105 106 public AlgorithmIdentifier getKeyAlg() 107 { 108 return keyAlg; 109 } 110 111 public ASN1OctetString getValueHint() 112 { 113 return valueHint; 114 } 115 116 public DERBitString getEncValue() 117 { 118 return encValue; 119 } 120 121 /** 122 * <pre> 123 * EncryptedValue ::= SEQUENCE { 124 * intendedAlg [0] AlgorithmIdentifier OPTIONAL, 125 * -- the intended algorithm for which the value will be used 126 * symmAlg [1] AlgorithmIdentifier OPTIONAL, 127 * -- the symmetric algorithm used to encrypt the value 128 * encSymmKey [2] BIT STRING OPTIONAL, 129 * -- the (encrypted) symmetric key used to encrypt the value 130 * keyAlg [3] AlgorithmIdentifier OPTIONAL, 131 * -- algorithm used to encrypt the symmetric key 132 * valueHint [4] OCTET STRING OPTIONAL, 133 * -- a brief description or identifier of the encValue content 134 * -- (may be meaningful only to the sending entity, and used only 135 * -- if EncryptedValue might be re-examined by the sending entity 136 * -- in the future) 137 * encValue BIT STRING } 138 * -- the encrypted value itself 139 * </pre> 140 * @return a basic ASN.1 object representation. 141 */ 142 public ASN1Primitive toASN1Primitive() 143 { 144 ASN1EncodableVector v = new ASN1EncodableVector(); 145 146 addOptional(v, 0, intendedAlg); 147 addOptional(v, 1, symmAlg); 148 addOptional(v, 2, encSymmKey); 149 addOptional(v, 3, keyAlg); 150 addOptional(v, 4, valueHint); 151 152 v.add(encValue); 153 154 return new DERSequence(v); 155 } 156 157 private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) 158 { 159 if (obj != null) 160 { 161 v.add(new DERTaggedObject(false, tagNo, obj)); 162 } 163 } 164}