module Codec.Encryption.RSA(
encrypt,
decrypt
)where
import Codec.Utils
import Codec.Encryption.RSA.NumberTheory
rsaep :: (Integer , Integer) -> Integer -> Integer
rsaep :: (Integer, Integer) -> Integer -> Integer
rsaep (Integer
n,Integer
e) Integer
m
| Integer
m forall a. Ord a => a -> a -> Bool
< Integer
0 Bool -> Bool -> Bool
|| Integer
m forall a. Ord a => a -> a -> Bool
> Integer
nforall a. Num a => a -> a -> a
-Integer
1 =
forall a. HasCallStack => [Char] -> a
error [Char]
"Codec.Encryption.RSA.rsaep: message too long"
| Bool
otherwise =
Integer -> Integer -> Integer -> Integer
expmod Integer
m Integer
e Integer
n
encrypt :: ([Octet],[Octet]) -> [Octet] -> [Octet]
encrypt :: ([Octet], [Octet]) -> [Octet] -> [Octet]
encrypt ([Octet]
n,[Octet]
e) [Octet]
m =
forall a. Integral a => Int -> a -> [Octet]
i2osp (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Octet]
n) forall a b. (a -> b) -> a -> b
$
(Integer, Integer) -> Integer -> Integer
rsaep (forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
n, forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
e) (forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
m)
rsadp :: (Integer , Integer) -> Integer -> Integer
rsadp :: (Integer, Integer) -> Integer -> Integer
rsadp (Integer
n,Integer
d) Integer
c
| Integer
c forall a. Ord a => a -> a -> Bool
< Integer
0 Bool -> Bool -> Bool
|| Integer
c forall a. Ord a => a -> a -> Bool
> Integer
nforall a. Num a => a -> a -> a
-Integer
1 =
forall a. HasCallStack => [Char] -> a
error [Char]
"Codec.Encryption.RSA.rsadp: decryption error"
| Bool
otherwise =
Integer -> Integer -> Integer -> Integer
expmod Integer
c Integer
d Integer
n
decrypt :: ([Octet],[Octet]) -> [Octet] -> [Octet]
decrypt :: ([Octet], [Octet]) -> [Octet] -> [Octet]
decrypt ([Octet]
n,[Octet]
e) [Octet]
m
| Int
lc forall a. Ord a => a -> a -> Bool
> Int
lm =
forall a. HasCallStack => [Char] -> a
error [Char]
"Codec.Encryption.RSA.rsadp: decryption error"
| Bool
otherwise =
forall a. Integral a => Int -> a -> [Octet]
i2osp (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Octet]
n) forall a b. (a -> b) -> a -> b
$
(Integer, Integer) -> Integer -> Integer
rsadp (forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
n, forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
e) (forall a b. (Integral a, Integral b) => a -> [Octet] -> b
fromOctets Integer
256 [Octet]
m)
where
lc :: Int
lc = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
==Octet
0x00) [Octet]
m
lm :: Int
lm = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a. Eq a => a -> a -> Bool
==Octet
0x00) [Octet]
n