/******************************************************************************
 *
 * Copyright (c) 2001-2004 PalmSource, Inc. All rights reserved.
 *
 * File: CPMLibCommon.h
 *
 * Release: Palm OS 6.1
 *
 *****************************************************************************/

#ifndef _CPMLIB_COMMON_H
#define _CPMLIB_COMMON_H


#include <PalmTypes.h>
#include <CmnErrors.h>

 
/** @def cpmCreator 
 * Used for both the database that contains the
 * Cryptographic Provider Manager Library and it's preferences
 * database.  
 */
#define cpmCreator 'cpml'       /* Our CPM Library creator */

/** @def cpmFtrCreator
 * Our feature creator for use with the FtrGet() call. 
 */
#define cpmFtrCreator cpmCreator

 /** @def cpmFtrNumVersion
  * This feature can be obtained to get the current version of the CPM
  * Library.
  *
  * <pre>
  * 0xMMmfsbbb, where MM is major version, m is minor version
  * f is bug fix, s is stage: 3-release,2-beta,1-alpha,0-development,
  * bbb is build number for non-releases 
  * V1.12b3   would be: 0x01122003
  * V2.00a2   would be: 0x02001002
  * V1.01     would be: 0x01013000
  * </pre>
  */
#define cpmFtrNumVersion 0

/** @def cpmErrAlreadyOpen
 * CPM Library is already open. Usually returned from a CPMLibOpen
 * indicating that the library is already open.
 */
#define cpmErrAlreadyOpen         (cpmErrorClass | 1)
/** @def cpmErrNotOpen
 * CPM Library not open. Usually returned from a CPM Library call
 * indciating that the CPM library is not yet open.
 */
#define cpmErrNotOpen             (cpmErrorClass | 2)
/** @def cpmErrStillOpen
 * CPM Library is still open after a CPMLibClose call.
 */
#define cpmErrStillOpen           (cpmErrorClass | 3)
/** @def cpmErrNoProviders
 * CPM Library is not aware of any providers. With no providers the
 * CPM Library has no functionality.
 */
#define cpmErrNoProviders         (cpmErrorClass | 4)
/** @def cpmErrNoBaseProvider
 * CPM Library cannot load the Base provider.
 */
#define cpmErrNoBaseProvider  (cpmErrorClass | 5)
/** @def cpmErrProviderNotFound
 * CPM Library cannot find the specified provider.
 */
#define cpmErrProviderNotFound    (cpmErrorClass | 6)
/** @def cpmErrParamErr
 * A CPM library call was made with an invalid parameter.
 */
#define cpmErrParamErr            (cpmErrorClass | 10)
/** @def cpmErrOutOfResources
 * The CPM Library is out of resources (memory, static heap, etc.)
 */
#define cpmErrOutOfResources      (cpmErrorClass | 11)
/** @def cpmErrOutOfMemory
 * The CPM Library is out of dynamic heap.
 */
#define cpmErrOutOfMemory         (cpmErrorClass | 12)
/** @def cpmErrBufTooSmall
 * A buffer passed into the CPM Library was too small.
 */
#define cpmErrBufTooSmall         (cpmErrorClass | 13)
/** @def cpmErrBadData
 * Data passed into the CPM Library was no good.
 */
#define cpmErrBadData             (cpmErrorClass | 14)

/** @def cpmErrUnimplemented
 * A CPM Library function is not implemented. 
 */
#define cpmErrUnimplemented       (cpmErrorClass | 15)
/** @def cpmErrUnsupported
 * A CPM Library function is unsupported in the current version.
 */
#define cpmErrUnsupported         (cpmErrorClass | 16)
/** @def cpmErrNoAppContext
 * The CPM application context could not be found for this operation
 */
#define cpmErrNoAppContext         (cpmErrorClass | 17)
/** @def cpmErrKeyExists
 * The key you are trying to import already seems to exist
 */
#define cpmErrKeyExists     (cpmErrorClass | 18)
/** @def cpmErrKeyNotFound
 * The key you are trying to export doesnt seem to exist
 */
#define cpmErrKeyNotFound   (cpmErrorClass | 19)

#define LOG_EMERG       0       /* system is unusable */
#define LOG_ALERT       1       /* action must be taken immediately */
#define LOG_CRIT        2       /* critical conditions */
#define LOG_ERR         3       /* error conditions */
#define LOG_WARNING     4       /* warning conditions */
#define LOG_NOTICE      5       /* normal but significant condition */
#define LOG_INFO        6       /* informational */
#define LOG_DEBUG       7       /* debug-level messages */

