One document matched: draft-ietf-pkix-cmc-03.txt

Differences from draft-ietf-pkix-cmc-02.txt


 PKIX Working Group                               Michael Myers (VeriSign) 
 Internet Draft                                         Xiaoyi Liu (Cisco) 
 March 3, 1999                                      Jim Schaad (Microsoft) 
 expires in six months                           Jeff Weinstein (Netscape) 
  
  
                  Certificate Management Messages over CMS 
                        <draft-ietf-pkix-cmc-03.txt> 
  
 Status of this Memo 
  
 This document is an Internet-Draft and is in full conformance with all 
 provisions of Section 10 of RFC2026. Internet-Drafts are working 
 documents of the Internet Engineering Task Force (IETF), its areas, and 
 its working groups.  Note that other groups MAY also distribute working 
 documents as Internet-Drafts. 
  
 Internet-Drafts are draft documents valid for a maximum of six months and 
 MAY be updated, replaced, or obsoleted by other documents at any time.  
 It is inappropriate to use Internet-Drafts as reference material or to 
 cite them other than as "work in progress." 
  
 To learn the current status of any Internet-Draft, please check the "1id-
 abstracts.txt" listing contained in the Internet-Drafts Shadow 
 Directories on ftp.is.co.za (Africa), nic.nordu.net (Europe), 
 munari.oz.au Pacific Rim), ds.internic.net (US East Coast), or 
 ftp.isi.edu (US West Coast). 
  
 Abstract 
  
 This document defines a Certificate Management protocol using CMS (CMC).  
 This protocol addresses two immediate needs within the Internet PKI 
 community: 
  
 1. The need for an interface to public key certification products and 
    services based on [CMS] and [PKCS10], and  
 2. The need in [SMIMEV3] for a certificate enrollment protocol for DSA-
    signed certificates with Diffie-Hellman public keys. 
  
 A small number of additional services are defined to supplement the core 
 certificate request service. 
  
 Throughout this specification the term CMS is used to refer to both [CMS] 
 and [PKCS7].  For signedData the two specifications are equivalent.  For 
 envelopedData CMS is a superset of the PKCS7. In general, the use of 
 PKCS7 in this document is aligned to the Cryptographic Message Syntax 
 [CMS] that provides a superset of the PKCS7 syntax. The term CMC refers 
 to this specification. 
  
 The key words "MUST", "REQUIRED", "SHOULD", "RECOMMENDED", and "MAY" in 
 this document are to be interpreted as described in [RFC 2119]. 
  
 1.  Protocol Requirements 
  


 Myers, Liu, Schaad, Weinstein                                    Page 1 


 Internet Draft                                              March  1999 


 - The protocol is to be based as much as possible on the existing CMS, 
   PKCS#10 and CRMF specifications. 
 - The protocol must support the current industry practice of a PKCS#10 
   request followed by a PKCS#7 response as a subset of the protocol. 
 - The protocol needs to easily support the multi-key enrollment 
   protocols required by S/MIME and other groups. 
 - The protocol must supply a way of doing all operations in a single-
   round trip.  When this is not possible the number of round trips is to 
   be minimized. 
 - The protocol needs to support optional key escrow and key archival for 
   encryption keys. 
 - The protocol will be designed such that all key generation can occur 
   on the client. 
 - The mandatory algorithms must superset the required algorithms for 
   S/MIME. 
 - The protocol will contain POP methods. Optional provisions for 
   multiple-round trip POP will be made if necessary.  
 - The protocol will support deferred and pending responses to 
   certificate request for cases where external procedures are required to 
   issue a certificate. 
 - The protocol needs to support arbitrary chains of local registration 
   authorities as intermediaries between certificate requesters and 
   issuers. 
  
 2.  Protocol Overview 
  
 An enrollment transaction in this specification is generally composed of 
 a single round trip of messages.  In the simplest case an enrollment 
 request is sent from the client to the server and an enrollment response 
 is then returned from the server to the client.  In some more complicated 
 cases, such as delayed certificate issuance and polling for responses, 
 more than one round trip is required. 
  
 This specification supports two different request messages and two 
 different response messages.   
  
 Public key certification requests can be based on either the PKCS10 or 
 CRMF object.  The two different request messages are (a) the bare PKCS10 
 (in the event that no other services are needed), and (b) the PKCS10 or 
 CRMF message wrapped in a CMS encapsulation as part of a PKIData object.  
  
 Public key certification responses are based on the CMS signedData 
 object.  The response may be either (a) a degenerate CMS signedData 
 object (in the event no other services are needed), or (b) a ResponseBody 
 object wrapped in a CMS signedData object. 
  
 No special services are provided for doing either renewal (new 
 certificates with the same key) or re-keying (new certificates on new 
 keys) of clients.  Instead a renewal/re-key message looks the same as any 
 enrollment message, with the identity proof being supplied by existing 
 certificates from the CA. 
  
 A provision exists for Local Registration Authorities (LRAs) to 
 participate in the protocol by taking client enrollment messages, 


 Myers, Liu, Schaad, Weinstein                                    Page 2 


 Internet Draft                                              March  1999 


 wrapping them in a second layer of enrollment message with additional 
 requirements or statements from the LRA and then passing this new 
 expanded request on to the certification authority. 
  
 This specification makes no assumptions about the underlying transport 
 mechanism.  The use of CMS is not meant to imply an email-based 
 transport. 
  
 Optional services available through this specification are transaction 
 management, replay detection (through nonces), deferred certificate 
 issuance, private key archival, certificate revocation requests and 
 certificate/CRL fetching. 
  
 2.1  Terminology 
  
 There are several different terms, abbreviations and acronyms used in 
 this document that we define here for convenience and consistency of 
 usage: 
  
 "End-Entity" (EE) refers to the entity that owns a key pair and for whom 
      a certificate is issued. 
 "LRA" or "RA" refers to a (Local) Registration Authority.  A registration 
      authority acts as an intermediary between an End-Entity and a 
      Certificate Authority.  Multiple RAs can exist between the End-
      Entity and the Certificate Authority. 
 "CA" refers to a Certificate Authority.  A certificate authority is the 
      entity that performs the actual issuance of a certificate. 
 "Client" refers to an entity that creates a PKI request.  In this 
      document both RAs and End-Entities can be clients. 
 "Server" refers to the entities that process PKI requests and create PKI 
      responses.  CAs and RAs can be servers in this document. 
 PKCS#10 
 CRMF 
 CMS 
 DSA 
 RSA 
 D-H 
 SHA-1 
 Transport wrapper 
  
 2.2  Protocol Flow Charts 
  
 Figure 1 shows the Simple Enrollment Request and Response messages.  The 
 contents of these messages are detailed in Sections 4.1 and 4.3 below. 
  
  
      Simple PKI Request                      Simple PKI Response 
      -------------------------               -------------------------- 
        
      +----------+                            +------------------+ 
      | PKCS #10 |                            | CMS "certs-only" | 
      +----------+--------------+             |     message      | 
      |                         |             +------------------+------+ 
      | Certificate Request     |             |                         | 


 Myers, Liu, Schaad, Weinstein                                    Page 3 


 Internet Draft                                              March  1999 


      |                         |             | CMS Signed Data,        | 
      | Subject Name            |             |   no signerInfo         | 
      | Subject Public Key Info |             |                         | 
      |   (K_PUB)               |             | signedData contains one | 
      | Attributes              |             | or more certificates in | 
      |                         |             | the "certificates"      | 
      +-----------+-------------+             | portion of the          | 
                  | signed with |             | signedData.             | 
                  | matching    |             |                         | 
                  | K_PRIV      |             | encapsulatedContentInfo | 
                  +-------------+             | is empty.               | 
                                              |                         | 
                                              +--------------+----------+ 
                                                             | unsigned | 
                                                             +----------+ 
       
      Figure 1: Simple PKI Request and Response Messages 
       
      Full PKI Request                        Full PKI Response 
      -----------------------                 ------------------------ 
       
      +----------------+                      +----------------+ 
      | CMS signedData |                      | CMS signedData | 
      |     object     |                      |     object     | 
      +----------------+--------+             +----------------+--------+ 
      |                         |             |                         | 
      | PKIData object          |             | ResponseBody object     | 
      |                         |             |                         | 
      | Sequence of:            |             | Sequence of:            | 
      | <enrollment attribute>* |             | <enrollment attribute>* | 
      | <certification request>*|             | <CMS object>*           | 
      | <CMS objects>*          |             | <other message>*        | 
      | <other message>*        |             |                         | 
      |                         |             | where * == zero or more | 
      | where * == zero or more |             |                         | 
      |                         |             | All certificates issued | 
      | Certificate requests    |             | as part of the response | 
      | are CRMF or PKCS#10     |             | are included in the     | 
      | objects. Attributes are |             | "certificates" portion  | 
      | (OID, set of ANY        |             | of the signedData.      | 
      | defined by OID) pairs.  |             |                         | 
      |                         |             +---------+---------------+ 
      +-------+-----------------+                       | signed by the | 
              | signed (keypair |                       | CA or an LRA  | 
              | used may be pre-|                       +---------------+ 
              | existing or     | 
              | identified in   | 
              | the request)    | 
              +-----------------+ 
       

              Figure 2: Full PKI Request and Response Messages 

  



 Myers, Liu, Schaad, Weinstein                                    Page 4 


 Internet Draft                                              March  1999 


 Figure 2 shows the Full Enrollment Request and Response messages.  The 
 contents of these messages are detailed in Sections 4.2 and 4.4 below. 
  
 3.  Protocol Elements 
  
 This section covers each of the different elements that may be used to 
 construct enrollment request and enrollment response messages.  Section 4 
 will cover how to build the enrollment request and response messages. 
  
 3.1  PKIData Object 
  
 The new content object PKIData has been defined for this protocol.  This 
 new object is used as the body of the full PKI request message. The new 
 body is identified by: 
  
     id-ct-PKIData ::= {id-ct 2 } 
  
 The ASN.1 structure corresponding to this new content type is: 
  
     PKIData ::= SEQUENCE { 
           controlSequence    SEQUENCE SIZE(0..MAX) OF TaggedAttribute, 
           reqSequence        SEQUENCE SIZE(0..MAX) OF TaggedRequest, 
           cmsSequence        SEQUENCE SIZE(0..MAX) OF TaggedContentInfo, 
           otherMsgSequence   SEQUENCE SIZE(0..MAX) OF OtherMsg 
     } 
      
     -- controlSequence consists of a sequence of control attributes.  The 
     control attributes defined in this document are found in section 5.  
     Other parties can define additional control attributes. 
      
     -- reqSequence consists of a sequence of certificate requests.  The 
     certificate requests can be either a CertificateRequest (PKCS10 
     request) or a CertReqMsg.  Details on each of these requests types 
     are found in sections 3.3.1 and 3.3.2 respectively. 
      
     -- cmsSequence consists of a sequence of [CMS] message objects.  This 
     protocol only uses EnvelopedData, SignedData and EncryptedData.  See 
     section 3.5 for more details. 
      
     -- otherMsgSequence allows for other arbitrary items to be placed 
     into the enrollment protocol.  The {OID, any} pair of values allows 
     for arbitrary definition of material.  Data objects are placed here 
     while control objects are placed in the controlSequence field. 
      
 3.2  ResponseBody Object 
  
 The new content object ResponseBody has been defined for this protocol.  
 This new object is used as the body of the full PKI response message.  
 The new body is identified by: 
  
      id-ct-PKIResponse ::= {id-ct 3  } 
       
 The ASN.1 structure corresponding to this body content type is: 
  


 Myers, Liu, Schaad, Weinstein                                    Page 5 


 Internet Draft                                              March  1999 


     ResponseBody ::= SEQUENCE { 
         controlSequence   SEQUENCE SIZE(0..MAX) OF TaggedAttribute, 
         cmsSequence       SEQUENCE SIZE(0..MAX) OF TaggedContentInfo, 
         otherMsgSequence  SEQUENCE SIZE(0..MAX) OF OtherMsg 
     } 
      
     -- controlSequence consists of a sequence of control attributes.  The 
     control attributes defined in this document are found in section 3.4.  
     Other parties can define additional control attributes. 
      
     -- cmsSequence consists of a sequence of [CMS] message objects.  This 
     protocol only uses EnvelopedData, SignedData and EncryptedData.  See 
     section 3.5 for more details. 
      
     -- otherMsgSequence allows for other arbitrary items to be placed 
     into the enrollment protocol.  The {OID, any} pair of values allows 
     for arbitrary definition of material.  Data objects are placed here 
     while control objects are placed in the controlSequence field. 
  
  
 3.3  Certification Requests (PKCS10/CRMF) 
  
 Certification Requests are based on either PKCS10 or CRMF messages.  
 Section 3.3.1 specifies mandatory and optional requirements for clients 
 and servers dealing with PKCS10 request messages.  Section 3.3.2 
 specifies mandatory and optional requirements for clients and servers 
 dealing with CRMF request messages. 

 3.3.1  PKCS10 Request Body 

  
 Servers MUST be able to understand and process PKCS10 request bodies.  
 Clients MUST produce a PKCS10 request body when using the Simple 
 Enrollment Request message. Clients MAY produce a PKCS10 request body 
 when using the Full Enrollment Request message. 
  
 When producing a PKCS10 request body, clients MUST produce a PKCS10 
 message body containing a subject name and public key.  Some 
 certification products are operated using a central repository of 
 information to assign subject names upon receipt of a public key for 
 certification.  To accommodate this mode of operation, the subject name 
 in a CertificationRequest MAY be NULL, but MUST be present.  CAs that 
 receive a CertificationRequest with a NULL subject name MAY reject such 
 requests.  If rejected and a response is returned, the CA MUST respond 
 with the failInfo attribute of badRequest. 
  
 The client MAY incorporate one or more standard X.509 v3 extensions in 
 any PKCS10 request as an ExtensionReq attribute. An ExtensionReq 
 attribute is defined as 
  
      ExtensionReq ::= SEQUENCE OF Extension 
  
 where Extension is imported from [PKIXCERT] and ExtensionReq is 
 identified by {pkcs-9 14}. 



 Myers, Liu, Schaad, Weinstein                                    Page 6 


 Internet Draft                                              March  1999 


  
 Servers are not required to be able to process every v3 X.509 extension 
 transmitted using this protocol, nor are they required to be able to 
 process other, private extensions. Servers are not required to put all 
 client-requested extensions into a certificate.  Servers are permitted to 
 modify client-requested extensions. Servers MUST NOT alter an extension 
 so as to invalidate the original intent of a client-requested extension. 
 (For example change key usage from key exchange to signing.) If a 
 certification request is denied due to the inability to handle a 
 requested extension and a response is returned, the server MUST respond 
 with the failInfo attribute of unsupportedExt. 

 3.3.2  CRMF Request Body 

  
 Servers MUST be able to understand and process CRMF request body. Clients 
 MAY produce a CRMF message body when using the Full Enrollment Request 
 message. 
  
 This draft imposes the following additional changes on the construction 
 and processing of CRMF messages: 
  
 - When CRMF message bodies are used in the Full Enrollment Request 
   message, each CRMF message MUST include both the subject and publicKey 
   fields in the CertTemplate.  As in the case of PKCS10 requests the 
   subject may be encoded as NULL, but MUST be present. 
 - In general, when both CRMF and CMC controls exist with equivalent 
   functionality, the CMC control SHOULD be used.  The CMC control MUST 
   override any CRMF control. 
 - The regInfo field MUST NOT be used on a CRMF message.  Equivalent 
   functionality is provided in the regInfo control attribute (section 
   5.13).  
 - The indirect method of proving POP is not supported in this protocol.  
   One of the other methods (including the direct method described in this 
   document) MUST be used instead if POP is desired.  The value of 
   encrCert in SubsequentMessage MUST NOT be used. 
 - Since the subject and publicKeyValues are always present, the 
   POPOSigningKeyInput MUST NOT be used when computing the value for 
   POPSigningKey. 
  
 A server is not required to use all of the values suggested by the client 
 in the certificate template.  Servers are not required to be able to 
 process every V3 X.509 extension transmitted using this protocol, nor are 
 they required to be able to process other, private extensions.  Servers 
 are permitted to modify client-requested extensions.  Servers MUST NOT 
 alter an extension so as to invalidate the original intent of a client-
 requested extension. (For example change key usage from key exchange to 
 signing.)  If a certificate request is denied due to the inability to 
 handle a requested extension, the server MUST respond with a failInfo 
 attribute of unsupportedExt. 
  

 3.3.3  Production of Diffie-Hellman Public Key Certification Requests 

  



 Myers, Liu, Schaad, Weinstein                                    Page 7 


 Internet Draft                                              March  1999 


 Part of a certification request is a signature over the request; Diffie-
 Hellman is a key agreement algorithm and cannot be used to directly 
 produce the required signature object.  [DH-SIG] provides a way to 
 produce the necessary signature. 
  
 In brief the "self-signature" method requires either the CA publish a D-H 
 certificate or the client create a temporary D-H key pair.  The client 
 then computes an HMAC over the certification content using the key 
 agreement as the shared secret.  The details of how this works are found 
 in [DH-SIG]. 
  
 Clients and servers producing self-signed D-H certification requests MUST 
 support [DH-SIG]. 

 3.3.3.1    Diffie-Hellman Empty Signature 

  
 The Diffie-Hellman private keys cannot always be used to produce some 
 type of signature value as they can be in a decrypt only device.  
 Certification requests require that the signature field be populated.  
 This section provides a signature algorithm specifically for that 
 purposes.  The following object identifier and signature value are used 
 to identify this signature type: 
  
      id-alg-noSignature OBJECT IDENTIFIER ::= {id-pkix id-alg(6) 2} 
       
      NoSignatureValue ::= OCTET STRING 
       
 The parameters for id-alg-noSignature MUST be present and MUST be encoded 
 as NULL.  NoSignatureValue contains the hash of the certification 
 request.  It is important to realize that there is no security associated 
 with this signature type.  If this signature type is on a certification 
 request and the certificate authority policy requires proof-of-possession 
 on the private key, the POP mechanism defined in section 5.7 MUST be 
 used. 
  

 3.3.3.2   Diffie-Hellman POP Signature 

  
 CMC compliant implementations MUST support section 5 of [DH-SIG]. 
  

 3.3.3.3   Diffie-Hellman MAC signature 

  
 CMC compliant implementations MAY support section 4 of [DH-SIG]. 
   
 3.4  Control Attributes 
  
 The overall control flow of how a message is processed in this document 
 is based on the control attributes.  Each control attribute consists of 
 an object identifier and a value based on the object identifier.  Servers 
 MUST fail the processing of an entire PKIData message if any included 
 control attribute is not recognized.  The response MUST be the error 
 badRequest with the bodyid set to the invalid or unrecognized control.   



 Myers, Liu, Schaad, Weinstein                                    Page 8 


 Internet Draft                                              March  1999 


 The set of control attributes that are defined by this draft are found in 
 section 5.  
  
 3.5  Content Info objects 
  
 This specification uses two different wrapping objects from the CMS 
 draft.  SignedData is used for authentication purposes as well as a 
 general transport wrapper. EnvelopedData is used for encryption purposes. 

 3.5.1  Signed Data 

  
 The signedData object is used in two different locations when 
 constructing enrollment messages.  The signedData object is used as a 
 wrapper to a PKIData as part of the enrollment request message.  The 
 signedData object is also used as the outer part of an enrollment 
 response message.   
  
 For the enrollment response the signedData wrapper allows the server to 
 sign the returning data, if any exists, and to carry the certificates and 
 CRLs for the enrollment request.  If no data is being returned beyond the 
 certificates, no signerInfo objects are placed in the signedData object. 

 3.5.2  Enveloped Data 

  
 EnvelopedData is the primary method of providing for the protection of 
 sensitive information in this protocol.  The protocol currently uses 
 EnvelopedData in two different areas: The global shrouding of an entire 
 request (see section 4.5) and the shrouding of private key material.   
  
 The envelopedData object is also used to wrap private key material when 
 sent as part of either the enrollment request or enrollment response 
 message. Private key archival MAY be supported through the use of the CMS 
 envelopedData.  If used, clients generate an encrypted blob and include 
 it in the request message.  Senders return this value on later enrollment 
 messages if requested to do so.   
  
 Servers MUST NOT implement envelopedData according to [PKCS7].  There is 
 an ambiguity (about encrypting content types other than id-data) in the 
 language that has lead to non-interoperability. 
  

 3.5.3  Encrypted Data 

  
 EncryptedData can be used to protect private key material when doing 
 archive of private key material (see section 5.9). 
  
 4.  PKI Messages 
  
 This section discusses the details of putting together the different 
 enrollment request and response messages. 
  
 4.1  Simple Enrollment Request 
  



 Myers, Liu, Schaad, Weinstein                                    Page 9 


 Internet Draft                                              March  1999 


 The simplest form of an enrollment request is a plain PKCS10 message.  If 
 this form of enrollment request is used for a private key that is capable 
 of generating a signature, the PKCS10 MUST be signed with that private 
 key.  If this form of the enrollment request is used for a D-H key, then 
 the D-H POP mechanism described in [DH-SIG] MUST be used. 
  
 Servers MUST support the Simple Enrollment Request message. If the Simple 
 Enrollment Request message is used, servers MUST return the Simple 
 Enrollment Response message (see Section 3.3) if the enrollment request 
 is granted.  If the enrollment request fails, the Full Enrollment 
 Response MAY be returned or no response MAY be returned. 
  
 Many advanced services specified in this draft are not supported by the 
 Simple Enrollment Request message. 
  
 4.2  Full PKI Request 
  
 The Full Enrollment Request provides the most functionality and 
 flexibility.  Clients SHOULD use the Full Enrollment Request message when 
 doing client enrollment.  Servers MUST support the Full Enrollment 
 Request message.  A response MUST be returned to all Full Enrollment 
 Requests. 
  
 The Full Enrollment Request message consists of a PKIData object wrapped 
 in a signedData CMS object. The objects in the PKIData are ordered as 
 follows: 
  
 1. All Control Attributes, 
 2. All certification requests, 
 3. All CMS objects, 
 4. All other messages. 
  
 Each element in a Full Enrollment Request is identified by a unique 4 
 octet integer.  This is encoded either the bodyPartIDs or certReqIds 
 field of the element.  If duplicate ids are found, the server MUST return 
 the error badRequest with a bodyPartID of 0. The value of 0 has been 
 reserved to refer to the containing PKIData object. 
  
 The signedData object wrapping the PKIData may be signed either by the 
 private key material of the signature certification request, or by a pre-
 existing signature key and certificate.   If the private key of a 
 signature certification request is being used, then: 
    a)       the certification request containing the corresponding public
