windows-nt/Source/XPSP1/NT/ds/security/inc/spc.h

344 lines
14 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: spc.h
//
// Contents: Software Publishing Certificate (SPC) Prototypes and Definitions
//
// Defines a set of Win32 APIs specific to software publishing
// for encoding and decoding X.509 v3 certificate extensions and
// PKCS #7 signed message content and authenticated attributes.
// Defines a PKCS #10 attribute containing X509 v3 extensions.
//
// Defines a set of Win32 APIs for signing and verifying files
// used in software publishing. The APIs have file processing
// callbacks to accommodate any type of file. Direct support is
// provided for: Portable Executable (PE) image, Java class,
// structured storage and raw files.
//
// APIs:
// SpcGetSignedDataIndirect
// SpcWriteSpcFile
// SpcReadSpcFile
// SpcWriteSpcToMemory
// SpcReadSpcFromMemory
// SpcSignPeImageFile
// SpcVerifyPeImageFile
// SpcSignJavaClassFile
// SpcVerifyJavaClassFile
// SpcSignStructuredStorageFile
// SpcVerifyStructuredStorageFile
// SpcSignRawFile
// SpcVerifyRawFile
// SpcSignCabFile
// SpcVerifyCabFile
// SpcSignFile
// SpcVerifyFile
//
// History: 15-Apr-96 philh created
//--------------------------------------------------------------------------
#ifndef __SPC_H__
#define __SPC_H__
#include "wincrypt.h"
#ifdef __cplusplus
extern "C" {
#endif
//+-------------------------------------------------------------------------
// SPC_SP_AGENCY_INFO_OBJID
//
// All the fields in the Image and Info structures are optional. When
// omitted, a pointer is NULL or a blob's cbData is 0.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// SPC_MINIMAL_CRITERIA_OBJID
//
// Type of BOOL. Its set to TRUE if publisher meets minimal criteria.
//--------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// SPC_FINANCIAL_CRITERIA_OBJID
//--------------------------------------------------------------------------
//+=========================================================================
//
// SPC PKCS #7 Signed Message Content
//
//-=========================================================================
//+-------------------------------------------------------------------------
// SPC PKCS #7 IndirectData ContentType Object Identifier
//--------------------------------------------------------------------------
//+=========================================================================
//
// SPC Sign and Verify File APIs and Type Definitions
//
// Following file types are directly supported:
// Portable Executable (PE) Image
// Java Class
// Structured Storage
// Raw (signed data is stored outside of the file)
//
//-=========================================================================
//+-------------------------------------------------------------------------
// Callback to get and verify the software publisher's certificate.
//
// Passed the CertId of the signer (its Issuer and SerialNumber), a
// handle to a cert store containing certs and CRLs copied from
// the signed message, the indirect data content attribute extracted from
// the signed data's indirect content,
// flag indicating if computed digest of the file matched the digest in the
// signed data's indirect content and the signer's authenticated attributes.
//
// If the file's signed data doesn't contain any content or signers, then,
// called with pSignerId, pIndirectDataContentAttr and rgAuthnAttr == NULL.
//
// For a valid signer certificate, returns SPC_VERIFY_SUCCESS and a pointer
// to a read only CERT_CONTEXT. The returned CERT_CONTEXT is either obtained
// from a cert store or was created via CertStoreCreateCert. For either case,
// its freed via CertStoreFreeCert.
//
// If this is the wrong signer or if a certificate wasn't found for the
// signer, returns either
// SPC_VERIFY_CONTINUE to continue on to the next signer or SPC_VERIFY_FAILED
// to terminate the verification process.
//
// The NULL implementation tries to get the Signer certificate from the
// signed data's cert store. It doesn't verify the certificate.
//--------------------------------------------------------------------------
typedef int (WINAPI *PFN_SPC_VERIFY_SIGNER_POLICY)(
IN void *pvVerifyArg,
IN DWORD dwCertEncodingType,
IN OPTIONAL PCERT_INFO pSignerId, // Only the Issuer and
// SerialNumber fields have
// been updated
IN HCERTSTORE hMsgCertStore,
IN OPTIONAL PCRYPT_ATTRIBUTE_TYPE_VALUE pIndirectDataContentAttr,
IN BOOL fDigestResult,
IN DWORD cAuthnAttr,
IN OPTIONAL PCRYPT_ATTRIBUTE rgAuthnAttr,
IN DWORD cUnauthAttr,
IN OPTIONAL PCRYPT_ATTRIBUTE rgUnauthAttr,
IN DWORD cDigest,
IN OPTIONAL PBYTE rgDigest,
OUT PCCERT_CONTEXT *ppSignerCert
);
#define SPC_VERIFY_SUCCESS 0
#define SPC_VERIFY_FAILED -1
#define SPC_VERIFY_CONTINUE 1
//+-------------------------------------------------------------------------
// The SPC_SIGN_PARA are used for signing files used in software publishing.
//
// Either the CERT_KEY_PROV_HANDLE_PROP_ID or CERT_KEY_PROV_INFO_PROP_ID must
// be set for pSigningCert. Either one specifies the private
// signature key to use.
//
// If any certificates and/or CRLs are to be included in the file's signed
// data, then, the MsgCert and MsgCrl fields need to be updated. If the
// rgpSigningCerts are to be included, then, they must also be in the
// rgpMsgCert array.
//
// If any authenticated attributes are to be included, then, the AuthnAttr
// fields must be updated.
//--------------------------------------------------------------------------
typedef struct _SPC_SIGN_PARA {
DWORD dwVersion;
DWORD dwMsgAndCertEncodingType;
PCCERT_CONTEXT pSigningCert;
CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
DWORD cMsgCert;
PCCERT_CONTEXT *rgpMsgCert;
DWORD cMsgCrl;
PCCRL_CONTEXT *rgpMsgCrl;
DWORD cAuthnAttr;
PCRYPT_ATTRIBUTE rgAuthnAttr;
DWORD cUnauthnAttr;
PCRYPT_ATTRIBUTE rgUnauthnAttr;
} SPC_SIGN_PARA, *PSPC_SIGN_PARA;
//+-------------------------------------------------------------------------
// The SCA_VERIFY_PARA are used to verify files signed for software
// publishing.
//
// hCryptProv is used to do digesting and signature verification.
//
// hMsgCertStore is the store to copy certificates and CRLs from the message
// to. If hMsgCertStore is NULL, then, a temporary store is created before
// calling the VerifySignerPolicy callback.
//
// The dwMsgAndCertEncodingType specifies the encoding type of the certificates
// and/or CRLs in the message.
//
// pfnVerifySignerPolicy is called to verify the message signer's certificate.
//--------------------------------------------------------------------------
typedef struct _SPC_VERIFY_PARA {
DWORD dwVersion;
DWORD dwMsgAndCertEncodingType;
HCRYPTPROV hCryptProv;
HCERTSTORE hMsgCertStore; // OPTIONAL
PFN_SPC_VERIFY_SIGNER_POLICY pfnVerifySignerPolicy;
void *pvVerifyArg;
} SPC_VERIFY_PARA, *PSPC_VERIFY_PARA;
//+-------------------------------------------------------------------------
// Sign / Verify Flags
//--------------------------------------------------------------------------
#define SPC_LENGTH_ONLY_FLAG 0x00000001
#define SPC_DISABLE_DIGEST_FILE_FLAG 0x00000002
#define SPC_DISABLE_VERIFY_SIGNATURE_FLAG 0x00000004
#define SPC_ADD_SIGNER_FLAG 0x00000100
#define SPC_GET_SIGNATURE 0x00000200
//+-------------------------------------------------------------------------
// Put any certs/crl's into the store, and verify the SignedData's signature
//--------------------------------------------------------------------------
BOOL
WINAPI
SpcVerifySignedData(
IN PSPC_VERIFY_PARA pVerifyPara,
IN PBYTE pbSignedData,
IN DWORD cbSignedData
);
//+-------------------------------------------------------------------------
// Table of functions called to support the signing and verifying of files
// used in software publishing. The functions read the portions of the
// file to be digested, store the signed data or retrieve the signed data.
//
// pfnOpenSignFile is called with the pvSignFileArg passed to either
// SpcSignFile() or SpcVerifyFile(). It returns a handle to be passed to the
// other functions. pfnCloseSignFile is called to close the hSignFile.
//
// pfnDigestSignFile reads the portions of the file to be digested and
// calls pfnDigestData to do the actual digesting.
//
// pfnSetSignedData stores the PKCS #7 Signed Data in the appropriate place
// in the file. pfnGetSignedData retrieves the PKCS #7 Signed Data from the
// file. pfnGetSignedData returns a pointer to its copy of the signed
// data. Its not freed until pfnCloseSignFile is called.
//--------------------------------------------------------------------------
typedef void *HSPCDIGESTDATA;
typedef BOOL (WINAPI *PFN_SPC_DIGEST_DATA)(
IN HSPCDIGESTDATA hDigestData,
IN const BYTE *pbData,
IN DWORD cbData
);
typedef void *HSPCSIGNFILE;
typedef HSPCSIGNFILE (WINAPI *PFN_SPC_OPEN_SIGN_FILE)(
IN void *pvSignFileArg
);
typedef BOOL (WINAPI *PFN_SPC_CLOSE_SIGN_FILE)(
IN HSPCSIGNFILE hSignFile
);
typedef BOOL (WINAPI *PFN_SPC_DIGEST_SIGN_FILE)(
IN HSPCSIGNFILE hSignFile,
IN DWORD dwMsgAndCertEncodingType,
IN PCRYPT_ATTRIBUTE_TYPE_VALUE pIndirectDataContentAttr,
IN PFN_SPC_DIGEST_DATA pfnDigestData,
IN HSPCDIGESTDATA hDigestData
);
typedef BOOL (WINAPI *PFN_SPC_GET_SIGNED_DATA)(
IN HSPCSIGNFILE hSignFile,
OUT const BYTE **ppbSignedData,
OUT DWORD *pcbSignedData
);
typedef BOOL (WINAPI *PFN_SPC_SET_SIGNED_DATA)(
IN HSPCSIGNFILE hSignFile,
IN const BYTE *pbSignedData,
IN DWORD cbSignedData
);
typedef struct _SPC_SIGN_FILE_FUNC_TABLE {
PFN_SPC_OPEN_SIGN_FILE pfnOpenSignFile;
PFN_SPC_CLOSE_SIGN_FILE pfnCloseSignFile;
PFN_SPC_DIGEST_SIGN_FILE pfnDigestSignFile;
PFN_SPC_GET_SIGNED_DATA pfnGetSignedData;
PFN_SPC_SET_SIGNED_DATA pfnSetSignedData;
} SPC_SIGN_FILE_FUNC_TABLE, *PSPC_SIGN_FILE_FUNC_TABLE;
typedef const SPC_SIGN_FILE_FUNC_TABLE *PCSPC_SIGN_FILE_FUNC_TABLE;
//+-------------------------------------------------------------------------
// Sign any type of file used for software publishing.
//
// The IndirectDataContentAttr indicates the type of file being digested
// and signed. It may have an optional value, such as, a link to the file.
// Its stored with the file's digest algorithm and digest in the
// indirect data content of the signed data.
//
// The SPC_DISABLE_DIGEST_FLAG inhibits the digesting of the file.
// The SPC_LENGTH_ONLY_FLAG implicitly sets the SPC_DISABLE_DIGEST_FLAG_FLAG
// and only calculates a length for the signed data.
//--------------------------------------------------------------------------
BOOL
WINAPI
SpcSignFile(IN PSPC_SIGN_PARA pSignPara,
IN PCSPC_SIGN_FILE_FUNC_TABLE pSignFileFuncTable,
IN void *pvSignFileArg,
IN PCRYPT_ATTRIBUTE_TYPE_VALUE pIndirectDataContentAttr,
IN DWORD dwFlags,
OUT PBYTE* pbEncoding,
OUT DWORD* cbEncoding);
//+-------------------------------------------------------------------------
// Verify any type of file signed for software publishing.
//
// pVerifyPara's pfnVerifySignerPolicy is called to verify the signer's
// certificate.
//
// For a verified signer and file, *ppSignerCert is updated
// with the CertContext of the signer. It must be freed by calling
// CertStoreFreeCert. Otherwise, *ppSignerCert is set to NULL.
// For *pbcbDecoded == 0 on input, *ppSignerCert is always set to
// NULL.
//
// ppSignerCert can be NULL, indicating the caller isn't interested
// in getting the CertContext of the signer.
//
// If specified, the attribute type of the indirect data content in the
// file's signed data is compared with pszDataAttrObjId.
//
// The SPC_DISABLE_DIGEST_FLAG inhibits the digesting of the file.
// The SPC_DISABLE_VERIFY_SIGNATURE_FLAG inhibits the verification of the
// the signed data in the file. The SPC_LENGTH_ONLY_FLAG isn't allowed and
// returns an error.
//--------------------------------------------------------------------------
BOOL
WINAPI
SpcVerifyFile(
IN PSPC_VERIFY_PARA pVerifyPara,
IN PCSPC_SIGN_FILE_FUNC_TABLE pSignFileFuncTable,
IN void *pvSignFileArg,
IN OPTIONAL LPSTR pszDataAttrObjId,
IN DWORD dwFlags,
OUT OPTIONAL PCCERT_CONTEXT *ppSignerCert
);
//+-------------------------------------------------------------------------
// SPC error codes
//--------------------------------------------------------------------------
#include "sgnerror.h"
#ifdef __cplusplus
} // Balance extern "C" above
#endif
#endif