PKCS-15 {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1)
         pkcs-15(15) modules(1) pkcs-15(1)} 

-- $Revision: 1.7 $ --

DEFINITIONS IMPLICIT TAGS ::=

BEGIN

IMPORTS

informationFramework, authenticationFramework, certificateExtensions
        FROM UsefulDefinitions {joint-iso-itu-t(2) ds(5) module(1)
                                usefulDefinitions(0) 3} 

Name, Attribute
        FROM InformationFramework informationFramework

Certificate, AttributeCertificate, CertificateSerialNumber,
        SubjectPublicKeyInfo
        FROM AuthenticationFramework authenticationFramework

GeneralNames, KeyUsage
        FROM CertificateExtensions certificateExtensions

RecipientInfos, RecipientInfo, OriginatorInfo, sha-1,
	id-alg-CMS3DESwrap, id-alg-CMSRC2wrap, hMAC-SHA1, des-ede3-cbc
	FROM CryptographicMessageSyntax {iso(1) member-body(2)
	us(840) rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) modules(0)
	cms(1)}

RSAPublicKey
	FROM PKCS-1 {iso(1) member-body(2) us(840) rsadsi(113549)
	pkcs(1) pkcs-1(1) modules(0) pkcs-1(1)} 

AlgorithmIdentifier, SupportingAlgorithms, PBKDF2Algorithms,
	ALGORITHM-IDENTIFIER, id-hmacWithSHA1
	FROM PKCS-5 {iso(1) member-body(2) us(840) rsadsi(113549)
	pkcs(1) pkcs-5(5) modules(16) pkcs-5(1)} 

ECPoint, Parameters
        FROM ANSI-X9-62 {iso(1) member-body(2) us(840)
        ansi-x962(10045) module(4) 1} 

DiffieHellmanPublicNumber, DomainParameters
        FROM ANSI-X9-42 {iso(1) member-body(2) us(840)
        ansi-x942(10046) module(5) 1}

OOBCertHash
        FROM PKIXCMP {iso(1) identified-organization(3) dod(6)
        internet(1) security(5) mechanisms(5) pkix(7) id-mod(0)
        id-mod-cmp(9)};

-- Constants

pkcs15-ub-identifier          INTEGER ::= 255
pkcs15-ub-reference           INTEGER ::= 255
pkcs15-ub-index               INTEGER ::= 65535
pkcs15-ub-label               INTEGER ::= pkcs15-ub-identifier
pkcs15-lb-minPinLength        INTEGER ::= 4
pkcs15-ub-minPinLength        INTEGER ::= 8
pkcs15-ub-storedPinLength     INTEGER ::= 64
pkcs15-ub-recordLength        INTEGER ::= 16383
pkcs15-ub-userConsent         INTEGER ::= 15
pkcs15-ub-securityConditions  INTEGER ::= 255
pkcs15-ub-seInfo              INTEGER ::= 255

-- Object Identifiers

pkcs15 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840)
                               rsadsi(113549) pkcs(1) pkcs-15(15)}
pkcs15-mo OBJECT IDENTIFIER ::= {pkcs15 1} -- Modules branch
pkcs15-at OBJECT IDENTIFIER ::= {pkcs15 2} -- Attribute branch
pkcs15-ct OBJECT IDENTIFIER ::= {pkcs15 3} -- Content type branch

-- Content Types

pkcs15-ct-PKCS15Token OBJECT IDENTIFIER ::= {pkcs15-ct 1}

-- Basic types

Identifier ::= OCTET STRING (SIZE (0..pkcs15-ub-identifier))

Reference ::= INTEGER (0..pkcs15-ub-reference)

Label ::= UTF8String (SIZE(0..pkcs15-ub-label))

KEY-IDENTIFIER ::= CLASS {
    &id  INTEGER UNIQUE,
    &Value
} WITH SYNTAX {
    SYNTAX &Value IDENTIFIED BY &id
}

CredentialIdentifier {KEY-IDENTIFIER : IdentifierSet} ::= SEQUENCE {
    idType  KEY-IDENTIFIER.&id ({IdentifierSet}),
    idValue KEY-IDENTIFIER.&Value ({IdentifierSet}{@idType})
}

