2025-04-27 07:49:33 -04:00

1 line
4.9 KiB
C

// ===========================================================================
// UAMNetwork.c © 1997 Microsoft Corp. All rights reserved.
// ===========================================================================
// Networking functions for use by Microsoft User Authentication Method.
// ===========================================================================
#include <Errors.h>
#include <AppleTalk.h>
#include <String.h>
#include "encrypt.h"
#include "UAMDebug.h"
#include "UAMMain.h"
#include "UAMNetwork.h"
#include "UAMUtils.h"
#include "UAMDialogs.h"
short gSessionRefNum;
MSUAMLoginReplyBlock gMSUAMReply;
extern Str32 gAFPVersion;
// ---------------------------------------------------------------------------
// ¥ UAM_GetSupportedUAMS()
// ---------------------------------------------------------------------------
// Returns a bitmap containing the UAMs supported on the server.
//
// -> inReplyInfo Pointer to reply info supplied by ASPGetStatus() call.
// <- outSupportedUAMS Bitmap containing supported UAMs:
// - Clear Text Password (Apple)
// - Guest (Apple and MS)
// - Microsoft V1.0
//
// As per Inside AppleTalk p.13-96, the supported UAM string variable list structure:
//
// |-------------------|
// | Count of UAMs |
// |-------------------|
// | |
// ¥ ¥
// ¥ UAM Strings ¥
// ¥ ¥
// | |
// |-------------------|
void UAM_GetSupportedUAMS(ServerInfoReplyBlockP inReplyInfo, long *ioSupported)
{
char *theString;
register short theIndex;
register short theUAMCount;
Assert_(inReplyInfo != NULL);
Assert_(ioSupported != NULL);
theString = ((char *)inReplyInfo) + inReplyInfo->supportedUAMOffset;
theUAMCount = *theString;
//
//The first byte is the UAM count, so we must increment past it.
//
++theString;
//
//Initialize the return struct to all false.
//
*ioSupported = 0L;
for (theIndex = theUAMCount; theIndex > 0; theIndex--, theString += theString[0] + 1)
{
if (EqualString(PSTR_ClearTextLogin, (StringPtr)theString, false, false))
{
*ioSupported |= kClearTxtSupported;
continue;
}
if (EqualString(PSTR_GuestLogin, (StringPtr)theString, false, false))
{
*ioSupported |= kGuestSupported;
continue;
}
if (EqualString(PSTR_EncryptedLogin1_0, (StringPtr)theString, false, false))
{
*ioSupported |= kMSUAMSupported;
continue;
}
if (EqualString(PSTR_EncryptedLogin2_0, (StringPtr)theString, false, false))
{
*ioSupported |= kMSUAM_V2_Supported;
continue;
}
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_MapCharactersIntoHostSet()
// ---------------------------------------------------------------------------
// Given a counted string, and a "host mapping table", do an in-place conversion
// of that string into the host character set. The table is construed to be
// of length 255 - StartingExtendedCharValue chars long, and a character for
// character conversion will be indicated for any chars in targetStr which
// are equal to or in excess of StartingExtendedCharValue.
Boolean UAM_MapCharactersIntoHostSet(char *szTarg, char *mappingTbl)
{
unsigned char c;
while (*szTarg)
{
if ((unsigned char)*szTarg >= (unsigned char)kStartingExtendedCharValue)
{
c = *(mappingTbl+ (unsigned char)*szTarg - kStartingExtendedCharValue);
if (c == kIllegalMappedExtChar) {
DbgPrint_((DBGBUFF, "Illegal mapping character"));
return(false);
}
else {
*szTarg = c;
}
}
szTarg++;
}
return(true);
}
// ---------------------------------------------------------------------------
// ¥ UAM_CryptEncrypt()
// ---------------------------------------------------------------------------
// Call on methods in Encrypt.c to encrypt the password.
void UAM_CryptEncrypt(char *inClearPassword, char *inServerChallenge, char *outEncryptPW)
{
unsigned char theCP[22];
if (SetupUAMEncrypt())
{
OneWayFunction((unsigned char *)inClearPassword, theCP, UAM_CLRTXTPWDLEN);
Encrypt((unsigned char *)inServerChallenge, theCP, (unsigned char *)outEncryptPW);
CleanupUAMEncrypt();
}
}
// ---------------------------------------------------------------------------
// ¥ UAM_DoublePasswordEncrypt()
// ---------------------------------------------------------------------------
// Taken from the NT RtlXXX sources, this algorithm is designed to deal with the encryption
// of two passwords, when the OneWayFunction of one is known on the target. Specifically,
//
// for passwords x, y
// -- do a one way encryption of x to Owf(x) -> result(0..15)
// -- do a one way encryption of y to Owf(x) -> result(16..31)
void UAM_DoublePasswordEncrypt(char *inCPPassword, char *inCPKeyPass, char *outDest)
{
if (SetupUAMEncrypt())
{
OneWayFunction((unsigned char *)inCPPassword, (unsigned char *)outDest, UAM_CLRTXTPWDLEN);
OneWayFunction((unsigned char *)inCPKeyPass, (unsigned char *)(outDest + kOneWayEncryptedArgSize), UAM_CLRTXTPWDLEN);
CleanupUAMEncrypt();
}
}