176973437e9cb36eb60fb2a374366713307688136Bo Zhu/*
276973437e9cb36eb60fb2a374366713307688136Bo Zhu * Copyright (C) 2018 The Android Open Source Project
376973437e9cb36eb60fb2a374366713307688136Bo Zhu *
476973437e9cb36eb60fb2a374366713307688136Bo Zhu * Licensed under the Apache License, Version 2.0 (the "License");
576973437e9cb36eb60fb2a374366713307688136Bo Zhu * you may not use this file except in compliance with the License.
676973437e9cb36eb60fb2a374366713307688136Bo Zhu * You may obtain a copy of the License at
776973437e9cb36eb60fb2a374366713307688136Bo Zhu *
876973437e9cb36eb60fb2a374366713307688136Bo Zhu *      http://www.apache.org/licenses/LICENSE-2.0
976973437e9cb36eb60fb2a374366713307688136Bo Zhu *
1076973437e9cb36eb60fb2a374366713307688136Bo Zhu * Unless required by applicable law or agreed to in writing, software
1176973437e9cb36eb60fb2a374366713307688136Bo Zhu * distributed under the License is distributed on an "AS IS" BASIS,
1276973437e9cb36eb60fb2a374366713307688136Bo Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376973437e9cb36eb60fb2a374366713307688136Bo Zhu * See the License for the specific language governing permissions and
1476973437e9cb36eb60fb2a374366713307688136Bo Zhu * limitations under the License.
1576973437e9cb36eb60fb2a374366713307688136Bo Zhu */
1676973437e9cb36eb60fb2a374366713307688136Bo Zhu
1776973437e9cb36eb60fb2a374366713307688136Bo Zhupackage com.android.server.locksettings.recoverablekeystore;
1876973437e9cb36eb60fb2a374366713307688136Bo Zhu
1976973437e9cb36eb60fb2a374366713307688136Bo Zhuimport static org.junit.Assert.assertEquals;
2076973437e9cb36eb60fb2a374366713307688136Bo Zhu
2176973437e9cb36eb60fb2a374366713307688136Bo Zhuimport android.security.Scrypt;
2276973437e9cb36eb60fb2a374366713307688136Bo Zhu
2376973437e9cb36eb60fb2a374366713307688136Bo Zhuimport java.nio.ByteBuffer;
2476973437e9cb36eb60fb2a374366713307688136Bo Zhuimport java.nio.ByteOrder;
2576973437e9cb36eb60fb2a374366713307688136Bo Zhuimport java.security.MessageDigest;
2676973437e9cb36eb60fb2a374366713307688136Bo Zhuimport java.security.NoSuchAlgorithmException;
2776973437e9cb36eb60fb2a374366713307688136Bo Zhu
2876973437e9cb36eb60fb2a374366713307688136Bo Zhupublic class MockScrypt extends Scrypt {
2976973437e9cb36eb60fb2a374366713307688136Bo Zhu
3076973437e9cb36eb60fb2a374366713307688136Bo Zhu    @Override
3176973437e9cb36eb60fb2a374366713307688136Bo Zhu    public byte[] scrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen) {
3276973437e9cb36eb60fb2a374366713307688136Bo Zhu        assertEquals(32, outLen);
3376973437e9cb36eb60fb2a374366713307688136Bo Zhu
3476973437e9cb36eb60fb2a374366713307688136Bo Zhu        ByteBuffer byteBuffer = ByteBuffer.allocate(
3576973437e9cb36eb60fb2a374366713307688136Bo Zhu                password.length + salt.length + Integer.BYTES * 6);
3676973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
3776973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(password.length);
3876973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.put(password);
3976973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(salt.length);
4076973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.put(salt);
4176973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(n);
4276973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(r);
4376973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(p);
4476973437e9cb36eb60fb2a374366713307688136Bo Zhu        byteBuffer.putInt(outLen);
4576973437e9cb36eb60fb2a374366713307688136Bo Zhu
4676973437e9cb36eb60fb2a374366713307688136Bo Zhu        try {
4776973437e9cb36eb60fb2a374366713307688136Bo Zhu            return MessageDigest.getInstance("SHA-256").digest(byteBuffer.array());
4876973437e9cb36eb60fb2a374366713307688136Bo Zhu        } catch (NoSuchAlgorithmException e) {
4976973437e9cb36eb60fb2a374366713307688136Bo Zhu            // Should never happen
5076973437e9cb36eb60fb2a374366713307688136Bo Zhu            throw new RuntimeException(e);
5176973437e9cb36eb60fb2a374366713307688136Bo Zhu        }
5276973437e9cb36eb60fb2a374366713307688136Bo Zhu    }
5376973437e9cb36eb60fb2a374366713307688136Bo Zhu}
54