<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>src/Data/Hash/MD5.lhs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-varop'>></span><span class='hs-comment'>{- | <a name="line-2"></a>> Module : Data.Hash.MD5 <a name="line-3"></a>> Copyright : Copyright (C) 2001 Ian Lynagh <a name="line-4"></a>> License : Either BSD or GPL <a name="line-5"></a>> <a name="line-6"></a>> Maintainer : Ian Lynagh <igloo@earth.li> <a name="line-7"></a>> Stability : provisional <a name="line-8"></a>> Portability: portable <a name="line-9"></a>> <a name="line-10"></a>>Generation of MD5sums <a name="line-11"></a>> <a name="line-12"></a>>Written by Ian Lynagh, igloo\@earth.li <a name="line-13"></a>>-}</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Hash</span><span class='hs-varop'>.</span><span class='hs-conid'>MD5</span> <span class='hs-layout'>(</span><span class='hs-varid'>md5</span><span class='hs-layout'>,</span> <span class='hs-varid'>md5s</span><span class='hs-layout'>,</span> <span class='hs-varid'>md5i</span><span class='hs-layout'>,</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-conid'>MD5</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ABCD</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Zord64</span><span class='hs-layout'>,</span> <span class='hs-conid'>Str</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>BoolList</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>WordList</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Char</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Bits</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Word</span> </pre> Nasty kludge to create a type Zord64 which is really a Word64 but works how we want in hugs ands nhc98 too... Also need a rotate left function that actually works. #ifdef __GLASGOW_HASKELL__ #define rotL rotateL <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Zord64</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Word64</span> </pre>#else <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Hash</span><span class='hs-varop'>.</span><span class='hs-conid'>MD5</span><span class='hs-varop'>.</span><span class='hs-conid'>Zord64_HARD</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>rotL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Rotation</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>rotL</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>a</span> <span class='hs-varid'>s</span> <span class='hs-varop'>.|.</span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-comment'>-</span><span class='hs-num'>32</span><span class='hs-layout'>)</span> </pre> #endif ======================== TYPES AND CLASS DEFINTIONS ======================== <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>type</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Rotation</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>newtype</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyword'>newtype</span> <span class='hs-conid'>Str</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Str</span> <span class='hs-conid'>String</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyword'>newtype</span> <span class='hs-conid'>BoolList</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BoolList</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Bool</span><span class='hs-keyglyph'>]</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-keyword'>newtype</span> <span class='hs-conid'>WordList</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Zord64</span><span class='hs-layout'>)</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- | Anything we want to work out the MD5 of must be an instance of class MD5</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyword'>class</span> <span class='hs-conid'>MD5</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-varid'>get_next</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- get the next blocks worth</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- \ \ \------ the rest of the input</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- \ \--------- the number of bits returned</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- \--------------- the bits returned in 32bit words</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-varid'>len_pad</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Zord64</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- append the padding and length</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-varid'>finished</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- Have we run out of input yet?</span> </pre> Mainly exists because it's fairly easy to do MD5s on input where the length is not a multiple of 8 <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>instance</span> <span class='hs-conid'>MD5</span> <span class='hs-conid'>BoolList</span> <span class='hs-keyword'>where</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-varid'>get_next</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoolList</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>bools_to_word32s</span> <span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-conid'>BoolList</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>512</span> <span class='hs-varid'>s</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-varid'>len_pad</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoolList</span> <span class='hs-varid'>bs</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BoolList</span> <span class='hs-layout'>(</span><span class='hs-varid'>bs</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>True</span><span class='hs-keyglyph'>]</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-varop'>++</span> <span class='hs-varid'>replicate</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-num'>447</span> <span class='hs-comment'>-</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>511</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>l</span> <span class='hs-varop'>.&.</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftL</span> <span class='hs-num'>1</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>></span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'><-</span> <span class='hs-layout'>(</span><span class='hs-varid'>mangle</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-num'>63</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-layout'>)</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>mangle</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-varid'>mangle</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varid'>ys</span> <span class='hs-varop'>++</span> <span class='hs-varid'>mangle</span> <span class='hs-varid'>zs</span> <a name="line-11"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>8</span> <span class='hs-varid'>xs</span> <a name="line-12"></a><span class='hs-varop'>></span> <span class='hs-varid'>finished</span> <span class='hs-layout'>(</span><span class='hs-conid'>BoolList</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>==</span> <span class='hs-conid'>[]</span> </pre> The string instance is fairly straightforward <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>instance</span> <span class='hs-conid'>MD5</span> <span class='hs-conid'>Str</span> <span class='hs-keyword'>where</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-varid'>get_next</span> <span class='hs-layout'>(</span><span class='hs-conid'>Str</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>string_to_word32s</span> <span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-num'>8</span> <span class='hs-varop'>*</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-conid'>Str</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>64</span> <span class='hs-varid'>s</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-varid'>len_pad</span> <span class='hs-varid'>c64</span> <span class='hs-layout'>(</span><span class='hs-conid'>Str</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Str</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span> <span class='hs-varop'>++</span> <span class='hs-varid'>padding</span> <span class='hs-varop'>++</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>padding</span> <span class='hs-keyglyph'>=</span> <span class='hs-chr'>'\128'</span><span class='hs-conop'>:</span><span class='hs-varid'>replicate</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>zeros</span><span class='hs-layout'>)</span> <span class='hs-chr'>'\000'</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-varid'>zeros</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shiftR</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>440</span> <span class='hs-comment'>-</span> <span class='hs-varid'>c64</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>511</span><span class='hs-layout'>)</span> <span class='hs-num'>3</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length_to_chars</span> <span class='hs-num'>8</span> <span class='hs-varid'>c64</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-varid'>finished</span> <span class='hs-layout'>(</span><span class='hs-conid'>Str</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>==</span> <span class='hs-str'>""</span> </pre> YA instance that is believed will be useful <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>instance</span> <span class='hs-conid'>MD5</span> <span class='hs-conid'>WordList</span> <span class='hs-keyword'>where</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-varid'>get_next</span> <span class='hs-layout'>(</span><span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-varid'>ws</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>taken</span><span class='hs-layout'>,</span> <span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-varid'>ys</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span> <span class='hs-comment'>-</span> <span class='hs-varid'>taken</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>16</span> <span class='hs-varid'>ws</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-varid'>taken</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>l</span> <span class='hs-varop'>></span> <span class='hs-num'>511</span> <span class='hs-keyword'>then</span> <span class='hs-num'>512</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>l</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>511</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-varid'>len_pad</span> <span class='hs-varid'>c64</span> <span class='hs-layout'>(</span><span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-varid'>ws</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-varid'>beginning</span> <span class='hs-varop'>++</span> <span class='hs-varid'>nextish</span> <span class='hs-varop'>++</span> <span class='hs-varid'>blanks</span> <span class='hs-varop'>++</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-varid'>newlen</span><span class='hs-layout'>)</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>beginning</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>length</span> <span class='hs-varid'>ws</span> <span class='hs-varop'>></span> <span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>start</span> <span class='hs-varop'>++</span> <span class='hs-varid'>lastone'</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>[]</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-varid'>start</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>init</span> <span class='hs-varid'>ws</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-varid'>lastone</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>last</span> <span class='hs-varid'>ws</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-varid'>offset</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>31</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-varid'>lastone'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-keyword'>if</span> <span class='hs-varid'>offset</span> <span class='hs-varop'>></span> <span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>lastone</span> <span class='hs-varop'>+</span> <span class='hs-varid'>theone</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>lastone</span><span class='hs-keyglyph'>]</span> <a name="line-11"></a><span class='hs-varop'>></span> <span class='hs-varid'>theone</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shiftL</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftR</span> <span class='hs-num'>128</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>offset</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>7</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-12"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>offset</span> <span class='hs-varop'>.&.</span> <span class='hs-layout'>(</span><span class='hs-num'>31</span> <span class='hs-comment'>-</span> <span class='hs-num'>7</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-13"></a><span class='hs-varop'>></span> <span class='hs-varid'>nextish</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>offset</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-keyword'>then</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>128</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>else</span> <span class='hs-conid'>[]</span> <a name="line-14"></a><span class='hs-varop'>></span> <span class='hs-varid'>c64'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-num'>32</span> <span class='hs-comment'>-</span> <span class='hs-varid'>offset</span><span class='hs-layout'>)</span> <a name="line-15"></a><span class='hs-varop'>></span> <span class='hs-varid'>num_blanks</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>shiftR</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>448</span> <span class='hs-comment'>-</span> <span class='hs-varid'>c64'</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>511</span><span class='hs-layout'>)</span> <span class='hs-num'>5</span><span class='hs-layout'>)</span> <a name="line-16"></a><span class='hs-varop'>></span> <span class='hs-varid'>blanks</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>replicate</span> <span class='hs-varid'>num_blanks</span> <span class='hs-num'>0</span> <a name="line-17"></a><span class='hs-varop'>></span> <span class='hs-varid'>lowsize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>.&.</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftL</span> <span class='hs-num'>1</span> <span class='hs-num'>32</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <a name="line-18"></a><span class='hs-varop'>></span> <span class='hs-varid'>topsize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>shiftR</span> <span class='hs-varid'>c64</span> <span class='hs-num'>32</span> <a name="line-19"></a><span class='hs-varop'>></span> <span class='hs-varid'>size</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>lowsize</span><span class='hs-layout'>,</span> <span class='hs-varid'>topsize</span><span class='hs-keyglyph'>]</span> <a name="line-20"></a><span class='hs-varop'>></span> <span class='hs-varid'>newlen</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-varop'>.&.</span> <span class='hs-layout'>(</span><span class='hs-varid'>complement</span> <span class='hs-num'>511</span><span class='hs-layout'>)</span> <a name="line-21"></a><span class='hs-varop'>></span> <span class='hs-varop'>+</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>511</span> <span class='hs-varop'>>=</span> <span class='hs-num'>448</span> <span class='hs-keyword'>then</span> <span class='hs-num'>1024</span> <span class='hs-keyword'>else</span> <span class='hs-num'>512</span> <a name="line-22"></a><span class='hs-varop'>></span> <span class='hs-varid'>finished</span> <span class='hs-layout'>(</span><span class='hs-conid'>WordList</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-keyword'>instance</span> <span class='hs-conid'>Num</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyword'>where</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a1</span><span class='hs-layout'>,</span> <span class='hs-varid'>b1</span><span class='hs-layout'>,</span> <span class='hs-varid'>c1</span><span class='hs-layout'>,</span> <span class='hs-varid'>d1</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a2</span><span class='hs-layout'>,</span> <span class='hs-varid'>b2</span><span class='hs-layout'>,</span> <span class='hs-varid'>c2</span><span class='hs-layout'>,</span> <span class='hs-varid'>d2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>a2</span><span class='hs-layout'>,</span> <span class='hs-varid'>b1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>b2</span><span class='hs-layout'>,</span> <span class='hs-varid'>c1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>c2</span><span class='hs-layout'>,</span> <span class='hs-varid'>d1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>d2</span><span class='hs-layout'>)</span> </pre> ======================== EXPORTED FUNCTIONS ======================== <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- | The simplest function, gives you the MD5 of a string as 4-tuple of <a name="line-2"></a>> 32bit words. -}</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MD5</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_main</span> <span class='hs-conid'>False</span> <span class='hs-num'>0</span> <span class='hs-varid'>magic_numbers</span> <span class='hs-varid'>m</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- | Returns a hex number ala the md5sum program. -}</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5s</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MD5</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>abcd_to_string</span> <span class='hs-varop'>.</span> <span class='hs-varid'>md5</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- | Returns an integer equivalent to hex number from 'md5s'. -}</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5i</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MD5</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>abcd_to_integer</span> <span class='hs-varop'>.</span> <span class='hs-varid'>md5</span> </pre> ======================== THE CORE ALGORITHM ======================== Decides what to do. The first argument indicates if padding has been added. The second is the length mod 2^64 so far. Then we have the starting state, the rest of the string and the final state. <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_main</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MD5</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-conid'>Bool</span> <span class='hs-comment'>-- Have we added padding yet?</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Zord64</span> <span class='hs-comment'>-- The length so far mod 2^64</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- The initial state</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- The non-processed portion of the message</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- The resulting state</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_main</span> <span class='hs-varid'>padded</span> <span class='hs-varid'>ilen</span> <span class='hs-varid'>abcd</span> <span class='hs-varid'>m</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>finished</span> <span class='hs-varid'>m</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>padded</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-keyword'>then</span> <span class='hs-varid'>abcd</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-keyword'>else</span> <span class='hs-varid'>md5_main</span> <span class='hs-varid'>padded'</span> <span class='hs-layout'>(</span><span class='hs-varid'>ilen</span> <span class='hs-varop'>+</span> <span class='hs-num'>512</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>abcd</span> <span class='hs-varop'>+</span> <span class='hs-varid'>abcd'</span><span class='hs-layout'>)</span> <span class='hs-varid'>m''</span> <a name="line-11"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>m16</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>m'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_next</span> <span class='hs-varid'>m</span> <a name="line-12"></a><span class='hs-varop'>></span> <span class='hs-varid'>len'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ilen</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>l</span> <a name="line-13"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m16'</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>m''</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>padded'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-varid'>padded</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>l</span> <span class='hs-varop'><</span> <span class='hs-num'>512</span> <a name="line-14"></a><span class='hs-varop'>></span> <span class='hs-keyword'>then</span> <span class='hs-layout'>(</span><span class='hs-varid'>get_next</span> <span class='hs-varop'>$</span> <span class='hs-varid'>len_pad</span> <span class='hs-varid'>len'</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <a name="line-15"></a><span class='hs-varop'>></span> <span class='hs-keyword'>else</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m16</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>m'</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>padded</span><span class='hs-layout'>)</span> <a name="line-16"></a><span class='hs-varop'>></span> <span class='hs-varid'>abcd'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_do_block</span> <span class='hs-varid'>abcd</span> <span class='hs-varid'>m16'</span> </pre> md5_do_block processes a 512 bit block by calling md5_round 4 times to apply each round with the correct constants and permutations of the block <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_do_block</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Initial state</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- The block to be processed - 16 32bit words</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Resulting state</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_do_block</span> <span class='hs-varid'>abcd0</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>abcd4</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>r2</span><span class='hs-layout'>,</span> <span class='hs-varid'>r3</span><span class='hs-layout'>,</span> <span class='hs-varid'>r4</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rounds</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- <a name="line-7"></a>> map (\x -> w !! x) [1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12] <a name="line-8"></a>> -- [(5 * x + 1) `mod` 16 | x <- [0..15]] <a name="line-9"></a>> map (\x -> w !! x) [5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2] <a name="line-10"></a>> -- [(3 * x + 5) `mod` 16 | x <- [0..15]] <a name="line-11"></a>> map (\x -> w !! x) [0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9] <a name="line-12"></a>> -- [(7 * x) `mod` 16 | x <- [0..15]] <a name="line-13"></a>> -}</span> <a name="line-14"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm5</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-keyglyph'>]</span> <a name="line-15"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-keyglyph'>]</span> <a name="line-16"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm5</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"broke at perm5"</span> <a name="line-17"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm3</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-keyglyph'>]</span> <a name="line-18"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-keyglyph'>]</span> <a name="line-19"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm3</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"broke at perm3"</span> <a name="line-20"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm7</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-keyglyph'>]</span> <a name="line-21"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>c0</span><span class='hs-layout'>,</span><span class='hs-varid'>c7</span><span class='hs-layout'>,</span><span class='hs-varid'>c14</span><span class='hs-layout'>,</span><span class='hs-varid'>c5</span><span class='hs-layout'>,</span><span class='hs-varid'>c12</span><span class='hs-layout'>,</span><span class='hs-varid'>c3</span><span class='hs-layout'>,</span><span class='hs-varid'>c10</span><span class='hs-layout'>,</span><span class='hs-varid'>c1</span><span class='hs-layout'>,</span><span class='hs-varid'>c8</span><span class='hs-layout'>,</span><span class='hs-varid'>c15</span><span class='hs-layout'>,</span><span class='hs-varid'>c6</span><span class='hs-layout'>,</span><span class='hs-varid'>c13</span><span class='hs-layout'>,</span><span class='hs-varid'>c4</span><span class='hs-layout'>,</span><span class='hs-varid'>c11</span><span class='hs-layout'>,</span><span class='hs-varid'>c2</span><span class='hs-layout'>,</span><span class='hs-varid'>c9</span><span class='hs-keyglyph'>]</span> <a name="line-22"></a><span class='hs-varop'>></span> <span class='hs-varid'>perm7</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"broke at perm7"</span> <a name="line-23"></a><span class='hs-varop'>></span> <span class='hs-varid'>abcd1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_round</span> <span class='hs-varid'>md5_f</span> <span class='hs-varid'>abcd0</span> <span class='hs-varid'>w</span> <span class='hs-varid'>r1</span> <a name="line-24"></a><span class='hs-varop'>></span> <span class='hs-varid'>abcd2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_round</span> <span class='hs-varid'>md5_g</span> <span class='hs-varid'>abcd1</span> <span class='hs-layout'>(</span><span class='hs-varid'>perm5</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varid'>r2</span> <a name="line-25"></a><span class='hs-varop'>></span> <span class='hs-varid'>abcd3</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_round</span> <span class='hs-varid'>md5_h</span> <span class='hs-varid'>abcd2</span> <span class='hs-layout'>(</span><span class='hs-varid'>perm3</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varid'>r3</span> <a name="line-26"></a><span class='hs-varop'>></span> <span class='hs-varid'>abcd4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_round</span> <span class='hs-varid'>md5_i</span> <span class='hs-varid'>abcd3</span> <span class='hs-layout'>(</span><span class='hs-varid'>perm7</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-varid'>r4</span> </pre> md5_round does one of the rounds. It takes an auxiliary function and foldls (md5_inner_function f) to repeatedly apply it to the initial state with the correct constants <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_round</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Auxiliary function (F, G, H or I</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- for those of you with a copy of</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- the prayer book^W^WRFC)</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Initial state</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- The 16 32bit words of input</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- The list of 16 rotations and</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- additive constants</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Resulting state</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_round</span> <span class='hs-varid'>f</span> <span class='hs-varid'>abcd</span> <span class='hs-varid'>s</span> <span class='hs-varid'>ns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-varid'>md5_inner_function</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varid'>abcd</span> <span class='hs-varid'>ns'</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>ns'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zipWith</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-varid'>ns</span> </pre> Apply one of the functions md5_[fghi] and put the new ABCD together <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_inner_function</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Auxiliary function</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Initial state</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- The rotation and additive</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- constant (X[i] + T[j])</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ABCD</span> <span class='hs-comment'>-- Resulting state</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_inner_function</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>,</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>ki</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>a'</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>mid_a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>a</span> <span class='hs-varop'>+</span> <span class='hs-varid'>f</span><span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>ki</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-varid'>rot_a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rotL</span> <span class='hs-varid'>mid_a</span> <span class='hs-varid'>s</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-varid'>a'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span> <span class='hs-varop'>+</span> <span class='hs-varid'>rot_a</span> </pre> The 4 auxiliary functions <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_f</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <span class='hs-varop'>`xor`</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>.&.</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span> <span class='hs-varop'>`xor`</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- optimised version of: (x .&. y) .|. ((complement x) .&. z) -}</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_g</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_g</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>md5_f</span> <span class='hs-layout'>(</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-comment'>{- was: (x .&. z) .|. (y .&. (complement z)) -}</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_h</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_h</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`xor`</span> <span class='hs-varid'>y</span> <span class='hs-varop'>`xor`</span> <span class='hs-varid'>z</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_i</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Word32</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>md5_i</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>y</span> <span class='hs-varop'>`xor`</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>.|.</span> <span class='hs-layout'>(</span><span class='hs-varid'>complement</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> </pre> The magic numbers from the RFC. <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>magic_numbers</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>magic_numbers</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-num'>0x67452301</span><span class='hs-layout'>,</span> <span class='hs-num'>0xefcdab89</span><span class='hs-layout'>,</span> <span class='hs-num'>0x98badcfe</span><span class='hs-layout'>,</span> <span class='hs-num'>0x10325476</span><span class='hs-layout'>)</span> </pre> The 4 lists of (rotation, additive constant) tuples, one for each round <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>rounds</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rotation</span><span class='hs-layout'>,</span> <span class='hs-conid'>Word32</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-definition'>rounds</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>r2</span><span class='hs-layout'>,</span> <span class='hs-varid'>r3</span><span class='hs-layout'>,</span> <span class='hs-varid'>r4</span><span class='hs-layout'>)</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>r1</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>s11</span><span class='hs-layout'>,</span> <span class='hs-num'>0xd76aa478</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s12</span><span class='hs-layout'>,</span> <span class='hs-num'>0xe8c7b756</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s13</span><span class='hs-layout'>,</span> <span class='hs-num'>0x242070db</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s14</span><span class='hs-layout'>,</span> <span class='hs-num'>0xc1bdceee</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s11</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf57c0faf</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s12</span><span class='hs-layout'>,</span> <span class='hs-num'>0x4787c62a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s13</span><span class='hs-layout'>,</span> <span class='hs-num'>0xa8304613</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s14</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfd469501</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s11</span><span class='hs-layout'>,</span> <span class='hs-num'>0x698098d8</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s12</span><span class='hs-layout'>,</span> <span class='hs-num'>0x8b44f7af</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s13</span><span class='hs-layout'>,</span> <span class='hs-num'>0xffff5bb1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s14</span><span class='hs-layout'>,</span> <span class='hs-num'>0x895cd7be</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s11</span><span class='hs-layout'>,</span> <span class='hs-num'>0x6b901122</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s12</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfd987193</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s13</span><span class='hs-layout'>,</span> <span class='hs-num'>0xa679438e</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-11"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s14</span><span class='hs-layout'>,</span> <span class='hs-num'>0x49b40821</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-12"></a><span class='hs-varop'>></span> <span class='hs-varid'>r2</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>s21</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf61e2562</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s22</span><span class='hs-layout'>,</span> <span class='hs-num'>0xc040b340</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s23</span><span class='hs-layout'>,</span> <span class='hs-num'>0x265e5a51</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-13"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s24</span><span class='hs-layout'>,</span> <span class='hs-num'>0xe9b6c7aa</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s21</span><span class='hs-layout'>,</span> <span class='hs-num'>0xd62f105d</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s22</span><span class='hs-layout'>,</span> <span class='hs-num'>0x2441453</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-14"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s23</span><span class='hs-layout'>,</span> <span class='hs-num'>0xd8a1e681</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s24</span><span class='hs-layout'>,</span> <span class='hs-num'>0xe7d3fbc8</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s21</span><span class='hs-layout'>,</span> <span class='hs-num'>0x21e1cde6</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-15"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s22</span><span class='hs-layout'>,</span> <span class='hs-num'>0xc33707d6</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s23</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf4d50d87</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s24</span><span class='hs-layout'>,</span> <span class='hs-num'>0x455a14ed</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-16"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s21</span><span class='hs-layout'>,</span> <span class='hs-num'>0xa9e3e905</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s22</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfcefa3f8</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s23</span><span class='hs-layout'>,</span> <span class='hs-num'>0x676f02d9</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-17"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s24</span><span class='hs-layout'>,</span> <span class='hs-num'>0x8d2a4c8a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-18"></a><span class='hs-varop'>></span> <span class='hs-varid'>r3</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>s31</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfffa3942</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s32</span><span class='hs-layout'>,</span> <span class='hs-num'>0x8771f681</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s33</span><span class='hs-layout'>,</span> <span class='hs-num'>0x6d9d6122</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-19"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s34</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfde5380c</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s31</span><span class='hs-layout'>,</span> <span class='hs-num'>0xa4beea44</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s32</span><span class='hs-layout'>,</span> <span class='hs-num'>0x4bdecfa9</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-20"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s33</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf6bb4b60</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s34</span><span class='hs-layout'>,</span> <span class='hs-num'>0xbebfbc70</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s31</span><span class='hs-layout'>,</span> <span class='hs-num'>0x289b7ec6</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-21"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s32</span><span class='hs-layout'>,</span> <span class='hs-num'>0xeaa127fa</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s33</span><span class='hs-layout'>,</span> <span class='hs-num'>0xd4ef3085</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s34</span><span class='hs-layout'>,</span> <span class='hs-num'>0x4881d05</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-22"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s31</span><span class='hs-layout'>,</span> <span class='hs-num'>0xd9d4d039</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s32</span><span class='hs-layout'>,</span> <span class='hs-num'>0xe6db99e5</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s33</span><span class='hs-layout'>,</span> <span class='hs-num'>0x1fa27cf8</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-23"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s34</span><span class='hs-layout'>,</span> <span class='hs-num'>0xc4ac5665</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-24"></a><span class='hs-varop'>></span> <span class='hs-varid'>r4</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>s41</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf4292244</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s42</span><span class='hs-layout'>,</span> <span class='hs-num'>0x432aff97</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s43</span><span class='hs-layout'>,</span> <span class='hs-num'>0xab9423a7</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-25"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s44</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfc93a039</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s41</span><span class='hs-layout'>,</span> <span class='hs-num'>0x655b59c3</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s42</span><span class='hs-layout'>,</span> <span class='hs-num'>0x8f0ccc92</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-26"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s43</span><span class='hs-layout'>,</span> <span class='hs-num'>0xffeff47d</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s44</span><span class='hs-layout'>,</span> <span class='hs-num'>0x85845dd1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s41</span><span class='hs-layout'>,</span> <span class='hs-num'>0x6fa87e4f</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-27"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s42</span><span class='hs-layout'>,</span> <span class='hs-num'>0xfe2ce6e0</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s43</span><span class='hs-layout'>,</span> <span class='hs-num'>0xa3014314</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s44</span><span class='hs-layout'>,</span> <span class='hs-num'>0x4e0811a1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-28"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s41</span><span class='hs-layout'>,</span> <span class='hs-num'>0xf7537e82</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s42</span><span class='hs-layout'>,</span> <span class='hs-num'>0xbd3af235</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>s43</span><span class='hs-layout'>,</span> <span class='hs-num'>0x2ad7d2bb</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-29"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>s44</span><span class='hs-layout'>,</span> <span class='hs-num'>0xeb86d391</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-30"></a><span class='hs-varop'>></span> <span class='hs-varid'>s11</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>7</span> <a name="line-31"></a><span class='hs-varop'>></span> <span class='hs-varid'>s12</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>12</span> <a name="line-32"></a><span class='hs-varop'>></span> <span class='hs-varid'>s13</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>17</span> <a name="line-33"></a><span class='hs-varop'>></span> <span class='hs-varid'>s14</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>22</span> <a name="line-34"></a><span class='hs-varop'>></span> <span class='hs-varid'>s21</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>5</span> <a name="line-35"></a><span class='hs-varop'>></span> <span class='hs-varid'>s22</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>9</span> <a name="line-36"></a><span class='hs-varop'>></span> <span class='hs-varid'>s23</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>14</span> <a name="line-37"></a><span class='hs-varop'>></span> <span class='hs-varid'>s24</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>20</span> <a name="line-38"></a><span class='hs-varop'>></span> <span class='hs-varid'>s31</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span> <a name="line-39"></a><span class='hs-varop'>></span> <span class='hs-varid'>s32</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>11</span> <a name="line-40"></a><span class='hs-varop'>></span> <span class='hs-varid'>s33</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>16</span> <a name="line-41"></a><span class='hs-varop'>></span> <span class='hs-varid'>s34</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>23</span> <a name="line-42"></a><span class='hs-varop'>></span> <span class='hs-varid'>s41</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>6</span> <a name="line-43"></a><span class='hs-varop'>></span> <span class='hs-varid'>s42</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>10</span> <a name="line-44"></a><span class='hs-varop'>></span> <span class='hs-varid'>s43</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>15</span> <a name="line-45"></a><span class='hs-varop'>></span> <span class='hs-varid'>s44</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>21</span> </pre> ======================== CONVERSION FUNCTIONS ======================== Turn the 4 32 bit words into a string representing the hex number they represent. <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>abcd_to_string</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>abcd_to_string</span> <span class='hs-layout'>(</span><span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-varop'>$</span> <span class='hs-varid'>map</span> <span class='hs-varid'>display_32bits_as_hex</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span> </pre> Split the 32 bit word up, swap the chunks over and convert the numbers to their hex equivalents. <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>display_32bits_as_hex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>display_32bits_as_hex</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>swap_pairs</span> <span class='hs-varid'>cs</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>getc</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftR</span> <span class='hs-varid'>w</span> <span class='hs-layout'>(</span><span class='hs-num'>4</span><span class='hs-varop'>*</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>15</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-num'>7</span><span class='hs-keyglyph'>]</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-varid'>getc</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-chr'>'0'</span><span class='hs-keyglyph'>..</span><span class='hs-chr'>'9'</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'a'</span><span class='hs-keyglyph'>..</span><span class='hs-chr'>'f'</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-varop'>!!</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-varid'>swap_pairs</span> <span class='hs-layout'>(</span><span class='hs-varid'>x1</span><span class='hs-conop'>:</span><span class='hs-varid'>x2</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x2</span><span class='hs-conop'>:</span><span class='hs-varid'>x1</span><span class='hs-conop'>:</span><span class='hs-varid'>swap_pairs</span> <span class='hs-varid'>xs</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-varid'>swap_pairs</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> </pre> Convert to an integer, performing endianness magic as we go <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>abcd_to_integer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>abcd_to_integer</span> <span class='hs-layout'>(</span><span class='hs-conid'>ABCD</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rev_num</span> <span class='hs-varid'>a</span> <span class='hs-varop'>*</span> <span class='hs-num'>2</span><span class='hs-varop'>^</span><span class='hs-layout'>(</span><span class='hs-num'>96</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-varop'>+</span> <span class='hs-varid'>rev_num</span> <span class='hs-varid'>b</span> <span class='hs-varop'>*</span> <span class='hs-num'>2</span><span class='hs-varop'>^</span><span class='hs-layout'>(</span><span class='hs-num'>64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-varop'>+</span> <span class='hs-varid'>rev_num</span> <span class='hs-varid'>c</span> <span class='hs-varop'>*</span> <span class='hs-num'>2</span><span class='hs-varop'>^</span><span class='hs-layout'>(</span><span class='hs-num'>32</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-varop'>+</span> <span class='hs-varid'>rev_num</span> <span class='hs-varid'>d</span> </pre> <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>rev_num</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Integer</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>rev_num</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toInteger</span> <span class='hs-varid'>j</span> <span class='hs-varop'>`mod`</span> <span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>^</span><span class='hs-layout'>(</span><span class='hs-num'>32</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-comment'>-- NHC's fault ~~~~~~~~~~~~~~~~~~~~~</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>j</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>so_far</span> <span class='hs-varid'>next</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>so_far</span> <span class='hs-num'>8</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftR</span> <span class='hs-varid'>i</span> <span class='hs-varid'>next</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>255</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-num'>8</span><span class='hs-layout'>,</span><span class='hs-num'>16</span><span class='hs-layout'>,</span><span class='hs-num'>24</span><span class='hs-keyglyph'>]</span> </pre> Used to convert a 64 byte string to 16 32bit words <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>string_to_word32s</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>string_to_word32s</span> <span class='hs-str'>""</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>string_to_word32s</span> <span class='hs-varid'>ss</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>this</span><span class='hs-conop'>:</span><span class='hs-varid'>string_to_word32s</span> <span class='hs-varid'>ss'</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>ss'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>4</span> <span class='hs-varid'>ss</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-varid'>this</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>c</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>w</span> <span class='hs-num'>8</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span><span class='hs-varop'>.</span><span class='hs-varid'>ord</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varid'>s</span> </pre> Used to convert a list of 512 bools to 16 32bit words <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>bools_to_word32s</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Bool</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Word32</span><span class='hs-keyglyph'>]</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>bools_to_word32s</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>bools_to_word32s</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>this</span><span class='hs-conop'>:</span><span class='hs-varid'>bools_to_word32s</span> <span class='hs-varid'>rest</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>bs1</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs1'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>8</span> <span class='hs-varid'>bs</span> <a name="line-5"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>bs2</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs2'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>8</span> <span class='hs-varid'>bs1'</span> <a name="line-6"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>bs3</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs3'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>8</span> <span class='hs-varid'>bs2'</span> <a name="line-7"></a><span class='hs-varop'>></span> <span class='hs-layout'>(</span><span class='hs-varid'>bs4</span><span class='hs-layout'>,</span> <span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-num'>8</span> <span class='hs-varid'>bs3'</span> <a name="line-8"></a><span class='hs-varop'>></span> <span class='hs-varid'>this</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>boolss_to_word32</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>bs1</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs2</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs3</span><span class='hs-layout'>,</span> <span class='hs-varid'>bs4</span><span class='hs-keyglyph'>]</span> <a name="line-9"></a><span class='hs-varop'>></span> <span class='hs-varid'>bools_to_word8</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>w</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>w</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>then</span> <span class='hs-num'>1</span> <span class='hs-keyword'>else</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <a name="line-10"></a><span class='hs-varop'>></span> <span class='hs-varid'>boolss_to_word32</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>w8</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>shiftL</span> <span class='hs-varid'>w</span> <span class='hs-num'>8</span> <span class='hs-varop'>+</span> <span class='hs-varid'>bools_to_word8</span> <span class='hs-varid'>w8</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> </pre> Convert the size into a list of characters used by the len_pad function for strings <pre><a name="line-1"></a><span class='hs-varop'>></span> <span class='hs-definition'>length_to_chars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Zord64</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-2"></a><span class='hs-varop'>></span> <span class='hs-definition'>length_to_chars</span> <span class='hs-num'>0</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> <a name="line-3"></a><span class='hs-varop'>></span> <span class='hs-definition'>length_to_chars</span> <span class='hs-varid'>p</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>this</span><span class='hs-conop'>:</span><span class='hs-varid'>length_to_chars</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftR</span> <span class='hs-varid'>n</span> <span class='hs-num'>8</span><span class='hs-layout'>)</span> <a name="line-4"></a><span class='hs-varop'>></span> <span class='hs-keyword'>where</span> <span class='hs-varid'>this</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>chr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>n</span> <span class='hs-varop'>.&.</span> <span class='hs-num'>255</span> </pre> </body> </html>