/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) 1989 Microsoft Corporation Module Name: crypto.h Abstract: This module contains the public data structures and API definitions needed to utilize the encryption library Author: David Chalmers (Davidc) 21-October-1991 Revision History: --*/ #ifndef _NTCRYPT_ #define _NTCRYPT_ //#include "UAMUtils.h" ///////////////////////////////////////////////////////////////////////// // // // Core encryption types // // // ///////////////////////////////////////////////////////////////////////// #define CLEAR_BLOCK_LENGTH 8 typedef struct _CLEAR_BLOCK { char data[CLEAR_BLOCK_LENGTH]; } CLEAR_BLOCK; typedef CLEAR_BLOCK * PCLEAR_BLOCK; #define CYPHER_BLOCK_LENGTH 8 typedef struct _CYPHER_BLOCK { char data[CYPHER_BLOCK_LENGTH]; } CYPHER_BLOCK; typedef CYPHER_BLOCK * PCYPHER_BLOCK; #define BLOCK_KEY_LENGTH 7 typedef struct _BLOCK_KEY { char data[BLOCK_KEY_LENGTH]; } BLOCK_KEY; typedef BLOCK_KEY * PBLOCK_KEY; ///////////////////////////////////////////////////////////////////////// // // // Arbitrary length data encryption types // // // ///////////////////////////////////////////////////////////////////////// typedef struct _CRYPT_BUFFER { DWORD Length; // Number of valid bytes in buffer DWORD MaximumLength; // Number of bytes pointed to by Buffer PVOID Buffer; } CRYPT_BUFFER; typedef CRYPT_BUFFER * PCRYPT_BUFFER; typedef CRYPT_BUFFER CLEAR_DATA; typedef CLEAR_DATA * PCLEAR_DATA; typedef CRYPT_BUFFER DATA_KEY; typedef DATA_KEY * PDATA_KEY; typedef CRYPT_BUFFER CYPHER_DATA; typedef CYPHER_DATA * PCYPHER_DATA; ///////////////////////////////////////////////////////////////////////// // // // Lan Manager data types // // // ///////////////////////////////////////////////////////////////////////// // // Define a LanManager compatible password // // A LanManager password is a null-terminated ansi string consisting of a // maximum of 14 characters (not including terminator) // typedef char * PLM_PASSWORD; // // Define the result of the 'One Way Function' (OWF) on a LM password // #define LM_OWF_PASSWORD_LENGTH (CYPHER_BLOCK_LENGTH * 2) typedef struct _LM_OWF_PASSWORD { CYPHER_BLOCK data[2]; } LM_OWF_PASSWORD; typedef LM_OWF_PASSWORD * PLM_OWF_PASSWORD; // // Define the challenge sent by the Lanman server during logon // #define LM_CHALLENGE_LENGTH CLEAR_BLOCK_LENGTH typedef CLEAR_BLOCK LM_CHALLENGE; typedef LM_CHALLENGE * PLM_CHALLENGE; // // Define the response sent by redirector in response to challenge from server // #define LM_RESPONSE_LENGTH (CYPHER_BLOCK_LENGTH * 3) typedef struct _LM_RESPONSE { CYPHER_BLOCK data[3]; } LM_RESPONSE; typedef LM_RESPONSE * PLM_RESPONSE; // // Define the result of the reversible encryption of an OWF'ed password. // #define ENCRYPTED_LM_OWF_PASSWORD_LENGTH (CYPHER_BLOCK_LENGTH * 2) typedef struct _ENCRYPTED_LM_OWF_PASSWORD { CYPHER_BLOCK data[2]; } ENCRYPTED_LM_OWF_PASSWORD; typedef ENCRYPTED_LM_OWF_PASSWORD * PENCRYPTED_LM_OWF_PASSWORD; // // Define the session key maintained by the redirector and server // #define LM_SESSION_KEY_LENGTH LM_CHALLENGE_LENGTH typedef LM_CHALLENGE LM_SESSION_KEY; typedef LM_SESSION_KEY * PLM_SESSION_KEY; // // Define the index type used to encrypt OWF Passwords // typedef DWORD CRYPT_INDEX; typedef CRYPT_INDEX * PCRYPT_INDEX; ///////////////////////////////////////////////////////////////////////// // // // 'NT' encryption types that are used to duplicate existing LM // // functionality with improved algorithms. // // // ///////////////////////////////////////////////////////////////////////// #define NT_OWF_PASSWORD_LENGTH LM_OWF_PASSWORD_LENGTH typedef LM_OWF_PASSWORD NT_OWF_PASSWORD; typedef NT_OWF_PASSWORD * PNT_OWF_PASSWORD; #define NT_CHALLENGE_LENGTH LM_CHALLENGE_LENGTH typedef LM_CHALLENGE NT_CHALLENGE; typedef NT_CHALLENGE * PNT_CHALLENGE; #define NT_RESPONSE_LENGTH LM_RESPONSE_LENGTH typedef LM_RESPONSE NT_RESPONSE; typedef NT_RESPONSE * PNT_RESPONSE; #define ENCRYPTED_NT_OWF_PASSWORD_LENGTH ENCRYPTED_LM_OWF_PASSWORD_LENGTH typedef ENCRYPTED_LM_OWF_PASSWORD ENCRYPTED_NT_OWF_PASSWORD; typedef ENCRYPTED_NT_OWF_PASSWORD * PENCRYPTED_NT_OWF_PASSWORD; #define NT_SESSION_KEY_LENGTH LM_SESSION_KEY_LENGTH typedef LM_SESSION_KEY NT_SESSION_KEY; typedef NT_SESSION_KEY * PNT_SESSION_KEY; ///////////////////////////////////////////////////////////////////////// // // // 'NT' encryption types for new functionality not present in LM // // // ///////////////////////////////////////////////////////////////////////// // // The user session key is similar to the LM and NT session key except it // is different for each user on the system. This allows it to be used // for secure user communication with a server. // #define USER_SESSION_KEY_LENGTH (CYPHER_BLOCK_LENGTH * 2) typedef struct _USER_SESSION_KEY { CYPHER_BLOCK data[2]; } USER_SESSION_KEY; typedef USER_SESSION_KEY * PUSER_SESSION_KEY; //////////////////////////////////////////////////////////////////////////// // // // Encryption library API macros // // // // To conceal the purpose of these functions to someone dumping out the // // encryption dll they have been purposefully given unhelpful names. // // Each has an associated macro that should be used by system components // // to access these routines in a readable way. // // // //////////////////////////////////////////////////////////////////////////// #define RtlEncryptBlock SystemFunction001 #define RtlDecryptBlock SystemFunction002 #define RtlEncryptStdBlock SystemFunction003 #define RtlEncryptData SystemFunction004 #define RtlDecryptData SystemFunction005 #define RtlCalculateLmOwfPassword SystemFunction006 #define RtlCalculateNtOwfPassword SystemFunction007 #define RtlCalculateLmResponse SystemFunction008 #define RtlCalculateNtResponse SystemFunction009 #define RtlCalculateUserSessionKeyLm SystemFunction010 #define RtlCalculateUserSessionKeyNt SystemFunction011 #define RtlEncryptLmOwfPwdWithLmOwfPwd SystemFunction012 #define RtlDecryptLmOwfPwdWithLmOwfPwd SystemFunction013 #define RtlEncryptNtOwfPwdWithNtOwfPwd SystemFunction014 #define RtlDecryptNtOwfPwdWithNtOwfPwd SystemFunction015 #define RtlEncryptLmOwfPwdWithLmSesKey SystemFunction016 #define RtlDecryptLmOwfPwdWithLmSesKey SystemFunction017 #define RtlEncryptNtOwfPwdWithNtSesKey SystemFunction018 #define RtlDecryptNtOwfPwdWithNtSesKey SystemFunction019 #define RtlEncryptLmOwfPwdWithUserKey SystemFunction020 #define RtlDecryptLmOwfPwdWithUserKey SystemFunction021 #define RtlEncryptNtOwfPwdWithUserKey SystemFunction022 #define RtlDecryptNtOwfPwdWithUserKey SystemFunction023 #define RtlEncryptLmOwfPwdWithIndex SystemFunction024 #define RtlDecryptLmOwfPwdWithIndex SystemFunction025 #define RtlEncryptNtOwfPwdWithIndex SystemFunction026 #define RtlDecryptNtOwfPwdWithIndex SystemFunction027 #define RtlGetUserSessionKeyClient SystemFunction028 #define RtlGetUserSessionKeyServer SystemFunction029 #define RtlEqualLmOwfPassword SystemFunction030 #define RtlEqualNtOwfPassword SystemFunction031 #define RtlEncryptData2 SystemFunction032 #define RtlDecryptData2 SystemFunction033 //////////////////////////////////////////////////////////////////////////// // // // Encryption library API function prototypes // // // //////////////////////////////////////////////////////////////////////////// #endif // _NTCRYPT_