185 lines
6.7 KiB
Python
185 lines
6.7 KiB
Python
################################################################################
|
|
# Copyright 2016 Google LLC.
|
|
#
|
|
# This software is licensed under the terms defined in the Widevine Master
|
|
# License Agreement. For a copy of this agreement, please contact
|
|
# widevine-licensing@google.com.
|
|
################################################################################
|
|
"""Utility class for Provisioning SDK testing."""
|
|
|
|
import logging
|
|
|
|
from certificate_type import CertificateType
|
|
import test_data_provider
|
|
from provisioning_status import ProvisioningStatus
|
|
from protos.public import certificate_provisioning_pb2
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
|
|
def InitProvisionEngineWithTestData(
|
|
engine,
|
|
verify_success=False,
|
|
cert_type=CertificateType.kCertificateTypeTesting):
|
|
"""Initialize the provisioning engine with sample credentials.
|
|
|
|
Args:
|
|
engine: a ProvisioningEngine instance
|
|
verify_success: whether to verify that resulting status code equals OK
|
|
cert_type: The type of certificate to use for initializing SDK -
|
|
{kCertificateTypeTesting/kCertificateTypeDevelopment}
|
|
|
|
Returns:
|
|
OK on success, or an appropriate error status code otherwise.
|
|
"""
|
|
data_provider = test_data_provider.TestDataProvider(cert_type)
|
|
logging.info('Adding service certificate.')
|
|
|
|
logging.info('Initializing provisioning engine with test data.')
|
|
status = engine.Initialize(cert_type, data_provider.service_drm_cert,
|
|
data_provider.service_private_key,
|
|
data_provider.service_private_key_passphrase,
|
|
data_provider.provisioner_drm_cert,
|
|
data_provider.provisioner_private_key,
|
|
data_provider.provisioner_private_key_passphrase,
|
|
data_provider.provisioner_spoid_secret)
|
|
|
|
if verify_success:
|
|
assert ProvisioningStatus.OK == status
|
|
|
|
return status
|
|
|
|
|
|
def SetCertificateStatusListWithTestData(
|
|
engine,
|
|
expiration_period_seconds,
|
|
verify_success=False,
|
|
cert_type=CertificateType.kCertificateTypeTesting):
|
|
"""Set the certificate status list with sample certificate status list.
|
|
|
|
Args:
|
|
engine: a ProvisioningEngine instance
|
|
expiration_period_seconds: number of seconds until certificate_status_list
|
|
expires after its creation time
|
|
verify_success: whether to verify that resulting status code equals OK
|
|
cert_type: The type of certificate to use for initializing SDK -
|
|
{kCertificateTypeTesting/kCertificateTypeDevelopment}
|
|
|
|
Returns:
|
|
OK on success, or an appropriate error status code otherwise.
|
|
"""
|
|
logging.info('Setting certificate status list with test data.')
|
|
data_provider = test_data_provider.TestDataProvider(cert_type)
|
|
certificate_status_list = data_provider.certificate_list
|
|
|
|
status = engine.SetCertificateStatusList(certificate_status_list,
|
|
expiration_period_seconds)
|
|
|
|
if verify_success:
|
|
assert ProvisioningStatus.OK == status
|
|
|
|
return status
|
|
|
|
|
|
def AddDrmIntermediateCertificateWithTestData(
|
|
engine,
|
|
system_id,
|
|
verify_success=False,
|
|
cert_type=CertificateType.kCertificateTypeTesting):
|
|
"""Generate an intermediate DRM cert and add it to provisioning engine.
|
|
|
|
The intermediate DRM certificate is generated with sample public key and
|
|
is added to the provisioning engine with sample certificate private key and
|
|
passphrase.
|
|
|
|
Args:
|
|
engine: a ProvisioningEngine instance
|
|
system_id: Widevine system ID for the type of device
|
|
verify_success: whether to verify that resulting status code equals OK
|
|
cert_type: The type of certificate to use for initializing SDK -
|
|
{kCertificateTypeTesting/kCertificateTypeDevelopment}
|
|
|
|
Returns:
|
|
OK on success, or an appropriate error status code otherwise.
|
|
"""
|
|
logging.info('Generating DRM intermediate certificate for system_id <%d>.',
|
|
system_id)
|
|
data_provider = test_data_provider.TestDataProvider(cert_type)
|
|
gen_status, ca_certificate = engine.GenerateDrmIntermediateCertificate(
|
|
system_id, data_provider.ca_public_key)
|
|
assert ProvisioningStatus.OK == gen_status
|
|
|
|
logging.info('Adding DRM intermediate certificate.')
|
|
add_ca_status = engine.AddDrmIntermediateCertificate(
|
|
ca_certificate, data_provider.ca_private_key,
|
|
data_provider.ca_private_key_passphrase)
|
|
|
|
if verify_success:
|
|
assert ProvisioningStatus.OK == add_ca_status
|
|
|
|
return add_ca_status
|
|
|
|
|
|
def GenerateDeviceDrmCertificate(
|
|
engine,
|
|
system_id,
|
|
serial_number,
|
|
verify_success=False,
|
|
cert_type=CertificateType.kCertificateTypeTesting):
|
|
"""Generate a device DRM certificate.
|
|
|
|
Args:
|
|
engine: a ProvisioningEngine instance
|
|
system_id: Widevine system ID for the type of device
|
|
serial_number: The serial number for the device DRM certificate.
|
|
verify_success: whether to verify that resulting status code equals OK
|
|
cert_type: The type of certificate to use for initializing SDK -
|
|
{kCertificateTypeTesting/kCertificateTypeDevelopment}
|
|
|
|
Returns:
|
|
OK on success, or an appropriate error status code otherwise.
|
|
"""
|
|
logging.info(
|
|
'Generating Device cert for system_id <%d> and serial_number <%s>.',
|
|
system_id, serial_number)
|
|
data_provider = test_data_provider.TestDataProvider(cert_type)
|
|
gen_status, ca_certificate = engine.GenerateDeviceDrmCertificate(
|
|
system_id, data_provider.device_public_key, serial_number)
|
|
if verify_success:
|
|
assert ProvisioningStatus.OK == gen_status
|
|
return ca_certificate
|
|
|
|
|
|
def NewProvisioningSessionWithTestData(
|
|
engine,
|
|
verify_success=False,
|
|
cert_type=CertificateType.kCertificateTypeTesting):
|
|
"""Create a provisioning session with sample device public and private keys.
|
|
|
|
Args:
|
|
engine: a ProvisioningEngine instance
|
|
verify_success: whether to verify that resulting status code equals OK
|
|
cert_type: The type of certificate to use for initializing SDK -
|
|
{kCertificateTypeTesting/kCertificateTypeDevelopment}
|
|
|
|
Returns:
|
|
new_session: A new provisioning_session.
|
|
status: OK on success, or an appropriate error status code otherwise.
|
|
"""
|
|
logging.info('Starting a new provisioning session with'
|
|
'sample device public and private keys.')
|
|
data_provider = test_data_provider.TestDataProvider(cert_type)
|
|
new_session, status = engine.NewProvisioningSession(
|
|
certificate_provisioning_pb2.SignedProvisioningMessage.PROVISIONING_30,
|
|
data_provider.device_public_key, data_provider.device_private_key)
|
|
if verify_success:
|
|
assert (ProvisioningStatus.OK == status), 'status = %r' % status
|
|
|
|
return new_session, status
|
|
|
|
|
|
def ConvertToSignedProvisioningMessage(serialized_message):
|
|
signed_message = certificate_provisioning_pb2.SignedProvisioningMessage()
|
|
signed_message.ParseFromString(serialized_message)
|
|
return signed_message
|