aboutsummaryrefslogtreecommitdiff
path: root/rpki/oids.py
blob: abc928bc035cdab8dfc54607d9b470d02c94d05a (plain) (blame)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# $Id$
#
# Copyright (C) 2013--2014  Dragon Research Labs ("DRL")
# Portions copyright (C) 2009--2012  Internet Systems Consortium ("ISC")
# Portions copyright (C) 2007--2008  American Registry for Internet Numbers ("ARIN")
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notices and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND DRL, ISC, AND ARIN DISCLAIM ALL
# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL DRL,
# ISC, OR ARIN BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
OID database.

This used to be fairly complicated, with multiple representations and
a collection of conversion functions, but now it is very simple:

- We represent OIDs as Python strings, holding the dotted-decimal
  form of an OID.  Nothing but decimal digits and "." is legal.
  This is compatible with the format that rpki.POW uses.

- We define symbols in this module whose values are OIDs.

That's pretty much it.  There's a bit of code at the end which checks
the syntax of the defined strings and provides a pretty-print function
for the rare occasion when we need to print an OID, but other than
that this is just a collection of symbolic names for text strings.
"""

ecdsa_with_SHA256               = "1.2.840.10045.4.3.2"
sha256WithRSAEncryption         = "1.2.840.113549.1.1.11"
sha384WithRSAEncryption         = "1.2.840.113549.1.1.12"
sha512WithRSAEncryption         = "1.2.840.113549.1.1.13"
id_data                         = "1.2.840.113549.1.7.1"
id_smime                        = "1.2.840.113549.1.9.16"
id_ct                           = "1.2.840.113549.1.9.16.1"
id_ct_routeOriginAttestation    = "1.2.840.113549.1.9.16.1.24"
id_ct_rpkiManifest              = "1.2.840.113549.1.9.16.1.26"
id_ct_xml                       = "1.2.840.113549.1.9.16.1.28"
id_ct_rpkiGhostbusters          = "1.2.840.113549.1.9.16.1.35"
authorityInfoAccess             = "1.3.6.1.5.5.7.1.1"
sbgp_ipAddrBlock                = "1.3.6.1.5.5.7.1.7"
sbgp_autonomousSysNum           = "1.3.6.1.5.5.7.1.8"
subjectInfoAccess               = "1.3.6.1.5.5.7.1.11"
id_kp_bgpsec_router             = "1.3.6.1.5.5.7.3.30"
id_cp_ipAddr_asNumber           = "1.3.6.1.5.5.7.14.2"
id_ad_caIssuers                 = "1.3.6.1.5.5.7.48.2"
id_ad_caRepository              = "1.3.6.1.5.5.7.48.5"
id_ad_signedObjectRepository    = "1.3.6.1.5.5.7.48.9"
id_ad_rpkiManifest              = "1.3.6.1.5.5.7.48.10"
id_ad_signedObject              = "1.3.6.1.5.5.7.48.11"
id_ad_rpkiNotify                = "1.3.6.1.5.5.7.48.13"
commonName                      = "2.5.4.3"
serialNumber                    = "2.5.4.5"
countryName                     = "2.5.4.6"
localityName                    = "2.5.4.7"
stateOrProvinceName             = "2.5.4.8"
streetAddress                   = "2.5.4.9"
organizationName                = "2.5.4.10"
organizationalUnitName          = "2.5.4.11"
subjectKeyIdentifier            = "2.5.29.14"
keyUsage                        = "2.5.29.15"
basicConstraints                = "2.5.29.19"
cRLNumber                       = "2.5.29.20"
cRLDistributionPoints           = "2.5.29.31"
certificatePolicies             = "2.5.29.32"
authorityKeyIdentifier          = "2.5.29.35"
extendedKeyUsage                = "2.5.29.37"
id_sha256                       = "2.16.840.1.101.3.4.2.1"

# Make sure all symbols exported so far look like OIDs, and build a
# dictionary to use when pretty-printing.

_oid2name = {}

for _sym in dir():
    if not _sym.startswith("_"):
        _val = globals()[_sym]
        if not isinstance(_val, str) or not all(_v.isdigit() for _v in _val.split(".")):
            raise ValueError("Bad OID definition: %s = %r" % (_sym, _val))
        _oid2name[_val] = _sym.replace("_", "-")

# pylint: disable=W0631
del _sym
del _val

def oid2name(oid):
    """
    Translate an OID into a string suitable for printing.
    """

    if not isinstance(oid, (str, unicode)) or not all(o.isdigit() for o in oid.split(".")):
        raise ValueError("Parameter does not look like an OID string: " + repr(oid))

    return _oid2name.get(oid, oid)