Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a9d8df0 authored by Paul Crowley's avatar Paul Crowley Committed by Android (Google) Code Review
Browse files

Merge "Revert "Replace the native scrypt in SyntheticPasswordManager by""

parents a716bac5 a3e47290
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.hardware.weaver.V1_0.WeaverStatus;
import android.os.RemoteException;
import android.os.UserManager;
import android.security.GateKeeper;
import android.security.Scrypt;
import android.service.gatekeeper.GateKeeperResponse;
import android.service.gatekeeper.IGateKeeperService;
import android.util.ArrayMap;
@@ -1174,10 +1173,11 @@ public class SyntheticPasswordManager {
    }

    protected byte[] scrypt(String password, byte[] salt, int N, int r, int p, int outLen) {
        return new Scrypt().scrypt(password.getBytes(), salt, N, r, p, outLen);
        return nativeScrypt(password.getBytes(), salt, N, r, p, outLen);
    }

    native long nativeSidFromPasswordHandle(byte[] handle);
    native byte[] nativeScrypt(byte[] password, byte[] salt, int N, int r, int p, int outLen);

    protected static ArrayList<Byte> toByteArrayList(byte[] data) {
        ArrayList<Byte> result = new ArrayList<Byte>(data.length);
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ cc_library_static {
        "com_android_server_input_InputManagerService.cpp",
        "com_android_server_lights_LightsService.cpp",
        "com_android_server_location_GnssLocationProvider.cpp",
        "com_android_server_locksettings_SyntheticPasswordManager.cpp",
        "com_android_server_net_NetworkStatsService.cpp",
        "com_android_server_power_PowerManagerService.cpp",
        "com_android_server_security_VerityUtils.cpp",
@@ -125,6 +126,7 @@ cc_defaults {

    static_libs: [
        "android.hardware.broadcastradio@common-utils-1x-lib",
        "libscrypt_static",
    ],

    product_variables: {
+90 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "SyntheticPasswordManager"

#include <nativehelper/JNIHelp.h>
#include "jni.h"

#include <android_runtime/Log.h>
#include <utils/Timers.h>
#include <utils/misc.h>
#include <utils/String8.h>
#include <utils/Log.h>
#include <gatekeeper/password_handle.h>


extern "C" {
#include "crypto_scrypt.h"
}

namespace android {

static jlong android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle(JNIEnv* env, jobject, jbyteArray handleArray) {

    jbyte* data = (jbyte*)env->GetPrimitiveArrayCritical(handleArray, NULL);

    if (data != NULL) {
        const gatekeeper::password_handle_t *handle =
                reinterpret_cast<const gatekeeper::password_handle_t *>(data);
        jlong sid = handle->user_id;
        env->ReleasePrimitiveArrayCritical(handleArray, data, JNI_ABORT);
        return sid;
    } else {
        return 0;
    }
}

static jbyteArray android_server_SyntheticPasswordManager_nativeScrypt(JNIEnv* env, jobject, jbyteArray password, jbyteArray salt, jint N, jint r, jint p, jint outLen) {
    if (!password || !salt) {
        return NULL;
    }

    int passwordLen = env->GetArrayLength(password);
    int saltLen = env->GetArrayLength(salt);
    jbyteArray ret = env->NewByteArray(outLen);

    jbyte* passwordPtr = (jbyte*)env->GetByteArrayElements(password, NULL);
    jbyte* saltPtr = (jbyte*)env->GetByteArrayElements(salt, NULL);
    jbyte* retPtr = (jbyte*)env->GetByteArrayElements(ret, NULL);

    int rc = crypto_scrypt((const uint8_t *)passwordPtr, passwordLen,
                       (const uint8_t *)saltPtr, saltLen, N, r, p, (uint8_t *)retPtr,
                       outLen);
    env->ReleaseByteArrayElements(password, passwordPtr, JNI_ABORT);
    env->ReleaseByteArrayElements(salt, saltPtr, JNI_ABORT);
    env->ReleaseByteArrayElements(ret, retPtr, 0);

    if (!rc) {
        return ret;
    } else {
        SLOGE("scrypt failed");
        return NULL;
    }
}

static const JNINativeMethod sMethods[] = {
     /* name, signature, funcPtr */
    {"nativeSidFromPasswordHandle", "([B)J", (void*)android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle},
    {"nativeScrypt", "([B[BIIII)[B", (void*)android_server_SyntheticPasswordManager_nativeScrypt},
};

int register_android_server_SyntheticPasswordManager(JNIEnv* env) {
    return jniRegisterNativeMethods(env, "com/android/server/locksettings/SyntheticPasswordManager",
                                    sMethods, NELEM(sMethods));
}

} /* namespace android */
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ int register_android_server_tv_TvInputHal(JNIEnv* env);
int register_android_server_PersistentDataBlockService(JNIEnv* env);
int register_android_server_Watchdog(JNIEnv* env);
int register_android_server_HardwarePropertiesManagerService(JNIEnv* env);
int register_android_server_SyntheticPasswordManager(JNIEnv* env);
int register_android_server_GraphicsStatsService(JNIEnv* env);
int register_android_hardware_display_DisplayViewport(JNIEnv* env);
int register_android_server_net_NetworkStatsService(JNIEnv* env);
@@ -97,6 +98,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
    register_android_server_PersistentDataBlockService(env);
    register_android_server_HardwarePropertiesManagerService(env);
    register_android_server_storage_AppFuse(env);
    register_android_server_SyntheticPasswordManager(env);
    register_android_server_GraphicsStatsService(env);
    register_android_hardware_display_DisplayViewport(env);
    register_android_server_net_NetworkStatsService(env);