Certificate¶
Since signature verification is a common operation in NDN applications, it is important to define a common certificate format to standardize the public key authentication procedure. As every NDN data packet is signed, a data packet that carries a public key as content is conceptually a certificate. However, the specification of a data packet alone is not sufficient to serve as the specification of a common NDN certificate format, because additional provisions are required for the latter. For example, a certificate follows a specific naming scheme and may need to include validity period, revocation information, etc. This section defines the naming and structure of NDN certificates.
Structure of an NDN certificate
+--------------------------+
| Name |
+--------------------------+
| MetaInfo |
|+------------------------+|
|| ContentType: KEY(2) ||
|+------------------------+|
|+------------------------+|
|| FreshnessPeriod: ~1h ||
|+------------------------+|
+--------------------------+
| Content |
|+------------------------+|
|| Public Key ||
|+------------------------+|
+--------------------------+
| SignatureInfo |
|+------------------------+|
|| SignatureType: ... ||
|| KeyLocator: ... ||
|| ValidityPeriod: ... ||
|| ... ||
|+------------------------+|
+--------------------------+
| SignatureValue |
+--------------------------+
Certificate = DATA-TYPE TLV-LENGTH
Name ; /<IdentityName>/KEY/<KeyId>/<IssuerId>/<Version>
MetaInfo ; ContentType == KEY, FreshnessPeriod required
CertificateContent
CertificateSignatureInfo
SignatureValue
CertificateContent = CONTENT-TYPE TLV-LENGTH SubjectPublicKeyInfo
CertificateSignatureInfo = SIGNATURE-INFO-TYPE TLV-LENGTH
SignatureType
KeyLocator
ValidityPeriod
*CertificateExtension
Name¶
The name of a certificate consists of five parts as shown below:
/<IdentityName>/KEY/<KeyId>/<IssuerId>/<Version>
A certificate name starts with the name of the identity to which the public key is
bound. The identity is followed by a literal KEY
GenericNameComponent and by
the KeyId, IssuerId, and Version components.
KeyId is an opaque name component that identifies an instance of the public key in the certificate namespace. The value of KeyId is controlled by the namespace owner and can be an 8-byte random number, the SHA-256 digest of the certificate’s public key, a timestamp, or any other unique numerical identifier.
IssuerId is an opaque name component that identifies the issuer of the certificate. The value is controlled by the certificate issuer and, similar to KeyId, can be an 8-byte random number, the SHA-256 digest of the issuer’s public key, or any other free-form identifier.
Version represents the version number of the certificate. This component is encoded as a VersionNameComponent, following either revision 1 (marker-based) or revision 3 (type-based) of the NDN naming conventions.
For example:
/edu/ucla/cs/yingdi/KEY/%03%CD...%F1/%9F%D3...%B7/v=1617592200702
\_________________/ \___________/\___________/\______________/
Identity Name KeyId IssuerId Version
MetaInfo¶
The ContentType
must be set to KEY
(2).
The FreshnessPeriod
must be explicitly specified. The recommended value is 3,600,000 (1 hour).
Content¶
The Content
element of a certificate contains the actual bits of the public key, formatted as
a DER-encoded SubjectPublicKeyInfo structure.
SignatureInfo¶
The SignatureInfo
element of a certificate is required to include a ValidityPeriod
element.
ValidityPeriod
contains two TLV sub-elements: NotBefore
and NotAfter
, each
carrying a UTC timestamp in ISO 8601-1:2019 compact format without the final “Z” character
(“YYYYMMDDThhmmss”, e.g., “20201231T235959”). NotBefore
indicates when the certificate
takes effect while NotAfter
indicates when the certificate expires.
ValidityPeriod = VALIDITY-PERIOD-TYPE TLV-LENGTH
NotBefore
NotAfter
NotBefore = NOT-BEFORE-TYPE TLV-LENGTH IsoDate "T" IsoTime
NotAfter = NOT-AFTER-TYPE TLV-LENGTH IsoDate "T" IsoTime
IsoDate = 8DIGIT ; YYYYMMDD (UTC)
IsoTime = 6DIGIT ; hhmmss (UTC)
Extensions¶
A certificate may carry zero or more extension fields in its SignatureInfo
element.
An extension can be either critical or non-critical depending on its TLV-TYPE number. A critical TLV-TYPE means that if a validator cannot recognize or parse the extension, the validator must reject the whole certificate. Conversely, an extension with a non-critical TLV-TYPE may be ignored by the validator if it is not recognized. Refer to the general evolvability rules to determine whether a TLV-TYPE is critical or not.
The TLV-TYPE number range [256, 511] is reserved for extensions. This document currently
defines one extension: AdditionalDescription
.
CertificateExtension = AdditionalDescription
AdditionalDescription¶
AdditionalDescription
is a non-critical extension that provides additional
information about the certificate. The information is expressed as a set of
key-value pairs. Both key and value are UTF-8 strings, e.g.,
("Organization", "UCLA")
. The issuer of a certificate can specify arbitrary
key-value pairs to provide further details about the certificate.
AdditionalDescription = ADDITIONAL-DESCRIPTION-TYPE TLV-LENGTH
1*DescriptionEntry
DescriptionEntry = DESCRIPTION-ENTRY-TYPE TLV-LENGTH
DescriptionKey
DescriptionValue
DescriptionKey = DESCRIPTION-KEY-TYPE TLV-LENGTH 1*OCTET
DescriptionValue = DESCRIPTION-VALUE-TYPE TLV-LENGTH 1*OCTET