Compliance record

How to check that the file was not edited

This page is for someone checking a compliance record export a client downloaded. No Tawthiq account is needed. A valid signature shows the files are the ones Tawthiq signed, and that they were not changed afterwards.

Signing key

Fingerprint

8bdf268a30c5ef9aa891c244174ec72c4c6f87bd9dbe878f5abb39f30144c5e9

SHA-256 of the Ed25519 public key, SPKI DER, as lowercase hex.

DNS

Tawthiq publishes the same fingerprint in the TXT record at_compliance-record-key.tawthiq.tech.The spki-sha256 field must match the fingerprint above, and the spki field is the public key below.

A key inside the bundle proves nothing on its own.

dig +short TXT _compliance-record-key.tawthiq.tech

Public key

Save this block as tawthiq.pub, including the begin and end lines.

-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA64zHco3UpK7tTySgikIvg4eSUamYQLEnkkSXSl2BiDc=
-----END PUBLIC KEY-----

Check

Run the commands in the folder the zip unpacked into, on the files as stored.

  1. Match the fingerprint

    Save the key above as tawthiq.pub, then run the command. The 64 hex characters at the start of the line must match this page and the DNS record.

    openssl pkey -pubin -in tawthiq.pub -outform DER | sha256sum
  2. Match the files to the manifest

    manifest.json lists files. For each path, hash that file and compare it with the sha256 field. The command below is daily-rows.csv, which every bundle contains. Repeat it for each path. README.md, manifest.json and manifest.sig are not in the list.

    sha256sum daily-rows.csv
  3. Check the signature

    manifest.sig is an Ed25519 signature. The signed message is the SHA-256 hex of the manifest.json bytes, as UTF-8, with no trailing newline. It is not the file's raw bytes. When it matches, OpenSSL prints:Signature Verified Successfully

    printf '%s' "$(sha256sum manifest.json | cut -d' ' -f1)" > message.txt
    base64 -d manifest.sig > manifest.sig.bin
    openssl pkeyutl -verify -pubin -inkey tawthiq.pub -rawin -in message.txt -sigfile manifest.sig.bin

What the check shows

A successful check shows that manifest.json and the files it lists are the bytes Tawthiq signed.

Consent decision rows are server receipts of choices the browser reported. Site and configuration identifiers and HTTP headers do not authenticate a person or prove that JavaScript ran on the customer's page. These rows are not tamper-proof or independently verified legal proof.