| /* |
| * Copyright (C) 2016 Team Win Recovery 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. |
| */ |
| |
| /* |
| * This computes the "secret" used by Android as one of the parameters |
| * to decrypt File Based Encryption. The secret is prefixed with |
| * "Android FBE credential hash" padded with 0s to 128 bytes then the |
| * user's password is appended to the end of the 128 bytes. This string |
| * is then hashed with sha512 and the sha512 value is then converted to |
| * hex with upper-case characters. |
| */ |
| |
| #include <stdio.h> |
| #include <string> |
| #include <stdlib.h> |
| #include <openssl/sha.h> |
| |
| #define PASS_PADDING_SIZE 128 |
| #define SHA512_HEX_SIZE SHA512_DIGEST_LENGTH * 2 |
| |
| std::string HashPassword(const std::string& Password) { |
| size_t size = PASS_PADDING_SIZE + Password.size(); |
| unsigned char* buffer = (unsigned char*)calloc(1, size); |
| const char* prefix = "Android FBE credential hash"; |
| memcpy((void*)buffer, (void*)prefix, strlen(prefix)); |
| unsigned char* ptr = buffer + PASS_PADDING_SIZE; |
| memcpy((void*)ptr, Password.c_str(), Password.size()); |
| unsigned char hash[SHA512_DIGEST_LENGTH]; |
| SHA512_CTX sha512; |
| SHA512_Init(&sha512); |
| SHA512_Update(&sha512, buffer, size); |
| SHA512_Final(hash, &sha512); |
| int index = 0; |
| char hex_hash[SHA512_HEX_SIZE + 1]; |
| for(index = 0; index < SHA512_DIGEST_LENGTH; index++) |
| sprintf(hex_hash + (index * 2), "%02X", hash[index]); |
| hex_hash[128] = 0; |
| std::string ret = hex_hash; |
| return ret; |
| } |