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

Commit a3e47290 authored by Paul Crowley's avatar Paul Crowley
Browse files

Revert "Replace the native scrypt in SyntheticPasswordManager by"

This reverts commit 20f2f24d.

Reason for revert: nativeSidFromPasswordHandle is still needed

Change-Id: I02b39d8373f2e9f286d2b5f36a7fed719cbf08ef
parent 20f2f24d
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);