mptcp: Add ADD_ADDR handling
[linux-2.6-microblaze.git] / net / mptcp / crypto.c
index 40d1bb1..c151628 100644 (file)
@@ -44,8 +44,7 @@ void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn)
                *idsn = be64_to_cpu(*((__be64 *)&mptcp_hashed_key[6]));
 }
 
-void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u32 nonce1, u32 nonce2,
-                          void *hmac)
+void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac)
 {
        u8 input[SHA256_BLOCK_SIZE + SHA256_DIGEST_SIZE];
        __be32 mptcp_hashed_key[SHA256_DIGEST_WORDS];
@@ -55,6 +54,9 @@ void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u32 nonce1, u32 nonce2,
        u8 key2be[8];
        int i;
 
+       if (WARN_ON_ONCE(len > SHA256_DIGEST_SIZE))
+               len = SHA256_DIGEST_SIZE;
+
        put_unaligned_be64(key1, key1be);
        put_unaligned_be64(key2, key2be);
 
@@ -65,11 +67,10 @@ void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u32 nonce1, u32 nonce2,
        for (i = 0; i < 8; i++)
                input[i + 8] ^= key2be[i];
 
-       put_unaligned_be32(nonce1, &input[SHA256_BLOCK_SIZE]);
-       put_unaligned_be32(nonce2, &input[SHA256_BLOCK_SIZE + 4]);
+       memcpy(&input[SHA256_BLOCK_SIZE], msg, len);
 
        sha256_init(&state);
-       sha256_update(&state, input, SHA256_BLOCK_SIZE + 8);
+       sha256_update(&state, input, SHA256_BLOCK_SIZE + len);
 
        /* emit sha256(K1 || msg) on the second input block, so we can
         * reuse 'input' for the last hashing
@@ -125,6 +126,7 @@ static int __init test_mptcp_crypto(void)
        char hmac[20], hmac_hex[41];
        u32 nonce1, nonce2;
        u64 key1, key2;
+       u8 msg[8];
        int i, j;
 
        for (i = 0; i < ARRAY_SIZE(tests); ++i) {
@@ -134,7 +136,10 @@ static int __init test_mptcp_crypto(void)
                nonce1 = be32_to_cpu(*((__be32 *)&tests[i].msg[0]));
                nonce2 = be32_to_cpu(*((__be32 *)&tests[i].msg[4]));
 
-               mptcp_crypto_hmac_sha(key1, key2, nonce1, nonce2, hmac);
+               put_unaligned_be32(nonce1, &msg[0]);
+               put_unaligned_be32(nonce2, &msg[4]);
+
+               mptcp_crypto_hmac_sha(key1, key2, msg, 8, hmac);
                for (j = 0; j < 20; ++j)
                        sprintf(&hmac_hex[j << 1], "%02x", hmac[j] & 0xff);
                hmac_hex[40] = 0;