This CL is a merge from the widevine repo of http://go/wvgerrit/16553 Prebuilt Level 3 OEMCrypto for Android http://go/wvgerrit/16238 Require OEMCrypto v11 for Android N Unit Tests http://go/wvgerrit/16484 Shared License Tests (OEMCrypto v11) http://go/wvgerrit/16448 Pattern Decrypt Unit Tests and Reference Implementation http://go/wvgerrit/16489 Enforce UNUSED Variables http://go/wvgerrit/16479 Pattern Decrypt for Level 3 OEMCrypto http://go/wvgerrit/16280 Correctly handle bad RSA key http://go/wvgerrit/16315 Security Patch Level - haystack version http://go/wvgerrit/16282 Correctly handle null pointer in GetKeyData http://go/wvgerrit/16294 Initialize data for generation number It contains the Level 3 implementation, as well. mips/libwvlevel3.a Level3 Library Jan 22 2016 14:30:27 arm/libwvlevel3.a Level3 Library Jan 22 2016 15:03:55 x86/libwvlevel3.a Level3 Library Jan 22 2016 13:52:29 b/26692954 [DRM] OEMCrypto v11 needed for Nexus devices Change-Id: Ibb1384959620f63a1be1e82ce2952ec9f48f0d3e
87 lines
2.8 KiB
C++
87 lines
2.8 KiB
C++
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
//
|
|
// Mock implementation of OEMCrypto APIs
|
|
//
|
|
#ifndef OEMCRYPTO_KEY_MOCK_H_
|
|
#define OEMCRYPTO_KEY_MOCK_H_
|
|
|
|
#include <stdint.h>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace wvoec_mock {
|
|
|
|
const uint32_t kControlObserveDataPath = (1<<31);
|
|
const uint32_t kControlObserveHDCP = (1<<30);
|
|
const uint32_t kControlObserveCGMS = (1<<29);
|
|
const uint32_t kControlRequireAntiRollbackHardware = (1<<28);
|
|
const uint32_t kControlSecurityPatchLevelShift = 15;
|
|
const uint32_t kControlSecurityPatchLevelMask =
|
|
(0x3F<<kControlSecurityPatchLevelShift);
|
|
const uint32_t kControlReplayMask = (0x03<<13);
|
|
const uint32_t kControlNonceRequired = (0x01<<13);
|
|
const uint32_t kControlNonceOrEntry = (0x02<<13);
|
|
const uint32_t kControlHDCPVersionShift = 9;
|
|
const uint32_t kControlHDCPVersionMask = (0x0F<<kControlHDCPVersionShift);
|
|
const uint32_t kControlAllowEncrypt = (1<<8);
|
|
const uint32_t kControlAllowDecrypt = (1<<7);
|
|
const uint32_t kControlAllowSign = (1<<6);
|
|
const uint32_t kControlAllowVerify = (1<<5);
|
|
const uint32_t kControlDataPathSecure = (1<<4);
|
|
const uint32_t kControlNonceEnabled = (1<<3);
|
|
const uint32_t kControlHDCPRequired = (1<<2);
|
|
const uint32_t kControlCGMSMask = (0x03);
|
|
const uint32_t kControlCGMSCopyFreely = (0x00);
|
|
const uint32_t kControlCGMSCopyOnce = (0x02);
|
|
const uint32_t kControlCGMSCopyNever = (0x03);
|
|
|
|
class KeyControlBlock {
|
|
public:
|
|
KeyControlBlock(const std::vector<uint8_t>& key_control_string);
|
|
~KeyControlBlock() {}
|
|
|
|
bool Validate();
|
|
void Invalidate() { valid_ = false; }
|
|
|
|
bool valid() const { return valid_; }
|
|
uint32_t duration() const { return duration_; }
|
|
void set_duration(uint32_t duration) { duration_ = duration; }
|
|
uint32_t nonce() const { return nonce_; }
|
|
const char* verification() const { return verification_; }
|
|
uint32_t control_bits() const { return control_bits_; }
|
|
|
|
private:
|
|
uint32_t ExtractField(const std::vector<uint8_t>& str, int idx);
|
|
|
|
bool valid_;
|
|
char verification_[4];
|
|
uint32_t duration_;
|
|
uint32_t nonce_;
|
|
uint32_t control_bits_;
|
|
};
|
|
|
|
// AES-128 crypto key, or HMAC signing key.
|
|
class Key {
|
|
public:
|
|
Key(const Key& key) : value_(key.value_), control_(key.control_),
|
|
ctr_mode_(key.ctr_mode_) {}
|
|
Key(const std::vector<uint8_t>& key_string, const KeyControlBlock& control,
|
|
bool ctr_mode) : value_(key_string), control_(control),
|
|
ctr_mode_(ctr_mode) {};
|
|
|
|
virtual ~Key() {};
|
|
void UpdateDuration(const KeyControlBlock& control);
|
|
const std::vector<uint8_t>& value() const { return value_; }
|
|
const KeyControlBlock& control() const { return control_; }
|
|
bool ctr_mode() const { return ctr_mode_; }
|
|
|
|
private:
|
|
std::vector<uint8_t> value_;
|
|
KeyControlBlock control_;
|
|
bool ctr_mode_;
|
|
};
|
|
|
|
} // namespace wvoec_mock
|
|
|
|
#endif // OEMCRYPTO_KEY_MOCK_H_
|