/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    cr.h

Abstract:

    Local Security Authority - Encryption Routine Definitions

    NOTE:  This file is included via lsacomp.h.  It should
           not be included directly.

Author:

    Scott Birrell       (ScottBi)      December 13, 1991

Environment:

Revision History:

--*/

//
// Max encryption Key Length
//

#define LSAP_CR_MAX_CIPHER_KEY_LENGTH   (0x00000010L)

//
// Cipher Key Structure
//

typedef struct _LSAP_CR_CIPHER_KEY {

    ULONG Length;
    ULONG MaximumLength;
    PUCHAR  Buffer;

} LSAP_CR_CIPHER_KEY, *PLSAP_CR_CIPHER_KEY;


//
// Clear value structure
//

typedef struct _LSAP_CR_CLEAR_VALUE {

    ULONG Length;
    ULONG MaximumLength;
    PUCHAR Buffer;

} LSAP_CR_CLEAR_VALUE, *PLSAP_CR_CLEAR_VALUE;

//
// Two-way encrypted value structure in Self-relative form.  This
// is just like a String.
//

typedef struct _LSAP_CR_CIPHER_VALUE {

    ULONG Length;
    ULONG MaximumLength;
    PUCHAR  Buffer;

} LSAP_CR_CIPHER_VALUE, *PLSAP_CR_CIPHER_VALUE;


NTSTATUS
LsapCrClientGetSessionKey(
    IN LSA_HANDLE ObjectHandle,
    OUT PLSAP_CR_CIPHER_KEY *SessionKey
    );

NTSTATUS
LsapCrServerGetSessionKey(
    IN LSA_HANDLE ObjectHandle,
    OUT PLSAP_CR_CIPHER_KEY *SessionKey
    );

NTSTATUS
LsapCrEncryptValue(
    IN PLSAP_CR_CLEAR_VALUE ClearValue,
    IN PLSAP_CR_CIPHER_KEY CipherKey,
    OUT PLSAP_CR_CIPHER_VALUE *CipherValue
    );

NTSTATUS
LsapCrDecryptValue(
    IN PLSAP_CR_CIPHER_VALUE CipherValue,
    IN PLSAP_CR_CIPHER_KEY CipherKey,
    OUT PLSAP_CR_CLEAR_VALUE *ClearValue
    );

VOID
LsapCrFreeMemoryValue(
    IN PVOID MemoryValue
    );

VOID
LsapCrUnicodeToClearValue(
    IN PUNICODE_STRING UnicodeString,
    OUT PLSAP_CR_CLEAR_VALUE ClearValue
    );

VOID
LsapCrClearValueToUnicode(
    IN PLSAP_CR_CLEAR_VALUE ClearValue,
    OUT PUNICODE_STRING UnicodeString
    );

#define LsapCrRtlEncryptData(ClearData, CipherKey, CipherData)            \
    (                                                                     \
        RtlEncryptData(                                                   \
            (PCLEAR_DATA) ClearData,                                      \
            (PDATA_KEY) CipherKey,                                        \
            (PCYPHER_DATA) CipherData                                     \
            )                                                             \
    )


#define LsapCrRtlDecryptData(ClearData, CipherKey, CipherData)            \
    (                                                                     \
        RtlDecryptData(                                                   \
            (PCLEAR_DATA) ClearData,                                      \
            (PDATA_KEY) CipherKey,                                        \
            (PCYPHER_DATA) CipherData                                     \
            )                                                             \
    )