-- $Id$ --

PKINIT DEFINITIONS ::= BEGIN

IMPORTS EncryptionKey, PrincipalName, Realm, KerberosTime, Checksum FROM krb5
	IssuerAndSerialNumber FROM cms
	SubjectPublicKeyInfo, AlgorithmIdentifier FROM rfc2459
	HEIM_ANY FROM heim;

id-pkinit OBJECT IDENTIFIER ::=
  { iso (1) org (3) dod (6) internet (1) security (5)
    kerberosv5 (2) pkinit (3) }

id-pkauthdata  OBJECT IDENTIFIER  ::= { id-pkinit 1 }
id-pkdhkeydata OBJECT IDENTIFIER  ::= { id-pkinit 2 }
id-pkrkeydata  OBJECT IDENTIFIER  ::= { id-pkinit 3 }
id-pkekuoid    OBJECT IDENTIFIER  ::= { id-pkinit 4 }
id-pkkdcekuoid OBJECT IDENTIFIER  ::= { id-pkinit 5 }

id-heim-eku-pkinit-certlife-is-max-life OBJECT IDENTIFIER ::=
    { iso(1) member-body(2) se(752) su(43) heim-pkix(16) 3 }

id-apple-system-id OBJECT IDENTIFIER ::= { 1 2 840 113635 100 4 4 }

id-pkinit-kdf OBJECT IDENTIFIER           ::= { id-pkinit 6 }
id-pkinit-kdf-ah-sha1 OBJECT IDENTIFIER   ::= { id-pkinit-kdf 1 }
id-pkinit-kdf-ah-sha256 OBJECT IDENTIFIER ::= { id-pkinit-kdf 2 }
id-pkinit-kdf-ah-sha512 OBJECT IDENTIFIER ::= { id-pkinit-kdf 3 }
id-pkinit-kdf-ah-sha384 OBJECT IDENTIFIER ::= { id-pkinit-kdf 4 }

id-pkinit-san	OBJECT IDENTIFIER ::=
  { iso(1) org(3) dod(6) internet(1) security(5) kerberosv5(2)
    x509-sanan(2) }

id-pkinit-ms-eku OBJECT IDENTIFIER ::=
  { iso(1) org(3) dod(6) internet(1) private(4)
    enterprise(1) microsoft(311) 20 2 2 }

id-pkinit-ms-san OBJECT IDENTIFIER ::=
  { iso(1) org(3) dod(6) internet(1) private(4)
    enterprise(1) microsoft(311) 20 2 3 }

MS-UPN-SAN ::= UTF8String

pa-pk-as-req INTEGER ::=                  16
pa-pk-as-rep INTEGER ::=                  17

td-trusted-certifiers INTEGER ::=        104
td-invalid-certificates INTEGER ::=      105
td-dh-parameters INTEGER ::=             109

DHNonce ::= OCTET STRING

KDFAlgorithmId ::= SEQUENCE {
       kdf-id            [0] OBJECT IDENTIFIER,
       ...
}

TrustedCA ::= SEQUENCE {
	caName                  [0] IMPLICIT OCTET STRING,
	certificateSerialNumber [1] INTEGER OPTIONAL,
	subjectKeyIdentifier    [2] OCTET STRING OPTIONAL,
	...
}

ExternalPrincipalIdentifier ::= SEQUENCE {
	subjectName		[0] IMPLICIT OCTET STRING OPTIONAL,
	issuerAndSerialNumber	[1] IMPLICIT OCTET STRING OPTIONAL,
	subjectKeyIdentifier	[2] IMPLICIT OCTET STRING OPTIONAL,
	...
}

ExternalPrincipalIdentifiers ::= SEQUENCE OF ExternalPrincipalIdentifier

PA-PK-AS-REQ ::= SEQUENCE {
        signedAuthPack          [0] IMPLICIT OCTET STRING,
        trustedCertifiers       [1] ExternalPrincipalIdentifiers OPTIONAL,
	kdcPkId                 [2] IMPLICIT OCTET STRING OPTIONAL,
	...
}

PKAuthenticator ::= SEQUENCE {
	cusec                   [0] INTEGER -- (0..999999) --,
	ctime                   [1] KerberosTime,
	nonce                   [2] INTEGER (0..4294967295),
	paChecksum              [3] OCTET STRING OPTIONAL,
	...
}

SupportedKDFs ::= SEQUENCE OF KDFAlgorithmId