KeyIdentifiers KEY-IDENTIFIER ::= {
    issuerAndSerialNumber|
    issuerAndSerialNumberHash|
    subjectKeyId|
    subjectKeyHash |
    issuerKeyHash |
    issuerNameHash |
    subjectNameHash,
    ...
}

issuerAndSerialNumber KEY-IDENTIFIER::= 
        {SYNTAX PKCS15-OPAQUE.&Type IDENTIFIED BY 1}
        -- As defined in RFC 2630
subjectKeyId KEY-IDENTIFIER ::= 
        {SYNTAX OCTET STRING IDENTIFIED BY 2}
        -- From x509v3 certificate extension
issuerAndSerialNumberHash KEY-IDENTIFIER ::= 
        {SYNTAX OCTET STRING IDENTIFIED BY 3}
        -- Assumes SHA-1 hash of DER encoding of IssuerAndSerialNumber
subjectKeyHash KEY-IDENTIFIER ::= 
        {SYNTAX OCTET STRING IDENTIFIED BY 4}
issuerKeyHash KEY-IDENTIFIER ::= 
        {SYNTAX OCTET STRING IDENTIFIED BY 5}
issuerNameHash KEY-IDENTIFIER ::=
	{SYNTAX OCTET STRING IDENTIFIED BY 6}
	-- SHA-1 hash of DER-encoded issuer name
subjectNameHash KEY-IDENTIFIER ::=
        {SYNTAX OCTET STRING IDENTIFIED BY 7}
	-- SHA-1 hash of DER-encoded subject name

ReferencedValue {Type} ::= CHOICE {
    path	Path,
    url		URL
} (CONSTRAINED BY {-- 'path' or 'url' shall point to an object of
   -- type -- Type}) 

URL ::= CHOICE {
    url		PrintableString,
    urlWithDigest [3] SEQUENCE {
    	url	IA5String,
    	digest	DigestInfoWithDefault
    	}
}

alg-id-sha1 AlgorithmIdentifier {{DigestAlgorithms}} ::= {
    algorithm  sha-1, 
    parameters SHA1Parameters : NULL} 

SHA1Parameters ::= NULL

DigestInfoWithDefault ::= SEQUENCE {
    digestAlg	AlgorithmIdentifier {{DigestAlgorithms}} DEFAULT alg-id-sha1,
    digest	OCTET STRING (SIZE(8..128))
}

Path ::= SEQUENCE {
    path 	OCTET STRING,
    index  	INTEGER (0..pkcs15-ub-index) OPTIONAL,
    length 	[0] INTEGER (0..pkcs15-ub-index) OPTIONAL
    }( WITH COMPONENTS {..., index PRESENT, length PRESENT}| 
       WITH COMPONENTS {..., index ABSENT, length ABSENT})

ObjectValue { Type } ::= CHOICE {
    indirect 	        ReferencedValue {Type},
    direct 	        [0] Type,
    indirect-protected	[1] ReferencedValue {EnvelopedData {Type}},
    direct-protected	[2] EnvelopedData {Type}
    }(CONSTRAINED BY {-- if indirection is being used, then it is
    -- expected that the reference points either to a (possibly
    -- enveloped) object of type -- Type -- or (key case) to a card- 
    -- specific key file --})

PathOrObjects {ObjectType} ::= CHOICE {
    path  	Path,
    objects  	[0] SEQUENCE OF ObjectType,
    ...,
    indirect-protected [1] ReferencedValue {EnvelopedData {SEQUENCE OF ObjectType}},
    direct-protected [2] EnvelopedData {SEQUENCE OF ObjectType}
    }

CommonObjectAttributes ::= SEQUENCE {
    label		Label OPTIONAL,
    flags  		CommonObjectFlags OPTIONAL,
    authId 		Identifier OPTIONAL,
    ...,
    userConsent 	INTEGER (1..pkcs15-ub-userConsent) OPTIONAL,
    accessControlRules	SEQUENCE SIZE (1..MAX) OF AccessControlRule OPTIONAL
} (CONSTRAINED BY {-- authId should be present in the IC card case if
    -- flags.private is set. It must equal an authID in one AuthRecord
    -- in the AODF -- }) 

CommonObjectFlags ::= BIT STRING {
    private	(0),
    modifiable 	(1)
}

AccessControlRule ::= SEQUENCE {
    accessMode		AccessMode,
    securityCondition 	SecurityCondition,
    ... -- For future extensions
}

