forked from ThetaDev/widevine-rs
Rust implementation of Google's Widevine DRM CDM (Content Decryption Module)
- Rust 89%
- C 9.5%
- Just 1.5%
|
Dobroslaw Kijowski
b3833d285a
fix: write init data length in Pssh::to_bytes()
* After this commit to_bytes() produces parsable psshs. |
||
|---|---|---|
| .forgejo/workflows | ci: disable renovate | |
| crates | fix: write init data length in Pssh::to_bytes() | |
| .editorconfig | initial commit | |
| .gitignore | initial commit | |
| .pre-commit-config.yaml | initial commit | |
| Cargo.toml | chore: add Cargo metadata | |
| cliff.toml | initial commit | |
| Justfile | initial commit | |
| LICENSE | feat: add GPL license | |
| README.md | chore: add docs badge to README | |
| renovate.json | ci: renovate: preserveSemverRanges | |
widevine-rs
Current crates.io version License Docs CI status
Rust implementation of Google's Widevine DRM CDM (Content Decryption Module). The CDM allows you to build applications that can access DRM-protected media.
This is a port of the pywidevine library by rlaphoenix.
To use the CDM you need a valid Google-provisioned Private Key and Client Identification blob (plain or bundled as a *.wvd file).
Example:
Bitmovin DRM demo video: https://bitmovin.com/demos/drm
usestd::fs::File;usestd::io::BufReader;useisahc::ReadResponseExt;usehex_lit::hex;usewidevine::{Device,Cdm,Pssh,LicenseType};#letwvd_path=matchstd::env::var("WIDEVINE_DEVICE"){#Ok(wvd_path)=>wvd_path,#Err(_)=>return,#};// Instantiate a new CDM
letdevice=Device::read_wvd(BufReader::new(File::open(&wvd_path).unwrap())).unwrap();letcdm=Cdm::new(device);/// Create a new CDM request
letpssh=Pssh::from_b64("AAAAW3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADsIARIQ62dqu8s0Xpa7z2FmMPGj2hoNd2lkZXZpbmVfdGVzdCIQZmtqM2xqYVNkZmFsa3IzaioCSEQyAA==").unwrap();letrequest=cdm.open().get_license_request(pssh,LicenseType::STREAMING).unwrap();letchallenge=request.challenge().unwrap();// Send the request to the license server
letmutresp=isahc::post("https://cwip-shaka-proxy.appspot.com/no_auth",challenge).unwrap();letresp_data=resp.bytes().unwrap();// Decrypt the received keys and select the key with the required ID
letkeys=request.get_keys(&resp_data).unwrap();letkey=keys.content_key(&hex!("ccbf5fb4c2965be7aa130ffb3ba9fd73")).unwrap();assert_eq!(key.key,hex!("9cc0c92044cb1d69433f5f5839a159df"));