From 82edb7a9ca1a8e98f86421f6fe8a0928ec9f1b5e Mon Sep 17 00:00:00 2001 From: server Date: Fri, 11 Aug 2023 13:16:12 -0400 Subject: [PATCH] Fri Aug 11 01:16:12 PM EDT 2023 --- bin/CryptoFoleo.h | 44 +--- bin/libCryptoFoleo.so | Bin 44592 -> 40320 bytes build | 9 - build.sh | 1 + src/headers.hs | 339 +++++++++++++++++++++++++ tests/PRF_JBP.pdf | Bin 0 -> 68227 bytes tests/cases.c | 42 ++- tests/{rfc4231.txt.pdf => rfc4231.pdf} | Bin tests/{rfc5869.txt.pdf => rfc5869.pdf} | Bin tests/test.c | 21 +- 10 files changed, 410 insertions(+), 46 deletions(-) delete mode 100755 build create mode 100644 src/headers.hs create mode 100644 tests/PRF_JBP.pdf rename tests/{rfc4231.txt.pdf => rfc4231.pdf} (100%) rename tests/{rfc5869.txt.pdf => rfc5869.pdf} (100%) diff --git a/bin/CryptoFoleo.h b/bin/CryptoFoleo.h index 0aba4e2..da94f6d 100644 --- a/bin/CryptoFoleo.h +++ b/bin/CryptoFoleo.h @@ -1,17 +1,17 @@ #include #include -uint8_t* foleo_chacha20(uint8_t[32], uint8_t[12], uint32_t, size_t); -uint8_t* foleo_chacha20_poly1305(uint8_t[32], uint8_t[12], uint8_t*, size_t); +uint8_t* foleo_chacha20(uint8_t[32], uint8_t[12], uint32_t, uint64_t); +uint8_t* foleo_chacha20_poly1305(uint8_t[32], uint8_t[12], uint8_t*, uint64_t); uint8_t* foleo_dhke(uint8_t*, uint8_t*); -uint16_t foleo_dhke_modsize(); - -uint8_t* foleo_poly1305(uint8_t*, uint8_t*, uint8_t*, size_t); -#define FOLEO_RSA_PADDING_NONE 99 -#define FOLEO_RSA_PADDING_ENCRYPTION 1 -#define FOLEO_RSA_PADDING_SIGNATURE 2 -#define FOLEO_RSA_PADDING_OAEP 3 -#define FOLEO_RSA_PADDING_PSS 4 +uint8_t* foleo_dhke_prf(uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t); +uint8_t* foleo_poly1305(uint8_t*, uint8_t*, uint8_t*, uint64_t); +static uint8_t* foleo_prigen(uint16_t); +#define FOLEO_RSA_NONE 99 +#define FOLEO_RSA_ENCRYPTION 1 +#define FOLEO_RSA_SIGNATURE 2 +#define FOLEO_RSA_OAEP 3 +#define FOLEO_RSA_PSS 4 typedef struct { mpz_t n, k; @@ -22,25 +22,9 @@ void foleo_rsa_import(rsakey_t*, uint8_t*); uint8_t* foleo_rsa_export(rsakey_t*); void foleo_rsa_free(rsakey_t*); void foleo_rsa_keygen(uint16_t, rsakey_t*, rsakey_t*); - -//The maximum message block size that can be used -// for a particular padding scheme. -uint16_t foleo_rsa_msgsize(rsakey_t*, uint8_t); - -//Size of the rsakey struct uint16_t foleo_rsa_keysize(); - -//Size in bytes of RSA modulus, same thing as the number -// of bytes the encrypt() function will return -uint16_t foleo_rsa_modsize(rsakey_t*); - -uint8_t* foleo_rsa_encrypt(rsakey_t*, uint8_t, uint8_t*, uint16_t); -uint8_t* foleo_rsa_decrypt(rsakey_t*, uint8_t, uint8_t*, uint16_t*); +uint16_t foleo_rsa_size(rsakey_t, uint8_t); +uint8_t* foleo_rsa_encrypt(rsakey_t, uint8_t, uint8_t*, uint16_t); +uint8_t* foleo_rsa_decrypt(rsakey_t, uint8_t, uint8_t*, uint16_t*); uint8_t* foleo_sha256(uint8_t*, uint32_t); - -#define FOLEO_SHA256 1 -uint8_t* foleo_hmac(uint8_t, uint8_t*, uint32_t, uint8_t*, uint32_t); -uint8_t* foleo_hmac_hkdf(uint8_t, uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t); -uint8_t* foleo_hmac_prf(uint8_t, uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t, uint8_t*, uint32_t); - -uint8_t foleo_hash_size(uint8_t); \ No newline at end of file +#define FOLEO_SHA256 foleo_sha256, 32, 64 diff --git a/bin/libCryptoFoleo.so b/bin/libCryptoFoleo.so index 18ffc9391c7b267692d897a6deda60e2005a067d..a40af30c168b0817911d8afc70515a2e11a04fa8 100755 GIT binary patch delta 12766 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 p`2{j!-$MZ}a17%65`#)#;<>Z_GdutQ delta 13480 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 diff --git a/build b/build deleted file mode 100755 index 0b2e461..0000000 --- a/build +++ /dev/null @@ -1,9 +0,0 @@ -if [ "$1" == "test" ] -then - gcc tests/test.c -o bin/test -lgmp -DDEVICE='"/dev/random"' - bin/test - rm bin/test -else - gcc -shared -fPIC src/all.c -o bin/libCryptoFoleo.so -lgmp -DDEVICE='"/dev/random"' - cp src/headers.h bin/CryptoFoleo.h -fi diff --git a/build.sh b/build.sh index 54195d1..950dc7a 100644 --- a/build.sh +++ b/build.sh @@ -11,4 +11,5 @@ then else gcc -shared -fPIC src/all.c -o bin/libCryptoFoleo.so -lgmp -DDEVICE='"/dev/random"' cp src/headers.h bin/CryptoFoleo.h + cp src/headers.hs bin/CryptoFoleo.hs fi diff --git a/src/headers.hs b/src/headers.hs new file mode 100644 index 0000000..7a2746b --- /dev/null +++ b/src/headers.hs @@ -0,0 +1,339 @@ +module CryptoFoleo + ( + dhke, + chacha20, + poly1305, + + rsa_keygen, + rsa_import, + rsa_export, + rsa_encrypt, + rsa_decrypt, + + sha256, + hash_sha256, + hmac, + hmac_prf, + hmac_hkdf, + + rsa_padding_none, + rsa_padding_encryption, + rsa_padding_signature, + rsa_padding_oaep, + rsa_padding_pss, + + byteStringToHexString + ) +where +import System.IO as IO +import Foreign +import Foreign.C.Types +import Foreign.C.String +import Data.ByteString as BS +import Data.ByteString.Internal +import Data.Word +import Data.ByteString.Unsafe +import Control.DeepSeq +import Control.Monad +import qualified Data.ByteString.Internal as BI +import qualified Foreign.Marshal.Utils as MU +import qualified Data.ByteString.Char8 as C8 + +foreign import ccall unsafe "foleo_rsa_keysize" + c_rsa_keysize :: IO (CUShort) + +foreign import ccall unsafe "foleo_rsa_modsize" + c_rsa_modsize :: Ptr () -> IO (CUShort) + +foreign import ccall unsafe "foleo_rsa_keygen" + c_rsa_keygen :: CUShort -> Ptr () -> Ptr () -> IO () + +foreign import ccall unsafe "foleo_rsa_export" + c_rsa_export :: Ptr () -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_rsa_import" + c_rsa_import :: Ptr (CUChar) -> Ptr () -> IO () + +foreign import ccall unsafe "foleo_rsa_free" + c_rsa_free :: Ptr () -> IO () + +foreign import ccall unsafe "foleo_rsa_encrypt" + c_rsa_encrypt :: Ptr () -> CUChar -> Ptr (CUChar) -> CUShort -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_rsa_decrypt" + c_rsa_decrypt :: Ptr () -> CUChar -> Ptr (CUChar) -> Ptr (CUShort) -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_dhke_modsize" + c_dhke_modsize :: IO (CUShort) + +foreign import ccall unsafe "foleo_dhke" + c_dhke :: Ptr (CUChar) -> Ptr (CUChar) -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_sha256" + c_sha256 :: Ptr (CUChar) -> Word32 -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_hash_size" + c_hash_size :: CUChar -> IO (CUChar) + +foreign import ccall unsafe "foleo_hmac" + c_hmac :: CUChar -> Ptr (CUChar) -> Word32 -> Ptr (CUChar) -> Word32 -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_hmac_prf" + c_hmac_prf :: CUChar -> Word32 -> Ptr (CUChar) -> Word32 -> Ptr (CUChar) -> Word32 -> Ptr (CUChar) -> Word32 -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_hmac_hkdf" + c_hmac_hkdf :: CUChar -> Word32 -> Ptr (CUChar) -> Word32 -> Ptr (CUChar) -> Word32 -> Ptr (CUChar) -> Word32 -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_chacha20" + c_chacha20 :: Ptr (CUChar) -> Ptr (CUChar) -> Word32 -> CSize -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_poly1305" + c_poly1305 :: Ptr (CUChar) -> Ptr (CUChar) -> Ptr (CUChar) -> CSize -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "foleo_chacha20_poly1305" + c_chacha20_poly1305 :: Ptr (CUChar) -> Ptr (CUChar) -> Ptr (CUChar) -> CSize -> IO (Ptr (CUChar)) + +foreign import ccall unsafe "free" + c_free :: Ptr a -> IO () + +rsa_padding_none :: Int +rsa_padding_none = 99 + +rsa_padding_encryption :: Int +rsa_padding_encryption = 1 + +rsa_padding_signature :: Int +rsa_padding_signature = 2 + +rsa_padding_oaep :: Int +rsa_padding_oaep = 3 + +rsa_padding_pss :: Int +rsa_padding_pss = 4 + +hash_sha256 :: Int +hash_sha256 = 1 + +rsa_encrypt :: ByteString -> Int -> ByteString-> IO (ByteString) +rsa_encrypt keyBS padType ptBS = do + useAsCString keyBS $ \keyPtr -> do + useAsCString ptBS $ \ptPtr -> do + sModSize <- c_rsa_modsize (castPtr keyPtr) + ctPtr <- c_rsa_encrypt (castPtr keyPtr) (fromIntegral padType) (castPtr ptPtr) (fromIntegral (BS.length ptBS)) + ctBS <- BI.create (fromIntegral sModSize) (\ptr -> MU.copyBytes ptr (castPtr ctPtr) (fromIntegral sModSize)) + c_free ctPtr + return ctBS + +rsa_decrypt :: ByteString -> Int -> ByteString -> IO (ByteString) +rsa_decrypt keyBS padType ctBS = do + useAsCString keyBS $ \keyPtr -> do + useAsCString ctBS $ \ctPtr -> do + sModSize <- c_rsa_modsize (castPtr keyPtr) + allocaBytes 2 $ \sizePtr -> do + ptPtr <- c_rsa_decrypt (castPtr keyPtr) (fromIntegral padType) (castPtr ctPtr) (castPtr sizePtr) + if ptPtr == nullPtr then do + return BS.empty + else do + ptSize <- peek sizePtr + ptBS <- BI.create ptSize (\ptr -> MU.copyBytes ptr (castPtr ptPtr) ptSize) + c_free ptPtr + return ptBS + +rsa_keygen :: Word16 -> (ByteString -> ByteString -> IO ()) -> IO () +rsa_keygen n fn = do + sKeySize <- c_rsa_keysize + let keySize :: Int + keySize = fromIntegral sKeySize + allocaBytes keySize $ \pubKeyPtr -> + allocaBytes keySize $ \prvKeyPtr -> do + c_rsa_keygen (fromIntegral n) pubKeyPtr prvKeyPtr + pubKey <- BI.create keySize (\ptr -> MU.copyBytes ptr (castPtr pubKeyPtr) keySize) + prvKey <- BI.create keySize (\ptr -> MU.copyBytes ptr (castPtr prvKeyPtr) keySize) + fn pubKey prvKey + rsa_free pubKey + rsa_free prvKey + +rsa_import :: String -> (ByteString -> IO ()) -> IO () +rsa_import n fn = do + sKeySize <- c_rsa_keysize + let keySize :: Int + keySize = fromIntegral sKeySize + unsafeUseAsCStringLen (C8.pack n) $ \(bsPtr, len) -> do + allocaBytes keySize $ \keyPtr -> do + c_rsa_import keyPtr (castPtr bsPtr) + key <- BI.create keySize (\ptr -> MU.copyBytes ptr (castPtr keyPtr) keySize) + fn key + rsa_free key + +rsa_export :: ByteString -> IO (String) +rsa_export keyBS = do + useAsCString keyBS $ \keyPtr -> do + cStrPtr <- c_rsa_export (castPtr keyPtr) + cStr <- peekCString (castPtr cStrPtr) + c_free cStrPtr + return cStr + +rsa_free :: ByteString -> IO() +rsa_free blob = useAsCString blob $ \ptr -> c_rsa_free (castPtr ptr) + +dhke :: (ByteString, ByteString) -> IO (ByteString) +dhke v = do + c_modSize <- c_dhke_modsize + let modSize = fromIntegral c_modSize + if ((BS.length(fst v) + BS.length(snd v)) == 0) then do + secretPtr <- c_dhke nullPtr nullPtr + bsPtr <- BI.create modSize (\ptr -> MU.copyBytes ptr (castPtr secretPtr) modSize) + c_free secretPtr + return bsPtr + else if (BS.length(snd v) == 0) then do + useAsCString (fst v) $ \secretPtr -> do + sharePtr <- c_dhke (castPtr secretPtr) nullPtr + bsPtr <- BI.create modSize (\ptr -> MU.copyBytes ptr (castPtr sharePtr) modSize) + c_free sharePtr + return bsPtr + else if (BS.length(snd v) > 0) then do + useAsCString (fst v) $ \secretPtr -> do + useAsCString (snd v) $ \sharePtr -> do + keyPtr <- c_dhke (castPtr secretPtr) (castPtr sharePtr) + bsPtr <- BI.create modSize (\ptr -> MU.copyBytes ptr (castPtr keyPtr) modSize) + c_free keyPtr + return bsPtr + else return BS.empty + +sha256 :: ByteString -> IO (String) +sha256 ptBS = do + let ptSize :: Word32 + ptSize = fromIntegral (BS.length ptBS) + useAsCString ptBS $ \ptPtr -> do + hPtr <- c_sha256 (castPtr ptPtr) (fromIntegral ptSize) + hBS <- BI.create 32 (\ptr -> MU.copyBytes ptr (castPtr hPtr) 32) + c_free hPtr + return (byteStringToHexString hBS) + +hmac :: Int -> ByteString -> ByteString -> IO (ByteString) +hmac h k m = do + useAsCString k $ \kPtr -> do + useAsCString m $ \mPtr -> do + rPtr <- c_hmac (fromIntegral h) (castPtr kPtr) (fromIntegral (BS.length k)) (castPtr mPtr) (fromIntegral (BS.length m)) + if rPtr == nullPtr then do + return BS.empty + else do + size <- c_hash_size (fromIntegral h) + r <- BI.create (fromIntegral size) (\ptr -> MU.copyBytes ptr (castPtr rPtr) (fromIntegral size)) + c_free rPtr + return r + +hmac_prf :: Int -> Int -> ByteString -> ByteString -> ByteString -> IO (ByteString) +hmac_prf hf db sc lb sd = do + useAsCString sc $ \scPtr -> do + useAsCString lb $ \lbPtr -> do + useAsCString sd $ \sdPtr -> do + rPtr <- c_hmac_prf (fromIntegral hf) (fromIntegral db) (castPtr scPtr) (fromIntegral (BS.length sc)) (castPtr lbPtr) (fromIntegral (BS.length lb)) (castPtr sdPtr) (fromIntegral (BS.length sd)) + if rPtr == nullPtr then do + return BS.empty + else do + r <- BI.create db (\ptr -> MU.copyBytes ptr (castPtr rPtr) db) + c_free rPtr + return r + +hmac_hkdf :: Int -> Int -> ByteString -> ByteString -> ByteString -> IO (ByteString) +hmac_hkdf hf db sc lb sd = do + useAsCString sc $ \scPtr -> do + useAsCString lb $ \lbPtr -> do + useAsCString sd $ \sdPtr -> do + rPtr <- c_hmac_hkdf (fromIntegral hf) (fromIntegral db) (castPtr scPtr) (fromIntegral (BS.length sc)) (castPtr lbPtr) (fromIntegral (BS.length lb)) (castPtr sdPtr) (fromIntegral (BS.length sd)) + if rPtr == nullPtr then do + return BS.empty + else do + r <- BI.create db (\ptr -> MU.copyBytes ptr (castPtr rPtr) db) + c_free rPtr + return r + +chacha20 :: ByteString -> ByteString -> Int -> Int -> IO (ByteString) +chacha20 key nonce block count = do + if (BS.length key) /= 32 || (BS.length nonce) /= 12 || block < 0 || count < 0 then + return BS.empty + else + useAsCString key $ \keyPtr -> do + useAsCString nonce $ \noncePtr -> do + rPtr <- c_chacha20 (castPtr keyPtr) (castPtr noncePtr) (fromIntegral block) (fromIntegral count) + r <- BI.create count (\ptr -> MU.copyBytes ptr (castPtr rPtr) count) + c_free rPtr + return r + +poly1305 :: ByteString -> ByteString -> ByteString -> IO (ByteString) +poly1305 r s m = do + if (BS.length r /= 16) || (BS.length s /= 16) then + return BS.empty + else + useAsCString r $ \rPtr -> do + useAsCString s $ \sPtr -> do + useAsCString m $ \mPtr -> do + hPtr <- c_poly1305 (castPtr rPtr) (castPtr sPtr) (castPtr mPtr) (fromIntegral (BS.length m)) + h <- BI.create 16 (\ptr -> MU.copyBytes ptr (castPtr hPtr) 16) + c_free hPtr + return h + +chacha20_poly1305 :: ByteString -> ByteString -> ByteString -> IO (ByteString) +chacha20_poly1305 key nonce ctext = do + if (BS.length key) /= 32 || (BS.length nonce) /= 12 then + return BS.empty + else + useAsCString key $ \keyPtr -> do + useAsCString nonce $ \noncePtr -> do + useAsCString ctext $ \ctextPtr -> do + rPtr <- c_chacha20_poly1305 (castPtr keyPtr) (castPtr noncePtr) (castPtr ctextPtr) (fromIntegral (BS.length ctext)) + r <- BI.create 16 (\ptr -> MU.copyBytes ptr (castPtr rPtr) 16) + c_free rPtr + return r + + +byteToHexString :: Word8 -> String +byteToHexString b = do + case (div b 16) of + 0 -> "0" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + 5 -> "5" + 6 -> "6" + 7 -> "7" + 8 -> "8" + 9 -> "9" + 10 -> "a" + 11 -> "b" + 12 -> "c" + 13 -> "d" + 14 -> "e" + 15 -> "f" + _ -> "0" + ++ + case (mod b 16) of + 0 -> "0" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + 5 -> "5" + 6 -> "6" + 7 -> "7" + 8 -> "8" + 9 -> "9" + 10 -> "a" + 11 -> "b" + 12 -> "c" + 13 -> "d" + 14 -> "e" + 15 -> "f" + _ -> "0" + + +byteStringToByteList :: ByteString -> [Word8] +byteStringToByteList b = BS.unpack b + +byteStringToHexString :: ByteString -> String +byteStringToHexString b = Prelude.foldr (\i s -> (byteToHexString i) ++ s) "" (byteStringToByteList b) + +byteStringToInteger :: ByteString -> Integer +byteStringToInteger = foldl' (\acc byte -> acc * 256 + fromIntegral byte) 0 diff --git a/tests/PRF_JBP.pdf b/tests/PRF_JBP.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea1933f5b65ba0d32148deec4cc963f42dda1b1e GIT binary patch literal 68227 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