001package org.apache.commons.ssl.org.bouncycastle.asn1.cms; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer; 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.DEROctetString; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 011import org.bouncycastle.util.Arrays; 012 013/** 014 * <a href="http://tools.ietf.org/html/rfc5084">RFC 5084</a>: GCMParameters object. 015 * <p> 016 * <pre> 017 GCMParameters ::= SEQUENCE { 018 aes-nonce OCTET STRING, -- recommended size is 12 octets 019 aes-ICVlen AES-GCM-ICVlen DEFAULT 12 } 020 * </pre> 021 */ 022public class GCMParameters 023 extends ASN1Object 024{ 025 private byte[] nonce; 026 private int icvLen; 027 028 /** 029 * Return an GCMParameters object from the given object. 030 * <p> 031 * Accepted inputs: 032 * <ul> 033 * <li> null → null 034 * <li> {@link org.bouncycastle.asn1.cms.GCMParameters} object 035 * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(Object) ASN1Sequence} input formats with GCMParameters structure inside 036 * </ul> 037 * 038 * @param obj the object we want converted. 039 * @exception IllegalArgumentException if the object cannot be converted. 040 */ 041 public static GCMParameters getInstance( 042 Object obj) 043 { 044 if (obj instanceof GCMParameters) 045 { 046 return (GCMParameters)obj; 047 } 048 else if (obj != null) 049 { 050 return new GCMParameters(ASN1Sequence.getInstance(obj)); 051 } 052 053 return null; 054 } 055 056 private GCMParameters( 057 ASN1Sequence seq) 058 { 059 this.nonce = ASN1OctetString.getInstance(seq.getObjectAt(0)).getOctets(); 060 061 if (seq.size() == 2) 062 { 063 this.icvLen = ASN1Integer.getInstance(seq.getObjectAt(1)).getValue().intValue(); 064 } 065 else 066 { 067 this.icvLen = 12; 068 } 069 } 070 071 public GCMParameters( 072 byte[] nonce, 073 int icvLen) 074 { 075 this.nonce = Arrays.clone(nonce); 076 this.icvLen = icvLen; 077 } 078 079 public byte[] getNonce() 080 { 081 return Arrays.clone(nonce); 082 } 083 084 public int getIcvLen() 085 { 086 return icvLen; 087 } 088 089 public ASN1Primitive toASN1Primitive() 090 { 091 ASN1EncodableVector v = new ASN1EncodableVector(); 092 093 v.add(new DEROctetString(nonce)); 094 095 if (icvLen != 12) 096 { 097 v.add(new ASN1Integer(icvLen)); 098 } 099 100 return new DERSequence(v); 101 } 102}