PKIX Working Group                              Michael Myers (VeriSign)
Internet Draft                                        Xiaoyi Liu (Cisco)
November 11, 1998                                Barbara Fox (Microsoft)
expires in six months                          Jeff Weinstein (Netscape)


                Certificate Management Messages over CMS
                      <draft-ietf-pkix-cmc-02.txt>

Status of this Memo

This document is an Internet-Draft.  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, Fox, Weinstein                                       Page 1


Internet Draft                                           November  1998


- 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
  agents 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 are based on the PKCS10 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, optionally,
a 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 Agents (LRAs) to participate
in the protocol by taking client enrollment messages, wrapping them in a


Myers, Liu, Fox, Weinstein                                       Page 2


Internet Draft                                           November  1998


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 used in this document that we define
here for convenience and consistency of usage:

End-Entity refers to the entity that owns a key pair and for whom a
     certificate is issued.
LRA is a Local Registration Agent.  A local registration agent acts as
     an intermediary between an End-Entity and a Certificate Authority.
     Multiple LRAs can exist between the End-Entity and the Certificate
     Authority.
CA is 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 LRAs and End-Entities can be clients.
Server refers to the entities that process PKI requests and create PKI
     responses.  CAs and LRAs can be servers in this document.

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     |             |                         |
     |                         |             | 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    |             |                         |


Myers, Liu, Fox, Weinstein                                       Page 3


Internet Draft                                           November  1998


                 | 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 |
     | Cert requests are CRMF  |             | as part of the response |
     | or PKCS#10 objects.     |             | are included in the     |
     | Attributes are (OID,    |             | "certificates" portion  |
     | set of ANY defined by   |             | of the signedData.      |
     | 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


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.




Myers, Liu, Fox, Weinstein                                       Page 4


Internet Draft                                           November  1998


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-pkix <TBD>}

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 Error! Reference source not found. and Error!
    Reference source not found. 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-enrollResponse ::= {id-pkix <TBD> }

The ASN.1 structure corresponding to this body content type is:

    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.




Myers, Liu, Fox, Weinstein                                       Page 5


Internet Draft                                           November  1998


    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 Error! Reference source not found. specifies mandatory and
optional requirements for clients and servers dealing with PKCS10
request messages.  Section Error! Reference source not found. 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}.

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




Myers, Liu, Fox, Weinstein                                       Page 6


Internet Draft                                           November  1998


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.
- The regInfo field MUST NOT be used on a CRMF message.  Equivalent
  functionality is provided in the regInfo control attribute (section
  5.14).
- 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 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.590 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


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
product 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].





Myers, Liu, Fox, Weinstein                                       Page 7


Internet Draft                                           November  1998


Clients and servers producing self-signed D-H certification requests
MUST support ephemeral D-H signature method.

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 are permitted to fail the processing of an entire PKIData
message if some object identifiers are not fully understood.  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 an EnrollmentBody 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 on the
signedData object.

3.5.2  Enveloped Data


EnvelopedData is the primary method of providing for the protection of
sensitive 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.





Myers, Liu, Fox, Weinstein                                       Page 8


Internet Draft                                           November  1998


4.  PKI Messages

This section discusses the details of putting together the different
enrollment request and response messages.

4.1  Simple Enrollment Request

The simplest form of an enrollment request is a plain PKCS10 message.
If this form of enrollment request is used, the PKCS10 MUST be self-
signed.  For Diffie-Hellman "self-signed" means that the ephemeral HMAC
signature algorithm in [DH-SIG] MUST be used.

Servers MUST support the simple enrollment request message. If the
simple enrollment request message is supported, 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.

Private key archival is 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.

The full enrollment request message consists of an enrollmentBody object
wrapped in a signedData CMS object. The objects in the enrollmentBody
are ordered as follows:

1. All Control Attributes,
2. All certification requests,
3. All CMS objects,
4. All other messages.

All bodyPartIDs and certReqIds within a PKIData MUST be unique.

The signedData object wrapping the enrollmentBody 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
the a signature certification request is being used, the
issuerAndSerialNumber field of signerInfo MUST be encoded with the
bodyPartID of the signature certificate request for the serial number
and a NULL for the issuer name. (This is because no existing issuer and
serial number are yet known and a standard method of representing this
is needed.)  If the request key is used for signing, there MUST be only
one signerInfo object in the signedData object.

When creating a renewal message the following should be taken into
consideration:




Myers, Liu, Fox, Weinstein                                       Page 9


Internet Draft                                           November  1998


1. The identification and identificationProof 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. 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. 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



Myers, Liu, Fox, Weinstein                                      Page 10


Internet Draft                                           November  1998


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.
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 MAYuse 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, Fox, Weinstein                                      Page 11


Internet Draft                                           November  1998


-----------------    ----------      --------------
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     INTEGER

