From bf6739574abbccfa993ac0a7efb25894c689e404 Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Tue, 28 Aug 2018 17:03:34 -0700 Subject: [PATCH] 1. moves :acme base64 and tests out of app --- app/acme.hoon | 115 +----------------------------------------- lib/base64.hoon | 82 ++++++++++++++++++++++++++++++ tests/lib/base64.hoon | 35 +++++++++++++ 3 files changed, 118 insertions(+), 114 deletions(-) create mode 100644 lib/base64.hoon create mode 100644 tests/lib/base64.hoon diff --git a/app/acme.hoon b/app/acme.hoon index 7cec94e60..97d44c24b 100644 --- a/app/acme.hoon +++ b/app/acme.hoon @@ -1,103 +1,9 @@ -/+ tester +/+ base64, tester =, eyre :: :::: %zuse additions :: |% -:: +rev: reverses block order, accounting for leading zeroes -:: -:: XX deduplicate with Mark's eth stuff -:: -++ rev - :: boq: block size - :: len: size of dat, in boq - :: dat: data to reverse - :: - |= [boq=bloq len=@ud dat=@] - =+ (swp boq dat) - (lsh boq (sub len (met boq dat)) -) -:: |base64: flexible base64 encoding for little-endian atoms -:: -++ base64 - :: pad: include padding when encoding, require when decoding - :: url: use url-safe characters '-' for '+' and '_' for '/' - :: - =+ [pad=& url=|] - |% - :: +en:base64: encode +octs to base64 cord - :: - ++ en - |= inp=octs - ^- cord - :: dif: offset from 3-byte block - :: - =/ dif=@ud (~(dif fo 3) 0 p.inp) - :: dap: reversed, 3-byte block-aligned input - :: - =/ dap=@ux (lsh 3 dif (rev 3 inp)) - =/ cha - ?: url - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_' - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - %- crip - %- flop - %+ weld - ?.(pad ~ (reap dif '=')) - %+ slag dif - |- ^- tape - ?: =(0x0 dap) ~ - =/ d (end 3 3 dap) - :* (cut 3 [(cut 0 [0 6] d) 1] cha) - (cut 3 [(cut 0 [6 6] d) 1] cha) - (cut 3 [(cut 0 [12 6] d) 1] cha) - (cut 3 [(cut 0 [18 6] d) 1] cha) - $(dap (rsh 3 3 dap)) - == - :: +de:base64: decode base64 cord to (unit @) - :: - ++ de - |= a=cord - ^- (unit octs) - (rush a parse) - :: +parse:base64: parse base64 cord to +octs - :: - ++ parse - =< ^- $-(nail (like octs)) - %+ sear reduce - ;~ plug - %- plus ;~ pose - (cook |=(a=@ (sub a 'A')) (shim 'A' 'Z')) - (cook |=(a=@ (sub a 'G')) (shim 'a' 'z')) - (cook |=(a=@ (add a 4)) (shim '0' '9')) - (cold 62 (just ?:(url '-' '+'))) - (cold 63 (just ?:(url '_' '/'))) - == - (stun 0^2 (cold %0 tis)) - == - |% - :: +reduce:parse:base64: reduce, measure, and swap base64 digits - :: - ++ reduce - |= [dat=(list @) dap=(list @)] - ^- (unit octs) - =/ lat (lent dat) - =/ lap (lent dap) - =/ dif (~(dif fo 4) 0 lat) - ?: &(pad !=(dif lap)) - :: padding required and incorrect - ~&(%base-64-padding-err-one ~) - ?: &(!pad !=(0 lap)) - :: padding not required but present - ~&(%base-64-padding-err-two ~) - =/ len (sub (mul 3 (div (add lat dif) 4)) dif) - :+ ~ len - %+ swp 3 - :: %+ base 64 - %+ roll - (weld dat (reap dif 0)) - |=([p=@ q=@] (add p (mul 64 q))) - -- - -- :: +en-base64url: url-safe base64 encoding, without padding :: ++ en-base64url @@ -2098,7 +2004,6 @@ :: h9bpt.vlmm7.lh375.f6u9n.krqv8.5jcml.cujkr.v1uqv.cjhe5.nplta |^ =/ out=tang ;: weld - test-base64 test-asn1 test-rsakey test-rsa @@ -2113,24 +2018,6 @@ == ?~(out this ((slog out) this)) :: - ++ test-base64 - ;: weld - %- expect-eq !> - ['AQAB' (en-base64url (en:octn 65.537))] - %- expect-eq !> - [65.537 (de:octn (need (de-base64url 'AQAB')))] - :: echo "hello" | base64 - %- expect-eq !> - ['aGVsbG8K' (en:base64 (as-octs:mimes:html 'hello\0a'))] - %- expect-eq !> - ['hello\0a' +:(need (de:base64 'aGVsbG8K'))] - :: echo -n -e "\x01\x01\x02\x03" | base64 - %- expect-eq !> - ['AQECAw==' (en:base64 (en:octn 0x101.0203))] - %- expect-eq !> - [0x302.0101 +:(need (de:base64 'AQECAw=='))] - == - :: ++ test-asn1 =/ nul=spec:asn1 [%nul ~] =/ int=spec:asn1 [%int 187] diff --git a/lib/base64.hoon b/lib/base64.hoon new file mode 100644 index 000000000..9fd0b83f9 --- /dev/null +++ b/lib/base64.hoon @@ -0,0 +1,82 @@ +:: |base64: flexible base64 encoding for little-endian atoms +:: +:: pad: include padding when encoding, require when decoding +:: url: use url-safe characters '-' for '+' and '_' for '/' +:: +=+ [pad=& url=|] +|% +:: +en:base64: encode +octs to base64 cord +:: +++ en + |= inp=octs + ^- cord + :: dif: offset from 3-byte block + :: + =/ dif=@ud (~(dif fo 3) 0 p.inp) + :: dap: reversed, 3-byte block-aligned input + :: + =/ dap=@ux (lsh 3 dif (rev 3 inp)) + =/ cha + ?: url + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + %- crip + %- flop + %+ weld + ?.(pad ~ (reap dif '=')) + %+ slag dif + |- ^- tape + ?: =(0x0 dap) ~ + =/ d (end 3 3 dap) + :* (cut 3 [(cut 0 [0 6] d) 1] cha) + (cut 3 [(cut 0 [6 6] d) 1] cha) + (cut 3 [(cut 0 [12 6] d) 1] cha) + (cut 3 [(cut 0 [18 6] d) 1] cha) + $(dap (rsh 3 3 dap)) + == +:: +de:base64: decode base64 cord to (unit @) +:: +++ de + |= a=cord + ^- (unit octs) + (rush a parse) +:: +parse:base64: parse base64 cord to +octs +:: +++ parse + =< ^- $-(nail (like octs)) + %+ sear reduce + ;~ plug + %- plus ;~ pose + (cook |=(a=@ (sub a 'A')) (shim 'A' 'Z')) + (cook |=(a=@ (sub a 'G')) (shim 'a' 'z')) + (cook |=(a=@ (add a 4)) (shim '0' '9')) + (cold 62 (just ?:(url '-' '+'))) + (cold 63 (just ?:(url '_' '/'))) + == + (stun 0^2 (cold %0 tis)) + == + |% + :: +reduce:parse:base64: reduce, measure, and swap base64 digits + :: + ++ reduce + |= [dat=(list @) dap=(list @)] + ^- (unit octs) + =/ lat (lent dat) + =/ lap (lent dap) + =/ dif (~(dif fo 4) 0 lat) + ?: &(pad !=(dif lap)) + :: padding required and incorrect + ~&(%base-64-padding-err-one ~) + ?: &(!pad !=(0 lap)) + :: padding not required but present + ~&(%base-64-padding-err-two ~) + =/ len (sub (mul 3 (div (add lat dif) 4)) dif) + :+ ~ len + %+ swp 3 + :: %+ base 64 + %+ roll + (weld dat (reap dif 0)) + |=([p=@ q=@] (add p (mul 64 q))) + -- +-- + diff --git a/tests/lib/base64.hoon b/tests/lib/base64.hoon new file mode 100644 index 000000000..90d19fba2 --- /dev/null +++ b/tests/lib/base64.hoon @@ -0,0 +1,35 @@ +/+ base64, tester +:: XX move to zuse +:: +|% +++ octn + |% + ++ en |=(a=@u `octs`[(met 3 a) (swp 3 a)]) + ++ de |=(a=octs `@u`(rev 3 p.a q.a)) + -- +++ en-base64url + ~(en base64 | &) +++ de-base64url + ~(de base64 | &) +-- +:: +|_ _tester:tester +++ test-base64 + ;: weld + %- expect-eq !> + ['AQAB' (en-base64url (en:octn 65.537))] + %- expect-eq !> + [65.537 (de:octn (need (de-base64url 'AQAB')))] + :: echo "hello" | base64 + %- expect-eq !> + ['aGVsbG8K' (en:base64 (as-octs:mimes:html 'hello\0a'))] + %- expect-eq !> + ['hello\0a' +:(need (de:base64 'aGVsbG8K'))] + :: echo -n -e "\x01\x01\x02\x03" | base64 + %- expect-eq !> + ['AQECAw==' (en:base64 (en:octn 0x101.0203))] + %- expect-eq !> + [0x302.0101 +:(need (de:base64 'AQECAw=='))] + == +-- +