haskell / haskell/bytestring

Adding a `constEq` (or similar) function for security use cases

Open
#697 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Haskell
Stars
301
Forks
144
Avg merge
7d 22h
Merged PRs (30d)
1

Description

To prevent timing attacks, sometimes you'd want to compare bytes (like hashes) in constant time, since this can give the attacker information on how far they have matched the bytes.

This is a semi-quick example of what it might/would look like (did not compile, might have errors)
(based it off of `constEq` from the `memory` package)

```hs
constEq :: ByteString -> ByteString -> Bool
constEq (BS fptr1 len1) (BS fptr2 len2)
| len1 /= len2 = False
| otherwise = accursedUnutterablePerformIO $ do
withForeignPtr fptr1 $ \ptr1 ->
withForeignPtr fptr2 $ \ptr2 ->
let loop i !acc
| i == len1 = pure $! acc == 0
| otherwise = do
mZero <- xor <$> peekByteOff i ptr1 <*> (peekByteOff i ptr2 :: IO Word8)
loop (i + 1) (acc .|. mZero)
in loop 0 0
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.