mirror of
https://github.com/urbit/shrub.git
synced 2024-11-28 22:33:06 +03:00
b3901ab42f
git-subtree-dir: pkg/arvo git-subtree-mainline:9c8f40bf6c
git-subtree-split:c20e2a185f
85 lines
1.9 KiB
Plaintext
85 lines
1.9 KiB
Plaintext
:: |rsa: primitive, textbook RSA
|
|
::
|
|
:: Unpadded, unsafe, unsuitable for encryption!
|
|
::
|
|
|%
|
|
:: +key:rsa: rsa public or private key
|
|
::
|
|
+= key
|
|
$: :: pub: public parameters (n=modulus, e=pub-exponent)
|
|
::
|
|
pub=[n=@ux e=@ux]
|
|
:: sek: secret parameters (d=private-exponent, p/q=primes)
|
|
::
|
|
sek=(unit [d=@ux p=@ux q=@ux])
|
|
==
|
|
:: +ramp: make rabin-miller probabilistic prime
|
|
::
|
|
:: XX replace +ramp:number?
|
|
:: a: bitwidth
|
|
:: b: snags (XX small primes to check divisibility?)
|
|
:: c: entropy
|
|
::
|
|
++ ramp
|
|
|= [a=@ b=(list @) c=@]
|
|
=. c (shas %ramp c)
|
|
:: XX what is this value?
|
|
::
|
|
=| d=@
|
|
|- ^- @ux
|
|
:: XX what is this condition?
|
|
::
|
|
?: =((mul 100 a) d)
|
|
~|(%ar-ramp !!)
|
|
:: e: prime candidate
|
|
::
|
|
:: Sets low bit, as prime must be odd.
|
|
:: Sets high bit, as +raw:og only gives up to :a bits.
|
|
::
|
|
=/ e :(con 1 (lsh 0 (dec a) 1) (~(raw og c) a))
|
|
:: XX what algorithm is this modular remainder check?
|
|
::
|
|
?: ?& (levy b |=(f/@ !=(1 (mod e f))))
|
|
(pram:number e)
|
|
==
|
|
e
|
|
$(c +(c), d (shax d))
|
|
:: +elcm:rsa: carmichael totient
|
|
::
|
|
++ elcm
|
|
|= [a=@ b=@]
|
|
(div (mul a b) d:(egcd a b))
|
|
:: +new-key:rsa: write somethingXXX
|
|
::
|
|
++ new-key
|
|
=/ e `@ux`65.537
|
|
|= [wid=@ eny=@]
|
|
^- key
|
|
=/ diw (rsh 0 1 wid)
|
|
=/ p=@ux (ramp diw [3 5 ~] eny)
|
|
=/ q=@ux (ramp diw [3 5 ~] +(eny))
|
|
=/ n=@ux (mul p q)
|
|
=/ d=@ux (~(inv fo (elcm (dec p) (dec q))) e)
|
|
[[n e] `[d p q]]
|
|
:: +en:rsa: primitive RSA encryption
|
|
::
|
|
:: ciphertext = message^e (mod n)
|
|
::
|
|
++ en
|
|
|= [m=@ k=key]
|
|
~| %rsa-len
|
|
?> (lte (met 0 m) (met 0 n.pub.k))
|
|
(~(exp fo n.pub.k) e.pub.k m)
|
|
:: +de:rsa: primitive RSA decryption
|
|
::
|
|
:: message = ciphertext^d (mod e)
|
|
::
|
|
++ de
|
|
|= [m=@ k=key]
|
|
:: XX assert rsa-len here too?
|
|
~| %rsa-need-ring
|
|
?> ?=(^ sek.k)
|
|
=/ fu (fu:number p.u.sek.k q.u.sek.k)
|
|
(out.fu (exp.fu d.u.sek.k (sit.fu m)))
|
|
--
|