libcli/smb/smb2_signing: add smb2_key_deviration()
authorStefan Metzmacher <metze@samba.org>
Wed, 22 Feb 2012 12:13:47 +0000 (13:13 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 29 Feb 2012 02:16:23 +0000 (03:16 +0100)
This implements a simplified version of "NIST Special Publication 800-108" section 5.1
using hmac-sha256.

Thanks to Jeremy, Michael and Volker for the debugging!

metze

libcli/smb/smb2_signing.c
libcli/smb/smb2_signing.h

index 30172772b7c746866168701a7e78a101141c1c1f..62a5ade0439255aede3ace06a96a9fe26338068b 100644 (file)
@@ -135,3 +135,35 @@ NTSTATUS smb2_signing_check_pdu(DATA_BLOB signing_key,
 
        return NT_STATUS_OK;
 }
+
+void smb2_key_deviration(const uint8_t *KI, size_t KI_len,
+                        const uint8_t *Label, size_t Label_len,
+                        const uint8_t *Context, size_t Context_len,
+                        uint8_t KO[16])
+{
+       struct HMACSHA256Context ctx;
+       uint8_t buf[4];
+       static const uint8_t zero = 0;
+       uint8_t digest[SHA256_DIGEST_LENGTH];
+       uint32_t i = 1;
+       uint32_t L = 128;
+
+       /*
+        * a simplified version of
+        * "NIST Special Publication 800-108" section 5.1
+        * using hmac-sha256.
+        */
+       hmac_sha256_init(KI, KI_len, &ctx);
+
+       RSIVAL(buf, 0, i);
+       hmac_sha256_update(buf, sizeof(buf), &ctx);
+       hmac_sha256_update(Label, Label_len, &ctx);
+       hmac_sha256_update(&zero, 1, &ctx);
+       hmac_sha256_update(Context, Context_len, &ctx);
+       RSIVAL(buf, 0, L);
+       hmac_sha256_update(buf, sizeof(buf), &ctx);
+
+       hmac_sha256_final(digest, &ctx);
+
+       memcpy(KO, digest, 16);
+}
index ba2b1ca302ed3fbc3372c58b0630ac80d00d478e..34d8ba2f4e9176d60eff8386ee8872559392b8fa 100644 (file)
@@ -33,4 +33,9 @@ NTSTATUS smb2_signing_check_pdu(DATA_BLOB signing_key,
                                const struct iovec *vector,
                                int count);
 
+void smb2_key_deviration(const uint8_t *KI, size_t KI_len,
+                        const uint8_t *Label, size_t Label_len,
+                        const uint8_t *Context, size_t Context_len,
+                        uint8_t KO[16]);
+
 #endif /* _LIBCLI_SMB_SMB2_SIGNING_H_ */