]> git.saurik.com Git - apple/security.git/blobdiff - ntlm/ntlmBlobPriv.h
Security-57031.1.35.tar.gz
[apple/security.git] / ntlm / ntlmBlobPriv.h
diff --git a/ntlm/ntlmBlobPriv.h b/ntlm/ntlmBlobPriv.h
new file mode 100644 (file)
index 0000000..6b6f02f
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2000-2004,2006-2008,2010,2013 Apple Inc. All Rights Reserved.
+ * 
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * ntlmBlobPriv.h - Private routines used by NtlmGenerator module. 
+ */
+
+#ifndef _NTLM_BLOB_PRIV_H_
+#define _NTLM_BLOB_PRIV_H_
+
+#include <CoreFoundation/CFData.h>
+#include <CoreFoundation/CFString.h>
+#include <stdint.h>
+#include <Security/SecBase.h>
+#include <Security/SecBasePriv.h>
+#include <libkern/OSByteOrder.h>
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifndef NDEBUG
+
+#include <stdio.h>
+
+#define dprintf(args...) printf(args)
+#else
+#define dprintf(args...)
+#endif
+/*
+ * Common error returns.
+ *
+ * This one for "I don't understand the server blob".
+ */
+#define NTLM_ERR_PARSE_ERR                     errSecParam
+
+/*
+ * This one for protocol variant mismatch (e.g., app requires NTLMv2 but server
+ * doesn't accept that).
+ */
+#define NTLM_ERR_PROTOCOL_MISMATCH  errSecAuthFailed
+
+/* 
+ * For debugging using fixed pamaters via sourceforge "test vectors".
+ */
+#define DEBUG_FIXED_CHALLENGE   0
+
+/* handy portable NULL-tolerant free() */
+#define CFREE(p)               if(p != NULL) { free(p); }
+
+#define NTLM_SIGNATURE                         "NTLMSSP"
+#define NTLM_SIGNATURE_LEN                     8                       /* including NULL! */
+
+#define NTLM_MSG_MARKER_TYPE1          1                       /* first client msg */
+#define NTLM_MSG_MARKER_TYPE2          2                       /* server challenge */
+#define NTLM_MSG_MARKER_TYPE3          3                       /* client response */
+
+/* Size of a security buffer */
+#define NTLM_SIZEOF_SEC_BUF            (sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t))
+
+/* length of server challenge in bytes */
+#define NTLM_CHALLENGE_LEN                     8
+
+/* length of client nonce in bytes */
+#define NTLM_CLIENT_NONCE_LEN          8
+
+/* length of LM and NTLM responses */
+#define NTLM_LM_RESPONSE_LEN           24
+
+/* foreced length of LM-style uppper case password */
+#define NTLM_LM_PASSWORD_LEN           14
+
+/* 
+ * Flags - defined here in native endianness; sent over the wire little-endian 
+ */
+#define NTLM_NegotiateUnicode          0x00000001
+#define NTLM_NegotiateOEM                      0x00000002
+#define NTLM_RequestTarget                     0x00000004
+#define NTLM_Unknown1                          0x00000008
+#define NTLM_NegotiateSign                     0x00000010
+#define NTLM_NegotiateSeal                     0x00000020
+#define NTLM_NegotiateDatagram         0x00000040
+#define NTLM_NegotiateLMKey                    0x00000080
+#define NTLM_NegotiateNetware          0x00000100
+#define NTLM_NegotiateNTLM                     0x00000200
+#define NTLM_Unknown2                          0x00000400
+#define NTLM_Unknown3                          0x00000800
+#define NTLM_DomainSupplied                    0x00001000
+#define NTLM_WorkstationSupplies       0x00002000
+#define NTLM_LocalCall                         0x00004000
+#define NTLM_AlwaysSign                                0x00008000
+#define NTLM_TargetTypeDomain          0x00010000
+#define NTLM_TargetTypeServer          0x00020000
+#define NTLM_TargetTypeShare           0x00040000
+#define NTLM_NegotiateNTLM2Key         0x00080000
+#define NTLM_RequestInitResp           0x00100000
+#define NTLM_RequestAcceptResp         0x00200000
+#define NTLM_RequestNonNTSessionKey 0x00400000
+#define NTLM_NegotiateTargetInfo       0x00800000
+#define NTLM_Unknown4                          0x01000000
+#define NTLM_Unknown5                          0x02000000
+#define NTLM_Unknown6                          0x04000000
+#define NTLM_Unknown7                          0x08000000
+#define NTLM_Unknown8                          0x10000000
+#define NTLM_Negotiate128Bit           0x20000000
+#define NTLM_NegotiateKeyExchange   0x40000000
+#define NTLM_Negotiate56Bit                    0x80000000
+
+
+/* write a 64-bit word, little endian */
+void appendUint64(
+       CFMutableDataRef        buf,
+       uint64_t                        word);
+
+/* write a 32-bit word, little endian */
+void appendUint32(
+       CFMutableDataRef        buf,
+       uint32_t                        word);
+       
+/* write a 16-bit word, little endian */
+void appendUint16(
+       CFMutableDataRef        buf,
+       uint16_t                        word);
+
+/* 
+ * Write a security buffer, providing the index into the CFData at which 
+ * this security buffer's offset is located. Just before the actual data is written,
+ * go back and update the offset with the start of that data using secBufOffset().
+ */
+void appendSecBuf(
+       CFMutableDataRef        buf,
+       uint16_t                        len,
+       CFIndex                         *offsetIndex);
+
+/*
+ * Update a security buffer's offset to be the current end of data in a CFData.
+ */
+void secBufOffset(
+       CFMutableDataRef        buf,
+       CFIndex                         offsetIndex);           /* obtained from appendSecBuf() */
+
+/*
+ * Parse/validate a security buffer. Verifies that supplied offset/length don't go
+ * past end of avaialble data. Returns ptr to actual data and its length. Returns
+ * errSecParam on bogus values.
+ */
+OSStatus ntlmParseSecBuffer(
+       const unsigned char *cp,                        /* start of security buffer */
+       const unsigned char *bufStart,          /* start of whole msg buffer */
+       unsigned bufLen,                                        /* # of valid bytes starting at bufStart */
+       const unsigned char **data,                     /* RETURNED, start of actual data */
+       uint16_t *dataLen);                                     /* RETURNED, length of actual data */
+
+/* random number generator */
+void ntlmRand(
+       unsigned                len,
+       void                    *buf);                          /* allocated by caller, random data RETURNED */
+       
+/* Obtain host name in appropriate encoding */
+OSStatus ntlmHostName(
+       bool                    unicode,
+       unsigned char   **flat,                         // mallocd and RETURNED
+       unsigned                *flatLen);                      // RETURNED
+
+void ntlmAppendTimestamp(
+       CFMutableDataRef ntlmV2Blob);
+
+/*
+ * Convert CFString to little-endian unicode. 
+ */
+void ntlmStringToLE(
+       CFStringRef             pwd,
+       unsigned char   **ucode,                // mallocd and RETURNED
+       unsigned                *ucodeLen);             // RETURNED
+
+/*
+ * Convert a CFStringRef into a mallocd array of chars suitable for the specified
+ * encoding. This might return an error if the string can't be converted 
+ * appropriately. 
+ */
+OSStatus ntlmStringFlatten(
+       CFStringRef str,
+       bool unicode,
+       unsigned char **flat,                           // mallocd and RETURNED
+       unsigned *flatLen);                                     // RETURNED
+
+/* MD4 and MD5 hash */
+#define NTLM_DIGEST_LENGTH   16
+void md4Hash(
+       const unsigned char *data,
+       unsigned                        dataLen,
+       unsigned char           *digest);               // caller-supplied, NTLM_DIGEST_LENGTH */
+void md5Hash(
+       const unsigned char *data,
+       unsigned                        dataLen,
+       unsigned char           *digest);               // caller-supplied, NTLM_DIGEST_LENGTH */
+       
+/*
+ * Calculate LM-style password hash. This really only works if the password 
+ * is convertible to ASCII.
+ */
+OSStatus lmPasswordHash(       
+       CFStringRef                     pwd,
+       unsigned char           *digest);               // caller-supplied, NTLM_DIGEST_LENGTH
+
+/*
+ * Calculate NTLM password hash (MD4 on a unicode password).
+ */
+void ntlmPasswordHash(
+       CFStringRef                     pwd,
+       unsigned char           *digest);               // caller-supplied, NTLM_DIGEST_LENGTH
+       
+/* 
+ * NTLM response: DES with three different keys.
+ */
+OSStatus ntlmResponse(
+       const unsigned char *digest,            // NTLM_DIGEST_LENGTH bytes
+       const unsigned char *challenge,         // actually challenge or session hash 
+       unsigned char           *ntlmResp);             // caller-supplied NTLM_LM_RESPONSE_LEN
+       
+/* DES-related consts */
+#define DES_BLOCK_SIZE         8
+#define DES_RAW_KEY_SIZE       7
+#define DES_KEY_SIZE           8
+
+/*
+ * Given 7 bytes, create 8-byte DES key. Our implementation ignores the 
+ * parity bit (lsb), which simplifies this somewhat. 
+ */
+void ntlmMakeDesKey(
+       const unsigned char *inKey,                     // DES_RAW_KEY_SIZE bytes
+       unsigned char *outKey);                         // DES_KEY_SIZE bytes
+
+/*
+ * single block DES encrypt.
+ * This would really benefit from a DES implementation in CommonCrypto. 
+ */
+OSStatus ntlmDesCrypt(
+       const unsigned char *key,                       // DES_KEY_SIZE bytes
+       const unsigned char *inData,            // DES_BLOCK_SIZE bytes
+       unsigned char *outData);                        // DES_BLOCK_SIZE bytes
+
+/*
+ * HMAC/MD5.
+ */
+OSStatus ntlmHmacMD5(
+       const unsigned char *key,       
+       unsigned                        keyLen,
+       const unsigned char *inData,
+       unsigned                        inDataLen,
+       unsigned char           *mac);                  // caller provided, NTLM_DIGEST_LENGTH
+
+#if NTLM_DUMP
+void ntlmPrintFlags(
+       const char *whereFrom,
+       uint32_t flags);
+#else
+#define ntlmPrintFlags(w, f)
+#endif
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif  /* _NTLM_BLOB_PRIV_H_ */