/*
 * Copyright 2015 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.
 */

#ifndef TRUSTY_APP_KEYMASTER_TRUSTY_KEYMASTER_ENFORCEMENT_H_
#define TRUSTY_APP_KEYMASTER_TRUSTY_KEYMASTER_ENFORCEMENT_H_

#include "openssl_keymaster_enforcement.h"

namespace keymaster {

class TrustyKeymasterContext;

const int kAccessMapTableSize = 32;
const int kAccessCountTableSize = 32;

class TrustyKeymasterEnforcement : public OpenSSLKeymasterEnforcement {
public:
    TrustyKeymasterEnforcement(TrustyKeymasterContext* context)
            : OpenSSLKeymasterEnforcement(kAccessMapTableSize,
                                          kAccessCountTableSize),
              context_(context) {}
    ~TrustyKeymasterEnforcement() {}

    bool activation_date_valid(uint64_t activation_date) const override {
        // Have no wall clock, can't check activations.
        return true;
    }

    bool expiration_date_passed(uint64_t expiration_date) const override {
        // Have no wall clock, can't check expirations.
        return false;
    }

    bool auth_token_timed_out(const hw_auth_token_t& token,
                              uint32_t timeout) const override;
    uint64_t get_current_time_ms() const override;
    keymaster_security_level_t SecurityLevel() const override;
    bool ValidateTokenSignature(const hw_auth_token_t& token) const override;

private:
    uint64_t milliseconds_since_boot() const;

    TrustyKeymasterContext* context_;
};

}  // namespace keymaster

#endif  // TRUSTY_APP_KEYMASTER_TRUSTY_KEYMASTER_ENFORCEMENT_H_
