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