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