cmmf.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:43k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 8 -*-*/
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #ifndef _CMMF_H_
  35. #define _CMMF_H_
  36. /*
  37.  * These are the functions exported by the security library for 
  38.  * implementing Certificate Management Message Formats (CMMF).
  39.  *
  40.  * This API is designed against July 1998 CMMF draft.  Please read this
  41.  * draft before trying to use this API in an application that use CMMF.
  42.  */
  43. #include "seccomon.h"
  44. #include "cmmft.h"
  45. #include "crmf.h"
  46. SEC_BEGIN_PROTOS
  47. /******************* Creation Functions *************************/
  48. /*
  49.  * FUNCTION: CMMF_CreateCertRepContent
  50.  * INPUTS:
  51.  *    NONE
  52.  * NOTES:
  53.  *    This function will create an empty CMMFCertRepContent Structure.  
  54.  *    The client of the library must set the CMMFCertResponses.
  55.  *    Call CMMF_CertRepContentSetCertResponse to accomplish this task.
  56.  *    If the client of the library also wants to include the chain of 
  57.  *    CA certs required to make the certificates in CMMFCertResponse valid, 
  58.  *    then the user must also set the caPubs field of CMMFCertRepContent.
  59.  *    Call CMMF_CertRepContentSetCAPubs to accomplish this.  After setting
  60.  *    the desired fields, the user can then call CMMF_EncodeCertRepContent 
  61.  *    to DER-encode the CertRepContent.
  62.  * RETURN:
  63.  *    A pointer to the CMMFCertRepContent.  A NULL return value indicates 
  64.  *    an error in allocating memory or failure to initialize the structure.
  65.  */
  66. extern CMMFCertRepContent* CMMF_CreateCertRepContent(void);
  67. /*
  68.  * FUNCTION: CMMF_CreateCertRepContentFromDER
  69.  * INPUTS
  70.  *    db
  71.  *        The certificate database where the certificates will be placed.
  72.  *        The certificates will be placed in the temporary database associated
  73.  *        with the handle. 
  74.  *    buf
  75.  *        A buffer to the DER-encoded CMMFCertRepContent
  76.  *    len
  77.  *        The length in bytes of the buffer 'buf'
  78.  * NOTES:
  79.  *    This function passes the buffer to the ASN1 decoder and creates a
  80.  *    CMMFCertRepContent structure.  The user must call 
  81.  *    CMMF_DestroyCertRepContent after the return value is no longer needed.
  82.  *
  83.  * RETURN:
  84.  *    A pointer to the CMMFCertRepContent structure.  A NULL return
  85.  *    value indicates the library was unable to parse the DER.
  86.  */
  87. extern CMMFCertRepContent* 
  88.        CMMF_CreateCertRepContentFromDER(CERTCertDBHandle *db, 
  89. const char       *buf, 
  90. long              len);
  91. /*
  92.  * FUNCTION: CMMF_CreateCertResponse
  93.  * INPUTS:
  94.  *    inCertReqId
  95.  *        The Certificate Request Id this response is for.
  96.  * NOTES:
  97.  *    This creates a CMMFCertResponse.  This response should correspond
  98.  *    to a request that was received via CRMF.  From the CRMF message you
  99.  *    can get the Request Id to pass in as inCertReqId, in essence binding 
  100.  *    a CMRFCertRequest message to the CMMFCertResponse created by this
  101.  *    function.  If no requuest id is associated with the response to create
  102.  *    then the user should pass in -1 for 'inCertReqId'.
  103.  *
  104.  * RETURN:
  105.  *    A pointer to the new CMMFCertResponse corresponding to the request id 
  106.  *    passed in.  A NULL return value indicates an error while trying to 
  107.  *    create the CMMFCertResponse.
  108.  */
  109. extern CMMFCertResponse* CMMF_CreateCertResponse(long inCertReqId);
  110. /*
  111.  * FUNCTION: CMMF_CreateKeyRecRepContent
  112.  * INPUTS:
  113.  *    NONE
  114.  * NOTES:
  115.  *    This function creates a new empty CMMFKeyRecRepContent structure.
  116.  *    At the very minimum, the user  must call 
  117.  *    CMMF_KeyRecRepContentSetPKIStatusInfoStatus field to have an
  118.  *    encodable structure.  Depending on what the response is, the user may
  119.  *    have to set other fields as well to properly build up the structure so
  120.  *    that it can be encoded.  Refer to the CMMF draft for how to properly
  121.  *    set up a CMMFKeyRecRepContent. This is the structure that an RA returns
  122.  *    to an end entity when doing key recovery.
  123.  *    The user must call CMMF_DestroyKeyRecRepContent when the return value
  124.  *    is no longer needed.
  125.  * RETURN:
  126.  *    A pointer to the empty CMMFKeyRecRepContent.  A return value of NULL
  127.  *    indicates an error in allocating memory or initializing the structure.
  128.  */
  129. extern CMMFKeyRecRepContent *CMMF_CreateKeyRecRepContent(void);
  130. /*
  131.  * FUNCTION: CMMF_CreateKeyRecRepContentFromDER
  132.  * INPUTS:
  133.  *    db
  134.  *        The handle for the certificate database where the decoded 
  135.  *        certificates will be placed.  The decoded certificates will
  136.  *        be placed in the temporary database associated with the 
  137.  *        handle.
  138.  *    buf
  139.  *        A buffer contatining the DER-encoded CMMFKeyRecRepContent
  140.  *    len
  141.  *        The length in bytes of the buffer 'buf'
  142.  * NOTES
  143.  *    This function passes the buffer to the ASN1 decoder and creates a 
  144.  *    CMMFKeyRecRepContent structure.
  145.  *
  146.  * RETURN:
  147.  *    A pointer to the CMMFKeyRecRepContent structure.  A NULL return
  148.  *    value indicates the library was unable to parse the DER.
  149.  */
  150. extern CMMFKeyRecRepContent* 
  151.        CMMF_CreateKeyRecRepContentFromDER(CERTCertDBHandle *db,
  152.   const char       *buf,
  153.   long              len);
  154. /*
  155.  * FUNCTION: CMMF_CreatePOPODecKeyChallContent
  156.  * INPUTS:
  157.  *    NONE
  158.  * NOTES:
  159.  *    This function creates an empty CMMFPOPODecKeyChallContent.  The user
  160.  *    must add the challenges individually specifying the random number to
  161.  *    be used and the public key to be used when creating each individual 
  162.  *    challenge.  User can accomplish this by calling the function 
  163.  *    CMMF_POPODecKeyChallContentSetNextChallenge.
  164.  * RETURN:
  165.  *    A pointer to a CMMFPOPODecKeyChallContent structure.  Ther user can
  166.  *    then call CMMF_EncodePOPODecKeyChallContent passing in the return
  167.  *    value from this function after setting all of the challenges.  A 
  168.  *    return value of NULL indicates an error while creating the 
  169.  *    CMMFPOPODecKeyChallContent structure.
  170.  */
  171. extern CMMFPOPODecKeyChallContent*
  172.        CMMF_CreatePOPODecKeyChallContent(void);
  173. /*
  174.  * FUNCTION: CMMF_CreatePOPODecKeyChallContentFromDER
  175.  * INPUTS
  176.  *    buf
  177.  *        A buffer containing the DER-encoded CMMFPOPODecKeyChallContent
  178.  *    len
  179.  *        The length in bytes of the buffer 'buf'
  180.  * NOTES:
  181.  *    This function passes the buffer to the ASN1 decoder and creates a
  182.  *    CMMFPOPODecKeyChallContent structure.  
  183.  *
  184.  * RETURN:
  185.  *    A pointer to the CMMFPOPODecKeyChallContent structure.  A NULL return
  186.  *    value indicates the library was unable to parse the DER.
  187.  */
  188. extern CMMFPOPODecKeyChallContent*
  189.        CMMF_CreatePOPODecKeyChallContentFromDER(const char *buf, long len);
  190. /*
  191.  * FUNCTION: CMMF_CreatePOPODecKeyRespContentFromDER
  192.  * INPUTS:
  193.  *    buf
  194.  *        A buffer contatining the DER-encoded CMMFPOPODecKeyRespContent
  195.  *    len
  196.  *        The length in bytes of the buffer 'buf'
  197.  * NOTES
  198.  *    This function passes the buffer to the ASN1 decoder and creates a 
  199.  *    CMMFPOPODecKeyRespContent structure.
  200.  *
  201.  * RETURN:
  202.  *    A pointer to the CMMFPOPODecKeyRespContent structure.  A NULL return
  203.  *    value indicates the library was unable to parse the DER.
  204.  */
  205. extern CMMFPOPODecKeyRespContent*
  206.        CMMF_CreatePOPODecKeyRespContentFromDER(const char *buf, long len);
  207. /************************** Set Functions *************************/
  208. /*
  209.  * FUNCTION: CMMF_CertRepContentSetCertResponses
  210.  * INPUTS:
  211.  *    inCertRepContent
  212.  *        The CMMFCertRepContent to operate on.
  213.  *    inCertResponses
  214.  *        An array of pointers to CMMFCertResponse structures to 
  215.  *        add to the CMMFCertRepContent structure.
  216.  *    inNumResponses
  217.  *        The length of the array 'inCertResponses'
  218.  * NOTES:
  219.  *    This function will add the CMMFCertResponse structure to the 
  220.  *    CMMFCertRepContent passed in.  The CMMFCertResponse field of 
  221.  *    CMMFCertRepContent is required, so the client must call this function
  222.  *    before calling CMMF_EncodeCertRepContent.  If the user calls 
  223.  *    CMMF_EncodeCertRepContent before calling this function, 
  224.  *    CMMF_EncodeCertRepContent will fail.
  225.  *
  226.  * RETURN:
  227.  *    SECSuccess if adding the CMMFCertResponses to the CMMFCertRepContent
  228.  *    structure was successful.  Any other return value indicates an error
  229.  *    while trying to add the CMMFCertResponses.
  230.  */
  231. extern SECStatus 
  232.       CMMF_CertRepContentSetCertResponses(CMMFCertRepContent *inCertRepContent,
  233.   CMMFCertResponse  **inCertResponses,
  234.   int                 inNumResponses);
  235. /*
  236.  * FUNCTION: CMMF_CertRepContentSetCAPubs
  237.  * INPUTS:
  238.  *    inCertRepContent
  239.  *        The CMMFCertRepContent to operate on.
  240.  *    inCAPubs
  241.  *        The certificate list which makes up the chain of CA certificates
  242.  *        required to make the issued cert valid.
  243.  * NOTES:
  244.  *    This function will set the the certificates in the CA chain as part
  245.  *    of the CMMFCertRepContent.  This field is an optional member of the 
  246.  *    CMMFCertRepContent structure, so the client is not required to call
  247.  *    this function before calling CMMF_EncodeCertRepContent.
  248.  *
  249.  * RETURN:
  250.  *    SECSuccess if adding the 'inCAPubs' to the CERTRepContent was successful.
  251.  *    Any other return value indicates an error while adding 'inCAPubs' to the 
  252.  *    CMMFCertRepContent structure.
  253.  * 
  254.  */
  255. extern SECStatus 
  256.        CMMF_CertRepContentSetCAPubs (CMMFCertRepContent  *inCertRepContent,
  257.      CERTCertList        *inCAPubs);
  258. /*
  259.  * FUNCTION: CMMF_CertResponseSetPKIStatusInfoStatus
  260.  * INPUTS:
  261.  *    inCertResp
  262.  *        The CMMFCertResponse to operate on.
  263.  *     inPKIStatus
  264.  *        The value to set for the PKIStatusInfo.status field.
  265.  * NOTES:
  266.  *    This function will set the CertResponse.status.status field of 
  267.  *    the CMMFCertResponse structure.  (View the definition of CertResponse
  268.  *    in the CMMF draft to see exactly which value this talks about.)  This
  269.  *    field is a required member of the structure, so the user must call this
  270.  *    function in order to have a CMMFCertResponse that can be encoded.
  271.  *
  272.  * RETURN:
  273.  *    SECSuccess if setting the field with the passed in value was successful.
  274.  *    Any other return value indicates an error while trying to set the field.
  275.  */
  276. extern SECStatus 
  277.      CMMF_CertResponseSetPKIStatusInfoStatus (CMMFCertResponse *inCertResp,
  278.       CMMFPKIStatus     inPKIStatus);
  279. /*
  280.  * FUNCTION: CMMF_CertResponseSetCertificate
  281.  * INPUTS:
  282.  *    inCertResp
  283.  *        The CMMFCertResponse to operate on.
  284.  *    inCertificate
  285.  *        The certificate to add to the 
  286.  *        CertResponse.CertifiedKeyPair.certOrEncCert.certificate field.
  287.  * NOTES:
  288.  *    This function will take the certificate and make it a member of the
  289.  *    CMMFCertResponse.  The certificate should be the actual certificate
  290.  *    being issued via the response.
  291.  *
  292.  * RETURN:
  293.  *    SECSuccess if adding the certificate to the response was successful.
  294.  *    Any other return value indicates an error in adding the certificate to
  295.  *    the CertResponse.
  296.  */
  297. extern SECStatus 
  298.        CMMF_CertResponseSetCertificate (CMMFCertResponse *inCertResp,
  299. CERTCertificate  *inCertificate);
  300. /*
  301.  * FUNCTION: CMMF_KeyRecRepContentSetPKIStatusInfoStatus
  302.  * INPUTS: 
  303.  *    inKeyRecRep
  304.  *        The CMMFKeyRecRepContent to operate on.
  305.  *    inPKIStatus
  306.  *        The value to set the PKIStatusInfo.status field to.
  307.  * NOTES:
  308.  *    This function sets the only required field for the KeyRecRepContent.
  309.  *    In most cases, the user will set this field and other fields of the
  310.  *    structure to properly create the CMMFKeyRecRepContent structure.  
  311.  *    Refer to the CMMF draft to see which fields need to be set in order
  312.  *    to create the desired CMMFKeyRecRepContent.
  313.  * 
  314.  * RETURN:
  315.  *    SECSuccess if setting the PKIStatusInfo.status field was successful.
  316.  *    Any other return value indicates an error in setting the field.
  317.  */
  318. extern SECStatus 
  319. CMMF_KeyRecRepContentSetPKIStatusInfoStatus(CMMFKeyRecRepContent *inKeyRecRep,
  320.     CMMFPKIStatus         inPKIStatus);
  321. /*
  322.  * FUNCTION: CMMF_KeyRecRepContentSetNewSignCert
  323.  * INPUTS:
  324.  *    inKeyRecRep
  325.  *        The CMMFKeyRecRepContent to operate on.
  326.  *    inNewSignCert
  327.  *        The new signing cert to add to the CMMFKeyRecRepContent structure.
  328.  * NOTES:
  329.  *    This function sets the new signeing cert in the CMMFKeyRecRepContent
  330.  *    structure.
  331.  *
  332.  * RETURN:
  333.  *    SECSuccess if setting the new signing cert was successful.  Any other 
  334.  *    return value indicates an error occurred while trying to add the
  335.  *    new signing certificate.
  336.  */
  337. extern SECStatus 
  338.        CMMF_KeyRecRepContentSetNewSignCert(CMMFKeyRecRepContent *inKeyRecRep,
  339.    CERTCertificate     *inNewSignCert);
  340. /*
  341.  * FUNCTION: CMMF_KeyRecRepContentSetCACerts
  342.  * INPUTS:
  343.  *    inKeyRecRep
  344.  *        The CMMFKeyRecRepContent to operate on.
  345.  *    inCACerts
  346.  *        The list of CA certificates required to construct a valid 
  347.  *        certificate chain with the certificates that will be returned
  348.  *        to the end user via this KeyRecRepContent.
  349.  * NOTES:
  350.  *    This function sets the caCerts that are required to form a chain with the
  351.  *    end entity certificates that are being re-issued in this 
  352.  *    CMMFKeyRecRepContent structure.
  353.  *
  354.  * RETURN:
  355.  *    SECSuccess if adding the caCerts was successful.  Any other return value
  356.  *    indicates an error while tring to add the caCerts.
  357.  */
  358. extern SECStatus 
  359.        CMMF_KeyRecRepContentSetCACerts(CMMFKeyRecRepContent *inKeyRecRep,
  360.        CERTCertList         *inCACerts);
  361. /*
  362.  * FUNCTION: CMMF_KeyRecRepContentSetCertifiedKeyPair
  363.  * INPUTS:
  364.  *    inKeyRecRep
  365.  *        The CMMFKeyRecRepContent to operate on.
  366.  *    inCert
  367.  *        The certificate to add to the CMMFKeyRecRepContent structure.
  368.  *    inPrivKey
  369.  *        The private key associated with the certificate above passed in.
  370.  *    inPubKey
  371.  *        The public key to use for wrapping the private key.
  372.  * NOTES:
  373.  *    This function adds another certificate-key pair to the 
  374.  *    CMMFKeyRecRepcontent structure.  There may be more than one 
  375.  *    certificate-key pair in the structure, so the user must call this 
  376.  *    function multiple times to add more than one cert-key pair.
  377.  *
  378.  * RETURN:
  379.  *    SECSuccess if adding the certified key pair was successful.  Any other
  380.  *    return value indicates an error in adding certified key pair to 
  381.  *    CMMFKeyRecRepContent structure.
  382.  */
  383. extern SECStatus 
  384.     CMMF_KeyRecRepContentSetCertifiedKeyPair(CMMFKeyRecRepContent *inKeyRecRep,
  385.      CERTCertificate      *inCert,
  386.      SECKEYPrivateKey     *inPrivKey,
  387.      SECKEYPublicKey      *inPubKey);
  388. /*
  389.  * FUNCTION: CMMF_POPODecKeyChallContentSetNextChallenge
  390.  * INPUTS:
  391.  *    inDecKeyChall
  392.  *        The CMMFPOPODecKeyChallContent to operate on.
  393.  *    inRandom
  394.  *        The random number to use when generating the challenge,
  395.  *    inSender
  396.  *        The GeneralName representation of the sender of the challenge.
  397.  *    inPubKey
  398.  *        The public key to use when encrypting the challenge.
  399.  *    passwdArg
  400.  *        This value will be passed to the function used for getting a
  401.  *        password.  The password for getting a password should be registered
  402.  *        by calling PK11_SetPasswordFunc before this function is called. 
  403.  *        If no password callback is registered and the library needs to 
  404.  *        authenticate to the slot for any reason, this function will fail.
  405.  * NOTES:
  406.  *    This function adds a challenge to the end of the list of challenges
  407.  *    contained by 'inDecKeyChall'.  Refer to the CMMF draft on how the
  408.  *    the random number passed in and the sender's GeneralName are used
  409.  *    to generate the challenge and witness fields of the challenge.  This
  410.  *    library will use SHA1 as the one-way function for generating the 
  411.  *    witess field of the challenge.
  412.  *
  413.  * RETURN:
  414.  *    SECSuccess if generating the challenge and adding to the end of list
  415.  *    of challenges was successful.  Any other return value indicates an error
  416.  *    while trying to generate the challenge.
  417.  */
  418. extern SECStatus
  419. CMMF_POPODecKeyChallContentSetNextChallenge
  420.                                    (CMMFPOPODecKeyChallContent *inDecKeyChall,
  421.     long                        inRandom,
  422.     CERTGeneralName            *inSender,
  423.     SECKEYPublicKey            *inPubKey,
  424.     void                       *passwdArg);
  425. /************************** Encoding Functions *************************/
  426. /*
  427.  * FUNCTION: CMMF_EncodeCertRepContent
  428.  * INPUTS:
  429.  *    inCertRepContent
  430.  *        The CMMFCertRepContent to DER-encode.
  431.  *    inCallback
  432.  *        A callback function that the ASN1 encoder will call whenever it 
  433.  *        wants to write out DER-encoded bytes.  Look at the defintion of 
  434.  *        CRMFEncoderOutputCallback in crmft.h for a description of the
  435.  *        parameters to the function.
  436.  *    inArg
  437.  *        An opaque pointer to a user-supplied argument that will be passed
  438.  *        to the callback funtion whenever the function is called.
  439.  * NOTES:
  440.  *    The CMMF library will use the same DER-encoding scheme as the CRMF 
  441.  *    library.  In other words, when reading CRMF comments that pertain to
  442.  *    encoding, those comments apply to the CMMF libray as well.  
  443.  *    The callback function will be called multiple times, each time supplying
  444.  *    the next chunk of DER-encoded bytes.  The user must concatenate the 
  445.  *    output of each successive call to the callback in order to get the
  446.  *    entire DER-encoded CMMFCertRepContent structure.
  447.  *
  448.  * RETURN:
  449.  *    SECSuccess if encoding the CMMFCertRepContent was successful.  Any 
  450.  *    other return value indicates an error while decoding the structure.
  451.  */
  452. extern SECStatus 
  453.        CMMF_EncodeCertRepContent (CMMFCertRepContent        *inCertRepContent,
  454.   CRMFEncoderOutputCallback  inCallback,
  455.   void                      *inArg);
  456. /*
  457.  * FUNCTION: CMMF_EncodeKeyRecRepContent
  458.  * INPUTS:
  459.  *    inKeyRecRep
  460.  *        The CMMFKeyRepContent to DER-encode.
  461.  *    inCallback
  462.  *        A callback function that the ASN1 encoder will call whenever it 
  463.  *        wants to write out DER-encoded bytes.  Look at the defintion of 
  464.  *        CRMFEncoderOutputCallback in crmft.h for a description of the
  465.  *        parameters to the function.
  466.  *    inArg
  467.  *        An opaque pointer to a user-supplied argument that will be passed
  468.  *        to the callback funtion whenever the function is called.
  469.  * NOTES:
  470.  *    The CMMF library will use the same DER-encoding scheme as the CRMF 
  471.  *    library.  In other words, when reading CRMF comments that pertain to
  472.  *    encoding, those comments apply to the CMMF libray as well.  
  473.  *    The callback function will be called multiple times, each time supplying
  474.  *    the next chunk of DER-encoded bytes.  The user must concatenate the 
  475.  *    output of each successive call to the callback in order to get the
  476.  *    entire DER-encoded CMMFCertRepContent structure.
  477.  *
  478.  * RETURN:
  479.  *    SECSuccess if encoding the CMMFKeyRecRepContent was successful.  Any 
  480.  *    other return value indicates an error while decoding the structure.
  481.  */
  482. extern SECStatus
  483.        CMMF_EncodeKeyRecRepContent(CMMFKeyRecRepContent      *inKeyRecRep,
  484.    CRMFEncoderOutputCallback  inCallback,
  485.    void                      *inArg);
  486. /*
  487.  * FUNCTION: CMMF_EncodePOPODecKeyChallContent
  488.  * INPUTS:
  489.  *    inDecKeyChall
  490.  *        The CMMFDecKeyChallContent to operate on.
  491.  *    inCallback
  492.  *        A callback function that the ASN1 encoder will call whenever it 
  493.  *        wants to write out DER-encoded bytes.  Look at the defintion of 
  494.  *        CRMFEncoderOutputCallback in crmft.h for a description of the
  495.  *        parameters to the function.
  496.  *    inArg
  497.  *        An opaque pointer to a user-supplied argument that will be passed
  498.  *        to the callback function whenever the function is called.
  499.  * NOTES:
  500.  *    The CMMF library will use the same DER-encoding scheme as the CRMF 
  501.  *    library.  In other words, when reading CRMF comments that pertain to
  502.  *    encoding, those comments apply to the CMMF libray as well.  
  503.  *    The callback function will be called multiple times, each time supplying
  504.  *    the next chunk of DER-encoded bytes.  The user must concatenate the 
  505.  *    output of each successive call to the callback in order to get the
  506.  *    entire DER-encoded CMMFCertRepContent structure.
  507.  *    The DER will be an encoding of the type POPODecKeyChallContents, which
  508.  *    is just a sequence of challenges.
  509.  *
  510.  * RETURN:
  511.  *    SECSuccess if encoding was successful.  Any other return value indicates
  512.  *    an error in trying to encode the Challenges.
  513.  */
  514. extern SECStatus 
  515. CMMF_EncodePOPODecKeyChallContent(CMMFPOPODecKeyChallContent *inDecKeyChall,
  516.   CRMFEncoderOutputCallback inCallback,
  517.   void                     *inArg);
  518. /*
  519.  * FUNCTION: CMMF_EncodePOPODecKeyRespContent
  520.  * INPUTS:
  521.  *    inDecodedRand
  522.  *        An array of integers to encode as the responses to 
  523.  *        CMMFPOPODecKeyChallContent.  The integers must be in the same order
  524.  *        as the challenges extracted from CMMFPOPODecKeyChallContent.
  525.  *    inNumRand
  526.  *        The number of random integers contained in the array 'inDecodedRand'
  527.  *    inCallback
  528.  *        A callback function that the ASN1 encoder will call whenever it 
  529.  *        wants to write out DER-encoded bytes.  Look at the defintion of 
  530.  *        CRMFEncoderOutputCallback in crmft.h for a description of the
  531.  *        parameters to the function.
  532.  *    inArg
  533.  *        An opaque pointer to a user-supplied argument that will be passed
  534.  *        to the callback funtion whenever the function is called.
  535.  * NOTES:
  536.  *    The CMMF library will use the same DER-encoding scheme as the CRMF 
  537.  *    library.  In other words, when reading CRMF comments that pertain to
  538.  *    encoding, those comments apply to the CMMF libray as well.  
  539.  *    The callback function will be called multiple times, each time supplying
  540.  *    the next chunk of DER-encoded bytes.  The user must concatenate the 
  541.  *    output of each successive call to the callback in order to get the
  542.  *    entire DER-encoded  POPODecKeyRespContent.
  543.  *
  544.  * RETURN:
  545.  *    SECSuccess if encoding was successful.  Any other return value indicates
  546.  *    an error in trying to encode the Challenges.
  547.  */
  548. extern SECStatus 
  549.       CMMF_EncodePOPODecKeyRespContent(long                     *inDecodedRand,
  550.        int                       inNumRand,
  551.        CRMFEncoderOutputCallback inCallback,
  552.        void                     *inArg); 
  553. /***************  Accessor function  ***********************************/
  554. /*
  555.  * FUNCTION: CMMF_CertRepContentGetCAPubs
  556.  * INPUTS:
  557.  *    inCertRepContent
  558.  *        The CMMFCertRepContent to extract the caPubs from.
  559.  * NOTES:
  560.  *    This function will return a copy of the list of certificates that
  561.  *    make up the chain of CA's required to make the cert issued valid.
  562.  *    The user must call CERT_DestroyCertList on the return value when 
  563.  *    done using the return value.  
  564.  *
  565.  *    Only call this function on a CertRepContent that has been decoded.
  566.  *    The client must call CERT_DestroyCertList when the certificate list
  567.  *    is no longer needed. 
  568.  *
  569.  *    The certs in the list will not be in the temporary database.  In order
  570.  *    to make these certificates a part of the permanent CA internal database,
  571.  *    the user must collect the der for all of these certs and call 
  572.  *    CERT_ImportCAChain.  Afterwards the certs will be part of the permanent
  573.  *    database.
  574.  *    
  575.  * RETURN:
  576.  *    A pointer to the CERTCertList representing the CA chain associated 
  577.  *    with the issued cert.  A NULL return value indicates  that no CA Pubs
  578.  *    were available in the CMMFCertRepContent structure. 
  579.  */
  580. extern CERTCertList* 
  581.        CMMF_CertRepContentGetCAPubs (CMMFCertRepContent *inCertRepContent);
  582. /*
  583.  * FUNCTION: CMMF_CertRepContentGetNumResponses
  584.  * INPUTS:
  585.  *    inCertRepContent
  586.  *        The CMMFCertRepContent to operate on.
  587.  * NOTES:
  588.  *    This function will return the number of CertResponses that are contained
  589.  *    by the CMMFCertRepContent passed in.
  590.  * 
  591.  * RETURN:
  592.  *    The number of CMMFCertResponses contained in the structure passed in.
  593.  */
  594. extern int 
  595.  CMMF_CertRepContentGetNumResponses (CMMFCertRepContent *inCertRepContent);
  596. /*
  597.  * FUNCTION: CMMF_CertRepContentGetResponseAtIndex
  598.  * INPUTS:
  599.  *    inCertRepContent
  600.  *        The CMMFCertRepContent to operate on.
  601.  *    inIndex
  602.  *        The index of the CMMFCertResponse the user wants a copy of.
  603.  * NOTES:
  604.  *    This funciton creates a copy of the CMMFCertResponse at the index 
  605.  *    corresponding to the parameter 'inIndex'.  Indexing is done like a
  606.  *    traditional C array, ie the valid indexes are (0...numResponses-1).
  607.  *    The user must call CMMF_DestroyCertResponse after the return value is 
  608.  *    no longer needed.
  609.  *
  610.  * RETURN:
  611.  *    A pointer to the CMMFCertResponse at the index corresponding to 
  612.  *    'inIndex'.  A return value of NULL indicates an error in copying 
  613.  *    the CMMFCertResponse.
  614.  */
  615. extern CMMFCertResponse*
  616. CMMF_CertRepContentGetResponseAtIndex (CMMFCertRepContent *inCertRepContent,
  617.        int                 inIndex);
  618. /*
  619.  * FUNCTION: CMMF_CertResponseGetCertReqId
  620.  * INPUTS:
  621.  *    inCertResp
  622.  *        The CMMFCertResponse to operate on.
  623.  * NOTES:
  624.  *    This function returns the CertResponse.certReqId from the 
  625.  *    CMMFCertResponse structure passed in.  If the return value is -1, that
  626.  *    means there is no associated certificate request with the CertResponse.
  627.  * RETURN:
  628.  *    A long representing the id of the certificate request this 
  629.  *    CMMFCertResponse corresponds to.  A return value of -1 indicates an
  630.  *    error in extracting the value of the integer.
  631.  */
  632. extern long CMMF_CertResponseGetCertReqId(CMMFCertResponse *inCertResp);
  633. /*
  634.  * FUNCTION: CMMF_CertResponseGetPKIStatusInfoStatus
  635.  * INPUTS:
  636.  *    inCertResp
  637.  *        The CMMFCertResponse to operate on.
  638.  * NOTES:
  639.  *    This function returns the CertResponse.status.status field of the 
  640.  *    CMMFCertResponse structure.
  641.  *
  642.  * RETURN:
  643.  *    The enumerated value corresponding to the PKIStatus defined in the CMMF
  644.  *    draft.  See the CMMF draft for the definition of PKIStatus.  See crmft.h
  645.  *    for the definition of CMMFPKIStatus.
  646.  */
  647. extern CMMFPKIStatus 
  648.        CMMF_CertResponseGetPKIStatusInfoStatus(CMMFCertResponse *inCertResp);
  649. /*
  650.  * FUNCTION: CMMF_CertResponseGetCertificate
  651.  * INPUTS:
  652.  *    inCertResp
  653.  *        The Certificate Response to operate on.
  654.  *    inCertdb
  655.  *        This is the certificate database where the function will place the
  656.  *        newly issued certificate.
  657.  * NOTES:
  658.  *    This function retrieves the CertResponse.certifiedKeyPair.certificate
  659.  *    from the CMMFCertResponse.  The user will get a copy of that certificate
  660.  *    so  the user must call CERT_DestroyCertificate when the return value is 
  661.  *    no longer needed.  The certificate returned will be in the temporary 
  662.  *    certificate database.
  663.  *
  664.  * RETURN:
  665.  *    A pointer to a copy of the certificate contained within the 
  666.  *    CMMFCertResponse.  A return value of NULL indicates an error while trying
  667.  *    to make a copy of the certificate.
  668.  */
  669. extern CERTCertificate*
  670.        CMMF_CertResponseGetCertificate(CMMFCertResponse *inCertResp,
  671.                                        CERTCertDBHandle *inCertdb);
  672. /*
  673.  * FUNCTION: CMMF_KeyRecRepContentGetPKIStatusInfoStatus
  674.  * INPUTS:
  675.  *    inKeyRecRep
  676.  *        The CMMFKeyRecRepContent structure to operate on.
  677.  * NOTES:
  678.  *    This function retrieves the KeyRecRepContent.status.status field of 
  679.  *    the CMMFKeyRecRepContent structure.
  680.  * RETURN:
  681.  *    The CMMFPKIStatus corresponding to the value held in the 
  682.  *    CMMFKeyRecRepContent structure.
  683.  */
  684. extern CMMFPKIStatus 
  685. CMMF_KeyRecRepContentGetPKIStatusInfoStatus(CMMFKeyRecRepContent *inKeyRecRep);
  686. /*
  687.  * FUNCTION: CMMF_KeyRecRepContentGetNewSignCert
  688.  * INPUTS:
  689.  *    inKeyRecRep
  690.  *        The CMMFKeyRecRepContent to operate on.
  691.  * NOTES:
  692.  *    This function retrieves the KeyRecRepContent.newSignCert field of the
  693.  *    CMMFKeyRecRepContent structure.  The user must call 
  694.  *    CERT_DestroyCertificate when the return value is no longer needed. The
  695.  *    returned certificate will be in the temporary database.  The user 
  696.  *    must then place the certificate permanently in whatever token the
  697.  *    user determines is the proper destination.  A return value of NULL
  698.  *    indicates the newSigCert field was not present.
  699.  */
  700. extern CERTCertificate*
  701.        CMMF_KeyRecRepContentGetNewSignCert(CMMFKeyRecRepContent *inKeyRecRep);
  702. /*
  703.  * FUNCTION: CMMF_KeyRecRepContentGetCACerts
  704.  * INPUTS:
  705.  *    inKeyRecRep
  706.  *        The CMMFKeyRecRepContent to operate on.
  707.  * NOTES:
  708.  *    This function returns a CERTCertList which contains all of the 
  709.  *    certficates that are in the sequence KeyRecRepContent.caCerts
  710.  *    User must call CERT_DestroyCertList when the return value is no longer 
  711.  *    needed.  All of these certificates will be placed in the tempoaray
  712.  *    database.
  713.  *
  714.  * RETURN:
  715.  *    A pointer to the list of caCerts contained in the CMMFKeyRecRepContent
  716.  *    structure.  A return value of NULL indicates the library was not able to 
  717.  *    make a copy of the certifcates.  This may be because there are no caCerts
  718.  *    included in the CMMFKeyRecRepContent strucure or an internal error.  Call
  719.  *    CMMF_KeyRecRepContentHasCACerts to find out if there are any caCerts 
  720.  *    included in 'inKeyRecRep'.
  721.  */
  722. extern CERTCertList*
  723.        CMMF_KeyRecRepContentGetCACerts(CMMFKeyRecRepContent *inKeyRecRep);
  724. /*
  725.  * FUNCTION: CMMF_KeyRecRepContentGetNumKeyPairs
  726.  * INPUTS:
  727.  *    inKeyRecRep
  728.  *        The CMMFKeyRecRepContent to operate on.
  729.  * RETURN:
  730.  *    This function returns the number of CMMFCertifiedKeyPair structures that
  731.  *    that are stored in the KeyRecRepContent structure.
  732.  */
  733. extern int 
  734.        CMMF_KeyRecRepContentGetNumKeyPairs(CMMFKeyRecRepContent *inKeyRecRep);
  735. /*
  736.  * FUNCTION: CMMF_KeyRecRepContentGetCertKeyAtIndex
  737.  * INPUTS:
  738.  *    inKeyRecRepContent
  739.  *        The CMMFKeyRecRepContent to operate on.
  740.  *    inIndex
  741.  *        The index of the desired CMMFCertifiedKeyPair
  742.  * NOTES:
  743.  *    This function retrieves the CMMFCertifiedKeyPair structure at the index
  744.  *    'inIndex'.  Valid indexes are 0...(numKeyPairs-1)  The user must call 
  745.  *    CMMF_DestroyCertifiedKeyPair when the return value is no longer needed.
  746.  *
  747.  * RETURN:
  748.  *    A pointer to the Certified Key Pair at the desired index.  A return value
  749.  *    of NULL indicates an error in extracting the Certified Key Pair at the 
  750.  *    desired index.
  751.  */
  752. extern CMMFCertifiedKeyPair*
  753.       CMMF_KeyRecRepContentGetCertKeyAtIndex(CMMFKeyRecRepContent *inKeyRecRep,
  754.      int                   inIndex);
  755. /*
  756.  * FUNCTION: CMMF_CertifiedKeyPairGetCertificate
  757.  * INPUTS:
  758.  *    inCertKeyPair
  759.  *        The CMMFCertifiedKeyPair to operate on.
  760.  *    inCertdb
  761.  *        The database handle for the database you want this certificate
  762.  *        to wind up in.
  763.  * NOTES:
  764.  *    This function retrieves the certificate at 
  765.  *    CertifiedKeyPair.certOrEncCert.certificate
  766.  *    The user must call CERT_DestroyCertificate when the return value is no
  767.  *    longer needed.  The user must import this certificate as a token object
  768.  *    onto PKCS#11 slot in order to make it a permanent object.  The returned
  769.  *    certificate will be in the temporary database.
  770.  * 
  771.  * RETURN:
  772.  *    A pointer to the certificate contained within the certified key pair.
  773.  *    A return value of NULL indicates an error in creating the copy of the 
  774.  *    certificate.
  775.  */
  776. extern CERTCertificate*
  777.       CMMF_CertifiedKeyPairGetCertificate(CMMFCertifiedKeyPair *inCertKeyPair,
  778.   CERTCertDBHandle     *inCertdb);
  779. /*
  780.  * FUNCTION: CMMF_POPODecKeyChallContentGetNumChallenges
  781.  * INPUTS:
  782.  *    inKeyChallCont
  783.  *        The CMMFPOPODecKeyChallContent to operate on.
  784.  * RETURN:
  785.  *    This function returns the number of CMMFChallenges are contained in 
  786.  *    the CMMFPOPODecKeyChallContent structure.
  787.  */
  788. extern int CMMF_POPODecKeyChallContentGetNumChallenges
  789.                                   (CMMFPOPODecKeyChallContent *inKeyChallCont);
  790. /*
  791.  * FUNCTION: CMMF_POPODecKeyChallContentGetPublicValue
  792.  * ---------------------------------------------------
  793.  * INPUTS:
  794.  *    inKeyChallCont
  795.  *        The CMMFPOPODecKeyChallContent to operate on.
  796.  *    inIndex
  797.  *        The index of the Challenge within inKeyChallCont to operate on.
  798.  *        Indexes start from 0, ie the Nth Challenge corresponds to index
  799.  *        N-1.
  800.  * NOTES:
  801.  * This function retrieves the public value stored away in the Challenge at
  802.  * index inIndex of inKeyChallCont.
  803.  * RETURN:
  804.  * A pointer to a SECItem containing the public value.  User must call 
  805.  * SECITEM_FreeItem on the return value when the value is no longer necessary.
  806.  * A return value of NULL indicates an error while retrieving the public value.
  807.  */
  808. extern SECItem* CMMF_POPODecKeyChallContentGetPublicValue
  809.                                    (CMMFPOPODecKeyChallContent *inKeyChallCont,
  810.     int                         inIndex);
  811. /*
  812.  * FUNCTION: CMMF_POPODecKeyChallContentGetRandomNumber
  813.  * INPUTS:
  814.  *    inChallContent
  815.  *        The CMMFPOPODecKeyChallContent to operate on.
  816.  *    inIndex
  817.  *        The index of the challenge to look at.  Valid indexes are 0 through
  818.  *        (CMMF_POPODecKeyChallContentGetNumChallenges(inChallContent) - 1).
  819.  *    inDest
  820.  *        A pointer to a user supplied buffer where the library
  821.  *        can place a copy of the random integer contatained in the
  822.  *        challenge.
  823.  * NOTES:
  824.  *    This function returns the value held in the decrypted Rand structure
  825.  *    corresponding to the random integer.  The user must call 
  826.  *    CMMF_POPODecKeyChallContentDecryptChallenge before calling this function.  Call 
  827.  *    CMMF_ChallengeIsDecrypted to find out if the challenge has been 
  828.  *    decrypted.
  829.  *
  830.  * RETURN:
  831.  *    SECSuccess indicates the witness field has been previously decrypted
  832.  *    and the value for the random integer was successfully placed at *inDest.
  833.  *    Any other return value indicates an error and that the value at *inDest
  834.  *    is not a valid value.
  835.  */
  836. extern SECStatus CMMF_POPODecKeyChallContentGetRandomNumber
  837.                                       (CMMFPOPODecKeyChallContent *inKeyChallCont,
  838.        int                          inIndex,
  839.        long                        *inDest);
  840. /*
  841.  * FUNCTION: CMMF_POPODecKeyRespContentGetNumResponses
  842.  * INPUTS:
  843.  *    inRespCont
  844.  *        The POPODecKeyRespContent to operate on.
  845.  * RETURN:
  846.  * This function returns the number of responses contained in inRespContent.
  847.  */
  848. extern int 
  849.  CMMF_POPODecKeyRespContentGetNumResponses(CMMFPOPODecKeyRespContent *inRespCont);
  850. /*
  851.  * FUNCTION: CMMF_POPODecKeyRespContentGetResponse
  852.  * INPUTS:
  853.  *    inRespCont
  854.  *        The POPODecKeyRespContent to operate on.
  855.  *    inIndex
  856.  *        The index of the response to retrieve.
  857.  *        The Nth response is at index N-1, ie the 1st response is at index 0,
  858.  *        the 2nd response is at index 1, and so on.
  859.  *    inDest
  860.  *        A pointer to a pre-allocated buffer where the library can put the 
  861.  *        value of the response located at inIndex.
  862.  * NOTES:
  863.  * The function returns the response contained at index inIndex.  
  864.  * CMMFPOPODecKeyRespContent is a structure that the server will generally 
  865.  * get in response to a CMMFPOPODecKeyChallContent.  The server will expect
  866.  * to see the responses in the same order as it constructed them in 
  867.  * the CMMFPOPODecKeyChallContent structure.
  868.  * RETURN:
  869.  * SECSuccess if getting the response at the desired index was successful.  Any
  870.  * other return value indicates an errror.
  871.  */
  872. extern SECStatus
  873.      CMMF_POPODecKeyRespContentGetResponse (CMMFPOPODecKeyRespContent *inRespCont,
  874.     int                        inIndex,
  875.     long                      *inDest);
  876. /************************* Destructor Functions ******************************/
  877. /*
  878.  * FUNCTION: CMMF_DestroyCertResponse
  879.  * INPUTS:
  880.  *    inCertResp
  881.  *        The CMMFCertResponse to destroy.
  882.  * NOTES:
  883.  *    This function frees all the memory associated with the CMMFCertResponse
  884.  *    passed in.
  885.  * RETURN:
  886.  *    SECSuccess if freeing the memory was successful.  Any other return value
  887.  *    indicates an error while freeing the memory.
  888.  */
  889. extern SECStatus CMMF_DestroyCertResponse(CMMFCertResponse *inCertResp);
  890. /*
  891.  * FUNCTION: CMMF_DestroyCertRepContent
  892.  * INPUTS:
  893.  *    inCertRepContent
  894.  *        The CMMFCertRepContent to destroy
  895.  * NOTES:
  896.  *    This function frees the memory associated with the CMMFCertRepContent
  897.  *    passed in.
  898.  * RETURN:
  899.  *    SECSuccess if freeing all the memory associated with the 
  900.  *    CMMFCertRepContent passed in is successful.  Any other return value 
  901.  *    indicates an error while freeing the memory.
  902.  */
  903. extern SECStatus 
  904.        CMMF_DestroyCertRepContent (CMMFCertRepContent *inCertRepContent);
  905. /*
  906.  * FUNCTION: CMMF_DestroyKeyRecRepContent
  907.  * INPUTS:
  908.  *    inKeyRecRep
  909.  *        The CMMFKeyRecRepContent to destroy.
  910.  * NOTES:
  911.  *    This function destroys all the memory associated with the 
  912.  *    CMMFKeyRecRepContent passed in.
  913.  *
  914.  * RETURN:
  915.  *    SECSuccess if freeing all the memory is successful.  Any other return 
  916.  *    value indicates an error in freeing the memory.
  917.  */
  918. extern SECStatus 
  919.        CMMF_DestroyKeyRecRepContent(CMMFKeyRecRepContent *inKeyRecRep);
  920. /*
  921.  * FUNCTION: CMMF_DestroyCertifiedKeyPair
  922.  * INPUTS:
  923.  *    inCertKeyPair
  924.  *        The CMMFCertifiedKeyPair to operate on.
  925.  * NOTES: 
  926.  *    This function frees up all the memory associated with 'inCertKeyPair'
  927.  *
  928.  * RETURN:
  929.  *    SECSuccess if freeing all the memory associated with 'inCertKeyPair'
  930.  *    is successful.  Any other return value indicates an error while trying
  931.  *    to free the memory.
  932.  */
  933. extern SECStatus 
  934.        CMMF_DestroyCertifiedKeyPair(CMMFCertifiedKeyPair *inCertKeyPair);
  935. /*
  936.  * FUNCTION: CMMF_DestroyPOPODecKeyRespContent
  937.  * INPUTS:
  938.  *    inDecKeyResp
  939.  *        The CMMFPOPODecKeyRespContent structure to free.
  940.  * NOTES:
  941.  *    This function frees up all the memory associate with the 
  942.  *    CMMFPOPODecKeyRespContent.
  943.  *
  944.  * RETURN:
  945.  *    SECSuccess if freeing up all the memory associated with the
  946.  *    CMMFPOPODecKeyRespContent structure is successful.  Any other
  947.  *    return value indicates an error while freeing the memory.
  948.  */
  949. extern SECStatus
  950.        CMMF_DestroyPOPODecKeyRespContent(CMMFPOPODecKeyRespContent *inDecKeyResp);
  951. /************************** Miscellaneous Functions *************************/
  952.  
  953. /*
  954.  * FUNCTION: CMMF_CertifiedKeyPairUnwrapPrivKey
  955.  * INPUTS:
  956.  *    inCertKeyPair
  957.  *        The CMMFCertifiedKeyPair to operate on.
  958.  *    inPrivKey
  959.  *        The private key to use to un-wrap the private key
  960.  *    inNickName
  961.  *        This is the nickname that will be associated with the private key
  962.  *        to be unwrapped.
  963.  *    inSlot
  964.  *        The PKCS11 slot where the unwrapped private key should end up.
  965.  *    inCertdb
  966.  *        The Certificate database with which the new key will be associated.
  967.  *    destPrivKey
  968.  *        A pointer to memory where the library can place a pointer to the
  969.  *        private key after importing the key onto the specified slot.
  970.  *    wincx
  971.  *        An opaque pointer that the library will use in a callback function
  972.  *        to get the password if necessary.
  973.  *    
  974.  * NOTES:
  975.  *    This function uses the private key passed in to unwrap the private key
  976.  *    contained within the CMMFCertifiedKeyPair structure. After this 
  977.  *    function successfully returns, the private key has been unwrapped and
  978.  *    placed in the specified slot. 
  979.  *
  980.  * RETURN:
  981.  *    SECSuccess if unwrapping the private key was successful.  Any other 
  982.  *    return value indicates an error while trying to un-wrap the private key.
  983.  */
  984. extern SECStatus 
  985.        CMMF_CertifiedKeyPairUnwrapPrivKey(CMMFCertifiedKeyPair *inKeyPair,
  986.   SECKEYPrivateKey     *inPrivKey,
  987.   SECItem              *inNickName,
  988.   PK11SlotInfo         *inSlot,
  989.                                           CERTCertDBHandle     *inCertdb,
  990.   SECKEYPrivateKey    **destPrivKey,
  991.   void                 *wincx);
  992. /*
  993.  * FUNCTION: CMMF_KeyRecRepContentHasCACerts
  994.  * INPUTS:
  995.  *    inKeyRecRecp
  996.  *        The CMMFKeyRecRepContent to operate on.
  997.  * RETURN:
  998.  *    This function returns PR_TRUE if there are one or more certificates in 
  999.  *    the sequence KeyRecRepContent.caCerts within the CMMFKeyRecRepContent
  1000.  *    structure.  The function will return PR_FALSE if there are 0 certificate
  1001.  *    in the above mentioned sequence.
  1002.  */
  1003. extern PRBool 
  1004.        CMMF_KeyRecRepContentHasCACerts(CMMFKeyRecRepContent *inKeyRecRep);
  1005. /*
  1006.  * FUNCTION: CMMF_POPODecKeyChallContDecryptChallenge
  1007.  * INPUTS:
  1008.  *    inChalCont
  1009.  *        The CMMFPOPODecKeyChallContent to operate on.
  1010.  *    inIndex
  1011.  *        The index of the Challenge to operate on.  The 1st Challenge is
  1012.  *        at index 0, the second at index 1 and so forth.
  1013.  *    inPrivKey
  1014.  *        The private key to use to decrypt the witness field.
  1015.  * NOTES:
  1016.  *    This function uses the private key to decrypt the challenge field
  1017.  *    contained in the appropriate challenge.  Make sure the private key matches 
  1018.  *    the public key that was used to encrypt the witness.  Use 
  1019.  *    CMMF_POPODecKeyChallContentGetPublicValue to get the public value of
  1020.  *    the key used to encrypt the witness and then use that to determine the
  1021.  *    appropriate private key.  This can be done by calling PK11_MakeIDFromPubKey
  1022.  *    and then passing that return value to PK11_FindKeyByKeyID.  The creator of 
  1023.  *    the challenge will most likely be an RA that has the public key
  1024.  *    from a Cert request.  So the private key should be the private key
  1025.  *    associated with public key in that request.  This function will also
  1026.  *    verify the witness field of the challenge.  This function also verifies
  1027.  *    that the sender and witness hashes match within the challenge.
  1028.  *
  1029.  * RETURN:
  1030.  *    SECSuccess if decrypting the witness field was successful.  This does
  1031.  *    not indicate that the decrypted data is valid, since the private key 
  1032.  *    passed in may not be the actual key needed to properly decrypt the 
  1033.  *    witness field.  Meaning that there is a decrypted structure now, but
  1034.  *    may be garbage because the private key was incorrect.
  1035.  *    Any other return value indicates the function could not complete the
  1036.  *    decryption process.
  1037.  */
  1038. extern SECStatus 
  1039.   CMMF_POPODecKeyChallContDecryptChallenge(CMMFPOPODecKeyChallContent *inChalCont,
  1040.    int                         inIndex,
  1041.    SECKEYPrivateKey           *inPrivKey);
  1042. /*
  1043.  * FUNCTION: CMMF_DestroyPOPODecKeyChallContent
  1044.  * INPUTS:
  1045.  *    inDecKeyCont
  1046.  *        The CMMFPOPODecKeyChallContent to free
  1047.  * NOTES:
  1048.  *    This function frees up all the memory associated with the 
  1049.  *    CMMFPOPODecKeyChallContent 
  1050.  * RETURN:
  1051.  *    SECSuccess if freeing up all the memory associatd with the 
  1052.  *    CMMFPOPODecKeyChallContent is successful.  Any other return value
  1053.  *    indicates an error while freeing the memory.
  1054.  *
  1055.  */
  1056. extern SECStatus 
  1057.  CMMF_DestroyPOPODecKeyChallContent (CMMFPOPODecKeyChallContent *inDecKeyCont);
  1058. SEC_END_PROTOS
  1059. #endif /* _CMMF_H_ */