Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > ec5844e219498f2057da8f8f3070d4a1 > files > 272

ghc-MissingH-devel-1.1.0.3-2.fc14.i686.rpm

<?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'>&gt;</span><span class='hs-comment'>{- |
<a name="line-2"></a>&gt;   Module     : Data.Hash.MD5
<a name="line-3"></a>&gt;   Copyright  : Copyright (C) 2001 Ian Lynagh 
<a name="line-4"></a>&gt;   License    : Either BSD or GPL
<a name="line-5"></a>&gt;
<a name="line-6"></a>&gt;   Maintainer : Ian Lynagh &lt;igloo@earth.li&gt;
<a name="line-7"></a>&gt;   Stability  : provisional
<a name="line-8"></a>&gt;   Portability: portable
<a name="line-9"></a>&gt;
<a name="line-10"></a>&gt;Generation of MD5sums
<a name="line-11"></a>&gt;
<a name="line-12"></a>&gt;Written by Ian Lynagh, igloo\@earth.li
<a name="line-13"></a>&gt;-}</span>
</pre>
<pre><a name="line-1"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Char</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>import</span> <span class='hs-conid'>Bits</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>rotL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rotation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word32</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span>  <span class='hs-varid'>get_next</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>  <span class='hs-comment'>--                     \      \   \------ the rest of the input</span>
<a name="line-5"></a><span class='hs-varop'>&gt;</span>  <span class='hs-comment'>--                      \      \--------- the number of bits returned</span>
<a name="line-6"></a><span class='hs-varop'>&gt;</span>  <span class='hs-comment'>--                       \--------------- the bits returned in 32bit words</span>
<a name="line-7"></a><span class='hs-varop'>&gt;</span>  <span class='hs-varid'>len_pad</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Zord64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>  <span class='hs-varid'>finished</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</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'>&gt;</span>                  <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>l</span> <span class='hs-varop'>.&amp;.</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'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</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'>&gt;</span>              <span class='hs-layout'>)</span>
<a name="line-9"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</span> <span class='hs-num'>511</span>
<a name="line-5"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span>         <span class='hs-varid'>offset</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>31</span>
<a name="line-10"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</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'>&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</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'>&gt;</span>         <span class='hs-varid'>newlen</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <span class='hs-varop'>.&amp;.</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'>&gt;</span>                <span class='hs-varop'>+</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>c64</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>511</span> <span class='hs-varop'>&gt;=</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-comment'>{- | The simplest function, gives you the MD5 of a string as 4-tuple of
<a name="line-2"></a>&gt; 32bit words. -}</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</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'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>
<a name="line-4"></a><span class='hs-varop'>&gt;</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'>&gt;</span> <span class='hs-comment'>{- | Returns a hex number ala the md5sum program. -}</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</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'>&gt;</span> <span class='hs-comment'>{- | Returns an integer equivalent to hex number from 'md5s'. -}</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>=&gt;</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</span>          <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>   <span class='hs-comment'>-- The initial state</span>
<a name="line-5"></a><span class='hs-varop'>&gt;</span>          <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>   <span class='hs-comment'>-- The resulting state</span>
<a name="line-7"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&amp;&amp;</span> <span class='hs-varid'>padded</span>
<a name="line-9"></a><span class='hs-varop'>&gt;</span>    <span class='hs-keyword'>then</span> <span class='hs-varid'>abcd</span>
<a name="line-10"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&amp;&amp;</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>512</span>
<a name="line-14"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span>              <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>     <span class='hs-comment'>-- Resulting state</span>
<a name="line-4"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</span>        <span class='hs-comment'>{-
<a name="line-7"></a>&gt;        map (\x -&gt; w !! x) [1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12]
<a name="line-8"></a>&gt;                        -- [(5 * x + 1) `mod` 16 | x &lt;- [0..15]]
<a name="line-9"></a>&gt;        map (\x -&gt; w !! x) [5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2]
<a name="line-10"></a>&gt;                        -- [(3 * x + 5) `mod` 16 | x &lt;- [0..15]]
<a name="line-11"></a>&gt;        map (\x -&gt; w !! x) [0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9]
<a name="line-12"></a>&gt;                        -- [(7 * x) `mod` 16 | x &lt;- [0..15]]
<a name="line-13"></a>&gt;        -}</span>
<a name="line-14"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</span>                                   <span class='hs-comment'>-- for those of you with a copy of</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</span>                                   <span class='hs-comment'>-- the prayer book^W^WRFC)</span>
<a name="line-4"></a><span class='hs-varop'>&gt;</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>                 <span class='hs-comment'>-- Initial state</span>
<a name="line-5"></a><span class='hs-varop'>&gt;</span>           <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>           <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>                                   <span class='hs-comment'>-- additive constants</span>
<a name="line-8"></a><span class='hs-varop'>&gt;</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>                 <span class='hs-comment'>-- Resulting state</span>
<a name="line-9"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>               <span class='hs-comment'>-- Initial state</span>
<a name="line-3"></a><span class='hs-varop'>&gt;</span>                    <span class='hs-keyglyph'>-&gt;</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'>&gt;</span>                                          <span class='hs-comment'>-- constant (X[i] + T[j])</span>
<a name="line-5"></a><span class='hs-varop'>&gt;</span>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ABCD</span>               <span class='hs-comment'>-- Resulting state</span>
<a name="line-6"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>md5_f</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word32</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>.&amp;.</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'>&gt;</span> <span class='hs-comment'>{- optimised version of: (x .&amp;. y) .|. ((complement x) .&amp;. z) -}</span>
</pre>
<pre><a name="line-1"></a><span class='hs-varop'>&gt;</span> <span class='hs-definition'>md5_g</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word32</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</span> <span class='hs-comment'>{- was: (x .&amp;. z) .|. (y .&amp;. (complement z)) -}</span>
</pre>
<pre><a name="line-1"></a><span class='hs-varop'>&gt;</span> <span class='hs-definition'>md5_h</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word32</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</span> <span class='hs-definition'>md5_i</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>XYZ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Word32</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>abcd_to_string</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>-&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>abcd_to_integer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ABCD</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>rev_num</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Word32</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</span>  <span class='hs-comment'>--         NHC's fault ~~~~~~~~~~~~~~~~~~~~~</span>
<a name="line-4"></a><span class='hs-varop'>&gt;</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'>-&gt;</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'>.&amp;.</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'>&gt;</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'>&gt;</span> <span class='hs-definition'>string_to_word32s</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</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'>-&gt;</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'>&gt;</span> <span class='hs-definition'>length_to_chars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Zord64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-2"></a><span class='hs-varop'>&gt;</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'>&gt;</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'>&gt;</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'>.&amp;.</span> <span class='hs-num'>255</span>
</pre>
</body>
</html>