535 lines
18 KiB
C
535 lines
18 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (c) 1994-2003 PalmSource, Inc. All rights reserved.
|
|
*
|
|
* File: CPMLibCommon.h
|
|
*
|
|
* Release: Palm OS 5 SDK (68K) R3.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef _CPMLIB_COMMON_H
|
|
#define _CPMLIB_COMMON_H
|
|
|
|
#include <ErrorBase.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 cpmErrNoGlobals
|
|
* The CPM globals could not be found for this operation
|
|
*/
|
|
#define cpmErrNoGlobals (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 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 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 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 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 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 APKeyClassEnum;
|
|
|
|
#define apKeyClassUnspecified 0x00L
|
|
#define apKeyClassSymmetric 0x01L
|
|
#define apKeyClassPublic 0x02L
|
|
#define apKeyClassPrivate 0x03L
|
|
|
|
/** @enum APPaddingEnum
|
|
* Padding type
|
|
*/
|
|
typedef UInt32 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 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 APKeyDerivationUsageEnum;
|
|
|
|
#define apKeyDerivationUsageUnspecified 0x00L
|
|
#define apKeyDerivationUsageEncryption 0x01L
|
|
#define apKeyDerivationUsageMAC 0x02L
|
|
#define apKeyDerivationUsageIV 0x03L
|
|
|
|
/** @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 numInstances;
|
|
/*! number of providers this library knows about */
|
|
UInt8 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 flags;
|
|
/*! number of algorithms supported */
|
|
UInt8 numAlgorithms;
|
|
/*! is this a hardware provider? */
|
|
Boolean bHardware;
|
|
};
|
|
|
|
typedef struct APProviderInfoStruct APProviderInfoType, *APProviderInfoPtr;
|
|
|
|
/** @struct APProviderContextStruct
|
|
* Provider specific information
|
|
*/
|
|
struct APProviderContextStruct {
|
|
/*! the provider handling this operation */
|
|
UInt32 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 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 length;
|
|
/*! e.g. 7 for DES */
|
|
UInt32 actualLength;
|
|
/*! is this key exportable? - 0 false, 1 true */
|
|
UInt16 exportable;
|
|
/*! is this key permanent */
|
|
UInt16 ephemeral;
|
|
};
|
|
|
|
typedef struct APKeyInfoStruct APKeyInfoType, *APKeyInfoPtr;
|
|
|
|
/** @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 *iv;
|
|
/*! sizeof initialization vector */
|
|
UInt32 ivLength;
|
|
/*! provider specific algorithm parameters */
|
|
void *algorithmParams;
|
|
};
|
|
|
|
typedef struct APCipherInfoStruct APCipherInfoType, *APCipherInfoPtr;
|
|
|
|
/** @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 VerifyResultType, *VerifyResultPtr;
|
|
#endif /* _CPMLIB_COMMON_H */
|