packages feed

hellnet-0.1: Hellnet/Crypto.hs

module Hellnet.Crypto (
	decryptAsym
	, decryptSym
	, encryptAsym
	, encryptAsym'
	, encryptSym
	, Hellnet.Crypto.hash
	, signAsym
	, verifyAsym
	) where

import Codec.Crypto.RSA as RSA
import Codec.Encryption.AES as AES
import Codec.Utils
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.UTF8 as BUL
import qualified Data.ByteString.Char8 as BS8
import Data.Digest.SHA512 as SHA512
import Data.LargeWord
import System.Random
import qualified Data.Map as Map
import Hellnet
import Text.HJson as JSON
import Safe
import System.Posix.Files

decryptSym :: [Octet] -> BSL.ByteString -> BSL.ByteString
decryptSym key os = BSL.pack $  listToOctets $ map (AES.decrypt ((fromOctets 256 key) :: Word256)) $ listFromOctets $ BSL.unpack os

encryptSym :: [Octet] -> BSL.ByteString -> BSL.ByteString
encryptSym key os = BSL.pack $ listToOctets $ map (AES.encrypt ((fromOctets 256 key) :: Word256)) $ listFromOctets $ BSL.unpack os

instance Jsonable PublicKey where
	toJson pk = toJson $ Map.fromList [
		("public_size", fromIntegral $ public_size pk)
		, ("public_n", public_n pk)
		, ("public_e", public_e pk)
		]
	fromJson (JObject objMap) =
		let lookups = (Map.lookup "public_size" objMap
			, Map.lookup "public_n" objMap
			, Map.lookup "public_e" objMap) in
				case lookups of
					(Just (JNumber public_sizeR)
						, Just (JNumber public_nR)
						, Just (JNumber public_eR)
						) -> Just PublicKey { public_size = round public_sizeR, public_n = round public_nR, public_e = round public_eR }
					otherwise -> Nothing
	fromJson _ = Nothing

instance Jsonable PrivateKey where
	toJson pk = toJson $ Map.fromList [
		("private_size", fromIntegral $ private_size pk)
		, ("private_n", private_n pk)
		, ("private_d", private_d pk)
		]
	fromJson (JObject objMap) =
		let lookups = (Map.lookup "private_size" objMap
			, Map.lookup "private_n" objMap
			, Map.lookup "private_d" objMap) in
				case lookups of
					(Just (JNumber private_sizeR)
						, Just (JNumber private_nR)
						, Just (JNumber private_dR)
						) -> Just PrivateKey { private_size = round private_sizeR, private_n = round private_nR, private_d = round private_dR }
					otherwise -> Nothing
	fromJson _ = Nothing

encryptAsym :: PublicKey -> BSL.ByteString -> IO BSL.ByteString
encryptAsym pk msg = do
	gen <- newStdGen
	let (res, _) = RSA.encrypt gen pk msg
	return res

encryptAsym' :: RandomGen g => g -> PublicKey -> BSL.ByteString -> (BSL.ByteString, g)
encryptAsym' = RSA.encrypt
decryptAsym = RSA.decrypt
signAsym = RSA.sign
verifyAsym = RSA.verify

hash = SHA512.hash . BSL.unpack