/** @def APF_MP
 * multiple part operations supported (Init, Update, FInal) else just
 * single part operation
 */
#define APF_MP               0x00000001 

/** @def APF_HW
 * provider implemented in hardware (SmartCard)
 */
#define APF_HW               0x00000002 

/** @def APF_KEYGEN
 * provider supports key generation, import and export
 */
#define APF_KEYGEN           0x00000004

/** @def APF_KEYPAIRGEN
 * provider supports key pair generation, import and export
 */
#define APF_KEYPAIRGEN       0x00000010

/** @def APF_KEYDERIVE
 * provider supports key derivation, import and export
 */
#define APF_KEYDERIVE        0x00000020

/** @def APF_HASH
 * provider supportes message digests
 */
#define APF_HASH             0x00000040

/** @def APF_CIPHER
 * provider supports encryption/decryption, import and export
 */
#define APF_CIPHER           0x00000080

/** @def APF_SIGN
 * provider supports signing
 */
#define APF_SIGN             0x00000100

/** @def APF_VERIFY
 * provider supports verification
 */
#define APF_VERIFY           0x00000200

/** @def APF_MAC
 * provider supports MAC
 */
#define APF_MAC              0x00000400

/** @def IMPORT_EXPORT_TYPE_RAW
 * a raw form of import/export as defined by the provider 
 */
#define IMPORT_EXPORT_TYPE_RAW 0

/** @def IMPORT_EXPORT_TYPE_DER
 * a standardized ASN.1 DER encoding
 */
#define IMPORT_EXPORT_TYPE_DER 1

/** @def IMPORT_EXPORT_TYPE_XML
 * a standardized XML encoding 
 */
#define IMPORT_EXPORT_TYPE_XML 2 

/** @enum APHashEnum
 * Algorithm provider hash type enumeration
 */ 
typedef uint32_t APHashEnum;

#define   apHashTypeUnspecified             0x00L
#define   apHashTypeNone                    0x01L
#define   apHashTypeMD2                     0x02L
#define   apHashTypeMD5                     0x03L
#define   apHashTypeSHA1                    0x04L
#define   apHashTypeHAVAL                   0x05L
#define   apHashTypeRIPEMD160               0x06L
#define   apHashTypeTiger                   0x07L
#define   apHashTypePanama                  0x08L
/* SHA-2 */
#define   apHashTypeSHA256                  0x09L
#define   apHashTypeSHA384                  0x0aL
#define   apHashTypeSHA512                  0x0bL



/** @enum APAlgorithmEnum
 * Algorithm provider key type enumeration
 */
typedef uint32_t APAlgorithmEnum;

#define   apAlgorithmTypeUnspecified        0x00L
  /* block ciphers */
#define   apSymmetricTypeDES                0x01L
#define   apSymmetricTypeRC2                0x02L
#define   apSymmetricTypeRC4                0x03L
#define   apSymmetricTypeRC5                0x04L
#define   apSymmetricTypeRC6                0x05L
#define   apSymmetricTypeDESX_XDX3          0x06L
#define   apSymmetricType3DES_EDE2          0x07L
#define   apSymmetricType3DES_EDE3          0x08L
#define   apSymmetricTypeIDEA               0x09L
#define   apSymmetricTypeDiamond2           0x0aL
#define   apSymmetricTypeBlowfish           0x0bL
#define   apSymmetricTypeTEA                0x0cL
#define   apSymmetricTypeSAFER              0x0dL
#define   apSymmetricType3WAY               0x0eL
#define   apSymmetricTypeGOST               0x0fL
#define   apSymmetricTypeSHARK              0x10L
#define   apSymmetricTypeCAST128            0x11L
#define   apSymmetricTypeSquare             0x12L
#define   apSymmetricTypeSkipjack           0x13L
  /* stream ciphers */
#define   apSymmetricTypePanama             0x14L
#define   apSymmetricTypeARC4               0x15L
#define   apSymmetricTypeSEAL               0x16L
#define   apSymmetricTypeWAKE               0x17L
#define   apSymmetricTypeSapphire           0x18L
#define   apSymmetricTypeBBS                0x19L
  /* AES block ciphers */
#define   apSymmetricTypeRijndael           0x2aL
#define   apSymmetricTypeCAST256            0x2bL
#define   apSymmetricTypeTwofish            0x2cL
#define   apSymmetricTypeMARS               0x2dL
#define   apSymmetricTypeSerpent            0x2eL
  /* asymmetric key types */
