13bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu/* 23bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * Copyright (C) 2016 The Android Open Source Project 33bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * 43bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * Licensed under the Apache License, Version 2.0 (the "License"); 53bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * you may not use this file except in compliance with the License. 63bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * You may obtain a copy of the License at 73bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * 83bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * http://www.apache.org/licenses/LICENSE-2.0 93bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * 103bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * Unless required by applicable law or agreed to in writing, software 113bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * distributed under the License is distributed on an "AS IS" BASIS, 123bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * See the License for the specific language governing permissions and 143bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu * limitations under the License. 153bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu */ 163bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 173bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#define LOG_TAG "SyntheticPasswordManager" 183bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 1960cc6c03ff489169a6337f770ff06197ed17263cSteven Moreland#include <nativehelper/JNIHelp.h> 203bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include "jni.h" 213bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 223bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <android_runtime/Log.h> 233bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <utils/Timers.h> 243bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <utils/misc.h> 253bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <utils/String8.h> 263bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <utils/Log.h> 273bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include <gatekeeper/password_handle.h> 283bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 293bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 303bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xuextern "C" { 313bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu#include "crypto_scrypt.h" 323bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu} 333bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 343bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xunamespace android { 353bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 363bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xustatic jlong android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle(JNIEnv* env, jobject, jbyteArray handleArray) { 373bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 383bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jbyte* data = (jbyte*)env->GetPrimitiveArrayCritical(handleArray, NULL); 393bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 403bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu if (data != NULL) { 413bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu const gatekeeper::password_handle_t *handle = 423bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu reinterpret_cast<const gatekeeper::password_handle_t *>(data); 433bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jlong sid = handle->user_id; 443bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu env->ReleasePrimitiveArrayCritical(handleArray, data, JNI_ABORT); 453bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu return sid; 463bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } else { 473bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu return 0; 483bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } 493bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu} 503bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 513bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xustatic jbyteArray android_server_SyntheticPasswordManager_nativeScrypt(JNIEnv* env, jobject, jbyteArray password, jbyteArray salt, jint N, jint r, jint p, jint outLen) { 523bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu if (!password || !salt) { 533bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu return NULL; 543bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } 553bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 563bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu int passwordLen = env->GetArrayLength(password); 573bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu int saltLen = env->GetArrayLength(salt); 583bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jbyteArray ret = env->NewByteArray(outLen); 593bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 603bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jbyte* passwordPtr = (jbyte*)env->GetByteArrayElements(password, NULL); 613bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jbyte* saltPtr = (jbyte*)env->GetByteArrayElements(salt, NULL); 623bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu jbyte* retPtr = (jbyte*)env->GetByteArrayElements(ret, NULL); 633bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 643bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu int rc = crypto_scrypt((const uint8_t *)passwordPtr, passwordLen, 653bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu (const uint8_t *)saltPtr, saltLen, N, r, p, (uint8_t *)retPtr, 663bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu outLen); 673bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu env->ReleaseByteArrayElements(password, passwordPtr, JNI_ABORT); 683bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu env->ReleaseByteArrayElements(salt, saltPtr, JNI_ABORT); 693bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu env->ReleaseByteArrayElements(ret, retPtr, 0); 703bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 713bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu if (!rc) { 723bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu return ret; 733bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } else { 743bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu SLOGE("scrypt failed"); 753bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu return NULL; 763bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu } 773bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu} 783bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 793bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xustatic const JNINativeMethod sMethods[] = { 803bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu /* name, signature, funcPtr */ 813bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu {"nativeSidFromPasswordHandle", "([B)J", (void*)android_server_SyntheticPasswordManager_nativeSidFromPasswordHandle}, 823bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu {"nativeScrypt", "([B[BIIII)[B", (void*)android_server_SyntheticPasswordManager_nativeScrypt}, 833bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu}; 843bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 853bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xuint register_android_server_SyntheticPasswordManager(JNIEnv* env) { 86507d11c9353666a75fee014565f900825a907691Andrew Scull return jniRegisterNativeMethods(env, "com/android/server/locksettings/SyntheticPasswordManager", 873bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu sMethods, NELEM(sMethods)); 883bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu} 893bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu 903bf722a8d54ca7192dfe07ee7b73eac7d25ccac5Rubin Xu} /* namespace android */ 91