mirror of
https://github.com/GaloisInc/cryptol.git
synced 2024-12-17 21:11:35 +03:00
8b577828f6
Cryptol 2.3-alpha couldn't math, but thanks to @yav's hard work, Cryptol 2.3 and later can math! So with our new found powers comes great simplification. Not all is perfect, much like Dori-Mic's situation, but things are much better. See the width constraints in SCrypt.cry for areas that could be improved with some semi-obvious statements (forall x. 1 + width x >= width (x - 1)).
44 lines
1.5 KiB
Plaintext
44 lines
1.5 KiB
Plaintext
/*
|
|
* Copyright (c) 2013-2016 Galois, Inc.
|
|
* Distributed under the terms of the BSD3 license (see LICENSE file)
|
|
*/
|
|
module HMAC where
|
|
|
|
import SHA256
|
|
|
|
hmacSHA256 : {pwBytes, msgBytes}
|
|
(fin pwBytes, fin msgBytes
|
|
, 32 >= width msgBytes
|
|
, 64 >= width (8*pwBytes)
|
|
) => [pwBytes][8] -> [msgBytes][8] -> [256]
|
|
hmacSHA256 = hmac `{blockLength=64} SHA256 SHA256 SHA256
|
|
|
|
// Due to limitations of the type system we must accept two
|
|
// separate arguments (both aledgedly the same) for two
|
|
// separate length inputs.
|
|
hmac : { msgBytes, pwBytes, digest, blockLength }
|
|
( fin pwBytes, fin digest, fin blockLength
|
|
)
|
|
=> ([blockLength + msgBytes][8] -> [8*digest])
|
|
-> ([blockLength + digest][8] -> [8*digest])
|
|
-> ([pwBytes][8] -> [8*digest])
|
|
-> [pwBytes][8]
|
|
-> [msgBytes][8]
|
|
-> [digest*8]
|
|
hmac hash hash2 hash3 key message = hash2 (okey # internal)
|
|
where
|
|
ks : [blockLength][8]
|
|
ks = if `pwBytes > (`blockLength : [max (width pwBytes) (width blockLength)])
|
|
then take `{blockLength} (split (hash3 key) # (zero : [blockLength][8]))
|
|
else take `{blockLength} (key # (zero : [blockLength][8]))
|
|
okey = [k ^ 0x5C | k <- ks]
|
|
ikey = [k ^ 0x36 | k <- ks]
|
|
internal = split (hash (ikey # message))
|
|
|
|
property pass =
|
|
~zero ==
|
|
[ hmacSHA256 [0x0b | _ <- [1..20] : [_][6]] "Hi There" == 0xb0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7
|
|
, hmacSHA256 "Jefe" "what do ya want for nothing?" == 0x5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
|
|
]
|
|
|