001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Boolean; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 011 012public class PKIArchiveOptions 013 extends ASN1Object 014 implements ASN1Choice 015{ 016 public static final int encryptedPrivKey = 0; 017 public static final int keyGenParameters = 1; 018 public static final int archiveRemGenPrivKey = 2; 019 020 private ASN1Encodable value; 021 022 public static PKIArchiveOptions getInstance(Object o) 023 { 024 if (o == null || o instanceof PKIArchiveOptions) 025 { 026 return (PKIArchiveOptions)o; 027 } 028 else if (o instanceof ASN1TaggedObject) 029 { 030 return new PKIArchiveOptions((ASN1TaggedObject)o); 031 } 032 033 throw new IllegalArgumentException("unknown object: " + o); 034 } 035 036 private PKIArchiveOptions(ASN1TaggedObject tagged) 037 { 038 switch (tagged.getTagNo()) 039 { 040 case encryptedPrivKey: 041 value = EncryptedKey.getInstance(tagged.getObject()); 042 break; 043 case keyGenParameters: 044 value = ASN1OctetString.getInstance(tagged, false); 045 break; 046 case archiveRemGenPrivKey: 047 value = ASN1Boolean.getInstance(tagged, false); 048 break; 049 default: 050 throw new IllegalArgumentException("unknown tag number: " + tagged.getTagNo()); 051 } 052 } 053 054 public PKIArchiveOptions(EncryptedKey encKey) 055 { 056 this.value = encKey; 057 } 058 059 public PKIArchiveOptions(ASN1OctetString keyGenParameters) 060 { 061 this.value = keyGenParameters; 062 } 063 064 public PKIArchiveOptions(boolean archiveRemGenPrivKey) 065 { 066 this.value = ASN1Boolean.getInstance(archiveRemGenPrivKey); 067 } 068 069 public int getType() 070 { 071 if (value instanceof EncryptedKey) 072 { 073 return encryptedPrivKey; 074 } 075 076 if (value instanceof ASN1OctetString) 077 { 078 return keyGenParameters; 079 } 080 081 return archiveRemGenPrivKey; 082 } 083 084 public ASN1Encodable getValue() 085 { 086 return value; 087 } 088 089 /** 090 * <pre> 091 * PKIArchiveOptions ::= CHOICE { 092 * encryptedPrivKey [0] EncryptedKey, 093 * -- the actual value of the private key 094 * keyGenParameters [1] KeyGenParameters, 095 * -- parameters which allow the private key to be re-generated 096 * archiveRemGenPrivKey [2] BOOLEAN } 097 * -- set to TRUE if sender wishes receiver to archive the private 098 * -- key of a key pair that the receiver generates in response to 099 * -- this request; set to FALSE if no archival is desired. 100 * </pre> 101 */ 102 public ASN1Primitive toASN1Primitive() 103 { 104 if (value instanceof EncryptedKey) 105 { 106 return new DERTaggedObject(true, encryptedPrivKey, value); // choice 107 } 108 109 if (value instanceof ASN1OctetString) 110 { 111 return new DERTaggedObject(false, keyGenParameters, value); 112 } 113 114 return new DERTaggedObject(false, archiveRemGenPrivKey, value); 115 } 116}