15db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootpackage org.bouncycastle.asn1.cms; 25db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 35db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1EncodableVector; 45db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1Integer; 55db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1Object; 65db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1OctetString; 75db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1Primitive; 85db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.ASN1Sequence; 95db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.DEROctetString; 105db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.asn1.DERSequence; 115db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport org.bouncycastle.util.Arrays; 125db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root/** 145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <a href="http://tools.ietf.org/html/rfc5084">RFC 5084</a>: GCMParameters object. 155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <p> 165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <pre> 175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root GCMParameters ::= SEQUENCE { 185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root aes-nonce OCTET STRING, -- recommended size is 12 octets 195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root aes-ICVlen AES-GCM-ICVlen DEFAULT 12 } 205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * </pre> 215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootpublic class GCMParameters 235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root extends ASN1Object 245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root{ 255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root private byte[] nonce; 265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root private int icvLen; 275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root /** 295db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * Return an GCMParameters object from the given object. 305db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <p> 315db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * Accepted inputs: 325db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <ul> 335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> null → null 345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> {@link org.bouncycastle.asn1.cms.GCMParameters} object 355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(Object) ASN1Sequence} input formats with GCMParameters structure inside 365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * </ul> 375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * 385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @param obj the object we want converted. 395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @exception IllegalArgumentException if the object cannot be converted. 405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public static GCMParameters getInstance( 425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root Object obj) 435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root if (obj instanceof GCMParameters) 455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return (GCMParameters)obj; 475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root else if (obj != null) 495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return new GCMParameters(ASN1Sequence.getInstance(obj)); 515db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 525db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 535db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return null; 545db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 555db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 565db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root private GCMParameters( 575db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root ASN1Sequence seq) 585db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 595db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root this.nonce = ASN1OctetString.getInstance(seq.getObjectAt(0)).getOctets(); 605db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 615db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root if (seq.size() == 2) 625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 635db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root this.icvLen = ASN1Integer.getInstance(seq.getObjectAt(1)).getValue().intValue(); 645db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 655db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root else 665db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root this.icvLen = 12; 685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 695db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 705db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 715db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public GCMParameters( 725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root byte[] nonce, 735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root int icvLen) 745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root this.nonce = Arrays.clone(nonce); 765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root this.icvLen = icvLen; 775db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public byte[] getNonce() 805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 815db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return Arrays.clone(nonce); 825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 835db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public int getIcvLen() 855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return icvLen; 875db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 895db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root public ASN1Primitive toASN1Primitive() 905db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 915db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root ASN1EncodableVector v = new ASN1EncodableVector(); 925db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 935db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root v.add(new DEROctetString(nonce)); 945db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 955db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root if (icvLen != 12) 965db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root { 975db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root v.add(new ASN1Integer(icvLen)); 985db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 995db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root 1005db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root return new DERSequence(v); 1015db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root } 1025db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root} 103