001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DERNull; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 010 011public class ProofOfPossession 012 extends ASN1Object 013 implements ASN1Choice 014{ 015 public static final int TYPE_RA_VERIFIED = 0; 016 public static final int TYPE_SIGNING_KEY = 1; 017 public static final int TYPE_KEY_ENCIPHERMENT = 2; 018 public static final int TYPE_KEY_AGREEMENT = 3; 019 020 private int tagNo; 021 private ASN1Encodable obj; 022 023 private ProofOfPossession(ASN1TaggedObject tagged) 024 { 025 tagNo = tagged.getTagNo(); 026 switch (tagNo) 027 { 028 case 0: 029 obj = DERNull.INSTANCE; 030 break; 031 case 1: 032 obj = POPOSigningKey.getInstance(tagged, false); 033 break; 034 case 2: 035 case 3: 036 obj = POPOPrivKey.getInstance(tagged, true); 037 break; 038 default: 039 throw new IllegalArgumentException("unknown tag: " + tagNo); 040 } 041 } 042 043 public static ProofOfPossession getInstance(Object o) 044 { 045 if (o == null || o instanceof ProofOfPossession) 046 { 047 return (ProofOfPossession)o; 048 } 049 050 if (o instanceof ASN1TaggedObject) 051 { 052 return new ProofOfPossession((ASN1TaggedObject)o); 053 } 054 055 throw new IllegalArgumentException("Invalid object: " + o.getClass().getName()); 056 } 057 058 /** Creates a ProofOfPossession with type raVerified. */ 059 public ProofOfPossession() 060 { 061 tagNo = TYPE_RA_VERIFIED; 062 obj = DERNull.INSTANCE; 063 } 064 065 /** Creates a ProofOfPossession for a signing key. */ 066 public ProofOfPossession(POPOSigningKey poposk) 067 { 068 tagNo = TYPE_SIGNING_KEY; 069 obj = poposk; 070 } 071 072 /** 073 * Creates a ProofOfPossession for key encipherment or agreement. 074 * @param type one of TYPE_KEY_ENCIPHERMENT or TYPE_KEY_AGREEMENT 075 */ 076 public ProofOfPossession(int type, POPOPrivKey privkey) 077 { 078 tagNo = type; 079 obj = privkey; 080 } 081 082 public int getType() 083 { 084 return tagNo; 085 } 086 087 public ASN1Encodable getObject() 088 { 089 return obj; 090 } 091 092 /** 093 * <pre> 094 * ProofOfPossession ::= CHOICE { 095 * raVerified [0] NULL, 096 * -- used if the RA has already verified that the requester is in 097 * -- possession of the private key 098 * signature [1] POPOSigningKey, 099 * keyEncipherment [2] POPOPrivKey, 100 * keyAgreement [3] POPOPrivKey } 101 * </pre> 102 * @return a basic ASN.1 object representation. 103 */ 104 public ASN1Primitive toASN1Primitive() 105 { 106 return new DERTaggedObject(false, tagNo, obj); 107 } 108}