#define   apAsymmetricTypeRSA               0x2fL
#define   apAsymmetricTypeDSA               0x30L
#define   apAsymmetricTypeElgamal           0x31L
#define   apAsymmetricTypeNR                0x32L /* Nyberg-Rueppel */
#define   apAsymmetricTypeBlumGoldwasser    0x33L
#define   apAsymmetricTypeRabin             0x34L
#define   apAsymmetricTypeRW                0x35L /* Rabin-Williams */
#define   apAsymmetricTypeLUC               0x36L
#define   apAsymmetricTypeLUCELG            0x37L
  /* elliptic curve */
#define   apAsymmetricTypeECDSA             0x38L
#define   apAsymmetricTypeECNR              0x39L
#define   apAsymmetricTypeECIES             0x3aL
#define   apAsymmetricTypeECDHC             0x3bL
#define   apAsymmetricTypeECMQVC            0x3cL
  /* key agreement */
#define   apKeyAgreementTypeDH              0x3dL
#define   apKeyAgreementTypeDH2             0x3eL /* Unified Diffie-Hellman */    
#define   apKeyAgreementTypeMQV             0x3fL /* Menezes-Qu-Vanstone */
#define   apKeyAgreementTypeLUCDIF          0x40L
#define   apKeyAgreementTypeXTRDH           0x41L


/** @enum APModeEnum
 * Modes of operation for symmetric encryption/decryption
 */
typedef uint32_t APModeEnum;

#define   apModeTypeUnspecified             0x00L
#define   apModeTypeNone                    0x01L
#define   apModeTypeECB                     0x02L
#define   apModeTypeCBC                     0x03L
#define   apModeTypeCBC_CTS                 0x04L
#define   apModeTypeCFB                     0x05L
#define   apModeTypeOFB                     0x06L
#define   apModeCounter                     0x07L

/** @enum APKeyUsageEnum
 * Key Usage
 */
typedef uint32_t APKeyUsageEnum;

#define   apKeyUsageUnspecified             0x00L
#define   apKeyUsageAll                     0x01L
#define   apKeyUsageSigning                 0x02L
#define   apKeyUsageEncryption              0x03L
#define   apKeyUsageCertificateSigning      0x04L
#define   apKeyUsageKeyEncrypting           0x05L
#define   apKeyUsageDataEncrypting          0x06L
#define   apKeyUsageMessageIntegrity        0x07L


/** @enum APKeyClassEnum
 * Key Class
 */
typedef uint32_t APKeyClassEnum;

#define   apKeyClassUnspecified             0x00L
#define   apKeyClassSymmetric               0x01L
#define   apKeyClassPublic                  0x02L
#define   apKeyClassPrivate                 0x03L

/** @enum APPaddingEnum
 * Padding type 
 */
typedef uint32_t APPaddingEnum;

#define   apPaddingTypeUnspecified          0x00L
#define   apPaddingTypeNone                 0x01L
#define   apPaddingTypePKCS1Type1           0x02L
#define   apPaddingTypePKCS1Type2           0x03L
#define   apPaddingTypePKCS5                0x04L
#define   apPaddingTypeOAEP                 0x05L
#define   apPaddingTypeSSLv23               0x06L

/** @enum ApKeyDerivationEnum
 * Key Derivation Type
 */
typedef uint32_t APKeyDerivationEnum;

#define   apKeyDerivationUnspecified        0x00L
#define   apKeyDerivationTypePKCS5v1        0x01L
#define   apKeyDerivationTypePKCS5v2        0x02L
#define   apKeyDerivationTypePKCS12         0x03L
#define   apKeyDerivationTypePKIX           0x04L
#define   apKeyDerivationTypeTLS            0x05L

/** @enum APKeyDerivationUsageEnum
 * KeyDerivation usage type 
 */
typedef uint32_t APKeyDerivationUsageEnum;

#define  apKeyDerivationUsageUnspecified    0x00L
#define  apKeyDerivationUsageEncryption     0x01L
#define  apKeyDerivationUsageMAC            0x02L
#define  apKeyDerivationUsageIV             0x03L

/** @enum APMACEnum
 * MAC type 
 */
typedef uint32_t APMACEnum;

#define  apMACUnspecified                   0x00L
#define  apMACHMAC                          0x01L

/** @struct CPMInfoStruct
 * 
 * Structure to hold information about the CPM Library as it is known
 * by the currently running system.
 */
struct CPMInfoStruct {
  /*! number of instances of this library */
  uint8_t numInstances;           
  /*! number of providers this library knows about */
  uint8_t numProviders;           
  /*! is the default provider known? */
  Boolean defaultProviderPresent; 
};

typedef struct CPMInfoStruct CPMInfoType, *CPMInfoPtr;