key 
      MUST include a Subject Key Identifier extension request, 
    b)       the subjectKeyIdentifier form of signerInfo MUST be used, and 
    c)       the value of the subjectKeyIdentifier form of signerInfo MUST
be the 
      Subject Key Identifier specified in the corresponding certification 
      request. 
     
 (The subjectKeyIdentifier form of signerInfo is used here because no 
 certificates have yet been issued for the signing key.) If the request 
 key is used for signing, there MUST be only one signerInfo object in the 
 signedData object. 
  


 Myers, Liu, Schaad, Weinstein                                   Page 10 


 Internet Draft                                              March  1999 


 When creating a renewal message the following should be taken into 
 consideration: 
  
 1. The identification and identityProof control statements are not 
    required.  The same information is provided by the use of an existing 
    certificate from the CA when signing the enrollment message. 
 2. CAs and LRAs may impose additional restrictions on the signing 
    certificate used.  They may require that the most recently issued 
    signing certificate for an entity be used. 
 3. A renewal message may occur either by creating a new set of keys, or 
    by re-using an existing set of keys.  Some CAs may prevent re-use of 
    keys by policy.  In this case the CA MUST return NOKEYREUSE as the 
    failure code. 
  
  
 4.3  Simple Enrollment Response 
  
 Servers SHOULD use the simple enrollment response message whenever 
 possible.  Clients MUST understand the simple enrollment response 
 message.  The simple enrollment response message consists of a signedData 
 object with no signerInfo objects on it.  The certificates requested are 
 returned in the certificate bag of the signedData object. 
  
 Clients MUST NOT assume the certificates are in any order. Servers SHOULD 
 include all certificates to form complete chains to the root, not just 
 the issued certificate. The server MAY additionally return CRLs in the 
 CRL bag. Servers MAY include the root certificates. Clients MUST NOT 
 implicitly trust a self-signed certificate merely due to its presence in 
 the certificate bag. In the event clients receive a new root certificate 
 from the server, clients SHOULD provide a mechanism to enable the user to 
 explicitly trust the received root certificate. 
  
  
 4.4  Full PKI Response 
  
 Servers MUST return full PKI response messages if a) a full PKI request 
 message failed or b) additional services other than returning 
 certificates are required.  Servers MAY return full PKI responses with 
 failure information for simple PKI requests. Following section 4.3 above, 
 servers returning only certificates and a success status to the client 
 SHOULD use the simple PKI response message. 
  
 Clients MUST understand the full PKI response message. 
  
 The full enrollment response message consists of a signedData object 
 wrapped around a responseBody object.  In a responseBody object all 
 Control Attributes MUST precede all CMS objects.  The certificates 
 granted in an enrollment response are returned in the certificates field 
 of the immediately encapsulating signedData object. 
  
 Clients MUST NOT assume the certificates are in any order. Servers SHOULD 
 include all certificates to form complete chains to the root, not just 
 the issued certificate. The server MAY additionally return CRLs in the 
 CRL bag. Servers MAY include the root certificates. Clients MUST NOT 


 Myers, Liu, Schaad, Weinstein                                   Page 11 


 Internet Draft                                              March  1999 


 implicitly trust a self-signed certificate merely due to its presence in 
 the certificate bag. In the event clients receive a new root certificate 
 from the server, clients SHOULD provide a mechanism to enable the user to 
 explicitly trust the received root certificate. 
  
  
 4.5  Application of Encryption to a PKI Message 
  
 There are occasions where a PKI request or response message must be 
 encrypted in order to prevent any information about the enrollment from 
 being accessible to unintended entities.  This section describes the 
 means used to encrypt a PKI message.  This section is not applicable to a 
 simple enrollment message. 
  
 Shrouding is obtained by wrapping the PKI message (a signedData object) 
 in a CMS EnvelopedData object.  The nested content type in the 
 EnvelopedData is id-signedData.  Note that this is different from S/MIME 
 where there is a MIME layer placed between the encrypted and signed data 
 objects.  It is recommended that if an enveloped data layer is applied to 
 a PKI message, a second signing layer be placed outside of the enveloped 
 data layer.  The following figure shows how this nesting would be done: 
  
      Normal              Option 1                  Option 2 
      ------              --------                  -------- 
      SignedData            EnvelopedData             SignedData 
        PKIData               SignedData                EnvelopedData 
                             PKIData                   SignedData 
                                                             PKIData 
  
 Options 1 and 2 provide the benefit of preventing leakage of sensitive 
 data by encrypting the information.  LRAs may remove the enveloped data 
 wrapping, and replace or forward without further processing. 
  
 PKI Messages MAY be encrypted or transmitted in the clear.  Servers MUST 
 provided support for all three versions. 
  
 Alternatively, an authenticated, secure channel could exist between the 
 parties requiring encryption.  Clients and servers MAY use such channels 
 instead of the shrouding technique described above to provide secure, 
 private communication of PKI request and response messages. 
  
 5.  Control Attributes 
  
 Control attributes are carried as part of both PKI requests and 
 responses. Each control attribute is encoded as a unique Object 
 Identifier followed by that data for the control attribute.  The encoding 
 of the data is based on the control attribute object identifier. 
 Processing systems would first detect the OID and process the 
 corresponding attribute value prior to processing the message body. 
  
 The following table lists the names, OID and syntactic structure for each 
 of the control attributes documented in this draft. 
  
 Control Attribute      OID             Syntax 


 Myers, Liu, Schaad, Weinstein                                   Page 12 


 Internet Draft                                              March  1999 


 -----------------    ----------      -------------- 
 cMCStatusInfo        pkix-cmc 1      CMCStatusInfo 
 identification       pkix-cmc 2      UTF8String 
 identityProof        pkix-cmc 3      OCTET STRING 
 dataReturn           pkix-cmc 4      OCTET STRING 
 transactionId        pkix-cmc 5      INTEGER 
 senderNonce          pkix-cmc 6      OCTET STRING 
 recipientNonce       pkix-cmc 7      OCTET STRING 
 addExtensions        pkix-cmc 8      AddExtensions 
 encryptedPOP         pkix-cmc 9      EncryptedPOP 
 decryptedPOP         pkix-cmc 10     DecryptedPOP 
 lraPOPWitness        pkix-cmc 11     LraPOPWitness 
 keyArchival          pkix-cmc 12     KeyArchival 
 keyRecoveryReq       pkix-cmc 13     KeyRecoveryReq 
 keyRecoveryRsp       pkix-cmc 14     KeyRecoveryRsp 
 getCert              pkix-cmc 15     GetCert 
 getCRL               pkix-cmc 16     GetCRL 
 revokeRequest        pkix-cmc 17     RevokeRequest 
 regInfo              pkix-cmc 18     OCTET STRING 
 responseInfo         pkix-cmc 19     OCTET STRING 
 privateKey           pkix-cmc 20     PrivateKeyInfo 
 QueryPending         pkix-cmc 21     OCTET STRING 
 idPOPLinkRandom      pkix-cmc 22     OCTET STRING 
 idPOPLinkWitness     Pkix-cmc 23     OCTET STRING 
  
  
  
 5.1  CMC Status Info Control Attribute 
  
 The CMC status info control is used in full PKI Response messages to 
 return information on a client request.  This statement uses the 
 following ASN.1 definition: 
  
      CMCStatusInfo ::= SEQUENCE { 
           cMCStatus           CMCStatus, 
           bodyList            SEQUENCE SIZE (1..MAX) OF BodyPartID, 
           statusString        UTF8String OPTIONAL, 
           otherInfo           CHOICE { 
             failInfo            CMCFailInfo, 
             pendInfo            PendInfo } OPTIONAL 
      } 
       
      PendInfo ::= SEQUENCE { 
           pendToken           OCTET STRING, 
           pendTime            GeneralizedTime 
      } 
  
      -- cMCStatus is described in section 5.1.1 
       
      -- bodyList contains the list of body parts in the request message 
      to which this status information applies.  If an error is being 
      returned for a simple enrollment message, body list will contain a 
      single integer of value '1'. 
       


 Myers, Liu, Schaad, Weinstein                                   Page 13 


 Internet Draft                                              March  1999 


      -- statusString contains a string with additional description 
      information.  This string is human readable. 
       
      -- failInfo is described in section 5.1.2. It provides a detailed 
      error on what the failure was.  This choice is present only if 
      cMCStatus is failed. 
       
      -- pendToken is the token to be used in the queryPending control 
      attribute. 
       
      -- pendTime contains the suggested time the server wants to be 
      queried about the status of the request. 
  
 If the cMCStatus field is success, the CMC Status Info Control MAY be 
 omitted unless it is only item in the response message.  If no status 
 exists for a certificate request or other item requiring processing, then 
 the value of success is to be assumed. 
  

 5.1.1   CMCStatus values 

  
 CMCStatus is a field in the CMCStatusInfo structure.  This field contains 
 a code representing the success or failure of a specific operation.  
 CMCStatus has the ASN.1 structure of: 
  
      CMCStatus ::= INTEGER {  
            success                (0),  
            -- request was granted 
           -- reserved            (1), 
           -- not used, defined where the original structure was defined 
           failed                 (2),  
            -- you don't get what you want, more information elsewhere in 
      the message 
            pending                (3),  
            -- the request body part has not yet been processed,  
            -- requester is responsible to poll back on this 
           -- pending may only be return for certificate request 
      operations. 
           noSupport              (4), 
           -- the requested operation is not supported 
      } 
  

 5.1.2   CMCFailInfo 

  
 CMCFailInfo conveys information relevant to the interpretation of a 
 failure condition. The CMCFailInfo has the following ASN.1 structure: 
  
      CMCFailInfo ::= INTEGER {  
           badAlg            (0)   
           -- Unrecognized or unsupported algorithm 
           badMessageCheck   (1)   
           -- integrity check failed 



 Myers, Liu, Schaad, Weinstein                                   Page 14 


 Internet Draft                                              March  1999 


           badRequest        (2)   
           -- transaction not permitted or supported 
           badTime           (3)   
           -- Message time field was not sufficiently close to the system

      time 
           badCertId         (4) 
           -- No certificate could be identified matching the provided 
      criteria 
           unsuportedExt     (5)   
           -- A requested X.509 extension is not supported by the 
      recipient CA. 
           mustArchiveKeys   (6)   
           -- Private key material must be supplied 
           badIdentity       (7)   
           -- Identification Attribute failed to verify 
           popRequired       (8)   
           -- Server requires a POP proof before issuing certificate 
           popFailed         (9) 
           -- POP processing failed 
           noKeyReuse        (10) 
           -- Server policy does not allow key re-use 
           internalCAError   (11) 
           tryLater          (12) 
      } 
  
 Additional failure reasons MAY be defined for closed environments with a 
 need. 
  
 5.2  Identification and IdentityProof Control Attributes 
  
 Some CAs and LRAs require that a proof of identity be included in a 
 certification request.  Many different ways of doing this exist with 
 different degrees of security and reliability.  Most people are familiar 
 with the request of a bank to provide your mother's maiden name as a form 
 of identity proof. 
  
 CMC provides one method of proving the client's identity based on a 
 shared secret between the certificate requestor and the verifying 
 authority.  If clients support full request messages, clients MUST 
 implement this method of identity proof.  Servers SHOULD provide this 
 method or have a bilateral method of similar strength available. 
  
 The CMC method starts with an out-of-band transfer of a token (the shared 
 secret).  The distribution of this token is beyond the scope of this 
 document.  The client then uses this token for an identity proof as 
 follows: 
  
 1. The reqSequence field of the PKIData object (encoded exactly as it 
    appears in the request message including the sequence type and length) 
    is the value to be validated. 
 2. A SHA1 hash of the token is computed. 
 3. An HMAC-SHA1 value is then computed over the value produced in Step 1, 
    as described in [HMAC], using the hash of the token from Step 2 as the 
    shared secret value. 


 Myers, Liu, Schaad, Weinstein                                   Page 15 


 Internet Draft                                              March  1999 


 4. The 160-bit HMAC-SHA1 result from Step 3 is then encoded as the value 
    of the identityProof attribute. 
  
 When the server verifies the identityProof attribute, it computes the 
 HMAC-SHA1 value in the same way and compares it to the identityProof 
 attribute contained in the enrollment request. 
  
 If a server fails the verification of an identityProof attribute and the 
 server returns a response message, the failInfo attribute MUST be present 
 in the response and MUST have a value of badIdentity. 
  
 Optionally, servers may require the inclusion of the unprotected 
 identification attribute with an identityProof attribute.  The 
 identification attribute is intended to contain either a text string or a 
 numeric quantity, such as a random number, which assists the server in 
 locating the shared secret needed to validate the contents of the 
 identityProof attribute.  Numeric values MUST be converted to text string 
 representations prior to encoding as UTF8-STRINGs in this attribute.  If 
 the identification control attribute is included in the message, the 
 derivation of the shared secret in step 2 is altered so that the hash of 
 the concatenation of the token and the identity value are hashed rather 
 than just the token. 
  
  
  
 5.3  Linking Identity and POP Information 
  
 In a PKI Full Request message identity information about the 
 creator/author of the message is carried in the signature of the CMS 
 SignedData object containing all of the certificate requests.  Proof-of-
 possession information for key pairs requesting certification, however, 
 is carried separately for each PKCS#10 or CRMF message.  (For keys 
 capable of generating a digital signature the POP is provided by the 
 signature on the PKCS#10 or CRMF.  For encryption-only keys the controls 
 described in Section 5.7 below are used.)  In order to prevent 
 substitution-style attacks we must guarantee that the same entity 
 generated both the POP and proof-of-identity information. 
  

 5.3.1  This section describes two mechanisms for linking identity and POP 
        information: witness values cryptographically derived from the 
        shared-secret (Section 5.3.1) and shared-secret/subject DN 
        matching (Section 5.3.2).  Clients and servers MUST support the 
        witness value thechnique.  Clients and servers MAY support shared-
        secret/subject DN matching or other bilateral techniques of 
        similar strength.  The idea behind both mechanisms is to force the 
        client to sign some data into each certificate request that can be 
        directly associated with the shared-secret; this will defeat 
        attempts to include certificate requests from different entities 
        in a single Full PKI Request message.Witness values derived from 
        the shared-secret 

  




 Myers, Liu, Schaad, Weinstein                                   Page 16 


 Internet Draft                                              March  1999 


 The first technique for doing identity-POP linking works by forcing the 
 client to include a piece of information cryptographically-derived from 
 the shared-secret token as a signed extension within each certificate 
 request (PKCS#10 or CRMF) message.  This technique is useful if null 
 subject DNs are used (because, for example, the server can generate the 
 subject DN for the certificate based only on the shared secret).  
 Processing begins when the client receives the shared-secret token out-
 of-band from the server.  The client then computes the following values: 
   
    1.       The client generates a random byte-string, R, which SHOULD be
at 
      least 512 bits in length. 
    2.       A SHA1 hash of the token is computed. 
    3.       An HMAC-SHA1 value is then computed over the random value
produced 
      in Step 1, as described in [HMAC], using the hash of the token from 
      Step 2 as the shared secret. 
    4.       The random value produced in Step 1 is encoded as the value of
an 
      idPOPLinkRandom control attribute.  This control attribute MUST be 
      included in the Full PKI Request message. 
    5.       The 160-bit HMAC-SHA1 result from Step 3 is encoded as the
value of 
      an idPOPLinkWitness extension to the certificate request. 
         a.            For CRMF, idPOPLinkWitness is included in the
controls section 
           of the CertRequest structure. 
         b.            For PKCS#10, idPOPLinkWitness is included in the
attributes 
           section of the CertificationRequest structure. 
  
 Upon receipt, servers MUST verify that each certificate request contains 
 a copy of the idPOPLinkWitness and that its value was derived in the 
 specified manner from the shared secret and the random string included in 
 the idPOPLinkRandom control attribute. 

 5.3.2  Shared-secret/subject DN matching 

  
 The second technique for doing identity-POP linking is to link a 
 particular subject distinguished name (subject DN) to the shared-secrets 
 that are distributed out-of-band and to require that clients using the 
 shared-secret to prove identity include that exact subject DN in every 
 certificate request.  It is expected that many client-server connections 
 using shared-secret based proof-of-identity will use this mechanism. (It 
 is common not to omit the subject DN information from the certificate 
 request messages.) 
  
 When the shared secret is generated and transferred out-of-band to 
 initiate the registration process (Section 5.2), a particular subject DN 
 is also associated with the shared secret and communicated to the client.  
 (The subject DN generated MUST be unique per entity in accordance with CA 
 policy; a null subject DN cannot be used.  A common practice could be to 
 place the identification value as part of the subject DN.)  When the 
 client generates the Full PKI Request message, it MUST use these two 
 pieces of information as follows: 
    1. The client MUST include the specific subject DN that it received 
       along with the shared secret as the subject name in every 
       certificate request (PKCS#10 and/or CRMF) in the Full PKI Request.  
       The subject names in the requests MUST NOT be null. 



 Myers, Liu, Schaad, Weinstein                                   Page 17 


 Internet Draft                                              March  1999 


    2. The client MUST include the identityProof control attribute 
       (Section 5.2), derived from the shared secret, in the Full PKI 
       Request. 
 The server receiving this message MUST (a) validate the identityProof 
 control attribute and then, (b) check that the subject DN included in 
 each certificate request matches that associated with the shared secret.  
 If either of these checks fails the certificate request MUST be rejected. 

 5.3.3  Renewal and Re-Key Messages 

  
 In a renewal or re-key message, the subject DN in (a) the certificate 
 referenced by the CMS SignerInfo object, and (b) all certificate requests 
 within the request message MUST match according to the standard name 
 match rules described in [PKIXCERT]. 
  
 5.4  Data Return Control Attribute 
  
 The data return control attribute allows clients to send arbitrary data 
 (usually some type of internal state information) to the server and to 
 have the data returned as part of the enrollment response message.  Data 
 placed in a data return statement is considered to be opaque to the 
 server.  The same control is used for both requests and responses.  If 
 the data return statement appears in an enrollment message, the server 
 MUST return it as part of the enrollment response message. 
  
 In the event that the information in the data return statement needs to 
 be confidential, it is expected that the client would apply some type of 
 encryption to the contained data. 
  
 An example of using this statement is for a client to place an identifier 
 marking the exact source of the private key material.  This might be the 
 identifier of a hardware device containing the private key. 
  
 5.5  Add Extensions Control Attribute 
  
 The Add Extensions control attribute is used by LRAs in order to specify 
 additional extensions that are to be placed on certificates.  This 
 attribute uses the following ASN.1 definition: 
  
     AddExtensions ::= SEQUENCE { 
         pkiDataReference             BodyPartID 
         certReferences               SEQUENCE OF BodyPartID, 
         extensions                   SEQUENCE OF Extension 
     } 
  
 The pkiDataReference field contains the body part id of the embedded 
 request message. 
  
 The certReferences field is a list of references to one or more of the 
 payloads contained within a PKIData.  Each element of the certReferences 
 sequence MUST be equal to either the bodyPartID of a 
 TaggedCertificationRequest or the certReqId of the CertRequest within a 
 CertReqMsg.   By definition, the listed extensions are to be applied to 



 Myers, Liu, Schaad, Weinstein                                   Page 18 


 Internet Draft                                              March  1999 


 every element referenced in the certReferences sequence.  If a request 
 corresponding to bodyPartID cannot be found, the error badRequest is 
 returned referencing this control attribute. 
  
 The extensions field contains the sequence of extensions to be applied to 
 the referenced certificate requests. 
  
 Servers are not required to be able to process every v3 X.509 extension 
 transmitted using this protocol, nor are they required to be able to 
 process other, private extensions.  Servers are not required to put all 
 LRA-requested extensions into a certificate.  Servers are permitted to 
 modify LRA-requested extensions.  Servers MUST NOT alter an extension so 
 as to reverse the meaning of a client-requested extension. If a 
 certification request is denied due to the inability to handle a 
 requested extension and a response is returned, the server MUST return a 
 failInfo attribute with the value of unsupportedExt. 
  
 If multiple Add Extensions statements exist in an enrollment message, the 
 exact behavior is left up to the certificate issuer policy.  However it 
 is recommended that the following policy be used.  These rules would be 
 applied to individual extensions within an Add Extensions control 
 attribute (as opposed to an "all or nothing" approach).  
  
 1. If the conflict is within a single PKIData object, the certificate 
    request would be rejected with an error of badRequest. 
 2. If the conflict is between different PKIData objects, the outermost 
    version of the extension would be used. 
  
 5.6  Transaction Management Control Attributes 
  
 Transaction management attributes are an optional portion of CMC.  A 
 server does not need to implement this section to be compliant with CMC. 
   
 Transactions MAY be identified and tracked using a transaction 
 identifier.  If used, clients generate transaction identifiers and retain 
 their value until the server responds with a message that completes the 
 transaction. Servers correspondingly include received transaction 
 identifiers in the response. 
  
 The transactionId attribute identifies a given transaction.  It is used 
 between client and server to manage the state of an operation. It MAY be 
 included in service request messages.  If included, responses MUST 
 included the transmitted value.  A server MUST use only transactionIds in 
 the outermost PKIdata object. TransactionIds on inner PKIdata objects are 
 for intermediate entities. 
  
 Replay protection can be supported through the use of sender and 
 recipient nonces.  If used, clients generate a nonce value and include it 
 in the request as a sender nonce.  Servers return this value as recipient 
 nonce along their own value for sender nonce. A server MUST use only 
 nonces in the outermost PKIdata object. Nonces on inner PKIdata objects 
 are for intermediate entities. 
  



 Myers, Liu, Schaad, Weinstein                                   Page 19 


 Internet Draft                                              March  1999 


 The senderNonce and recipientNonce attribute can be used to provide 
 application-level replay prevention. They MAY be included in service 
 request messages.  Originating messages include only a value for 
 senderNonce. If included, responses MUST include the transmitted value of 
 the previously received senderNonce as recipientNonce and include a value 
 for senderNonce. 
  
 If nonces are used, in the first message of a transaction, no 
 recipientNonce is transmitted; a senderNonce is instantiated by the 
 message originator and retained for later reference.  The recipient of a 
 sender nonce reflects this value back to the originator as a 
 recipientNonce and includes it's own senderNonce.  Upon receipt by the 
 transaction originator of this message, the originator compares the value 
 of recipientNonce to its retained value.  If the values match, the 
 message can be accepted for further security processing.  The received 
 value for senderNonce is also retained for inclusion in the next message 
 associated with the same transaction. 
  
 If a transaction originator includes a value for the senderNonce 
 attribute, responses MUST include this value as a value for 
 recipientNonce AND include a value for the SenderNonce attribute. 
  
 If a transaction originator includes a value for the transactionid 
 attribute in a service request, responses MUST include this value as a 
 value for transactionid attribute. 
  
 5.7  Proof-of-possession (POP) for encryption-only keys 
  
 Everything described in this section is optional to implement. Servers 
 MAY require this POP be used only if another POP method is unavailable. 
 Servers MAY reject all requests contained within a PKIData if any 
 required POP is missing for any element within the PKIData. 
  
 Many servers require proof that an entity requesting a certificate for a 
 public key actually possesses the corresponding private component of the 
 key pair.  For keys that can be used as signature keys, signing the 
 certification request with the private key serves as a POP on that key 
 pair.  With keys that can only be used for encryption operations, POP 
 MUST be performed by forcing the client to decrypt a value.  See Section 
 5 of [CRMF] for a detailed discussion of POP. 
  
 By necessity, POP for encryption-only keys cannot be done in one round-
 trip, since there are four distinct phases: 
 1. Client tells the server about the public component of a new encryption 
    key pair. 
 2. Server sends the client a POP challenge, encrypted with the presented 
    public encryption key, which the client must decrypt. 
 3. Client decrypts the POP challenge and sends it back to the server. 
 4. Server validates the decrypted POP challenge and continues processing 
    the certificate request. 
  
 CMC defines two different attributes.  The first deals with the encrypted 
 challenge sent from the server to the user in step 2.  The second deals 



 Myers, Liu, Schaad, Weinstein                                   Page 20 


 Internet Draft                                              March  1999 


 with the decrypted challenge sent from the client to the server in step 
 3. 
  
 The encryptedPOP attribute is used to send the encrypted challenge from 
 the server to the client.  As such, it is encoded as a tagged attribute 
 within the controlSequence of a ResponseBody.  (Note that we assume that 
 the message sent in Step 1 above is an enrollment request and that the 
 response in step 2 is a Full Enrollment Response including a failureInfo 
 specifying that a POP is explicitly required, and providing the POP 
 challenge in the encryptedPOP attribute.)   
  
      EncryptedPOP ::= SEQUENCE { 
       
           request        TaggedRequest, 
           cms            contentInfo, 
           thePOPAlgID    AlgorithmIdentifier, 
           witnessAlgID   AlgorithmIdentifier, 
           witness        OCTET STRING 
      } 
       
      DecryptedPOP ::= SEQUENCE { 
           bodyPartID     BodyPartID, 
           thePOPAlgID    AlgorithmIdentifier, 
           thePOP         OCTET STRING 
      } 
  
  
 The encrypted POP algorithm works as follows: 
  
 1. The server generates a random value y and associates it with the 
    request. 
 2. The server returns the encrypted pop with the following fields set: 
    a. request is the certificate request in the original request message 
       (it is included here so the client need not key a copy of the 
       request), 
    b. cms is an EnvelopedData object, the content type being id-data and 
       the content being the value y.  If the certificate request contains 
       a subject key identifier (SKI) extension, then the recipient 
       identifier SHOULD be the SKI.  If the issuerAndSerialNumber form is 
       used, the IsserName MUST be encoded as NULL and the SerialNumber as 
       the bodyPartId of the certificate request, 
    c. thePOPAlgID contains the algorithm to be used in computing the 
       return POP value, 
    d. witnessAlgID contains the hash algorithm used on y to create the 
       field witness, 
    e. witness contains the hashed value of y. 
 3. The client decrypts the cms field to obtain the value y.  The client 
    computes H(y) using the witnessAlgID and compares to the value of 
    witness.  If the values do not compare or the decryption is not 
    successful, the client MUST abort the enrollment process.  The client 
    aborts the process by sending a request message containing a 
    CMCStatusInfo control attribute with failInfo value of popFailed. 
 4. The client creates the decryptedPOP as part of a new PKIData message.  
    The fields in the decryptedPOP are: 


 Myers, Liu, Schaad, Weinstein                                   Page 21 


 Internet Draft                                              March  1999 


    a. bodyPartID contains the certificate request in the new enrollment 
       message, 
    b. thePOPAlgID is copied from the encryptedPOP, 
    c. thePOP contains the possession proof.  This value is computed by 
       thePOPAlgID using the value y and request referenced in (4a). 
 5. The server then re-computes the value of thePOP from its cached value 
    of y and the request and compares to the value of thePOP.  If the 
    values do not match, the server MUST NOT issue the certificate.  The 
    server MAY re-issue a new challenge or MAY fail the request 
    altogether. 
  
 When defining the algorithms for thePOPAlgID and witnessAlgID care must 
 be taken to ensure that the result of witnessAlgID is not a useful value 
 to shortcut the computation with thePOPAlgID.  Clients MUST implement 
 SHA-1 for witnessAlgID.  Clients MUST implement HMAC-SHA1 for 
 thePOPAlgID.  The value of y is used as the secret value in the HMAC 
 algorithm and the request referenced in (4a) is used as the data.  If y 
 is greater than 64 bytes, only the first 64 bytes of y are used as the 
 secret. 
  
 One potential problem with the algorithm above is the amount of state 
 that a CA needs to keep in order to verify the returned POP value.  This 
 describes one of many possible ways of addressing the problem by reducing 
 the amount of state kept on the CA to a single (or small set) of values.  
  
 1. Server generates random seed x, constant across all requests. (The 
    value of x would normally be altered on a regular basis and kept for a 
    short time afterwards.) 
 2. For certificate request R, server computes y = F(x,R).  F can be, for 
    example, HMAC-SHA1(x,R).  All that's important for statelessness is 
    that y be consistently computable with only known state constant x and 
    function F, other inputs coming from the cert request structure.  y 
    should not be predictable based on knowledge of R, thus the use of a 
    OWF like HMAC-SHA1. 
  
  
 5.8  LRA POP Witnesses Control Attribute 
  
 In an enrollment scenario involving an LRAs the CA may allow (or require) 
 the LRA to perform the POP protocol with the entity requesting 
 certification.  In this case the LRA needs a way to inform the CA it has 
 done the POP.  This control attribute has been created to address this 
 issue.   
  
 The ASN.1 structure for the LRA POP witness is as follows: 
  
      LraPopWitness ::= SEQUENCE { 
          pkiDataBodyid   BodyPartID, 
          bodyIds         SEQUENCE of BodyPartID 
      } 
  
      -- pkiDataBodyid field contains the body part id of the nested CMS 
      body object containing the client's full request message.  



 Myers, Liu, Schaad, Weinstein                                   Page 22 


 Internet Draft                                              March  1999 


      pkiDataBodyid is set to 0 if the request is in the current 
      PKIRequest body. 
   
      -- attribute contains a list of certificate requests for which the 
      LRA has performed an out-of-band authentication.  The method of 
      authentication could be archival of private key material, challenge-
      response or other means. 
  
 If a certificate server does not allow for an LRA to do the POP 
 verification, it returns an error of POPFAILURE.  The CA MUST NOT start a 
 challenge-response to re-verify the POP itself. 
  
 5.9  Key Archival and Recovery 
  
 Everything described in this section is optional to implement.  Servers 
 MAY require key archival of encryption keys as a condition of issuing a 
 certificate for that encryption key pair. Servers MAY reject all requests 
 contained within a PKIData if any required key archival message is 
 missing for any element within the PKIData. 
  
 There are four objects involved in key archival and recovery scenarios: 
  
 1. The Key Archival control attribute, 
 2. The Key Recovery Request control attribute, 
 3. The Key Recovery Response control attribute, 
 4. A ContentInfo containing private key material. 
  
 It is assumed that a key recovery operation will only return previously-
 archived material.  (That is, if an archival operation and a recovery 
 operation happen simultaneously, the newly archived key material is not 
 returned as part of the recovery response.) 
  
 The Key Recovery Response control can also be used to implement off-
 client generation of encryption keys. A control statement containing the 
 required fields for key generation is generated on the client as part of 
 the enrollment request message.  This is then sent up to the server and 
 the server responds with a Key Recovery Response containing the newly 
 generated key.  The details of the request control statement not covered 
 in this document and would be done on a bilateral basis. 

 5.9.1   Key Archival Control Attribute 

  
 The key archival control attribute has the following ASN.1 syntax: 
  
      KeyArchival ::= SEQUENCE { 
           reqBodyPartID       BodyPartID, 
           cmsBodyPartID       BodyPartID, 
           selectionCriteria   OCTET STRING OPTIONAL 
      } 
  
 The reqBodyPartID is a reference to the payload within the enclosing 
 PKIData that contains the certification request for the public key 
 component of the encryption key pair.  If multiple certification requests 



 Myers, Liu, Schaad, Weinstein                                   Page 23 


 Internet Draft                                              March  1999 


 for the same public key are included in the PKIData, reqBodyPartID may 
 point to any one of them. 
  
 The cmsBodyPartID is a reference to the payload within the enclosing 
 PKIData that contains the private key to be archived.  The private key 
 MUST be the private component corresponding to the public key referenced 
 by reqBodyPartID. 
  
 The selectionCriteria is optional information to be associated with the 
 archived key material to facilitate key recovery of subsections of the 
 archive database.  

 5.9.2   Key Recovery Request Control Attribute 

  
 The key recovery request control attribute has the following ASN.1 
 syntax: 
  
      KeyRecoveryReq ::= SEQUENCE { 
           shroudIdentification     ShroudIdentification, 
           bulkEncryptionAlgID      AlgorithmIdentifier, 
           selectionCriteria        OCTET STRING OPTIONAL 
      } 
  
      ShroudIdentification ::= CHOICE { 
           subjectPublicKeyInfo     [0] SubjectPublicKeyInfo, 
           encryptionToken          [1] AlgorithmIdentifier 
      } 
  
 The shroudIdentification structure defines the encryption method and key 
 material that MUST be used in the key recovery response to encrypt the 
 recovered private key material.  Two methods of identification are 
 currently defined.  In the first, the public key component of an 
 encryption key pair is explicitly included in the request.  The second 
 method derives a key from a known secret shared between client and 
 server, such as an out-of-band token.  This method is defined as an 
 AlgorithmIdentifier as it must identify (a) the source of the key 
 material, (b) any public/salt information, and (c) the method of deriving 
 an encryption key using the request data, source key material and salt. 
 Clients and servers MUST support the subject public key method.  Clients 
 and servers support of other methods is based on a bilateral agreement. 
  
 The bulkEncryptionAlgID identifies the bulk encryption algorithm that 
 MUST be used by the server to encrypt the key material in the subsequent 
 key recovery response. 
  
 The selectionCriteria is optional information to be associated with the 
 archived key material to facilitate key recovery of subsections of the 
 archive database. If selectionCriteria is absent, all archived keys 
 associated with the enrolling identity MUST be returned. 
  
 Notice that the recovery request does not include any end-entity 
 identification.  Determination of the identity comes from other 
 locations: The name in a certificate request, the name in an identity 



 Myers, Liu, Schaad, Weinstein                                   Page 24 


 Internet Draft                                              March  1999 


 proof, the name in the shrouding certificate or the name in the signing 
 certificate on the containing SignedInfo structure.  Servers need to 
 establish a policy to be used by that server for identifying the entity 
 doing the request operation. 
  

 5.9.3   Key Recovery Response Control Attribute 

  
 The key recovery response control attribute has the following ASN.1 
 syntax: 
  
      KeyRecoveryRsp ::= SEQUENCE { 
           cmsBodyPartID            BodyPartID, 
           selectionCriteria        OCTET STRING OPTIONAL 
      } 
  
      -- cmsBodyPartID identifies a TaggedContentInfo contained within the 
      enclosing PKIData.  The ContentInfo contains the requested private 
      key material. 
  
      -- selectionCriteria is the optional information that was used to 
      retrieve a subset of the keys archived in the archive database. 
  

 5.9.4   Private Key Info Attribute 

  
 The private key info attribute is imported from [PKCS8].  Private key 
 information is tagged by the private key info attribute.  This attribute 
 has the ASN.1 structure: 
  
      PrivateKeyInfo ::= SEQUENCE { 
          version                   INTEGER, 
          privateKeyAlgorithm       AlgorithmIdentifier, 
          privateKey                OCTET STRING, 
          attributes                [0] IMPLICIT Attributes OPTIONAL 
      } 
       
      Attributes ::= SET OF Attribute 
  
      -- version MUST be the value 0 
       
      -- privateKeyAlgorithm contains the identifier for the private key 
      object 
       
      -- privateKey is an octet string whose contents is the private key 
      and whose format is defined by the value of privateKeyAlgorithm. 
       
      -- attributes is a set of attributes.  These are extended 
      information that is part of the private key information. 
  
 We are defining the structures here to be used for three algorithms. 





 Myers, Liu, Schaad, Weinstein                                   Page 25 


 Internet Draft                                              March  1999 


 5.9.4.1   D-H Private Keys 

  
 When creating a PrivateKeyInfo for a D-H key, the following rules apply: 
 1. The privateKeyAlgorithm MUST be set to id-dh-private-number. The 
    parameter for id-dh-private-number is DomainParameters (imported from 
    [PKIXCERT]).  
 2. The ASN structure for privateKey MUST be 
       
      DH-PrivateKey ::= INTEGER 
       
 3. attributes MUST be omitted. 

 5.9.4.2   DSA Private Keys 

  
 When creating a PrivateKeyInfo for a DSA key, the following rules apply: 
 1.     The privateKeyAlgorithm MUST be set to id-dsa. The parameters for
id-
    dsa is Dss-Parms (imported from [PKIXCERT]).  
 2.     The ASN structure for privateKey MUST be 
     
    DSA-PrivateKey ::= INTEGER 
  
 3.     attributes MUST be omitted. 

 5.9.4.3   RSA Private Keys 

  
 When creating a PrivateKeyInfo for an RSA key, the following rules apply: 
 1. The privateKeyAlgorithm MUST be set to rsaEncryption. 
 2. The ASN structure for privateKey MUST be RSAPrivateKey (defined in 
    [PKCS1]) 
 3. Attributes MUST be omitted. 

 5.9.5   ContentInfo Objects for Private Key Material 

  
 ContentInfo object that contain private key material MUST be one of 
 EnvelopedData, EncryptedData or Data.  Private key material placed in a 
 Data ContentInfo MUST be encrypted through some other mechanism; it is 
 beyond the scope of this document to specify that mechanism.   
  
 The inner content of the EnvelopedData or EncryptedData is a 
 ResponseBody.  The private keys are then encoded as private key info 
 control attributes. 

 5.9.6  Control Flow 

  
 In the following control flow examples, "client" refers to the entity 
 archiving a private key or requesting recovery of a private key, and 
 "server" refers to the key archive facility. 
  
 Control flow for Key Archival is assumed to proceed as follows: 
 1. Client retrieves an encryption certificate for the archiving server, 
    so that key material to be archived may be encrypted to it. 
 2. Client generates an encryption key pair. 



 Myers, Liu, Schaad, Weinstein                                   Page 26 


 Internet Draft                                              March  1999 


 3. Client submits an enrollment request for the key pair.  As part of the 
    PKIData, the client includes: 
    a. A certificate request (PKCS10 or CRMF) for the key pair, which 
       includes the public key component and a message identifier (either 
       bodyPartID or certReqId), 
    b. A Key Archival control attribute, which includes two message 
       identifier references: 
       i.   The identifier of the certification request in (3a), and  
       ii.  The identifier of the ContentInfo in (3c). 
    c. A ContentInfo containing inside it the private key material 
       corresponding to the public key contained in the request in (3a) 
       and encrypted using the public key from the certificate obtained in 
       (1). 
 4. Server receives the request, archives the key material, and issues 
    certificates as appropriate.  Server responds with an enrollment 
    response containing the issued certificates. 
 It is assumed that whatever mechanisms are used to identify the entity 
 requesting certification also serve to identify the archiving party. 
  
 Control flow for Key Recovery is assumed to proceed as follows: 
 1. Client sends a Full PKI Request message containing the Key Recovery 
    Request control attribute to the server.  (The PKIData need contain 
    only the Key Recovery Request attribute.) 
 2. Server performs policy-based operations to determine whether the 
    recovery request is valid. 
 3. Assuming the request is indeed valid, the server sends back to the 
    client a Full PKI Response containing: 
    a. One or more Key Recovery Response control attributes. 
    b. One or more Private Key attributes containing encrypted private key 
       material as defined in section 5.9.4 above. 
 4. Client processes the response and extracts private key material from 
    the ContentInfo(s). 
  
 The above control flow for key recovery assumes that the client possesses 
 at least a previously-certified signature key, which is used to sign the 
 Full PKI Request message.  In the event of a catastrophic failure on the 
 client resulting in loss of all client keys, generation and certification 
 of a new signature key may occur simultaneously to a request for recovery 
 of private encryption keys.  Control flow for recovering from 
 catastrophic failure may proceed as follows: 
 1. Client generates a new signature key pair and creates a certification 
    request for the public component of the new signature key. 
 2. Client creates a Full PKI Request message containing: 
    a. The certificate request from Step 1, 
    b. A Key Recovery Request control attribute. 
    The Full PKI Request message is signed using the private signature key 
    generated as part of Step 1.  Following Section 4.2, the signerInfo 
    field of the signed message will contain a NULL issuer name and a 
    serial number corresponding to the bodyPartID of the certificate 
    request within the PKIData.  Notice that as it is not possible for the 
    client to prove identity within the PKI (because all certified key 
    pairs have been lost), another form of proof-of-identity is required 
    (such as use of the identification and identityProof control 
    attributes). 


 Myers, Liu, Schaad, Weinstein                                   Page 27 


 Internet Draft                                              March  1999 


 3. Client sends the Full PKI Request to the server. 
 4. Server performs policy-based operations on the request message to 
    determine: 
    a. Whether the certification request on the new signature key should 
       be granted, and 
    b. Whether the recovery request is valid. 
 5. Assuming that both requests are valid, the server sends back to the 
    client a Full PKI Response containing: 
    a. A certificate for the signature key, corresponding to the 
       certification request generated by the client.  
    b. One or more Key Recovery Response control attributes. 
    c. One or more Private Key attributes containing private key material 
       as defined in section 3.4.8.4. 
 6. Client processes the response and extracts private key material and 
    certificates. 
  
 5.10 Get Certificate Control Attribute 
  
 Everything described in this section is optional to implement.   
  
 The get certificate control attribute is used to retrieve previously 
 issued certificates from a repository of certificates.  A certificate 
 server, an LRA or an independent service may provide this repository. The 
 clients expected to use this facility are those operating in a resource-
 constrained environment.  (An example of a resource-constrained client 
 would be a low-end IP router that does not retain its own certificate in 
 non-volatile memory.) 
  
  
 The get certificate control attribute has the following ASN.1 structure: 
  
      GetCert ::= SEQUENCE { 
          issuerName    GeneralName, 
          serialNumber  INTEGER } 
  
 The service responding to the request will place the requested 
 certificate in the certificates field of a SignedData object.  If the get 
 certificate attribute is the only control in a Full PKI Request message, 
 the response would be a Simple Enrollment Response.. 
  
 5.11 Get CRL Control Attribute 
  
 Everything described in this section is optional to implement.   
  
 The get CRL control attribute is used to retrieve CRLs from a repository 
 of CRLs.  A certificate server, an LRA or an independent service may 
 provide this repository.  The clients expected to use this facility are 
 those where a fully deployed directory is either infeasible or 
 undesirable.  
  
 The get CRL control attribute has the following ASN.1 structure: 
  
      GetCRL ::= SEQUENCE { 
          issuerName    Name, 


 Myers, Liu, Schaad, Weinstein                                   Page 28 


 Internet Draft                                              March  1999 


          cRLName       GeneralName OPTIONAL, 
          time          GeneralizedTime OPTIONAL, 
          reasons       ReasonFlags OPTIONAL } 
  
 The fields in a GetCRL have the following meanings: 
  
      -- issuerName is the value of the Issuer DN in the subject 
      certificate. 
       
      -- cRLName may be the value of CRLDistributionPoints in the subject 
      certificate or equivalent value in the event the certificate does 
      not contain such a value.   
       
      -- time is used by the client to specify from among potentially 
      several issues of CRL that one whose thisUpdate value is less than 
      but nearest to the specified time.  In the absence of a time 
      component, the CA always returns with the most recent CRL. 
       
      -- reasons is used to specify from among CRLs partitioned by 
      revocation reason.  Implementers should bear in mind that while a 
      specific revocation request has a single CRLReason code--and 
      consequently entries in the CRL would have a single CRLReason code 
      value--a single CRL can aggregate information for one or more 
      reasonFlags. 
  
 A service responding to the request will place the requested CRL in the 
 crls field of a SignedData object.  If the get CRL attribute is the only 
 control in a full enrollment message, the response would be a simple 
 enrollment response. 
  
 5.12 Revocation Request Control Attribute 
  
 The revocation request control attribute is used to request that a 
 certificate be revoked. 
  
 The revocation request control attribute has the following ASN.1 syntax: 
  
      RevRequest ::= SEQUENCE { 
          issuerName Name, 
          serialNumber  INTEGER, 
          reason        CRLReason, 
          sharedSecret  OCTET STRING OPTIONAL, 
          comment       UTF8string OPTIONAL } 
  
 For a revocation request to become a reliable object in the event of a 
 dispute, a strong proof of originator authenticity is required. However, 
 in the instance when an end-entity has lost use of their signature 
 private key, it is impossible to produce a reliable digital signature. 
 The RevRequest provides for the optional transmission from the end-entity 
 to the CA of a shared secret that may be used as an alternative 
 authenticator in the instance of loss of use. The acceptability of this 
 practice is a matter of local security policy. 
  



 Myers, Liu, Schaad, Weinstein                                   Page 29 


 Internet Draft                                              March  1999 


 (Note that in some situations a Registration Authority may be delegated 
 authority to revoke certificates on behalf of some population within its 
 scope control.  In these situations the CA would accept the LRA's digital 
 signature on the request to revoke a certificate, independent of whether 
 the end entity still had access to the private component of the key 
 pair.) 
  
 Clients MUST provide the capability to produce a digitally signed 
 revocation request control attribute.  Clients SHOULD be capable of 
 producing an unsigned revocation request containing the end-entity's 
 shared secret.  If a client provides shared secret based self-revocation, 
 the client MUST be capable of producing a revocation request containing 
 the shared secret. 
  
 The structure of an unsigned, shared secret based revocation request is a 
 matter of local implementation.  The shared secret does not need to be 
 shrouded when sent in a revocation request.  The shared secret has a one-
 time use, that of causing the certificate to be revoked, and public 
 knowledge of the shared secret after the certificate has been revoked is 
 not a problem.  Clients need to inform users that the same shared secret 
 SHOULD NOT be used for multiple certificates.  
  
 A full response message MUST be returned for a revocation request. 
  
 5.13 Registration and Response Information Control Attributes 
  
 The regInfo control attribute is for clients and LRAs to pass additional 
 information as part a PKI request.  The regInfo control attribute uses 
 the ASN.1 structure: 
  
     RegInfo ::= OCTET STRING 
  
 The content of this data is based on bilateral agreement between the 
 client and server. 
  
 If a server (or LRA) needs to return information back to a requestor in 
 response to data submitted in a regInfo attribute, then that data is 
 returned as a responseInfo control attribute.  The content of the OCTET 
 STRING forresponse information is based on bilateral agreement between 
 the client and server. 
  
 5.14 Query Pending Control Attribute 
  
 In some environments, process requirements for manual intervention or 
 other identity checking can cause a delay in returning the certificate 
 related to a certificate request. The query pending attribute allows for 
 a client to query a server about the state of a pending certificate 
 request.  The server returns a token as part of the CMCStatusInfo 
 attribute (in the otherInfo field).  The client puts the token into the 
 query pending attribute to identify the correct request to the server.  
  
 The ASN.1 structure used by the query pending control attribute is: 
  
     QueryPending ::= OCTET STRING 


 Myers, Liu, Schaad, Weinstein                                   Page 30 


 Internet Draft                                              March  1999 


      
 If a server returns a pending state (the transaction is still pending), 
 the otherInfo MAY be omitted.  If it is not omitted then the same value 
 MUST be returned (the token MUST NOT change during the request). 
  
 6.  Local Registration Authorities 
  
 This specification permits the use of Local Registration Authorities 
 (LRAs).  An LRA sits between the client and the certification authority.  
 From the client the LRA appears to be the certification authority and 
 from the server the LRA appears to be a client.  LRAs receive the 
 enrollment messages, perform local processing and then forward onto 
 certificate authorities. Some of the types of local processing that an 
 LRA can perform include: 
  
 - batching multiple enrollment messages together, 
 - challenge/response POP proofs, 
 - addition of private or standardized certificate extensions to all 
   requests, 
 - archival of private key material, 
 - routing of requests to different CAs. 
  
 When an LRA receives an enrollment message, it may either add its own 
 layer of wrapping to produce a nested message or strip off the SignedData 
 objects and produce a new non-nested message.  LRAs SHOULD use nested 
 messages rather than non-nested messages when possible.  LRAs SHOULD NOT 
 remove a signedData object wrapping layer if it was added by the original 
 requesting entity. LRAs MUST NOT alter a certificate request body (PKCS 
 #10 or CRMF) as any alteration invalidates the signature on the body and 
 thus the POP for the private key. 
  
 6.1  Nested Messages 
  
 The expected procedure for an LRA to add information to an end entities 
 certificate request message is to take the request and place it into a 
 new PKIData object. The request is placed in the cmsSequence if it is a 
 full pki message and the reqSequence field for a simple enrollment 
 message. Control attributes, such as the add extension attribute, are 
 then added to the controlSequence field of the PKIData object.  An LRA 
 can combine multiple messages into a single new PKIData object by placing 
 more than one item in the sequence. 
  
 An example of how this would look is illustrated by the following figure: 
  
    SignedData (by LRA) 
      PKIData 
        controlSequence 
                LRA added control statements 
        reqSequence 
                Zero or more Simple CertificationRequests from clients 
        cmsSequence 
                Zero or more Full PKI messages from clients 
                   SignedData (by client) 
                       PKIData 


 Myers, Liu, Schaad, Weinstein                                   Page 31 


 Internet Draft                                              March  1999 


  
 6.2  Non-Nested Messages 
  
 LRAs occasionally need to strip off the SignedData portion of a PKIData 
 message.  In this case it is necessary for the LRA to correctly merge the 
 control statements in the submitted full PKI message with the changes to 
 be made by this LRA. 
  
 6.3  Multiple LRA Operation 
  
 In some instances there may be more than one LRA in the path from end 
 entity to certification authority, in this case the second LRA in the 
 sequence has two options for adding new control statements.  The LRA may 
 either add a new layer of wrapping (resulting in three levels of nested 
 signedData objects) or it may strip the previous LRA's signature and 
 create a new signedData object.  In this case the LRA is responsible for 
 merging together any control statements that the previous LRA may have 
 added. 
  
  
 7.  Transport Wrapping 
  
 Depending on the transport mechanism that is being used to deliver the 
 enrollment request and responses different types of wrapping is required.  
 We document for use three different wrapping items here.  Mime wrapping 
 is for transports that are natively mime based such as HTTP and E-mail.  
 A binary file transport is defined since floppy disk transport is still 
 very common.  File transport can be done either as MIME wrapped (section 
 7.1) or bare (section 7.2). 
  
 7.1  MIME Wrapping 
  
 MIME wrapping is defined for those environments that are MIME native.  
 These include E-Mail based protocols as well as HTTP. 
  
 The basic mime wrapping in this section is taken from [SMIMEV2] and 
 [SMIMEV3].  Simple enrollment requests are encoded using the 
 application/pkcs10 content type.  A file name MUST be included either in 
 a content type or content disposition statement.  The extension for the 
 file MUST be ".p10". 
  
 Simple enrollment response messages MUST be encoded as content-type 
 application/pkcs7-mime.  An smime-type parameter MUST be on the content-
 type statement with a value of "certs-only." A file name with the ".p7c" 
 extension MUST be specified as part of the content-type or content-
 disposition. 
  
 Full enrollment request messages MUST be encoded as content-type 
 application/pkcs7-mime.  The smime-type parameter MUST be included with a 
 value of "CMC-enroll".  A file name with the ".p7m" extension MUST be 
 specified as part of the content-type or content-disposition statement. 
  
 Full enrollment response messages MUST be encoded as content-type 
 application/pkcs7-mime.  The smime-type parameter MUST be included with a 


 Myers, Liu, Schaad, Weinstein                                   Page 32 


 Internet Draft                                              March  1999 


 value of "CMC-response."  A file name with the ".p7m" extensions MUST be 
 specified as part of the content-type or content-disposition. 
  
 MIME TYPE                         File Extension          SMIME-TYPE 
  
 application/pkcs10                  .p10                    N/A 
 (simple PKI request) 
  
 application/pkcs7-mime              .p7m                    CMC-request 
 (full PKI request) 
  
 application/pkcs7-mime              .p7c                    certs-only 
 (simple PKI response) 
  
 applicication/pkcs7-mime            .p7m                    CMC-response 
 (full PKI response) 
  
 7.2  File-Based Transport 
  
 Enrollment messages and responses may also be transferred between clients 
 and servers using file system-based mechanisms, such as when enrollment 
 is performed for an off-line client.  When files are used to transport 
 binary, BER-encoded Full Enrollment Request and Response messages, the 
 following file type extensions SHOULD be used: 
  
 Message Type                   File Extension           
  
 Full PKI Request                 .crq                     
  
 Full PKI Response                .crp                    
  
 7.3  Socket-Based Transport 
  
 When enrollment messages and responses are sent over sockets, no wrapping 
 is required.  Messages SHOULD be sent in their binary, BER-encoded form.   
  
 8.  Interoperability 
  
 8.1  Mandatory and Optional Algorithms 
  
 CMC clients and servers MUST be capable of producing and processing 
 message signatures using the Digital Signature Algorithm [DSA].  DSA 
 signatures MUST be indicated by the DSA AlgorithmIdentifier value (as 
 specified in section 7.2.2 of [PKIXCERT]).  PKI clients and servers 
 SHOULD also be capable of producing and processing RSA signatures (as 
 specified in section 7.2.1 of [PKIXCERT]). 
  
 CMC clients and servers MUST be capable of protecting and accessing 
 message encryption keys using the Diffie-Hellman (D-H) key exchange 
 algorithm.  D-H/3DES protection MUST be indicated by the D-H 
 AlgorithmIdentifier value specified in [CMS].  PKI clients and servers 
 SHOULD also be capable of producing and processing RSA key transport.  
 When used for PKI messages, RSA key transport MUST be indicated as 
 specified in section 7.2.1 of [PKIXCERT]. 


 Myers, Liu, Schaad, Weinstein                                   Page 33 


 Internet Draft                                              March  1999 


  
 8.2  Minimum Conformance Requirements 
  
  
 A minimally compliant CMC server: 
 a) MUST accept a Full PKI Request message 
      i) MUST accept CRMF Request Bodies within a Full PKI Request 
      ii) MUST accept PKCS#10 Request Bodies within a Full PKI Request 
 b) MUST accept a Simple Enrollment Request message 
 c) MUST be able to return a Full PKI Response.  (A Full PKI Response is 
 always a valid response, but for interoperability with downlevel clients 
 a compliant server SHOULD use the Simple Enrollment Response whenever 
 possible.) 
  
 A minimally-complaint CMC client: 
 a) MAY use either the Simple Enrollment Message or the Full PKI Request. 
      i) clients MUST use PKCS#10 with the Simple Enrollment Message 
      ii) clients MAY use either PKCS#10 or CRMF with the Full PKI Request 
 b) MUST understand the Simple Enrollment Response. 
 c) MUST understand the Full PKI Response. 
  
  
 9.  Security Considerations 
  
 Initiation of a secure communications channel between an end-entity and a 
 CA or LRA (and, similarly, between an LRA and another LRA or CA) 
 necessarily requires an out-of-band trust initiation mechanism. For 
 example, a secure channel may be constructed between the end-entity and 
 the CA via IPSEC or TLS. Many such schemes exist and the choice of any 
 particular scheme for trust initiation is outside the scope of this 
 document.  Implementers of this protocol are strongly encouraged to 
 consider generally accepted principles of secure key management when 
 integrating this capability within an overall security architecture. 
  
 Mechanisms for thwarting replay attacks may be required in particular 
 implementations of this protocol depending on the operational 
 environment. In cases where the CA maintains significant state 
 information, replay attacks may be detectable without the inclusion of 
 the optional nonce mechanisms. Implementers of this protocol need to 
 carefully consider environmental conditions before choosing whether or 
 not to implement the senderNonce and recipientNonce attributes described 
 in section 5.6.  Developers of state-constrained PKI clients are strongly 
 encouraged to incorporate the use of these attributes. 
  
 Under no circumstances should a signing key be archived.  Doing so allows 
 the archiving entity to potentially use the key for forging signatures. 
  
 Due care must be taken prior to archiving keys.  Once a key is given to 
 an archiving entity, the archiving entity could use the keys in a way not 
 conducive to the archiving entity.  Users should be made especially aware 
 that proper verification is made of the certificate used to encrypt the 
 private key material. 
  



 Myers, Liu, Schaad, Weinstein                                   Page 34 


 Internet Draft                                              March  1999 


 Clients and servers need to do some checks on cryptographic parameters 
 prior to issuing certificates to make sure that weak parameters are not 
 used. A description of the small subgroup attack is provided in [X942].  
 CMC implementations ought to be aware of this attack when doing parameter 
 validations. 
  
 10. Open Issues 
  
 There appears to be a need to add one or more control statements to 
 acknowledge the fact that key archival has been completed. (In fact, 
 there may be a need for a general mechanism for an LRA to communicate 
 certain process-related information to the next upstream LRA/CA.)  
   
 11. Acknowledgments 
  
 The authors would like to thank  Brian LaMacchia for his work in 
 developing and writing up many of the concepts presented in this 
 document.  The authors would also like to thank Alex Deacon and Barb Fox 
 for their contributions. 
  
 12. References 
  
 [CMS]    R. Housley, "Cryptographic Message Syntax",  
          draft-ietf-smime-cms-06.txt, June 1998 
  
 [CRMF]   M. Myers, C. Adams, D. Solo, D. Kemp, "Internet X.509  
          Certificate Request Message Format", 
          draft-ietf-pkix-crmf-01.txt, May 1998 
  
 [DH]     B. Kaliski, "PKCS 3: Diffie-Hellman Key Agreement v1.4" 
  
 [DH-SIG] H. Prafullchandra, J. Schaad, "Diffie-Hellman Signing  
          Algorithm", draft-schaad-dhsign-00.txt, November 1998 
  
 [HMAC]   H. Krawczyk, M. Bellare, R. Canetti, "HMAC: Keyed-Hashing 
               for Message Authentication", RFC 2104, February 1997. 
   
 [PKCS1]  Kaliski, B.  "PKCS #1: RSA Encryption, Version 1.5", RFC 2313,  
          March 1998. 
  
 [PKCS7]  B. Kaliski, "PKCS #7: Cryptographic Message Syntax v1.5", 
          RFC 2315, October 1997 
  
 [PKCS8]  RSA Laboratories, "PKCS#8: Private-Key Information Syntax 
          Standard, Version 1.2", November 1, 1993. 
  
 [PKCS10] B. Kaliski, "PKCS #10: Certification Request Syntax v1.5", 
          RFC 2314, October 1997 
  
 [PKIXCERT] R. Housley, W. Ford, W. Polk, D. Solo "Internet Public 
          Key Infrastructure X.509 Certificate and CRL Profile", 
          draft-ietf-pkix-ipki-part1-11.txt, September 1998 
  



 Myers, Liu, Schaad, Weinstein                                   Page 35 


 Internet Draft                                              March  1999 


 [RFC 2119] "Key words for use in RFCs to Indicate Requirement 
          Levels", RFC 2119 
  
 [SMIMEV2] S. Dusse, P. Hoffman, B. Ramsdell, L. Lundblade, L. Repka, 
          "S/MIME Version 2 Message Specification", RFC 2311, March 1998 
   
 [SMIMEV3] B. Ramsdell, "S/MIME Version 3 Message Specification", 
          draft-ietf-smime-msg-05.txt, August 1998 
  
 [X942]    E. Rescorla, "Diffie-Hellman Key Agreement Method". 
             (currently draft-ietf-smime-x942-*.txt) 
  
 13. Author's Addresses 
  
 Michael Myers 
 VeriSign Inc. 
 1350 Charlston Road 
 Mountain View, CA, 94043 
 (650) 429-3402 
 mmyers@verisign.com 
  
 Xiaoyi Liu 
 Cisco Systems 
 170 West Tasman Drive 
 San Jose, CA 95134 
 (480) 526-7430 
 xliu@cisco.com 
  
 Jim Schaad 
 Microsoft Corporation 
 One Microsoft Way 
 Redmond, WA  98052 
 (425) 936-3101 
 jimsch@microsoft.com 
  
 Jeff Weinstein 
 Netscape Communications Corporation 
 501 Middlefield Road 
 Mountain View, CA 94043 
 jsw@netscape.com 
  
  
  
 Appendix A  ASN.1 Module 
  
 EnrollmentMessageSyntax 
    { iso(1) identified-organization(3) dod(4) internet(1) 
    security(5) mechansims(5) pkix(7) id-mod(0) id-mod-cmc(6) } 
  
    DEFINITIONS IMPLICIT TAGS ::= 
    BEGIN 
  
    -- EXPORTS All -- 
    -- The types and values defined in this module are exported for use 


 Myers, Liu, Schaad, Weinstein                                   Page 36 


 Internet Draft                                              March  1999 


    -- in the other ASN.1 modules.  Other applications may use them for 
    -- their own purposes. 
  
    IMPORTS 
  
      -- Information Directory Framework (X.501) 
            Name 
               FROM InformationFramework { joint-iso-itu-t ds(5) 
                    modules(1) informationFramework(1) 3 } 
  
      -- Directory Authentication Framework (X.509) 
            AlgorithmIdentifier, AttributeCertificate, Certificate, 
            CertificateList, CertificateSerialNumber 
               FROM AuthenticationFramework { joint-iso-itu-t ds(5) 
                    module(1) authenticationFramework(7) 3 } 
  
      -- PKIX Part 1 - Implicit 
         GeneralName, CRLReason, ReasonFlags 
         FROM PKIX1Implicit88 {iso(1) identified-organization(3) dod(6)  
                 internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) 
                 id-pkix1-implicit-88(2)} 
  
      -- PKIX Part 1 - Explicit 
         SubjectPublicKeyInfo, Extension 
         FROM PKIX1Explicit88 {iso(1) identified-organization(3) dod(6)  
                 internet(1) security(5) mechanisms(5) pkix(7) id-mod(0)  
                 id-pkix1-explicit-88(1)} 
  
      -- Cryptographic Message Syntax 
         ContentInfo, Attribute 
           FROM CryptographicMessageSyntax { 1 2 840 113549 1 9 16 0 1} 
  
      -- CRMF 
         CertReqMsg 
         FROM CRMF { 1 3 6 1 5 5 7 0 5 }; 
  
  
     id-pkix OBJECT IDENTIFIER  ::= { iso(1) identified-organization(3) 
         dod(6) internet(1) security(5) mechanisms(5) pkix(7) } 
  
     id-pkix-cmc OBJECT IDENTIFIER ::= {id-pkix <TBD>} 
  
     id-dh-private-number OBJECT IDENTIFIER ::= { id-pkix id-alg(6) <TBD>} 
  
     id-identification OBJECT IDENTIFIER ::= {id-pkix-cmc 2} 
     id-identityProof OBJECT IDENTIFIER ::= {id-pkix-cmc 3} 
     id-dataReturn OBJECT IDENTIFIER ::= {id-pkix-cmc 4} 
     id-transactionId OBJECT IDENTIFIER ::= {id-pkix-cmc 5} 
     id-senderNonce OBJECT IDENTIFIER ::= {id-pkix-cmc 6} 
     id-recipientNonce OBJECT IDENTIFIER ::= {id-pkix-cmc 7} 
     id-regInfo OBJECT IDENTIFIER ::= {id-pkix-cmc 18} 
     id-responseInfo OBJECT IDENTIFIER ::= {id-pkix-cmc 19} 
     id-queryPending OBJECT IDENTIFIER ::= {id-pkix-cmc 21} 
  


 Myers, Liu, Schaad, Weinstein                                   Page 37 


 Internet Draft                                              March  1999 


     -- This is the content type used for a request message in the 
 protocol 
  
     id-ct-PKIData OBJECT IDENTIFIER ::= { id-pkix id-ct(5) 2 } 
  
  
     PKIData ::= SEQUENCE { 
         controlSequence    SEQUENCE SIZE(0..MAX) OF TaggedAttribute, 
         reqSequence        SEQUENCE SIZE(0..MAX) OF TaggedRequest, 
         cmsSequence        SEQUENCE SIZE(0..MAX) OF TaggedContentInfo, 
         otherMsgSequence   SEQUENCE SIZE(0..MAX) OF OtherMsg 
     } 
  
     bodyIdMax INTEGER ::= 4294967295 
  
     BodyPartID ::= INETGER(0..bodyIdMax) 
  
     TaggedAttribute ::= SEQUENCE { 
         bodyPartID         BodyPartId, 
         attrType           OBJECT IDENTIFIER, 
         attrValues         SET OF AttributeValue 
     } 
  
     AttributeValue ::= ANY 
  
     TaggedRequest ::= CHOICE { 
         tcr               [0] TaggedCertificationRequest, 
         crm               [1] CertReqMsg 
     } 
  
     TaggedCertificationRequest ::= SEQUENCE { 
         bodyPartID            BodyPartID, 
         certificationRequest  CertificationRequest 
     } 
  
     CertificationRequest ::= SEQUENCE { 
       certificationRequestInfo  SEQUENCE { 
         version                   INTEGER, 
         subject                   Name, 
         subjectPublicKeyInfo      SEQUENCE { 
           algorithm                 AlgorithmIdentifier, 
           subjectPublicKey          BIT STRING }, 
         attributes                [0] IMPLICIT SET OF Attribute }, 
       signatureAlgorithm        AlgorithmIdentifier,  
       signature                 BIT STRING 
     } 
  
     TaggedContentInfo ::= SEQUENCE { 
         bodyPartID              BodyPartId, 
         contentInfo             ContentInfo 
     } 
  
     OtherMsg ::= SEQUENCE { 
         bodyPartID        BodyPartID, 


 Myers, Liu, Schaad, Weinstein                                   Page 38 


 Internet Draft                                              March  1999 


         otherMsgType      OBJECT IDENTIFIER, 
         otherMsgValue     ANY DEFINED BY otherMsgType } 
  
     --  This defines the response message in the protocol 
     id-ct-PKIResponse OBJECT IDENTIFIER ::= {id-pkix ct(5) 3 } 
  
     ResponseBody ::= SEQUENCE { 
         controlSequence   SEQUENCE SIZE(0..MAX) OF TaggedAttribute, 
         cmsSequence       SEQUENCE SIZE(0..MAX) OF TaggedContentInfo, 
         otherMsgSequence  SEQUENCE SIZE(0..MAX) OF OtherMsg 
     } 
  
     -- Used to return status state in a response 
      
     id-cMCStatusInfo OBJECT IDENTIFIER ::= {id-pkix-cmc 1} 
      
     CMCStatusInfo ::= SEQUENCE { 
         cMCStatus       CMCStatus, 
         bodyList        SEQUENCE SIZE (1..MAX) OF INTEGER, 
         statusString    UTF8String OPTIONAL, 
         otherInfo        CHOICE { 
           failInfo         CMCFailInfo, 
           pendInfo         PendInfo } OPTIONAL 
     } 
  
     PendInfo ::= SEQUENCE { 
         pendToken        INTEGER, 
         pendTime         GENERALIZEDTIME 
     } 
      
     CMCStatus ::= INTEGER {  
         success         (0),  
         -- you got exactly what you asked for  
         failed          (2),  
         -- you don't get it, more information elsewhere in the message 
         pending         (3),  
         -- the request body part has not yet been processed,  
         -- requester is responsible to poll back on this 
         noSupport       (4) 
         -- the requested operation is not supported 
     } 
      
     CMCFailInfo ::= INTEGER {  
         badAlg          (0), 
         -- Unrecognized or unsupported algorithm 
         badMessageCheck (1),  
         -- integrity check failed 
         badRequest      (2),  
         -- transaction not permitted or supported 
         badTime         (3),  
         -- Message time field was not sufficiently close to the system 
 time 
         badCertId       (4), 



 Myers, Liu, Schaad, Weinstein                                   Page 39 


 Internet Draft                                              March  1999 


         -- No certificate could be identified matching the provided 
 criteria 
         unsuportedExt   (5), 
         -- A requested X.509 extension is not supported by the recipient 
 CA. 
         mustArchiveKeys (6),  
         -- Private key material must be supplied 
         badIdentity     (7),  
         -- Identification Attribute failed to verify 
         popRequired     (8), 
         -- Server requires a POP proof before issuing certificate 
         popFailed       (9), 
         -- Server failed to get an acceptable POP for the request 
         noKeyReuse      (10) 
         -- Server policy does not allow key re-use 
         internalCAError (11) 
         tryLater        (12) 
     } 
      
     -- Used for LRAs to add extensions to certificate requests 
     id-addExtensions OBJECT IDENTIFIER ::= {id-pkix-cmc 8} 
  
     AddExtensions ::= SEQUENCE { 
         pkiDataReference    BodyPartID, 
         certReferences      SEQUENCE OF BodyPartID, 
         extensions          SEQUENCE OF Extension 
     } 
  
     id-encryptedPOP OBJECT IDENTIFIER ::= {id-pkix-cmc 9} 
     id-decryptedPOP OBJECT IDENTIFIER ::= {id-pkix-cmc 10} 
      
     EncryptedPOP ::= SEQUENCE { 
                 request       TaggedRequest, 
         cms             ContentInfo, 
         thePOPAlgID     AlgorithmIdentifier, 
         witnessAlgID    AlgorithmIdentifier, 
         witness         OCTET STRING 
     } 
      
     DecryptedPOP ::= SEQUENCE { 
         bodyPartID      BodyPartID, 
         thePOPAlgID     AlgorithmIdentifier, 
         thePOP          OCTET STRING 
     } 
      
     id-lraPOPWitness OBJECT IDENTIFIER ::= {id-pkix-cmc 11} 
      
     LraPopWitness ::= SEQUENCE { 
         pkiDataBodyid   BodyPartID, 
         bodyIds         SEQUENCE OF BodyPartID 
     } 
      
     id-keyArchival OBJECT IDENTIFIER ::= {id-pkix-cmc 12} 
     id-keyRecoveryReq OBJECT IDENTIFIER ::= {id-pkix-cmc 13} 


 Myers, Liu, Schaad, Weinstein                                   Page 40 


 Internet Draft                                              March  1999 


     id-keyRecoveryRsp OBJECT IDENTIFIER ::= {id-pkix-cmc 14} 
      
     KeyArchival ::= SEQUENCE { 
         reqBodyPartID           BodyPartID, 
         cmsBodyPartID           BodyPartID, 
         selectionCriteria       OCTET STRING OPTIONAL 
     } 
      
     KeyRecoveryReq ::= SEQUENCE { 
         shroudIdentification    ShroudIdentification, 
         bulkEncryptionAlgID     AlgorithmIdentifier, 
         selectionCriterial      OCTET STRING OPTIONAL 
     } 
      
     ShroudIdentification ::= CHOICE { 
         subjectPublicKeyInfo    [0] SubjectPublicKeyInfo, 
         encryptionToken   [1] AlgorithmIdentifier 
     } 
      
     KeyRecoveryRsp ::= SEQUENCE { 
         bodyPartID              BodyPartID, 
         selectionCriteria       OCTET STRING OPTIONAL 
     } 
      
     id-privateKey OBJECT IDENTIFIER ::= {id-pkix-cmc 20} 
      
     PrivateKeyInfo ::= SEQUENCE { 
         version                 INTEGER, 
         privateKeyAlgorithm     AlgorithmIdentifier, 
         privateKey              OCTET STRING, 
         attributes              [0] IMPLICIT Attributes OPTIONAL 
     } 
      
     Attributes ::= SET OF Attribute 
      
     DH-PrivateKey ::= INTEGER 
      
     -- 
     id-getCert OBJECT IDENTIFIER ::= {id-pkix-cmc 15} 
      
     GetCert ::= SEQUENCE { 
         issuerName      GeneralName, 
         serialNumber    INTEGER } 
      
      
     id-getCRL OBJECT IDENTIFIER ::= {id-pkix-cmc 16} 
      
     GetCRL ::= SEQUENCE { 
         issuerName    Name, 
         cRLName       GeneralName OPTIONAL, 
         time          GeneralizedTime OPTIONAL, 
         reasons       ReasonFlags OPTIONAL } 
      
     id-revokeRequest OBJECT IDENTIFIER ::= {id-pkix-cmc 17} 


 Myers, Liu, Schaad, Weinstein                                   Page 41 


 Internet Draft                                              March  1999 


      
     RevRequest ::= SEQUENCE { 
         issuerName    Name, 
         serialNumber  INTEGER, 
         reason        CRLReason, 
         passphrase    OCTET STRING OPTIONAL, 
         comment       UTF8String OPTIONAL } 
      
    -- The following is used to request V3 extensions be added to a 
 certificate 
      
    id-ExtensionReq OBJECT IDENTIFIER ::= {iso(1) member-body(2) us(840)  
         rsadsi(113549) pkcs(1) pkcs-9(9) 14} 
      
    ExtensionReq ::= SEQUENCE OF Extension 
  
    -- The following exists to allow Diffie-Hellman Certificate Requests 
 Messages to be 
    -- well-formed 
  
    id-alg-noSignature OBJECT IDENTIFIER ::= {id-pkix id-alg(6) 2} 
  
    NoSignatureValue ::= OCTET STRING 
      
      
 END 
  
  




























 Myers, Liu, Schaad, Weinstein                                   Page 42 

PAFTECH AB 2003-20262026-04-23 06:05:11