blob: 76ca96a69a41a96aa5ab75e5c37f53fe32361720 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (c) 2013-2017 Nest Labs, Inc.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# @file
# This file implements a Python script to generate a C/C++ header
# for individual ASN1 Object IDs (OIDs) that are used in Weave
# TLV encodings (notably the Weave Certificate object).
#
from __future__ import absolute_import
from __future__ import print_function
import sys
def identity(n):
return n
# OID labels
ansi_X9_62 = identity
certicom = identity
characteristicTwo = identity
curve = identity
curves = identity
digest_algorithm = identity
dod = identity
ds = identity
enterprise = identity
organization = identity
internet = identity
iso = identity
itu_t = identity
joint_iso_ccitt = identity
keyType = identity
mechanisms = identity
member_body = identity
nest = identity
pkcs1 = identity
pkcs = identity
pkix = identity
prime = identity
private = identity
rsadsi = identity
schemes = identity
security = identity
signatures = identity
us = identity
weave = identity
# OID Categories
oidCategories = [
( "PubKeyAlgo", 0x0100 ),
( "SigAlgo", 0x0200 ),
( "AttributeType", 0x0300 ),
( "EllipticCurve", 0x0400 ),
( "Extension", 0x0500 ),
( "KeyPurpose", 0x0600 )
]
# Table of well-known ASN.1 object IDs
#
oids = [
# !!! WARNING !!!
#
# The enumerated values associated with individual object IDs are used in Weave TLV encodings (notably the Weave Certificate object).
# Because of this, the Enum Values assigned to object IDs in this table MUST NOT BE CHANGED once in use.
# Enum
# Category Name Value Object ID
# ----------------- -------------------------- -------- ------------------------------------------------------------------------------------------------
# Public Key Algorithms
( "PubKeyAlgo", "RSAEncryption", 1, [ iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), pkcs1(1), 1 ] ),
( "PubKeyAlgo", "ECPublicKey", 2, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), keyType(2), 1 ] ),
( "PubKeyAlgo", "ECDH", 3, [ iso(1), organization(3), certicom(132), schemes(1), 12 ] ),
( "PubKeyAlgo", "ECMQV", 4, [ iso(1), organization(3), certicom(132), schemes(1), 13 ] ),
# Signature Algorithms
# RFC 3279
( "SigAlgo", "MD2WithRSAEncryption", 1, [ iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), pkcs1(1), 2 ] ),
( "SigAlgo", "MD5WithRSAEncryption", 2, [ iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), pkcs1(1), 4 ] ),
( "SigAlgo", "SHA1WithRSAEncryption", 3, [ iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), pkcs1(1), 5 ] ),
( "SigAlgo", "ECDSAWithSHA1", 4, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), signatures(4), 1 ] ),
( "SigAlgo", "ECDSAWithSHA256", 5, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), signatures(4), 3, 2 ] ),
# RFC 4231
( "SigAlgo", "HMACWithSHA256", 6, [ iso(1), member_body(2), us(840), rsadsi(113549), digest_algorithm(2), 9 ] ),
# RFC 4055
( "SigAlgo", "SHA256WithRSAEncryption", 7, [ iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), pkcs1(1), 11 ] ),
# X.509 Distinguished Name Attribute Types
# WARNING -- Assign no values higher than 127.
( "AttributeType", "CommonName", 1, [ joint_iso_ccitt(2), ds(5), 4, 3 ] ),
( "AttributeType", "Surname", 2, [ joint_iso_ccitt(2), ds(5), 4, 4 ] ),
( "AttributeType", "SerialNumber", 3, [ joint_iso_ccitt(2), ds(5), 4, 5 ] ),
( "AttributeType", "CountryName", 4, [ joint_iso_ccitt(2), ds(5), 4, 6 ] ),
( "AttributeType", "LocalityName", 5, [ joint_iso_ccitt(2), ds(5), 4, 7 ] ),
( "AttributeType", "StateOrProvinceName", 6, [ joint_iso_ccitt(2), ds(5), 4, 8 ] ),
( "AttributeType", "OrganizationName", 7, [ joint_iso_ccitt(2), ds(5), 4, 10 ] ),
( "AttributeType", "OrganizationalUnitName", 8, [ joint_iso_ccitt(2), ds(5), 4, 11 ] ),
( "AttributeType", "Title", 9, [ joint_iso_ccitt(2), ds(5), 4, 12 ] ),
( "AttributeType", "Name", 10, [ joint_iso_ccitt(2), ds(5), 4, 41 ] ),
( "AttributeType", "GivenName", 11, [ joint_iso_ccitt(2), ds(5), 4, 42 ] ),
( "AttributeType", "Initials", 12, [ joint_iso_ccitt(2), ds(5), 4, 43 ] ),
( "AttributeType", "GenerationQualifier", 13, [ joint_iso_ccitt(2), ds(5), 4, 44 ] ),
( "AttributeType", "DNQualifier", 14, [ joint_iso_ccitt(2), ds(5), 4, 46 ] ),
( "AttributeType", "Pseudonym", 15, [ joint_iso_ccitt(2), ds(5), 4, 65 ] ),
( "AttributeType", "DomainComponent", 16, [ itu_t(0), 9, 2342, 19200300, 100, 1, 25 ] ),
( "AttributeType", "WeaveDeviceId", 17, [ iso(1), organization(3), dod(6), internet(1), private(4), enterprise(1), nest(41387), weave(1), 1 ] ),
( "AttributeType", "WeaveServiceEndpointId", 18, [ iso(1), organization(3), dod(6), internet(1), private(4), enterprise(1), nest(41387), weave(1), 2 ] ),
( "AttributeType", "WeaveCAId", 19, [ iso(1), organization(3), dod(6), internet(1), private(4), enterprise(1), nest(41387), weave(1), 3 ] ),
( "AttributeType", "WeaveSoftwarePublisherId",20, [ iso(1), organization(3), dod(6), internet(1), private(4), enterprise(1), nest(41387), weave(1), 4 ] ),
# Elliptic Curves
# NOTE: The enumeration values assigned here must match the values assigned to WeaveCurveIds.
( "EllipticCurve", "c2pnb163v1", 1, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 1 ] ),
( "EllipticCurve", "c2pnb163v2", 2, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 2 ] ),
( "EllipticCurve", "c2pnb163v3", 3, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 3 ] ),
( "EllipticCurve", "c2pnb176w1", 4, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 4 ] ),
( "EllipticCurve", "c2tnb191v1", 5, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 5 ] ),
( "EllipticCurve", "c2tnb191v2", 6, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 6 ] ),
( "EllipticCurve", "c2tnb191v3", 7, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 7 ] ),
( "EllipticCurve", "c2onb191v4", 8, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 8 ] ),
( "EllipticCurve", "c2onb191v5", 9, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 9 ] ),
( "EllipticCurve", "c2pnb208w1", 10, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 10 ] ),
( "EllipticCurve", "c2tnb239v1", 11, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 11 ] ),
( "EllipticCurve", "c2tnb239v2", 12, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 12 ] ),
( "EllipticCurve", "c2tnb239v3", 13, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 13 ] ),
( "EllipticCurve", "c2onb239v4", 14, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 14 ] ),
( "EllipticCurve", "c2onb239v5", 15, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 15 ] ),
( "EllipticCurve", "c2pnb272w1", 16, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 16 ] ),
( "EllipticCurve", "c2pnb304w1", 17, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 17 ] ),
( "EllipticCurve", "c2tnb359v1", 18, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 18 ] ),
( "EllipticCurve", "c2pnb368w1", 19, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 19 ] ),
( "EllipticCurve", "c2tnb431r1", 20, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), characteristicTwo(0), 20 ] ),
( "EllipticCurve", "prime192v1", 21, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 1 ] ),
( "EllipticCurve", "prime192v2", 22, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 2 ] ),
( "EllipticCurve", "prime192v3", 23, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 3 ] ),
( "EllipticCurve", "prime239v1", 24, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 4 ] ),
( "EllipticCurve", "prime239v2", 25, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 5 ] ),
( "EllipticCurve", "prime239v3", 26, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 6 ] ),
( "EllipticCurve", "prime256v1", 27, [ iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 7 ] ),
( "EllipticCurve", "secp112r1", 28, [ iso(1), organization(3), certicom(132), curve(0), 6 ] ),
( "EllipticCurve", "secp112r2", 29, [ iso(1), organization(3), certicom(132), curve(0), 7 ] ),
( "EllipticCurve", "secp128r1", 30, [ iso(1), organization(3), certicom(132), curve(0), 28 ] ),
( "EllipticCurve", "secp128r2", 31, [ iso(1), organization(3), certicom(132), curve(0), 29 ] ),
( "EllipticCurve", "secp160k1", 32, [ iso(1), organization(3), certicom(132), curve(0), 9 ] ),
( "EllipticCurve", "secp160r1", 33, [ iso(1), organization(3), certicom(132), curve(0), 8 ] ),
( "EllipticCurve", "secp160r2", 34, [ iso(1), organization(3), certicom(132), curve(0), 30 ] ),
( "EllipticCurve", "secp192k1", 35, [ iso(1), organization(3), certicom(132), curve(0), 31 ] ),
( "EllipticCurve", "secp224k1", 36, [ iso(1), organization(3), certicom(132), curve(0), 32 ] ),
( "EllipticCurve", "secp224r1", 37, [ iso(1), organization(3), certicom(132), curve(0), 33 ] ),
( "EllipticCurve", "secp256k1", 38, [ iso(1), organization(3), certicom(132), curve(0), 10 ] ),
( "EllipticCurve", "secp384r1", 39, [ iso(1), organization(3), certicom(132), curve(0), 34 ] ),
( "EllipticCurve", "secp521r1", 40, [ iso(1), organization(3), certicom(132), curve(0), 35 ] ),
( "EllipticCurve", "sect113r1", 41, [ iso(1), organization(3), certicom(132), curve(0), 4 ] ),
( "EllipticCurve", "sect113r2", 42, [ iso(1), organization(3), certicom(132), curve(0), 5 ] ),
( "EllipticCurve", "sect131r1", 43, [ iso(1), organization(3), certicom(132), curve(0), 22 ] ),
( "EllipticCurve", "sect131r2", 44, [ iso(1), organization(3), certicom(132), curve(0), 23 ] ),
( "EllipticCurve", "sect163k1", 45, [ iso(1), organization(3), certicom(132), curve(0), 1 ] ),
( "EllipticCurve", "sect163r1", 46, [ iso(1), organization(3), certicom(132), curve(0), 2 ] ),
( "EllipticCurve", "sect163r2", 47, [ iso(1), organization(3), certicom(132), curve(0), 15 ] ),
( "EllipticCurve", "sect193r1", 48, [ iso(1), organization(3), certicom(132), curve(0), 24 ] ),
( "EllipticCurve", "sect193r2", 49, [ iso(1), organization(3), certicom(132), curve(0), 25 ] ),
( "EllipticCurve", "sect233k1", 50, [ iso(1), organization(3), certicom(132), curve(0), 26 ] ),
( "EllipticCurve", "sect233r1", 51, [ iso(1), organization(3), certicom(132), curve(0), 27 ] ),
( "EllipticCurve", "sect239k1", 52, [ iso(1), organization(3), certicom(132), curve(0), 3 ] ),
( "EllipticCurve", "sect283k1", 53, [ iso(1), organization(3), certicom(132), curve(0), 16 ] ),
( "EllipticCurve", "sect283r1", 54, [ iso(1), organization(3), certicom(132), curve(0), 17 ] ),
( "EllipticCurve", "sect409k1", 55, [ iso(1), organization(3), certicom(132), curve(0), 36 ] ),
( "EllipticCurve", "sect409r1", 56, [ iso(1), organization(3), certicom(132), curve(0), 37 ] ),
( "EllipticCurve", "sect571k1", 57, [ iso(1), organization(3), certicom(132), curve(0), 38 ] ),
( "EllipticCurve", "sect571r1", 58, [ iso(1), organization(3), certicom(132), curve(0), 39 ] ),
# Certificate Extensions
( "Extension", "AuthorityKeyIdentifier", 1, [ joint_iso_ccitt(2), ds(5), 29, 35 ] ),
( "Extension", "SubjectKeyIdentifier", 2, [ joint_iso_ccitt(2), ds(5), 29, 14 ] ),
( "Extension", "KeyUsage", 3, [ joint_iso_ccitt(2), ds(5), 29, 15 ] ),
( "Extension", "BasicConstraints", 4, [ joint_iso_ccitt(2), ds(5), 29, 19 ] ),
( "Extension", "ExtendedKeyUsage", 5, [ joint_iso_ccitt(2), ds(5), 29, 37 ] ),
# Key Purposes
( "KeyPurpose", "ServerAuth", 1, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 1 ] ),
( "KeyPurpose", "ClientAuth", 2, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 2 ] ),
( "KeyPurpose", "CodeSigning", 3, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 3 ] ),
( "KeyPurpose", "EmailProtection", 4, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 4 ] ),
( "KeyPurpose", "TimeStamping", 5, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 8 ] ),
( "KeyPurpose", "OCSPSigning", 6, [ iso(1), organization(3), dod(6), internet(1), security(5), mechanisms(5), pkix(7), 3, 9 ] ),
]
def encodeOID(oid):
assert len(oid) >= 2
oid = [ (oid[0]*40 + oid[1]) ] + oid[2:]
encodedOID = []
for val in oid:
val, byte = divmod(val, 128)
seg = [ byte ]
while val > 0:
val, byte = divmod(val, 128)
seg.insert(0, byte + 0x80)
encodedOID += (seg)
return encodedOID
print("/*")
print(" *")
print(" * Copyright (c) 2019 Google LLC.")
print(" * Copyright (c) 2013-2017 Nest Labs, Inc.")
print(" * All rights reserved.")
print(" *")
print(" * Licensed under the Apache License, Version 2.0 (the \"License\");")
print(" * you may not use this file except in compliance with the License.")
print(" * You may obtain a copy of the License at")
print(" *")
print(" * http://www.apache.org/licenses/LICENSE-2.0")
print(" *")
print(" * Unless required by applicable law or agreed to in writing, software")
print(" * distributed under the License is distributed on an \"AS IS\" BASIS,")
print(" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.")
print(" * See the License for the specific language governing permissions and")
print(" * limitations under the License.")
print(" *")
print(" */")
print("")
print("/**")
print(" * @file")
print(" * ASN.1 Object ID Definitions")
print(" *")
print(" * !!! WARNING !!! WARNING !!! WARNING !!!")
print(" *")
print(" * DO NOT EDIT THIS FILE! This file is generated by the")
print(" * gen-oid-table.py script.")
print(" *")
print(" * To make changes, edit the script and re-run it to generate")
print(" * this file.")
print(" *")
print(" */")
print("")
print("#ifndef ASN1OID_H_")
print("#define ASN1OID_H_")
print("")
print("enum OIDCategory")
print("{")
for (catName, catEnum) in oidCategories:
print(" kOIDCategory_%s = 0x%04X," % (catName, catEnum))
print("")
print(" kOIDCategory_NotSpecified = 0,")
print(" kOIDCategory_Unknown = 0x0F00,")
print(" kOIDCategory_Mask = 0x0F00")
print("};")
print("")
print("typedef uint16_t OID;")
print("")
print("enum")
print("{")
for (catName, catEnum) in oidCategories:
for (oidCatName, oidName, oidEnum, oid) in oids:
if (oidCatName == catName):
print(" kOID_%s_%s = 0x%04X," % (catName, oidName, catEnum + oidEnum))
print("")
print(" kOID_NotSpecified = 0,")
print(" kOID_Unknown = 0xFFFF,")
print(" kOID_Mask = 0x00FF")
print("};")
print("")
print("struct OIDTableEntry")
print("{")
print(" OID EnumVal;")
print(" const uint8_t *EncodedOID;")
print(" uint16_t EncodedOIDLen;")
print("};")
print("")
print("struct OIDNameTableEntry")
print("{")
print(" OID EnumVal;")
print(" const char *Name;")
print("};")
print("")
print("extern const OIDTableEntry sOIDTable[];")
print("extern const OIDNameTableEntry sOIDNameTable[];")
print("extern const size_t sOIDTableSize;")
print("")
print("#ifdef ASN1_DEFINE_OID_TABLE")
print("")
for (catName, oidName, oidEnum, oid) in oids:
print("static const uint8_t sOID_%s_%s[] = { %s };" % (catName, oidName, ", ".join([ "0x%02X" % (x) for x in encodeOID(oid) ])))
print("")
print("const OIDTableEntry sOIDTable[] =")
print("{")
oidTableSize = 0
for (catName, oidName, oidEnum, oid) in oids:
print(" { kOID_%s_%s, sOID_%s_%s, sizeof(sOID_%s_%s) }," % (catName, oidName, catName, oidName, catName, oidName))
oidTableSize += 1
print(" { kOID_NotSpecified, NULL, 0 }")
print("};")
print("")
print("const size_t sOIDTableSize = %d;" % (oidTableSize))
print("")
print("#endif // ASN1_DEFINE_OID_TABLE")
print("")
print("#ifdef ASN1_DEFINE_OID_NAME_TABLE")
print("")
print("const OIDNameTableEntry sOIDNameTable[] =")
print("{")
for (catName, oidName, oidEnum, oid) in oids:
print(" { kOID_%s_%s, \"%s\" }," % (catName, oidName, oidName))
print(" { kOID_NotSpecified, NULL }")
print("};")
print("")
print("#endif // ASN1_DEFINE_OID_NAME_TABLE")
print("")
print("")
print("#endif // ASN1OID_H_")