/** @struct APProviderInfoStruct
 * 
 * Structure to hold information about a particular provider as it is
 * known by the current instantiation of the CPM library.
 */
struct APProviderInfoStruct {
  /*! name of the provider */
  char name[32];                
  /*! other textual information */
  char other[64];            
  /*! flags to indicate the functionality supported */
  uint32_t flags;                 
  /*! number of algorithms supported */
  uint8_t numAlgorithms;          
  /*! is this a hardware provider? */
  Boolean bHardware;   
  uint16_t padding;
};

typedef struct APProviderInfoStruct APProviderInfoType, *APProviderInfoPtr;

/** @struct APProviderContextStruct
 * Provider specific information
 */
struct APProviderContextStruct {
  /*! the provider handling this operation */
  uint32_t providerID;            
  /*! provider specific infomation about this operation */
  void *localContext;           
};

typedef struct APProviderContextStruct APProviderContextType, *APProviderContextPtr;

/** @struct APHashInfoStruct
 * 
 * Structure to hold information about a particular hashing operation
 * including generic information about hashing operations and specific
 * information about the provider's concept of the hashing operation.
 * 
 * The application is responsible for allocating memory and
 * deallocating memory for this structure. 
 */
struct APHashInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext;
  /*! the type of the hash; APHashType */
  APHashEnum type;             
  /*! the length of the hash in bytes */
  uint32_t length;               
};

typedef struct APHashInfoStruct APHashInfoType, *APHashInfoPtr;

/** @struct APKeyInfoStruct
 * 
 * Structure to hold information about a particular key including
 * generic information about all keys and specific information about the
 * provider's concept of the key. 
 *
 * The application is always repsonsible for allocating and freeing
 * the APKeyInfoType. The application must also call CPMLibReleaseKeyInfo
 * before freeing the APKeyInfoType to allow the CPM and provider to
 * cleanup.
 *
 * If the application does not care or wants default settings for the
 * APKeyInfoType, the application would allocate the APKeyInfoType and
 * zero the structure. Upon return from either CPMLibImportKey or
 * CPMLibGenerateKey the APKeyInfoType structure would be filled in by
 * the CPM and provider with the appropriate information.
 *
 * If the application does care about the settings for the
 * APKeyInfoType, the application would allocate the APKeyInfoType and
 * set the fields appropriately before passing it in to
 * CPMLibGenerateKey. 
 */
struct APKeyInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext; 
  /*! the type of this key - APAlgorithmType */
  APAlgorithmEnum type;         
  /*! key usage - APKeyUsageType */
  APKeyUsageEnum usage;         
  /*! key class - APKeyClassType */
  APKeyClassEnum keyclass;      
  /*! e.g. 8 for DES */ 
  uint32_t length;
  /*! e.g. 7 for DES */
  uint32_t actualLength; 
  /*! is this key exportable? - 0 false, 1 true */
  uint16_t exportable;          
  /*! is this key permanent */                                  
  uint16_t ephemeral;   
};

typedef struct APKeyInfoStruct APKeyInfoType, *APKeyInfoPtr;

/** @struct APDerivedKeyInfoStruct
 *
 * Structure to hold the various information about the derivation
 * function and parameters. 
 */
struct APDerivedKeyInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext;
  /*! the type of key derivation to be performed */
  APKeyDerivationEnum kdType;
  /*! the allowed usage of the subsequently derived key */
  APKeyDerivationUsageEnum kdUsage;
  /*! cryptographic salt to be used for the derivation function */
  uint8_t *salt;
  /*! the length of the @c salt */
  uint32_t saltLen;
  /*! the number of iterations for this particular derivation
   * operation 
   */
  uint32_t iterationCount;
  /*! other derivation function specific parameters as defined by both
   * the provider handling the derivation and the derivation function
   * itself
   */
  void *kdInfo;
};

typedef struct APDerivedKeyInfoStruct APDerivedKeyInfoType, *APKeyDerivedKeyInfoPtr;

/** @struct APCipherInfoStruct
 * 
 * Structure to hold information about a particular operation's
 * context including generic information about contexts and specific
 * information about the provider's concept of the context.
 *
 * The application is always repsonsible for allocating and freeing
 * the APCipherInfoType. The application must also call
 * CPMLibReleaseContext before freeing the APCipherInfoType to allow
 * the CPM and provider(s) to cleanup.
 *
 * If the application does not care or wants default settings for the
 * APCipherInfoType the application would allocate the
 * APCipherInfoType and zero the structure. Upon return from either
 * CPMLib(Encrypt|Decrypt)[Init] or CPMLibImportCipherInfo the
 * APCipherInfoType structure would be filled in by the CPM and
 * provider with the appropriate information.
 *
 * If the application does care about the settings for the
 * APCipherInfoType, the application would allocate the
 * APCipherInfoType and set the fields appropriately before passing
 * it in to CPMLib(Encrypt|Decrypt)[Init].  
 */
