numbers-c2pa


Namenumbers-c2pa JSON
Version 0.2.0 PyPI version JSON
download
home_pagehttps://github.com/numbersprotocol/numbers-c2pa
SummaryNumbers C2PA tool
upload_time2024-06-12 07:54:04
maintainerNone
docs_urlNone
authorNumbers Co., Inc
requires_python>=3.7
licenseNone
keywords authenticity
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # numbers-c2pa


## Setup

Install Rust

```bash
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

Install c2patool

```bash
$ cargo install c2patool
```

Install numbers-c2pa

```
$ python3 -m pip install git+https://github.com/numbersprotocol/numbers-c2pa.git
```

## Usage

C2PA Injection

```python
from datetime import datetime

from numbers_c2pa import create_c2pa_manifest, inject_file

if __name__ == '__main__':
    with open('examples/es256_private.key') as f:
        private_key = f.read()
    with open('examples/es256_certs.pem') as f:
        sign_cert = f.read()
    manifest = create_c2pa_manifest(
        nid='this is nid',
        creator_public_key='this is creator public key',
        asset_hash='this is sha256hash',
        date_created=datetime.now(),
        location_created='123.123, 45.45',
        date_captured=None,
    )
    inject_file(
        'examples/numbers.png',
        manifest=manifest,
        private_key=private_key,
        sign_cert=sign_cert,
    )
    # examples/numbers-c2pa.png will be created
    # Upload file to https://verify.contentauthenticity.org/inspect to view C2PA data
```

Read C2PA data

```python
from numbers_c2pa import read_c2pa_file

if __name__ == '__main__':
    c2pa_json = read_c2pa_file('examples/numbers-c2pa.png')
    print(c2pa_json)

```

## Create self-signed certificate with intermediate CA

According to [c2patool](https://github.com/contentauth/c2patool#appendix-creating-and-using-an-x509-certificate) readme:

> Both the private_key and sign_cert must be in PEM format. The sign_cert must contain a PEM certificate chain starting with the end-entity certificate used to sign the claim ending with the intermediate certificate before the root CA certificate. See the sample folder for example certificates.

Using a intermediate CA certificate is required.

## Updated steps

Create end-entity and intermediate private keys

```bash
openssl ecparam -genkey -name prime256v1 -noout -out intermediate_ca.key
openssl ecparam -genkey -name prime256v1 -noout -out end_entity.key
```

Create intermediate cert

```bash
openssl req -x509 -new -key intermediate_ca.key -out intermediate_ca.crt -subj "/CN=Numbers Intermediate CA" -days 365 -sha256
```

Create `end_entity_csr.conf` file

```conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = v3_req
distinguished_name = dn

