Add function to calculate MIC
authorSimo Sorce <simo@redhat.com>
Thu, 27 Mar 2014 03:20:24 +0000 (23:20 -0400)
committerSimo Sorce <simo@redhat.com>
Sun, 4 May 2014 21:21:06 +0000 (17:21 -0400)
src/ntlm.h
src/ntlm_crypto.c

index a771123d43d98406d611c092fccf18f545d03d50..40508e406e2b5ed82ad30f17982aab5f8ddb14fa 100644 (file)
@@ -413,6 +413,23 @@ int ntlm_unseal(struct ntlm_rc4_handle *handle, uint32_t flags,
                 struct ntlm_buffer *message, struct ntlm_buffer *output,
                 struct ntlm_buffer *signature);
 
+/**
+ * @brief   Creates a NTLM MIC
+ *
+ * @param exported_session_key      The Exported Session Key
+ * @param negotiate_message         The NTLM Negotiate Message (or empty)
+ * @param challenge_message         The NTLM Challenge Message
+ * @param authenticate_message      The NTLM Authenticate Message
+ * @param mic                       Preallocated byffer of 16 bytes
+ *
+ * @return 0 on success, or an error
+ */
+int ntlm_mic(struct ntlm_key *exported_session_key,
+             struct ntlm_buffer *negotiate_message,
+             struct ntlm_buffer *challenge_message,
+             struct ntlm_buffer *authenticate_message,
+             struct ntlm_buffer *mic);
+
 /* ############## ENCODING / DECODING ############## */
 
 /**
index 46b7d976c2eebce2f6d6343ebe2e9c9f7b44cdc2..fbfdc4189f1298ca5948e45f4161b8618d4faec1 100644 (file)
@@ -805,3 +805,28 @@ int ntlm_unseal(struct ntlm_rc4_handle *handle, uint32_t flags,
                       (flags & NTLMSSP_NEGOTIATE_KEY_EXCH),
                       output, signature);
 }
+
+int ntlm_mic(struct ntlm_key *exported_session_key,
+             struct ntlm_buffer *negotiate_message,
+             struct ntlm_buffer *challenge_message,
+             struct ntlm_buffer *authenticate_message,
+             struct ntlm_buffer *mic)
+{
+    struct ntlm_buffer key = { exported_session_key->data,
+                               exported_session_key->length };
+    struct ntlm_buffer *data[3] = { negotiate_message,
+                                    challenge_message,
+                                    authenticate_message };
+    struct ntlm_iov iov;
+
+    if (negotiate_message->length == 0) {
+        /* connectionless case */
+        iov.data = &data[1];
+        iov.num = 2;
+    } else {
+        iov.data = data;
+        iov.num = 3;
+    }
+
+    return HMAC_MD5_IOV(&key, &iov, mic);
+}