xref: /illumos-gate/usr/src/lib/libsmbfs/smb/derparse.h (revision 55fea89d)
112b65585SGordon 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
161*55fea89dSDan Cross    int               iActualDataLen;   // Length of the actual OID
162*55fea89dSDan Cross    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 );
18012b65585SGordon Ross long ASNDerCalcMechListLength( SPNEGO_MECH_OID *mechOidLst, int mechOidCnt,
18112b65585SGordon 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 );
18612b65585SGordon 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