.. _rfc8812:

RFC 8812
========

RFC8812 defines the use of the **secp256k1** elliptic curve for JSON Web
Signatures (JWS) and JSON Web Keys (JWK).

It introduces:

- the new JWS algorithm identifier **ES256K**
- the new JWK elliptic curve identifier **secp256k1**

This RFC extends RFC 7515 (JWS) and RFC 7517 (JWK) by adding support for a curve
commonly used in blockchain ecosystems.

Implementation
--------------

``joserfc`` fully supports the definitions introduced in RFC 8812:

- Parsing and generating EC Key with ``crv="secp256k1"``
- Signing and verifying JWS messages using the ``ES256K`` algorithm

The functionality is available through:

- ``joserfc.jws`` for signing and verifying
- ``joserfc.jwk`` for key loading, generation, and handling

Example Usage
-------------

Signing with an ``secp256k1`` EC key:

.. code-block:: python

    from joserfc import jws, jwk

    private_key = jwk.generate_key("EC", "secp256k1")
    payload = b"hello"
    protected = {"alg": "ES256K"}

    output = jws.serialize_compact(protected, payload, private_key, algorithms=["ES256K"])

Verification:

.. code-block:: python

    public_key = jwk.import_key(private_key.as_dict(private=False))
    jws.deserialize_compact(output, public_key, algorithms=["ES256K"])
