aboutsummaryrefslogtreecommitdiff
path: root/src/mailman_pgp/utils/config.py
blob: 6b45d056de9820a8dcfe21fcc3336c138c3c3ad5 (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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# Copyright (C) 2017 Jan Jancar
#
# This file is a part of the Mailman PGP plugin.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program.  If not, see <http://www.gnu.org/licenses/>.

""""""
import pathlib

from mailman.utilities.string import expand
from pgpy.constants import EllipticCurveOID, PubKeyAlgorithm

from mailman_pgp.config import mm_config


def expandable_str(value):
    return expand(value, None, mm_config.paths)


def expandable_path(value):
    return pathlib.Path(expandable_str(value))


def key_spec(value):
    KEYPAIR_TYPE_MAP = {
        'RSA': PubKeyAlgorithm.RSAEncryptOrSign,
        'DSA': PubKeyAlgorithm.DSA,
        'ECDSA': PubKeyAlgorithm.ECDSA,
        'ECDH': PubKeyAlgorithm.ECDH
    }
    ECC_OID_MAP = {
        'nistp256': EllipticCurveOID.NIST_P256,
        'nistp384': EllipticCurveOID.NIST_P384,
        'nistp521': EllipticCurveOID.NIST_P521,
        'brainpoolP256r1': EllipticCurveOID.Brainpool_P256,
        'brainpoolP384r1': EllipticCurveOID.Brainpool_P384,
        'brainpoolP512r1': EllipticCurveOID.Brainpool_P512,
        'secp256k1': EllipticCurveOID.SECP256K1
    }
    key_type, key_length = value.split(':')
    key_type = key_type.upper()
    key_length = key_length.lower()

    if key_type not in KEYPAIR_TYPE_MAP:
        raise ValueError('Invalid key type: {}.'.format(key_type))

    out_type = KEYPAIR_TYPE_MAP[key_type]
    if key_type in ('ECDSA', 'ECDH'):
        if key_length not in ECC_OID_MAP:
            raise ValueError('Invalid key length: {}.'.format(key_length))
        out_length = ECC_OID_MAP[key_length]
    else:
        out_length = int(key_length)
    return (out_type, out_length)