2017-03-02 3 views
3

Ich versuche, HMAC in Elm,
zu implementieren, aber ich kann nicht scheinen, herauszufinden, was ich hier falsch mache.
würde Einige helfen starkWie baue ich einen HMAC-Code in Elm?

type alias HashFunction = 
    String -> String 


encrypt64 : HashFunction -> String -> String -> String 
encrypt64 = 
    encrypt 64 


encrypt : Int -> HashFunction -> String -> String -> String 
encrypt blockSize hasher message key = 
    let 
     keySize = 
      String.length key 

     keyWithCorrectSize = 
      if keySize > blockSize then 
       hexStringToUtf8String (hasher key) 
      else if keySize < blockSize then 
       String.padRight blockSize (Char.fromCode 0) key 
      else 
       key 

     keyCodePoints = 
      keyWithCorrectSize 
       |> String.toList 
       |> List.map Char.toCode 

     partA = 
      keyCodePoints 
       |> List.map (Bitwise.xor 54 >> Char.fromCode) 
       |> String.fromList 

     partB = 
      keyCodePoints 
       |> List.map (Bitwise.xor 92 >> Char.fromCode) 
       |> String.fromList 
    in 
     message 
      |> String.append partA 
      |> hasher 
      |> hexStringToUtf8String 
      |> String.append partB 
      |> hasher 



-- Utils 


hexStringToUtf8String : String -> String 
hexStringToUtf8String input = 
    input 
     |> String.toList 
     |> List.Extra.greedyGroupsOf 2 
     |> List.map (String.fromList >> hexStringToUtf8Char) 
     |> String.fromList 


hexStringToUtf8Char : String -> Char 
hexStringToUtf8Char input = 
    case Hex.fromString input of 
     Ok v -> 
      Char.fromCode v 

     Err err -> 
      Debug.crash err 

Sie den zugehörigen Code finden hier geschätzt werden: https://github.com/icidasset/ongaku-ryoho/blob/master/src/App/Sources/Crypto/Hmac.elm bearbeiten

(die doc-Tests beinhaltet): mehr klar sein ... hier meine aktuellen Code doesn 't geben einen gültigen HMAC,
aus und ich würde gerne wissen, warum.

Antwort

3

Mit Blick auf die Elm SHA-Bibliothek, ich denke, das Problem (oder zumindest ein Problem) ist, dass die Ausgabe von der Hash-Codierung hex codiert ist. HMAC ruft die Hash-Funktion zweimal auf und führt die erste Ausgabe zurück in den zweiten Aufruf, und dies müssen die rohen SHA-Bytes sein, anstatt eine hexadezimale Zeichenfolge.

Sie müssen also die Hex-Ausgabe vom ersten Aufruf an hasher dekodieren, nachdem es auf partA angewendet wurde.

+1

Danke! Das ist definitiv eines der Probleme. Leider noch nicht ganz da ... Ich habe meinen obigen Code aktualisiert. Sieht das für dich ok aus? – Icid

+0

Ok, also ein Kumpel von mir nahm den umgekehrten Weg und machte 'partB' eine hexadezimierte Zeichenkette und das scheint zu funktionieren. Es ist komisch, dass meine Möchtegernlösung nicht funktioniert ... Wie auch immer, das war definitiv das einzige Problem. Danke noch einmal! – Icid

+0

Gern geschehen! Freut mich, dass es endlich funktioniert hat. Ich sehe, dass die SHA-Bibliothek Hex-Eingaben akzeptiert, wenn Sie ein Präfix "0x" verwenden, also denke ich, dass Sie das hier meinen. –

Verwandte Themen