AccessMode ::= BIT STRING {
    read	(0),
    update	(1),
    execute	(2)
}

SecurityCondition ::= CHOICE {
    authId	Identifier,
    not    	[0] SecurityCondition,
    and    	[1] SEQUENCE SIZE (2..pkcs15-ub-securityConditions)
                OF SecurityCondition, 
    or     	[2] SEQUENCE SIZE (2..pkcs15-ub-securityConditions)
                OF SecurityCondition, 
    ... -- For future extensions
}

CommonKeyAttributes ::= SEQUENCE {
    iD 		 Identifier,
    usage 	 KeyUsageFlags,
    native	 BOOLEAN DEFAULT TRUE,
    accessFlags	 KeyAccessFlags OPTIONAL,
    keyReference Reference OPTIONAL,
    startDate 	 GeneralizedTime OPTIONAL,
    endDate  	 [0] GeneralizedTime OPTIONAL,
    ... -- For future extensions
}

KeyUsageFlags ::= BIT STRING {
    encrypt 			(0),
    decrypt 			(1),
    sign 			(2),
    signRecover 		(3),
    wrap 			(4),
    unwrap 			(5),
    verify 			(6),
    verifyRecover  		(7),
    derive 			(8),
    nonRepudiation		(9)
}

KeyAccessFlags ::= BIT STRING {
    sensitive  		(0),
    extractable 	(1),
    alwaysSensitive 	(2),
    neverExtractable	(3),
    local		(4)
}

CommonPrivateKeyAttributes ::= SEQUENCE {
    subjectName	Name OPTIONAL,
    keyIdentifiers 	[0] SEQUENCE OF CredentialIdentifier
                        {{KeyIdentifiers}} OPTIONAL, 
    ... -- For future extensions
}

CommonPublicKeyAttributes ::= SEQUENCE {
    subjectName	 Name OPTIONAL,
    ...,
    trustedUsage [0] Usage OPTIONAL
}

CommonSecretKeyAttributes ::= SEQUENCE {
    keyLen	INTEGER OPTIONAL, -- keylength (in bits)
    ... -- For future extensions
}

KeyInfo {ParameterType, OperationsType} ::= CHOICE {
    reference		Reference,
    paramsAndOps 	SEQUENCE {
    	parameters 		ParameterType,
    	supportedOperations 	OperationsType OPTIONAL
	}
}

CommonCertificateAttributes ::= SEQUENCE {
    iD 		Identifier, 
    authority	BOOLEAN DEFAULT FALSE,
    identifier 	CredentialIdentifier {{KeyIdentifiers}} OPTIONAL,
    certHash	[0] OOBCertHash OPTIONAL,
    ...,
    trustedUsage [1] Usage OPTIONAL,
    identifiers	[2] SEQUENCE OF CredentialIdentifier{{KeyIdentifiers}} OPTIONAL, 
    implicitTrust [3] BOOLEAN DEFAULT FALSE
}

Usage ::= SEQUENCE {
    keyUsage	KeyUsage OPTIONAL,
    extKeyUsage	SEQUENCE SIZE (1..MAX) OF OBJECT IDENTIFIER OPTIONAL
    }(WITH COMPONENTS {..., keyUsage PRESENT} |
      WITH COMPONENTS {..., extKeyUsage PRESENT})

CommonDataObjectAttributes ::= SEQUENCE {
    applicationName	Label OPTIONAL,
    applicationOID 	OBJECT IDENTIFIER OPTIONAL,
    ... -- For future extensions
    } (WITH COMPONENTS {..., applicationName PRESENT}| 
       WITH COMPONENTS {..., applicationOID PRESENT})

CommonAuthenticationObjectAttributes ::= SEQUENCE {
    authId Identifier,
    ... -- For future extensions
}

PKCS15Object {ClassAttributes, SubClassAttributes, TypeAttributes}
    ::= SEQUENCE {
    commonObjectAttributes	CommonObjectAttributes,
    classAttributes		ClassAttributes,
    subClassAttributes 		[0] SubClassAttributes OPTIONAL,
    typeAttributes		[1] TypeAttributes
}

