From 1e8847c613a1313de24c0f13431dcad518b4f960 Mon Sep 17 00:00:00 2001 From: lukechampine Date: Sat, 7 Oct 2023 19:57:35 -0400 Subject: [PATCH 1/5] jets: jet blake3 --- WORKSPACE.bazel | 4 ++-- pkg/noun/jets/e/blake.c | 47 +++++++++++++++++++++++++++++++++++++---- pkg/noun/jets/tree.c | 15 ++++++++++++- pkg/noun/jets/w.h | 3 ++- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index c5a66ad095..7d60159925 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -299,10 +299,10 @@ versioned_http_file( versioned_http_archive( name = "urcrypt", build_file = "//bazel/third_party/urcrypt:urcrypt.BUILD", - sha256 = "00ec597c14c418802d5db2d6a68cf83bd4f5419071b95f979374d3184599d6c8", + sha256 = "e659d3f3eac67dbf47e7e21860c99198c9f386b480e30d43547d1c6cb8974b24", strip_prefix = "urcrypt-{version}", url = "https://github.com/urbit/urcrypt/archive/{version}.tar.gz", - version = "b970baefa6e0a680fffa2b2ee19c956a4ae20355", + version = "c1ab781ae888730da06d998c80bfb2130232e528", ) versioned_http_archive( diff --git a/pkg/noun/jets/e/blake.c b/pkg/noun/jets/e/blake.c index a0f06f2186..fcdfed5a53 100644 --- a/pkg/noun/jets/e/blake.c +++ b/pkg/noun/jets/e/blake.c @@ -6,9 +6,8 @@ #include "noun.h" #include "urcrypt.h" - static u3_atom - _cqe_blake(u3_atom wid, u3_atom dat, + _cqe_blake2b(u3_atom wid, u3_atom dat, u3_atom wik, u3_atom dak, u3_atom out) { @@ -39,7 +38,7 @@ } u3_noun - u3we_blake(u3_noun cor) + u3we_blake2b(u3_noun cor) { u3_noun msg, key, out, // arguments wid, dat, // destructured msg @@ -54,6 +53,46 @@ { return u3m_bail(c3__exit); } else { - return u3l_punt("blake", _cqe_blake(wid, dat, wik, dak, out)); + return u3l_punt("blake2b", _cqe_blake2b(wid, dat, wik, dak, out)); + } + } + + static u3_atom + _cqe_blake3_hash(u3_atom wid, u3_atom dat, + u3_atom key, u3_atom out) + { + c3_w wid_w; + if ( !u3r_word_fit(&wid_w, wid) ) { + // impossible to represent an atom this large + return u3m_bail(c3__fail); + } + else { + c3_y out_y[64], key_y[32]; + c3_w out_w = c3_max(1, c3_min(out, 64)); + c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat); + u3r_bytes(0, 32, key_y, key); + urcrypt_blake3_hash(wid_w, dat_y, key_y, out_w, out_y); + u3a_free(dat_y); + return u3i_bytes(out_w, out_y); + } + } + + u3_noun + u3we_blake3_hash(u3_noun cor) + { + u3_noun out, msg, // arguments + wid, dat, // destructured msg + key; // context + + if ( c3n == u3r_mean(cor, u3x_sam_2, &out, + u3x_sam_3, &msg, + u3x_con_sam_2, &key, 0) || + u3ud(out) || + u3r_cell(msg, &wid, &dat) || u3ud(wid) || u3ud(dat) || + u3ud(key)) + { + return u3m_bail(c3__exit); + } else { + return u3l_punt("blake3_hash", _cqe_blake3_hash(wid, dat, key, out)); } } diff --git a/pkg/noun/jets/tree.c b/pkg/noun/jets/tree.c index c15e29ba8e..edcbcea41a 100644 --- a/pkg/noun/jets/tree.c +++ b/pkg/noun/jets/tree.c @@ -445,13 +445,26 @@ static c3_c* _140_hex_secp_ha[] = { 0 }; - static u3j_harm _140_hex_blake2b_a[] = {{".2", u3we_blake, c3y}, {}}; + static u3j_harm _140_hex_blake2b_a[] = {{".2", u3we_blake2b, c3y}, {}}; static c3_c* _140_hex_blake2b_ha[] = { "c432216ca53b5ad2284259167952761bb1046e280268c4d3b9ca70a2024e1934", 0 }; + static u3j_harm _140_hex_blake3_hash_a[] = {{".2", u3we_blake3_hash, c3y}, {}}; + static c3_c* _140_hex_blake3_hash_ha[] = { + "c432216ca53b5ad2284259167952761bb1046e280268c4d3b9ca70a2024e1934", + 0 + }; + static u3j_core _140_hex_blake3_d[] = + { { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, + {} + }; + static c3_c* _140_hex_blake3_ha[] = { 0 }; static u3j_core _140_hex_blake_d[] = { { "blake2b", 7, _140_hex_blake2b_a, 0, _140_hex_blake2b_ha }, + + { "blake3", 7, 0, _140_hex_blake3_d, _140_hex_blake3_ha }, + { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, {} }; static c3_c* _140_hex_blake_ha[] = { diff --git a/pkg/noun/jets/w.h b/pkg/noun/jets/w.h index d838416c03..b9b25a2dda 100644 --- a/pkg/noun/jets/w.h +++ b/pkg/noun/jets/w.h @@ -205,7 +205,8 @@ u3_noun u3we_argon2(u3_noun); - u3_noun u3we_blake(u3_noun); + u3_noun u3we_blake2b(u3_noun); + u3_noun u3we_blake3_hash(u3_noun); u3_noun u3we_ripe(u3_noun); From 80888b4952a422a317c57a4fa3c3421116621a52 Mon Sep 17 00:00:00 2001 From: lukechampine Date: Wed, 22 Nov 2023 11:12:42 -0500 Subject: [PATCH 2/5] jets: add +chunk-output and +compress blake3 jets --- WORKSPACE.bazel | 4 +-- pkg/noun/jets/e/blake.c | 64 +++++++++++++++++++++++++++++++++++++++++ pkg/noun/jets/tree.c | 16 ++++++++++- pkg/noun/jets/w.h | 2 ++ 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 7d60159925..07dd843afc 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -299,10 +299,10 @@ versioned_http_file( versioned_http_archive( name = "urcrypt", build_file = "//bazel/third_party/urcrypt:urcrypt.BUILD", - sha256 = "e659d3f3eac67dbf47e7e21860c99198c9f386b480e30d43547d1c6cb8974b24", + sha256 = "52209677868ccbb8bc87102dd4558b09f78bf57c4470b0feded30f411d13cc97", strip_prefix = "urcrypt-{version}", url = "https://github.com/urbit/urcrypt/archive/{version}.tar.gz", - version = "c1ab781ae888730da06d998c80bfb2130232e528", + version = "f331b6a9d1a86d42573165ff649700bf9c13b005", ) versioned_http_archive( diff --git a/pkg/noun/jets/e/blake.c b/pkg/noun/jets/e/blake.c index fcdfed5a53..9dd1eb9266 100644 --- a/pkg/noun/jets/e/blake.c +++ b/pkg/noun/jets/e/blake.c @@ -96,3 +96,67 @@ return u3l_punt("blake3_hash", _cqe_blake3_hash(wid, dat, key, out)); } } + + static u3_noun + _cqe_blake3_chunk_output(u3_atom wid, u3_atom dat, u3_atom cv, u3_atom counter, u3_atom flags) + { + c3_w wid_w; + if ( !u3r_word_fit(&wid_w, wid) ) { + return u3m_bail(c3__fail); + } else { + c3_y cv_y[32], block_y[64], block_len; + c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat); + c3_d counter_d = u3r_chub(0, counter); + c3_y flags_y = u3r_byte(0, flags); + u3r_bytes(0, 32, cv_y, cv); + urcrypt_blake3_chunk_output(wid_w, dat_y, cv_y, block_y, &block_len, &counter_d, &flags_y); + return u3i_cell(u3i_bytes(32, cv_y), u3i_qual(u3i_chub(counter_d), u3i_bytes(64, block_y), block_len, u3i_bytes(1, &flags_y))); + } + } + + u3_noun + u3we_blake3_chunk_output(u3_noun cor) + { + u3_noun counter, msg, // arguments + wid, dat, // destructured msg + key, flags; // context + + if ( c3n == u3r_mean(cor, u3x_sam_2, &counter, + u3x_sam_3, &msg, + u3x_con_sam_2, &key, + u3x_con_sam_3, &flags, 0) || + u3ud(counter) || + u3r_cell(msg, &wid, &dat) || u3ud(wid) || u3ud(dat) || + u3ud(key) || u3ud(flags)) + { + return u3m_bail(c3__exit); + } else { + return u3l_punt("blake3_chunk_output", _cqe_blake3_chunk_output(wid, dat, key, counter, flags)); + } + } + + static u3_atom + _cqe_blake3_compress(u3_atom cv, u3_atom counter, + u3_atom block, u3_atom block_len, u3_atom flags) + { + c3_y cv_y[32], block_y[64], out_y[64]; + u3r_bytes(0, 32, cv_y, cv); + u3r_bytes(0, 64, block_y, block); + urcrypt_blake3_compress(cv_y, block_y, block_len, counter, flags, out_y); + return u3i_bytes(64, out_y); + } + + u3_noun + u3we_blake3_compress(u3_noun cor) + { + u3_noun output = u3x_at(u3x_sam, cor); + u3_noun cv, counter, block, block_len, flags; // destructured output + + if ( u3r_quil(output, &cv, &counter, &block, &block_len, &flags) || + u3ud(cv) || u3ud(block) || u3ud(block_len) || u3ud(counter) || u3ud(flags)) + { + return u3m_bail(c3__exit); + } else { + return u3l_punt("blake3_compress", _cqe_blake3_compress(cv, counter, block, block_len, flags)); + } + } diff --git a/pkg/noun/jets/tree.c b/pkg/noun/jets/tree.c index edcbcea41a..bfd27c4aee 100644 --- a/pkg/noun/jets/tree.c +++ b/pkg/noun/jets/tree.c @@ -452,11 +452,23 @@ static c3_c* _140_hex_secp_ha[] = { }; static u3j_harm _140_hex_blake3_hash_a[] = {{".2", u3we_blake3_hash, c3y}, {}}; static c3_c* _140_hex_blake3_hash_ha[] = { - "c432216ca53b5ad2284259167952761bb1046e280268c4d3b9ca70a2024e1934", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + 0 + }; + static u3j_harm _140_hex_blake3_compress_a[] = {{".2", u3we_blake3_compress, c3y}, {}}; + static c3_c* _140_hex_blake3_compress_ha[] = { + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + 0 + }; + static u3j_harm _140_hex_blake3_chunk_output_a[] = {{".2", u3we_blake3_chunk_output, c3y}, {}}; + static c3_c* _140_hex_blake3_chunk_output_ha[] = { + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0 }; static u3j_core _140_hex_blake3_d[] = { { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, + { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, _140_hex_blake3_chunk_output_ha }, + { "compress", 7, _140_hex_blake3_compress_a, 0, _140_hex_blake3_compress_ha }, {} }; static c3_c* _140_hex_blake3_ha[] = { 0 }; @@ -465,6 +477,8 @@ static u3j_core _140_hex_blake_d[] = { "blake3", 7, 0, _140_hex_blake3_d, _140_hex_blake3_ha }, { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, + { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, _140_hex_blake3_chunk_output_ha }, + { "compress", 7, _140_hex_blake3_compress_a, 0, _140_hex_blake3_compress_ha }, {} }; static c3_c* _140_hex_blake_ha[] = { diff --git a/pkg/noun/jets/w.h b/pkg/noun/jets/w.h index b9b25a2dda..25875f0f04 100644 --- a/pkg/noun/jets/w.h +++ b/pkg/noun/jets/w.h @@ -207,6 +207,8 @@ u3_noun u3we_blake2b(u3_noun); u3_noun u3we_blake3_hash(u3_noun); + u3_noun u3we_blake3_chunk_output(u3_noun); + u3_noun u3we_blake3_compress(u3_noun); u3_noun u3we_ripe(u3_noun); From ed2418bea149eb198939ce2807255d83e1d8454b Mon Sep 17 00:00:00 2001 From: lukechampine Date: Sun, 26 Nov 2023 15:28:45 -0500 Subject: [PATCH 3/5] jets: support arbitrary-length blake3 output --- pkg/noun/jets/e/blake.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/noun/jets/e/blake.c b/pkg/noun/jets/e/blake.c index 9dd1eb9266..76a42b8ccf 100644 --- a/pkg/noun/jets/e/blake.c +++ b/pkg/noun/jets/e/blake.c @@ -67,13 +67,13 @@ return u3m_bail(c3__fail); } else { - c3_y out_y[64], key_y[32]; - c3_w out_w = c3_max(1, c3_min(out, 64)); - c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat); + c3_y key_y[32]; u3r_bytes(0, 32, key_y, key); - urcrypt_blake3_hash(wid_w, dat_y, key_y, out_w, out_y); + c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat), + *out_y = c3_malloc(out); + urcrypt_blake3_hash(wid_w, dat_y, key_y, out, out_y); u3a_free(dat_y); - return u3i_bytes(out_w, out_y); + return u3i_bytes(out, out_y); } } From 4450fbb6b4f0ae01feb6780dd5988b1dc21213ec Mon Sep 17 00:00:00 2001 From: lukechampine Date: Mon, 11 Dec 2023 14:37:00 -0500 Subject: [PATCH 4/5] jets: clean up blake3 jets --- pkg/noun/jets/e/blake.c | 16 ++++++++-------- pkg/noun/jets/tree.c | 34 +++++++++------------------------- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/pkg/noun/jets/e/blake.c b/pkg/noun/jets/e/blake.c index 76a42b8ccf..f21f229ceb 100644 --- a/pkg/noun/jets/e/blake.c +++ b/pkg/noun/jets/e/blake.c @@ -61,19 +61,20 @@ _cqe_blake3_hash(u3_atom wid, u3_atom dat, u3_atom key, u3_atom out) { - c3_w wid_w; - if ( !u3r_word_fit(&wid_w, wid) ) { - // impossible to represent an atom this large + c3_w wid_w, out_w; + if ( !u3r_word_fit(&wid_w, wid) || !u3r_word_fit(&out_w, out) ) { return u3m_bail(c3__fail); } else { c3_y key_y[32]; u3r_bytes(0, 32, key_y, key); - c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat), - *out_y = c3_malloc(out); + c3_y *dat_y = u3r_bytes_alloc(0, wid_w, dat); + u3i_slab sab_u; + u3i_slab_bare(&sab_u, 3, out_w); + c3_y* out_y = sab_u.buf_y; urcrypt_blake3_hash(wid_w, dat_y, key_y, out, out_y); u3a_free(dat_y); - return u3i_bytes(out, out_y); + return u3i_slab_mint(&sab_u); } } @@ -110,7 +111,7 @@ c3_y flags_y = u3r_byte(0, flags); u3r_bytes(0, 32, cv_y, cv); urcrypt_blake3_chunk_output(wid_w, dat_y, cv_y, block_y, &block_len, &counter_d, &flags_y); - return u3i_cell(u3i_bytes(32, cv_y), u3i_qual(u3i_chub(counter_d), u3i_bytes(64, block_y), block_len, u3i_bytes(1, &flags_y))); + return u3i_cell(u3i_bytes(32, cv_y), u3i_qual(u3k(counter), u3i_bytes(64, block_y), block_len, flags_y)); } } @@ -125,7 +126,6 @@ u3x_sam_3, &msg, u3x_con_sam_2, &key, u3x_con_sam_3, &flags, 0) || - u3ud(counter) || u3r_cell(msg, &wid, &dat) || u3ud(wid) || u3ud(dat) || u3ud(key) || u3ud(flags)) { diff --git a/pkg/noun/jets/tree.c b/pkg/noun/jets/tree.c index bfd27c4aee..77691bb76d 100644 --- a/pkg/noun/jets/tree.c +++ b/pkg/noun/jets/tree.c @@ -446,39 +446,23 @@ static c3_c* _140_hex_secp_ha[] = { }; static u3j_harm _140_hex_blake2b_a[] = {{".2", u3we_blake2b, c3y}, {}}; - static c3_c* _140_hex_blake2b_ha[] = { - "c432216ca53b5ad2284259167952761bb1046e280268c4d3b9ca70a2024e1934", - 0 - }; static u3j_harm _140_hex_blake3_hash_a[] = {{".2", u3we_blake3_hash, c3y}, {}}; - static c3_c* _140_hex_blake3_hash_ha[] = { - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - 0 - }; static u3j_harm _140_hex_blake3_compress_a[] = {{".2", u3we_blake3_compress, c3y}, {}}; - static c3_c* _140_hex_blake3_compress_ha[] = { - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - 0 - }; static u3j_harm _140_hex_blake3_chunk_output_a[] = {{".2", u3we_blake3_chunk_output, c3y}, {}}; - static c3_c* _140_hex_blake3_chunk_output_ha[] = { - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - 0 - }; static u3j_core _140_hex_blake3_d[] = - { { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, - { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, _140_hex_blake3_chunk_output_ha }, - { "compress", 7, _140_hex_blake3_compress_a, 0, _140_hex_blake3_compress_ha }, + { { "hash", 7, _140_hex_blake3_hash_a, 0, no_hashes }, + { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, no_hashes }, + {} + }; + static u3j_core _140_hex_blake3_impl_d[] = + { { "compress", 7, _140_hex_blake3_compress_a, 0, no_hashes }, + { "blake3", 7, 0, _140_hex_blake3_d, no_hashes }, {} }; - static c3_c* _140_hex_blake3_ha[] = { 0 }; static u3j_core _140_hex_blake_d[] = - { { "blake2b", 7, _140_hex_blake2b_a, 0, _140_hex_blake2b_ha }, + { { "blake2b", 7, _140_hex_blake2b_a, 0, no_hashes }, - { "blake3", 7, 0, _140_hex_blake3_d, _140_hex_blake3_ha }, - { "hash", 7, _140_hex_blake3_hash_a, 0, _140_hex_blake3_hash_ha }, - { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, _140_hex_blake3_chunk_output_ha }, - { "compress", 7, _140_hex_blake3_compress_a, 0, _140_hex_blake3_compress_ha }, + { "blake3-impl", 7, 0, _140_hex_blake3_impl_d, no_hashes }, {} }; static c3_c* _140_hex_blake_ha[] = { From e9d3f3211f9fb2de1edf7b7a431d0e0d5611760d Mon Sep 17 00:00:00 2001 From: Joe Bryan Date: Thu, 25 Jan 2024 14:19:37 -0500 Subject: [PATCH 5/5] jets: moves blake3 to %138 declarations --- pkg/noun/jets/tree.c | 58 ++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/pkg/noun/jets/tree.c b/pkg/noun/jets/tree.c index 5e363a3a19..e40fe03846 100644 --- a/pkg/noun/jets/tree.c +++ b/pkg/noun/jets/tree.c @@ -446,23 +446,9 @@ static c3_c* _140_hex_secp_ha[] = { }; static u3j_harm _140_hex_blake2b_a[] = {{".2", u3we_blake2b, c3y}, {}}; - static u3j_harm _140_hex_blake3_hash_a[] = {{".2", u3we_blake3_hash, c3y}, {}}; - static u3j_harm _140_hex_blake3_compress_a[] = {{".2", u3we_blake3_compress, c3y}, {}}; - static u3j_harm _140_hex_blake3_chunk_output_a[] = {{".2", u3we_blake3_chunk_output, c3y}, {}}; - static u3j_core _140_hex_blake3_d[] = - { { "hash", 7, _140_hex_blake3_hash_a, 0, no_hashes }, - { "chunk-output", 7, _140_hex_blake3_chunk_output_a, 0, no_hashes }, - {} - }; - static u3j_core _140_hex_blake3_impl_d[] = - { { "compress", 7, _140_hex_blake3_compress_a, 0, no_hashes }, - { "blake3", 7, 0, _140_hex_blake3_d, no_hashes }, - {} - }; + static u3j_core _140_hex_blake_d[] = { { "blake2b", 7, _140_hex_blake2b_a, 0, no_hashes }, - - { "blake3-impl", 7, 0, _140_hex_blake3_impl_d, no_hashes }, {} }; static c3_c* _140_hex_blake_ha[] = { @@ -2336,8 +2322,48 @@ u3j_core _k139_d[] = {} }; + static u3j_harm _138_hex_blake3_hash_a[] = {{".2", u3we_blake3_hash, c3y}, {}}; + static u3j_harm _138_hex_blake3_compress_a[] = {{".2", u3we_blake3_compress, c3y}, {}}; + static u3j_harm _138_hex_blake3_chunk_output_a[] = {{".2", u3we_blake3_chunk_output, c3y}, {}}; + static u3j_core _138_hex_blake3_d[] = + { { "hash", 7, _138_hex_blake3_hash_a, 0, no_hashes }, + { "chunk-output", 7, _138_hex_blake3_chunk_output_a, 0, no_hashes }, + {} + }; + static u3j_core _138_hex_blake3_impl_d[] = + { { "compress", 7, _138_hex_blake3_compress_a, 0, no_hashes }, + { "blake3", 7, 0, _138_hex_blake3_d, no_hashes }, + {} + }; +static u3j_core _138_hex_blake_d[] = + { { "blake2b", 7, _140_hex_blake2b_a, 0, no_hashes }, + { "blake3-impl", 7, 0, _138_hex_blake3_impl_d, no_hashes }, + {} + }; + +static u3j_core _138_hex_d[] = +{ { "lore", 63, _140_hex_lore_a, 0, no_hashes }, + { "leer", 63, _140_hex_leer_a, 0, no_hashes }, + { "loss", 63, _140_hex_loss_a, 0, no_hashes }, + { "lune", 127, _140_hex_lune_a, 0, no_hashes }, + + { "coed", 63, 0, _140_hex_coed_d, no_hashes }, + { "aes", 31, 0, _140_hex_aes_d, no_hashes }, + + { "hmac", 63, 0, _140_hex_hmac_d, no_hashes }, + { "argon", 31, 0, _140_hex_argon_d, no_hashes }, + { "blake", 31, 0, _138_hex_blake_d, no_hashes }, + { "kecc", 31, 0, _140_hex_kecc_d, no_hashes }, + { "ripemd", 31, 0, _140_hex_ripe_d, no_hashes }, + { "scr", 31, 0, _140_hex_scr_d, no_hashes }, + { "secp", 6, 0, _140_hex_secp_d, no_hashes }, + { "mimes", 31, 0, _140_hex_mimes_d, no_hashes }, + { "json", 31, 0, _139_hex_json_d, no_hashes }, + {} +}; + static u3j_core _138_pen_d[] = -{ { "hex", 7, 0, _139_hex_d, no_hashes }, +{ { "hex", 7, 0, _138_hex_d, no_hashes }, { "cell", 7, _140_pen_cell_a, 0, no_hashes }, { "comb", 7, _140_pen_comb_a, 0, no_hashes },