1c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden/* 2c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Copyright (C) 2016 The Android Open Source Project 3c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 4c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 5c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * you may not use this file except in compliance with the License. 6c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * You may obtain a copy of the License at 7c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 8c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * http://www.apache.org/licenses/LICENSE-2.0 9c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 10c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Unless required by applicable law or agreed to in writing, software 11c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 12c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * See the License for the specific language governing permissions and 14c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * limitations under the License. 15c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden */ 16c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 17c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#define LOG_TAG "keystore" 18c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 19c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include "entropy.h" 20c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 21c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <errno.h> 22c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <fcntl.h> 23c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <stdio.h> 24c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <string.h> 25c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <unistd.h> 26c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 27c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <cutils/log.h> 28c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 29c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include "keystore_utils.h" 30c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 31c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn WilldenEntropy::~Entropy() { 32c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden if (mRandom >= 0) { 33c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden close(mRandom); 34c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 35c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 36c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 37c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdenbool Entropy::open() { 38c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden const char* randomDevice = "/dev/urandom"; 39c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden mRandom = TEMP_FAILURE_RETRY(::open(randomDevice, O_RDONLY)); 40c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden if (mRandom < 0) { 41c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden ALOGE("open: %s: %s", randomDevice, strerror(errno)); 42c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return false; 43c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 44c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return true; 45c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 46c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 47c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdenbool Entropy::generate_random_data(uint8_t* data, size_t size) const { 48c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return (readFully(mRandom, data, size) == size); 49c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 50