aboutsummaryrefslogtreecommitdiffstats
path: root/src/cryptography/hazmat/primitives/asymmetric/utils.py
blob: a1a40292c7be7515e71f8f72569a13f51a3bdd22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.

from __future__ import absolute_import, division, print_function

from pyasn1.codec.der import decoder, encoder
from pyasn1.type import namedtype, univ


class _DSSSigValue(univ.Sequence):
    componentType = namedtype.NamedTypes(
        namedtype.NamedType('r', univ.Integer()),
        namedtype.NamedType('s', univ.Integer())
    )


def decode_rfc6979_signature(signature):
    data = decoder.decode(signature, asn1Spec=_DSSSigValue())
    if data[1]:
        raise ValueError(
            "The signature contains bytes after the end of the ASN.1 sequence."
        )
    r = int(data[0].getComponentByName('r'))
    s = int(data[0].getComponentByName('s'))
    return (r, s)


def encode_rfc6979_signature(r, s):
    sig = _DSSSigValue()
    sig.setComponentByName('r', r)
    sig.setComponentByName('s', s)
    return encoder.encode(sig)