271 lines
7.4 KiB
C
271 lines
7.4 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1997 - 1999
|
||
|
//
|
||
|
// File: pfxcmn.h
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _PFXCMN_H_
|
||
|
#define _PFXCMN_H_
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
|
||
|
typedef DWORD PFXERR;
|
||
|
typedef HANDLE HPFXITEM;
|
||
|
typedef HANDLE HPFX;
|
||
|
typedef LPSTR OID;
|
||
|
|
||
|
#define PFXAPI __stdcall
|
||
|
|
||
|
// define allocators
|
||
|
#define SSAlloc(__x__) LocalAlloc(LMEM_FIXED, __x__)
|
||
|
#define SSFree(__x__) LocalFree(__x__)
|
||
|
#define SSReAlloc(__x__, __y__) LocalReAlloc(__x__, __y__, LMEM_MOVEABLE)
|
||
|
|
||
|
|
||
|
// PFXExportCertStoreEx -> PFXExportCertStore internal param
|
||
|
#define PKCS12_ENHANCED_STRENGTH_ENCODING 0xffff0008
|
||
|
|
||
|
#define PKCS12_ENCR_PWD_ITERATIONS 2000
|
||
|
#define PKCS12_MAC_PWD_ITERATIONS 2000
|
||
|
|
||
|
|
||
|
#define MAKEZERO(arg) ZeroMemory( &arg, sizeof(arg))
|
||
|
|
||
|
// count the number of bytes needed to fully store a WSZ
|
||
|
#define WSZ_BYTECOUNT(__z__) \
|
||
|
( (__z__ == NULL) ? 0 : (wcslen(__z__)+1)*sizeof(WCHAR) )
|
||
|
|
||
|
|
||
|
typedef struct _PFX_INFO {
|
||
|
|
||
|
#define NSCP_BLOB 1
|
||
|
#define PFX_BLOB 2
|
||
|
DWORD dwBlobType; // NSCP, PFX?
|
||
|
|
||
|
LPWSTR szPassword;
|
||
|
|
||
|
DWORD dwPrivacyMode;
|
||
|
DWORD dwIntegrityMode;
|
||
|
DWORD dwTransportMode;
|
||
|
|
||
|
CRYPT_ALGORITHM_IDENTIFIER aiKeyShroudingEncryptionAlgid;
|
||
|
CRYPT_ALGORITHM_IDENTIFIER aiSafePDUEncryptionAlgid;
|
||
|
|
||
|
|
||
|
void** rgSecrets; // SafeBag* [] -- array of safebag*'s
|
||
|
DWORD cSecrets;
|
||
|
|
||
|
void** rgCertcrls; // SafeBag* [] -- array of safebag*'s
|
||
|
DWORD cCertcrls;
|
||
|
|
||
|
void** rgKeys; // SafeBag* [] -- array of safebag*'s
|
||
|
DWORD cKeys;
|
||
|
|
||
|
void** rgShroudedKeys; // SafeBag* [] -- array of safebag*'s
|
||
|
DWORD cShroudedKeys;
|
||
|
|
||
|
} PFX_INFO, *PPFX_INFO;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------------
|
||
|
// begin nscp.cpp entry points
|
||
|
// -------------------------------------------------------------------------
|
||
|
BOOL InitNSCP();
|
||
|
BOOL TerminateNSCP();
|
||
|
|
||
|
////////////////////
|
||
|
// import pb, cb, return HPFX
|
||
|
BOOL
|
||
|
PFXAPI
|
||
|
NSCPImportBlob
|
||
|
(
|
||
|
LPCWSTR szPassword,
|
||
|
PBYTE pbIn,
|
||
|
DWORD cbIn,
|
||
|
SAFE_CONTENTS **ppSafeContents
|
||
|
);
|
||
|
|
||
|
// -------------------------------------------------------------------------
|
||
|
// end nscp.cpp entry points
|
||
|
// -------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
|
||
|
// -------------------------------------------------------------------------
|
||
|
// begin PFX.cpp entry points
|
||
|
// -------------------------------------------------------------------------
|
||
|
BOOL InitPFX();
|
||
|
BOOL TerminatePFX();
|
||
|
|
||
|
////////////////////
|
||
|
// returns HPFX, prepares PFX export
|
||
|
HPFX
|
||
|
PFXAPI
|
||
|
PfxExportCreate (
|
||
|
LPCWSTR szPassword
|
||
|
);
|
||
|
|
||
|
|
||
|
////////////////////
|
||
|
// Do header wrap of specified HPFX
|
||
|
BOOL
|
||
|
PFXAPI
|
||
|
PfxExportBlob
|
||
|
(
|
||
|
HPFX hpfx,
|
||
|
PBYTE pbOut,
|
||
|
DWORD* pcbOut,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
////////////////////
|
||
|
// Unwrap pb cb, return handle to new HPFX
|
||
|
HPFX
|
||
|
PFXAPI
|
||
|
PfxImportBlob
|
||
|
(
|
||
|
LPCWSTR szPassword,
|
||
|
PBYTE pbIn,
|
||
|
DWORD cbIn,
|
||
|
DWORD dwFlags
|
||
|
);
|
||
|
|
||
|
////////////////////
|
||
|
// Free all resources associated with the hpfx
|
||
|
BOOL
|
||
|
PFXAPI
|
||
|
PfxCloseHandle(
|
||
|
IN HPFX hpfx
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// functions for checking if somethings is a pfx blob
|
||
|
//
|
||
|
BOOL
|
||
|
PFXAPI
|
||
|
IsRealPFXBlob
|
||
|
(
|
||
|
CRYPT_DATA_BLOB* pPFX
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PFXAPI
|
||
|
IsNetscapePFXBlob
|
||
|
(
|
||
|
CRYPT_DATA_BLOB* pPFX
|
||
|
);
|
||
|
|
||
|
// -------------------------------------------------------------------------
|
||
|
// end PFX.cpp entry points
|
||
|
// -------------------------------------------------------------------------
|
||
|
|
||
|
// new entry points for loading up the HPFX
|
||
|
BOOL PfxGetKeysAndCerts(
|
||
|
HPFX hPfx,
|
||
|
SAFE_CONTENTS* pContents
|
||
|
);
|
||
|
|
||
|
BOOL PfxAddSafeBags(
|
||
|
HPFX hPfx,
|
||
|
SAFE_BAG* pSafeBags,
|
||
|
DWORD cSafeBags
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
MakeEncodedCertBag(
|
||
|
BYTE *pbEncodedCert,
|
||
|
DWORD cbEncodedCert,
|
||
|
BYTE *pbEncodedCertBag,
|
||
|
DWORD *pcbEncodedCertBag
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
GetEncodedCertFromEncodedCertBag(
|
||
|
BYTE *pbEncodedCertBag,
|
||
|
DWORD cbEncodedCertBag,
|
||
|
BYTE *pbEncodedCert,
|
||
|
DWORD *pcbEncodedCert
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
SetSaltAndIterationCount(
|
||
|
BYTE **ppbParameters,
|
||
|
DWORD *pcbParameters,
|
||
|
BYTE *pbSalt,
|
||
|
DWORD cbSalt,
|
||
|
int iIterationCount
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
GetSaltAndIterationCount(
|
||
|
BYTE *pbParameters,
|
||
|
DWORD cbParameters,
|
||
|
BYTE **ppbSalt,
|
||
|
DWORD *pcbSalt,
|
||
|
int *piIterationCount
|
||
|
);
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////
|
||
|
// The real PKCS #12 Object Identifiers
|
||
|
#define szOID_PKCS_12_PbeIds szOID_PKCS_12 ".1"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And128BitRC4 szOID_PKCS_12_PbeIds ".1"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And40BitRC4 szOID_PKCS_12_PbeIds ".2"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And3KeyTripleDES szOID_PKCS_12_PbeIds ".3"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And2KeyTripleDES szOID_PKCS_12_PbeIds ".4"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And128BitRC2 szOID_PKCS_12_PbeIds ".5"
|
||
|
#define szOID_PKCS_12_pbeWithSHA1And40BitRC2 szOID_PKCS_12_PbeIds ".6"
|
||
|
|
||
|
#define szOID_PKCS_12_EnvelopingIds OLD_szOID_PKCS_12_OIDs ".2"
|
||
|
#define szOID_PKCS_12_rsaEncryptionWith128BitRC4 OLD_szOID_PKCS_12_EnvelopingIds ".1"
|
||
|
#define szOID_PKCS_12_rsaEncryptionWith40BitRC4 OLD_szOID_PKCS_12_EnvelopingIds ".2"
|
||
|
#define szOID_PKCS_12_rsaEncryptionWithTripleDES OLD_szOID_PKCS_12_EnvelopingIds ".3"
|
||
|
|
||
|
#define szOID_PKCS_12_SignatureIds OLD_szOID_PKCS_12_OIDs ".3"
|
||
|
#define szOID_PKCS_12_rsaSignatureWithSHA1Digest OLD_szOID_PKCS_12_SignatureIds ".1"
|
||
|
|
||
|
|
||
|
|
||
|
#define szOID_PKCS_12_PkekIDs szOID_PKCS_12 ".6" // 1.2.840.113549.1.12.6
|
||
|
#define szOID_PKCS_12_UserCertPkekId szOID_PKCS_12_PkekIDs ".1" // 1.2.840.113549.1.12.6.1
|
||
|
#define szOID_PKCS_12_CACertPkekId szOID_PKCS_12_PkekIDs ".2" // 1.2.840.113549.1.12.6.2
|
||
|
#define szOID_PKCS_12_SelfSignedPkekId szOID_PKCS_12_PkekIDs ".3" // 1.2.840.113549.1.12.6.3
|
||
|
|
||
|
#define szOID_PKCS_12_Version1 szOID_PKCS_12 ".10"
|
||
|
#define szOID_PKCS_12_BagIDs szOID_PKCS_12_Version1 ".1"
|
||
|
#define szOID_PKCS_12_KeyBag szOID_PKCS_12_BagIDs ".1"
|
||
|
#define szOID_PKCS_12_ShroudedKeyBag szOID_PKCS_12_BagIDs ".2"
|
||
|
#define szOID_PKCS_12_CertBag szOID_PKCS_12_BagIDs ".3"
|
||
|
#define szOID_PKCS_12_CRLBag szOID_PKCS_12_BagIDs ".4"
|
||
|
#define szOID_PKCS_12_SecretBag szOID_PKCS_12_BagIDs ".5"
|
||
|
#define szOID_PKCS_12_SafeContentsBag szOID_PKCS_12_BagIDs ".6"
|
||
|
|
||
|
|
||
|
// new oids 6/30/97
|
||
|
#define szOID_PKCS_12_FriendlyName szOID_PKCS_9 ".20"
|
||
|
#define szOID_PKCS_12_LocalKeyID szOID_PKCS_9 ".21"
|
||
|
#define szOID_PKCS_12_CertTypes szOID_PKCS_9 ".22"
|
||
|
#define szOID_PKCS_12_CRLTypes szOID_PKCS_9 ".23"
|
||
|
#define szOID_PKCS_12_x509Cert szOID_PKCS_12_CertTypes ".1"
|
||
|
#define szOID_PKCS_12_SDSICert szOID_PKCS_12_CertTypes ".2"
|
||
|
#define szOID_PKCS_12_x509CRL szOID_PKCS_12_CRLTypes ".1"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
} // extern "C"
|
||
|
#endif
|
||
|
|
||
|
#endif // _PFXCMN_H_
|