Skip to content

Instantly share code, notes, and snippets.

@Kleidukos
Last active November 28, 2022 16:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kleidukos/31346d067f309f2a86cbd97a85c0f1e8 to your computer and use it in GitHub Desktop.
Save Kleidukos/31346d067f309f2a86cbd97a85c0f1e8 to your computer and use it in GitHub Desktop.
module Signing where
data SignedMessage = SignedMessage
{ messageLength :: CSize
, messageForeignPtr :: ForeignPtr CUChar
, signatureForeignPtr :: ForeignPtr CUChar
}
deriving stock
( Eq
-- ^ @since 0.0.1.0
, Ord
-- ^ @since 0.0.1.0
, Show
-- ^ @since 0.0.1.0
)
instance Storable SignedMessage where
sizeOf (SignedMessage{messageLength}) =
sizeOf (undefined :: CSize) + fromIntegral messageLength + sizeOf cryptoSignBytes
alignment _ = alignment (undefined :: CSize)
poke ptr (SignedMessage messageLength messageForeignPtr signatureForeignPtr) =
Foreign.withForeignPtr messageForeignPtr $ \messagePtr ->
Foreign.withForeignPtr signatureForeignPtr $ \signaturePtr -> do
Foreign.pokeByteOff ptr 0 messageLength
Foreign.pokeByteOff ptr (sizeOf messageLength + 1) messagePtr
Foreign.pokeByteOff ptr (sizeOf messagePtr + 1) signaturePtr
peek ptr = do
(messageLength :: CSize) <- Foreign.peek (Foreign.castPtr ptr)
messageForeignPtr <- mallocForeignPtrBytes @CUChar (fromIntegral messageLength)
signatureForeignPtr <- mallocForeignPtrBytes @CUChar (fromIntegral cryptoSignBytes)
withForeignPtr messageForeignPtr $ \messagePtr ->
withForeignPtr signatureForeignPtr $ \signaturePtr -> do
-- Copy the message
let movedMessagePtr = plusPtr ptr (fromIntegral @CSize @Int messageLength)
messageStart = sizeOf messageLength
messageEnd = fromIntegral @CSize @Int messageLength - 1
traverse_
( \index ->
peek @CUChar (plusPtr movedMessagePtr index)
>>= poke (plusPtr messagePtr index)
)
[messageStart .. messageEnd]
-- Copy the signature
-- Foreign.copyArray signaturePtr (Foreign.castPtr ptr) (fromIntegral cryptoSignBytes)
let signatureStart = messageEnd
let movedsignaturePtr = plusPtr movedMessagePtr messageEnd
let signatureEnd = fromIntegral @CSize @Int cryptoSignBytes
traverse_
( \index ->
peek @CUChar (plusPtr movedsignaturePtr index)
>>= poke (plusPtr signaturePtr index)
)
[signatureStart .. signatureEnd]
pure $ SignedMessage messageLength messageForeignPtr signatureForeignPtr
━━━ Exception (ErrorCall) ━━━
Prelude.undefined
CallStack (from HasCallStack):
error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err
undefined, called at libraries/base/Foreign/Marshal/Array.hs:86:49 in base:Foreign.Marshal.Array
This failure can be reproduced by running:
> recheck (Size 0) (Seed 4438969370936790283 8332183577313219779) <property>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment