Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

227 lines
4.7 KiB

//=============================================================================
//
// MODULE: ASN1PaData.cxx
//
// Description:
//
// Implementation of pre-authentication data parsing logic
//
// Modification History
//
// Mark Pustilnik Date: 06/16/02 - created
//
//=============================================================================
#include "ASN1Parser.hxx"
DWORD
ASN1ParserPaData::DisplayCollectedValues(
IN ASN1FRAME * Frame,
IN ULONG Length,
IN ULPBYTE Address
)
{
DWORD dw;
ASN1VALUE * PaDataType;
ASN1VALUE * PaDataValue;
ASN1FRAME FrameHere;
if ( QueryCollectedCount() != 2 )
{
dw = ERROR_INTERNAL_ERROR;
goto Cleanup;
}
//
// First handle the first element - the padata-type
//
PaDataType = QueryCollectedValue( 0 );
if ( PaDataType->ut != utInteger )
{
dw = ERROR_INTERNAL_ERROR;
goto Cleanup;
}
dw = Display(
Frame,
PaDataType,
PROP( PA_DATA_type ),
0
);
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
//
// Now display the padata-value in a type-specific fashion
//
PaDataValue = QueryCollectedValue( 1 );
//
// Sequences of length zero are valid in some cases
//
if ( PaDataValue->Length == 0 )
{
goto Cleanup;
}
Frame->Level += 1;
//
// NOTE: Must use the actual address within the frame (PaDataValue->Address)
// rather than the (potentially dynamically allocated) address of the octet string
// since Netmon cares that the addresses passed to it during display belong
// within the frame being parsed
//
FrameHere.Address = PaDataValue->Address;
FrameHere.hFrame = Frame->hFrame;
FrameHere.Level = Frame->Level;
switch ( PaDataType->dw )
{
case PA_APTGS_REQ:
{
if ( FrameHere.Address &&
PaDataValue->Length > 0 &&
*FrameHere.Address == BuildDescriptor(
ctApplication,
pcConstructed,
ASN1_KRB_AP_REQ ))
{
ASN1ParserApReq
ap_req( FALSE, 0, NULL );
dw = ap_req.Parse( &FrameHere );
}
else
{
//
// TODO: add other non-default parsers
//
dw = Display(
Frame,
PaDataValue,
PROP( PA_DATA_value ),
0
);
}
break;
}
case PA_ENC_TIMESTAMP:
case PA_CLIENT_VERSION:
case PA_XBOX_SERVICE_REQUEST:
case PA_XBOX_SERVICE_ADDRESS:
case PA_XBOX_ACCOUNT_CREATION:
{
ASN1ParserEncryptedData
encrypted_data( FALSE, 0, NULL );
dw = encrypted_data.Parse( &FrameHere );
break;
}
case PA_PW_SALT:
{
dw = Display(
&FrameHere,
PaDataValue,
PROP( PA_PW_SALT_salt ),
0
);
break;
}
case PA_ETYPE_INFO:
{
ASN1ParserKerbEtypeInfo
etype_info( FALSE, 0, NULL );
dw = etype_info.Parse( &FrameHere );
break;
}
case PA_PAC_REQUEST:
{
ASN1ParserKerbPaPacRequest
pa_pac_request( FALSE, 0, NULL );
dw = pa_pac_request.Parse( &FrameHere );
break;
}
case PA_FOR_USER:
{
ASN1ParserKerbPaForUser
pa_for_user( FALSE, 0, NULL );
dw = pa_for_user.Parse( &FrameHere );
break;
}
case PA_PAC_REQUEST_EX:
{
ASN1ParserPaPacRequestEx
pa_pac_request_ex(
FALSE,
0,
NULL );
dw = pa_pac_request_ex.Parse( &FrameHere );
break;
}
case PA_COMPOUND_IDENTITY:
{
//
// KERB-PA-COMPOUND-IDENTITY ::= SEQUENCE OF KERB-TICKET
//
ASN1ParserTicketSequence
pa_compound_identity(
FALSE,
0,
PROP( CompoundIdentity ),
PROP( CompoundIdentityTicket ));
dw = pa_compound_identity.Parse( &FrameHere );
break;
}
default:
dw = Display(
Frame,
PaDataValue,
PROP( PA_DATA_value ),
0
);
}
Frame->Level -= 1;
if ( dw != ERROR_SUCCESS )
{
goto Cleanup;
}
Cleanup:
return dw;
}