struct APCipherInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext; 
  /*! cipher type - APAlgorithmEnum */
  APAlgorithmEnum type;       
  /*! type padding for this cipher - APPaddingEnum */
  APPaddingEnum padding;       
  /*! mode of this cipher */
  APModeEnum mode;  
  /*! initialization vector as specified by the caller */
  uint8_t *iv;                    
  /*! sizeof initialization vector */
  uint32_t ivLength;      
  /*! provider specific algorithm parameters */
  void *algorithmParams;        
};

typedef struct APCipherInfoStruct APCipherInfoType, *APCipherInfoPtr;

/** @struct APMACInfoStruct
 * 
 * Structure to hold information about a particular Message
 * Authentication Code (MAC) operation.
 */
struct APMACInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext; 
  /*! cipher type - APMACEnum */
  APMACEnum type;       
};

typedef struct APMACInfoStruct APMACInfoType, *APMACInfoPtr;

/** @struct APVerifyInfoStruct
 * 
 * Structure to hold information about a particular operation's
 * verification context including generic information about verification
 * contexts and specific information about the provider's concept of
 * the verification context.
 *
 * The application is always repsonsible for allocating and freeing
 * the APVerifyInfoType and the associated APCipherInfoType and
 * APHashInfoType. The application must call
 * CPMLibReleaseCipherInfo on the APCipherInfoType to allow the CPM and
 * provider(s) to cleanup the APCipherInfoType. The application must call 
 * CPMLibReleaseHashInfo on the APHashInfoType to allow the CPM and provider(s)
 * to cleanup the APHashInfoType.
 *
 * If the application does not care or wants default settings for
 * either the APCipherInfoType or the APHashInfoType, the application
 * would allocate the APCipherInfoType and the APHashInfoType and
 * zero the structures. Upon return from CPMLibVerify[Init] the
 * APCipherInfoType structure and APHashInfoType structure would be
 * filled in by the CPM and provider(s) with the appropriate information.
 *
 * If the application does care about the settings for either the
 * APCipherInfoType or the APHashInfoType, the application would
 * allocate the APCipherInfoType and the APHashInfoType and set the
 * fields appropriately before passing it in to CPMLibVerify[Init]. The
 * application may set the fields in one or the other or both. 
 */
struct APVerifyInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext;
  /*! hash to use */
  APHashInfoType *hashInfoP;    
  /*! cipher to use */
  APCipherInfoType *cipherInfoP; 
};

typedef struct APVerifyInfoStruct APVerifyInfoType, *APVerifyInfoPtr;

typedef uint32_t VerifyResultType, *VerifyResultPtr;

/** @struct APSignInfoStruct
 * 
 * Structure to hold information about a particular operation's
 * signature context including generic information about signature
 * contexts and specific information about the provider's concept of
 * the signature context.
 *
 * The application is always repsonsible for allocating and freeing
 * the APSignInfoType and the associated APCipherInfoType and
 * APHashInfoType. The application must call
 * CPMLibReleaseCipherInfo on the APCipherInfoType to allow the CPM and
 * provider(s) to cleanup the APCipherInfoType. The application must call 
 * CPMLibReleaseHashInfo on the APHashInfoType to allow the CPM and provider(s)
 * to cleanup the APHashInfoType.
 *
 * If the application does not care or wants default settings for
 * either the APCipherInfoType or the APHashInfoType, the application
 * would allocate the APCipherInfoType and the APHashInfoType and
 * zero the structures. Upon return from CPMLibSign[Init] the
 * APCipherInfoType structure and APHashInfoType structure would be
 * filled in by the CPM and provider(s) with the appropriate information.
 *
 * If the application does care about the settings for either the
 * APCipherInfoType or the APHashInfoType, the application would
 * allocate the APCipherInfoType and the APHashInfoType and set the
 * fields appropriately before passing it in to CPMLibSign[Init]. The
 * application may set the fields in one or the other or both. 
 */
struct APSignInfoStruct {
  /*! the providerContext of this InfoType */
  APProviderContextType providerContext;
  /*! hash to use */
  APHashInfoType *hashInfoP;    
  /*! cipher to use */
  APCipherInfoType *cipherInfoP; 
};

typedef struct APSignInfoStruct APSignInfoType, *APSignInfoPtr;
#endif /* _CPMLIB_COMMON_H */
