Files
ce_cdm/CHANGELOG.md
Googler 6d36a0c93d Source release 19.6.0
GitOrigin-RevId: 13a33e34413c19da1bfe76abcc66be519c9ac9d1
2025-06-09 23:44:53 -07:00

1725 lines
88 KiB
Markdown

# Widevine CE CDM Changelog
[TOC]
## 19.6.0 (2025-06-06)
### Features
- Added "form factor" and "platform" to client ID.
### Bug Fixes
- Gracefully handle OEMCrypto_GenerateNonce() implementations that set the
nonce reference argument to zero on failure.
- Cleaned up `CertificateProvisioning` state. This prevents mismatched public
and private cert keys when an app makes multiple provisioning 4.0 requests.
- Implemented various small fixes suggested by clang-format and clang-tidy.
### Tests
- Updated `OEMCryptoClientTest.CheckBuildInformation_OutputLengthAPI17` to
accept a returned SHORT_BUFFER size that is larger than the actual required
size.
- Updated `OEMCryptoClientTest.CheckJsonBuildInformationAPI18` to treat the
JSON fields in the `ree` block as optional.
### Dependency Updates
- Updated libcppbor to 61d9bff9605ad2ffd877bd99a3bde414e21f01a2. Modifed some
Android-specific include names in order to compile correctly without
Android.
## 19.5.0 (2025-04-02)
This is a minor release with bug fixes, test improvements, and dependency
updates.
### Features
- Updated `HasRootOfTrustBeenRenewed()` to detect Drm Reprovisioning
- Updated CE BCC extraction tool:
- Added a Makefile to `wv_factory_extractor` tool
- Added an option to run BCC validator with the tool
- Refactored `ProvisioningHolder` to separate generate, fetch, and load
operations
### Bug Fixes
- Ignored certain errors during `RemoveOfflineLicense()` for apps which have
been unprovisioned
- Allowed `key_session` to be equal to `oec_session` when removing entitled
key sessions
### Tests
- Added test `PrintClientAndServerVersionNumber` that prints the core message
info for both provisioning and license request/response
- Updated provisioning server version test to accommodate v16 responses
- Relaxed BCC validation test requirements, downgrading non-critical errors
to warnings and improving output clarity
- Added integration test to verify that renewal is not needed before renewal
delay seconds
- Added check to verify that renewals include client ID when "always includes
client ID" is true
- Updated `CdmUseCase_LicenseWithRenewal` test to verify that request has
correct info for persistent license
- Added a test to verify PST with length 127 succeeds
- Added new duration tests:
- A test for loading licenses unrelated to the content being played back
- Tests for the `30sSoftRental_UnlimitedPlayback` scenario
- Tests with past and future license start time policies
- Tests for short playback timers with unlimited rental duration
### Dependency Updates
- Updated BoringSSL to latest (e4b6d4f7)
- Updated googletest to latest (4902ea2)
## 19.4.0 (2024-11-27)
This is a minor release with bug fixes and test improvements.
### Features
- Add support for new OEMCrypto_GetBCCSignatureType() API. This API is optional
and only used on devices that support Provisioning 4 with a Phase 3 DICE
chain.
- Add credential types to client identification protobuf
- Return BCC signature type into client identification protobuf
- BCC extraction tool updates and refactoring
- Rewrite BCC, DeviceInfo and CSR Payload validators to cover info parsing,
validating and updating unit tests
- Update error codes returned by cbor/provisioning 4.0 validators to be less
severe when possible
- Add a few required fields for test-generated BCC
- Include licensing files with this release and future CE CDM releases
### Tests
- Update license release tests to accomodate differences in behavior for CE
CDM and Android
- Update some CAST tests to enforce format of the message signed by
OEMCrypto_GenerateRSASignature()
- Add tool to extract BCC and build info for BCC uploading test
- Skip usage table tests on devices that don't support usage tables
- Fix key type used in InstallOemPrivateKeyCanBeUsed test
- Re-enable OEMCrypto security tests
- Allow multiple callbacks in TestSleep class to prevent multiple classes
trying to register a callback
- Improve error logging for tests
- Add log statement on failure when device with a TEST_ONLY system ID cannot
play production content
### Bug Fixes
- Fix HLS parsing of bad content IDs
- Revert change to limit output buffer size during decrypt fallback due to
failures seen in 19.3 because the output buffer was not big enough
- Update blank OEMCrypto devsite test pages
- Small fixes to reduce compiler warnings
## 19.3.0 (2024-09-04)
This is a minor release with bug fixes and test improvements, as well as
internal code-quality cleanups that do not affect the CDM's behavior. However,
because of improvements to the BCC Factory Upload Tool, we recommend that all
partners who use this tool upgrade to version 19.3.0.
### Features
- Added workaround for OEMCrypto implementations with slightly corrupted build
information
- The BCC Factory Upload Tool supports new command-line options for dry runs,
batch checks, version-checking, and verbose output.
### Tests
- Added new tests to better validate the behavior of
`OEMCrypto_BuildInformation()`
- Verifies output length is set correctly
- Verifies content is ASCII JSON without trailing null bytes
- Verifies documented JSON fields: required fields are present, and optional
and required fields are the correct JSON types
### Bug Fixes
- Fixed decrypt failures on devices with low TEE memory caused by sending an
output buffer to decrypt that was much larger than necessary
- Several BCC Factory Upload Tool fixes:
- Added the missing `FileSystem::Exists()` function
- Fixed a bug causing the output to be unnecessarily padded
- Fixed an issue where fields containing JSON were not properly escaped
## 19.2.0 (2024-06-24)
This is a minor release with bug fixes and test improvements.
### Features
- Supports up to OEMCrypto v19
- Added new test data for entitled licenses
- Added new tests for clear lead sample decryption
### Bug Fixes
- Fixed backwards compatibility issues found in License Protocol v2.2
- Improved error logging for tests
- Small fixes to reduce compiler warning
- Fixed URL error found for tests using different license server SDK
- Skip CAS tests on non-CAS devices
## 19.1.0 (2024-03-28)
Note: Release v19.0 was skipped so that this release's version number matches
the OEMCrypto version.
CE CDM v19.1.0 includes all changes from CE CDM v18.5.0.
### Features
- Supports up to OEMCrypto v19.1, including new OEMCrypto tests introduced
since OEMCrypto v18.
- Added support for License Protocol v2.2, which uses SHA256-signed license
requests.
- Raised the minimum required version of C++ to C++17.
- Added a new error code, `kDeviceRevoked`, which requires special handling.
- `kDeviceRevoked` may be returned from any method that processes a service
response. It indicates that the device's root of trust has been revoked
and is no longer trusted.
- All service interactions will fail after this, even after a device reboot
or factory reset. Apps may want to handle this error by using a different
DRM system, if supported.
- Devices that support renewal can escape this condition by renewing their
root of trust. Root of trust renewal is outside the scope of CE CDM.
You'll need to work directly with your Widevine contact.
- Improved code performance slightly by reducing copy operations.
- Added additional tests to check for problems when moving usage entries.
### Bug Fixes
- Fixed a potential out-of-bounds read in the logging code for certain
invalid severity level values.
- Fixed many minor issues identified via static analysis.
## 18.5.0 (2024-03-28)
Note: Releases v18.2-18.4 were skipped so that this release's version number
matches the OEMCrypto version.
CE CDM v18.5.0 includes all changes from CE CDM v17.3.0 and v18.1.0.
**It is strongly recommended** for partners to update from v18.1 to v18.5 to
address two major bugs in the CE CDM code which could result in lost offline
licenses or app crashes. See _Bug Fixes_ for 18.5.0 and 17.3.0 for details.
### Features
- Supports up to OEMCrypto v18.5, including new OEMCrypto tests introduced
since OEMCrypto v18.1.
- Added support for Cast provisioning 4.0
- Cast uses a slightly different provisioning 4.0 protocol compared
to non-Cast cases. The additions to the protocol are internal
to the library, and do not require API changes for CE CDM users
- Additional tests are included, these tests will automatically
skip for device which do not use provisioning 4.0.
- Improved performance for unencrypted data provided via `Cdm::decrypt()`.
- Some apps are known to always use decrypt calls, even if parts of the
data are completely unencrypted. The CDM will now check if samples/
sub-samples of decryption batch data can skip the decryption stage
and instead directly copied to the secure output.
- Various minor performance improvements
- Reduced internal data copying.
- Test runtime improvements:
- Skipped set up for unsupported features.
- Improved test data storage management.
- Removed unused internal testing fixtures.
- Compile time improvements by better dependency checks for third-party
libraries.
- CE CDM now compiles clean with `-Wunused-parameter`.
- Added support for new provisioning flow for baked-in certificates
on devices using Widevine's embedded device certificate.
- Affected partners should check the L3 OEMCrypto documentation for
details.
- Added new tests for CE CDM and OEMCrypto v18.5 features.
### Bug Fixes
- Fixed major issue with loss of offline licenses when stored license count
exceeds OEMCrypto's usage table size limit.
- Issue only affects users with 300 or more downloaded offline licenses
across all apps.
- Fixed minor issue with tests which were generating many warnings from
expected behavior.
- These warning did not cause the tests to fail, but created a lot of noise
when trying to diagnose other failures
## 17.3.0 (2024-03-28)
Note: Release v17.2 was skipped so that this release's version number matches
the OEMCrypto version.
CE CDM v17.3.0 includes all changes from CE CDM v17.1.2.
**It is strongly recommended** for partners to update from v17.1 to v17.3 to
address a major bug in the CE CDM code which could result in app crashes. See
_Bug Fixes_ for details.
### Features
- Supports OEMCrypto v17.3.0, including new OEMCrypto tests introduced in
v17.3.0.
- Added additional logging when license request fails, to help diagnose what
went wrong.
- Improved support for HDCP v1.0-1.4 version.
- `Cdm::getStatusForHdcpVersion()` can now accept a specific HDCP 1.x minor
version (specifically 1.0, 1.1, 1.2, 1.3, or 1.4) when checking if
content can be decrypted.
- The legacy behavior is still available via `Cdm::HdcpVersion::kHdcp1_x`.
- See _Bug Fixes_ note about related bug in previous versions.
### Bug Fixes
- Fixed major issue with memory corruption when apps misuse the API by making
certain key operations before license is loaded.
- Specifically, if an app generates a license request via
`Cdm::generateRequest()`, then calls `Cdm::remove()` before
`Cdm::update()` with the license response it can cause the CDM to crash.
- Fixed mistaken test failures when the CE CDM and OEMCrypto versions were not
identical.
- Fixed an issue where the OEMCrypto tests were enforcing v18 device ID
requirements on v17 integrations by mistake.
- Fixed an issue with DRM certificate serial number stability for
provisioning 4.0 devices.
- This only affected very specific devices when going through their
specific factory reset process.
- Added additional tests to catch future, similar errors.
- Fixed an issue with `Cdm::getKeyStatuses()` reporting error for certain
licenses which use specific HDCP v1.x minor versions.
- Fixed an issue with URL parsing in test code for renewal requests
- Certain tests used special URL parameters which were not properly
accounted for in the CE CDM's test utility code; this caused tests
to fail on otherwise working devices.
- Fixed the CAS tests sometimes not being skipped on non-CAS-supporting
devices.
- Removed tests that explicitly tested against Widevine's staging
provisioning servers.
## 18.1.0 (2023-06-23)
### Features:
- Supports and requires OEMCrypto v18.1.
- Removed support for persistent usage records. (a.k.a. Secure Stops) W3C has
removed this session type from the EME specification, and Chrome has
deprecated their equivalent session type. The following API methods have
been removed:
- `Cdm::listUsageRecords()`
- `Cdm::deleteUsageRecord()`
- `Cdm::deleteAllUsageRecords()`
- There's a new host interface that integrators must implement, `ILogger`.
This interface has only one method, `log()`. It's called anytime the CE CDM
wants to log a message. This replaces the CE CDM's previous behavior of
logging all messages to `stderr`.
- For users that just want to log messages to `stderr` as in previous CE
CDM versions, a reference implementation is provided in `stderr_logger.h`
that logs all messages to `stderr`.
- The `privacy_mode` parameter may now be omitted when calling
`Cdm::create()`. It defaults to `false`.
- A new event, `onExpirationChange()`, has been added to `IEventListener`.
It'll be called anytime the expiration time of a session changes.
- A new parameter, `server_url`, has been added to
`IEventListener::onMessage()`. Use of this parameter is optional, and it has
no equivalent in EME. For renewal and release messages, it'll contain a
reminder of which license service to send the message to. This can be
useful if the app doesn't want to hardcode this information or get it
out-of-band.
- Added additional logging when provisioning fails, to help diagnose what went
wrong.
- Improved specificity of the logs when a CE CDM API method returns an error.
- Added support for licenses whose renewal timers start when the license is
loaded instead of on first decryption.
- Tests that are skipped because they don't apply to the device being tested
are now marked as SKIPPED instead of PASSED.
### Bugfixes:
- Fixed errors that could occur if the OEMCrypto integration reported a minor
version number for HDCP 1.x.
- Fixed an issue where the CDM might violate the threading guarantees for
`OEMCrypto_LoadOEMPrivateKey()`.
- Fixed rare errors that could occur if two threads tried to perform usage
actions simultaneously.
- Fixed errors that would occur if an entitled key was loaded into the session
with ID zero. This could happen if OEMCrypto reuses the session IDs of
closed sessions.
### Dependency Updates:
- The bundled version of Protobuf has been updated to [v21.12][proto-v21.12].
(a.k.a. 3.21.12)
- The bundled version of BoringSSL has been updated to commit
[`e1b8685770d0e82e5a4a3c5d24ad1602e05f2e83`][boringssl-e1b868].
[proto-v21.12]: https://github.com/protocolbuffers/protobuf/releases/tag/v21.12
[boringssl-e1b868]: https://boringssl.googlesource.com/boringssl/+/e1b8685770d0e82e5a4a3c5d24ad1602e05f2e83
## 17.1.2 (2023-06-23)
### Features:
- Added APIs to support Google Cast functionality on devices whose OEMCrypto
implementations support being a Cast Receiver.
- Note that if you plan to support Cast Receiver functionality, you must run
the unit tests with the `--cast` flag in order to add the Cast Receiver
unit tests to the test run.
- Added `Cdm::initDataContainsEmbeddedKeys()`, which allows clients to ask the
CE CDM whether a given initialization data blob contains embedded keys,
which may affect how it should be passed to the CDM.
- The CE CDM will now returning a meaningful error instead of
`kUnexpectedError` in more cases.
- Improved logging of failed server responses during tests.
### Bugfixes:
- Fixed an issue where `Cdm::getKeyAllowedUsages()` would return the wrong
value for entitled keys.
- Fixed a rare crash that could occur when opening and closing sessions in
parallel from different threads.
- Fixed rare issues that could occur when provisioning multiple sessions in
parallel from different threads.
- Fixed an issue that could occur on some OEMCrypto implementations because
the code to restore a persistent license failed to generate a nonce before
signing a fake license request.
- Reduced the amount of "L1 Terminate" spammed to the log.
- Fixed crashes that could occur due to `OEMCrypto_GetBootCertificateChain()`
returning an empty additional signature.
- Fixed issues that could occur if multiple persistent licenses shared the
same PST.
- Improved the reliability of the parallel decrypt tests on slow OEMCrypto
implementations.
- Improved the reliability of the duration tests on slow internet connections.
## 17.1.1 (2022-11-28)
### Features:
- For platforms that _cannot_ support compile-time client info, an interface
has been added that enables runtime client info support on CE CDM 17.
Widevine still recommends using compile-time client info if possible.
- To enable runtime client info, you must change your platform's
`client_info_source` property to `runtime` and then set the
`read_client_info_path` variable to point to a GYP target that implements
`read_client_info.h`. You are responsible for providing an implementation
of `read_client_info.h` that reads your platform's runtime client info.
- An example of how to use runtime client info is provided in
`platforms/example-runtime-client-info/`.
- Since the OEMCrypto Ref is no longer distributed by Widevine, the lines
offering it in `platform_properties.gypi` have been removed. It is no longer
the default OEMCrypto target.
- The example platform has been updated with its own stubbed-out
implementation of OEMCrypto. This will allow the example platform to build
without the OEMCrypto Ref but will not allow it to pass unit tests.
- The Provisioning 4.0 factory upload tool is now released alongside the CE
CDM.
### Bugfixes:
- The files `oem_cert.h` and `oem_cert.cpp` were omitted from 17.1.0 by
mistake and are now included.
- The ODK is now distributed with the CE CDM again in order to facilitate the
OEMCrypto unit tests.
- Fixed an issue where `CdmIndividualizationTest.RemoveProvisioning` would
fail for Provisioning 4.0 devices.
## 17.1.0 (2022-06-29)
**Note:** CE CDM 17.1.0 is the first release of the CE CDM 17 series. It is
numbered 17.1 to reflect that it supports and requires OEMCrypto v17.1.
### Features:
- Supports and requires OEMCrypto v17.1.
- Supports Provisioning 4.0, a new provisioning scheme that does not require
installing keyboxes in the factory. Talk to your Widevine Partner
Engineering contact if you would like to start using Provisioning 4.0.
- Includes a large number of additional tests that exercise edge-cases in the
CDM and OEMCrypto. The total run-time of the unit test suite is now very
long. As such, partners are recommended to run only a subset of the full
suite during development. Information on what subset to run and how to do
this can be found in the CE CDM Integration Guide.
- Note that running the full test suite is still required before you can
release your device.
- Documentation is no longer distributed with the CDM as a PDF and can now be
found on the [Widevine Developer Site][wv-devsite].
- The CE CDM no longer includes a copy of OEMCrypto with the CDM. If you are
an OEMCrypto implementer, you should have access to the
[OEMCrypto partner repository][oec-partner-repo], which contains additional
source code and information about implementing OEMCrypto, including the
Widevine-written OEMCrypto implementation, the OEMCrypto Porting Kit. (OPK)
If you are not an OEMCrypto implementer, then you will need to get an
OEMCrypto implementation from your SoC manufacturer before you can use the
CE CDM.
- Added a method to retrieve the system ID of the underlying OEMCrypto
implementation.
- Client information is no longer passed into `Cdm::initialize()` at runtime.
Instead, client information is set at compile-time and baked into the CDM
binary. New variables have been added to `platform_properties.gypi` to
support this.
- A method has been added to retrieve the client information from the CDM.
- A new example platform directory has been released, `example/`, which will
provide a cleaner base to build your own platform files from than the
previous `x86-64/` directory.
[wv-devsite]: https://developers.google.com/widevine/drm/client/ce-cdm
[oec-partner-repo]: https://widevine-partner.googlesource.com/oemcrypto/
### Dependency Updates:
- The bundled version of Protobuf has been updated to [v3.19.1][proto-3.19.1].
Note that, as before, Widevine CE CDM will work with any version of Protobuf
back to 2.6. However, we provide the version of Protobuf that we test with
internally as a default.
- The bundled version of BoringSSL has been updated to commit
[`731d6cbef936e60a04738edf4eb4fc93e187706a`][boringssl-731d6c].
- The bundled version of googletest & googlemock have been updated to commit
[`e2f3978937c0244508135f126e2617a7734a68be`][googletest-e2f397].
[proto-3.19.1]: https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.1
[boringssl-731d6c]: https://boringssl.googlesource.com/boringssl/+/731d6cbef936e60a04738edf4eb4fc93e187706a
[googletest-e2f397]: https://github.com/google/googletest/commit/e2f3978937c0244508135f126e2617a7734a68be
### Bugfixes:
**Note:** As CE CDM v17.1 contains almost two years of bugfixes since the
previous release, this list contains only highlights and is not comprehensive.
- Fixed an issue where the host interfaces could not be stored in smart
pointers due to the visibility of their destructors.
- Fixed an issue where the CDM could try to access the usage table header via
the wrong `IStorage` instance.
- Widevine now does development with a stricter set of flags and sanitizers,
which have enabled us to find and fix several issues in the code and should
allow it to build on a wider range of toolchains without customizing
compilation flags.
- Changed several log messages to format values in a more cross-platform way.
- Several crashes due to null pointers and thread-safety issues have been
fixed.
- Fixed an issue where the unit tests could crash depending on the order the
object files were linked into it.
## 16.4.0 (2020-10-09)
Features:
- The included version of the ODK has been updated to v16.4. CE CDM 16.4.0 is
required to take advantage of the changes in ODK v16.4.
- New OEMCrypto tests have been added to test whether OEMCrypto correctly
handles huge buffer size edge cases.
- The warning and error flags used by the example `x86-64` platform have been
significantly revamped with the goal of greater strictness and better GCC
compatibility. As always, these flags are strict to help Widevine detect and
debug problems and may not be the best for your platform, particularly on
debug builds. You should always use the flags that are best for your
platform.
- As part of this, the sample `x86-64` platform now enables [ASan][asan] and
[UBSan][ubsan] on debug builds. These have a significant memory and
performance impact. Feel free to not enable ASan and UBSan if your
platform does not support them or if their memory and performance impact
are unacceptable to you. The sample `x86-64` platform does not enable ASan
or UBSan for release builds.
- To maximize the benefit of UBSan, the sample `x86-64` platform now turns
on RTTI for debug builds. The Widevine CE CDM does not use RTTI and will
still build correctly without it. Feel free to turn it off if your
platform does not support RTTI. The sample `x86-64` platform turns off
RTTI for release builds.
- Several changes have been made to how `build.py` handles build
configurations. (e.g. "debug" builds vs. "release" builds)
- Previous CE CDM releases assumed that the platform's `settings.gypi` file
would define, at a minimum, build configurations called `Debug` and
`Release`. This requirement was undocumented, but failing to define them —
even if your platform did not need them — would result in build failures.
`build.py` has been reworked to not make any assumptions about what build
configurations the platform defines. You are now free to define any build
configuration names you like.
- The example debug build configuration is now named `debug`. (all
lowercase)
- The example release build configuration is now named `release`. (all
lowercase)
- The `build.py` script now requires that callers explicitly indicate which
build flavor they would like to build. There are three ways to do this:
- The `--config` flag allows you to specify any build configuration that
you have defined in your platform's `settings.gypi` file.
- `--debug` is a shorthand for `--config debug`.
- `--release` is a shorthand for `--config release`.
- License renewals are now tested against both the original licensing service
and the service specified in the license.
[asan]: https://github.com/google/sanitizers/wiki/AddressSanitizer
[ubsan]: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
Dependency Updates:
- The bundled version of Protobuf has been updated to [v3.12.4][proto-3.12.4].
Note that, as before, Widevine CE CDM will work with any version of Protobuf
back to 2.6. However, we provide the version of Protobuf that we test with
internally as a default.
- This copy of Protobuf has been patched with Protobuf
[pull request #7428][proto-pr-7428], which is necessary to let Protobuf
3.12.4 build when RTTI is disabled.
[proto-3.12.4]: https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.4
[proto-pr-7428]: https://github.com/protocolbuffers/protobuf/pull/7428
Bugfixes:
- Fixed issues preventing several offline license use cases from working on
devices that do not support usage tables.
- If your device does not support usage tables, you *must* use CE CDM 16.4
and ODK v16.4 to properly support offline licenses and license expiry.
Older 16.x releases will not work.
- We consider usage tables a standard feature, and not supporting them is an
exception. Usage tables are used to save playback times for offline
licenses and are needed to support several use cases that restrict
playback duration. They are also used to support secure stops, which are
used by several major content providers. If your device does not support
usage tables but expects to support offline license, please talk to your
Widevine TAM so that we may understand what is blocking this support.
OEMCrypto is planning to make usage table support mandatory in a
future release.
- Fixed issues that could occur if the device reports it has unlimited usage
table capacity.
- Fixed an issue where nonce-free licenses with nonzero durations would not
expire/renew correctly.
- Fixed an issue where offline licenses with offline renewals would either
fail to load or load correctly but send multiple state change messages to
the app.
- The enums exported by the CE CDM API in `cdm/include/cdm.h` now have defined
backing types. This helps avoid some benign undefined behavior.
- Fixed a crash that could occur when using OpenSSL with the CE CDM.
- Fixed some missing header errors when compiling the CE CDM with OpenSSL
instead of BoringSSL.
- Fixed several issues in the OEMCrypto unit tests that were erroneously
requiring OEMCrypto to hold onto the session key longer than required by the
OEMCrypto specification.
- An issue where tests would sometimes derive keys from the session key
twice.
- An issue where tests were deriving keys from the session key too early.
- Fixed an issue where the OEMCrypto unit tests were asking OEMCrypto to read
past the end of a buffer.
- Fixed an issue where the CDM would not allow a license to be loaded and
restored in the same session.
- The OEMCrypto Reference Implementation now has more stringent
bounds-checking in some places.
- Fixed an issue where the `TimeRollbackPrevention` tests would fail on some
devices.
- Fixed an issue where the metrics unit tests could fail if the device uses
Provisioning 3.0.
- Fixed an issue where the OEMCrypto unit tests would not respond correctly if
if the RSA key failed to load.
- Fixed many places where the wrong format string was being used to format
log messages. Format strings are now checked at compile-time on the sample
`x86-64` platform.
- The `build.py` script will no longer write `.pyc` files to the filesystem.
- Fixed an error that would occur on devices that return
`OEMCrypto_ERROR_NOT_IMPLEMENTED` from `OEMCrypto_SupportsDecryptHash()`.
- Fixed an issue where expiry of the renewal delay was not accurately
detected when using some OEMCrypto v16 implementations.
- Fixed an issue where debug symbols were sometimes turned on for third-party
code even when they were turned off otherwise.
- Fixed several issues in the OEMCrypto Reference Implementation where it
would crash or behave incorrectly when given huge enough buffers.
- Fixed an error when trying to do key rotation with a `kTemporary` session
with licenses from an upcoming license server release.
- Fixed a rare bug where certain usage table entries could not be reloaded if
other entries were created and loaded in a certain order.
- The CDM will now correctly treat devices with only local displays as having
no SRM version.
- Fixed some typos in `OEMCryptoCENC.h` and the OEMCrypto tests.
- The help text for the flags in `build.py` has been improved and clarified.
- The header comments in `OEMCryptoCENC.h` have had some minor revision.
## 16.3.0 (2020-07-24)
Features:
- CE CDM 16.3.0 updates the included version of OEMCrypto and its tests to
v16.3. CE CDM 16.3.0 *requires* OEMCrypto v16.3 or later. Widevine will not
be supporting OEMCrypto v16.2 any longer. Upgrading to CE CDM 16.3.0 and
OEMCrypto v16.3 is required for all partners using the 16.x release series.
- OEMCrypto v16.3 includes several updates to the ODK code. Don't forget to
update your OEMCrypto integrations.
- The algorithms that drive the usage tables in the CE CDM are more robust,
particularly in cases involving deleting entries and/or the table becoming
fragmented.
Bugfixes:
- Fixed a `validate_nonce` error when using `load_refresh_keys` with certain
license services.
- Fixed an issue where clear subsamples that don't make up a full sample might
be accepted when the later encrypted subsamples would be rejected.
- Fixed an issue preventing `device_files.cpp` from compiling with certain C++
STL implementations.
- Fixed an issue where nonce-free offline licenses (such as those used by
ATSC 3.0) would fail to load in the v16 ODK.
- Fixed issues where compiling with recent GCC releases and with stringent
warning checks enabled would trigger warnings that were treated as errors,
failing compilation.
- Fixed an issue where the OEMCrypto tests were deriving keys too eagerly,
causing OEMCrypto implementations with very strict state-progression checks
to fail.
- Fixed an issue that was causing the following tests to fail when used with
recent license service builds:
- `CdmTest.RemoveUsageRecord`
- `CdmTest.RemoveThreeUsageRecords`
- `CdmTest.RemoveIncomplete`
- `CdmTest.RemoveUsageRecordIncomplete`
- `CdmRemoveTest/CdmTestWithRemoveParam.Remove/false, where GetParam() = false`
- `CdmRemoveTest/CdmTestWithRemoveParam.Remove/true, where GetParam() = true`
- Fixed an issue with accessing the usage table when OEMCrypto had reached the
maximum number of open sessions.
- Fixed an error that could occur if an offline license's file persisted after
its usage entry had been removed.
- Fixed a buffer overrun in the test code.
- Fixed a memory leak in the test code.
- Fixed a buffer overrun in the OEMCrypto Reference implementation. We will again
remind you that the OEMCrypto Reference implementation is *not* intended for production use.
- The test `DecryptNoAnalogToClearAPI13` was no longer valid and has been
removed.
- Fixed an issue where offline licenses with a rental duration and no PST
would instantly expire because they were treated as having been rented
in 1970.
- Fixed a rare issue that could occur with Device IDs between 33 and 64 bytes
long, inclusive.
- The CE CDM now correctly handles the case when OEMCrypto reports an
unlimited usage table capacity.
## 16.2.0 (2020-04-10)
**Note:** CE CDM 16.2.0 is the first release of the CE CDM 16 series. It is
numbered 16.2 to reflect that it supports and requires OEMCrypto v16.2.
Features:
- CE CDM 16.2.0 supports and requires OEMCrypto v16.2. The OEMCrypto header
files, documentation, Reference OEMCrypto implementation, and tests have
been updated to v16.2. For a full list of new features in OEMCrypto v16,
please see the
[Widevine Modular DRM Version 16 Delta document][oec-16-delta].
- The way that license durations and renewal times are handled has changed
significantly in OEMCrypto v16. Partners should be sure they are familiar
with the new behavior, which is described in the
[License Duration and Renewal][license-duration-doc] document.
- OEMCrypto v16 *does not* support updating a device directly from OEMCrypto
v13 or earlier to v16, due to OEMCrypto v16 dropping
backwards-compatibility support for the old Usage Table format.
- OEMCrypto v16 is much more lenient about the rate at which nonces can be
generated, which can now be as high as 200 nonces per second. But is much
stricter about the total number of nonces in flight per session, which is
now limited to just 1.
- Starting with CE CDM 16.2, the Widevine CE CDM no longer supports the 'cens'
and 'cbc1' schemas of ISO-CENC. Only 'cenc' and 'cbcs' are supported.
- Attempting to decrypt in AES-CTR mode with a nonzero pattern will now
return an error instead of invoking the 'cens' schema.
- Attempting to decrypt in AES-CBC mode with a `(0,0)` pattern will now
perform "full-sample" 'cbcs' decryption (the same as using a `(10,0)`
pattern) instead of invoking the 'cbc1' schema.
- The `Cdm::decrypt()` methods have been significantly reworked. These methods
previously took individual subsamples, one per call to the decrypt method.
Instead, it is now possible to pass one or more full samples to
`Cdm::decrypt()`. These full samples will be passed to OEMCrypto using the
new v16.2 version of `OEMCrypto_DecryptCENC()`, which also accepts multiple
full samples.
- It is no longer possible to pass partial samples to `Cdm::decrypt()`.
Callers *must* pass full samples in for decryption.
- For best performance, Widevine recommends that integrators not pass more
samples into `Cdm::decrypt()` than their OEMCrypto integration can handle.
- For instance, if you need to decrypt 4 samples and your OEMCrypto
integration only accepts a maximum of 3 samples per
`OEMCrypto_DecryptCENC()` call, it is more efficient to call
`Cdm::decrypt()` with 3 samples and then again with 1 sample than to
call `Cdm::decrypt()` with 4 samples.
- The Widevine CE CDM does not know how much data OEMCrypto can accept and
will attempt to pass as much data to OEMCrypto as you give it. If you
*do* pass more data to `Cdm::decrypt()` than your OEMCrypto integration
can handle, the Widevine CE CDM will progressively break the data up
into smaller and smaller pieces until OEMCrypto is able to accept it, a
process that has some performance cost.
- The Widevine CE CDM once again supports OpenSSL. The default is still to
build with the included copy of BoringSSL. But integration partners that
prefer to use OpenSSL and have their own OpenSSL builds can link with
OpenSSL instead by overriding the platform build variable
`privacy_crypto_impl` and setting it to the value `openssl`.
- All the platform build properties have been consolidated into one GYPI file,
`platform_properties.gypi`. These are all the variables that integration
partners may need to override to adapt the CE CDM to their platform.
Variables defined in the build system outside `platform_properties.gypi`
may not work correctly when overridden and should not be overridden in
partners' `settings.gypi` files.
- The Widevine CE CDM is now smarter about which usage data entries to evict
when the table fills up, using a Least-Recently-Used list and metadata about
which licenses have expired to choose which entries to evict.
- When subsamples were rejected by OEMCrypto with
`OEMCrypto_ERROR_BUFFER_TOO_LARGE` because they were too large, previous
Widevine CE CDM releases would break the subsamples up into 100KiB chunks.
Widevine CE CDM 16.2 will now break them up into larger chunks, up to the
"Minimum subsample buffer size" for the device's reported Resource Rating
Tier.
- The method `Cdm::update()` can now return `kNeedsDeviceCertificate` if the
licensing server requires that the device reprovision before it will send
licenses to the device.
- The method `Cdm::removeUsageTable()` has been removed, as it would no longer
do anything on OEMCrypto v16. Most users of this method should have already
migrated to `Cdm::deleteUsageRecord()` or `Cdm::deleteAllUsageRecords()`.
- The Widevine CE CDM now exposes metrics about its performance through the
method `Cdm::getMetrics()`. These metrics are not intended for integration
partner consumption but can be reported back to Google.
- `build.py` now works correctly in Python 2 or Python 3 and provides more
useful error messages.
- Additional tests have been added to catch more error conditions.
[oec-16-delta]: ./oemcrypto/docs/Widevine_Modular_DRM_Version_16_Delta.pdf
[license-duration-doc]: ./oemcrypto/docs/License_Duration_and_Renewal.pdf
Documentation:
- Additional errors have been marked as "recoverable." Recovery paths for them
have been documented in the [Integration Guide][integration-guide-16.2].
- `kNeedsDeviceCertificate`
- `kNeedsServiceCertificate`
- The comments for `Cdm::setServiceCertificate()` and
`Cdm::parseAndLoadServiceCertificateResponse()` have been made more
consistent.
- The documentation has been updated to reflect that Widevine does not
recommend using the compiler flags `-Wall` and `-Werror` when building the
Widevine CE CDM, even though our default build files use these flags. We
use these flags to help us catch mistakes internally, but due to differences
in the sensitivity of different compiler versions, using them when building
with your own cross-compiling toolchain often triggers harmless warnings
that are treated as errors.
- The [Widevine CE CDM Integration Guide][integration-guide-16.2] and
[OEMCrypto Version Compatibility][oec-version-compat] document have been
updated to the latest versions.
- In addition to the [OEMCrypto v16.2 Specification][oec-16], OEMCrypto v16.2
comes with several supplementary documents:
- [License Duration and Renewal][license-duration-doc]
- [OEMCrypto State Diagrams][oec-state-diagrams]
- [Widevine Core Message Serialization][core-message-doc]
[integration-guide-16.2]: ./Widevine_CE_CDM_IntegrationGuide_16.2.0.pdf
[oec-16]: ./oemcrypto/docs/WidevineModularDRMSecurityIntegrationGuideforCENC_v16.pdf
[oec-state-diagrams]: ./oemcrypto/docs/OEMCrypto_State_Diagrams.pdf
[core-message-doc]: ./oemcrypto/docs/Widevine_Core_Message_Serialization.pdf
Dependency Updates:
- The bundled version of BoringSSL has been updated to commit
[`0064c290d139b928e93a83900efe1367bc18dd03`][boringssl-0064c2].
- The bundled version of GYP has been updated to commit
[`fcd686f1880fa52a1ee78d3e98af1b88cb334528`][gyp-fcd686] in order to support
Python 3.
[boringssl-0064c2]: https://boringssl.googlesource.com/boringssl/+/0064c290d139b928e93a83900efe1367bc18dd03
[gyp-fcd686]: https://chromium.googlesource.com/external/gyp/+/fcd686f1880fa52a1ee78d3e98af1b88cb334528
Bugfixes:
- Fixed a major bug that would cause sessions to enter an unusable state where
a segfault was inevitable if any errors occurred during usage table
initialization. This included errors arising from OEMCrypto choosing not to
implement the Usage Table API, which is technically optional.
- The method `onDeferredComplete` was still present on the `IEventListener`
interface but would never be called due to changes in CDM provisioning in
version 15.0.0. This method has now been removed.
- To avoid potential thread-safety issues, the CE CDM now uses the C++11
randomness classes instead of `rand()`.
- Cleaned up many log messages to be more useful.
- The Widevine CE CDM now follows a more consistent coding style. Several
files have been reformatted to fit this style, even where there are no other
changes.
- Some unit tests have been made more robust against crashing in error cases.
- Several unit tests were previously setting the service certificate more
frequently than was necessary, which had lead to confusion about the proper
way to use the CE CDM. These tests have now been changed to only set the
service certificate after initialization.
- Fixed issues where the CDM would think it had emptied the usage table when
it had not.
- The CDM will now perform fewer disk operations when deleting many usage
entries at once.
- Fixed many issues where the OEMCrypto tests would pass on the reference
implementation but fail on valid third-party implementations due to the test
being over-strict.
- Fixed an issue that could cause the Widevine CE CDM to delete unintended
files from the storage when deleting files with a wildcard.
- Made the CE CDM unit tests more robust against network communication errors.
- Fixed an issue where some unit tests were using 1023 bytes per kibibyte.
- Fixed an issue that could cause out-of-bounds memory access in one of the
OEMCrypto unit tests.
- Fixed several small bugs that could theoretically cause segfaults.
Removing Unsupported Versions:
- Widevine has removed the tags and branches for several old, unsupported CE
CDM releases from the partner repository. Widevine has always only supported
the most recent OEMCrypto version plus the two versions before it. The
Widevine CE CDM partner repository will now only contain supported releases.
- New clones of the Widevine partner repository will only contain the
supported tags and branches. Existing clones will continue to contain them,
due to the way Git works. Partners that want to clean up these old
references from their local clones can follow these steps:
- If you are running Git 2.17 or newer, just run
`git fetch --prune --prune-tags`. Note that this will also delete any
local tags you have created.
- If you are running an older version of Git or do not want to use
`--prune-tags` due to the above limitations, then:
- To prune old branches, run `git fetch --prune`.
- To prune old tags, run `git tag -l | xargs git tag -d && git fetch -t`.
Note that, just like `--prune-tags`, this command will delete any local
tags you have created.
## 15.3.0 (2020-02-11)
Bugfixes:
- A bug has been fixed that prevented HDCP 2.3 from working in previous
Widevine CE CDM releases, even those that nominally supported HDCP 2.3. All
devices wanting to support HDCP 2.3 *must* update to CE CDM 15.3.0 or later.
- A bug was preventing sessions from being created if Privacy Mode was turned
on and no service certificate had been installed for the licensing service.
This has been fixed, and it should now be possible to create sessions before
installing a service certificate, as required by EME.
- Note, however, that attempting to do a license exchange while in this
state will still return an error. Performing license exchange requires a
service certificate for the licensing service if Privacy Mode is turned
on.
- Previous CE CDM releases erroneously had two errors assigned to the
number 109. One of these errors is now number 110.
- Several OEMCrypto tests were being too stringent about the errors they
allowed to be reported when certain kinds of output protection error were
encountered. These tests have been relaxed to accept the expected error from
either `OEMCrypto_SelectKey()` or `OEMCrypto_DecryptCENC()`.
- Some issues causing incomplete output from failed CDM unit tests have been
fixed.
Features:
- It is now possible to create a CDM instance that will never write to its
storage. Such a CDM will treat its `IStorage` as read-only. Because such a
CDM instance is impossible to provision, this is only useful for ATSC 3.0,
where there is an `IStorage` instance that is pre-populated with a
certificate and licenses.
- To create such a CDM instance, pass `true` as the final parameter to a new
overload of `Cdm::create()`.
- This feature should be used for instances that use ATSC 3.0 licenses, to
protect the preloaded licenses from being overwritten.
- This feature should *only* be used for instances that use ATSC 3.0
licenses. All other CDM instances should continue to be created with
writeable storage.
- Partners that use Sandbox IDs in their OEMCrypto implementation can now pass
the Sandbox ID through the CE CDM rather than calling
`OEMCrypto_SetSandbox()` manually.
- The Sandbox ID is passed as a parameter to a new overload of
`Cdm::initialize()`.
- This feature is only useful in combination with an OEMCrypto that uses
Sandbox IDs. Most partners do not use Sandbox IDs and should continue to
use the version of `Cdm::initialize()` that does not have a Sandbox ID
parameter.
- To run the unit tests on a device that uses Sandbox IDs, you can pass a
new `--sandbox_id=<Sandbox ID>` parameter to the unit test binary to
tell it which Sandbox ID to use.
Documentation:
- Widevine has changed our recommendation for when Privacy Mode should be
turned on, and the documentation has been updated accordingly. Previously,
Widevine recommended the use of Privacy Mode whenever possible. However,
Privacy Mode has no benefit unless the CDM is being used in a web browser.
This is because web browsers visit arbitrary webpages and run untrusted
JavaScript. There is no benefit when running trusted apps, and Privacy Mode
complicates provisioning and licensing. As such, Widevine now only
recommends that Privacy Mode be turned on for web browsers. It should be
turned off for most CE devices.
- This advice applies retroactively to all previous CE CDM releases as well.
## 15.2.0 (2019-06-28)
Features:
- Updated the included OEMCrypto headers and reference code to v15.2.
- This is the first version of the CE CDM that supports OEMCrypto v15.2. Due
to changes in the threading guarantees in OEMCrypto v15.2, earlier
Widevine CE CDM 15.x releases are not safe to use with OEMCrypto v15.2
implementations.
- The OEMCrypto build information is now reported in the license request. This
information can help with debugging integration issues. Content providers
can use this information to choose what licenses to return.
- The OEMCrypto tests have been expanded and cleaned up.
Documentation:
- Clarified what integrators should return from `IStorage::size()` when there
is an error. All integrators should verify that their `IStorage::size()`
implementations adhere to the new requirements.
- The headers and documentation have been updated to emphasize that
`Cdm::removeUsageTable()` is rarely the correct method to use. Apps will
generally want to use `Cdm::deleteUsageRecord()` or
`Cdm::deleteAllUsageRecords()`.
- Expanded the documentation of the `oemcrypto_lib` property in the GYP files.
- Updated some product names in the
[OEMCrypto Version Compatibility][oec-version-compat] document.
- Previous releases incorrectly labelled the Widevine CE CDM 15.x releases as
being released in 2018. The documentation has been updated to correctly
reflect that they have been released in *2019*.
Dependency Updates:
- Widevine CE CDM now requires jsmn [v1.0.0][jsmn-1.0.0]. Previous releases
did not specify a version requirement. However, recent updates to jsmn have
made versions after v1.0.0 incompatible with Widevine CE CDM.
- The included version of jsmn is v1.0.0.
- The bundled version of Protobuf has been updated to [v3.8.0][proto-3.8.0].
Note that, as before, Widevine CE CDM will work with any version of Protobuf
back to 2.6. However, we provide the version of Protobuf that we test with
internally as a default.
- The bundled version of BoringSSL has been updated to commit
[`c0b4c72b6d4c6f4828a373ec454bd646390017d4`][boringssl-c0b4c7].
[jsmn-1.0.0]: https://github.com/zserge/jsmn/releases/tag/v1.0.0
[proto-3.8.0]: https://github.com/protocolbuffers/protobuf/releases/tag/v3.8.0
[boringssl-c0b4c7]: https://boringssl.googlesource.com/boringssl/+/c0b4c72b6d4c6f4828a373ec454bd646390017d4
Bugfixes:
- Fixed a bug that would cause decrypt to fail when using entitled key
rotation and having multiple entitlement keys loaded at the same time.
- Replaced `std::stringstream` with `std::to_string()` where possible.
- Fixed the clock-change test so that it compiles on Windows.
- Fixed a bug where the CDM would treat empty file paths as always existing,
which could result in attempts to delete an empty filename.
- Relaxed the OEMCrypto `UsageTableTest.GenerateReportWrongPST` test.
Previously, it would flag valid results with unusual buffer sizes as
failures.
- Made `OEMCryptoSessionTests.SelectKeyNotThereAPI15` more tolerant of
platforms where the error code is delayed.
- Fixed a bug where key status might be reported incorrectly because the key
container security level was not being taken into account when calculating
the key status to notify to the app. Note that this does not affect the
actual usability of the keys; the error was only in the status reported to
the app.
- The parallel execution tests now time out after 30 seconds rather than 10,
in order to be more forgiving of lower-powered devices.
- Fixed a case where the OEMCrypto Reference Implementation was accessing
the IStorage implementation before it was set when running the tests. This
was benign but could cause problems with other OEMCrypto implementations.
- To help catch cases like this in the future, debug builds of the CE CDM
now assert anytime `FileSystem::_impl` is `NULL`, rather than only when
it is constructed from a passed-in pointer.
- The sample `x86-64` platform files now include a define needed to enable GDB
to debug libstdc++ objects.
## 15.1.0 (2019-03-29)
Features:
- It is now possible to use opaque handles even when the OEMCrypto integration
is L3, assuming the OEMCrypto integration is able to use opaque handles.
Previously, the CE CDM blocked this combination of features.
- Methods for querying information about the underlying OEMCrypto integration
have been added to the CE CDM API.
- `Cdm::getRobustnessLevel()`
- `Cdm::getResourceRatingTier()`
- `Cdm::getOemCryptoBuildInfo()`
- Several new errors have been added to the CE CDM API. These errors are
considered "recoverable errors" because there are well-known actions the
caller can take to recover from them. These responses are covered in the
[Integration Guide][integration-guide-15.1].
- `kResourceContention`
- `kSessionStateLost`
- `kSystemStateLost`
- `kOutputTooLarge`
- Improved error reporting around entitlement licenses.
Documentation:
- The Integration Guide that shipped with CE CDM 15.0.0 did not contain
updates about the removal of `onDirectIndividualizationRequest()` and did
not contain documentation for the manual provisioning flow that replaced it.
The [Integration Guide for CE CDM 15.1.0][integration-guide-15.1] has been
updated to correct this.
- Additional comments have been added to the OEMCrypto unit tests to help
integration partners better understand what is going wrong when they get an
error. Future releases will further expand on this.
- [Widevine_OEMCrypto_Version_Compatibility.pdf][oec-version-compat] has been
updated to document the number of required keys per session in each version.
[integration-guide-15.1]: ./Widevine_CE_CDM_IntegrationGuide_15.1.0.pdf
Bugfixes:
- This release fixes a bug that caused CE CDM initialization to fail when
using opaque handles.
- The usage table unit tests have been re-enabled. Several additional tests
for new scenarios have been added.
- Several failures affecting edge cases when deleting usage table entries have
been fixed.
- The playback duration was not being counted correctly in cases where the
license had an unlimited license duration but a very short playback duration
and the license was received after playback had already started. This has
been fixed.
- The default compiler warnings for the sample "x86-64" platform have been
strengthened, while some warnings that are triggered by third-party
libraries have been disabled for only those libraries.
- Several benign problems that triggered strict compiler warning levels have
been fixed.
- An error with the kSilent log level that could occur with very strict
compiler or sanitizer settings has been fixed.
- Fixed a spurious error that could occur when querying the SRM version on
devices without SRM support.
- Reworded some code that was tripping up the MSVC compiler.
## 15.0.0 (2019-02-28)
Features:
- Widevine CE CDM 15.0.0 supports and requires OEMCrypto v15.1. The OEMCrypto
header files, documentation, Reference OEMCrypto implementation, and tests
have been updated to v15.1. For a full list of new features in OEMCrypto
v15, please see the
[Widevine Modular DRM Version 15 Delta document][oec-15-delta].
- Note that the threading requirements for OEMCrypto implementations were
revised in OEMCrypto v15, and the Widevine CE CDM 15.0.0 takes greater
advantage of parallelism where possible. When the application uses the
Widevine CE CDM from multiple threads, the Widevine CE CDM will now be
more willing to call into OEMCrypto simultaneously from multiple threads,
though always obeying the guarantees put forth in the
[OEMCrypto v15 specification][oec-15].
- The Widevine CE CDM now requires support for C++11 and C11. A
C++11-supporting compiler and STL library are required in order to build
the Widevine CE CDM.
- We have begun replacing POSIX functions and headers with their C++11 STL
equivalents where possible. As a side-effect of this, it should be much
easier to compile the Widevine CE CDM for non-POSIX-compliant platforms.
- The Widevine-created drop-ins for several STL classes have been replaced
with their STL equivalents. This eliminates bugs originating in these
classes and improves performance on some systems.
- `wvcdm::scoped_ptr`
- `wvcdm::shared_ptr`
- `wvcdm::Lock`
- `wvcdm::AutoLock`
- The Widevine CE CDM now builds with hidden visibility as the default and
only exports symbols that correspond to the public API of the library. This
allows the final binary to be smaller and faster and can reduce conflicts
with other libraries.
- It is now possible to set separate service certificates for the Provisioning
Service and the Licensing Service. Methods that install a service
certificate now take a parameter that indicates if this certificate is to
be installed for the Provisioning Service, the Licensing Service, or both.
- To replicate the previous behavior, pass `Cdm::kAllServices` to install
the certificate for both services at the same time.
- It is now valid to pass `nullptr` to
`Cdm::parseAndLoadServiceCertificateResponse()` if you do not want to cache
the parsed certificate for future reuse.
- The `onDirectIndividualizationRequest` callback has been removed. In
Widevine CE CDM 14.1.0, `Cdm::getProvisioningRequest()` and
`Cdm::handleProvisioningResponse()` were added to allow applications to
proactively provision unprovisioned devices. Starting with Widevine CE CDM
15.0.0, using these methods is now *mandatory*. There is no more
`onDirectIndividualizationRequest` callback, and trying to open a session,
generate a license request, or load an offline license will return an error
if the device is not provisioned.
- The existing method `Cdm::isProvisioned()` can be used to check if the
device is provisioned at run-time.
- The status code `kDeferred` has been removed.
- There is now an overload of `Cdm::decrypt()` that takes an explicit session
to use for decryption as a parameter. Ordinarily, `Cdm::decrypt()` will
automatically find the session that matches the Key ID specified in the
`input` parameter. However, there are some situations where the Key ID may
not yet be known, such as when feeding clear content through
`Cdm::decrypt()` before the Key ID is known. In these cases, it is necessary
to be explicit about which session the CDM should use for decryption.
- The Widevine CE CDM now supports Provider Client Tokens. If the license
server includes a Provider Client Token with the license, then it will be
copied to any renewal requests that are generated for that license.
- The test code has been refactored and centralized so that it will be more
reliable when running only a subset of the unit tests.
- `build.py` now supports a `-v`/`--verbose` flag that can be passed to turn
on verbose build output from the underlying build tool.
- The OEM Certificate Generator now supports both PEM and DER format
intermediate certs.
- It is now possible to specify a path to NASM. This is only of interest for
partners who are building for Windows and using assembly language code.
- We have improved logging fidelity, particularly around the level of detail
of logged error codes.
- Several new tests have been added, including tests that exercise the
Widevine CE CDM from multiple threads simultaneously.
[oec-15]: ./oemcrypto/docs/WidevineModularDRMSecurityIntegrationGuideforCENC_v15.pdf
[oec-15-delta]: ./oemcrypto/docs/Widevine_Modular_DRM_Version_15_Delta.pdf
Dependency Updates:
- The bundled version of Protobuf has been updated to [v3.6.1][proto-3.6.1].
Note that, as before, Widevine CE CDM will work with any version of Protobuf
back to 2.6. However, we provide the version of Protobuf that we test with
internally as a default.
- The bundled version of BoringSSL has been updated to commit
[`f18bd55240b229a65df48e7905da98fff18cbf59`][boringssl-f18bd5].
- The `legacy_kit` version of BoringSSL that was previously used only by the
unit test code has been removed. All Widevine CE CDM code now uses the
same version of BoringSSL.
[proto-3.6.1]: https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1
[boringssl-f18bd5]: https://boringssl.googlesource.com/boringssl/+/f18bd55240b229a65df48e7905da98fff18cbf59
Bugfixes:
- A bug has been found in all versions of the Widevine CE CDM prior to this
one that can cause leaks and crashes when the CDM is used in a
multi-threaded environment. The class `wvcdm::shared_ptr` contains
operations that it claims are atomic which are not, in fact, atomic.
This bug is a non-issue starting with CE CDM 15.0.0 because
`wvcdm::shared_ptr` has been removed, but please be aware that this issue
exists in all previous CDMs. This issue does not affect devices where the
CDM cannot be used from multiple threads at once.
- Several memory leaks have been fixed in this release. Thank you to the
partners who reported these to us.
- The new parallel operation tests have allowed us to find and fix several
multi-threading issues.
- Fixed a bug where compilation of Protobuf (but not the rest of the CDM)
would sometimes ignore compiler flags being set by the platform.
- Fixed a problem that could occur during callbacks on platforms where
pthreads does not allow the same thread to recursively take a lock.
- Two order-of-destruction ambiguities that could cause crashes during CDM
teardown on certain platforms have been fixed.
- Fixed an issue that could cause repeated decrypts with the same key to fail
when using entitled content keys, depending on specific details of how
OEMCrypto was implemented.
- The comments on `Cdm::setVideoResolution()` have been updated to clarify
that the resolution being passed in should be the resolution of the content
being played, not the output resolution of the device. The behavior of this
function is unchanged, as this was always true.
- Some log messages were missing linefeeds at the end. These have been added.
- Several tests that were disabled have been fixed and re-enabled.
- APIs that rely on selecting a usage table entry at random were not
sufficiently random in certain situations. Their selection will now be more
random.
- Note that this does *not* affect cryptographic random number generation,
which was already sufficiently random.
- Fixed some bugs that could occur when the usage table was full, particularly
if random number generation was not sufficiently random.
- Fixed spurious failures that could occur rarely during
`UsageTableHeaderTest`.
## 14.2.0 (2018-10-12)
Features:
- `build.py` now supports a `-j` flag that allows the caller to control the
level of parallelism. This flag can be specified with a number argument to
limit the build to that many processes in parallel (`build.py x86-64 -j 56`)
or can be specified bare to build with unlimited parallelism.
(`build.py x86-64 -j`) On build systems without suport for unlimited
parallelism, using the bare flag will instead set the limit to 1000
processes.
- The Reference OEMCrypto no longer uses `danger_do_not_use.bin`, and this
file will no longer be written to the filesystem when running tests. The
Reference OEMCrypto has no keybox. The tests install a test keybox into
OEMCrypto temporarily when they run.
Dependency Updates:
- We have cherry-picked an unreleased Protobuf 3.5.1 fix that makes it
compatible with GCC 7. Those having trouble using Protobuf 3.5.1 on GCC 7
should switch to the Protobuf included with Widevine CE CDM or should
cherry-pick commit
[`39c3654e901b4fc35386989cbad49fad8a68c024`][proto-gcc-fix].
- The bundled version of BoringSSL has been updated to commit
[`28babde159253bfa9003a445242605806fff5f1f`][boringssl-28babde1].
[proto-gcc-fix]: https://github.com/google/protobuf/commit/39c3654e901b4fc35386989cbad49fad8a68c024
[boringssl-28babde1]: https://boringssl.googlesource.com/boringssl/+/28babde159253bfa9003a445242605806fff5f1f
Bugfixes:
- A bug was introduced in CE CDM 14.0.0 that could prevent the clear lead of
a video from playing if the key was not usable, even though the samples were
not encrypted. Clear samples are now allowed through even when the key is
not usable.
- Additional locks have been added to protect sessions from concurrent access,
particularly races between destruction and other calls.
- Generating a release request and then closing and reloading the persistent
session before returning the release response was not working correctly.
This flow has been fixed.
- Various minor problems, mostly warnings being treated as errors, that
prevented the Widevine CE CDM from building cleanly on GCC 7 have been
fixed.
- LicenseKeysTest.ConstraintChanges was not testing all the variants it was
meant to test. It has been fixed to test the full range of constraint
scenarios again.
- Explicit references to TR1 have been removed from the test code, in order
to be compatible with the widest possible range of platforms and gTest
versions.
- Some typos in comments and names have been corrected.
- Additional comments have been added clarifying how ITimer will be used by
the CDM and what implementations are and are not responsible for.
- The header comments regarding how to install a service certificate were
outdated and have been updated to reflect the correct behavior of the CDM.
- The CDM will now more gracefully recover from cases where OEMCrypto has run
out of resources for storing the usage table information. This can result in
the loss of usage info if there is large amount of unreleased usage info in
the system, beyond the minimum amount OEMCrypto must support, but it will
allow the CDM to continue working even in this state.
- The framework running the unit tests has been significantly re-architected
and should now be more robust, particularly when running only a subset of
the tests.
- Additional unit tests have been added.
- The CDM will reject erroneous content that has embedded keys that are too
short earlier in the process.
## 14.1.2 (2018-08-21)
Bugfixes:
- Fixed an assert that would always fail when using opaque handles for the
output type. This bug was introduced in CE CDM 14.0.0. All partners using
14.0.0 through 14.1.1 and opaque handles should update to 14.1.2.
## 14.1.1 (2018-07-25)
Bugfixes:
- A crash that could occur in CdmSession when destroying a CDM instance has
been fixed.
## 14.1.0 (2018-06-29)
Features:
- The OEMCrypto headers and documentation have been updated to v14.1
- Note that although this is CE CDM 14.1.0 and it contains OEMCrypto v14.1,
the synchronization of the minor version numbers is a coincidence. We do
not guarantee that future OEMCrypto and CE CDM minor version updates will
always coincide like this. We do expect that major version updates will
coincide.
- The client identification data passed up in a provisioning request has been
expanded to match the client identification data passed up in a license
request.
- In order to protect users' privacy, this expanded client identification
data is encrypted with the provisioning server's service certificate.
- For apps using entitlement licenses, loading new entitled keys will no
longer unload the previous entitled keys. After loading new entitled keys,
both the old and new entitled keys will be available for decryption. Once
loaded, entitled keys will remain valid until the session they were loaded
into is closed.
- This does not affect the behavior of OEMCrypto. Inside OEMCrypto, there
remains at most one entitled key loaded for each entitlement key. The CE
CDM handles switching out entitled keys so that the correct entitled key
is loaded at any given time.
- It is now possible to manually provision the CE CDM, rather than relying on
the automatic generation of a provisioning request when attempting to
generate a license request on an unprovisioned system. Partners that know
they need to provision can use `Cdm::getProvisioningRequest()` and
`Cdm::handleProvisioningResponse()` to perform provisioning before trying to
open any sessions.
- A new method, `Cdm::forceRemove()` has been added to allow the removal of
offline data associated with a license without a server roundtrip. This is
generally *not* what is desired, and this method should be used only by
partners who are certain they want to discard offline licenses and/or usage
info without the server being aware of it. Most partners will want to
continue using `Cdm::remove()` to perform a release roundtrip with the
licensing server, so that the server can track the release and record the
final usage information.
- An OEMCrypto clock rollback-prevention test has been added,
`UsageTableTest.TimeRollbackPrevention`. This test can only run if the
unit tests are being run as root, however, and is disabled automatically
when the unit tests are run as a non-root user.
- Usage information is now persisted to disk whenever a session is closed, in
addition to its existing behavior of saving periodically. This gives better
persistence at the expense of slightly more storage writes.
- Additional unit tests for existing behavior have been added.
- This changelog now has a table of contents.
- [Widevine_OEMCrypto_Version_Compatibility.pdf][oec-version-compat] has been
added, outlining the compatibility between the various Widevine CDM
releases and the various OEMCrypto versions.
- [Widevine_DRM_Device_Provisioning_Models.pdf][provisioning-models] has been
added, outlining the differences between Provisioning 2.0 and 3.0.
- The script `create_static_bundle.py` has been added to assist partners who
want to concatenate all the static libraries that make up the Widevine CE
CDM into one static library.
[oec-version-compat]: ./oemcrypto/docs/Widevine_OEMCrypto_Version_Compatibility.pdf
[provisioning-models]: ./oemcrypto/docs/Widevine_DRM_Device_Provisioning_Models.pdf
Dependency Updates:
- The bundled version of Protocol Buffers has been updated to
[v3.5.1][protobuf-3.5.1]. The Widevine CE CDM should continue to work with
any version of Protocol Buffers at or greater than v2.6, but we now
recommend v3.5.1.
- As part of this update, the compilation flags for Protocol Buffers were
changed. Depending on the flags partners use by default, they may need to
make changes to their flags to accommodate the new version of Protocol
Buffers.
- The bundled version of BoringSSL has been updated to commit
[`0080d83b9faf8dd325f5f5f92eb56faa93864e4c`][boringssl-0080d83b].
[protobuf-3.5.1]: https://github.com/google/protobuf/releases/tag/v3.5.1
[boringssl-0080d83b]: https://boringssl.googlesource.com/boringssl/+/0080d83b9faf8dd325f5f5f92eb56faa93864e4c
Bugfixes:
- Cleaned up redundant compiler flags in the sample x86-64 platform files.
- `UsageTableTest.TwoHundredEntries` was actually testing 201 entries. It has
been fixed.
- The CE CDM will now build without modification on Clang 4 and 5. Previously,
the Protobuf build triggered some warnings that were treated as errors.
- The CDM will now prevent attempts to unprovision devices that use a baked-in
device certificate in their OEMCrypto implementation, as it is not possible
to reprovision these devices.
- The documentation for `Cdm::initialize()` has been updated to make the
caller's responsibilities more explicit. The caller must ensure that the
objects passed to the library at initialization outlive the library itself.
This has always been the case, but the documentation for it has been made
clearer.
- The documentation for `Cdm::create()` was not updated to reflect the changes
in CE CDM 14.0.0 that disallowed passing `NULL` to it. The documentation has
been updated.
- The CDM now recovers more gracefully when files persisted to disk have been
corrupted.
- A race condition between `Cdm::decrypt()`, `Cdm::close()`, and periodic
timers has been fixed.
- The copyright headers on the source code files have been updated.
- Fixed a situation where the CDM might incorrectly report the expiration time
of licenses that never expire. `Cdm::getExpiration()` should now correctly
report an expiration of `-1` for these licenses. Note that the actual
expiration time was always being tracked correctly internally; it was only
being reported incorrectly to the application.
- The CE CDM already made defensive copies of the buffer parameters when
decrypting data in chunks, but it did not make defensive copies when
calling `OEMCrypto_CopyBuffer()` in chunks. This has been fixed. This
resolves issues that occurred when OEMCrypto modified the buffer parameters
in-place during calls to `OEMCrypto_CopyBuffer()`.
- Several disabled unit tests that did not need to be disabled anymore have
been re-enabled.
- Fixed a place where newer versions of Clang could not infer the correct
overload of `std::string::insert()` to call.
- The `HttpSocket` class used by the unit tests is now more resilient against
errors that occur during HTTPS communication and will retry after a delay
when it detects a retryable error.
## 14.0.0 (2018-05-16)
Features:
- Support for OEMCrypto 14, including new unit tests that exercise its
functionality. For a full list of new features in OEMCrypto 14, please see
the Widevine Modular DRM Version 14 Delta document.
- Widevine CE CDM 14.0.0 is not compatible with any previous version of
OEMCrypto. It is only compatible with OEMCrypto v14.
- Added a new overload of the `load()` function for loading keys embedded
inside a PSSH header. This allows for key rotation without multiple server
roundtrips, using entitlement licenses. See the Integration Guide for more
information.
- The version number of the Widevine CE CDM has been bumped to bring the
version numbers of OEMCrypto, the Widevine CE CDM, and the Widevine Android
CDM closer to each other. The major version number of the CE CDM will now
always be the highest version of OEMCrypto supported by that version of the
CE CDM. This is always the version of OEMCrypto that we recommend using with
the CE CDM.
- For this release, the version number is 14.0.0 to reflect that this is the
first release to support OEMCrypto 14.
- Vendors no longer need to supply a copy of either OpenSSL or BoringSSL in
order to compile the CDM. The Widevine CE CDM will now always use the copy
of BoringSSL in the `third_party/` directory, which is provided with the
CDM source code.
- When compiled as a dynamic library, the Widevine CE CDM links statically
with this copy of BoringSSL using hidden visibility. This requires no
changes on the part of partners, so long as they are using the Widevine
CE CDM as a dynamic library. The Widevine CE CDM does not export any
BoringSSL functions and no longer interacts with the platform's copy of
OpenSSL or BoringSSL.
- When using the Widevine CE CDM as a static library, partners are
responsible for providing a compatible copy of BoringSSL. The file
`third_party/boringssl/kit/BORINGSSL_REVISION` contains the hash of the
version of BoringSSL included with the CE CDM, which can be used to guide
decisions about compatible versions of BoringSSL.
- The Widevine CE CDM no longer supports OpenSSL. Those wishing to use the
CE CDM as a static library with OpenSSL will have to make small
modifications to the code where it uses BoringSSL-only APIs in order to
compile with OpenSSL.
- New build configuration setting: `asm_target_arch`
- When building assembly language files, this setting is used to determine
which CPU architecture's instructions to include.
- If this flag is not set by the configuration, it defaults to `none`, which
turns off use of assembly language completely. We strongly recommend
overriding this default so that you receive the speed benefits of
assembly language.
- Valid values are:
- `x86`
- `x86-64`
- `arm`
- `arm64`
- `ppc64`
- `none`
- Protobuf is now compiled by default to not use RTTI support. This reduces
the size of the final binary and allows for easier support of platforms
without RTTI.
- Several additional flags have been added to the example settings.gypi in
the `x86-64` build to reduce the size of the final binary. Partners may want
to consider setting similar flags on their own builds.
- `no-rtti` (Widevine CE CDM does not and has never used RTTI.)
- `no-exceptions` (Widevine CE CDM does not and has never used exceptions.)
- `lto`
- It is no longer permissible to pass a null `IStorage` pointer to
`Cdm::create()`. Previously, passing `NULL` would select the global/default
`IStorage` as the storage for the new CDM instance. However, starting in CE
CDM 3.5.0, the default `IStorage` began to be the storage for global data
such as the usage table header. To clarify its purpose, we are removing its
ability to do double duty as global storage and as a default for new CDM
instances.
- It is still permitted to use the same `IStorage` instance for the global
storage and as the storage for a specific CDM instance. If this is what
you intend, just pass the same pointer to both `Cdm::initialize()` and
`Cdm::create()`.
- Due to nonce flood protections in OEMCrypto, provisioning and licensing
request generation can fail due to too many requests being generated
quickly. Such failures can be retried successfully after a delay. This has
always been the case. To help in discerning when a failure is due to a nonce
flood and can be retried, these failures will now be reported as
`kQuotaExceeded` errors.
- There is a new parameter on `onKeyStatusesChange()`, `has_new_usable_key`.
This will be set to true when the status change has resulted in any new keys
becoming available. This can be used to more efficiently implement certain
EME behavior.
- A new function, `getStatusForHdcpVersion()` has been added to the CDM
interface. This function can be used to implement `getStatusForPolicy()`
from the [EME Extension: HDCP Policy Check][eme-hdcp] proposal.
- The default service certificate used for Provisioning 3.0 has been updated
to reflect changes to the Widevine Provisioning Server.
[eme-hdcp]: https://github.com/WICG/media-capabilities/blob/master/eme-extension-policy-check.md
## 3.5.0 (2017-11-22)
Features:
- Support OEMCrypto v13.2.
- Remove c++11-specific language features and library usages. Current
standard compliance is at gnu++98.
- Supply boringssl in third_party. This is the preferred SSL implementation,
although the gyp build scripts still allow an external boringssl or OpenSSL
library to be used.
- A number of gyp build rule changes have been made to improve how
dependencies are managed and how compile and link command switches are
applied. Compiler flags are used to restrictively detect and report
potential issues.
- Support for large Usage Tables (OEMCrypto v13 feature).
- Support for SRM enforcement and update (OEMCrypto v13 feature).
- Support for embedded licenses.
- Added support for OpenSSL 1.1 (OpenSSL API changes). Earlier versions of
OpenSSL are still supported. The actual OpenSSL version being used is
checked at compile time.
- Begin migration to exclusively supporting BoringSSL.
- Add adapter and stubs for running CDM against OEMCrypto v12. Remove
the adapter for OEMCrypto v8. Currently adapters exist for OEMCrypto
versions 9 through 12.
- Add Fuzzing tests for OEMCrypto interface (work in progress).
BugFixes:
- Numerous Usage Table fixes and improvements.
- Memory leak fixes.
- Handle non-aligned nonce pointer in RewrapDeviceRSAKey calls.
- Fix scoping errors in gyp build rules.
- Fixes to offline license handling.
## 3.4.1 (2017-08-31)
Features:
- Preliminary support for sublicenses and key rotation using sublicenses.
BugFixes:
- Fixed build failure in protobuf host tools build (relaxed compiler
warning checks).
- Enabled a number of more restrictive compiler checks, and fixed
non-compliant code.
- Mock OEMCrypto: handle case of non-aligned nonce pointer in
OEMCrypto_RewrapDeviceRSAKey() and OEMCrypto_RewrapDevideRSAKey30()
## 3.3.0 (2017-05-03)
Features:
- Support OEMCrypto V12. Versions 8 through 11 are supported through
adapters.
- Bugfixes to Provisioning 3.0.
- Add tool for generating Provisioning 3.0 OEM Certificates.
- Add property (provisioning_messages_are_binary)to control whether
CDM generates/accepts provisioning messages in binary or base64+JSON
format (default is base64+JSON).
- Upgrade Protobuf kit (from 2.5.0 to 2.6.1).
- Add Cdm::getServiceCertificateRequest() and
Cdm::parseServiceCertificateResponse().
- Add API calls for managing usage records:
- Cdm::listUsageRecords
- Cdm::deleteUsageRecord
- Cdm::deleteAllUsageRecords
- Remove automatic Service certificate fetch from CDM.
- The CDM client is responsible for ensuring the CDM has a valid
Service Certificate.
- Add status return to report that playback is blocked by HDCP or
video resolution constraints (kKeyUsageBlockedByPolicy).
- Provisioning Request and Response are base64 (web-safe) protobuf messages:
- The request message in an
IEventListener::onDirectIndividualizationRequest() callback.
- The response message in the call to Cdm::update().
Conversions and/or filtering required by a particular Provisioning Server
must be performed in CDM client code.
Bugfixes:
- Various compiler warnings.
- Provisioning 3.0 bugfixes.
## 3.2.0 (2016-12-17)
Features:
- Changed location for fetching protobuf kit. Still using 2.5.0.
- Upgrade stringencoders to most recent release (28ae396)
- Upgrade gmock 1.7.0 to googletest 1.8.0
- Remove default service certificate.
- Add Cdm::listStoredLicenses().
- Break decryption buffers into 100KiB blocks if/when needed.
- Add Cdm::setVideoResolution().
- Add Cdm::isProvisioned() and Cdm::removeProvisioning().
- Add Cdm::removeUsageTable().
- Change default setting of Properties::use_certificates_as_identification
to TRUE.
- Changes to duration semantics in PolicyEngine.
- Support Provisioning v3.0.
- Add support for OEM Certificate - use it in provisioning request.
- Pass provider ID from service certificate to provisioning request.
- Retrieve device serial number from stored DRM Device Certificate.
- Upgrade to OEMCrypto V12.
Bugfixes:
- Add log messages for bad Keybox token.
- Make HTTP transactions in unit tests more robust.
- Ensure proper cleanup of offline release sessions.
- Avoid potential race condition on closing CDM sessions.
- Move g_cutoff earlier in Cdm::Initialize() - allows early debug messages
to be suppressed.
- Unit test bugfixes.
## 3.0.6 (2016-08-15)
Bugfixes:
- Upgraded TLS version used in HTTPS connections made by the unit tests, for
compatibility with recent changes to our servers
## 3.1.0 (2016-07-18)
Features:
- Updates to conform to EME June 10, 2016 Specification
(http://www.w3.org/TR/2016/WD-encrypted-media-20160610/)
- Add per-origin storage of all persistent data.
- Use EME Direct Individualization to provision devices.
- Add IEventListener::onDirectIndividualizationRequest() callback.
- A "license-release" message is no longer fired on calls to load().
- Add CDM entry points for generic crypto operations (Cdm::genericEncrypt(),
Cdm::genericDecrypt(), Cdm::genericSign(), Cdm::genericVerify()).
- Add support for CENC 3.0 and decryption of encrypted HLS content.
- Add support for querying allowed usage for a key
(Cdm::getKeyAllowedUsages()).
- Upgrade to OEMCrypto v11.
- Numerous unit test additions and improvements.
- Add jsmn to third\_party/.
Bugfixes:
- Remove IEventListener::onMessageUrl() callback.
- Don't check/validate crypto mode when Decrypt is called with unencrypted
data.
- Ensure keys are loaded before sending OnKeyStatusChange notifications.
This avoids errors due to prematurely checking key statuses.
- Correctly handle a bad RSA key.
## 3.0.5 (2015-12-16)
Features:
- Add openssl\_config variable for gyp-based projects which already include
OpenSSL or BoringSSL
Bugfixes:
- Sleep between tests to avoid triggering OEMCrypto nonce-flood errors on
very fast machines
## 3.0.4 (2015-12-14)
Features:
- Enforce storage restrictions based on the license type and policy
- Updated to EME spec 2015-11-20
- Updated kPersistent to kPersistentLicense
- Updated kInvalidAccess with kTypeError and kRangeError
- Updated kOutputNotAllowed to kOutputRestricted
- Added key status kReleased
- Added new session type (kPersistentUsageRecord) used for "secure stop"
- Enabled WebM-related tests for CdmEngine
Bugfixes:
- Fixed OEMCrypto test bugs regarding nonce-enabled and nonce-or-entry flags
- Fixed build system bug to allow adding the static CDM library as a
dependency of another gyp static library target
- Fixed message type for service cert requests
- Fixed reporting of expiration for sessions which do not expire
- Fixed test bugs in which changing execution order caused test failures
- Fixed bug in OEMCrypto\_DeleteUsageTable in which the empty table was not
written to disk
- Fixed bug in CE CDM tests in which OEMCrypto usage table data was not
cleared between test runs, causing issues with duplicate PSTs
## 3.0.3 (2015-11-09)
Features:
- Added x86-32 build settings
Bugfixes:
- Fix buffer overflow in mock OEMCrypto on 32-bit systems
- Fixed OEMCrypto\_RefreshKeys return value
- Fixed OEMCrypto\_GenerateRSASignature return value
- Fixed assertions during server certificate provisioning, triggered by a
race condition
- Removed spurious error messages from CdmEngine::AddKey()
- Fixed PSS verification in iOS privacy crypto implementation
## 3.0.2 (2015-09-18)
Features:
- Updated OEMCrypto docs
- Privacy crypto implementation for iOS
- Now builds with strict warnings and warnings as errors
- Added an extra method to IEventListener to allow integration with older
versions of Chromium using prefixed EME
- *NOTE: This is temporary and will be removed in a future release*
Bugfixes:
- Fixed support for C++11 and clang
- Prevent renewal license when can\_renew is false
- Fixed variable-length key ID tests
- Fixed enforcement of secure buffer types for decrypt
- Fix type-casting issues with various versions of OpenSSL and BoringSSL
- Return kNotSupported when generateRequest called with non-Widevine initdata
## 3.0.1 (2015-09-11)
Features:
- Added new methods to access app parameters available on Android
- Test suite is now IPv6-ready
- Exposed IClient inheritance for Cdm interface
- Added baked-in cert support to the mock OEMCrypto
Bugfixes:
- Made improvements to tests for OEMCrypto and core
- Return client ID information in secure stop
- Fix multiple deletions of OEMCrypto usage table entries
- Don't delete offline licenses when a new device cert is provisioned
- Hardened BufferReader class
- Removed excess logging in PSSH parser
- Fixed iOS build issues with MD5 in DeviceFiles
- Fixed iOS build issues with protobuf\_config==target
- Fixed bugs in OEMCrypto v9 and v10 adapters
- Fixed inclusion of unit test gypis from external projects
Broken compatibility:
- Added a cancel() method to ITimer, needed for some timer implementations
## 3.0.0 (2015-06-19)
v3.0 introduced a completely new interface which is not backward compatible
with v2.x.
Features:
- Simplified, synchronous interface which mimics EME APIs
- Support for key statuses and session expiration times
- Simplified build system with fewer build-time flags
- Simplified initialization with runtime settings for client info,
log levels, and secure output modes
- Secure output modes are explicit, and individual decrypt requests can
be done in the clear (for example, for platforms with L3 audio)
- Device certificates are now required for all platforms and must be
provisioned during initialization if not present
- Simplified storage interface with more explicit methods
- New integration guide which replaces several older documents