#!/bin/bash ################################################################################ # 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. ################################################################################ # # This script generates a directory that stores the intermediate artifacts # needed for testing. # # Prerequirements (if running the script directly): # - Python 2.7 or later # - pip: https://pip.pypa.io/en/latest/installing/ # - Python cryptography package: https://cryptography.io/en/latest/installation/ # - Protocol compiler: https://github.com/google/protobuf#protocol-compiler-installation # On Ubuntu: sudo apt-get install protobuf-compiler # - Protobuf Python runtime (version 3.0 or later): sudo pip install protobuf # - CLIF: https://github.com/google/clif # Environment Variables: # - TOOLS_PATH: colon-delimited paths to additional tools such as protoc. # - CLIF_PREFIX: prefix path to CLIF installation. set -ex cd "$(dirname "$0")" if [[ -v TOOLS_PATH ]]; then export PATH=$PATH:$TOOLS_PATH fi if ! which protoc 2>/dev/null; then echo >&2 "Protobuf is required but not found (did you set TOOLS_PATH?). Aborting." exit 1 fi if ! [[ -v CLIF_PREFIX ]]; then echo >&2 "CLIF_PREFIX not set. Defaulting to '$HOME/opt'." export CLIF_PREFIX=$HOME/opt fi PYCLIF="$CLIF_PREFIX/clif/bin/pyclif" PYCLIF_PROTO="$CLIF_PREFIX/clif/bin/pyclif_proto" CLIF_INC="-I$CLIF_PREFIX" if ! [[ -x $PYCLIF ]]; then echo >&2 "CLIF is required but not found." exit 1 fi # Get the path of the native python C++ header files. PYTHON_INC="-I$(printf "from distutils.sysconfig import get_python_inc\nprint(get_python_inc())\n" | python)" SRC_DIR="$(pwd)" GEN_DIR="$(pwd)/test_genfiles" PROTO_GEN_DIR="$GEN_DIR/protos/public" COMMON_GEN_DIR="$GEN_DIR/common/python" SDK_PYTHON_GEN_DIR="$GEN_DIR/provisioning_sdk/public/python" export PYEXT_BUILD_DIR="$(pwd)/python_ext_build" PYEXT_INSTALL_DIR="$(pwd)/python_env" rm -rf "$GEN_DIR" rm -rf "$PYEXT_BUILD_DIR" rm -rf "$PYEXT_INSTALL_DIR" mkdir -p "$PROTO_GEN_DIR" mkdir -p "$COMMON_GEN_DIR" mkdir -p "$SDK_PYTHON_GEN_DIR" mkdir -p "$PYEXT_BUILD_DIR" # Generate C++ outputs. # The protos are needed to compile the public header provisioning_engine.h. protoc -I="$SRC_DIR" --cpp_out="$GEN_DIR" "$SRC_DIR/protos/public/client_identification.proto" protoc -I="$SRC_DIR" --cpp_out="$GEN_DIR" "$SRC_DIR/protos/public/remote_attestation.proto" protoc -I="$SRC_DIR" --cpp_out="$GEN_DIR" "$SRC_DIR/protos/public/certificate_provisioning.proto" # Generate py outputs. protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/client_identification.proto" protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/hash_algorithm.proto" protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/remote_attestation.proto" protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/provisioned_device_info.proto" protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/certificate_provisioning.proto" protoc -I="$SRC_DIR" --python_out="$GEN_DIR" "$SRC_DIR/protos/public/signed_drm_certificate.proto" # Generate CLIF Python wrappers. "$PYCLIF" --modname certificate_type --ccdeps_out="$COMMON_GEN_DIR/certificate_type.cc" --ccinit_out="$COMMON_GEN_DIR/initcertificate_type.cc" --header_out="$COMMON_GEN_DIR/certificate_type.h" --cc_flags="-std=c++11 -I$SRC_DIR $PYTHON_INC $CLIF_INC" "$SRC_DIR/common/python/certificate_type.clif" "$PYCLIF" --modname provisioning_status --ccdeps_out="$SDK_PYTHON_GEN_DIR/provisioning_status.cc" --ccinit_out="$SDK_PYTHON_GEN_DIR/initprovisioning_status.cc" --header_out="$SDK_PYTHON_GEN_DIR/provisioning_status.h" --cc_flags="-std=c++11 -I$SRC_DIR $PYTHON_INC $CLIF_INC" "$SRC_DIR/provisioning_sdk/public/python/provisioning_status.clif" "$PYCLIF" --modname provisioning_session --ccdeps_out="$SDK_PYTHON_GEN_DIR/provisioning_session.cc" --ccinit_out="$SDK_PYTHON_GEN_DIR/initprovisioning_session.cc" --header_out="$SDK_PYTHON_GEN_DIR/provisioning_session.h" --cc_flags="-std=c++11 -I$SRC_DIR -I$GEN_DIR $PYTHON_INC $CLIF_INC" --include_paths="$GEN_DIR" "$SRC_DIR/provisioning_sdk/public/python/provisioning_session.clif" "$PYCLIF" --modname provisioning_engine --ccdeps_out="$SDK_PYTHON_GEN_DIR/provisioning_engine.cc" --ccinit_out="$SDK_PYTHON_GEN_DIR/initprovisioning_engine.cc" --header_out="$SDK_PYTHON_GEN_DIR/provisioning_engine.h" --cc_flags="-std=c++11 -I$SRC_DIR -I$GEN_DIR $PYTHON_INC $CLIF_INC" --include_paths="$GEN_DIR" "$SRC_DIR/provisioning_sdk/public/python/provisioning_engine.clif" # Create virtual Python environment, build extensions, and install onto virtual # environment. cp -a provisioning_sdk/public/python/* test_genfiles/ cd test_genfiles rm -rf "$PYEXT_INSTALL_DIR" virtualenv "$PYEXT_INSTALL_DIR" "$PYEXT_INSTALL_DIR/bin/python" "$PYEXT_INSTALL_DIR/bin/pip" install enum34 "$PYEXT_INSTALL_DIR/bin/python" "$PYEXT_INSTALL_DIR/bin/pip" install protobuf "$PYEXT_INSTALL_DIR/bin/python" "$PYEXT_INSTALL_DIR/bin/pip" install cryptography "$PYEXT_INSTALL_DIR/bin/python" certificate_type_setup.py build --build-base="$PYEXT_BUILD_DIR" install "$PYEXT_INSTALL_DIR/bin/python" provisioning_status_setup.py build --build-base="$PYEXT_BUILD_DIR" install "$PYEXT_INSTALL_DIR/bin/python" provisioning_session_setup.py build --build-base="$PYEXT_BUILD_DIR" install "$PYEXT_INSTALL_DIR/bin/python" provisioning_engine_setup.py build --build-base="$PYEXT_BUILD_DIR" install shopt -s globstar for d in "protos"/**/; do touch -- "$d/__init__.py"; done "$PYEXT_INSTALL_DIR/bin/python" init_engine_test.py "$PYEXT_INSTALL_DIR/bin/python" set_certificate_status_list_test.py "$PYEXT_INSTALL_DIR/bin/python" drm_intermediate_certificate_test.py "$PYEXT_INSTALL_DIR/bin/python" engine_generate_certificate_test.py "$PYEXT_INSTALL_DIR/bin/python" new_session_test.py