NOTE: It is expected that the number assignments will change in a later
draft to group items together according to usage and protocols.

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 INTEGER,
          statusString        UTF8String OPTIONAL,
          otherInfo           CHOICE {
            failInfo            CMCFailInfo,
            pendInfo            PendInfo } OPTIONAL
     }

     PendInfo ::= SEQUENCE {
          pendToken           INTEGER,
          pendTime            GENERALIZEDTIME
     }

     cMCStatus is described in section 5.2
     bodyList contains the list of body parts to which this status
     information applies.
     statusString contains a string with additional description
     information.  This string is human readable.
     failInfo is described in section 5.3. It provides a detailed error
     on what the failure was.  This choice is present only if cMCStatus
     is failed.


Myers, Liu, Fox, Weinstein                                      Page 12


Internet Draft                                           November  1998


     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 the cMCStatus is the 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.2   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),
           -- 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
           -- pending may only be return for certificate request
     operations.
           noSupport              (4),
           -- the requested operation is not supported
     }

5.3   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
          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


Myers, Liu, Fox, Weinstein                                      Page 13


Internet Draft                                           November  1998


          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)
     }

Additional failure reasons MAY be defined for closed environments with a
need.

5.4  Identification and Identity-Proof 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 fields of the PKIData object 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 stream produced in Step
   1, as described in [HMAC], using the hash of the token from Step 2 as
   the shared secret value.
4. The 160-bit HMAC-SHA1 result from Step 3 is then encoded as the value
   of the identity-proof attribute.

When the server verifies the identity-proof attribute, it computes the
HMAC-SHA1 value in the same way and compares it to the identity-proof
attribute contained in the enrollment request.

If a server fails the verification of an identity-proof 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 attribution with an identity-proof attribute.  The
identification attribute is intended to contain either a text string or


Myers, Liu, Fox, Weinstein                                      Page 14


Internet Draft                                           November  1998


a numeric quantity, such as a random number, which assists the server in
locating the shared secret needed to validate the contents of the
identity-proof attribute.  Numeric values MUST be converted to text
string representations prior to encoding as UTF8-STRINGs in this
attribute.  If the identity field 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.

To facilitate one pass processing of a PKIData object, the identity
attribute SHOULD proceed the identity-proof attribute.

5.5  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.6  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             INTEGER
        certReferences               SEQUENCE OF INTEGER,
        extensions                   SEQUENCE OF Extension
    }

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
every element referenced in the certReferences sequence.
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


Myers, Liu, Fox, Weinstein                                      Page 15


Internet Draft                                           November  1998


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 on an extension by
extension basis:

1. If the conflict is within a single EnrollmentBody object, the
   certificate request would be rejected with and error of BADREQUEST.
2. If the conflict is between different EnrollmentBody objects, the
   outermost version of the extension would be used.

5.7  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 MAY 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.

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


Myers, Liu, Fox, Weinstein                                      Page 16


Internet Draft                                           November  1998


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 recipient-
Nonce AND include a value for the SenderNonce attribute.

If a transaction originator includes a value for the transaction-id
attribute in a service request, responses MUST include this value as a
value for transaction-id attribute.

5.8  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 on a
public key actually possesses the corresponding private component of the
key pair.  For keys that may be used as signature keys, signing the
certification request with the private key may serve 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 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 {
          bodyPartID     INTEGER,
          cms            contentInfo,
          thePOPAlgID    AlgorithmIdentifier,
          witnessAlgID   AlgorithmIdentifier,


Myers, Liu, Fox, Weinstein                                      Page 17


Internet Draft                                           November  1998


          witness        OCTET STRING
     }

     DecryptedPOP ::= SEQUENCE {
          bodyPartID     INTEGER,
          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. bodyPartID refers to the certificate request in the original
      request message,
   b. cms is an EnvelopedData object, the content type being id-data and
      the content begin 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.
4. The client creates the decryptedPOP as part of a new PKIData message.
   The fields in the decryptedPOP are:
   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.  If y is greater than 64 bytes, only the first 64 bytes of y
are used as the secret.



Myers, Liu, Fox, Weinstein                                      Page 18


Internet Draft                                           November  1998


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 request on public encryption key PK, server computes y = F(x,PK).
   F can be, for example, HMAC-SHA1(x,PK).  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
   PK, thus the use of a OWF like HMAC-SHA1.

5.9  LRA POP Witnesses Control Attribute

If an out-of-band POP is required for a certificate enrollment, an LRA
can be the entity that does the out-of-band POP rather than the CA.  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   INTEGER,
         bodyIds         SEQUENCE of INTEGER
     }

The 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.10 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.



Myers, Liu, Fox, Weinstein                                      Page 19


Internet Draft                                           November  1998


