3.2. Structure de l'horodatage de certificat signé
3.2. Structure de l'horodatage de certificat signé
enum { certificate_timestamp(0), tree_hash(1), (255) }
SignatureType;
enum { v1(0), (255) }
Version;
struct {
opaque key_id[32];
} LogID;
opaque TBSCertificate<1..2^24-1>;
struct {
opaque issuer_key_hash[32];
TBSCertificate tbs_certificate;
} PreCert;
opaque CtExtensions<0..2^16-1>;
"key_id" est le hachage SHA-256 de la clé publique du journal, calculé sur l'encodage DER de la clé représentée comme SubjectPublicKeyInfo.
"issuer_key_hash" est le hachage SHA-256 de la clé publique de l'émetteur du certificat, calculé sur l'encodage DER de la clé représentée comme SubjectPublicKeyInfo. Ceci est nécessaire pour lier l'émetteur au certificat final.
"tbs_certificate" est le composant TBSCertificate encodé en DER (voir [RFC5280]) du Précertificat -- c'est-à-dire, sans la signature et l'extension de poison. Si le Précertificat n'est pas signé avec le certificat AC qui émettra le certificat final, alors le TBSCertificate a également son émetteur changé en celui de l'AC qui émettra le certificat final. Notez qu'il est également possible de reconstruire ce TBSCertificate à partir du certificat final en extrayant le TBSCertificate de celui-ci et en supprimant l'extension SCT. Notez également que puisque le TBSCertificate contient un AlgorithmIdentifier qui doit correspondre à la fois à l'algorithme de signature du Précertificat et à l'algorithme de signature du certificat final, ils doivent être signés avec le même algorithme et les mêmes paramètres. Si le Précertificat est émis en utilisant un Certificat de Signature de Précertificat et qu'une extension Authority Key Identifier est présente dans le TBSCertificate, l'extension correspondante doit également être présente dans le Certificat de Signature de Précertificat -- dans ce cas, le TBSCertificate a également son Authority Key Identifier changé pour correspondre à l'émetteur final.
struct {
Version sct_version;
LogID id;
uint64 timestamp;
CtExtensions extensions;
digitally-signed struct {
Version sct_version;
SignatureType signature_type = certificate_timestamp;
uint64 timestamp;
LogEntryType entry_type;
select(entry_type) {
case x509_entry: ASN.1Cert;
case precert_entry: PreCert;
} signed_entry;
CtExtensions extensions;
};
} SignedCertificateTimestamp;
L'encodage de l'élément digitally-signed est défini dans [RFC5246].
"sct_version" est la version du protocole à laquelle le SCT est conforme. Cette version est v1.
"timestamp" est le temps NTP actuel [RFC5905], mesuré depuis l'époque (1er janvier 1970, 00:00), ignorant les secondes intercalaires, en millisecondes.
"entry_type" peut être implicite du contexte dans lequel le SCT est présenté.
"signed_entry" est le "leaf_certificate" (dans le cas d'un X509ChainEntry) ou est le PreCert (dans le cas d'un PrecertChainEntry), comme décrit ci-dessus.
"extensions" sont les extensions futures de cette version de protocole (v1). Actuellement, aucune extension n'est spécifiée.