1*12b65585SGordon Ross // Copyright 2012 Nexenta Systems, Inc. All rights reserved. 24bff34e3Sthurlow // Copyright (C) 2002 Microsoft Corporation 34bff34e3Sthurlow // All rights reserved. 44bff34e3Sthurlow // 54bff34e3Sthurlow // THIS CODE AND INFORMATION IS PROVIDED "AS IS" 64bff34e3Sthurlow // WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 74bff34e3Sthurlow // OR IMPLIED, INCLUDING BUT NOT LIMITED 84bff34e3Sthurlow // TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY 94bff34e3Sthurlow // AND/OR FITNESS FOR A PARTICULAR PURPOSE. 104bff34e3Sthurlow // 114bff34e3Sthurlow // Date - 10/08/2002 124bff34e3Sthurlow // Author - Sanj Surati 134bff34e3Sthurlow 144bff34e3Sthurlow ///////////////////////////////////////////////////////////// 154bff34e3Sthurlow // 164bff34e3Sthurlow // DERPARSE.H 174bff34e3Sthurlow // 184bff34e3Sthurlow // SPNEGO Token Handler Header File 194bff34e3Sthurlow // 204bff34e3Sthurlow // Contains the definitions required to properly parse the 214bff34e3Sthurlow // SPNEGO DER encoding. 224bff34e3Sthurlow // 234bff34e3Sthurlow ///////////////////////////////////////////////////////////// 244bff34e3Sthurlow 254bff34e3Sthurlow #ifndef __DERPARSE_H__ 264bff34e3Sthurlow #define __DERPARSE_H__ 274bff34e3Sthurlow 284bff34e3Sthurlow // C++ Specific 294bff34e3Sthurlow #if defined(__cplusplus) 304bff34e3Sthurlow extern "C" 314bff34e3Sthurlow { 324bff34e3Sthurlow #endif 334bff34e3Sthurlow 344bff34e3Sthurlow /* Identifier Types */ 354bff34e3Sthurlow #define IDENTIFIER_MASK 0xC0 // Bits 7 and 8 364bff34e3Sthurlow #define IDENTIFIER_UNIVERSAL 0x00 // 00 = universal 374bff34e3Sthurlow #define IDENTIFIER_APPLICATION 0x40 // 01 = application 384bff34e3Sthurlow #define IDENTIFIER_CONTEXT_SPECIFIC 0x80 // 10 = context specific 394bff34e3Sthurlow #define IDENTIFIER_PRIVATE 0xC0 // 11 = Private 404bff34e3Sthurlow 414bff34e3Sthurlow /* Encoding type */ 424bff34e3Sthurlow 434bff34e3Sthurlow #define FORM_MASK 0x20 /* Bit 6 */ 444bff34e3Sthurlow #define PRIMITIVE 0x00 /* 0 = primitive */ 454bff34e3Sthurlow #define CONSTRUCTED 0x20 /* 1 = constructed */ 464bff34e3Sthurlow 474bff34e3Sthurlow /* Universal tags */ 484bff34e3Sthurlow 494bff34e3Sthurlow #define TAG_MASK 0x1F /* Bits 5 - 1 */ 504bff34e3Sthurlow #define BOOLEAN 0x01 /* 1: TRUE or FALSE */ 514bff34e3Sthurlow #define INTEGER 0x02 /* 2: Arbitrary precision integer */ 524bff34e3Sthurlow #define BITSTRING 0x03 /* 2: Sequence of bits */ 534bff34e3Sthurlow #define OCTETSTRING 0x04 /* 4: Sequence of bytes */ 544bff34e3Sthurlow #define NULLTAG 0x05 /* 5: NULL */ 554bff34e3Sthurlow #define OID 0x06 /* 6: Object Identifier (numeric sequence) */ 564bff34e3Sthurlow #define OBJDESCRIPTOR 0x07 /* 7: Object Descriptor (human readable) */ 574bff34e3Sthurlow #define EXTERNAL 0x08 /* 8: External / Instance Of */ 584bff34e3Sthurlow #define REAL 0x09 /* 9: Real (Mantissa * Base^Exponent) */ 594bff34e3Sthurlow #define ENUMERATED 0x0A /* 10: Enumerated */ 604bff34e3Sthurlow #define EMBEDDED_PDV 0x0B /* 11: Embedded Presentation Data Value */ 614bff34e3Sthurlow #define SEQUENCE 0x10 /* 16: Constructed Sequence / Sequence Of */ 624bff34e3Sthurlow #define SET 0x11 /* 17: Constructed Set / Set Of */ 634bff34e3Sthurlow #define NUMERICSTR 0x12 /* 18: Numeric String (digits only) */ 644bff34e3Sthurlow #define PRINTABLESTR 0x13 /* 19: Printable String */ 654bff34e3Sthurlow #define T61STR 0x14 /* 20: T61 String (Teletex) */ 664bff34e3Sthurlow #define VIDEOTEXSTR 0x15 /* 21: Videotex String */ 674bff34e3Sthurlow #define IA5STR 0x16 /* 22: IA5 String */ 684bff34e3Sthurlow #define UTCTIME 0x17 /* 23: UTC Time */ 694bff34e3Sthurlow #define GENERALIZEDTIME 0x18 /* 24: Generalized Time */ 704bff34e3Sthurlow #define GRAPHICSTR 0x19 /* 25: Graphic String */ 714bff34e3Sthurlow #define VISIBLESTR 0x1A /* 26: Visible String (ISO 646) */ 724bff34e3Sthurlow #define GENERALSTR 0x1B /* 27: General String */ 734bff34e3Sthurlow #define UNIVERSALSTR 0x1C /* 28: Universal String */ 744bff34e3Sthurlow #define BMPSTR 0x1E /* 30: Basic Multilingual Plane String */ 754bff34e3Sthurlow 764bff34e3Sthurlow /* Length encoding */ 774bff34e3Sthurlow 784bff34e3Sthurlow #define LEN_XTND 0x80 /* Indefinite or long form */ 794bff34e3Sthurlow #define LEN_MASK 0x7f /* Bits 7 - 1 */ 804bff34e3Sthurlow 814bff34e3Sthurlow #define SEQ_ELM(n) (IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | ((n)&TAG_MASK)) 824bff34e3Sthurlow 834bff34e3Sthurlow // 844bff34e3Sthurlow // SPNEGO Token Parsing Constants 854bff34e3Sthurlow // 864bff34e3Sthurlow 874bff34e3Sthurlow 884bff34e3Sthurlow // Fixed Length of NegTokenInit ReqFlags field 894bff34e3Sthurlow #define SPNEGO_NEGINIT_MAXLEN_REQFLAGS 2 904bff34e3Sthurlow 914bff34e3Sthurlow // Difference in bits for ReqFlags token 924bff34e3Sthurlow #define SPNEGO_NEGINIT_REQFLAGS_BITDIFF 1 934bff34e3Sthurlow 944bff34e3Sthurlow // Fixed Length of NegTokenTarg NegResult field 954bff34e3Sthurlow #define SPNEGO_NEGTARG_MAXLEN_NEGRESULT 1 964bff34e3Sthurlow 974bff34e3Sthurlow // Application Specific Construct - Always at the start of a NegTokenInit 984bff34e3Sthurlow #define SPNEGO_NEGINIT_APP_CONSTRUCT ( IDENTIFIER_APPLICATION | CONSTRUCTED ) // 0x60 994bff34e3Sthurlow 1004bff34e3Sthurlow // Constructed Sequence token - after the actual token identifier token 1014bff34e3Sthurlow #define SPNEGO_CONSTRUCTED_SEQUENCE ( SEQUENCE | CONSTRUCTED ) 1024bff34e3Sthurlow 1034bff34e3Sthurlow // MechList Type Identifier 1044bff34e3Sthurlow #define SPNEGO_MECHLIST_TYPE ( SEQUENCE | CONSTRUCTED | OID ) 1054bff34e3Sthurlow 1064bff34e3Sthurlow // 1074bff34e3Sthurlow // NegTokenInit - Token Identifier and Elements 1084bff34e3Sthurlow // 1094bff34e3Sthurlow 1104bff34e3Sthurlow // NegTokenInit - 0xa0 1114bff34e3Sthurlow #define SPNEGO_NEGINIT_TOKEN_IDENTIFIER ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | \ 1124bff34e3Sthurlow SPNEGO_TOKEN_INIT ) 1134bff34e3Sthurlow 1144bff34e3Sthurlow // Structure elements for NegTokenInit 1154bff34e3Sthurlow #define SPNEGO_NEGINIT_MECHTYPES 0x0 // MechTypes is element 0 1164bff34e3Sthurlow #define SPNEGO_NEGINIT_REQFLAGS 0x1 // ReqFlags is element 1 1174bff34e3Sthurlow #define SPNEGO_NEGINIT_MECHTOKEN 0x2 // MechToken is element 2 1184bff34e3Sthurlow #define SPNEGO_NEGINIT_MECHLISTMIC 0x3 // MechListMIC is element 3 1194bff34e3Sthurlow 1204bff34e3Sthurlow // MechTypes element is 0xa0 1214bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_MECHTYPES SEQ_ELM(SPNEGO_NEGINIT_MECHTYPES) 1224bff34e3Sthurlow // ReqFlags element is 0xa1 1234bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_REQFLAGS SEQ_ELM(SPNEGO_NEGINIT_REQFLAGS) 1244bff34e3Sthurlow // MechToken element is 0xa2 1254bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_MECHTOKEN SEQ_ELM(SPNEGO_NEGINIT_MECHTOKEN) 1264bff34e3Sthurlow // MechListMIC element is 0xa3 1274bff34e3Sthurlow #define SPNEGO_NEGINIT_ELEMENT_MECHLISTMIC SEQ_ELM(SPNEGO_NEGINIT_MECHLISTMIC) 1284bff34e3Sthurlow 1294bff34e3Sthurlow // 1304bff34e3Sthurlow // NegTokenTarg - Token Identifier and Elements 1314bff34e3Sthurlow // 1324bff34e3Sthurlow 1334bff34e3Sthurlow // NegTokenTarg - 0xa1 1344bff34e3Sthurlow #define SPNEGO_NEGTARG_TOKEN_IDENTIFIER ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | \ 1354bff34e3Sthurlow SPNEGO_TOKEN_TARG ) 1364bff34e3Sthurlow 1374bff34e3Sthurlow // Structure elements for NegTokenTarg 1384bff34e3Sthurlow #define SPNEGO_NEGTARG_NEGRESULT 0x0 // NegResult is element 0 1394bff34e3Sthurlow #define SPNEGO_NEGTARG_SUPPORTEDMECH 0x1 // SupportedMech is element 1 1404bff34e3Sthurlow #define SPNEGO_NEGTARG_RESPONSETOKEN 0x2 // ResponseToken is element 2 1414bff34e3Sthurlow #define SPNEGO_NEGTARG_MECHLISTMIC 0x3 // MechListMIC is element 3 1424bff34e3Sthurlow 1434bff34e3Sthurlow // NegResult element is 0xa0 1444bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_NEGRESULT SEQ_ELM(SPNEGO_NEGTARG_NEGRESULT) 1454bff34e3Sthurlow // SupportedMech element is 0xa1 1464bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_SUPPORTEDMECH SEQ_ELM(SPNEGO_NEGTARG_SUPPORTEDMECH) 1474bff34e3Sthurlow // ResponseToken element is 0xa2 1484bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_RESPONSETOKEN SEQ_ELM(SPNEGO_NEGTARG_RESPONSETOKEN) 1494bff34e3Sthurlow // MechListMIC element is 0xa3 1504bff34e3Sthurlow #define SPNEGO_NEGTARG_ELEMENT_MECHLISTMIC SEQ_ELM(SPNEGO_NEGTARG_MECHLISTMIC) 1514bff34e3Sthurlow 1524bff34e3Sthurlow // 1534bff34e3Sthurlow // Defines a GSS Mechanism OID. We keep a single static array 1544bff34e3Sthurlow // of these which we'll use for validation/searches/parsing. 1554bff34e3Sthurlow // 1564bff34e3Sthurlow 1574bff34e3Sthurlow typedef struct _mechOID 1584bff34e3Sthurlow { 1594bff34e3Sthurlow unsigned char* ucOid; // Byte representation of OID 1604bff34e3Sthurlow int iLen; // Length of the OID, length and identifier 1614bff34e3Sthurlow int iActualDataLen; // Length of the actual OID 1624bff34e3Sthurlow SPNEGO_MECH_OID eMechanismOID; // Which OID is this? 1634bff34e3Sthurlow } MECH_OID; 1644bff34e3Sthurlow 1654bff34e3Sthurlow 1664bff34e3Sthurlow // 1674bff34e3Sthurlow // ASN Der functions 1684bff34e3Sthurlow // 1694bff34e3Sthurlow 1704bff34e3Sthurlow int ASNDerGetLength( unsigned char* pbLengthData, long nBoundaryLength, long* pnLength, 1714bff34e3Sthurlow long* pnNumLengthBytes ); 1724bff34e3Sthurlow int ASNDerCheckToken( unsigned char* pbTokenData, unsigned char nToken, 1734bff34e3Sthurlow long nCheckLength, long nBoundaryLength, long* pnLength, 1744bff34e3Sthurlow long* pnTokenLength ); 1754bff34e3Sthurlow int ASNDerCheckOID( unsigned char* pbTokenData, SPNEGO_MECH_OID nMechOID, long nBoundaryLength, 1764bff34e3Sthurlow long* pnTokenLength ); 1774bff34e3Sthurlow int ASNDerCalcNumLengthBytes( long nLength ); 1784bff34e3Sthurlow long ASNDerCalcTokenLength( long nLength, long nDataLength ); 1794bff34e3Sthurlow long ASNDerCalcElementLength( long nDataLength, long* pnInternalLength ); 180*12b65585SGordon Ross long ASNDerCalcMechListLength( SPNEGO_MECH_OID *mechOidLst, int mechOidCnt, 181*12b65585SGordon Ross long* pnInternalLength ); 1824bff34e3Sthurlow int ASNDerWriteLength( unsigned char* pbData, long nLength ); 1834bff34e3Sthurlow int ASNDerWriteToken( unsigned char* pbData, unsigned char ucType, 1844bff34e3Sthurlow unsigned char* pbTokenValue, long nLength ); 1854bff34e3Sthurlow int ASNDerWriteOID( unsigned char* pbData, SPNEGO_MECH_OID eMechOID ); 186*12b65585SGordon Ross long ASNDerWriteMechList( unsigned char* pbData, SPNEGO_MECH_OID *mechOidLst, int mechOidCnt ); 1874bff34e3Sthurlow int ASNDerWriteElement( unsigned char* pbData, unsigned char ucElementSequence, 1884bff34e3Sthurlow unsigned char ucType, unsigned char* pbTokenValue, long nLength ); 1894bff34e3Sthurlow 1904bff34e3Sthurlow 1914bff34e3Sthurlow // C++ Specific 1924bff34e3Sthurlow #if defined(__cplusplus) 1934bff34e3Sthurlow } 1944bff34e3Sthurlow #endif 1954bff34e3Sthurlow 1964bff34e3Sthurlow #endif 197