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 ############## */
/**
(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);
+}