[ dn ]
C = US
ST = California
L = San Fransisco
O = Numbers Protocol
OU = Numbers Protocol
CN = Numbers Protocol

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = timeStamping
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = numbersprotocol.io
DNS.2 = www.numbersprotocol.io
```

Create end-entity CSR

```bash
openssl req -new -key end_entity.key -out end_entity.csr -config end_entity_csr.conf
```

Create end-entity certificate

```bash
openssl x509 -req -in end_entity.csr -CA intermediate_ca.crt -CAkey intermediate_ca.key -out end_entity.crt -days 365 -CAcreateserial -extfile end_entity_csr.conf -extensions v3_req -sha256
```

Combine certificate chain

```bash
cat end_entity.crt intermediate_ca.crt > certificate_chain.pem
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/numbersprotocol/numbers-c2pa",
    "name": "numbers-c2pa",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "authenticity",
    "author": "Numbers Co., Inc",
    "author_email": "dev@numbersprotocol.io",
    "download_url": "https://files.pythonhosted.org/packages/19/c9/96a93c70b3fce5709f19cd24a36421b64de78985818de336cd5865c929ac/numbers_c2pa-0.2.0.tar.gz",
    "platform": null,
    "description": "# numbers-c2pa\n\n\n## Setup\n\nInstall Rust\n\n```bash\n$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n```\n\nInstall c2patool\n\n```bash\n$ cargo install c2patool\n```\n\nInstall numbers-c2pa\n\n```\n$ python3 -m pip install git+https://github.com/numbersprotocol/numbers-c2pa.git\n```\n\n## Usage\n\nC2PA Injection\n\n```python\nfrom datetime import datetime\n\nfrom numbers_c2pa import create_c2pa_manifest, inject_file\n\nif __name__ == '__main__':\n    with open('examples/es256_private.key') as f:\n        private_key = f.read()\n    with open('examples/es256_certs.pem') as f:\n        sign_cert = f.read()\n    manifest = create_c2pa_manifest(\n        nid='this is nid',\n        creator_public_key='this is creator public key',\n        asset_hash='this is sha256hash',\n        date_created=datetime.now(),\n        location_created='123.123, 45.45',\n        date_captured=None,\n    )\n    inject_file(\n        'examples/numbers.png',\n        manifest=manifest,\n        private_key=private_key,\n        sign_cert=sign_cert,\n    )\n    # examples/numbers-c2pa.png will be created\n    # Upload file to https://verify.contentauthenticity.org/inspect to view C2PA data\n```\n\nRead C2PA data\n\n```python\nfrom numbers_c2pa import read_c2pa_file\n\nif __name__ == '__main__':\n    c2pa_json = read_c2pa_file('examples/numbers-c2pa.png')\n    print(c2pa_json)\n\n```\n\n## Create self-signed certificate with intermediate CA\n\nAccording to [c2patool](https://github.com/contentauth/c2patool#appendix-creating-and-using-an-x509-certificate) readme:\n\n> Both the private_key and sign_cert must be in PEM format. The sign_cert must contain a PEM certificate chain starting with the end-entity certificate used to sign the claim ending with the intermediate certificate before the root CA certificate. See the sample folder for example certificates.\n\nUsing a intermediate CA certificate is required.\n\n## Updated steps\n\nCreate end-entity and intermediate private keys\n\n```bash\nopenssl ecparam -genkey -name prime256v1 -noout -out intermediate_ca.key\nopenssl ecparam -genkey -name prime256v1 -noout -out end_entity.key\n```\n\nCreate intermediate cert\n\n```bash\nopenssl req -x509 -new -key intermediate_ca.key -out intermediate_ca.crt -subj \"/CN=Numbers Intermediate CA\" -days 365 -sha256\n```\n\nCreate `end_entity_csr.conf` file\n\n```conf\n[ req ]\ndefault_bits = 2048\nprompt = no\ndefault_md = sha256\nreq_extensions = v3_req\ndistinguished_name = dn\n\n[ dn ]\nC = US\nST = California\nL = San Fransisco\nO = Numbers Protocol\nOU = Numbers Protocol\nCN = Numbers Protocol\n\n[ v3_req ]\nbasicConstraints = CA:FALSE\nkeyUsage = digitalSignature, keyEncipherment\nextendedKeyUsage = timeStamping\nsubjectAltName = @alt_names\n\n[ alt_names ]\nDNS.1 = numbersprotocol.io\nDNS.2 = www.numbersprotocol.io\n```\n\nCreate end-entity CSR\n\n```bash\nopenssl req -new -key end_entity.key -out end_entity.csr -config end_entity_csr.conf\n```\n\nCreate end-entity certificate\n\n```bash\nopenssl x509 -req -in end_entity.csr -CA intermediate_ca.crt -CAkey intermediate_ca.key -out end_entity.crt -days 365 -CAcreateserial -extfile end_entity_csr.conf -extensions v3_req -sha256\n```\n\nCombine certificate chain\n\n```bash\ncat end_entity.crt intermediate_ca.crt > certificate_chain.pem\n```\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Numbers C2PA tool",
    "version": "0.2.0",
    "project_urls": {
        "Homepage": "https://github.com/numbersprotocol/numbers-c2pa"
    },
    "split_keywords": [
        "authenticity"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cfb4c83bb80f0d558c6e47a09e8cbd2b0006b39c3fccc4c1ea3dab7f92232704",
                "md5": "947d857355e48d20522c9d0d81ca6756",
                "sha256": "a924fbd97b24c3b4bb322474489d4aa1cfbc13f0f0dbc1f5a06be2c2ebedee36"
            },
            "downloads": -1,
            "filename": "numbers_c2pa-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "947d857355e48d20522c9d0d81ca6756",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 7987,
            "upload_time": "2024-06-12T07:54:02",
            "upload_time_iso_8601": "2024-06-12T07:54:02.554996Z",
            "url": "https://files.pythonhosted.org/packages/cf/b4/c83bb80f0d558c6e47a09e8cbd2b0006b39c3fccc4c1ea3dab7f92232704/numbers_c2pa-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "19c996a93c70b3fce5709f19cd24a36421b64de78985818de336cd5865c929ac",
                "md5": "78c8b1c3d23b7c92da6634b1447eef78",
                "sha256": "a815ec3c09a0064b02560f4b2f3be92b314dbd9fb2398ee31f028a829e187563"
            },
            "downloads": -1,
            "filename": "numbers_c2pa-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "78c8b1c3d23b7c92da6634b1447eef78",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 8888,
            "upload_time": "2024-06-12T07:54:04",
            "upload_time_iso_8601": "2024-06-12T07:54:04.374925Z",
            "url": "https://files.pythonhosted.org/packages/19/c9/96a93c70b3fce5709f19cd24a36421b64de78985818de336cd5865c929ac/numbers_c2pa-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-12 07:54:04",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "numbersprotocol",
    "github_project": "numbers-c2pa",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "numbers-c2pa"
}
        
Elapsed time: 0.71674s