1c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian/*
2c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * Copyright (C) 2017 The Android Open Source Project
3c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian *
4c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * Licensed under the Apache License, Version 2.0 (the "License");
5c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * you may not use this file except in compliance with the License.
6c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * You may obtain a copy of the License at
7c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian *
8c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian *     http://www.apache.org/licenses/LICENSE-2.0
9c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian *
10c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * Unless required by applicable law or agreed to in writing, software
11c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * distributed under the License is distributed on an "AS IS" BASIS,
12c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * See the License for the specific language governing permissions and
14c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian * limitations under the License.
15c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian */
16c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianpackage libcore.javax.crypto.spec;
17c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
18c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.AlgorithmParameters;
19c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.NoSuchAlgorithmException;
20c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.Provider;
21c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.security.Security;
22c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.util.Arrays;
23c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport java.util.Base64;
24c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport javax.crypto.spec.GCMParameterSpec;
25c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
26c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport tests.security.AlgorithmParameterSymmetricHelper;
27c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianimport tests.security.AlgorithmParametersTest;
28c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
29c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanianpublic class AlgorithmParametersTestGCM extends AlgorithmParametersTest {
30c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
31c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    private static final byte[] IV = new byte[] {
32c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        (byte) 0x04, (byte) 0x08, (byte) 0x68, (byte) 0xC8,
33c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        (byte) 0xFF, (byte) 0x64, (byte) 0x72, (byte) 0xF5,
34c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        (byte) 0x04, (byte) 0x08, (byte) 0x68, (byte) 0xC8 };
35c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
36c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    private static final int TLEN = 96;
37c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
38c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // The ASN.1 encoding for GCM params (specified in RFC 5084 section 3.2) specifies
39c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // a default value of 12 for TLEN, so both values with and without TLEN should work.
40c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // See README.ASN1 for how to understand and reproduce this data.
41c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
42c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // asn1=SEQUENCE:gcm
43c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // [gcm]
44c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // iv=FORMAT:HEX,OCTETSTRING:040868C8FF6472F5040868C8
45c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    private static final String ENCODED_DATA_NO_TLEN = "MA4EDAQIaMj/ZHL1BAhoyA==";
46c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
47c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // asn1=SEQUENCE:gcm
48c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // [gcm]
49c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // iv=FORMAT:HEX,OCTETSTRING:040868C8FF6472F5040868C8
50c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    // tlen=INT:12
51c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    private static final String ENCODED_DATA_TLEN = "MBEEDAQIaMj/ZHL1BAhoyAIBDA==";
52c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
53c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    public AlgorithmParametersTestGCM() {
54c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        super("GCM", new AlgorithmParameterSymmetricHelper("AES", "GCM/NOPADDING", 128), new GCMParameterSpec(TLEN, IV));
55c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    }
56c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
57c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    public void testEncoding() throws Exception {
58c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        for (Provider p : Security.getProviders()) {
59c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            AlgorithmParameters params;
60c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            try {
61c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                params = AlgorithmParameters.getInstance("GCM", p);
62c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            } catch (NoSuchAlgorithmException e) {
63c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                // This provider doesn't support AES/GCM, ignore
64c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                continue;
65c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            }
66c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
67c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params.init(new GCMParameterSpec(TLEN, IV));
68c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            String encoded = Base64.getEncoder().encodeToString(params.getEncoded());
69c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertTrue("Provider: " + p.getName() + ", encoded: " + encoded,
70c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian                    encoded.equals(ENCODED_DATA_TLEN) || encoded.equals(ENCODED_DATA_NO_TLEN));
71c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
72c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params = AlgorithmParameters.getInstance("GCM", p);
73c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params.init(Base64.getDecoder().decode(ENCODED_DATA_NO_TLEN));
74c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            GCMParameterSpec spec = params.getParameterSpec(GCMParameterSpec.class);
75c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(), TLEN, spec.getTLen());
76c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertTrue("Provider: " + p.getName(), Arrays.equals(IV, spec.getIV()));
77c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
78c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params = AlgorithmParameters.getInstance("GCM", p);
79c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            params.init(Base64.getDecoder().decode(ENCODED_DATA_TLEN));
80c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            spec = params.getParameterSpec(GCMParameterSpec.class);
81c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertEquals("Provider: " + p.getName(), TLEN, spec.getTLen());
82c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian            assertTrue("Provider: " + p.getName(), Arrays.equals(IV, spec.getIV()));
83c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian        }
84c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian    }
85c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian
86c92b1a7959e22c83b8ead94605a368c09cf18178Adam Vartanian}
87