mirror of
https://github.com/urbit/shrub.git
synced 2024-12-13 16:03:36 +03:00
Add secp core with secp256k to zuse.
Not yet fully jet-hinted.
This commit is contained in:
parent
676b188d5f
commit
1e6dc842a4
175
sys/zuse.hoon
175
sys/zuse.hoon
@ -3322,6 +3322,181 @@
|
|||||||
:: prepend outer padding to result, hash again
|
:: prepend outer padding to result, hash again
|
||||||
(haj (add out boq) (add (lsh 3 out kop) -))
|
(haj (add out boq) (add (lsh 3 out kop) -))
|
||||||
-- :: hmac
|
-- :: hmac
|
||||||
|
:: ::
|
||||||
|
:::: ++secp:crypto :: (2b9) secp family
|
||||||
|
:: ::::
|
||||||
|
++ secp
|
||||||
|
~% %secp ..is ~
|
||||||
|
|%
|
||||||
|
+= jaco [x=@ y=@ z=@] :: jacobian point
|
||||||
|
+= pont [x=@ y=@] :: curve point
|
||||||
|
::
|
||||||
|
++ secp256k1
|
||||||
|
%+ secp 32
|
||||||
|
:* p=0xffff.ffff.ffff.ffff.ffff.ffff.ffff.ffff. :: modulo
|
||||||
|
ffff.ffff.ffff.ffff.ffff.fffe.ffff.fc2f
|
||||||
|
a=0 :: y^2=x^3+ax+b
|
||||||
|
b=7
|
||||||
|
^= g :: "prime" point
|
||||||
|
:* x=0x79be.667e.f9dc.bbac.55a0.6295.ce87.0b07.
|
||||||
|
029b.fcdb.2dce.28d9.59f2.815b.16f8.1798
|
||||||
|
y=0x483a.da77.26a3.c465.5da4.fbfc.0e11.08a8.
|
||||||
|
fd17.b448.a685.5419.9c47.d08f.fb10.d4b8
|
||||||
|
==
|
||||||
|
n=0xffff.ffff.ffff.ffff.ffff.ffff.ffff.fffe. :: prime order of g
|
||||||
|
baae.dce6.af48.a03b.bfd2.5e8c.d036.4141
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ secp
|
||||||
|
|= [w=@ p=@ a=@ b=@ g=pont n=@]
|
||||||
|
=/ p ~(. fo p)
|
||||||
|
=/ n ~(. fo n)
|
||||||
|
|%
|
||||||
|
++ compress-point
|
||||||
|
|= pont
|
||||||
|
^- @
|
||||||
|
(can 3 ~[w^x 1^(add 0x2 (cut 0 [0 1] y))])
|
||||||
|
::
|
||||||
|
++ serialize-point
|
||||||
|
|= pont
|
||||||
|
^- @
|
||||||
|
(can 3 ~[w^y w^x 1^0x4])
|
||||||
|
::
|
||||||
|
++ decompress-point
|
||||||
|
|= dat=@
|
||||||
|
^- pont
|
||||||
|
=+ x=(end 3 w a)
|
||||||
|
=+ y=:(add (pow x 3) (mul a x) b)
|
||||||
|
=+ s=(rsh 3 32 dat)
|
||||||
|
:- x
|
||||||
|
?: =(0x2 s) y
|
||||||
|
?: =(0x3 s) y
|
||||||
|
~| [`@ux`s `@ux`dat]
|
||||||
|
!!
|
||||||
|
::
|
||||||
|
++ priv-to-pub :: get pub from priv
|
||||||
|
|= prv=@
|
||||||
|
^- pont
|
||||||
|
(jc-mul g prv)
|
||||||
|
::
|
||||||
|
++ make-k :: deterministic nonce
|
||||||
|
=, mimes:html
|
||||||
|
|= [has=@uvI prv=@]
|
||||||
|
^- @
|
||||||
|
=* hmc hmac-sha256l:hmac
|
||||||
|
=/ v (fil 3 w 1)
|
||||||
|
=/ k 0
|
||||||
|
=. k (hmc k w [+ -]:(as-octs (can 3 [w has] [w prv] [1 0x0] [w v] ~)))
|
||||||
|
=. v (hmc k w v w)
|
||||||
|
=. k (hmc k w [+ -]:(as-octs (can 3 [w has] [w prv] [1 0x1] [w v] ~)))
|
||||||
|
=. v (hmc k w v w)
|
||||||
|
(hmc k w v w)
|
||||||
|
::
|
||||||
|
++ ecdsa-raw-sign :: generate signature
|
||||||
|
|= [has=@uvI prv=@]
|
||||||
|
^- [v=@ r=@ s=@]
|
||||||
|
=/ z has
|
||||||
|
=/ k (make-k has prv)
|
||||||
|
=+ [r y]=(jc-mul g k)
|
||||||
|
=/ s (pro.n `@`(inv.n k) `@`(sum.n z (mul r prv)))
|
||||||
|
=/ big-s (gte (mul 2 s) ^n)
|
||||||
|
:* v=(add 27 (mix (end 0 1 y) ?:(big-s 1 0)))
|
||||||
|
r=r
|
||||||
|
s=?.(big-s s (sub ^n s))
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ ecdsa-raw-recover :: get pubkey from sig
|
||||||
|
|= [has=@uvI sig=[v=@ r=@ s=@]]
|
||||||
|
^- pont
|
||||||
|
?> ?&((lte 27 v.sig) (lte v.sig 34))
|
||||||
|
=/ x r.sig
|
||||||
|
=/ ysq (sum.p b (exp.p 3 x)) :: omits A=0
|
||||||
|
=/ bet (exp.p (div +(^p) 4) ysq)
|
||||||
|
=/ y ?:(=(1 (end 0 1 (mix v.sig bet))) bet (dif.p 0 bet))
|
||||||
|
?> =(0 (dif.p ysq (pro.p y y)))
|
||||||
|
?< =(0 (sit.n r.sig))
|
||||||
|
?< =(0 (sit.n s.sig))
|
||||||
|
=/ gz (mul:jc [x y 1]:g (dif.n 0 has))
|
||||||
|
=/ xy (mul:jc [x y 1] s.sig)
|
||||||
|
=/ qr (add:jc gz xy)
|
||||||
|
(from:jc (mul:jc qr (inv.n r.sig)))
|
||||||
|
::
|
||||||
|
++ jc-mul :: point x scalar
|
||||||
|
|= [a=pont n=@]
|
||||||
|
^- pont
|
||||||
|
(from:jc (mul:jc (into:jc a) n))
|
||||||
|
::
|
||||||
|
++ jc-add :: add points
|
||||||
|
|= [a=pont b=pont]
|
||||||
|
^- pont
|
||||||
|
(from:jc (add:jc (into:jc a) (into:jc b)))
|
||||||
|
::
|
||||||
|
++ jc :: jacobian core
|
||||||
|
|%
|
||||||
|
++ add :: addition
|
||||||
|
|= [a=jaco b=jaco]
|
||||||
|
^- jaco
|
||||||
|
?: =(0 y.a) b
|
||||||
|
?: =(0 y.b) a
|
||||||
|
=/ u1 :(pro.p x.a z.b z.b)
|
||||||
|
=/ u2 :(pro.p x.b z.a z.a)
|
||||||
|
=/ s1 :(pro.p y.a z.b z.b z.b)
|
||||||
|
=/ s2 :(pro.p y.b z.a z.a z.a)
|
||||||
|
?: =(u1 u2)
|
||||||
|
?. =(s1 s2)
|
||||||
|
[0 0 1]
|
||||||
|
(dub a)
|
||||||
|
=/ h (dif.p u2 u1)
|
||||||
|
=/ r (dif.p s2 s1)
|
||||||
|
=/ h2 (pro.p h h)
|
||||||
|
=/ h3 (pro.p h2 h)
|
||||||
|
=/ u1h2 (pro.p u1 h2)
|
||||||
|
=/ nx (dif.p (pro.p r r) :(sum.p h3 u1h2 u1h2))
|
||||||
|
=/ ny (dif.p (pro.p r (dif.p u1h2 nx)) (pro.p s1 h3))
|
||||||
|
=/ nz :(pro.p h z.a z.b)
|
||||||
|
[nx ny nz]
|
||||||
|
::
|
||||||
|
++ dub :: double
|
||||||
|
|= a=jaco
|
||||||
|
^- jaco
|
||||||
|
?: =(0 y.a)
|
||||||
|
[0 0 0]
|
||||||
|
=/ ysq (pro.p y.a y.a)
|
||||||
|
=/ s :(pro.p 4 x.a ysq)
|
||||||
|
=/ m :(pro.p 3 x.a x.a) :: omits A=0
|
||||||
|
=/ nx (dif.p (pro.p m m) (sum.p s s))
|
||||||
|
=/ ny (dif.p (pro.p m (dif.p s nx)) :(pro.p 8 ysq ysq))
|
||||||
|
=/ nz :(pro.p 2 y.a z.a)
|
||||||
|
[nx ny nz]
|
||||||
|
::
|
||||||
|
++ mul :: jaco x scalar
|
||||||
|
|= [a=jaco n=@]
|
||||||
|
^- jaco
|
||||||
|
?: =(0 y.a)
|
||||||
|
[0 0 1]
|
||||||
|
?: =(0 n)
|
||||||
|
[0 0 1]
|
||||||
|
?: =(1 n)
|
||||||
|
a
|
||||||
|
?: (gte n ^^n)
|
||||||
|
$(n (mod n ^^n))
|
||||||
|
?: =(0 (mod n 2))
|
||||||
|
(dub $(n (div n 2)))
|
||||||
|
(add a (dub $(n (div n 2))))
|
||||||
|
::
|
||||||
|
++ from :: jaco -> point
|
||||||
|
|= a=jaco
|
||||||
|
^- pont
|
||||||
|
=/ z (inv.p z.a)
|
||||||
|
[:(pro.p x.a z z) :(pro.p y.a z z z)]
|
||||||
|
::
|
||||||
|
++ into :: point -> jaco
|
||||||
|
|= pont
|
||||||
|
^- jaco
|
||||||
|
[x y z=1]
|
||||||
|
--
|
||||||
|
--
|
||||||
|
--
|
||||||
-- ::crypto
|
-- ::crypto
|
||||||
:: ::::
|
:: ::::
|
||||||
:::: ++unity :: (2c) unit promotion
|
:::: ++unity :: (2c) unit promotion
|
||||||
|
Loading…
Reference in New Issue
Block a user