96 lines
3.8 KiB
C++
96 lines
3.8 KiB
C++
// Copyright 2023 Google LLC. All Rights Reserved. This file and proprietary
|
|
// source code may only be used and distributed under the Widevine License
|
|
// Agreement.
|
|
//
|
|
// Reference implementation utilities of OEMCrypto APIs
|
|
//
|
|
#ifndef WVOEC_UTIL_DEVICE_INFO_VALIDATOR_H_
|
|
#define WVOEC_UTIL_DEVICE_INFO_VALIDATOR_H_
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "cbor_validator.h"
|
|
#include "cppbor.h"
|
|
#include "prov4_validation_helper.h"
|
|
#include "wv_class_utils.h"
|
|
|
|
namespace wvoec {
|
|
namespace util {
|
|
struct DeviceInfo {
|
|
// Version 2 and 3 fields
|
|
std::pair<FieldStatus, std::string> brand;
|
|
std::pair<FieldStatus, std::string> manufacturer;
|
|
std::pair<FieldStatus, std::string> product;
|
|
std::pair<FieldStatus, std::string> model;
|
|
std::pair<FieldStatus, std::string> device;
|
|
std::pair<FieldStatus, std::string>
|
|
vb_state; // "green" / "yellow" / "orange"
|
|
std::pair<FieldStatus, std::string>
|
|
bootloader_state; // "locked" / "unlocked"
|
|
std::pair<FieldStatus, std::vector<uint8_t>> vbmeta_digest;
|
|
std::pair<FieldStatus, std::string> os_version;
|
|
std::pair<FieldStatus, std::string> system_patch_level; // YYYYMM
|
|
std::pair<FieldStatus, std::string> boot_patch_level; // YYYYMMDD
|
|
std::pair<FieldStatus, std::string> vendor_patch_level; // YYYYMMDD
|
|
std::pair<FieldStatus, std::string> security_level; // "tee" / "strongbox"
|
|
std::pair<FieldStatus, std::string> fused; // 1 / 0
|
|
// Version 1 fields
|
|
std::pair<FieldStatus, std::string> board;
|
|
std::pair<FieldStatus, std::string> version;
|
|
std::pair<FieldStatus, std::string> att_id_state;
|
|
std::string ToString() const;
|
|
CborMessageStatus Validate(
|
|
std::vector<std::pair<CborMessageStatus, std::string>>& msgs, bool is_gms,
|
|
int version_number) const;
|
|
CborMessageStatus ValidateV3Fields(
|
|
bool is_tee_device_info,
|
|
std::vector<std::pair<CborMessageStatus, std::string>>& msgs) const;
|
|
CborMessageStatus ValidateV2Fields(
|
|
bool is_tee_device_info,
|
|
std::vector<std::pair<CborMessageStatus, std::string>>& msgs) const;
|
|
CborMessageStatus ValidateV1Fields(
|
|
std::vector<std::pair<CborMessageStatus, std::string>>& msgs) const;
|
|
};
|
|
|
|
// DeviceInfoValidator parses and validates a Cbor struct of DeviceInfo used by
|
|
// Provisioning 4.0. DeviceInfo definition:
|
|
// https://source.corp.google.com/h/googleplex-android/platform/superproject/main/+/main:hardware/interfaces/security/rkp/aidl/android/hardware/security/keymint/DeviceInfoV3.cddl
|
|
class DeviceInfoValidator : public CborValidator {
|
|
public:
|
|
DeviceInfoValidator() = delete;
|
|
WVCDM_DISALLOW_COPY_AND_MOVE(DeviceInfoValidator);
|
|
|
|
explicit DeviceInfoValidator(int version_number = 3, bool is_gms = false)
|
|
: version_number_(version_number), is_gms_(is_gms) {}
|
|
|
|
virtual ~DeviceInfoValidator() override = default;
|
|
|
|
// Decodes |device_info| and sets |message_status_|.
|
|
virtual CborMessageStatus Parse(
|
|
const std::vector<uint8_t>& device_info) override;
|
|
// Verifies the Cbor struct of a client generated device info.
|
|
virtual CborMessageStatus Validate() override;
|
|
// Outputs DeviceInfo in YAML.
|
|
virtual std::string GetFormattedMessage() const override;
|
|
|
|
private:
|
|
// Builds a struct of DeviceInfo from input CBOR map |device_info_map|.
|
|
CborMessageStatus BuildDeviceInfo(DeviceInfo& device_info,
|
|
const cppbor::Map* device_info_map);
|
|
// Used to generate formatted message.
|
|
std::stringstream msg_ss_;
|
|
// Device info version. Validations are done based on the version number.
|
|
int version_number_;
|
|
// Whether the device is a GMS device.
|
|
bool is_gms_;
|
|
// Saved Cbor-encoded device info.
|
|
std::vector<uint8_t> device_info_bytes_;
|
|
}; // class DeviceInfoValidator
|
|
} // namespace util
|
|
} // namespace wvoec
|
|
#endif // WVOEC_UTIL_DEVICE_INFO_VALIDATOR_H_
|