+#ifndef __HEADERS__
+#define __HEADERS__
#include <stdint.h>
#include <gmp.h>
#define FOLEO_RSA_PADDING_SIGNATURE 2
#define FOLEO_RSA_PADDING_OAEP 3
#define FOLEO_RSA_PADDING_PSS 4
+#define FOLEO_RAND_MODE_DEVR 1
+#define FOLEO_RAND_MODE_DEV 2
+#define FOLEO_RAND_MODE_X86 3
typedef struct
{
mpz_t n, k;
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);
+
+void foleo_rand_mode(uint8_t, uint8_t*);
+#endif
\ No newline at end of file
rsa_padding_oaep,
rsa_padding_pss,
+ rand_mode,
+ rand_mode_dev,
+ rand_mode_devr,
+ rand_mode_x86,
+
byteStringToHexString,
fromNumberFixedSize
)
foreign import ccall unsafe "foleo_chacha20_poly1305"
c_chacha20_poly1305 :: Ptr (CUChar) -> Ptr (CUChar) -> Ptr (CUChar) -> CSize -> IO (Ptr (CUChar))
+foreign import ccall unsafe "foleo_rand_mode"
+ c_foleo_rand_mode :: CUChar -> Ptr (CUChar) -> IO ()
+
foreign import ccall unsafe "free"
c_free :: Ptr a -> IO ()
hash_sha256 :: Int
hash_sha256 = 1
+rand_mode_devr :: Int
+rand_mode_devr = 1
+
+rand_mode_dev :: Int
+rand_mode_dev = 2
+
+rand_mode_x86 :: Int
+rand_mode_x86 = 3
+
rsa_encrypt :: ByteString -> Int -> ByteString-> IO (ByteString)
rsa_encrypt keyBS padType ptBS = do
useAsCString keyBS $ \keyPtr -> do
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 prvKey pubKey
- rsa_free pubKey
- rsa_free prvKey
+ if n >= 64 then 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 prvKey pubKey
+ rsa_free pubKey
+ rsa_free prvKey
+ else return ()
rsa_import :: String -> (ByteString -> IO ()) -> IO ()
rsa_import n fn = do
c_free rPtr
return r
+rand_mode :: Int -> String -> IO ()
+rand_mode mode info = do
+ useAsCString (C8.pack info) $ \infoPtr -> do
+ c_foleo_rand_mode (fromIntegral mode) (castPtr infoPtr)
+
byteToHexString :: Word8 -> String
byteToHexString b = do
case (div b 16) of
main :: IO()
main = do
- q <- auth "server" "-"
- print q
+ rand_mode rand_mode_dev "/dev/null"
+ rsa_keygen 1024 $ \vk bk -> do
+ vks <- rsa_export vk
+ putStrLn vks
\ No newline at end of file
+#ifndef __HEADERS__
+#define __HEADERS__
#include <stdint.h>
#include <gmp.h>
#define FOLEO_RSA_PADDING_SIGNATURE 2
#define FOLEO_RSA_PADDING_OAEP 3
#define FOLEO_RSA_PADDING_PSS 4
+#define FOLEO_RAND_MODE_DEVR 1
+#define FOLEO_RAND_MODE_DEV 2
+#define FOLEO_RAND_MODE_X86 3
typedef struct
{
mpz_t n, k;
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);
+
+void foleo_rand_mode(uint8_t, uint8_t*);
+#endif
\ No newline at end of file
rsa_padding_oaep,
rsa_padding_pss,
+ rand_mode,
+ rand_mode_dev,
+ rand_mode_devr,
+ rand_mode_x86,
+
byteStringToHexString,
fromNumberFixedSize
)
foreign import ccall unsafe "foleo_chacha20_poly1305"
c_chacha20_poly1305 :: Ptr (CUChar) -> Ptr (CUChar) -> Ptr (CUChar) -> CSize -> IO (Ptr (CUChar))
+foreign import ccall unsafe "foleo_rand_mode"
+ c_foleo_rand_mode :: CUChar -> Ptr (CUChar) -> IO ()
+
foreign import ccall unsafe "free"
c_free :: Ptr a -> IO ()
hash_sha256 :: Int
hash_sha256 = 1
+rand_mode_devr :: Int
+rand_mode_devr = 1
+
+rand_mode_dev :: Int
+rand_mode_dev = 2
+
+rand_mode_x86 :: Int
+rand_mode_x86 = 3
+
rsa_encrypt :: ByteString -> Int -> ByteString-> IO (ByteString)
rsa_encrypt keyBS padType ptBS = do
useAsCString keyBS $ \keyPtr -> do
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 prvKey pubKey
- rsa_free pubKey
- rsa_free prvKey
+ if n >= 64 then 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 prvKey pubKey
+ rsa_free pubKey
+ rsa_free prvKey
+ else return ()
rsa_import :: String -> (ByteString -> IO ()) -> IO ()
rsa_import n fn = do
c_free rPtr
return r
+rand_mode :: Int -> String -> IO ()
+rand_mode mode info = do
+ useAsCString (C8.pack info) $ \infoPtr -> do
+ c_foleo_rand_mode (fromIntegral mode) (castPtr infoPtr)
+
byteToHexString :: Word8 -> String
byteToHexString b = do
case (div b 16) of
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include "headers.h"
-#define RAND_MODE_DEVR 1
-#define RAND_MODE_DEV 2
-#define RAND_MODE_X86 3
-uint8_t RAND_MODE = RAND_MODE_DEVR;
-uint8_t* RAND_INFO = NULL;
+uint8_t RAND_MODE = FOLEO_RAND_MODE_DEVR;
+uint8_t RAND_INFO[1024];
static void* rand_begin()
{
- if (RAND_MODE == RAND_MODE_DEVR)
+ if (RAND_MODE == FOLEO_RAND_MODE_DEVR)
{
FILE* f = fopen("/dev/random", "r");
if (!f)
}
return f;
}
- else if (RAND_MODE == RAND_MODE_DEV)
+ else if (RAND_MODE == FOLEO_RAND_MODE_DEV)
{
FILE* f = fopen(RAND_INFO, "r");
if (!f)
static void rand_get(void* context, uint8_t* buf, size_t bytes)
{
- if (RAND_MODE == RAND_MODE_DEVR || RAND_MODE == RAND_MODE_DEV)
+ if (RAND_MODE == FOLEO_RAND_MODE_DEVR || RAND_MODE == FOLEO_RAND_MODE_DEV)
{
if (context == NULL)
{
fread(buf, 1, bytes, f);
}
}
- else if (RAND_MODE == RAND_MODE_X86)
+ else if (RAND_MODE == FOLEO_RAND_MODE_X86)
{
uint64_t r;
uint8_t avail = 0;
static uint8_t rand_getc(void* context)
{
- if (RAND_MODE == RAND_MODE_DEVR || RAND_MODE == RAND_MODE_DEV)
+ if (RAND_MODE == FOLEO_RAND_MODE_DEVR || RAND_MODE == FOLEO_RAND_MODE_DEV)
{
if (context == NULL)
{
return fgetc((FILE*)context);
}
}
- else if (RAND_MODE == RAND_MODE_X86)
+ else if (RAND_MODE == FOLEO_RAND_MODE_X86)
{
uint64_t r;
__asm__ volatile ("1:;rdseed %0;;jnc 1b;" : "=r" (r));
static void rand_end(void* context)
{
- if (RAND_MODE == RAND_MODE_DEVR || RAND_MODE == RAND_MODE_DEV)
+ if (RAND_MODE == FOLEO_RAND_MODE_DEVR || RAND_MODE == FOLEO_RAND_MODE_DEV)
{
fclose((FILE*)context);
}
}
-void rand_mode(uint8_t mode, uint8_t* info)
+void foleo_rand_mode(uint8_t mode, uint8_t* info)
{
- if (mode == RAND_MODE_DEVR || mode == RAND_MODE_DEV || mode == RAND_MODE_X86)
+ if (mode == FOLEO_RAND_MODE_DEVR || mode == FOLEO_RAND_MODE_DEV || mode == FOLEO_RAND_MODE_X86)
{
- if (mode == RAND_MODE_DEV)
+ if (mode == FOLEO_RAND_MODE_DEV)
{
- if (info != NULL)
+ if (info != NULL && strlen(info) < 1024 - 1)
{
RAND_MODE = mode;
- RAND_INFO = info;
+ strcpy(RAND_INFO, info);
}
}
else