It is assumed that a key recovery operation will only return previously-
archive material.  (That is, if an archival and recovery operation
happen simultaneously, the newly archived key material is not returned
as part of the recovery response.)

The Key Recover Response control can also be used to implment 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.10.1  Key Archival Control Attribute


The key archival control attribute has the following ASN.1 syntax:

     KeyArchival ::= SEQUENCE {
          reqBodyPartID       INTEGER,
          cmsBodyPartID       INTEGER,
          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 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.10.2  Key Recovery Request Control Attribute


The key recovery request control attribute has the following ASN.1
syntax:

     KeyRecoveryReq ::= SEQUENCE {
          shroudIdentification     ShroudIdentification,
          bulkEncryptionAlgID      AlgorithmIdentifier,
          selectionCriterial       OCTET STRING OPTIONAL
     }

     ShroudIdentification ::= CHOICE {
          subjectPublicKeyInfo     [0] SubjectPublicKeyInfo,
          encryptionToken          [1] AlgorithmIdentifier
     }



Myers, Liu, Fox, Weinstein                                      Page 20


Internet Draft                                           November  1998



The shroudIdentification structure defines the encryption method and key
material that MUST be used in the recovery reply 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.

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 an entity identifier.
Determination of the identity comes from other locations: The name in a
certificate request, the name in an identity 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.10.3  Key Recovery Response Control Attribute


The key recovery response control attribute has the following ASN.1
syntax:

     KeyRecoveryRsp ::= SEQUENCE {
          bodyPartID               INTEGER,
          selectionCriteria        OCTET STRING OPTIONAL
     }

The bodyPartID identifies a TaggedContentInfo contained within the
enclosing PKIData.  The ContentInfo contains the requested private key
material.

The selectionCriteria is the optional information that was used to
retrieve a subset of the keys archived in the archive database.


5.10.4  Private Key Info Attribute






Myers, Liu, Fox, Weinstein                                      Page 21


Internet Draft                                           November  1998


The private key info attribute is imported from [PKCS8].  The encrypted
private key info object is not imported as the only difference between
it and an EncryptedData object is the inclusion of a version number in
the ASN.1 structure.

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 two algorithms.

5.10.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.10.4.2  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.10.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




Myers, Liu, Fox, Weinstein                                      Page 22


Internet Draft                                           November  1998


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.10.6 Control Flow


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.
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
      include 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 Enrollment 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 Enrollment Response containing:
   a. One or more Key Recovery Response control attributes.
   b. One or more Private Key attributes containing private key material
      as defined in section 5.10.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 Enrollment 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.




Myers, Liu, Fox, Weinstein                                      Page 23


Internet Draft                                           November  1998


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 Enrollment Request message containing:
   a. The certificate request from Step 1,
   b. A Key Recovery Request control attribute.
   The Full Enrollment 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 an 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
   identificationProof control attributes).
3. Client sends the Full Enrollment 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 Enrollment 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.11 Get Certificate Control Attribute

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 it's
certificate in non-volatile memory.)

CAs do not need to implement this control attribute to be compliant with
CMC.

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



Myers, Liu, Fox, Weinstein                                      Page 24


Internet Draft                                           November  1998


get certificate attribute is the only control in a full enrollment
message, the response would be a simple enrollment response.

5.12 Get CRL Control Attribute

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.

CAs do not need to implement this control attribute to be compliant with
this specification.