PKCS15Objects ::= CHOICE {
    privateKeys 	[0] PrivateKeys,
    publicKeys 		[1] PublicKeys,
    trustedPublicKeys  	[2] PublicKeys,
    secretKeys 		[3] SecretKeys,
    certificates	[4] Certificates,
    trustedCertificates [5] Certificates,
    usefulCertificates 	[6] Certificates,
    dataObjects 	[7] DataObjects,
    authObjects 	[8] AuthObjects,
    ... -- For future extensions
}

PrivateKeys  ::= PathOrObjects {PrivateKeyType}

SecretKeys   ::= PathOrObjects {SecretKeyType}

PublicKeys   ::= PathOrObjects {PublicKeyType}

Certificates ::= PathOrObjects {CertificateType}

DataObjects  ::= PathOrObjects {DataType}

AuthObjects  ::= PathOrObjects {AuthenticationType}

PrivateKeyType ::= CHOICE {
    privateRSAKey	PrivateKeyObject {PrivateRSAKeyAttributes},
    privateECKey 	[0] PrivateKeyObject {PrivateECKeyAttributes},
    privateDHKey 	[1] PrivateKeyObject {PrivateDHKeyAttributes},
    privateDSAKey	[2] PrivateKeyObject {PrivateDSAKeyAttributes},
    privateKEAKey	[3] PrivateKeyObject {PrivateKEAKeyAttributes},
    ... -- For future extensions
}

PrivateKeyObject {KeyAttributes} ::= PKCS15Object { 
    CommonKeyAttributes, CommonPrivateKeyAttributes, KeyAttributes}

