/* -*- Mode: C; tab-width: 8 -*-*/
/*
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 * 
 * The Original Code is the Netscape security libraries.
 * 
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are 
 * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
 * Rights Reserved.
 * 
 * Contributor(s):
 * 
 * Alternatively, the contents of this file may be used under the
 * terms of the GNU General Public License Version 2 or later (the
 * "GPL"), in which case the provisions of the GPL are applicable 
 * instead of those above.  If you wish to allow use of your 
 * version of this file only under the terms of the GPL and not to
 * allow others to use your version of this file under the MPL,
 * indicate your decision by deleting the provisions above and
 * replace them with the notice and other provisions required by
 * the GPL.  If you do not delete the provisions above, a recipient
 * may use your version of this file under either the MPL or the
 * GPL.
 */


/* Header file with all of the structures and types that will be exported 
 * by the security library for implementation of CRMF.
 */

#ifndef _CRMFT_H_
#define _CRMFT_H_

/* Use these enumerated values for adding fields to the certificate request */
typedef enum {
    crmfVersion = 0,
    crmfSerialNumber = 1,
    crmfSigningAlg = 2,
    crmfIssuer = 3,
    crmfValidity = 4,
    crmfSubject = 5,
    crmfPublicKey = 6,
    crmfIssuerUID = 7,
    crmfSubjectUID = 8,
    crmfExtension = 9
} CRMFCertTemplateField;

/*
 * An enumeration for the different types of controls.
 */
typedef enum {
    crmfNoControl = 0,
    crmfRegTokenControl = 1,
    crmfAuthenticatorControl = 2,
    crmfPKIPublicationInfoControl = 3,
    crmfPKIArchiveOptionsControl = 4,
    crmfOldCertIDControl = 5,
    crmfProtocolEncrKeyControl = 6
} CRMFControlType;

/*
 * The possible values that are passed into CRMF_CreatePKIPublicationInfo
 */
typedef enum {
    crmfDontPublish = 0,
    crmfPleasePublish = 1
} CRMFPublicationAction;

/*
 * An enumeration for the possible for pubMethod which is a part of 
 * the SinglePubInfo ASN1 type.
 */
typedef enum {
    crmfDontCare = 0,
    crmfX500 = 1,
    crmfWeb = 2,
    crmfLdap = 3
} CRMFPublicationMethod;

/*
 * An enumeration for the different options for PKIArchiveOptions type.
 */
typedef enum {
    crmfNoArchiveOptions = 0,
    crmfEncryptedPrivateKey = 1,
    crmfKeyGenParameters = 2,
    crmfArchiveRemGenPrivKey = 3
} CRMFPKIArchiveOptionsType;

/*
 * An enumeration for the different options for ProofOfPossession
 */
typedef enum {
    crmfNoPOPChoice = 0,
    crmfRAVerified = 1,
    crmfSignature = 2,
    crmfKeyEncipherment = 3,
    crmfKeyAgreement = 4
} CRMFPOPChoice;

/*
 * An enumertion type for options for the authInfo field of the 
 * CRMFPOPOSigningKeyInput structure.
 */
typedef enum {
    crmfSender = 0,
    crmfPublicKeyMAC = 1
} CRMFPOPOSkiInputAuthChoice;

/*
 * An enumeration for the SubsequentMessage Options.
 */
typedef enum {
    crmfNoSubseqMess = 0,
    crmfEncrCert = 1,
    crmfChallengeResp = 2
} CRMFSubseqMessOptions;

/*
 * An enumeration for the choice used by POPOPrivKey.
 */
typedef enum {
    crmfNoMessage = 0,
    crmfThisMessage = 1,
    crmfSubsequentMessage = 2,
    crmfDHMAC = 3
} CRMFPOPOPrivKeyChoice;

/*
 * An enumeration for the choices for the EncryptedKey type.
 */
typedef enum {
    crmfNoEncryptedKeyChoice = 0,
    crmfEncryptedValueChoice = 1,
    crmfEnvelopedDataChoice = 2
} CRMFEncryptedKeyChoice;

/*
 * TYPE: CRMFEncoderOutputCallback
 *     This function type defines a prototype for a function that the CRMF
 *     library expects when encoding is performed.
 *
 * ARGUMENTS:
 *     arg
 *         This will be a pointer the user passed into an encoding function.
 *         The user of the library is free to use this pointer in any way.
 *         The most common use is to keep around a buffer for writing out
 *         the DER encoded bytes.
 *     buf
 *         The DER encoded bytes that should be written out.
 *     len
 *         The number of DER encoded bytes to write out.
 *
 */
typedef void (*CRMFEncoderOutputCallback) (void *arg,
					   const char *buf,
					   unsigned long len);

/*
 * Type for the function that gets a password.  Just in case we ever
 * need to support publicKeyMAC for POPOSigningKeyInput
 */
typedef SECItem* (*CRMFMACPasswordCallback) (void *arg);

typedef struct CRMFOptionalValidityStr      CRMFOptionalValidity;
typedef struct CRMFValidityCreationInfoStr  CRMFGetValidity;
typedef struct CRMFCertTemplateStr          CRMFCertTemplate;
typedef struct CRMFCertRequestStr           CRMFCertRequest;
typedef struct CRMFCertReqMsgStr            CRMFCertReqMsg;
typedef struct CRMFCertReqMessagesStr       CRMFCertReqMessages;
typedef struct CRMFProofOfPossessionStr     CRMFProofOfPossession;
typedef struct CRMFPOPOSigningKeyStr        CRMFPOPOSigningKey;
typedef struct CRMFPOPOSigningKeyInputStr   CRMFPOPOSigningKeyInput;
typedef struct CRMFPOPOPrivKeyStr           CRMFPOPOPrivKey;
typedef struct CRMFPKIPublicationInfoStr    CRMFPKIPublicationInfo;
typedef struct CRMFSinglePubInfoStr         CRMFSinglePubInfo;
typedef struct CRMFPKIArchiveOptionsStr     CRMFPKIArchiveOptions;
typedef struct CRMFEncryptedKeyStr          CRMFEncryptedKey;
typedef struct CRMFEncryptedValueStr        CRMFEncryptedValue;
typedef struct CRMFCertIDStr                CRMFCertID;
typedef struct CRMFCertIDStr                CRMFOldCertID;
typedef CERTSubjectPublicKeyInfo            CRMFProtocolEncrKey;
typedef struct CRMFValidityCreationInfoStr  CRMFValidityCreationInfo;
typedef struct CRMFCertExtCreationInfoStr   CRMFCertExtCreationInfo;
typedef struct CRMFPKMACValueStr            CRMFPKMACValue;
typedef struct CRMFAttributeStr             CRMFAttribute;
typedef struct CRMFControlStr               CRMFControl;
typedef CERTGeneralName                     CRMFGeneralName;
typedef struct CRMFCertExtensionStr         CRMFCertExtension;

struct CRMFValidityCreationInfoStr {
    PRTime *notBefore;
    PRTime *notAfter;
};

struct CRMFCertExtCreationInfoStr {
    CRMFCertExtension **extensions;
    int numExtensions;
};

/*
 * Some ASN1 Templates that may be needed.
 */
extern const SEC_ASN1Template CRMFCertReqMessagesTemplate[];
extern const SEC_ASN1Template CRMFCertRequestTemplate[];


#endif /*_CRMFT_H_*/
