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

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  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 _CRMFRES_H_
  35. #define _CRMFRES_H_
  36. #include "cmmf.h"
  37. #include "keyres.h"
  38. #include "ssmdefs.h"
  39. #include "ctrlconn.h"
  40. /*
  41.  * FILE: crmfres.h
  42.  * ---------------
  43.  * This file defines the public interface for the class SSMCRMFRequest
  44.  * which is to be used in Cartman to implement all necessary CRMF 
  45.  * functionality.
  46.  */
  47. /*
  48.  * STRUCTURE: SSMCRMFRequest
  49.  * -------------------------
  50.  * This is the structure used to implement the SSMCRMFRequest
  51.  * class.  This class will be used to create CRMF Requests within
  52.  * Cartman.  SSMCRMFRequest sub-classess off of SSMResource so it 
  53.  * must always follow any guidelines for naming and defining presented
  54.  * by the SSMResource class.
  55.  *
  56.  * The fields:
  57.  *
  58.  * super           The mandatory first member for any class sub-classing
  59.  *                 from SSMResource.
  60.  *
  61.  * m_KeyGenType     An enumerated type indicating what type of key pair 
  62.  *                  we are creating a request for.  This value is used 
  63.  *                  to set the appropriate keyUsage extensions and also 
  64.  *                  determining the proper method to set for 
  65.  *                  Proof-Of-Possession.  Look at the file
  66.  *                  ns/security/ssm/lib/protocol/ssmders.h for valid values.
  67.  *                  This value is set by the client.
  68.  *
  69.  * m_KeyPair        A pointer to a key pair associated with the instantiation
  70.  *                  of the CRMF request.  The members mPrivKey and mPubKey
  71.  *                  must be non-NULL values when a new request is created.
  72.  *
  73.  * m_CRMFRequest    This is the member that holds all of the state information
  74.  *                  about the CRMF request.
  75.  *
  76.  * m_Connection     This is the control connection associated with the 
  77.  *                  request.
  78.  */
  79. typedef struct SSMCRMFRequest {
  80.   SSMResource super; /* This must always be the first member of the
  81.                       * structure.  Don't even think of adding another
  82.                       * field before it or removing it.
  83.                       */
  84.   SSMKeyGenType         m_KeyGenType;
  85.   SSMKeyPair           *m_KeyPair;
  86.   CRMFCertRequest      *m_CRMFRequest;
  87.   SSMControlConnection *m_Connection;
  88. } SSMCRMFRequest;
  89. /*
  90.  * STRUCTURE: SSMCRMFRequestArg
  91.  * ----------------------------
  92.  * This structure will be used to pass the initialization information
  93.  * to the SSMCRMFRequest_Init function.
  94.  *
  95.  * keyPair          The key pair that will be associated with the 
  96.  *                  new CRMF request.
  97.  *
  98.  * connection       The control connection to be associated with the
  99.  *                  new CRMF request.  The SSMCRMFRequest object will
  100.  *                  use to get to the certificate and key databases.
  101.  */
  102. typedef struct SSMCRMFRequestArgStr {
  103.   SSMKeyPair           *keyPair;
  104.   SSMControlConnection *connection;
  105. } SSMCRMFRequestArg;
  106. /*
  107.  * FUNCTION:SSM_CreateNewCRMFRequest
  108.  * ---------------------------------
  109.  * INPUTS:
  110.  *    msg
  111.  *        The message from the client requesting a new CRMF request.
  112.  *    connection
  113.  *        The control connection to be associated with the new request.
  114.  *    destID
  115.  *        Pointer to a pre-allocated chunk of memory where the function
  116.  *        will place the ID of the newly created SSMCRMFRequest Object.
  117.  *
  118.  * NOTES:
  119.  * This function takes the message received by the client, interprets
  120.  * the message, creates a new SSMCRMFObject, adds it to the Global Resource
  121.  * table, and places the resource id of the new object at *destID.  To free
  122.  * the returned object, call SSM_FreeResource and pass in the object object 
  123.  * ID placed at *destID by this function.
  124.  *
  125.  * RETURN:
  126.  * The function returns PR_SUCCESS when successful.  Any other return value
  127.  * should be interpreted as an error.
  128.  */
  129. SSMStatus SSM_CreateNewCRMFRequest(SECItem *msg, 
  130.                                   SSMControlConnection *connection,
  131.                                   SSMResourceID *destID);
  132. /*
  133.  * FUNCTION: SSMCRMFRequest_Create
  134.  * -------------------------------
  135.  * INPUTS:
  136.  *    arg
  137.  *        The creation argument for the SSMCRMFRequest class.  This should
  138.  *        be a pointer to SSMKeyPair resource.
  139.  *    res
  140.  *        Pointer to a pre-allocated chunk of memory where the function can
  141.  *        place the value of the pointer to the newly created SSMCRMFRequest
  142.  *        object
  143.  *
  144.  * NOTES:
  145.  * This function serves as the constructor for the SSMCRMFRequest class.  This 
  146.  * function over-rides the function SSMResource_Create which is the super
  147.  * class for SSMCRMFRequest.
  148.  *
  149.  * RETURN:
  150.  * Returns PR_SUCCESS upon successful creation.  Any other error indicates an
  151.  * error.
  152.  */
  153. SSMStatus SSMCRMFRequest_Create(void *arg, SSMControlConnection * conn, 
  154.                                SSMResource **res);
  155. /*
  156.  * FUNCTION: SSMCRMFRequest_Init
  157.  * -----------------------------
  158.  * INPUTS:
  159.  *    inCRMFReq
  160.  *        A pointer to a newly allocated SSMCRMFRequest which needs to be
  161.  *        initialized.  
  162.  *    type
  163.  *        The type for the class that is being initialized.  This value should
  164.  *        always be SSM_RESTYPE_CRMFREQ.  (Unless one day someone decides to
  165.  *        sub-class off of SSMCRMFRequest.)
  166.  *    inKeyPair
  167.  *        The Key Pair to associate with the CRMF request being initialized.
  168.  *    inConnection
  169.  *        The control connection to be associated with the request being 
  170.  *        initialized.
  171.  *
  172.  * NOTES:
  173.  * This function intializes a new SSMCRMFRequest object.  This function will
  174.  * initialize its super-class member and make sure the passed in key pair has
  175.  * non-NULL values for mPrivKey and mPubKey before getting a reference to the
  176.  * passed in key pair.  Finally, the function creates a
  177.  * new NSS based CRMF request and sets the following fields in the request:
  178.  *  1) version is set v3 Cert
  179.  *  2) The Public Key value in the request
  180.  *
  181.  * RETURN:
  182.  * The function returns PR_SUCCESS upon successful initialization.  Any other
  183.  * return value should be interpreted as an error.
  184.  */
  185. SSMStatus SSMCRMFRequest_Init(SSMCRMFRequest       *inCRMFReq, 
  186.      SSMControlConnection * conn,
  187.                              SSMResourceType       type,
  188.                              SSMKeyPair           *inKeyPair,
  189.                              SSMControlConnection *inConnection);
  190. /*
  191.  * FUNCTION: SSMCRMFRequest_Destroy
  192.  * --------------------------------
  193.  * INPUTS:
  194.  *    inRequest
  195.  *        A pointer to a SSMResource of type SSM_RESTYPE_CRMFREQ to be
  196.  *        destroyed.
  197.  *    doFree
  198.  *        Until the day when someone creates a sub-class of SSMCRMFRequest,
  199.  *        this value should always be PR_TRUE.
  200.  * 
  201.  * NOTES:
  202.  * This function takes of freeing up all memory associated with the
  203.  * SSMCRMFRequest.  First the funciton will release the reference obtained
  204.  * for the member mKeyPair in the function SSMCRMFRequest_Init.  The function
  205.  * then calls CRMF_DestroyCertRequest to free the memory used by mCRMFRequest.
  206.  * Finally, the function calls SSMResource_Destroy to free up the SSMResource
  207.  * member before calling free on the pointer passed in.
  208.  *
  209.  * RETURN:
  210.  * Function returns PR_SUCCESS upon successful destruction of the object. Any
  211.  * other return value should be interpreted as an error.
  212.  */
  213. SSMStatus SSMCRMFRequest_Destroy(SSMResource *inRequest, PRBool doFree);
  214. /*
  215.  * FUNCTION: SSMCRMFRequest_SetAttr
  216.  * --------------------------------
  217.  * INPUTS:
  218.  *    res
  219.  *        A pointer to a SSMResource of type SSM_RESTYPE_CRMFREQ
  220.  *    attrID
  221.  *        The attribute to set in the request.
  222.  *    value
  223.  *        The data to use when setting the desired attribute.
  224.  *
  225.  * NOTES:
  226.  * This function over-rides SSMResource_SetAttr which all classes inherit
  227.  * from the SSMResource class.  This function will set the following 
  228.  * attributes (these attributes are defined in 
  229.  * ns/security/ssm/lib/protocol/rsrcids.h):
  230.  *
  231.  *    SSMAttributeID                SSMResourceAttrType     Value(s)
  232.  *    --------------                -------------------     --------
  233.  *    SSM_FID_CRMFREQ_KEY_TYPE      SSM_NUMERIC_ATTRIBUTE   A pointer to any
  234.  *                                                          enumerated value 
  235.  *                                                          with type of
  236.  *                                                          SSMKeyGenType.
  237.  *
  238.  *    SSM_FID_CRMFREQ_DN            SSM_STRING_ATTRIBUTE    An RFC1485 
  239.  *                                                          formatted DN.
  240.  *    
  241.  *    SSM_FID_REGTOKEN              SSM_STRING_ATTRIBUTE    A string to place
  242.  *                                                          as the Registration
  243.  *                                                          token for the 
  244.  *                                                          request.
  245.  *
  246.  *    SSM_FID_AUTHENTICATOR         SSM_STRING_ATTRIBUTE    A string to place
  247.  *                                                          as the 
  248.  *                                                          Authenticator token
  249.  *                                                          in the request.
  250.  *
  251.  *    SSM_FID_CRMFREQ_ESCROW_AUTHORITY SSM_STRING_ATTRIBUTE A base64 encoded 
  252.  *                                                          DER cert to use for
  253.  *                                                          creating the 
  254.  *                                                          PKIArchiveOptions
  255.  *                                                          control.
  256.  *
  257.  * NOTES:
  258.  * The function return PR_SUCCESS if setting the field with the given data
  259.  * was successful.  Any other return value should be considered an error.
  260.  *    
  261.  */
  262. SSMStatus SSMCRMFRequest_SetAttr(SSMResource         *res,
  263.                                 SSMAttributeID      attrID,
  264.                                 SSMAttributeValue   *value);
  265. /*
  266.  * FUNCTION: SSMCRMFRequest_SetEscrowAuthority
  267.  * -------------------------------------------
  268.  * INPUTS:
  269.  *    crmfReq
  270.  *        The CRMFRequest resource to add the escrow authority to.
  271.  *    eaCert
  272.  *        The Certificate that belongs to the CA that wants to 
  273.  *        escrow the private key associated with the request.
  274.  * NOTES:
  275.  * This function will wrap the private key in an EncryptedKey type
  276.  * defined by CRMF and include in the CRMF request that is generated.
  277.  *
  278.  * RETURN:
  279.  * PR_SUCCESS indicates the private key associated with the requested
  280.  * was successfully wrapped and made a part of the CRMF request.  Any
  281.  * other return value indicates an error in trying to wrap the private
  282.  * and include it in the CRMF request.
  283.  */
  284. SSMStatus SSMCRMFRequest_SetEscrowAuthority(SSMCRMFRequest  *crmfReq,
  285.                                            CERTCertificate *eaCert);
  286. /*
  287.  * FUNCTION: SSM_EncodeCRMFRequests
  288.  * --------------------------------
  289.  * INPUTS:
  290.  *    msg
  291.  *        The message received from the client requesting CRMF messages to 
  292.  *        be encoded.
  293.  *    destDER
  294.  *        Pointer to a pre-allocated chunk of memory where the function can 
  295.  *        place a pointer to the base64 encoded CRMF CertReqMessages
  296.  *    destLen
  297.  *        Pointer to a pre-allocated piece of memory where the function can
  298.  *        place the length of the string returned in *destDER.
  299.  *
  300.  * NOTES:
  301.  * This function takes a message request from the client to encode CRMF 
  302.  * requests.  The output will be base64 DER-formatted bytes of the type
  303.  * CertReqMessages as defined by the CRMF Internet Draft.  The function 
  304.  * will allocate a buffer in memory to store the DER using PORT_Alloc and
  305.  * place a pointer to the buffer at *destDER.
  306.  *
  307.  * RETURN:
  308.  * The function will return PR_SUCCESS if encoding the requests was successful.
  309.  * Any other return value should be treated as an error and the values at 
  310.  * *destDER and *destLen should be ignored.
  311.  */
  312. SSMStatus SSM_EncodeCRMFRequests(SSMControlConnection * ctrl, SECItem *msg, 
  313.                                 char **destDER, SSMPRUint32 *destLen);
  314. /*
  315.  * FUNCTION: SSM_ProcessCMMFCertResponse
  316.  * -------------------------------------
  317.  * INPUTS:
  318.  *    msg
  319.  *        The message received from the client requesting Cartman to 
  320.  *        process a CMMF response.
  321.  *    connection
  322.  *        The control connection associated with the CMMF response.
  323.  *        The connection is necessary so that the function can find
  324.  *        the appropriate cetificate database for placing the decoded
  325.  *        certificates.
  326.  *
  327.  * NOTES:
  328.  * This function serves as the back-end for the JavaScript method
  329.  * crypto.importUserCertificates.  It will decode the base64 DER blob passed
  330.  * in and process it.  Eventually this function will also start the process
  331.  * of backing up the certificate when Cartman supports that feature.  
  332.  * View the document at http://warp/hardcore/library/arch/cert-issue.html
  333.  * to see a detailed explanation for what this function doess.
  334.  * 
  335.  */
  336. SSMStatus SSM_ProcessCMMFCertResponse(SECItem              *msg, 
  337.                                      SSMControlConnection *connection);
  338. /*
  339.  * FUNCTION: SSM_RespondToPOPChallenge
  340.  * -----------------------------------
  341.  * INPUTS:
  342.  *    msg
  343.  *        The message received from the client requesting that Cartman
  344.  *        respond to a challenge.
  345.  *    ctrl
  346.  *        The Control Connection associated with the message to process.
  347.  *    challengeResponse
  348.  *        A pointer to a pre-allocated pointer where the function can place
  349.  *        a copy of the base64 encoded response to the challenge.  The 
  350.  *        response will be a POPODecKeyRespContent defined in the CMMF 
  351.  *        internet draft.
  352.  *    responseLen
  353.  *        A pointer to a pre-allocated PRUint32 where the function can place
  354.  *        the length of the response returned via the challengeResponse input
  355.  *        parameter.
  356.  *
  357.  * NOTES:
  358.  * This function servers as the back-end for the JavaScript method
  359.  * crypto.popChallengeRespone.  The function will decode the base64 DER blob
  360.  * passed in and process it.  The function 
  361.  */
  362. SSMStatus SSM_RespondToPOPChallenge(SECItem                *msg, 
  363.                                    SSMControlConnection   *ctrl,
  364.                                    char                  **challengeResponse, 
  365.                                    PRUint32               *responseLen);
  366. typedef struct SSMCRMFThreadArgStr {
  367.     SSMControlConnection *ctrl;
  368.     SECItem              *msg;
  369. } SSMCRMFThreadArg;
  370. /*
  371.  * FUNCTION: SSM_CRMFEncodeThread
  372.  * ------------------------------
  373.  * INPUTS:
  374.  *    arg
  375.  *        A pointer to a structure of type SSMCRMFThreadArg which the function
  376.  *        will use to encode a CRMF request.
  377.  * NOTES:
  378.  * This function is intended to encode a CRMF request taking a message from
  379.  * the client as its argument along with the associated control thread.  This
  380.  * function will send the reply back to the client in case of success or 
  381.  * failure so the client may proceed with its operations.
  382.  * RETURN:
  383.  * No return value.
  384.  */
  385. void SSM_CRMFEncodeThread(void *arg);
  386. #endif /* _CRMFRES_H_ */