// Copyright 2019 Google LLC. All rights reserved. This file and proprietary // source code may only be used and distributed under the Widevine // License Agreement. #ifndef WIDEVINE_ODK_SRC_ODK_STRUCTS_PRIV_H_ #define WIDEVINE_ODK_SRC_ODK_STRUCTS_PRIV_H_ #include #include "OEMCryptoCENCCommon.h" #include "odk_structs.h" #ifdef __cplusplus extern "C" { #endif // We use a typedef here so `ODK_CoreMessage` will contain "simple types" which // should work better with the auto code generator. typedef uint32_t ODK_MessageType; #define ODK_License_Request_Type ((ODK_MessageType)1u) #define ODK_License_Response_Type ((ODK_MessageType)2u) #define ODK_Renewal_Request_Type ((ODK_MessageType)3u) #define ODK_Renewal_Response_Type ((ODK_MessageType)4u) #define ODK_Provisioning_Request_Type ((ODK_MessageType)5u) #define ODK_Provisioning_Response_Type ((ODK_MessageType)6u) #define ODK_Renewed_Provisioning_Request_Type ((ODK_MessageType)11u) #define ODK_Provisioning40_Request_Type ((ODK_MessageType)12u) // TODO(b/244580447): Reserve future message types to support // forward compatibility. #define ODK_Release_Request_Type ((ODK_MessageType)7u) #define ODK_Release_Response_Type ((ODK_MessageType)8u) #define ODK_Common_Request_Type ((ODK_MessageType)9u) #define ODK_Common_Response_Type ((ODK_MessageType)10u) typedef struct { ODK_MessageType message_type; // Type of core message (defined above) uint32_t message_length; // Length of core message. ODK_NonceValues nonce_values; } ODK_CoreMessage; typedef struct { ODK_CoreMessage core_message; ODK_MessageCounterInfo counter_info; } ODK_PreparedLicenseRequest; typedef struct { ODK_CoreMessage core_message; } ODK_PreparedLicenseRequestV17; typedef struct { ODK_CoreMessage core_message; uint64_t playback_time; } ODK_PreparedRenewalRequest; typedef struct { ODK_CoreMessage core_message; ODK_MessageCounterInfo counter_info; } ODK_PreparedProvisioningRequest; typedef struct { ODK_CoreMessage core_message; uint32_t device_id_length; uint8_t device_id[ODK_DEVICE_ID_LEN_MAX]; } ODK_PreparedProvisioningRequestV17; typedef struct { ODK_CoreMessage core_message; uint32_t device_info_length; uint8_t device_info[ODK_DEVICE_INFO_LEN_MAX]; ODK_MessageCounterInfo counter_info; } ODK_PreparedProvisioning40Request; typedef struct { ODK_CoreMessage core_message; uint32_t device_id_length; uint8_t device_id[ODK_DEVICE_ID_LEN_MAX]; uint16_t renewal_type; uint32_t renewal_data_length; uint8_t renewal_data[ODK_KEYBOX_RENEWAL_DATA_SIZE]; } ODK_PreparedRenewedProvisioningRequest; typedef struct { ODK_CoreMessage core_message; } ODK_PreparedCommonRequest; typedef struct { ODK_CoreMessage core_message; ODK_ParsedLicense* parsed_license; uint8_t request_hash[ODK_SHA256_HASH_SIZE]; } ODK_LicenseResponse; typedef struct { ODK_CoreMessage core_message; ODK_Packing_ParsedLicense* parsed_license; uint8_t request_hash[ODK_SHA256_HASH_SIZE]; } ODK_Packing_LicenseResponse; typedef struct { ODK_PreparedRenewalRequest request; uint64_t renewal_duration_seconds; } ODK_RenewalResponse; typedef struct { ODK_CoreMessage core_message; ODK_ParsedProvisioning* parsed_provisioning; } ODK_ProvisioningResponse; // Used by V16 and V17 typedef struct { ODK_PreparedProvisioningRequestV17 request; ODK_ParsedProvisioning* parsed_provisioning; } ODK_ProvisioningResponseV16; typedef struct { ODK_CoreMessage core_message; } ODK_Provisioning40Response; // These are the sum of sizeof of each individual member of the request structs // without any padding added by the compiler. Make sure they get updated when // request structs change. Refer to test suite OdkSizeTest in // ../test/odk_test.cpp for validations of each of the defined request sizes. #define ODK_CORE_MESSAGE_SIZE 20u #define ODK_LICENSE_REQUEST_SIZE 90u #define ODK_LICENSE_REQUEST_SIZE_V17 20u #define ODK_RENEWAL_REQUEST_SIZE 28u #define ODK_PROVISIONING_REQUEST_SIZE 94u #define ODK_PROVISIONING_REQUEST_SIZE_V17 88u #define ODK_PROVISIONING40_REQUEST_SIZE 862u #define ODK_RENEWED_PROVISIONING_REQUEST_SIZE 1694u #define ODK_MESSAGECOUNTERINFO_SIZE 70u // These are the possible timer status values. #define ODK_CLOCK_TIMER_STATUS_UNDEFINED 0u // Should not happen. // When the structure has been initialized, but no license is loaded. #define ODK_CLOCK_TIMER_STATUS_LICENSE_NOT_LOADED 1u // After the license is loaded, before a successful decrypt. #define ODK_CLOCK_TIMER_STATUS_LICENSE_LOADED 2u // After the license is loaded, if a renewal has also been loaded. #define ODK_CLOCK_TIMER_STATUS_RENEWAL_LOADED 3u // The first decrypt has occurred and the timer is active. #define ODK_CLOCK_TIMER_STATUS_ACTIVE 4u // The first decrypt has occurred and the timer is unlimited. #define ODK_CLOCK_TIMER_STATUS_UNLIMITED 5u // The timer has transitioned from active to expired. #define ODK_CLOCK_TIMER_STATUS_EXPIRED 6u // The license has been marked as inactive. #define ODK_CLOCK_TIMER_STATUS_LICENSE_INACTIVE 7u // A helper function for computing timer limits when a renewal is loaded. OEMCryptoResult ODK_ComputeRenewalDuration(const ODK_TimerLimits* timer_limits, ODK_ClockValues* clock_values, uint64_t system_time_seconds, uint64_t new_renewal_duration, uint64_t* timer_value); #ifdef __cplusplus } #endif #endif // WIDEVINE_ODK_SRC_ODK_STRUCTS_PRIV_H_