No project description provided
Project description
pyattest
pyattest provides a common interface that helps you verify attestations from either Google or Apple. The package works standalone but if you use django and need a full implementation with key generation and storage then django-dreiattest could be of interest for you.
Installation
pyattest is available on PyPI and can be installed via $ python -m pip install pyattest
Usage
In it's most basic form you can create either a GoogleConfig
, GooglePlayIntegrityApiConfig
or AppleConfig
instance, create an Attestation
and verify it.
Google Play Integrity API
The following parameters are important:
decryption_key
: A Base64 encoded AES key secret as described hereverification_key
: A Base64 encoded public key as described hereapk_package_name
: Name of your apkallow_non_play_distribution
: Set to true if you want to verify apps distributed via other means than Google Play (you need to setverify_code_signature_hex
) Note: should not be used for dev builds setproduction
toFalse
in that case instead.verify_code_signature_hex
: The sha256 hash of the signing identity you use for distributing your app. This can be obtained using./gradlew signingReport
in your Android project.required_device_verdict
: If you want to require stronger integrity guarantees pass the corresponding key here.attest
: The jwt object string representing the attestation, which is a jws nested in a jwe objectnonce
: The nonce used to create the attestation
config = GooglePlayIntegrityApiConfig(
decryption_key=[decryption_key],
verification_key=[decryption_key],
apk_package_name='ch.dreipol.demo',
production=True,
allow_non_play_distribution=True,
verify_code_signature_hex=["00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"],
required_device_verdict="MEETS_STRONG_INTEGRITY"
)
attestation = Attestation(attest, nonce, config)
try:
attestation.verify()
except PyAttestException as exception:
# Do your thing
pass
Google (Legacy: SafetyNet)
The following parameters are important:
key_id
: A Base64 encoded SHA-256 hash of your apps certificateapk_package_name
: Name of your apkproduction
: Ignores basic integrity and cts profile check ifFalse
attest
: The jws object string representing the attestationnonce
: The nonce used to create the attestation
config = GoogleConfig(key_ids=[key_id], apk_package_name='ch.dreipol.demo', production=True)
attestation = Attestation(attest, nonce, config)
try:
attestation.verify()
except PyAttestException as exception:
# Do your thing
pass
Apple
The following parameters are important:
key_id
: SHA-256 hash of the public key form the cert you got back from the attestationapp_id
: Your app’s App ID, which is the concatenation of your 10-digit team identifier, a period, and your app’s CFBundleIdentifier valueproduction
: Checks for the appropriateaaguid
attest
: The apple attestation as binarynonce
: The nonce used to create the attestation
config = AppleConfig(key_id=key_id, app_id='1234ABCDEF.ch.dreipol.demo', production=True)
attestation = Attestation(attest, nonce, config)
try:
attestation.verify()
except PyAttestException as exception:
# Do your thing
pass
Assertion
Once you verified and obtained a public key, you can use it to assert
further requests. For a full implementation on how to get to the public key check out django-dreiattest. To check if an assertion
is valid we check if it was signed with given pem_key
.
assertion
: Raw bytes of the assertion you want to testexpected_hash
: The hash we want to compare the signature againstpem_key
: The public key to verify the signatureconfig
: AAppleConfig
orGoogleConfig
instance
assertion = Assertion(assertion, expected_hash, pem_key, config)
assertion.verify()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file pyattest-1.0.0.tar.gz
.
File metadata
- Download URL: pyattest-1.0.0.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a459961630746e35bb98815159453d0e307d44968cdb2297c92b1dc363fea4e2 |
|
MD5 | 4c2b3a13433cdc13870208b33140998b |
|
BLAKE2b-256 | eab06e24468159dd0fade429de33b42fb7698eb904e33381b5e3f1fa6ad8b76c |