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 &rarr; 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