summaryrefslogtreecommitdiff
path: root/Data/Digest/CRC24.hs
blob: 463783454cec14e18614aea2f97dd8741ef75eae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- CRC24.hs: OpenPGP (RFC4880) CRC24 implementation
-- Copyright Ⓒ 2012  Clint Adams
-- This software is released under the terms of the ISC license.
-- (See the LICENSE file).

module Data.Digest.CRC24 (
  crc24
) where

import Data.Bits (shiftL, (.&.), xor)
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import Data.Word (Word8, Word32)

crc24_init :: Word32
crc24_init = 0xB704CE

crc24_poly :: Word32
crc24_poly = 0x1864CFB

crc24_update :: Word32 -> Word8 -> Word32
crc24_update c b = (last . take 9 $ iterate (\x -> if (shiftL x 1) .&. 0x1000000 == 0x1000000 then shiftL x 1 `xor` crc24_poly else shiftL x 1) (c `xor` shiftL (fromIntegral b) 16)) .&. 0xFFFFFF

crc24 :: ByteString -> Word32
crc24 bs = B.foldl crc24_update crc24_init bs