The get CRL control attribute has the following ASN.1 structure:

     GetCRL ::= SEQUENCE {
         issuerName    Name,
         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.  Implementors 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.13 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:


Myers, Liu, Fox, Weinstein                                      Page 25


Internet Draft                                           November  1998



     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. A
Registration Authority's digital signature on the request can provide
this proof for certificates within the scope of the LRA's revocation
authority.  The means by which an LRA is delegated this authority is a
matter of operational policy.

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.

Clients MUST provide the capability to produce a digitally signed
revocation request control attribute.  Clients SHOULD provide the
capability produce 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.14 Registration and Response Information Control Attributes

The registration information control attribute is for clients and LRAs
to pass additional information as part a PKI request.  The registration
information 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 registration info, then that data is returned as a response
information control attribute.  The content of the OCTET STRING for a
response information is based on bilateral agreement between the client
and server.


Myers, Liu, Fox, Weinstein                                      Page 26


Internet Draft                                           November  1998



5.15 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 ::= INTEGER

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 Agents

This specification permits the use of Local Registration Agents (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



Myers, Liu, Fox, Weinstein                                      Page 27


Internet Draft                                           November  1998


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

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 validation path,
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 bare
(section 7.2) or MIME wrapped (section 7.1).

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



Myers, Liu, Fox, Weinstein                                      Page 28


Internet Draft                                           November  1998


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 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 Repsonse
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.




Myers, Liu, Fox, Weinstein                                      Page 29


Internet Draft                                           November  1998


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
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.

9.  Security Considerations

Initiation of a secure communications channel between an end-entity and
a 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.7.  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.

Clients and servers need to do some checks on cryptographic parameters
prior to issuing certificates to make sure that weak parameters are not
used.



Myers, Liu, Fox, Weinstein                                      Page 30


Internet Draft                                           November  1998


Small Group Attack

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 Jim Schaad and Brian LaMacchia for their
work in developing and writing up many of the concepts presented in this
document.  The authors would also like to thank Alex Deacon for his
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

[PKCS7]  B. Kaliski, "PKCS #7: Cryptographic Message Syntax v1.5",
         RFC 2315, October 1997

[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

[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

13. Author's Addresses

Michael Myers
VeriSign Inc.
1390 Shorebird Way


Myers, Liu, Fox, Weinstein                                      Page 31


Internet Draft                                           November  1998


Mountain View, CA, 94019
(650) 429-3402
mmyers@verisign.com

Xiaoyi Liu
Cisco Systems
170 West Tasman Drive
San Jose, CA 95134
(480) 526-7430
xliu@cisco.com

Barbara Fox
Microsoft Corporation
One Microsoft Way
Redmond, WA  98052
(425) 936-9542
bfox@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) TBD }

   DEFINITIONS IMPLICIT TAGS ::=
   BEGIN

   -- EXPORTS All --
   -- The types and values defined in this module are exported for use
   -- 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


Myers, Liu, Fox, Weinstein                                      Page 32


Internet Draft                                           November  1998


        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 { <TBD> };


    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 ::= {<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}

    -- This is the content type used for a request message in the
protocol

    id-ct-PKIData OBJECT IDENTIFIER ::= { id-pkix <TBD> }


    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
    }

    TaggedAttribute ::= SEQUENCE {
        bodyPartID         INTEGER,
        attrType           OBJECT IDENTIFIER,
        attrValues         SET OF AttributeValue


Myers, Liu, Fox, Weinstein                                      Page 33


Internet Draft                                           November  1998


    }

    AttributeValue ::= ANY

    TaggedRequest ::= CHOICE {
        tcr               [0] TaggedCertificationRequest,
        crm               [1] CertReqMsg
    }

    TaggedCertificationRequest ::= SEQUENCE {
        bodyPartID            INTEGER,
        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              INTEGER,
        contentInfo             ContentInfo
    }

    OtherMsg ::= SEQUENCE {
        bodyPartID        INTEGER,
        otherMsgType      OBJECT IDENTIFIER,
        otherMsgValue     ANY DEFINED BY otherMsgType }

    --  This defines the response message in the protocol
    id-ct-enrollResponse OBJECT IDENTIFIER ::= {id-pkix <TBD> }

    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 {


Myers, Liu, Fox, Weinstein                                      Page 34


Internet Draft                                           November  1998


          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),
        -- 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}



Myers, Liu, Fox, Weinstein                                      Page 35


Internet Draft                                           November  1998


    AddExtensions ::= SEQUENCE {
        pkiDataReference    INTEGER,
        certReferences      SEQUENCE OF INTEGER,
        extensions          SEQUENCE OF Extension
    }

    id-encryptedPOP OBJECT IDENTIFIER ::= {id-pkix-cmc 9}
    id-decryptedPOP OBJECT IDENTIFIER ::= {id-pkix-cmc 10}

    EncryptedPOP ::= SEQUENCE {
        bodyPartID      INTEGER,
        cms             ContentInfo,
        thePOPAlgID     AlgorithmIdentifier,
        witnessAlgID    AlgorithmIdentifier,
        witness         OCTET STRING
    }

    DecryptedPOP ::= SEQUENCE {
        bodyPartID      INTEGER,
        thePOPAlgID     AlgorithmIdentifier,
        thePOP          OCTET STRING
    }

    id-lraPOPWitness OBJECT IDENTIFIER ::= {id-pkix-cmc 11}

    LraPopWitness ::= SEQUENCE {
        pkiDataBodyid   INTEGER,
        bodyIds         SEQUENCE OF INTEGER
    }

    id-keyArchival OBJECT IDENTIFIER ::= {id-pkix-cmc 12}
    id-keyRecoveryReq OBJECT IDENTIFIER ::= {id-pkix-cmc 13}
    id-keyRecoveryRsp OBJECT IDENTIFIER ::= {id-pkix-cmc 14}

    KeyArchival ::= SEQUENCE {
        reqBodyPartID           INTEGER,
        cmsBodyPartID           INTEGER,
        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              INTEGER,
        selectionCriteria       OCTET STRING OPTIONAL


Myers, Liu, Fox, Weinstein                                      Page 36


Internet Draft                                           November  1998


    }

    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}

    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

END







Myers, Liu, Fox, Weinstein                                      Page 37