PrivateRSAKeyAttributes ::= SEQUENCE {
    value 		ObjectValue {RSAPrivateKeyObject},
    modulusLength 	INTEGER, -- modulus length in bits, e.g. 1024
    keyInfo  		KeyInfo {NULL, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
} 

RSAPrivateKeyObject ::= SEQUENCE {
    modulus 		[0] INTEGER OPTIONAL, -- n
    publicExponent 	[1] INTEGER OPTIONAL, -- e
    privateExponent 	[2] INTEGER OPTIONAL, -- d
    prime1 		[3] INTEGER OPTIONAL, -- p
    prime2 		[4] INTEGER OPTIONAL, -- q
    exponent1  		[5] INTEGER OPTIONAL, -- d mod (p-1)
    exponent2  		[6] INTEGER OPTIONAL, -- d mod (q-1)
    coefficient 	[7] INTEGER OPTIONAL -- inv(q) mod p
} (CONSTRAINED BY {-- must be possible to reconstruct modulus and
   -- privateExponent from selected fields --}) 

PrivateECKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {ECPrivateKey},
    keyInfo 	KeyInfo {Parameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

ECPrivateKey ::= INTEGER

PrivateDHKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {DHPrivateKey},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

DHPrivateKey ::= INTEGER -- Diffie-Hellman exponent

PrivateDSAKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {DSAPrivateKey},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

DSAPrivateKey ::= INTEGER

PrivateKEAKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {KEAPrivateKey},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

KEAPrivateKey ::= INTEGER

PublicKeyType ::= CHOICE {
    publicRSAKey 	PublicKeyObject {PublicRSAKeyAttributes},
    publicECKey 	[0] PublicKeyObject {PublicECKeyAttributes},
    publicDHKey 	[1] PublicKeyObject {PublicDHKeyAttributes},
    publicDSAKey 	[2] PublicKeyObject {PublicDSAKeyAttributes},
    publicKEAKey 	[3] PublicKeyObject {PublicKEAKeyAttributes},
    ... -- For future extensions
}

PublicKeyObject {KeyAttributes} ::= PKCS15Object { 
    CommonKeyAttributes, CommonPublicKeyAttributes, KeyAttributes}

PublicRSAKeyAttributes ::= SEQUENCE {
    value		ObjectValue {RSAPublicKeyChoice},
    modulusLength 	INTEGER, -- modulus length in bits, e.g. 1024
    keyInfo		KeyInfo {NULL, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
} 

RSAPublicKeyChoice ::= CHOICE {
    raw	 RSAPublicKey,
    spki [1] SubjectPublicKeyInfo, -- See X.509. Must contain a
    -- public RSA key 
    ...
}

PublicECKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {ECPublicKeyChoice},
    keyInfo 	KeyInfo {Parameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

ECPublicKeyChoice ::= CHOICE {
    raw	 ECPoint,
    spki SubjectPublicKeyInfo, -- See X.509. Must contain a public EC key
    ...
}

PublicDHKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {DHPublicKeyChoice},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

DHPublicKeyChoice ::= CHOICE {
    raw	 DiffieHellmanPublicNumber,
    spki SubjectPublicKeyInfo, -- See X.509. Must contain a public D-H key
    ...
}

PublicDSAKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {DSAPublicKeyChoice},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

DSAPublicKeyChoice ::= CHOICE {
    raw	 INTEGER,
    spki SubjectPublicKeyInfo, -- See X.509. Must contain a public DSA key.
    ...
}

PublicKEAKeyAttributes ::= SEQUENCE {
    value  	ObjectValue {KEAPublicKeyChoice},
    keyInfo 	KeyInfo {DomainParameters, PublicKeyOperations} OPTIONAL,
    ... -- For future extensions
}

KEAPublicKeyChoice ::= CHOICE {
    raw	 INTEGER,
    spki SubjectPublicKeyInfo, -- See X.509. Must contain a public KEA key
    ...
}

SecretKeyType ::= CHOICE {
    genericSecretKey	SecretKeyObject {GenericSecretKeyAttributes},
    rc2key 		[0] SecretKeyObject {GenericSecretKeyAttributes},
    rc4key 		[1] SecretKeyObject {GenericSecretKeyAttributes},
    desKey 		[2] SecretKeyObject {GenericSecretKeyAttributes},
    des2Key		[3] SecretKeyObject {GenericSecretKeyAttributes},
    des3Key    	        [4] SecretKeyObject {GenericSecretKeyAttributes}, 
    castKey 		[5] SecretKeyObject {GenericSecretKeyAttributes},
    cast3Key 		[6] SecretKeyObject {GenericSecretKeyAttributes},
    cast128Key  	[7] SecretKeyObject {GenericSecretKeyAttributes},
    rc5Key  		[8] SecretKeyObject {GenericSecretKeyAttributes},
    ideaKey 		[9] SecretKeyObject {GenericSecretKeyAttributes},
    skipjackKey 	[10] SecretKeyObject {GenericSecretKeyAttributes},
    batonKey		[11] SecretKeyObject {GenericSecretKeyAttributes},
    juniperKey  	[12] SecretKeyObject {GenericSecretKeyAttributes},
    rc6Key 		[13] SecretKeyObject {GenericSecretKeyAttributes},
    otherKey		[14] OtherKey,
... -- For future extensions
}

SecretKeyObject {KeyAttributes} ::= PKCS15Object { 
     CommonKeyAttributes, CommonSecretKeyAttributes, KeyAttributes}

OtherKey ::= SEQUENCE {
    keyType	OBJECT IDENTIFIER,
    keyAttr	SecretKeyObject {GenericSecretKeyAttributes}
}

GenericSecretKeyAttributes ::= SEQUENCE {
    value	ObjectValue { OCTET STRING },
    ... -- For future extensions
}

CertificateType ::= CHOICE {
    x509Certificate  	CertificateObject { X509CertificateAttributes},
    x509AttributeCertificate [0] CertificateObject
                        {X509AttributeCertificateAttributes}, 
    spkiCertificate 	[1] CertificateObject {SPKICertificateAttributes},
    pgpCertificate  	[2] CertificateObject {PGPCertificateAttributes},
    wtlsCertificate 	[3] CertificateObject {WTLSCertificateAttributes},
    x9-68Certificate 	[4] CertificateObject {X9-68CertificateAttributes},
    ...,
    cvCertificate	[5] CertificateObject {CVCertificateAttributes}
}

CertificateObject {CertAttributes} ::= PKCS15Object { 
    CommonCertificateAttributes, NULL, CertAttributes}

X509CertificateAttributes ::= SEQUENCE {
    value		ObjectValue { Certificate },
    subject  		Name OPTIONAL,
    issuer 		[0] Name OPTIONAL,
    serialNumber 	CertificateSerialNumber OPTIONAL,
    ... -- For future extensions
}

X509AttributeCertificateAttributes ::= SEQUENCE {
    value	ObjectValue { AttributeCertificate },
    issuer	GeneralNames OPTIONAL,
    serialNumber CertificateSerialNumber OPTIONAL,
    attrTypes 	[0] SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
    ... -- For future extensions
}

SPKICertificateAttributes ::= SEQUENCE {
    value	ObjectValue { PKCS15-OPAQUE.&Type },
    ... -- For future extensions
}

PGPCertificateAttributes ::= SEQUENCE {
    value	ObjectValue { PKCS15-OPAQUE.&Type },
    ... -- For future extensions
}

WTLSCertificateAttributes ::= SEQUENCE {
    value	ObjectValue { PKCS15-OPAQUE.&Type },
    ... -- For future extensions
}

X9-68CertificateAttributes ::= SEQUENCE {
    value	ObjectValue { PKCS15-OPAQUE.&Type },
    ... -- For future extensions
}
CVCertificateAttributes ::= SEQUENCE {
    value	ObjectValue { PKCS15-OPAQUE.&Type},
    ... -- For future extensions
}

DataType ::= CHOICE {
    opaqueDO	DataObject {Opaque},
    externalIDO	[0] DataObject {ExternalIDO},
    oidDO  	[1] DataObject {OidDO},
    ... -- For future extensions
}

DataObject {DataObjectAttributes} ::= PKCS15Object { 
    CommonDataObjectAttributes, NULL, DataObjectAttributes}

Opaque ::= ObjectValue {PKCS15-OPAQUE.&Type}

ExternalIDO ::= ObjectValue {PKCS15-OPAQUE.&Type}
    (CONSTRAINED BY {-- All data objects must be defined in
    -- accordance with ISO/IEC 7816-6 --}) 

OidDO ::= SEQUENCE {
    id		OBJECT IDENTIFIER,
    value 	ObjectValue {PKCS15-OPAQUE.&Type}
}

AuthenticationType ::= CHOICE {
    pin	AuthenticationObject { PinAttributes },
    ...,
    biometricTemplate [0] AuthenticationObject {BiometricAttributes},
    authKey  [1] AuthenticationObject {AuthKeyAttributes},
    external [2] AuthenticationObject {ExternalAuthObjectAttributes}
}

AuthenticationObject {AuthObjectAttributes} ::= PKCS15Object { 
    CommonAuthenticationObjectAttributes, NULL, AuthObjectAttributes}

PinAttributes ::= SEQUENCE {
    pinFlags  	  PinFlags,
    pinType  	  PinType,
    minLength 	  INTEGER (pkcs15-lb-minPinLength..pkcs15-ub-minPinLength),
    storedLength  INTEGER (0..pkcs15-ub-storedPinLength),
    maxLength 	  INTEGER OPTIONAL,
    pinReference  [0] Reference DEFAULT 0,
    padChar  	  OCTET STRING (SIZE(1)) OPTIONAL,
    lastPinChange GeneralizedTime OPTIONAL,
    path 	  Path OPTIONAL,
    ... -- For future extensions
}

PinFlags ::= BIT STRING {
    case-sensitive		(0),
    local 			(1),
    change-disabled 		(2),
    unblock-disabled 		(3),
    initialized  		(4),
    needs-padding 		(5),
    unblockingPin 		(6),
    soPin 			(7),
    disable-allowed 		(8),
    integrity-protected		(9),
    confidentiality-protected	(10),
    exchangeRefData		(11)
} (CONSTRAINED BY { -- 'unblockingPin' and 'soPIN' cannot both be set -- })

PinType ::= ENUMERATED {bcd, ascii-numeric, utf8, ...,
    half-nibble-bcd, iso9564-1}

BiometricAttributes ::= SEQUENCE {
    bioFlags		BiometricFlags,
    templateId		OBJECT IDENTIFIER,
    bioType		BiometricType,
    bioReference	Reference DEFAULT 0,
    lastChange		GeneralizedTime OPTIONAL,
    path		Path OPTIONAL,
... -- For future extensions
}

BiometricFlags ::= BIT STRING {
    local		(1),
    change-disabled	(2),
    unblock-disabled	(3),
    initialized		(4),
    disable-allowed	(8),
    integrity-protected	(9),
    confidentiality-protected	(10)
    } -- Note: bits 0, 5, 6, and 7 are reserved for future use

BiometricType ::= CHOICE {
    fingerPrint		FingerPrint,
    irisScan		[0] IrisScan,
    -- Possible extensions:
    -- voiceScan	VoiceScan,
    -- faceScan		FaceScan,
    -- retinaScan	Retinascan,
    -- handGeometry	HandGeometry,
    -- writeDynamics	WriteDynamics,
    -- keyStrokeDynamicsKeyStrokeDynamics,
    -- lipDynamics	LipDynamics,
    ... -- For future extensions
}

FingerPrint ::= SEQUENCE {
    hand	ENUMERATED {left, right},
    finger	ENUMERATED {thumb, pointerFinger, middleFinger,
                    ringFinger, littleFinger}, 
    ...
}

IrisScan ::= SEQUENCE {
    eye	ENUMERATED {left, right},
    ...
}

ExternalAuthObjectAttributes ::= CHOICE {
    authKeyAttributes	AuthKeyAttributes,
    certBasedAttributes	[0] CertBasedAuthenticationAttributes,
    ... -- For future extensions
}

AuthKeyAttributes ::= SEQUENCE {
    derivedKey	BOOLEAN DEFAULT TRUE,
    authKeyId	Identifier,
    ... -- For future extensions
}

CertBasedAuthenticationAttributes ::= SEQUENCE {
    cha	OCTET STRING,
    ...
}

TokenInfo ::= SEQUENCE {
    version		INTEGER {v1(0)} (v1,...),
    serialNumber	OCTET STRING,
    manufacturerID 	Label OPTIONAL,
    label 		[0] Label OPTIONAL,
    tokenflags 		TokenFlags,
    seInfo 		SEQUENCE OF SecurityEnvironmentInfo OPTIONAL,
    recordInfo 		[1] RecordInfo OPTIONAL,
    supportedAlgorithms	[2] SEQUENCE OF AlgorithmInfo OPTIONAL,
    ...,
    issuerId		[3] Label OPTIONAL,
    holderId		[4] Label OPTIONAL,
    lastUpdate		[5] LastUpdate OPTIONAL,
    preferredLanguage	PrintableString OPTIONAL -- In accordance with
    -- IETF RFC 1766 
} (CONSTRAINED BY { -- Each AlgorithmInfo.reference value must be unique --})

TokenFlags ::= BIT STRING {
    readonly		(0),
    loginRequired 	(1),
    prnGeneration 	(2),
    eidCompliant  	(3)
}

SecurityEnvironmentInfo ::= SEQUENCE {
    se		INTEGER (0..pkcs15-ub-seInfo),
    owner 	OBJECT IDENTIFIER,
    ... -- For future extensions
}

RecordInfo ::= SEQUENCE {
    oDFRecordLength  	[0] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    prKDFRecordLength 	[1] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    puKDFRecordLength	[2] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    sKDFRecordLength 	[3] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    cDFRecordLength  	[4] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    dODFRecordLength 	[5] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL,
    aODFRecordLength 	[6] INTEGER (0..pkcs15-ub-recordLength) OPTIONAL
}

AlgorithmInfo ::= SEQUENCE {
    reference  	Reference,
    algorithm  	PKCS15-ALGORITHM.&id({AlgorithmSet}),
    parameters 	PKCS15-ALGORITHM.&Parameters({AlgorithmSet}{@algorithm}),
    supportedOperations
        	PKCS15-ALGORITHM.&Operations({AlgorithmSet}{@algorithm}),
    algId       PKCS15-ALGORITHM.&objectIdentifier({AlgorithmSet}{@algorithm})
                    OPTIONAL, 
    algRef	Reference OPTIONAL
}

PKCS15-ALGORITHM ::= CLASS {
        &id INTEGER UNIQUE,
        &Parameters,
        &Operations Operations,
	&objectIdentifier OBJECT IDENTIFIER OPTIONAL
} WITH SYNTAX {
  PARAMETERS &Parameters OPERATIONS &Operations ID &id [OID &objectIdentifier]}

PKCS15-OPAQUE ::= TYPE-IDENTIFIER

PublicKeyOperations ::= Operations 

Operations ::= BIT STRING {
        compute-checksum  (0), -- H/W computation of checksum
        compute-signature (1), -- H/W computation of signature
        verify-checksum   (2), -- H/W verification of checksum
        verify-signature  (3), -- H/W verification of signature
        encipher          (4), -- H/W encryption of data
        decipher          (5), -- H/W decryption of data
        hash              (6), -- H/W hashing
        generate-key      (7)  -- H/W key generation
        }

pkcs15-alg-null      PKCS15-ALGORITHM ::= {
        PARAMETERS NULL OPERATIONS {{generate-key}} ID -1}

AlgorithmSet PKCS15-ALGORITHM ::= { 
        pkcs15-alg-null,
        ... -- See PKCS #11 for values for the &id field (and parameters)
        }

LastUpdate ::= CHOICE {
        generalizedTime GeneralizedTime,
        referencedTime ReferencedValue {GeneralizedTime},
	... -- For future extensions
	}

-- Soft token related types and objects

EnvelopedData {Type} ::= SEQUENCE {
    version		 INTEGER{v0(0),v1(1),v2(2),v3(3),v4(4)}(v0|v1|v2,...),
    originatorInfo	 [0] OriginatorInfo OPTIONAL,
    recipientInfos 	 RecipientInfos,
    encryptedContentInfo EncryptedContentInfo{Type},
    unprotectedAttrs	 [1] SET SIZE (1..MAX) OF Attribute OPTIONAL
}

EncryptedContentInfo {Type} ::= SEQUENCE {
    contentType		       OBJECT IDENTIFIER,
    contentEncryptionAlgorithm AlgorithmIdentifier {{KeyDerivationAlgorithms}},
    encryptedContent 	       [0] OCTET STRING OPTIONAL
}(CONSTRAINED BY {-- 'encryptedContent' shall be the result of
  -- encrypting DER-encoded value of type -- Type})

PKCS15Token ::= SEQUENCE {
    version		INTEGER {v1(0)} (v1,...),
    keyManagementInfo	[0] KeyManagementInfo OPTIONAL,
    pkcs15Objects	SEQUENCE OF PKCS15Objects
}

KeyManagementInfo ::= SEQUENCE OF SEQUENCE {
    keyId		Identifier,
    keyInfo		CHOICE {
    	recipientInfo	RecipientInfo,
    	passwordInfo	[0] PasswordInfo
	}
} (CONSTRAINED BY {-- Each keyID must be unique --})

PasswordInfo ::= SEQUENCE {
    hint	Label OPTIONAL,
    algId	AlgorithmIdentifier {{KeyDerivationAlgorithms}},
    ...
} (CONSTRAINED BY {--keyID shall point to a KEKRecipientInfo--})

KeyDerivationAlgorithms ALGORITHM-IDENTIFIER ::= {
    PBKDF2Algorithms,
    ... -- For future extensions
}

CMS3DESwrap ::= NULL

KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
    {CMS3DESwrap IDENTIFIED BY id-alg-CMS3DESwrap} |
    {INTEGER IDENTIFIED BY id-alg-CMSRC2wrap},
    ... -- For future extensions
}

DES-IV ::= OCTET STRING (SIZE(8))

ContentEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
    SupportingAlgorithms EXCEPT {NULL IDENTIFIED BY id-hmacWithSHA1},
    ... -- For future extensions
}

MACAlgorithms ALGORITHM-IDENTIFIER ::= {
    {NULL IDENTIFIED BY hMAC-SHA1},
    ... -- For future extensions
}

DigestAlgorithms ALGORITHM-IDENTIFIER ::= {
    {NULL IDENTIFIED BY sha-1},
    ... -- For future extensions
}

-- Misc

DDO ::= SEQUENCE {
    oid  	  OBJECT IDENTIFIER,
    odfPath  	  Path OPTIONAL,
    tokenInfoPath [0] Path OPTIONAL,
    unusedPath 	  [1] Path OPTIONAL,
    ... -- For future extensions
}

DIRRecord ::=   [APPLICATION 1] SEQUENCE {
    aid  	[APPLICATION 15] OCTET STRING,
    label 	[APPLICATION 16] UTF8String OPTIONAL,
    path 	[APPLICATION 17] OCTET STRING,
    ddo  	[APPLICATION 19] DDO OPTIONAL
}

UnusedSpace ::= SEQUENCE {
    path  	Path (WITH COMPONENTS {..., index PRESENT, length PRESENT}),
    authId 	Identifier OPTIONAL,
    ...,
    accessControlRules SEQUENCE OF AccessControlRule OPTIONAL
}

END
