Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. module HmacSha256 exposing (hmac, packedStringOfIntArray, intArrayOfPackedString, presentableIntArray, presentationToIntArray)
  2.  
  3. import Array exposing (Array)
  4. import Bitwise
  5. import Char
  6. import Debug exposing (log)
  7. import ParseInt as I
  8. {-- Note: relies on a modified version of billstclair's sha256 module with utf-8 handling disabled --}
  9. import Sha256 exposing (sha256)
  10.  
  11. hmacBlockSize : Int
  12. hmacBlockSize = 64
  13.  
  14. hextuples : String -> Array String
  15. hextuples s =
  16. Array.initialize ((String.length s) // 2) identity
  17. |> Array.map (\i -> String.slice (i * 2) (i * 2 + 2) s)
  18.  
  19. presentationToIntArray : String -> Array Int
  20. presentationToIntArray =
  21. hextuples >> Array.map (I.parseIntHex >> Result.toMaybe >> Maybe.withDefault 0)
  22.  
  23. presentableIntArray : Array Int -> String
  24. presentableIntArray =
  25. Array.map (I.toHex >> String.pad 2 '0') >> Array.toList >> String.concat
  26.  
  27. packedStringOfIntArray : Array Int -> String
  28. packedStringOfIntArray =
  29. Array.map (Char.fromCode >> String.fromChar) >> Array.toList >> String.concat
  30.  
  31. intArrayOfPackedString : String -> Array Int
  32. intArrayOfPackedString =
  33. String.toList >> Array.fromList >> Array.map Char.toCode
  34.  
  35. sha256Ints : Array Int -> Array Int
  36. sha256Ints =
  37. packedStringOfIntArray >> Sha256.sha256 >> presentationToIntArray
  38.  
  39. arrayPad : Int -> Int -> Array Int -> Array Int
  40. arrayPad n v a =
  41. if Array.length a >= n then
  42. a
  43. else
  44. Array.append a (Array.repeat (n - (Array.length a)) v)
  45.  
  46. xor : Int -> Array Int -> Array Int
  47. xor v = Array.map (Bitwise.xor v)
  48.  
  49. hmac : Array Int -> Array Int -> Array Int
  50. hmac key msg =
  51. if Array.length key > hmacBlockSize then
  52. hmac (sha256Ints key) msg
  53. else if Array.length key < hmacBlockSize then
  54. hmac (arrayPad hmacBlockSize 0 key) msg
  55. else
  56. let o_key_pad = xor 0x5c key in
  57. let i_key_pad = xor 0x36 key in
  58. sha256Ints (Array.append o_key_pad (sha256Ints (Array.append i_key_pad msg)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement