|
|
/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
ScLogon
Abstract:
This header defines APIs for use by GINA and LSA during WinLogon via a smart card
Author:
Amanda Matlosz (amatlosz) 10/23/1997
Environment:
Win32
Revision History:
Notes:
--*/
#ifndef __SCLOGON_H__
#define __SCLOGON_H__
#ifdef __cplusplus
extern "C" { #endif
/////////////////////////////////////////////////////////////////////////////
//
// defines
#ifndef NT_INCLUDED
typedef LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS;
typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; #endif
//////////////////////////////////////////////////////////////////////////////
//
// Structs
// this entire struct is opaque, and is used by the helper APIs to contain
// information about the card currently in use
struct LogonInfo { DWORD dwLogonInfoLen; PVOID ContextInformation; ULONG nCardNameOffset; ULONG nReaderNameOffset; ULONG nContainerNameOffset; ULONG nCSPNameOffset;
// LogonInfo may include further information, like:
// crypt context, useful handles, pid...
TCHAR bBuffer[sizeof(DWORD)]; // expandable place for strings
};
typedef struct _ScHelper_RandomCredBits { BYTE bR1[32]; // TBD: is 32 appropriate?
BYTE bR2[32]; } ScHelper_RandomCredBits;
//////////////////////////////////////////////////////////////////////////////
//
// Functions
//
// helpers to access to items in opaque LogonInfo, such as:
LPCTSTR WINAPI GetReaderName(PBYTE pbLogonInfo); LPCTSTR WINAPI GetCardName(PBYTE pbLogonInfo); LPCTSTR WINAPI GetContainerName(PBYTE pbLogonInfo); LPCTSTR WINAPI GetCSPName(PBYTE pbLogonInfo);
// Helper for error translations
NTSTATUS ScNtStatusTranslation(NTSTATUS NtErr, DWORD *pdwErr);
//
// Calls used by GINA to construct the blob that kerberos
// and sclogon share.
//
PBYTE WINAPI ScBuildLogonInfo( LPCTSTR szCard, LPCTSTR szReader, LPCTSTR szContainer, LPCTSTR szCSP);
//
// Calls used by LSA
//
NTSTATUS WINAPI ScHelperInitializeContext( IN OUT PBYTE pbLogonInfo, IN ULONG cbLogonInfo );
VOID WINAPI ScHelperRelease( IN PBYTE ppbLogonInfo );
NTSTATUS WINAPI ScHelperGetProvParam( IN PUNICODE_STRING pucPIN, IN PBYTE pbLogonInfo, IN HCRYPTPROV hProv, DWORD dwParam, BYTE*pbData, DWORD *pdwDataLen, DWORD dwFlags );
// ScHelperGetCertFromLogonInfo may need the PIN to get a cert off certain SCs
NTSTATUS WINAPI ScHelperGetCertFromLogonInfo( IN PBYTE pbLogonInfo, IN PUNICODE_STRING pucPIN, OUT PCCERT_CONTEXT * CertificateContext );
// ScHelperVerifyCard uses SignMessage() and VerifyMessage() to verify the
// card's integrity (that it has the keys it says it has)
NTSTATUS WINAPI ScHelperVerifyCard( IN PUNICODE_STRING pucPIN, IN PCCERT_CONTEXT CertificateContext, IN HCERTSTORE hCertStore, IN PBYTE pbLogonInfo );
// ScHelper*Cred* functions provide for a more secure offline experience
NTSTATUS WINAPI ScHelperGenRandBits ( IN PBYTE pbLogonInfo, IN ScHelper_RandomCredBits* psc_rcb );
NTSTATUS WINAPI ScHelperCreateCredKeys ( IN PUNICODE_STRING pucPIN, IN PBYTE pbLogonInfo, IN ScHelper_RandomCredBits* psc_rcb, IN OUT HCRYPTKEY* phHmacKey, IN OUT HCRYPTKEY* phRc4Key, IN OUT HCRYPTPROV* phProv );
NTSTATUS WINAPI ScHelperCreateCredHMAC ( IN HCRYPTPROV hProv, IN HCRYPTKEY hHmacKey, IN PBYTE CleartextData, IN ULONG CleartextDataSize, IN OUT PBYTE* ppbHmac, IN OUT DWORD* pdwHmacLen );
NTSTATUS WINAPI ScHelperVerifyCardAndCreds( IN PUNICODE_STRING pucPIN, IN PCCERT_CONTEXT CertificateContext, IN HCERTSTORE hCertStore, IN PBYTE pbLogonInfo, IN PBYTE SignedEncryptedData, IN ULONG SignedEncryptedDataSize, OUT OPTIONAL PBYTE CleartextData, OUT PULONG CleartextDataSize );
NTSTATUS WINAPI ScHelperEncryptCredentials( IN PUNICODE_STRING pucPIN, IN PCCERT_CONTEXT CertificateContext, IN HCERTSTORE hCertStore, IN ScHelper_RandomCredBits* psch_rcb, IN PBYTE pbLogonInfo, IN PBYTE CleartextData, IN ULONG CleartextDataSize, OUT OPTIONAL PBYTE EncryptedData, OUT PULONG EncryptedDataSize );
NTSTATUS WINAPI ScHelperDecryptCredentials( IN PUNICODE_STRING pucPIN, IN PCCERT_CONTEXT CertificateContext, IN HCERTSTORE hCertStore, IN PBYTE pbLogonInfo, IN PBYTE EncryptedData, IN ULONG EncryptedDataSize, OUT OPTIONAL PBYTE CleartextData, OUT PULONG CleartextDataSize );
//
// The following two functions may be called in any order, and return a basic
// "success" or "failure"
//
// ScHelperSignMessage() needs the logoninfo and PIN in order to find the card
// that will do the signing...
//
NTSTATUS WINAPI ScHelperSignMessage( IN PUNICODE_STRING pucPIN, IN PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN ULONG Algorithm, IN PBYTE Buffer, IN ULONG BufferLength, OUT PBYTE Signature, OUT PULONG SignatureLength );
NTSTATUS WINAPI ScHelperSignPkcsMessage( IN OPTIONAL PUNICODE_STRING pucPIN, IN OPTIONAL PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN PCCERT_CONTEXT Certificate, IN PCRYPT_ALGORITHM_IDENTIFIER Algorithm, IN OPTIONAL DWORD dwSignMessageFlags, IN PBYTE Buffer, IN ULONG BufferLength, OUT OPTIONAL PBYTE SignedBuffer, OUT OPTIONAL PULONG SignedBufferLength );
//
// ScHelperVerifyMessage() returns STATUS_SUCCESS if the signature provided is
// the hash of the buffer encrypted by the owner of the cert.
//
NTSTATUS WINAPI ScHelperVerifyMessage( IN OPTIONAL PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN PCCERT_CONTEXT CertificateContext, IN ULONG Algorithm, IN PBYTE Buffer, IN ULONG BufferLength, IN PBYTE Signature, IN ULONG SignatureLength );
NTSTATUS WINAPI ScHelperVerifyPkcsMessage( IN OPTIONAL PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN PBYTE Buffer, IN ULONG BufferLength, OUT OPTIONAL PBYTE DecodedBuffer, OUT OPTIONAL PULONG DecodedBufferLength, OUT OPTIONAL PCCERT_CONTEXT * CertificateContext );
//
// ScHelperEncryptMessage and ScHelperDecryptMessage
// encrypt and decrypt buffer/cipher text using PKCS7 crypto stuff.
//
NTSTATUS WINAPI ScHelperEncryptMessage( IN OPTIONAL PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN PCCERT_CONTEXT CertificateContext, IN PCRYPT_ALGORITHM_IDENTIFIER Algorithm, IN PBYTE Buffer, // The data to encrypt
IN ULONG BufferLength, // The length of that data
OUT PBYTE CipherText, // Receives the formatted CipherText
IN PULONG pCipherLength // Supplies size of CipherText buffer
); // Receives length of actual CipherText
NTSTATUS WINAPI ScHelperDecryptMessage( IN PUNICODE_STRING pucPIN, IN OPTIONAL PBYTE pbLogonInfo, IN OPTIONAL HCRYPTPROV Provider, IN PCCERT_CONTEXT CertificateContext, IN PBYTE CipherText, // Supplies formatted CipherText
IN ULONG CipherLength, // Supplies the length of the CiperText
OUT PBYTE ClearText, // Receives decrypted message
IN OUT PULONG pClearLength // Supplies length of buffer, receives actual length
);
/////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
} #endif
#endif // __SCLOGON_H__
|