AuthPack ::= SEQUENCE {
	pkAuthenticator         [0] PKAuthenticator,
	clientPublicValue       [1] SubjectPublicKeyInfo OPTIONAL,
	supportedCMSTypes       [2] SEQUENCE OF AlgorithmIdentifier OPTIONAL,
	clientDHNonce           [3] DHNonce OPTIONAL,
	...,
	supportedKDFs		[4] SupportedKDFs OPTIONAL,
	...
}

TD-TRUSTED-CERTIFIERS ::= ExternalPrincipalIdentifiers
TD-INVALID-CERTIFICATES ::= ExternalPrincipalIdentifiers

AD-INITIAL-VERIFIED-CAS ::= SEQUENCE OF ExternalPrincipalIdentifier

DHRepInfo ::= SEQUENCE {
	dhSignedData            [0] IMPLICIT OCTET STRING,
	serverDHNonce           [1] DHNonce OPTIONAL,
	...,
	kdf			[2] KDFAlgorithmId OPTIONAL,
	...
}

PA-PK-AS-REP ::= CHOICE {
	dhInfo                  [0] DHRepInfo,
	encKeyPack              [1] IMPLICIT OCTET STRING,
	...
}

KDCDHKeyInfo ::= SEQUENCE {
	subjectPublicKey        [0] BIT STRING,
	nonce                   [1] INTEGER (0..4294967295),
	dhKeyExpiration         [2] KerberosTime OPTIONAL,
	...
}

ReplyKeyPack ::= SEQUENCE {
	replyKey                [0] EncryptionKey,
	asChecksum		[1] Checksum,
	...
}

TD-DH-PARAMETERS ::= SEQUENCE OF AlgorithmIdentifier

-- No need for this one since it's the same as TD-DH-PARAMETERS:
-- TD-CMS-DIGEST-ALGORITHMS-DATA ::= SEQUENCE OF AlgorithmIdentifier


-- Windows compat glue --

PKAuthenticator-Win2k ::= SEQUENCE {
	kdcName			[0] PrincipalName,
	kdcRealm		[1] Realm,
	cusec			[2] INTEGER (0..4294967295),
	ctime			[3] KerberosTime,
	nonce                   [4] INTEGER (-2147483648..2147483647)
}

AuthPack-Win2k ::= SEQUENCE {
	pkAuthenticator         [0] PKAuthenticator-Win2k,
	clientPublicValue       [1] SubjectPublicKeyInfo OPTIONAL
}


TrustedCA-Win2k ::= CHOICE {
	caName                  [1] HEIM_ANY,
	issuerAndSerial         [2] IssuerAndSerialNumber
}

PA-PK-AS-REQ-Win2k ::= SEQUENCE {
	signed-auth-pack	[0] IMPLICIT OCTET STRING,
	trusted-certifiers	[2] SEQUENCE OF TrustedCA-Win2k OPTIONAL,
	kdc-cert		[3] IMPLICIT OCTET STRING OPTIONAL,
	encryption-cert		[4] IMPLICIT OCTET STRING OPTIONAL
}

PA-PK-AS-REP-Win2k ::= CHOICE {
	dhSignedData		[0] IMPLICIT OCTET STRING,
	encKeyPack		[1] IMPLICIT OCTET STRING
}

KDCDHKeyInfo-Win2k ::= SEQUENCE {
	nonce			[0] INTEGER (-2147483648..2147483647),
	subjectPublicKey	[2] BIT STRING
}

ReplyKeyPack-Win2k ::= SEQUENCE {
        replyKey                [0] EncryptionKey,
        nonce                   [1] INTEGER (-2147483648..2147483647),
	...
}

PA-PK-AS-REP-BTMM ::= SEQUENCE {
	dhSignedData		[0] HEIM_ANY OPTIONAL,
	encKeyPack		[1] HEIM_ANY OPTIONAL
}


PkinitSP80056AOtherInfo ::= SEQUENCE {
	algorithmID   AlgorithmIdentifier,
	partyUInfo     [0] OCTET STRING,
	partyVInfo     [1] OCTET STRING,
	suppPubInfo    [2] OCTET STRING OPTIONAL,
	suppPrivInfo   [3] OCTET STRING OPTIONAL
}

PkinitSuppPubInfo ::= SEQUENCE {
       enctype           [0] INTEGER (-2147483648..2147483647),
       as-REQ            [1] OCTET STRING,
       pk-as-rep         [2] OCTET STRING,
       -- ticket         [3] Ticket, (removed prior to publication of RFC 8636)
       ...
}

END
