Skip to main content

A client for EVS, Widevine/VMP signing service

Project description

castlabs-evs is a package that provides a client for the EVS service for Electron for Content Security. EVS provides production Widevine/VMP signing of application packages derived from official releases of Electron for Content Security. It is a free service, but requires signup to use.

As part of the Widevine 3PL program castLabs also offers commercial VMP certification of custom Chromium/Electron adaptations, which enables the use of EVS for signing custom builds.

castlabs-evs supports Python 3.7+ and can be installed with:

% python3 -m pip install castlabs-evs

This installs the EVS client which provides Python and CLI interfaces for account handling and VMP signing. If the pip module binary directory is in your PATH the two convenience scripts evs-account and evs-vmp can be used in place of python3 -m <module> in the examples below.

The CLI interfaces are interactive by default, asking for any information they cannot load from its configuration, unless they are provided through CLI arguments or environment variables. This behaviour can be overridden by not providing a TTY on STDIN, or by passing the --no-ask option or setting EVS_NO_ASK in the environment, in which case any missing required information will trigger a runtime error instead, making them more suitable for automation.

The Python interfaces are not currently documented, but the CLI provides help sections that can be accessed:

% python3 -m castlabs_evs.account --help
usage: account.py [-h] [-v] [-n] [--connect-timeout CONNECT_TIMEOUT] [--auth-timeout AUTH_TIMEOUT]
                  {signup,sup,resend,rs,confirm-signup,csup,update,up,reset,res,confirm-reset,cres,refresh,r,deauth,da,reauth,ra,delete,del} ...

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -n, --no-ask          enable non-interactive mode

timeout options:
  --connect-timeout CONNECT_TIMEOUT
                        connection timeout in seconds (default: 60)
  --auth-timeout AUTH_TIMEOUT
                        auth request timeout in seconds (default: 60)

commands:
  {signup,sup,resend,rs,confirm-signup,csup,update,up,reset,res,confirm-reset,cres,refresh,r,deauth,da,reauth,ra,delete,del}
    signup (sup)        sign up for EVS account
    resend (rs)         resend EVS account confirmation code
    confirm-signup (csup)
                        confirm account signup
    update (up)         update account details
    reset (res)         reset account password
    confirm-reset (cres)
                        confirm account password reset
    refresh (r)         refresh authorization tokens
    deauth (da)         discard any authorization tokens
    reauth (ra)         discard any authorization tokens & refresh
    delete (del)        delete EVS account
% python3 -m castlabs_evs.vmp --help
usage: vmp.py [-h] [-v] [-n] [-a] {verify,v,sign,s,verify-pkg,vp,sign-pkg,sp} ...

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -n, --no-ask          enable non-interactive mode
  -a, --any-ski         verify any subject key identifier

commands:
  {verify,v,sign,s,verify-pkg,vp,sign-pkg,sp}
    verify (v)          verify signature
    sign (s)            refresh signature
    verify-pkg (vp)     verify electron package signature
    sign-pkg (sp)       refresh electron package signature

The sign command supports a number of transfer options for controlling timeouts and upload behaviour:

% python3 -m castlabs_evs.vmp sign --help
usage: vmp.py sign [-h] [-s] [-p] [-i] [-M MIN_DAYS] [-f] [-z] [-A ACCOUNT_NAME] [-P PASSWD]
                   [--connect-timeout CONNECT_TIMEOUT] [--auth-timeout AUTH_TIMEOUT]
                   [--upload-url-timeout UPLOAD_URL_TIMEOUT] [--upload-timeout UPLOAD_TIMEOUT]
                   [--sign-timeout SIGN_TIMEOUT] [--multipart-threshold MULTIPART_THRESHOLD]
                   [--multipart-part-size MULTIPART_PART_SIZE] [--multipart-retries MULTIPART_RETRIES]
                   [--multipart-max-concurrency MULTIPART_MAX_CONCURRENCY]
                   bin [sig]

positional arguments:
  bin                   path to binary
  sig                   path to signature

options:
  -h, --help            show this help message and exit
  -s, --streaming       streaming only signature (default)
  -p, --persistent      streaming and persistent download signature
  -i, --intermediate    generate intermediate signature
  -M, --min-days MIN_DAYS
                        minimum number of remaining valid days
  -f, --force           force new signature
  -z, --gz              request gzip upload (slower for fast connections)
  -A, --account-name ACCOUNT_NAME
                        provide account name [CACHED]
  -P, --passwd PASSWD   provide account password

transfer options:
  --connect-timeout CONNECT_TIMEOUT
                        connection timeout in seconds (default: 60)
  --auth-timeout AUTH_TIMEOUT
                        auth request timeout in seconds (default: 60)
  --upload-url-timeout UPLOAD_URL_TIMEOUT
                        upload URL request timeout in seconds (default: 60)
  --upload-timeout UPLOAD_TIMEOUT
                        upload request timeout in seconds (default: 300)
  --sign-timeout SIGN_TIMEOUT
                        sign request timeout in seconds (default: 120)
  --multipart-threshold MULTIPART_THRESHOLD
                        multipart upload threshold in MB (default: 100, min: 20)
  --multipart-part-size MULTIPART_PART_SIZE
                        multipart upload part size in MB (default: 50, min: 20)
  --multipart-retries MULTIPART_RETRIES
                        multipart upload max retries (default: 3)
  --multipart-max-concurrency MULTIPART_MAX_CONCURRENCY
                        multipart upload max concurrent connections (default: 2)

Binaries larger than --multipart-threshold (default 100 MB) are automatically uploaded using S3 multipart upload, which enables parallel, resumable transfers with configurable part size and concurrency. The -z/--gz flag enables gzip compression of the upload stream, which can reduce transfer size at the cost of additional CPU overhead.

Legal notice / Disclaimer

THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. UPDATES, INCLUDING SECURITY UPDATES, WILL BE PROVIDED ON A BEST-EFFORT BASIS.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

castlabs_evs-1.3.2.tar.gz (18.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

castlabs_evs-1.3.2-py3-none-any.whl (24.5 kB view details)

Uploaded Python 3

File details

Details for the file castlabs_evs-1.3.2.tar.gz.

File metadata

  • Download URL: castlabs_evs-1.3.2.tar.gz
  • Upload date:
  • Size: 18.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for castlabs_evs-1.3.2.tar.gz
Algorithm Hash digest
SHA256 d55efae7391e362f5d40bae48b76e75d7b16586243d1ef406ba0b6878942f448
MD5 24f25edb0d2b675aa2a45bbfb9377879
BLAKE2b-256 a088d6bc15e3ca9df942e68ba251e287fe9786498dc32701b8a8ca110b1310ef

See more details on using hashes here.

File details

Details for the file castlabs_evs-1.3.2-py3-none-any.whl.

File metadata

  • Download URL: castlabs_evs-1.3.2-py3-none-any.whl
  • Upload date:
  • Size: 24.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for castlabs_evs-1.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d3b074a5fb34881ac82e3ff0c3e88c9059c5864abdeb041b504b7f702b8f3e3c
MD5 7f89245e619a5088654912b9921fc2aa
BLAKE2b-256 a8e91a5b8820f5ea1033c3221d47b077e951d6148d67693b93c1a51b1360b4e0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page