blob: e4c9943b68d2c2469d9031e98d1a2a92244c4edd [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (c) 2020-2022 Project CHIP Authors
# Copyright (c) 2019 Google LLC.
# 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 Matter
# TLV encodings (notably the Matter Certificate object).
#
from __future__ import absolute_import
from __future__ import print_function
import optparse
import sys
def identity(n):
return n
# OID labels
ansi_X9_62 = identity
certicom = identity
characteristicTwo = identity
matter = 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
pkcs1 = identity
pkcs = identity
pkix = identity
prime = identity
private = identity
rsadsi = identity
schemes = identity
security = identity
signatures = identity
us = identity
zigbee = 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 Matter TLV encodings (notably the Matter 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", "ECPublicKey", 1, [
iso(1), member_body(2), us(840), ansi_X9_62(10045), keyType(2), 1]),
# Signature Algorithms
# RFC 3279
("SigAlgo", "ECDSAWithSHA256", 1, [
iso(1), member_body(2), us(840), ansi_X9_62(10045), signatures(4), 3, 2]),
# 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", "MatterNodeId", 17, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 1]),
("AttributeType", "MatterFirmwareSigningId", 18, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 2]),
("AttributeType", "MatterICACId", 19, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 3]),
("AttributeType", "MatterRCACId", 20, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 4]),
("AttributeType", "MatterFabricId", 21, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 5]),
("AttributeType", "MatterCASEAuthTag", 22, [iso(1), organization(
3), dod(6), internet(1), private(4), enterprise(1), zigbee(37244), matter(1), 6]),
# Elliptic Curves
("EllipticCurve", "prime256v1", 1, [
iso(1), member_body(2), us(840), ansi_X9_62(10045), curves(3), prime(1), 7]),
# Certificate Extensions
("Extension", "BasicConstraints",
1, [joint_iso_ccitt(2), ds(5), 29, 19]),
("Extension", "KeyUsage", 2,
[joint_iso_ccitt(2), ds(5), 29, 15]),
("Extension", "ExtendedKeyUsage",
3, [joint_iso_ccitt(2), ds(5), 29, 37]),
("Extension", "SubjectKeyIdentifier",
4, [joint_iso_ccitt(2), ds(5), 29, 14]),
("Extension", "AuthorityKeyIdentifier",
5, [joint_iso_ccitt(2), ds(5), 29, 35]),
("Extension", "CSRRequest",
6, [iso(1), member_body(2), us(840), rsadsi(113549), pkcs(1), 9, 14]),
# 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
TEMPLATE = '''/*
*
* Copyright (c) 2020-2022 Project CHIP Authors
* Copyright (c) 2019 Google LLC.
* 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
* ASN.1 Object ID Definitions
*
* !!! WARNING !!! WARNING !!! WARNING !!!
*
* DO NOT EDIT THIS FILE! This file is generated by the
* gen-oid-table.py script.
*
* To make changes, edit the script and re-run it to generate
* this file.
*
*/
#pragma once
#include <cstdint>
#include <cstddef>
namespace chip {
namespace ASN1 {
enum OIDCategory
%(oid_category_enums)s
typedef uint16_t OID;
enum
%(oid_enums)s
struct OIDTableEntry
{
OID EnumVal;
const uint8_t *EncodedOID;
uint16_t EncodedOIDLen;
};
struct OIDNameTableEntry
{
OID EnumVal;
const char *Name;
};
extern const OIDTableEntry sOIDTable[];
extern const OIDNameTableEntry sOIDNameTable[];
extern const size_t sOIDTableSize;
#ifdef ASN1_DEFINE_OID_TABLE
%(oid_utf8_strings)s
const OIDTableEntry sOIDTable[] =
%(oid_table)s
const size_t sOIDTableSize = sizeof(sOIDTable) / sizeof(OIDTableEntry);
#endif // ASN1_DEFINE_OID_TABLE
#ifdef ASN1_DEFINE_OID_NAME_TABLE
const OIDNameTableEntry sOIDNameTable[] =
%(oid_name_table)s
#endif // ASN1_DEFINE_OID_NAME_TABLE
} // namespace ASN1
} // namespace chip
'''
oid_category_enums = "{\n"
for (catName, catEnum) in oidCategories:
oid_category_enums += " kOIDCategory_%s = 0x%04X,\n" % (
catName, catEnum)
oid_category_enums += '''
kOIDCategory_NotSpecified = 0,
kOIDCategory_Unknown = 0x0F00,
kOIDCategory_Mask = 0x0F00
};'''
oid_enums = "{\n"
for (catName, catEnum) in oidCategories:
for (oidCatName, oidName, oidEnum, oid) in oids:
if (oidCatName == catName):
oid_enums += " kOID_%s_%s = 0x%04X,\n" % (
catName, oidName, catEnum + oidEnum)
oid_enums += "\n"
oid_enums += ''' kOID_NotSpecified = 0,
kOID_Unknown = 0xFFFF,
kOID_EnumMask = 0x00FF
};'''
oid_utf8_strings = "\n"
for (catName, oidName, oidEnum, oid) in oids:
oid_utf8_strings += "static const uint8_t sOID_%s_%s[] = { %s };\n" % (
catName, oidName, ", ".join(["0x%02X" % (x) for x in encodeOID(oid)]))
oid_table = "{\n"
for (catName, oidName, oidEnum, oid) in oids:
oid_table += " { kOID_%s_%s, sOID_%s_%s, sizeof(sOID_%s_%s) },\n" % (
catName, oidName, catName, oidName, catName, oidName)
oid_table += " { kOID_NotSpecified, NULL, 0 }\n};"
oid_name_table = "{\n"
for (catName, oidName, oidEnum, oid) in oids:
oid_name_table += " { kOID_%s_%s, \"%s\" },\n" % (
catName, oidName, oidName)
oid_name_table += " { kOID_NotSpecified, NULL }\n};"
def main(argv):
parser = optparse.OptionParser()
parser.add_option('--output_file')
options, _ = parser.parse_args(argv)
template_args = {
'oid_category_enums': oid_category_enums,
'oid_enums': oid_enums,
'oid_utf8_strings': oid_utf8_strings,
'oid_table': oid_table,
'oid_name_table': oid_name_table,
}
with open(options.output_file, 'w') as asn1oid_file:
asn1oid_file.write(TEMPLATE % template_args)
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))