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