aries-askar 0.4.6

Askar cryptographic primitives and secure storage
Documentation
import json
import hashlib

import pytest

from aries_askar import (
    KeyAlg,
    Key,
    SeedMethod,
)
from aries_askar.types import KeyBackend


def test_get_supported_backends():
    backends = Key.get_supported_backends()

    assert backends == [str(KeyBackend.Software)]


@pytest.mark.parametrize(
    "key_alg",
    [KeyAlg.A128CBC_HS256, KeyAlg.A128GCM, KeyAlg.XC20P],
)
def test_symmetric(key_alg: KeyAlg):
    key = Key.generate(key_alg)
    assert key.algorithm == key_alg

    data = b"test message"
    nonce = key.aead_random_nonce()
    params = key.aead_params()
    assert isinstance(params.nonce_length, int)
    assert isinstance(params.tag_length, int)
    enc = key.aead_encrypt(data, nonce=nonce, aad=b"aad")
    dec = key.aead_decrypt(enc, nonce=nonce, aad=b"aad")
    assert data == bytes(dec)

    jwk = json.loads(key.get_jwk_secret())
    assert jwk["kty"] == "oct"
    assert KeyAlg.from_key_alg(jwk["alg"].lower().replace("-", "")) == key_alg
    assert jwk["k"]


def test_bls_keygen():
    key = Key.from_seed(
        KeyAlg.BLS12_381_G1,
        b"testseed000000000000000000000001",
        method=SeedMethod.BlsKeyGen,
    )
    assert key.get_jwk_public() == (
        '{"crv":"BLS12381G1","kty":"EC","x":"B56eYI8Qkq5hitICb-ik8wRTzcn6Fd'
        '4iY8aDNVc9q1xoPS3lh4DB_B4wNtar1HrV","y":"AMindK35vNa3dIH3-BhyxFbzB'
        'AFkrZgVhVcbyzWUT-ufNOC9EoLGzc_B2yDHLRAw"}'
    )
    key2 = key.convert_key(KeyAlg.BLS12_381_G2)
    assert key2.get_jwk_public() == (
        '{"crv":"BLS12381G2","kty":"EC","x":"CZIOsO6BgLV72zCrBE2ym3DEhDYcgh'
        'nUMO4O8IVVD8yS-C_zu6OA3L-ny-AO4rbkAo-WuApZEjn83LY98UtoKpTufn4PCUFV'
        'QZzJNH_gXWHR3oDspJaCbOajBfm5qj6d","y":"B4HiPHISC7BrjEDsUm0VHax6VD3'
        'BK2S7m_QVzbxtsqQcVIj2mSuzFz_75vhoeXWxBHmTKzwcHgqkasnOx47xBCAXPiMUT'
        'Bh-cW9mAQEGlS8uL-TvzlYp47IwhIhVTZQf"}'
    )


def test_ed25519():
    key = Key.generate(KeyAlg.ED25519)
    assert key.algorithm == KeyAlg.ED25519
    message = b"test message"
    sig = key.sign_message(message)
    assert key.verify_signature(message, sig)
    x25519_key = key.convert_key(KeyAlg.X25519)

    x25519_key_2 = Key.generate(KeyAlg.X25519)
    kex = x25519_key.key_exchange(KeyAlg.XC20P, x25519_key_2)
    assert isinstance(kex, Key)

    jwk = json.loads(key.get_jwk_public())
    assert jwk["kty"] == "OKP"
    assert jwk["crv"] == "Ed25519"

    jwk = json.loads(key.get_jwk_secret())
    assert jwk["kty"] == "OKP"
    assert jwk["crv"] == "Ed25519"


@pytest.mark.parametrize(
    "key_alg",
    [KeyAlg.K256, KeyAlg.P256, KeyAlg.P384],
)
def test_ec_curves(key_alg: KeyAlg):
    key = Key.generate(key_alg)
    assert key.algorithm == key_alg
    message = b"test message"
    sig = key.sign_message(message)
    assert key.verify_signature(message, sig)

    jwk = json.loads(key.get_jwk_public())
    assert jwk["kty"] == "EC"
    assert jwk["crv"]
    assert jwk["x"]
    assert jwk["y"]

    jwk = json.loads(key.get_jwk_secret())
    assert jwk["kty"] == "EC"
    assert jwk["crv"]
    assert jwk["x"]
    assert jwk["y"]
    assert jwk["d"]


def test_sign_prehashed():
    key = Key.generate("p256")
    message = hashlib.sha384(b"test message").digest()
    sig = key.sign_message(message, "es256ph")
    assert key.verify_signature(message, sig, "es256ph")