windows-nt/Source/XPSP1/NT/net/tcpip/tpipv6/tcpip6/tcp/tcpmd5.h
2020-09-26 16:20:57 +08:00

86 lines
2.1 KiB
C

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// Copyright (c) 1985-2000 Microsoft Corporation
//
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
// You should have received a copy of the Microsoft End-User License Agreement
// for this software along with this release; see the file "license.txt".
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//
// Abstract:
//
// This file contains the support routines for computing MD5 on TCP invariants.
//
#define MD5_SCRATCH_LENGTH 4
#define MD5_DATA_LENGTH 16
//
// Data structure for MD5 (Message Digest) computation.
//
// MD5_CONTEXT
//
typedef struct _MD5_CONTEXT {
ULONG Scratch[MD5_SCRATCH_LENGTH];
ULONG Data[MD5_DATA_LENGTH];
} MD5_CONTEXT, *PMD5_CONTEXT;
//
// The Length of TCP connection invariants should be a multiple of 4.
//
C_ASSERT(TCP_MD5_DATA_LENGTH % 4 == 0);
FORCEINLINE
VOID
MD5InitializeScratch(
PMD5_CONTEXT Md5Context
)
{
//
// Load the constants as suggested by RFC 1321, Appendix A.3.
//
Md5Context->Scratch[0] = (UINT32)0x67452301;
Md5Context->Scratch[1] = (UINT32)0xefcdab89;
Md5Context->Scratch[2] = (UINT32)0x98badcfe;
Md5Context->Scratch[3] = (UINT32)0x10325476;
}
FORCEINLINE
VOID
MD5InitializeData(
PMD5_CONTEXT Md5Context,
ULONG RandomValue
)
{
ULONG RandomValueIndex = (TCP_MD5_DATA_LENGTH / 4);
//
// The unused part of the Data buffer should be zero.
//
RtlZeroMemory(&Md5Context->Data, sizeof(ULONG) * MD5_DATA_LENGTH);
Md5Context->Data[RandomValueIndex] = RandomValue;
Md5Context->Data[RandomValueIndex + 1] = 0x80;
ASSERT((RandomValueIndex + 1) < (MD5_DATA_LENGTH - 2));
Md5Context->Data[MD5_DATA_LENGTH - 2] =
(TCP_MD5_DATA_LENGTH + sizeof(ULONG)) * 8;
}
//
// This function will be exported as part of MD5.H; until then,
// we will define it as extern.
//
extern
VOID
TransformMD5(ULONG block[4], ULONG buffer[16]);