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

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 _CRMF_H_
  35. #define _CRMF_H_
  36. #include "seccomon.h"
  37. #include "cert.h"
  38. #include "crmft.h"
  39. #include "secoid.h"
  40. #include "secpkcs7.h"
  41. SEC_BEGIN_PROTOS
  42. /*
  43.  * FUNCTION: CRMF_EncodeCertReqMsg
  44.  * INPUTS:
  45.  *    inCertReqMsg
  46.  *        The Certificate Request Message to be encoded.
  47.  *    fn
  48.  *        A Callback function that the ASN1 encoder calls whenever
  49.  *        the encoder wants to write out some DER encoded bytes.
  50.  *    arg
  51.  *        An opaque pointer that gets passed to the function fn
  52.  * OUTPUT:
  53.  *    The function fn will be called multiple times.  Look at the
  54.  *    comments in crmft.h where the CRMFEncoderOutputCallback type is 
  55.  *    defined for information on proper behavior of the function fn.
  56.  * RETURN:
  57.  *    SECSuccess if encoding was successful.  Any other return value
  58.  *    indicates an error occurred during encoding.
  59.  */
  60. extern SECStatus 
  61.         CRMF_EncodeCertReqMsg (CRMFCertReqMsg            *inCertReqMsg, 
  62.        CRMFEncoderOutputCallback  fn,
  63.        void                      *arg);
  64. /*
  65.  * FUNCTION: CRMF_EncoderCertRequest
  66.  * INPUTS:
  67.  *    inCertReq
  68.  *        The Certificate Request to be encoded.
  69.  *    fn
  70.  *        A Callback function that the ASN1 encoder calls whenever
  71.  *        the encoder wants to write out some DER encoded bytes.
  72.  *    arg
  73.  *        An opaque pointer that gets passed to the function fn.
  74.  * OUTPUT:
  75.  *    The function fn will be called, probably multiple times whenever 
  76.  *    the ASN1 encoder wants to write out DER-encoded bytes.  Look at the 
  77.  *    comments in crmft.h where the CRMFEncoderOuputCallback type is
  78.  *    defined for information on proper behavior of the funciton fn.
  79.  * RETURN:
  80.  *    SECSuccess if encoding was successful.  Any other return value 
  81.  *    indicates an error occured during encoding.
  82.  */
  83. extern SECStatus CRMF_EncodeCertRequest (CRMFCertRequest           *inCertReq,
  84.  CRMFEncoderOutputCallback  fn,
  85.  void                      *arg);
  86. /*
  87.  * FUNCTION: CRMF_EncodeCertReqMessages
  88.  * INPUTS:
  89.  *    inCertReqMsgs
  90.  *        An array of pointers to the Certificate Request Messages
  91.  *        to encode.  The user must place a NULL pointer in the index
  92.  *        after the last message to be encoded.  When the library runs
  93.  *        into the NULL pointer, the library assumes there are no more
  94.  *        messages to encode.
  95.  *    fn
  96.  *        A Callback function that the ASN1 encoder calls whenever
  97.  *        the encoder wants to write out some DER encoded byts.
  98.  *    arg
  99.  *        An opaque pointer that gets passed to the function fn.
  100.  *
  101.  * NOTES:
  102.  *    The parameter inCertReqMsgs needs to be an array with a NULL pointer
  103.  *    to signal the end of messages.  An array in the form of 
  104.  *    {m1, m2, m3, NULL, m4, ...} will only encode the messages m1, m2, and
  105.  *    m3.  All messages from m4 on will not be looked at by the library.
  106.  *
  107.  * OUTPUT:
  108.  *    The function fn will be called, probably multiple times.  Look at the 
  109.  *    comments in crmft.h where the CRMFEncoderOuputCallback type is
  110.  *    defined for information on proper behavior of the funciton fn.
  111.  *
  112.  * RETURN:
  113.  * SECSuccess if encoding the Certificate Request Messages was successful. 
  114.  * Any other return value indicates an error occurred while encoding the
  115.  * certificate request messages.
  116.  */
  117. extern SECStatus 
  118.        CRMF_EncodeCertReqMessages(CRMFCertReqMsg           **inCertReqMsgs,
  119.   CRMFEncoderOutputCallback  fn,
  120.   void                      *arg);
  121. /*
  122.  * FUNCTION: CRMF_CreateCertReqMsg
  123.  * INPUTS:
  124.  *    NONE
  125.  * OUTPUT:
  126.  *    An empty CRMF Certificate Request Message.
  127.  *    Before encoding this message, the user must set
  128.  *    the ProofOfPossession field and the certificate 
  129.  *    request which are necessary for the full message.
  130.  *    After the user no longer needs this CertReqMsg,
  131.  *    the user must call CRMF_DestroyCertReqMsg to free
  132.  *    all memory associated with the Certificate Request
  133.  *    Message.
  134.  * RETURN:
  135.  *    A pointer to a Certificate Request Message.  The user 
  136.  *    must pass the return value of this function to 
  137.  *    CRMF_DestroyCertReqMsg after the Certificate Request
  138.  *    Message is no longer necessary.
  139.  */
  140. extern CRMFCertReqMsg* CRMF_CreateCertReqMsg(void);
  141. /*
  142.  * FUNCTION: CRMF_DestroyCertReqMsg
  143.  * INPUTS:
  144.  *    inCertReqMsg
  145.  *        The Certificate Request Message to destroy.
  146.  *  NOTES:
  147.  *    This function frees all the memory used for the Certificate
  148.  *    Request Message and all the memory used in making copies of
  149.  *    fields of elelments of the message, eg. the Proof Of Possession
  150.  *    filed and the Cetificate Request.  
  151.  * RETURN:
  152.  *    SECSuccess if destruction was successful.  Any other return value
  153.  *    indicates an error while trying to free the memory associated
  154.  *    with inCertReqMsg.
  155.  *    
  156.  */
  157. extern SECStatus CRMF_DestroyCertReqMsg(CRMFCertReqMsg *inCertReqMsg);
  158. /*
  159.  * FUNCTION: CRMF_CertReqMsgSetCertRequest
  160.  * INPUTS:
  161.  *    inCertReqMsg
  162.  *        The Certificate Request Message that the function will set
  163.  *        the certificate request for.
  164.  *    inCertReq
  165.  *        The Certificate Request that will be added to the Certificate
  166.  *        Request Message.
  167.  * NOTES:
  168.  *    This function will make a copy of the Certificate Request passed in
  169.  *    and store it as part of the Certificate Request Message.  Therefore,
  170.  *    the user must not call this function until the Certificate Request
  171.  *    has been fully built and is ready to be encoded.
  172.  * RETURN:
  173.  *    SECSuccess 
  174.  *        If copying the Certificate as a member of the Certificate
  175.  *        request message was successful.
  176.  *    Any other return value indicates a failure to copy the Certificate
  177.  *    Request and make it a part of the Certificate Request Message.
  178.  */
  179. extern SECStatus CRMF_CertReqMsgSetCertRequest(CRMFCertReqMsg  *inCertReqMsg, 
  180.        CRMFCertRequest *inCertReq);
  181. /*
  182.  * FUNCTION: CRMF_CreateCertRequest
  183.  * INPUTS:
  184.  *    inRequestID
  185.  *        The ID that will be associated with this certificate request.
  186.  * OUTPUTS:
  187.  *    A certificate request which only has the requestID set.
  188.  * NOTES:
  189.  *    The user must call the function CRMF_DestroyCertRequest when
  190.  *    the returned value is no longer needed.  This is usually the
  191.  *    case after fully constructing the Certificate Request and then
  192.  *    calling the function CRMF_CertReqMsgSetCertRequest.
  193.  * RETURN:
  194.  *    A pointer to the new Certificate Request.  A NULL return value
  195.  *    indicates an error in creating the Certificate Request.
  196.  */
  197. extern CRMFCertRequest *CRMF_CreateCertRequest (long inRequestID);
  198. /*
  199.  * FUNCTION: CRMF_DestroyCertRequest
  200.  * INPUTS:
  201.  *    inCertReq
  202.  *        The Certificate Request that will be destroyed.
  203.  * RETURN:
  204.  *    SECSuccess
  205.  *        If freeing the memory associated with the certificate request 
  206.  *        was successful.
  207.  *    Any other return value indicates an error while trying to free the 
  208.  *    memory.
  209.  */
  210. extern SECStatus CRMF_DestroyCertRequest (CRMFCertRequest *inCertReq);
  211. /*
  212.  * FUNCTION: CRMF_CreateCertExtension
  213.  * INPUTS:
  214.  *    id
  215.  *        The SECOidTag to associate with this CertExtension.  This must
  216.  *        correspond to a valid Certificate Extension, if not the function
  217.  *        will fail.
  218.  *    isCritical
  219.  *        A boolean value stating if the extension value is crtical.  PR_TRUE
  220.  *        means the value is crtical.  PR_FALSE indicates the value is not 
  221.  *        critical.
  222.  *    data
  223.  *        This is the data associated with the extension.  The user of the
  224.  *        library is responsible for making sure the value passed in is a
  225.  *        valid interpretation of the certificate extension.
  226.  * NOTES:
  227.  * Use this function to create CRMFCertExtension Structures which will 
  228.  * then be passed to CRMF_AddFieldToCertTemplate as part of the 
  229.  * CRMFCertCreationInfo.extensions  The user must call 
  230.  * CRMF_DestroyCertExtension after the extension has been added to a certifcate
  231.  * and the extension is no longer needed.
  232.  *
  233.  * RETURN:
  234.  * A pointer to a newly created CertExtension.  A return value of NULL
  235.  * indicates the id passed in was an invalid certificate extension.
  236.  */
  237. extern CRMFCertExtension *CRMF_CreateCertExtension(SECOidTag      id, 
  238.    PRBool         isCritical,
  239.    SECItem       *data);
  240. /*
  241.  * FUNCTION: CMRF_DestroyCertExtension
  242.  * INPUTS:
  243.  *    inExtension
  244.  *        The Cert Extension to destroy
  245.  * NOTES:
  246.  * Destroy a structure allocated by CRMF_CreateCertExtension.
  247.  *
  248.  * RETURN:
  249.  * SECSuccess if freeing the memory associated with the certificate extension
  250.  * was successful.  Any other error indicates an error while freeing the 
  251.  * memory.
  252.  */
  253. extern SECStatus CRMF_DestroyCertExtension(CRMFCertExtension *inExtension);
  254. /* 
  255.  * FUNCTION: CRMF_CertRequestSetTemplateField
  256.  * INPUTS:
  257.  *    inCertReq
  258.  *        The Certificate Request to operate on.
  259.  *    inTemplateField
  260.  *        An enumeration that indicates which field of the Certificate
  261.  *        template to add.
  262.  *    data
  263.  *        A generic pointer that will be type cast according to the
  264.  *        table under NOTES and used as the key for adding to the
  265.  *        certificate template;
  266.  * NOTES:
  267.  *
  268.  * Below is a table that tells what type to pass in as data
  269.  * depending on the template field one wants to set.
  270.  *
  271.  * Look in crmft.h for the definition of CRMFCertTemplateField.
  272.  * 
  273.  * In all cases, the library makes copies of the data passed in.
  274.  *
  275.  *   CRMFCertTemplateField    Type of data    What data means
  276.  *   ---------------------    ------------    ---------------
  277.  *   crmfVersion              long *          The version of
  278.  *                                            the certificate
  279.  *                                            to be created.
  280.  *
  281.  *   crmfSerialNumber         long *          The serial number
  282.  *                                            for the cert to be
  283.  *                                            created.
  284.  *   
  285.  *   crmfSigningAlg           SECAlgorithm *  The ASN.1 object ID for
  286.  *                                            the algorithm used in encoding
  287.  *                                            the certificate.
  288.  *
  289.  *   crmfIssuer               CERTName *      Certificate Library 
  290.  *                                            representation of the ASN1 type
  291.  *                                            Name from X.509
  292.  *
  293.  *   crmfValidity     CRMFValidityCreationInfo *  At least one of the two
  294.  *                                                fields in the structure must
  295.  *                                                be present.  A NULL pointer 
  296.  *                                                in the structure indicates
  297.  *                                                that member should not be 
  298.  *                                                added.
  299.  *
  300.  *   crmfSubject              CERTName *      Certificate Library 
  301.  *                                            representation of the ASN1 type
  302.  *                                            Name from X.509
  303.  *
  304.  *   crmfPublicKey    CERTSubjectPublicKeyInfo *  The public key info for the
  305.  *                                                certificate being requested.
  306.  *
  307.  *   crmfIssuerUID            SECItem *           A bit string representation
  308.  *                                                of the issuer UID. NOTE: The
  309.  *                                                length is the number of bits
  310.  *                                                and not the number of bytes.
  311.  *
  312.  *   crmfSubjectUID           SECItem*            A bit string representation
  313.  *                                                of the subject UID. NOTE: The
  314.  *                                                length is the number of bits
  315.  *                                                and not the number of bytes.
  316.  *
  317.  *   crmfExtension   CRMFCertExtCreationInfo *     A pointer to the structure
  318.  *                                                 populated with an array of 
  319.  *                                                 of certificate extensions
  320.  *                                                 and an integer that tells
  321.  *                                                 how many elements are in the
  322.  *                                                 array. Look in crmft.h for
  323.  *                                                 the definition of 
  324.  *                                                 CRMFCertExtCreationInfo
  325.  * RETURN:
  326.  *    SECSuccess if adding the desired field to the template was successful.
  327.  *    Any other return value indicates failure when trying to add the field 
  328.  *    to the template.
  329.  *                                                
  330.  */
  331. extern SECStatus
  332.   CRMF_CertRequestSetTemplateField(CRMFCertRequest       *inCertReq, 
  333.    CRMFCertTemplateField  inTemplateField,
  334.    void                  *data);
  335. /*
  336.  * FUNCTION: CRMF_CertRequestIsFieldPresent
  337.  * INPUTS:
  338.  *    inCertReq
  339.  *        The certificate request to operate on.
  340.  *    inTemplateField
  341.  *        The enumeration for the template field the user wants to query
  342.  *        about.
  343.  * NOTES:
  344.  * This function checks to see if the the field associated with inTemplateField
  345.  * enumeration is already present in the certificate request passed in.
  346.  *
  347.  * RETURN:
  348.  * The function returns PR_TRUE if the field associated with inTemplateField
  349.  * is already present in the certificate request.  If the field is not present
  350.  * the function returns PR_FALSE.
  351.  */
  352. extern PRBool
  353.   CRMF_CertRequestIsFieldPresent(CRMFCertRequest       *inCertReq,
  354.  CRMFCertTemplateField  inTemplateField);
  355. /*
  356.  * FUNCTION: CRMF_CertRequestIsControlPresent
  357.  * INPUTS:
  358.  *    inCertReq
  359.  *        The certificate request to operate on.
  360.  *    inControlType
  361.  *        The type of control to look for.
  362.  * NOTES:
  363.  * This function looks at the control present in the certificate request
  364.  * and returns PR_TRUE iff a control of type inControlType already exists.
  365.  * The CRMF draft does not explicitly state that two controls of the same
  366.  * type can not exist within the same request.  So the library will not
  367.  * cause an error if you try to add a control and one of the same type
  368.  * already exists.  It is up to the application to ensure that multiple
  369.  * controls of the same type do not exist, if that is the desired behavior
  370.  * by the application.
  371.  *
  372.  * RETURN:
  373.  * The function returns PR_TRUE if a control of type inControlType already
  374.  * exists in the certificate request.  If a control of type inControlType
  375.  * does not exist, the function will return PR_FALSE.
  376.  */
  377. extern PRBool
  378.   CRMF_CertRequestIsControlPresent(CRMFCertRequest *inCertReq,
  379.    CRMFControlType  inControlType);
  380.    
  381. /*
  382.  * FUNCTION: CRMF_CertRequestSetRegTokenControl
  383.  * INPUTS:
  384.  *    inCertReq
  385.  *        The Certificate Request to operate on.
  386.  *    value
  387.  *        The UTF8 value which will be the Registration Token Control
  388.  *        for this Certificate Request.
  389.  * NOTES:
  390.  *    The library does no verification that the value passed in is 
  391.  *    a valid UTF8 value.  The caller must make sure of this in order
  392.  *    to get an encoding that is valid.  The library will ultimately
  393.  *    encode this value as it was passed in.
  394.  * RETURN:
  395.  *    SECSucces on successful addition of the Registration Token Control.
  396.  *    Any other return value indicates an unsuccessful attempt to add the
  397.  *    control.
  398.  *
  399.  */
  400. extern SECStatus CRMF_CertRequestSetRegTokenControl(CRMFCertRequest *inCertReq,
  401.     SECItem         *value);
  402. /*
  403.  * FUNCTION: CRMF_CertRequestSetAuthenticatorControl
  404.  * INPUTS:
  405.  *    inCertReq
  406.  *        The Certificate Request to operate on.
  407.  *    value
  408.  *        The UTF8 value that will become the Authenticator Control
  409.  *        for the passed in Certificate Request.
  410.  * NOTES:
  411.  *    The library does no verification that the value passed in is 
  412.  *    a valid UTF8 value.  The caller must make sure of this in order
  413.  *    to get an encoding that is valid.  The library will ultimately
  414.  *    encode this value as it was passed in.
  415.  * RETURN:
  416.  *    SECSucces on successful addition of the Authenticator Control.
  417.  *    Any other return value indicates an unsuccessful attempt to add the
  418.  *    control.
  419.  */
  420. extern SECStatus 
  421.        CRMF_CertRequestSetAuthenticatorControl (CRMFCertRequest *inCertReq,
  422. SECItem         *value);
  423. /*
  424.  * FUNCTION: CRMF_CreateEncryptedKeyWithencryptedValue
  425.  * INPUTS:
  426.  *    inPrivKey
  427.  *        This is the private key associated with a certificate that is
  428.  *        being requested.  This structure will eventually wind up as 
  429.  *        a part of the PKIArchiveOptions Control.  
  430.  *    inCACert
  431.  *        This is the certificate for the CA that will be receiving the 
  432.  *        certificate request for the private key passed in.
  433.  * OUTPUT:
  434.  *    A CRMFEncryptedKey that can ultimately be used as part of the 
  435.  *    PKIArchiveOptions Control.
  436.  *
  437.  * RETURN:
  438.  *    A pointer to a CRMFEncyptedKey.  A NULL return value indicates an erro
  439.  *    during the creation of the encrypted key.
  440.  */
  441. extern CRMFEncryptedKey* 
  442.        CRMF_CreateEncryptedKeyWithEncryptedValue(SECKEYPrivateKey *inPrivKey,
  443.  CERTCertificate  *inCACert);
  444. /*
  445.  * FUNCTION: CRMF_DestroyEncryptedKey
  446.  * INPUTS:
  447.  *    inEncrKey
  448.  *        The CRMFEncryptedKey to be destroyed.
  449.  * NOTES:
  450.  *    Frees all memory associated with the CRMFEncryptedKey passed in.
  451.  * RETURN:
  452.  *    SECSuccess if freeing the memory was successful.  Any other return
  453.  *    value indicates an error while freeig the memroy.
  454.  */
  455. extern SECStatus CRMF_DestroyEncryptedKey(CRMFEncryptedKey *inEncrKey);
  456. /*
  457.  * FUNCTION: CRMF_CreatePKIArchiveOptions
  458.  * INPUTS:
  459.  *    inType
  460.  *        An enumeration value indicating which option for 
  461.  *        PKIArchiveOptions to use.
  462.  *    data
  463.  *        A pointer that will be type-cast and de-referenced according
  464.  *        to the table under NOTES.
  465.  * NOTES:
  466.  * A table listing what should be passed in as data
  467.  * ------------------------------------------------
  468.  *
  469.  * inType                            data
  470.  * ------                            ----
  471.  * crmfEncryptedPrivateKey           CRMFEncryptedKey*
  472.  * crmfKeyGenParameters              SECItem*(This needs to be an octet string)
  473.  * crmfArchiveRemGenPrivKey          PRBool*
  474.  *
  475.  * RETURN:
  476.  *    A pointer the a CRMFPKIArchiveOptions that can be added to a Certificate
  477.  *    Request.  A NULL pointer indicates an error occurred while creating
  478.  *    the CRMFPKIArchiveOptions Structure.
  479.  */
  480. extern CRMFPKIArchiveOptions*
  481.        CRMF_CreatePKIArchiveOptions(CRMFPKIArchiveOptionsType  inType,
  482.     void                      *data);
  483. /*
  484.  * FUNCTION: CRMF_DestroyPKIArchiveOptions
  485.  * INPUTS:
  486.  *    inArchOpt
  487.  *        A pointer to the CRMFPKIArchiveOptions structure to free.
  488.  * NOTES:
  489.  *    Will free all memory associated with 'inArchOpt'.
  490.  * RETURN:
  491.  *    SECSuccess if successful in freeing the memory used by 'inArchOpt'
  492.  *    Any other return value indicates an error while freeing the memory.
  493.  */
  494. extern SECStatus 
  495.        CRMF_DestroyPKIArchiveOptions(CRMFPKIArchiveOptions *inArchOpt);
  496. /*
  497.  * FUNCTION: CRMF_CertRequestSetPKIArchiveOptions
  498.  * INPUTS:
  499.  *    inCertReq
  500.  *        The Certificate Request to add the the options to.
  501.  *    inOptions
  502.  *        The Archive Options to add to the Certificate Request.
  503.  * NOTES:
  504.  *    Adds the PKIArchiveOption to the Certificate Request.  This is what
  505.  *    enables Key Escrow to take place through CRMF.  The library makes
  506.  *    its own copy of the information.
  507.  * RETURN:
  508.  *    SECSuccess if successful in adding the ArchiveOptions to the Certificate
  509.  *    request.  Any other return value indicates an error when trying to add
  510.  *    the Archive Options  to the Certificate Request.
  511.  */
  512. extern SECStatus 
  513.        CRMF_CertRequestSetPKIArchiveOptions(CRMFCertRequest       *inCertReq,
  514.     CRMFPKIArchiveOptions *inOptions);
  515. /*
  516.  * FUNCTION: CRMF_CertReqMsgGetPOPType
  517.  * INPUTS:
  518.  *    inCertReqMsg
  519.  *        The Certificate Request Message to operate on.
  520.  * NOTES:
  521.  *    Returns an enumeration value indicating the method of Proof
  522.  *    of Possession that was used for the passed in Certificate Request
  523.  *    Message.
  524.  * RETURN:
  525.  *    An enumeration indicating what method for Proof Of Possession is
  526.  *    being used in this Certificate Request Message.  Look in the file
  527.  *    crmft.h for the definition of CRMFPOPChoice for the possible return
  528.  *    values.
  529.  */
  530. extern CRMFPOPChoice CRMF_CertReqMsgGetPOPType(CRMFCertReqMsg *inCertReqMsg);
  531. /*
  532.  * FUNCTION: CRMF_CertReqMsgSetRAVerifiedPOP
  533.  * INPUT:
  534.  *    InCertReqMsg
  535.  *        The Certificate Request Message to operate on.
  536.  * NOTES:
  537.  *    This function will set the method of Proof Of Possession to 
  538.  *    crmfRAVerified which means the RA has already verified the 
  539.  *    requester does possess the private key.
  540.  * RETURN:
  541.  *    SECSuccess if adding RAVerified to the message is successful.  
  542.  *    Any other message indicates an error while trying to add RAVerified
  543.  *    as the Proof of Possession.
  544.  */
  545. extern SECStatus CRMF_CertReqMsgSetRAVerifiedPOP(CRMFCertReqMsg *inCertReqMsg);
  546. /*
  547.  * FUNCTION: CRMF_CertReqMsgSetSignaturePOP
  548.  * INPUT:
  549.  *    inCertReqMsg
  550.  *        The Certificate Request Message to add the SignaturePOP to.
  551.  *    inPrivKey
  552.  *        The Private Key which corresponds to the the Certificate Request
  553.  *        Message.
  554.  *    inPubKey
  555.  *        The Public Key which corresponds to the Private Key passed in.
  556.  *    inCertForInput
  557.  *        A Certificate that in the future may be used to create 
  558.  *        POPOSigningKeyInput.
  559.  *    fn
  560.  *        A callback for retrieving a password which may be used in the
  561.  *       future to generate POPOSigningKeyInput.
  562.  *    arg
  563.  *        An opaque pointer that would be passed to fn whenever it is
  564.  *        called.
  565.  * NOTES:
  566.  * Adds Proof Of Possession to the CertRequest using the signature field 
  567.  * of the ProofOfPossession field.  NOTE: In order to use this option, 
  568.  * the certificate template must contain the publicKey at the very minimum.
  569.  * 
  570.  * If you don't want the function to generate POPOSigningKeyInput, then
  571.  * make sure the cert template already contains the subject and public key
  572.  * values.  Currently creating POPOSigningKeyInput is not supported, so 
  573.  * a Message passed to this function must have the publicKey and the subject
  574.  * as part of the template
  575.  *
  576.  * This will take care of creating the entire POPOSigningKey structure
  577.  * that will become part of the message.
  578.  *
  579.  * inPrivKey is the key to be used in the signing operation when creating
  580.  * POPOSigningKey structure.  This should be the key corresponding to
  581.  * the certificate being requested.
  582.  *
  583.  * inCertForInput will be used if POPOSigningKeyInput needs to be generated.
  584.  * It will be used in generating the authInfo.sender field.  If the parameter
  585.  * is not passed in then authInfo.publicKeyMAC will be generated instead.
  586.  * If passed in, this certificate needs to be a valid certificate.
  587.  *
  588.  * The last 3 arguments are for future compatibility in case we ever want to
  589.  * support generating POPOSigningKeyInput.  Pass in NULL for all 3 if you 
  590.  * definitely don't want the funciton to even try to generate 
  591.  * POPOSigningKeyInput.  If you try to use POPOSigningKeyInput, the function
  592.  * will fail.
  593.  *
  594.  * RETURN:
  595.  *    SECSuccess if adding the Signature Proof Of Possession worked.
  596.  *    Any other return value indicates an error in trying to add
  597.  *    the Signature Proof Of Possession.
  598.  */
  599. extern SECStatus 
  600.        CRMF_CertReqMsgSetSignaturePOP(CRMFCertReqMsg   *inCertReqMsg,
  601.       SECKEYPrivateKey *inPrivKey,
  602.       SECKEYPublicKey  *inPubKey,
  603.       CERTCertificate  *inCertForInput,
  604.       CRMFMACPasswordCallback  fn,
  605.       void                    *arg);
  606. /*
  607.  * FUNCTION: CRMF_CertReqMsgSetKeyEnciphermentPOP
  608.  * INPUTS:
  609.  *    inCertReqMsg
  610.  *        The Certificate Request Message to operate on.
  611.  *    inKeyChoice
  612.  *        An enumeration indicating which POPOPrivKey Choice to use
  613.  *        in constructing the KeyEnciphermentPOP.
  614.  *    subseqMess
  615.  *        This parameter must be provided iff inKeyChoice is 
  616.  *        crmfSubsequentMessage.  This details how the RA is to respond
  617.  *        in order to perform Proof Of Possession.  Look in crmft.h under
  618.  *        the definition of CRMFSubseqMessOptions for possible values.
  619.  *    encPrivKey
  620.  *        This parameter only needs to be provided if inKeyChoice is
  621.  *        crmfThisMessage.  The item should contain the encrypted private
  622.  *        key.
  623.  *        
  624.  * NOTES:
  625.  * Adds Proof Of Possession using the keyEncipherment field of
  626.  * ProofOfPossession.
  627.  *
  628.  * The funciton looks at the the inKeyChoice parameter and interprets it in
  629.  * in the following manner.
  630.  *
  631.  * If a parameter is not mentioned under interpretation, the funciton will not
  632.  * look at its value when implementing that case.
  633.  *
  634.  * inKeyChoice          Interpretation
  635.  * -----------          --------------
  636.  * crmfThisMessage      This options requires that the encrypted private key
  637.  *                      be included in the thisMessage field of POPOPrivKey.
  638.  *                      We don't support this yet, so any clients who want
  639.  *                      to use this feature have to implement a wrapping
  640.  *                      function and agree with the server on how to properly
  641.  *                      wrap the key.  That encrypted key must be passed in
  642.  *                      as the encPrivKey parameter.
  643.  *
  644.  * crmfSubequentMessage Must pass in a value for subseqMess.  The value must
  645.  *                      be either CRMFEncrCert or CRMFChallengeResp.  The
  646.  *                      parameter encPrivKey will not be looked at in this
  647.  *                      case.
  648.  *
  649.  * crmfDHMAC            This is not a valid option for this function.  Passing
  650.  *                      in this value will result in the function returning
  651.  *                      SECFailure.
  652.  * RETURN:
  653.  *    SECSuccess if adding KeyEnciphermentPOP was successful.  Any other return
  654.  *    value indicates an error in adding KeyEnciphermentPOP.
  655.  */
  656. extern SECStatus 
  657.       CRMF_CertReqMsgSetKeyEnciphermentPOP(CRMFCertReqMsg        *inCertReqMsg,
  658.    CRMFPOPOPrivKeyChoice  inKeyChoice,
  659.    CRMFSubseqMessOptions  subseqMess,
  660.    SECItem               *encPrivKey);
  661. /*
  662.  * FUNCTION: CRMF_CertReqMsgSetKeyAgreementPOP
  663.  * INPUTS:
  664.  *    inCertReqMsg
  665.  *        The Certificate Request Message to operate on.
  666.  *    inKeyChoice
  667.  *        An enumeration indicating which POPOPrivKey Choice to use
  668.  *        in constructing the KeyAgreementPOP.
  669.  *    subseqMess
  670.  *        This parameter must be provided iff inKeyChoice is 
  671.  *        crmfSubsequentMessage.  This details how the RA is to respond
  672.  *        in order to perform Proof Of Possession.  Look in crmft.h under
  673.  *        the definition of CRMFSubseqMessOptions for possible values.
  674.  *    encPrivKey
  675.  *        This parameter only needs to be provided if inKeyChoice is
  676.  *        crmfThisMessage.  The item should contain the encrypted private
  677.  *        key.
  678.  * Adds Proof Of Possession using the keyAgreement field of
  679.  * ProofOfPossession.
  680.  *
  681.  * The funciton looks at the the inKeyChoice parameter and interprets it in
  682.  * in the following manner.
  683.  *
  684.  * If a parameter is not mentioned under interpretation, the funciton will not
  685.  * look at its value when implementing that case.
  686.  *
  687.  * inKeyChoice          Interpretation
  688.  * -----------          --------------
  689.  * crmfThisMessage      This options requires that the encrypted private key
  690.  *                      be included in the thisMessage field of POPOPrivKey.
  691.  *                      We don't support this yet, so any clients who want
  692.  *                      to use this feature have to implement a wrapping
  693.  *                      function and agree with the server on how to properly
  694.  *                      wrap the key.  That encrypted key must be passed in
  695.  *                      as the encPrivKey parameter.
  696.  *
  697.  * crmfSubequentMessage Must pass in a value for subseqMess.  The value must
  698.  *                      be either crmfEncrCert or crmfChallengeResp.  The
  699.  *                      parameter encPrivKey will not be looked at in this
  700.  *                      case.
  701.  *
  702.  * crmfDHMAC            This option is not supported.
  703.  */
  704. extern SECStatus 
  705.        CRMF_CertReqMsgSetKeyAgreementPOP(CRMFCertReqMsg        *inCertReqMsg,
  706.  CRMFPOPOPrivKeyChoice  inKeyChoice,
  707.  CRMFSubseqMessOptions  subseqMess,
  708.  SECItem               *encPrivKey);
  709. /*
  710.  * FUNCTION: CRMF_CreateCertReqMsgFromDER
  711.  * INPUTS:
  712.  *    buf
  713.  *        A buffer to the DER-encoded Certificate Request Message.
  714.  *    len
  715.  *        The length in bytes of the buffer 'buf'
  716.  * NOTES:
  717.  * This function passes the buffer to the ASN1 decoder and creates a 
  718.  * CRMFCertReqMsg structure.  Do not try adding any fields to a message
  719.  * returned from this function.  Specifically adding more Controls or 
  720.  * Extensions may cause your program to crash.
  721.  *
  722.  * RETURN:
  723.  *    A pointer to the Certificate Request Message structure.  A NULL return
  724.  *    value indicates the library was unable to parse the DER.
  725.  */
  726. extern CRMFCertReqMsg* CRMF_CreateCertReqMsgFromDER(const char *buf, long len);
  727. /*
  728.  * FUNCTION: CRMF_CreateCertReqMessagesFromDER
  729.  * INPUTS:
  730.  *    buf
  731.  *        A buffer to the DER-encoded Certificate Request Messages.
  732.  *    len
  733.  *        The length in bytes of buf
  734.  * NOTES:
  735.  * This function passes the buffer to the ASN1 decoder and creates a 
  736.  * CRMFCertReqMessages structure.  Do not try adding any fields to a message
  737.  * derived from this function.  Specifically adding more Controls or 
  738.  * Extensions may cause your program to crash.
  739.  * The user must call CRMF_DestroyCertReqMessages after the return value is 
  740.  * no longer needed, ie when all individual messages have been extracted.
  741.  *  
  742.  * RETURN:
  743.  *    A pointer to the Certificate Request Messages structure.  A NULL return
  744.  *    value indicates the library was unable to parse the DER.
  745.  */ 
  746. extern CRMFCertReqMessages*
  747.        CRMF_CreateCertReqMessagesFromDER(const char *buf, long len);
  748. /*
  749.  * FUNCTION: CRMF_DestroyCertReqMessages
  750.  * INPUTS
  751.  *    inCertReqMsgs
  752.  *        The Messages to destroy.
  753.  * RETURN:
  754.  *    SECSuccess if freeing the memory was done successfully.  Any other
  755.  *    return value indicates an error in freeing up memory.
  756.  */ 
  757. extern SECStatus 
  758.        CRMF_DestroyCertReqMessages(CRMFCertReqMessages *inCertReqMsgs);
  759. /*
  760.  * FUNCTION: CRMF_CertReqMessagesGetNumMessages
  761.  * INPUTS:
  762.  *    inCertReqMsgs
  763.  *        The Request Messages to operate on.
  764.  * RETURN:
  765.  *    The number of messages contained in the in the Request Messages 
  766.  *    strucure.
  767.  */
  768. extern int 
  769.        CRMF_CertReqMessagesGetNumMessages(CRMFCertReqMessages *inCertReqMsgs);
  770. /*
  771.  * FUNCTION: CRMF_CertReqMessagesGetCertReqMsgAtIndex
  772.  * INPUTS:
  773.  *    inReqMsgs
  774.  *        The Certificate Request Messages to operate on.
  775.  *    index
  776.  *        The index of the single message the user wants a copy of.
  777.  * NOTES:
  778.  * This function returns a copy of the request messages stored at the 
  779.  * index corresponding to the parameter 'index'.  Indexing of the messages
  780.  * is done in the same manner as a C array.  Meaning the valid index are 
  781.  * 0...numMessages-1.  User must call CRMF_DestroyCertReqMsg when done using
  782.  * the return value of this function.
  783.  *
  784.  * RETURN:
  785.  * SECSuccess if copying the message at the requested index was successful.
  786.  * Any other return value indicates an invalid index or error while copying
  787.  * the single request message.
  788.  */
  789. extern CRMFCertReqMsg*
  790.        CRMF_CertReqMessagesGetCertReqMsgAtIndex(CRMFCertReqMessages *inReqMsgs,
  791. int                  index);
  792. /*
  793.  * FUNCTION: CRMF_CertReqMsgGetID
  794.  * INPUTS:
  795.  *    inCertReqMsg
  796.  *        The Certificate Request Message to get the ID from.
  797.  *    destID
  798.  *        A pointer to where the library can place the ID of the Message.
  799.  * RETURN:
  800.  *    SECSuccess if the function was able to retrieve the ID and place it
  801.  *    at *destID.  Any other return value indicates an error meaning the value
  802.  *    in *destId is un-reliable and should not be used by the caller of this 
  803.  *    function.
  804.  *    
  805.  */
  806. extern SECStatus CRMF_CertReqMsgGetID(CRMFCertReqMsg *inCertReqMsg, 
  807.       long           *destID);
  808. /*
  809.  * FUNCTION: CRMF_DoesRequestHaveField
  810.  * INPUTS:
  811.  *    inCertReq
  812.  *        The Certificate Request to operate on.
  813.  *    inField
  814.  *        An enumeration indicating which filed of the certificate template
  815.  *        to look for.
  816.  * NOTES:
  817.  * All the fields in a certificate template are optional.  This function
  818.  * checks to see if the requested field is present.  Look in crmft.h at the
  819.  * definition of CRMFCertTemplateField for possible values for possible 
  820.  * querying.
  821.  *
  822.  * RETURN:
  823.  * PR_TRUE iff the field corresponding to 'inField' has been specified as part
  824.  *         of 'inCertReq'
  825.  * PR_FALSE iff the field corresponding to 'inField' has not been speicified
  826.  *          as part of 'inCertReq'
  827.  *        
  828.  */
  829. extern PRBool CRMF_DoesRequestHaveField(CRMFCertRequest       *inCertReq,
  830. CRMFCertTemplateField  inField);
  831. /*
  832.  * FUNCTION: CRMF_CertReqMsgGetCertRequest
  833.  * INPUTS:
  834.  *    inCertReqMsg
  835.  *        The Certificate Request Message to operate on.
  836.  * NOTES:
  837.  *    This function returns a copy of the Certificate Request to the user.
  838.  *    The user can keep adding to this request and then making it a part
  839.  *    of another message.  After the user no longer wants to use the
  840.  *    returned request, the user must call CRMF_DestroyCertRequest and
  841.  *    pass it the request returned by this function.
  842.  * RETURN:
  843.  *    A pointer to a copy of the certificate request contained by the message.
  844.  *    A NULL return value indicates an error occurred while copying the 
  845.  *   certificate request.
  846.  */
  847. extern CRMFCertRequest *
  848.        CRMF_CertReqMsgGetCertRequest(CRMFCertReqMsg *inCertReqMsg);
  849. /*
  850.  * FUNCTION: CRMF_CertRequestGetCertTemplateVersion
  851.  * INPUTS:
  852.  *    inCertReq
  853.  *        The Certificate Request to operate on.
  854.  *    version
  855.  *        A pointer to where the library can store the version contatined
  856.  *        in the certificate template within the certifcate request.
  857.  * RETURN:
  858.  *    SECSuccess if the Certificate template contains the version field.  In 
  859.  *    this case, *version will hold the value of the certificate template 
  860.  *    version.
  861.  *    SECFailure indicates that version field was not present as part of
  862.  *    of the certificate template.
  863.  */
  864. extern SECStatus 
  865.        CRMF_CertRequestGetCertTemplateVersion(CRMFCertRequest *inCertReq, 
  866.       long            *version);
  867. /*
  868.  * FUNCTION: CRMF_CertRequestGetCertTemplateSerialNumber
  869.  * INPUTS:
  870.  *    inCertReq
  871.  *        The certificate request to operate on.
  872.  *    serialNumber
  873.  *        A pointer where the library can put the serial number contained
  874.  *        in the certificate request's certificate template.
  875.  * RETURN:
  876.  * If a serial number exists in the CertTemplate of the request, the function 
  877.  * returns SECSuccess and the value at *serialNumber contains the serial 
  878.  * number.
  879.  * If no serial number is present, then the function returns SECFailure and
  880.  * the value at *serialNumber is un-changed.
  881.  */
  882. extern SECStatus 
  883.        CRMF_CertRequestGetCertTemplateSerialNumber(CRMFCertRequest *inCertReq, 
  884.    long         *serialNumber);
  885. /*
  886.  * FUNCTION: CRMF_CertRequestGetCertTemplateSigningAlg
  887.  * INPUT:
  888.  *    inCertReq
  889.  *        The Certificate Request to operate on.
  890.  *    destAlg
  891.  *        A Pointer to where the library can place a copy of the signing alg
  892.  *        used in the cert request's cert template.
  893.  * RETURN:
  894.  * If the signingAlg is present in the CertRequest's CertTemplate, then
  895.  * the function returns SECSuccess and places a copy of sigingAlg in 
  896.  * *destAlg.
  897.  * If no signingAlg is present, then the function returns SECFailure and
  898.  * the value at *destAlg is un-changed
  899.  */
  900. extern SECStatus 
  901.        CRMF_CertRequestGetCertTemplateSigningAlg(CRMFCertRequest *inCertReq,
  902.  SECAlgorithmID  *destAlg);
  903. /*
  904.  * FUNCTION: CRMF_CertRequestGetCertTemplateIssuer
  905.  * INPUTS:
  906.  *    inCertReq
  907.  *        The Certificate Request to operate on.
  908.  *    destIssuer
  909.  *        A pointer to where the library can place a copy of the cert
  910.  *        request's cert template issuer field.
  911.  * RETURN:
  912.  * If the issuer is present in the cert request cert template, the function 
  913.  * returns SECSuccess and places a  copy of the issuer in *destIssuer.
  914.  * If there is no issuer present, the funciton returns SECFailure and the
  915.  * value at *destIssuer is unchanged.
  916.  */
  917. extern SECStatus 
  918.        CRMF_CertRequestGetCertTemplateIssuer(CRMFCertRequest *inCertReq,
  919.      CERTName        *destIssuer);
  920. /*
  921.  * FUNCTION: CRMF_CertRequestGetCertTemplateValidity
  922.  * INPUTS:
  923.  *    inCertReq
  924.  *        The Certificate Request to operate on.
  925.  *    destValdity
  926.  *        A pointer to where the library can place a copy of the validity
  927.  *        info in the cert request cert template.
  928.  * NOTES:
  929.  * Pass the pointer to 
  930.  * RETURN: 
  931.  * If there is an OptionalValidity field, the function will return SECSuccess
  932.  * and place the appropriate values in *destValidity->notBefore and 
  933.  * *destValidity->notAfter. (Each field is optional, but at least one will
  934.  * be present if the function returns SECSuccess)
  935.  *
  936.  * If there is no OptionalValidity field, the function will return SECFailure
  937.  * and the values at *destValidity will be un-changed.
  938.  */
  939. extern SECStatus 
  940.        CRMF_CertRequestGetCertTemplateValidity(CRMFCertRequest *inCertReq,
  941.        CRMFGetValidity *destValidity);
  942. /*
  943.  * FUNCTION: CRMF_DestroyGetValidity
  944.  * INPUTS:
  945.  *    inValidity
  946.  *        A pointer to the memroy to be freed.
  947.  * NOTES:
  948.  * The function will free the memory allocated by the function 
  949.  * CRMF_CertRequestGetCertTemplateValidity.  That means only memory pointed
  950.  * to within the CRMFGetValidity structure.  Since 
  951.  * CRMF_CertRequestGetCertTemplateValidity does not allocate memory for the
  952.  * structure passed into it, it will not free it.  Meaning this function will
  953.  * free the memory at inValidity->notBefore and inValidity->notAfter, but not
  954.  * the memory directly at inValdity.
  955.  *
  956.  * RETURN:
  957.  * SECSuccess if freeing the memory was successful.  Any other return value
  958.  * indicates an error while freeing the memory.
  959.  */
  960. extern SECStatus 
  961.        CRMF_DestroyGetValidity(CRMFGetValidity *inValidity);
  962. /*
  963.  * FUNCTION: CRMF_CertRequestGetCertTemplateSubject
  964.  * INPUTS:
  965.  *    inCertReq
  966.  *        The Certificate Request to operate on.
  967.  *    destSubject
  968.  *        A pointer to where the library can place a copy of the subject
  969.  *        contained in the request's cert template.
  970.  * RETURN:
  971.  * If there is a subject in the CertTemplate, then the function returns 
  972.  * SECSuccess and a copy of the subject is placed in *destSubject.
  973.  *
  974.  * If there is no subject, the function returns SECFailure and the values at
  975.  * *destSubject is unchanged.
  976.  */
  977. extern SECStatus 
  978.        CRMF_CertRequestGetCertTemplateSubject (CRMFCertRequest *inCertReq,
  979.        CERTName        *destSubject);
  980. /*
  981.  * FUNCTION: CRMF_CertRequestGetCertTemplatePublicKey
  982.  * INPUTS:
  983.  *    inCertReq
  984.  *        The Cert request to operate on.
  985.  *    destPublicKey
  986.  *        A pointer to where the library can place a copy of the request's
  987.  *        cert template public key.
  988.  * RETURN:
  989.  * If there is a publicKey parameter in the CertRequest, the function returns
  990.  * SECSuccess, and places a copy of the publicKey in *destPublicKey.
  991.  *
  992.  * If there is no publicKey, the function returns SECFailure and the value
  993.  * at *destPublicKey is un-changed.
  994.  */
  995. extern SECStatus 
  996.        CRMF_CertRequestGetCertTemplatePublicKey(CRMFCertRequest *inCertReq,
  997.       CERTSubjectPublicKeyInfo *destPublicKey);
  998. /*
  999.  * FUNCTION: CRMF_CertRequestGetCertTemplateIssuerUID
  1000.  * INPUTS:
  1001.  *    inCertReq
  1002.  *        The Cert request to operate on.
  1003.  *    destIssuerUID
  1004.  *        A pointer to where the library can store a copy of the request's
  1005.  *        cert template destIssuerUID.
  1006.  *
  1007.  * NOTES: 
  1008.  * destIssuerUID is a bit string and will be returned in a SECItem as
  1009.  * a bit string.  Meaning the len field contains the number of valid bits as
  1010.  * opposed to the number of bytes allocated.
  1011.  *
  1012.  * RETURN:
  1013.  * If the CertTemplate has an issuerUID, the function returns SECSuccess and
  1014.  * places a copy of the issuerUID in *destIssuerUID.
  1015.  *
  1016.  * If there is no issuerUID, the function returns SECFailure and the value
  1017.  * *destIssuerUID is unchanged.
  1018.  */
  1019. extern SECStatus 
  1020.        CRMF_CertRequestGetCertTemplateIssuerUID(CRMFCertRequest *inCertReq,
  1021. SECItem        *destIssuerUID);
  1022. /*
  1023.  * FUNCTION: CRMF_CertRequestGetCertTemplateSubjectUID
  1024.  *    inCertReq
  1025.  *        The Cert request to operate on.
  1026.  *    destSubjectUID
  1027.  *        A pointer to where the library can store a copy of the request's
  1028.  *        cert template destIssuerUID.
  1029.  *
  1030.  * NOTES: 
  1031.  * destSubjectUID is a bit string and will be returned in a SECItem as
  1032.  * a bit string.  Meaning the len field contains the number of valid bits as
  1033.  * opposed to the number of bytes allocated.
  1034.  *
  1035.  * RETURN:
  1036.  * If the CertTemplate has an issuerUID, the function returns SECSuccess and
  1037.  * places a copy of the issuerUID in *destIssuerUID.
  1038.  *
  1039.  * If there is no issuerUID, the function returns SECSuccess and the value
  1040.  * *destIssuerUID is unchanged.
  1041.  */
  1042. extern SECStatus CRMF_GetCertTemplateSubjectUID(CRMFCertRequest *inCertReq,
  1043. SECItem       *destSubjectUID);
  1044. /*
  1045.  * FUNCTION: CRMF_CertRequestGetNumberOfExtensions
  1046.  * INPUTS:
  1047.  *    inCertReq
  1048.  *        The cert request to operate on.
  1049.  * RETURN:
  1050.  *    Returns the number of extensions contained by the Cert Request.
  1051.  */
  1052. extern int CRMF_CertRequestGetNumberOfExtensions(CRMFCertRequest *inCertReq);
  1053. /*
  1054.  * FUNCTION: CRMF_CertRequestGetExtensionAtIndex
  1055.  * INPUTS:
  1056.  *    inCertReq
  1057.  *        The Certificate request to operate on.
  1058.  *    index
  1059.  *        The index of the extension array whihc the user wants to access.
  1060.  * NOTES:
  1061.  * This function retrieves the extension at the index corresponding to the 
  1062.  * parameter "index" indicates.  Indexing is done like a C array.  
  1063.  * (0 ... numElements-1)
  1064.  *
  1065.  * Call CRMF_DestroyCertExtension when done using the return value.
  1066.  *
  1067.  * RETURN:
  1068.  *    A pointer to a copy of the extension at the desired index.  A NULL 
  1069.  *    return value indicates an invalid index or an error while copying 
  1070.  *    the extension.
  1071.  */
  1072. extern CRMFCertExtension *
  1073.        CRMF_CertRequestGetExtensionAtIndex(CRMFCertRequest *inCertReq,
  1074.    int              index);
  1075. /*
  1076.  * FUNCTION: CRMF_CertExtensionGetOidTag
  1077.  * INPUTS:
  1078.  *    inExtension
  1079.  *        The extension to operate on.
  1080.  * RETURN:
  1081.  *    Returns the SECOidTag associated with the cert extension passed in.
  1082.  */
  1083. extern SECOidTag CRMF_CertExtensionGetOidTag(CRMFCertExtension *inExtension);
  1084. /*
  1085.  * FUNCTION: CRMF_CertExtensionGetIsCritical
  1086.  * INPUT:
  1087.  *    inExt
  1088.  *        The cert extension to operate on.
  1089.  *
  1090.  * RETURN:
  1091.  * PR_TRUE if the extension is critical.
  1092.  * PR_FALSE if the extension is not critical.
  1093.  */
  1094. extern PRBool CRMF_CertExtensionGetIsCritical(CRMFCertExtension *inExt);
  1095.              
  1096. /*
  1097.  * FUNCTION: CRMF_CertExtensionGetValue
  1098.  * INPUT:
  1099.  *    inExtension
  1100.  *        The extension to operate on.
  1101.  * NOTES:
  1102.  * Caller is responsible for freeing the memory associated with the return
  1103.  * value.  Call SECITEM_FreeItem(retVal, PR_TRUE) when done using the return
  1104.  * value.
  1105.  *
  1106.  * RETURN:
  1107.  * A pointer to an item containig the value for the certificate extension.
  1108.  * A NULL return value indicates an error in copying the information.
  1109.  */
  1110. extern SECItem*  CRMF_CertExtensionGetValue(CRMFCertExtension *inExtension);
  1111. /*
  1112.  * FUNCTION: CRMF_CertReqMsgGetPOPOSigningKey
  1113.  * INPUTS:
  1114.  *    inCertReqMsg
  1115.  *        The certificate request message to operate on.
  1116.  *    destKey
  1117.  *        A pointer to where the library can place a pointer to
  1118.  *        a copy of the Proof Of Possession Signing Key used 
  1119.  *        by the message.
  1120.  *
  1121.  * RETURN:
  1122.  * Get the POPOSigningKey associated with this CRMFCertReqMsg.  
  1123.  * If the CertReqMsg does not have a pop, the function returns
  1124.  * SECFailure and the value at *destKey is un-changed..
  1125.  *
  1126.  * If the CertReqMsg does have a pop, then the CertReqMsg's 
  1127.  * POPOSigningKey will be placed at *destKey.
  1128.  */
  1129. extern SECStatus 
  1130.        CRMF_CertReqMsgGetPOPOSigningKey(CRMFCertReqMsg      *inCertReqMsg,
  1131. CRMFPOPOSigningKey **destKey);
  1132. /*
  1133.  * FUNCTION: CRMF_DestroyPOPOSigningKey
  1134.  * INPUTS:
  1135.  *    inKey
  1136.  *        The signing key to free.
  1137.  *
  1138.  * RETURN:
  1139.  * SECSuccess if freeing the memory was successful.  Any other return value
  1140.  * indicates an error while freeing memory.
  1141.  */
  1142. extern SECStatus CRMF_DestroyPOPOSigningKey (CRMFPOPOSigningKey *inKey);
  1143. /*
  1144.  * FUNCTION: CRMF_POPOSigningKeyGetAlgID
  1145.  * INPUTS:
  1146.  *    inSignKey
  1147.  *        The Signing Key to operate on.
  1148.  * RETURN:
  1149.  * Return the algorithmID used by the CRMFPOPOSigningKey.  User must
  1150.  * call SECOID_DestroyAlgorithmID(destID, PR_TRUE) when done using the
  1151.  * return value.
  1152.  */
  1153. extern SECAlgorithmID* 
  1154.        CRMF_POPOSigningKeyGetAlgID(CRMFPOPOSigningKey *inSignKey);
  1155. /*
  1156.  * FUNCTION: CRMF_POPOSigningKeyGetSignature
  1157.  * INPUTS:
  1158.  *    inSignKey
  1159.  *        The Signing Key to operate on.
  1160.  *
  1161.  * RETURN:        
  1162.  * Get the actual signature stored away in the CRMFPOPOSigningKey.  SECItem
  1163.  * returned is a BIT STRING, so the len field is the number of bits as opposed
  1164.  * to the total number of bytes allocatd.  User must call 
  1165.  * SECITEM_FreeItem(retVal,PR_TRUE) when done using the return value.
  1166.  */
  1167. extern SECItem* CRMF_POPOSigningKeyGetSignature(CRMFPOPOSigningKey *inSignKey);
  1168. /*
  1169.  * FUNCTION: CRMF_POPOSigningKeyGetInput
  1170.  * INPUTS:
  1171.  *    inSignKey
  1172.  *        The Signing Key to operate on.
  1173.  * NOTES:
  1174.  * This function will return the der encoded input that was read in while 
  1175.  * decoding.  The API does not support this option when creating, so you
  1176.  * cannot add this field.
  1177.  *
  1178.  * RETURN:
  1179.  * Get the poposkInput that is part of the of the POPOSigningKey. If the
  1180.  * optional field is not part of the POPOSigningKey, the function returns
  1181.  * NULL.
  1182.  *
  1183.  * If the optional field is part of the POPOSingingKey, the function will
  1184.  * return a copy of the der encoded poposkInput.
  1185.  */
  1186. extern SECItem* CRMF_POPOSigningKeyGetInput(CRMFPOPOSigningKey *inSignKey);
  1187. /*
  1188.  * FUNCTION: CRMF_CertReqMsgGetPOPKeyEncipherment
  1189.  * INPUTS:
  1190.  *    inCertReqMsg
  1191.  *        The certificate request message to operate on.
  1192.  *    destKey
  1193.  *        A pointer to where the library can place a pointer to a 
  1194.  *        copy of the POPOPrivKey representing Key Encipherment 
  1195.  *        Proof of Possession.
  1196.  *NOTES:
  1197.  * This function gets the POPOPrivKey associated with this CRMFCertReqMsg 
  1198.  * for Key Encipherment.  
  1199.  *
  1200.  * RETURN:
  1201.  * If the CertReqMsg did not use Key Encipherment for Proof Of Possession, the
  1202.  * function returns SECFailure and the value at *destKey is un-changed.
  1203.  *
  1204.  * If the CertReqMsg did use Key Encipherment for ProofOfPossession, the
  1205.  * function returns SECSuccess and places the POPOPrivKey representing the
  1206.  * Key Encipherment Proof Of Possessin at *destKey.
  1207.  */
  1208. extern SECStatus 
  1209.        CRMF_CertReqMsgGetPOPKeyEncipherment(CRMFCertReqMsg   *inCertReqMsg,
  1210.     CRMFPOPOPrivKey **destKey);
  1211. /*
  1212.  * FUNCTION: CRMF_CertReqMsgGetPOPKeyAgreement
  1213.  * INPUTS:
  1214.  *    inCertReqMsg
  1215.  *        The certificate request message to operate on.
  1216.  *    destKey
  1217.  *        A pointer to where the library can place a pointer to a 
  1218.  *        copy of the POPOPrivKey representing Key Agreement 
  1219.  *        Proof of Possession.
  1220.  * NOTES:
  1221.  * This function gets the POPOPrivKey associated with this CRMFCertReqMsg for 
  1222.  * Key Agreement.  
  1223.  *
  1224.  * RETURN:
  1225.  * If the CertReqMsg used Key Agreement for Proof Of Possession, the
  1226.  * function returns SECSuccess and the POPOPrivKey for Key Agreement
  1227.  * is placed at *destKey.
  1228.  *
  1229.  * If the CertReqMsg did not use Key Agreement for Proof Of Possession, the
  1230.  * function return SECFailure and the value at *destKey is unchanged.
  1231.  */
  1232. extern SECStatus 
  1233.        CRMF_CertReqMsgGetPOPKeyAgreement(CRMFCertReqMsg   *inCertReqMsg,
  1234.  CRMFPOPOPrivKey **destKey);
  1235. /* 
  1236.  * FUNCTION: CRMF_DestroyPOPOPrivKey
  1237.  * INPUTS:
  1238.  *    inPrivKey
  1239.  *        The POPOPrivKey to destroy.
  1240.  * NOTES:
  1241.  * Destroy a structure allocated by CRMF_GetPOPKeyEncipherment or
  1242.  * CRMF_GetPOPKeyAgreement.
  1243.  *
  1244.  * RETURN:
  1245.  * SECSuccess on successful destruction of the POPOPrivKey.
  1246.  * Any other return value indicates an error in freeing the 
  1247.  * memory.
  1248.  */
  1249. extern SECStatus CRMF_DestroyPOPOPrivKey(CRMFPOPOPrivKey *inPrivKey);
  1250. /* 
  1251.  * FUNCTION: CRMF_POPOPrivKeyGetChoice
  1252.  * INPUT:
  1253.  *    inKey
  1254.  *        The POPOPrivKey to operate on.
  1255.  * RETURN:
  1256.  * Returns which choice was used in constructing the POPPOPrivKey. Look at
  1257.  * the definition of CRMFPOPOPrivKeyChoice in crmft.h for the possible return
  1258.  * values.
  1259.  */
  1260. extern CRMFPOPOPrivKeyChoice CRMF_POPOPrivKeyGetChoice(CRMFPOPOPrivKey *inKey);
  1261. /*
  1262.  * FUNCTION: CRMF_POPOPrivKeyGetThisMessage
  1263.  * INPUTS:
  1264.  *    inKey
  1265.  *        The POPOPrivKey to operate on.
  1266.  *    destString
  1267.  *        A pointer to where the library can place a copy of the This Message
  1268.  *        field stored in the POPOPrivKey
  1269.  *
  1270.  * RETURN:
  1271.  * Returns the field thisMessage from the POPOPrivKey.  
  1272.  * If the POPOPrivKey did not use the field thisMessage, the function
  1273.  * returns SECFailure and the value at *destString is unchanged.
  1274.  *
  1275.  * If the POPOPrivKey did use the field thisMessage, the function returns
  1276.  * SECSuccess and the BIT STRING representing thisMessage is placed
  1277.  * at *destString. BIT STRING representation means the len field is the
  1278.  * number of valid bits as opposed to the total number of bytes.
  1279.  */
  1280. extern SECStatus CRMF_POPOPrivKeyGetThisMessage(CRMFPOPOPrivKey  *inKey,
  1281. SECItem          *destString);
  1282. /*
  1283.  * FUNCTION: CRMF_POPOPrivKeyGetSubseqMess
  1284.  * INPUTS:
  1285.  *    inKey
  1286.  *        The POPOPrivKey to operate on.
  1287.  *    destOpt
  1288.  *        A pointer to where the library can place the value of the 
  1289.  *        Subsequent Message option used by POPOPrivKey.
  1290.  *
  1291.  * RETURN:
  1292.  * Retrieves the field subsequentMessage from the POPOPrivKey.  
  1293.  * If the POPOPrivKey used the subsequentMessage option, the function 
  1294.  * returns SECSuccess and places the appropriate enumerated value at
  1295.  * *destMessageOption.
  1296.  *
  1297.  * If the POPOPrivKey did not use the subsequenMessage option, the function
  1298.  * returns SECFailure and the value at *destOpt is un-changed.
  1299.  */
  1300. extern SECStatus CRMF_POPOPrivKeyGetSubseqMess(CRMFPOPOPrivKey       *inKey,
  1301.        CRMFSubseqMessOptions *destOpt);
  1302. /*
  1303.  * FUNCTION: CRMF_POPOPrivKeyGetDHMAC
  1304.  * INPUTS:
  1305.  *    inKey
  1306.  *        The POPOPrivKey to operate on.
  1307.  *    destMAC
  1308.  *        A pointer to where the library can place a copy of the dhMAC
  1309.  *        field of the POPOPrivKey.
  1310.  *        
  1311.  * NOTES:
  1312.  * Returns the field dhMAC from the POPOPrivKey.  The populated SECItem 
  1313.  * is in BIT STRING format.
  1314.  *
  1315.  * RETURN:
  1316.  * If the POPOPrivKey used the dhMAC option, the function returns SECSuccess
  1317.  * and the BIT STRING for dhMAC will be placed at *destMAC.  The len field in
  1318.  * destMAC (ie destMAC->len) will be the valid number of bits as opposed to
  1319.  * the number of allocated bytes.
  1320.  *
  1321.  * If the POPOPrivKey did not use the dhMAC option, the function returns
  1322.  * SECFailure and the value at *destMAC is unchanged.
  1323.  * 
  1324.  */
  1325. extern SECStatus CRMF_POPOPrivKeyGetDHMAC(CRMFPOPOPrivKey *inKey,
  1326.   SECItem         *destMAC);
  1327. /*
  1328.  * FUNCTION: CRMF_CertRequestGetNumControls
  1329.  * INPUTS: 
  1330.  *    inCertReq
  1331.  *        The Certificate Request to operate on.
  1332.  * RETURN:
  1333.  * Returns the number of Controls registered with this CertRequest.
  1334.  */
  1335. extern int CRMF_CertRequestGetNumControls (CRMFCertRequest *inCertReq);
  1336. /*
  1337.  * FUNCTION: CRMF_CertRequestGetControlAtIndex
  1338.  * INPUTS:
  1339.  *    inCertReq
  1340.  *        The certificate request to operate on.
  1341.  *    index
  1342.  *        The index of the control the user wants a copy of.
  1343.  * NOTES:
  1344.  * Function retrieves the Control at located at index.  The Controls 
  1345.  * are numbered like a traditional C array (0 ... numElements-1)
  1346.  *
  1347.  * RETURN:
  1348.  * Returns a copy of the control at the index specified.  This is a copy
  1349.  * so the user must call CRMF_DestroyControl after the return value is no 
  1350.  * longer needed.  A return value of NULL indicates an error while copying
  1351.  * the control or that the index was invalid.
  1352.  */
  1353. extern CRMFControl* 
  1354.        CRMF_CertRequestGetControlAtIndex(CRMFCertRequest *inCertReq, 
  1355.  int              index);
  1356. /*
  1357.  * FUNCTION: CRMF_DestroyControl
  1358.  * INPUTS:
  1359.  *    inControl
  1360.  *        The Control to destroy.
  1361.  * NOTES:
  1362.  * Destroy a CRMFControl allocated by CRMF_GetControlAtIndex.
  1363.  *
  1364.  * RETURN:
  1365.  * SECSuccess if freeing the memory was successful.  Any other return
  1366.  * value indicates an error while freeing the memory.
  1367.  */
  1368. extern SECStatus CRMF_DestroyControl(CRMFControl *inControl);
  1369. /*
  1370.  * FUNCTION: CRMF_ControlGetControlType
  1371.  * INPUTS:
  1372.  *    inControl
  1373.  *        The control to operate on.
  1374.  * NOTES:
  1375.  * The function returns an enumertion which indicates the type of control
  1376.  * 'inControl'.
  1377.  *
  1378.  * RETURN:
  1379.  * Look in crmft.h at the definition of the enumerated type CRMFControlType
  1380.  * for the possible return values.
  1381.  */
  1382. extern CRMFControlType CRMF_ControlGetControlType(CRMFControl *inControl);
  1383. /*
  1384.  * FUNCTION: CRMF_ControlGetRegTokenControlValue
  1385.  * INPUTS:
  1386.  *    inControl
  1387.  *        The Control to operate on.
  1388.  * NOTES:
  1389.  * The user must call SECITEM_FreeItem passing in the return value
  1390.  * after the returnvalue is no longer needed.
  1391.  * RETURN:
  1392.  * Return the value for a Registration Token Control.
  1393.  * The SECItem returned should be in UTF8 format.  A NULL
  1394.  * return value indicates there was no Registration Control associated
  1395.  * with the Control.
  1396.  * (This library will not verify format.  It assumes the client properly 
  1397.  * formatted the strings when adding it or the message decoded was properly 
  1398.  * formatted.  The library will just give back the bytes it was given.)
  1399.  */
  1400. extern SECItem* CRMF_ControlGetRegTokenControlValue(CRMFControl *inControl);
  1401. /*
  1402.  * FUNCTION: CRMF_ControlGetAuthenticatorControlValue
  1403.  * INPUTS:
  1404.  *    inControl
  1405.  *        The Control to operate on.
  1406.  * NOTES:
  1407.  * The user must call SECITEM_FreeItem passing in the return value
  1408.  * after the returnvalue is no longer needed.
  1409.  *
  1410.  * RETURN:
  1411.  * Return the value for the Authenticator Control.
  1412.  * The SECItem returned should be in UTF8 format.  A NULL
  1413.  * return value indicates there was no Authenticator Control associated
  1414.  * with the CRMFControl..
  1415.  * (This library will not verify format.  It assumes the client properly 
  1416.  * formatted the strings when adding it or the message decoded was properly 
  1417.  * formatted.  The library will just give back the bytes it was given.)
  1418.  */
  1419. extern SECItem* CRMF_ControlGetAuthicatorControlValue(CRMFControl *inControl);
  1420. /*
  1421.  * FUNCTION: CRMF_ControlGetPKIArchiveOptions
  1422.  * INPUTS:inControl
  1423.  *    The Control tooperate on.
  1424.  * NOTES:
  1425.  * This function returns a copy of the PKIArchiveOptions.  The user must call
  1426.  * the function CRMF_DestroyPKIArchiveOptions when the return value is no
  1427.  * longer needed.
  1428.  *
  1429.  * RETURN:
  1430.  * Get the PKIArchiveOptions associated with the Control.  A return
  1431.  * value of NULL indicates the Control was not a PKIArchiveOptions 
  1432.  * Control.
  1433.  */
  1434. extern CRMFPKIArchiveOptions* 
  1435.        CRMF_ControlGetPKIArchiveOptions(CRMFControl *inControl);
  1436.   
  1437. /*
  1438.  * FUNCTION: CMRF_DestroyPKIArchiveOptions
  1439.  * INPUTS:
  1440.  *    inOptions
  1441.  *        The ArchiveOptions to destroy.
  1442.  * NOTE:
  1443.  * Destroy the CRMFPKIArchiveOptions structure.
  1444.  *
  1445.  * RETURN:
  1446.  * SECSuccess if successful in freeing all the memory associated with 
  1447.  * the PKIArchiveOptions.  Any other return value indicates an error while
  1448.  * freeing the PKIArchiveOptions.
  1449.  */
  1450. extern SECStatus 
  1451.        CRMF_DestroyPKIArchiveOptions(CRMFPKIArchiveOptions *inOptions);
  1452. /*
  1453.  * FUNCTION: CRMF_PKIArchiveOptionsGetOptionType
  1454.  * INPUTS:
  1455.  *    inOptions
  1456.  *        The PKIArchiveOptions to operate on.
  1457.  * RETURN:
  1458.  * Returns the choice used for the PKIArchiveOptions.  Look at the definition
  1459.  * of CRMFPKIArchiveOptionsType in crmft.h for possible return values.
  1460.  */
  1461. extern CRMFPKIArchiveOptionsType
  1462.        CRMF_PKIArchiveOptionsGetOptionType(CRMFPKIArchiveOptions *inOptions);
  1463. /*
  1464.  * FUNCTION: CRMF_PKIArchiveOptionsGetEncryptedPrivKey
  1465.  * INPUTS:
  1466.  *    inOpts
  1467.  *        The PKIArchiveOptions to operate on.
  1468.  * 
  1469.  * NOTES:
  1470.  * The user must call CRMF_DestroyEncryptedKey when done using this return
  1471.  * value.
  1472.  *
  1473.  * RETURN:
  1474.  * Get the encryptedPrivKey field of the PKIArchiveOptions structure.
  1475.  * A return value of NULL indicates that encryptedPrivKey was not used as
  1476.  * the choice for this PKIArchiveOptions.
  1477.  */
  1478. extern CRMFEncryptedKey*
  1479.       CRMF_PKIArchiveOptionsGetEncryptedPrivKey(CRMFPKIArchiveOptions *inOpts);
  1480. /*
  1481.  * FUNCTION: CRMF_EncryptedKeyGetChoice
  1482.  * INPUTS:
  1483.  *    inEncrKey
  1484.  *        The EncryptedKey to operate on.
  1485.  *
  1486.  * NOTES:
  1487.  * Get the choice used for representing the EncryptedKey.
  1488.  *
  1489.  * RETURN:
  1490.  * Returns the Choice used in representing the EncryptedKey.  Look in 
  1491.  * crmft.h at the definition of CRMFEncryptedKeyChoice for possible return
  1492.  * values.
  1493.  */
  1494. extern CRMFEncryptedKeyChoice 
  1495.        CRMF_EncryptedKeyGetChoice(CRMFEncryptedKey *inEncrKey);
  1496. /*
  1497.  * FUNCTION: CRMF_EncryptedKeyGetEncryptedValue
  1498.  * INPUTS:
  1499.  *    inKey
  1500.  *        The EncryptedKey to operate on.
  1501.  *
  1502.  * NOTES:
  1503.  * The user must call CRMF_DestroyEncryptedValue passing in 
  1504.  * CRMF_GetEncryptedValue's return value.
  1505.  *
  1506.  * RETURN:
  1507.  * A pointer to a copy of the EncryptedValue contained as a member of
  1508.  * the EncryptedKey.
  1509.  */
  1510. extern CRMFEncryptedValue* 
  1511.        CRMF_EncryptedKeyGetEncryptedValue(CRMFEncryptedKey *inKey);
  1512. /*
  1513.  * FUNCTION: CRMF_DestroyEncryptedValue
  1514.  * INPUTS:
  1515.  *    inEncrValue
  1516.  *        The EncryptedValue to destroy.
  1517.  *
  1518.  * NOTES:
  1519.  * Free up all memory associated with 'inEncrValue'.
  1520.  *
  1521.  * RETURN:
  1522.  * SECSuccess if freeing up the memory associated with the EncryptedValue
  1523.  * is successful. Any other return value indicates an error while freeing the
  1524.  * memory.
  1525.  */
  1526. extern SECStatus CRMF_DestroyEncryptedValue(CRMFEncryptedValue *inEncrValue);
  1527. /*
  1528.  * FUNCTION: CRMF_EncryptedValueGetEncValue
  1529.  * INPUTS:
  1530.  *    inEncValue
  1531.  *        The EncryptedValue to operate on.
  1532.  * NOTES:
  1533.  * Function retrieves the encValue from an EncryptedValue structure.
  1534.  *
  1535.  * RETURN:
  1536.  * A poiner to a SECItem containing the encValue of the EncryptedValue
  1537.  * structure.  The return value is in BIT STRING format, meaning the
  1538.  * len field of the return structure represents the number of valid bits
  1539.  * as opposed to the allocated number of bytes.
  1540.  * ANULL return value indicates an error in copying the encValue field.
  1541.  */
  1542. extern SECItem* CRMF_EncryptedValueGetEncValue(CRMFEncryptedValue *inEncValue);
  1543. /*
  1544.  * FUNCTION: CRMF_EncryptedValueGetIntendedAlg
  1545.  * INPUTS
  1546.  *    inEncValue
  1547.  *        The EncryptedValue to operate on.
  1548.  * NOTES:
  1549.  * Retrieve the IntendedAlg field from the EncryptedValue structure.
  1550.  * Call SECOID_DestroyAlgorithmID (destAlgID, PR_TRUE) after done using
  1551.  * the return value.  When present, this alogorithm is the alogrithm for
  1552.  * which the private key will be used.
  1553.  *
  1554.  * RETURN:
  1555.  * A Copy of the intendedAlg field.  A NULL return value indicates the
  1556.  * optional field was not present in the structure.
  1557.  */
  1558. extern SECAlgorithmID* 
  1559.        CRMF_EncryptedValueGetIntendedAlg(CRMFEncryptedValue  *inEncValue);
  1560. /*
  1561.  * FUNCTION: CRMF_EncryptedValueGetSymmAlg
  1562.  * INPUTS
  1563.  *    inEncValue
  1564.  *        The EncryptedValue to operate on.
  1565.  * NOTES:
  1566.  * Retrieve the symmAlg field from the EncryptedValue structure.
  1567.  * Call SECOID_DestroyAlgorithmID (destAlgID, PR_TRUE) after done using
  1568.  * the return value.  When present, this is algorithm used to
  1569.  * encrypt the encValue of the EncryptedValue.
  1570.  *
  1571.  * RETURN:
  1572.  * A Copy of the symmAlg field.  A NULL return value indicates the
  1573.  * optional field was not present in the structure.
  1574.  */
  1575. extern SECAlgorithmID* 
  1576.        CRMF_EncryptedValueGetSymmAlg(CRMFEncryptedValue  *inEncValue);
  1577. /*
  1578.  * FUNCTION: CRMF_EncryptedValueGetKeyAlg
  1579.  * INPUTS
  1580.  *    inEncValue
  1581.  *        The EncryptedValue to operate on.
  1582.  * NOTES:
  1583.  * Retrieve the keyAlg field from the EncryptedValue structure.
  1584.  * Call SECOID_DestroyAlgorithmID (destAlgID, PR_TRUE) after done using
  1585.  * the return value.  When present, this is the algorithm used to encrypt
  1586.  * the symmetric key in the encSymmKey field of the EncryptedValue structure.
  1587.  *
  1588.  * RETURN:
  1589.  * A Copy of the keyAlg field.  A NULL return value indicates the
  1590.  * optional field was not present in the structure.
  1591.  */
  1592. extern SECAlgorithmID* 
  1593.        CRMF_EncryptedValueGetKeyAlg(CRMFEncryptedValue *inEncValue);
  1594. /*
  1595.  * FUNCTION: CRMF_EncryptedValueGetValueHint
  1596.  * INPUTS:
  1597.  *    inEncValue
  1598.  *        The EncryptedValue to operate on.
  1599.  *
  1600.  * NOTES:
  1601.  * Return a copy of the der-encoded value hint.
  1602.  * User must call SECITEM_FreeItem(retVal, PR_TRUE) when done using the
  1603.  * return value.  When, present, this is a value that the client which
  1604.  * originally issued a certificate request can use to reproduce any data
  1605.  * it wants.  The RA does not know how to interpret this data.
  1606.  *
  1607.  * RETURN:
  1608.  * A copy of the valueHint field of the EncryptedValue.  A NULL return
  1609.  * value indicates the optional valueHint field is not present in the
  1610.  * EncryptedValue.
  1611.  */
  1612. extern SECItem* 
  1613.        CRMF_EncryptedValueGetValueHint(CRMFEncryptedValue  *inEncValue);
  1614. /*
  1615.  * FUNCTION: CRMF_EncrypteValueGetEncSymmKey
  1616.  * INPUTS: 
  1617.  *    inEncValue
  1618.  *        The EncryptedValue to operate on.
  1619.  *
  1620.  * NOTES:
  1621.  * Return a copy of the encSymmKey field. This field is the encrypted
  1622.  * symmetric key that the client uses in doing Public Key wrap of a private
  1623.  * key.  When present, this is the symmetric key that was used to wrap the
  1624.  * private key.  (The encrypted private key will be stored in encValue
  1625.  * of the same EncryptedValue structure.)  The user must call 
  1626.  * SECITEM_FreeItem(retVal, PR_TRUE) when the return value is no longer
  1627.  * needed.
  1628.  *
  1629.  * RETURN:
  1630.  * A copy of the optional encSymmKey field of the EncryptedValue structure.
  1631.  * The return value will be in BIT STRING format, meaning the len field will
  1632.  * be the number of valid bits as opposed to the number of bytes. A return 
  1633.  * value of NULL means the optional encSymmKey field was not present in
  1634.  * the EncryptedValue structure.
  1635.  */
  1636. extern SECItem* 
  1637.        CRMF_EncryptedValueGetEncSymmKey(CRMFEncryptedValue *inEncValue);
  1638. /*
  1639.  * FUNCTION: CRMF_PKIArchiveOptionsGetKeyGenParameters
  1640.  * INPUTS:
  1641.  *    inOptions
  1642.  *        The PKiArchiveOptions to operate on.
  1643.  *
  1644.  * NOTES:
  1645.  * User must call SECITEM_FreeItem(retVal, PR_TRUE) after the return 
  1646.  * value is no longer needed.
  1647.  *
  1648.  * RETURN:
  1649.  * Get the keyGenParameters field of the PKIArchiveOptions.
  1650.  * A NULL return value indicates that keyGenParameters was not 
  1651.  * used as the choice for this PKIArchiveOptions.
  1652.  *
  1653.  * The SECItem returned is in BIT STRING format (ie, the len field indicates
  1654.  * number of valid bits as opposed to allocated number of bytes.)
  1655.  */
  1656. extern SECItem* 
  1657.    CRMF_PKIArchiveOptionsGetKeyGenParameters(CRMFPKIArchiveOptions *inOptions);
  1658. /*
  1659.  * FUNCTION: CRMF_PKIArchiveOptionsGetArchiveRemGenPrivKey
  1660.  * INPUTS:
  1661.  *    inOpt
  1662.  *        The PKIArchiveOptions to operate on.
  1663.  *    destVal
  1664.  *        A pointer to where the library can place the value for 
  1665.  *        arciveRemGenPrivKey
  1666.  * RETURN:
  1667.  * If the PKIArchiveOptions used the archiveRemGenPrivKey field, the
  1668.  * function returns SECSuccess and fills the value at *destValue with either
  1669.  * PR_TRUE or PR_FALSE, depending on what the PKIArchiveOptions has as a 
  1670.  * value. 
  1671.  *
  1672.  * If the PKIArchiveOptions does not use the archiveRemGenPrivKey field, the
  1673.  * function returns SECFailure and the value at *destValue is unchanged.
  1674.  */
  1675. extern SECStatus 
  1676.     CRMF_PKIArchiveOptionsGetArchiveRemGenPrivKey(CRMFPKIArchiveOptions *inOpt,
  1677.   PRBool             *destVal);
  1678. /* Helper functions that can be used by other libraries. */
  1679. /*
  1680.  * A quick helper funciton to get the best wrap mechanism.
  1681.  */
  1682. extern CK_MECHANISM_TYPE CRMF_GetBestWrapPadMechanism(PK11SlotInfo *slot); 
  1683. /*
  1684.  * A helper function to get a randomly generated IV from a mechanism 
  1685.  * type.
  1686.  */
  1687. extern SECItem* CRMF_GetIVFromMechanism(CK_MECHANISM_TYPE mechType);
  1688.  
  1689. SEC_END_PROTOS
  1690. #endif /*_CRMF_H_*/