shithub: blake2

Download patch

ref: b2aa1948ba154ebe4e1da20cc8f871f7c27afe97
parent: ed1974ea83433eba7b2d95c5dcd9ac33cb847913
author: Jacob Moody <moody@posixcafe.org>
date: Thu May 15 01:52:21 EDT 2025

initial port

--- a/ref/blake2-impl.h
+++ b/ref/blake2-impl.h
@@ -15,146 +15,130 @@
 #ifndef BLAKE2_IMPL_H
 #define BLAKE2_IMPL_H
 
-#include <stdint.h>
-#include <string.h>
-
-#if !defined(__cplusplus) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)
-  #if   defined(_MSC_VER)
-    #define BLAKE2_INLINE __inline
-  #elif defined(__GNUC__)
-    #define BLAKE2_INLINE __inline__
-  #else
-    #define BLAKE2_INLINE
-  #endif
-#else
-  #define BLAKE2_INLINE inline
-#endif
-
-static BLAKE2_INLINE uint32_t load32( const void *src )
+static u32int load32( const void *src )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
-  uint32_t w;
+  u32int w;
   memcpy(&w, src, sizeof w);
   return w;
 #else
-  const uint8_t *p = ( const uint8_t * )src;
-  return (( uint32_t )( p[0] ) <<  0) |
-         (( uint32_t )( p[1] ) <<  8) |
-         (( uint32_t )( p[2] ) << 16) |
-         (( uint32_t )( p[3] ) << 24) ;
+  const u8int *p = ( const u8int * )src;
+  return (( u32int )( p[0] ) <<  0) |
+         (( u32int )( p[1] ) <<  8) |
+         (( u32int )( p[2] ) << 16) |
+         (( u32int )( p[3] ) << 24) ;
 #endif
 }
 
-static BLAKE2_INLINE uint64_t load64( const void *src )
+static u64int load64( const void *src )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
-  uint64_t w;
+  u64int w;
   memcpy(&w, src, sizeof w);
   return w;
 #else
-  const uint8_t *p = ( const uint8_t * )src;
-  return (( uint64_t )( p[0] ) <<  0) |
-         (( uint64_t )( p[1] ) <<  8) |
-         (( uint64_t )( p[2] ) << 16) |
-         (( uint64_t )( p[3] ) << 24) |
-         (( uint64_t )( p[4] ) << 32) |
-         (( uint64_t )( p[5] ) << 40) |
-         (( uint64_t )( p[6] ) << 48) |
-         (( uint64_t )( p[7] ) << 56) ;
+  const u8int *p = ( const u8int * )src;
+  return (( u64int )( p[0] ) <<  0) |
+         (( u64int )( p[1] ) <<  8) |
+         (( u64int )( p[2] ) << 16) |
+         (( u64int )( p[3] ) << 24) |
+         (( u64int )( p[4] ) << 32) |
+         (( u64int )( p[5] ) << 40) |
+         (( u64int )( p[6] ) << 48) |
+         (( u64int )( p[7] ) << 56) ;
 #endif
 }
 
-static BLAKE2_INLINE uint16_t load16( const void *src )
+static u16int load16( const void *src )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
-  uint16_t w;
+  u16int w;
   memcpy(&w, src, sizeof w);
   return w;
 #else
-  const uint8_t *p = ( const uint8_t * )src;
-  return ( uint16_t )((( uint32_t )( p[0] ) <<  0) |
-                      (( uint32_t )( p[1] ) <<  8));
+  const u8int *p = ( const u8int * )src;
+  return ( u16int )((( u32int )( p[0] ) <<  0) |
+                      (( u32int )( p[1] ) <<  8));
 #endif
 }
 
-static BLAKE2_INLINE void store16( void *dst, uint16_t w )
+static void store16( void *dst, u16int w )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
   memcpy(dst, &w, sizeof w);
 #else
-  uint8_t *p = ( uint8_t * )dst;
-  *p++ = ( uint8_t )w; w >>= 8;
-  *p++ = ( uint8_t )w;
+  u8int *p = ( u8int * )dst;
+  *p++ = ( u8int )w; w >>= 8;
+  *p++ = ( u8int )w;
 #endif
 }
 
-static BLAKE2_INLINE void store32( void *dst, uint32_t w )
+static void store32( void *dst, u32int w )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
   memcpy(dst, &w, sizeof w);
 #else
-  uint8_t *p = ( uint8_t * )dst;
-  p[0] = (uint8_t)(w >>  0);
-  p[1] = (uint8_t)(w >>  8);
-  p[2] = (uint8_t)(w >> 16);
-  p[3] = (uint8_t)(w >> 24);
+  u8int *p = ( u8int * )dst;
+  p[0] = (u8int)(w >>  0);
+  p[1] = (u8int)(w >>  8);
+  p[2] = (u8int)(w >> 16);
+  p[3] = (u8int)(w >> 24);
 #endif
 }
 
-static BLAKE2_INLINE void store64( void *dst, uint64_t w )
+static void store64( void *dst, u64int w )
 {
 #if defined(NATIVE_LITTLE_ENDIAN)
   memcpy(dst, &w, sizeof w);
 #else
-  uint8_t *p = ( uint8_t * )dst;
-  p[0] = (uint8_t)(w >>  0);
-  p[1] = (uint8_t)(w >>  8);
-  p[2] = (uint8_t)(w >> 16);
-  p[3] = (uint8_t)(w >> 24);
-  p[4] = (uint8_t)(w >> 32);
-  p[5] = (uint8_t)(w >> 40);
-  p[6] = (uint8_t)(w >> 48);
-  p[7] = (uint8_t)(w >> 56);
+  u8int *p = ( u8int * )dst;
+  p[0] = (u8int)(w >>  0);
+  p[1] = (u8int)(w >>  8);
+  p[2] = (u8int)(w >> 16);
+  p[3] = (u8int)(w >> 24);
+  p[4] = (u8int)(w >> 32);
+  p[5] = (u8int)(w >> 40);
+  p[6] = (u8int)(w >> 48);
+  p[7] = (u8int)(w >> 56);
 #endif
 }
 
-static BLAKE2_INLINE uint64_t load48( const void *src )
+static u64int load48( const void *src )
 {
-  const uint8_t *p = ( const uint8_t * )src;
-  return (( uint64_t )( p[0] ) <<  0) |
-         (( uint64_t )( p[1] ) <<  8) |
-         (( uint64_t )( p[2] ) << 16) |
-         (( uint64_t )( p[3] ) << 24) |
-         (( uint64_t )( p[4] ) << 32) |
-         (( uint64_t )( p[5] ) << 40) ;
+  const u8int *p = ( const u8int * )src;
+  return (( u64int )( p[0] ) <<  0) |
+         (( u64int )( p[1] ) <<  8) |
+         (( u64int )( p[2] ) << 16) |
+         (( u64int )( p[3] ) << 24) |
+         (( u64int )( p[4] ) << 32) |
+         (( u64int )( p[5] ) << 40) ;
 }
 
-static BLAKE2_INLINE void store48( void *dst, uint64_t w )
+static void store48( void *dst, u64int w )
 {
-  uint8_t *p = ( uint8_t * )dst;
-  p[0] = (uint8_t)(w >>  0);
-  p[1] = (uint8_t)(w >>  8);
-  p[2] = (uint8_t)(w >> 16);
-  p[3] = (uint8_t)(w >> 24);
-  p[4] = (uint8_t)(w >> 32);
-  p[5] = (uint8_t)(w >> 40);
+  u8int *p = ( u8int * )dst;
+  p[0] = (u8int)(w >>  0);
+  p[1] = (u8int)(w >>  8);
+  p[2] = (u8int)(w >> 16);
+  p[3] = (u8int)(w >> 24);
+  p[4] = (u8int)(w >> 32);
+  p[5] = (u8int)(w >> 40);
 }
 
-static BLAKE2_INLINE uint32_t rotr32( const uint32_t w, const unsigned c )
+static u32int rotr32( const u32int w, const unsigned c )
 {
   return ( w >> c ) | ( w << ( 32 - c ) );
 }
 
-static BLAKE2_INLINE uint64_t rotr64( const uint64_t w, const unsigned c )
+static u64int rotr64( const u64int w, const unsigned c )
 {
   return ( w >> c ) | ( w << ( 64 - c ) );
 }
 
 /* prevents compiler optimizing out memset() */
-static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n)
+static void secure_zero_memory(void *v, int n)
 {
-  static void *(*const volatile memset_v)(void *, int, size_t) = &memset;
-  memset_v(v, 0, n);
+  memset(v, 0, n);
 }
 
 #endif
--- a/ref/blake2.h
+++ b/ref/blake2.h
@@ -15,19 +15,6 @@
 #ifndef BLAKE2_H
 #define BLAKE2_H
 
-#include <stddef.h>
-#include <stdint.h>
-
-#if defined(_MSC_VER)
-#define BLAKE2_PACKED(x) __pragma(pack(push, 1)) x __pragma(pack(pop))
-#else
-#define BLAKE2_PACKED(x) x __attribute__((packed))
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
   enum blake2s_constant
   {
     BLAKE2S_BLOCKBYTES = 64,
@@ -48,24 +35,24 @@
 
   typedef struct blake2s_state__
   {
-    uint32_t h[8];
-    uint32_t t[2];
-    uint32_t f[2];
-    uint8_t  buf[BLAKE2S_BLOCKBYTES];
-    size_t   buflen;
-    size_t   outlen;
-    uint8_t  last_node;
+    u32int h[8];
+    u32int t[2];
+    u32int f[2];
+    u8int  buf[BLAKE2S_BLOCKBYTES];
+    int   buflen;
+    int   outlen;
+    u8int  last_node;
   } blake2s_state;
 
   typedef struct blake2b_state__
   {
-    uint64_t h[8];
-    uint64_t t[2];
-    uint64_t f[2];
-    uint8_t  buf[BLAKE2B_BLOCKBYTES];
-    size_t   buflen;
-    size_t   outlen;
-    uint8_t  last_node;
+    u64int h[8];
+    u64int t[2];
+    u64int f[2];
+    u8int  buf[BLAKE2B_BLOCKBYTES];
+    int   buflen;
+    int   outlen;
+    u8int  last_node;
   } blake2b_state;
 
   typedef struct blake2sp_state__
@@ -72,9 +59,9 @@
   {
     blake2s_state S[8][1];
     blake2s_state R[1];
-    uint8_t       buf[8 * BLAKE2S_BLOCKBYTES];
-    size_t        buflen;
-    size_t        outlen;
+    u8int       buf[8 * BLAKE2S_BLOCKBYTES];
+    int        buflen;
+    int        outlen;
   } blake2sp_state;
 
   typedef struct blake2bp_state__
@@ -81,45 +68,44 @@
   {
     blake2b_state S[4][1];
     blake2b_state R[1];
-    uint8_t       buf[4 * BLAKE2B_BLOCKBYTES];
-    size_t        buflen;
-    size_t        outlen;
+    u8int       buf[4 * BLAKE2B_BLOCKBYTES];
+    int        buflen;
+    int        outlen;
   } blake2bp_state;
 
-
-  BLAKE2_PACKED(struct blake2s_param__
+  struct blake2s_param__
   {
-    uint8_t  digest_length; /* 1 */
-    uint8_t  key_length;    /* 2 */
-    uint8_t  fanout;        /* 3 */
-    uint8_t  depth;         /* 4 */
-    uint32_t leaf_length;   /* 8 */
-    uint32_t node_offset;  /* 12 */
-    uint16_t xof_length;    /* 14 */
-    uint8_t  node_depth;    /* 15 */
-    uint8_t  inner_length;  /* 16 */
-    /* uint8_t  reserved[0]; */
-    uint8_t  salt[BLAKE2S_SALTBYTES]; /* 24 */
-    uint8_t  personal[BLAKE2S_PERSONALBYTES];  /* 32 */
-  });
+    u8int  digest_length; /* 1 */
+    u8int  key_length;    /* 2 */
+    u8int  fanout;        /* 3 */
+    u8int  depth;         /* 4 */
+    u32int leaf_length;   /* 8 */
+    u32int node_offset;  /* 12 */
+    u16int xof_length;    /* 14 */
+    u8int  node_depth;    /* 15 */
+    u8int  inner_length;  /* 16 */
+    /* u8int  reserved[0]; */
+    u8int  salt[BLAKE2S_SALTBYTES]; /* 24 */
+    u8int  personal[BLAKE2S_PERSONALBYTES];  /* 32 */
+  };
 
   typedef struct blake2s_param__ blake2s_param;
 
-  BLAKE2_PACKED(struct blake2b_param__
+  struct blake2b_param__
   {
-    uint8_t  digest_length; /* 1 */
-    uint8_t  key_length;    /* 2 */
-    uint8_t  fanout;        /* 3 */
-    uint8_t  depth;         /* 4 */
-    uint32_t leaf_length;   /* 8 */
-    uint32_t node_offset;   /* 12 */
-    uint32_t xof_length;    /* 16 */
-    uint8_t  node_depth;    /* 17 */
-    uint8_t  inner_length;  /* 18 */
-    uint8_t  reserved[14];  /* 32 */
-    uint8_t  salt[BLAKE2B_SALTBYTES]; /* 48 */
-    uint8_t  personal[BLAKE2B_PERSONALBYTES];  /* 64 */
-  });
+    u8int  digest_length; /* 1 */
+    u8int  key_length;    /* 2 */
+    u8int  fanout;        /* 3 */
+    u8int  depth;         /* 4 */
+    u32int leaf_length;   /* 8 */
+    u32int node_offset;   /* 12 */
+    u32int xof_length;    /* 16 */
+    u8int  node_depth;    /* 17 */
+    u8int  inner_length;  /* 18 */
+    u8int  reserved[14];  /* 32 */
+    u8int  salt[BLAKE2B_SALTBYTES]; /* 48 */
+    u8int  personal[BLAKE2B_PERSONALBYTES];  /* 64 */
+  };
 
   typedef struct blake2b_param__ blake2b_param;
 
@@ -142,54 +128,50 @@
   };
 
   /* Streaming API */
-  int blake2s_init( blake2s_state *S, size_t outlen );
-  int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen );
+  int blake2s_init( blake2s_state *S, int outlen );
+  int blake2s_init_key( blake2s_state *S, int outlen, const void *key, int keylen );
   int blake2s_init_param( blake2s_state *S, const blake2s_param *P );
-  int blake2s_update( blake2s_state *S, const void *in, size_t inlen );
-  int blake2s_final( blake2s_state *S, void *out, size_t outlen );
+  int blake2s_update( blake2s_state *S, const void *in, int inlen );
+  int blake2s_final( blake2s_state *S, void *out, int outlen );
 
-  int blake2b_init( blake2b_state *S, size_t outlen );
-  int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen );
+  int blake2b_init( blake2b_state *S, int outlen );
+  int blake2b_init_key( blake2b_state *S, int outlen, const void *key, int keylen );
   int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
-  int blake2b_update( blake2b_state *S, const void *in, size_t inlen );
-  int blake2b_final( blake2b_state *S, void *out, size_t outlen );
+  int blake2b_update( blake2b_state *S, const void *in, int inlen );
+  int blake2b_final( blake2b_state *S, void *out, int outlen );
 
-  int blake2sp_init( blake2sp_state *S, size_t outlen );
-  int blake2sp_init_key( blake2sp_state *S, size_t outlen, const void *key, size_t keylen );
-  int blake2sp_update( blake2sp_state *S, const void *in, size_t inlen );
-  int blake2sp_final( blake2sp_state *S, void *out, size_t outlen );
+  int blake2sp_init( blake2sp_state *S, int outlen );
+  int blake2sp_init_key( blake2sp_state *S, int outlen, const void *key, int keylen );
+  int blake2sp_update( blake2sp_state *S, const void *in, int inlen );
+  int blake2sp_final( blake2sp_state *S, void *out, int outlen );
 
-  int blake2bp_init( blake2bp_state *S, size_t outlen );
-  int blake2bp_init_key( blake2bp_state *S, size_t outlen, const void *key, size_t keylen );
-  int blake2bp_update( blake2bp_state *S, const void *in, size_t inlen );
-  int blake2bp_final( blake2bp_state *S, void *out, size_t outlen );
+  int blake2bp_init( blake2bp_state *S, int outlen );
+  int blake2bp_init_key( blake2bp_state *S, int outlen, const void *key, int keylen );
+  int blake2bp_update( blake2bp_state *S, const void *in, int inlen );
+  int blake2bp_final( blake2bp_state *S, void *out, int outlen );
 
   /* Variable output length API */
-  int blake2xs_init( blake2xs_state *S, const size_t outlen );
-  int blake2xs_init_key( blake2xs_state *S, const size_t outlen, const void *key, size_t keylen );
-  int blake2xs_update( blake2xs_state *S, const void *in, size_t inlen );
-  int blake2xs_final(blake2xs_state *S, void *out, size_t outlen);
+  int blake2xs_init( blake2xs_state *S, const int outlen );
+  int blake2xs_init_key( blake2xs_state *S, const int outlen, const void *key, int keylen );
+  int blake2xs_update( blake2xs_state *S, const void *in, int inlen );
+  int blake2xs_final(blake2xs_state *S, void *out, int outlen);
 
-  int blake2xb_init( blake2xb_state *S, const size_t outlen );
-  int blake2xb_init_key( blake2xb_state *S, const size_t outlen, const void *key, size_t keylen );
-  int blake2xb_update( blake2xb_state *S, const void *in, size_t inlen );
-  int blake2xb_final(blake2xb_state *S, void *out, size_t outlen);
+  int blake2xb_init( blake2xb_state *S, const int outlen );
+  int blake2xb_init_key( blake2xb_state *S, const int outlen, const void *key, int keylen );
+  int blake2xb_update( blake2xb_state *S, const void *in, int inlen );
+  int blake2xb_final(blake2xb_state *S, void *out, int outlen);
 
   /* Simple API */
-  int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
-  int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
+  int blake2s( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
+  int blake2b( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
 
-  int blake2sp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
-  int blake2bp( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
+  int blake2sp( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
+  int blake2bp( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
 
-  int blake2xs( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
-  int blake2xb( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
+  int blake2xs( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
+  int blake2xb( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
 
   /* This is simply an alias for blake2b */
-  int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen );
-
-#if defined(__cplusplus)
-}
-#endif
+  int blake2( void *out, int outlen, const void *in, int inlen, const void *key, int keylen );
 
 #endif
--- a/ref/blake2b-ref.c
+++ b/ref/blake2b-ref.c
@@ -13,14 +13,13 @@
    https://blake2.net.
 */
 
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
+#include <u.h>
+#include <libc.h>
 
 #include "blake2.h"
 #include "blake2-impl.h"
 
-static const uint64_t blake2b_IV[8] =
+static const u64int blake2b_IV[8] =
 {
   0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
   0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
@@ -28,7 +27,7 @@
   0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
 };
 
-static const uint8_t blake2b_sigma[12][16] =
+static const u8int blake2b_sigma[12][16] =
 {
   {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,
   { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 } ,
@@ -47,7 +46,7 @@
 
 static void blake2b_set_lastnode( blake2b_state *S )
 {
-  S->f[1] = (uint64_t)-1;
+  S->f[1] = (u64int)-1;
 }
 
 /* Some helper functions, not necessarily useful */
@@ -60,10 +59,10 @@
 {
   if( S->last_node ) blake2b_set_lastnode( S );
 
-  S->f[0] = (uint64_t)-1;
+  S->f[0] = (u64int)-1;
 }
 
-static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc )
+static void blake2b_increment_counter( blake2b_state *S, const u64int inc )
 {
   S->t[0] += inc;
   S->t[1] += ( S->t[0] < inc );
@@ -71,7 +70,7 @@
 
 static void blake2b_init0( blake2b_state *S )
 {
-  size_t i;
+  int i;
   memset( S, 0, sizeof( blake2b_state ) );
 
   for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i];
@@ -80,8 +79,8 @@
 /* init xors IV with input parameter block */
 int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
 {
-  const uint8_t *p = ( const uint8_t * )( P );
-  size_t i;
+  const u8int *p = ( const u8int * )( P );
+  int i;
 
   blake2b_init0( S );
 
@@ -95,13 +94,13 @@
 
 
 
-int blake2b_init( blake2b_state *S, size_t outlen )
+int blake2b_init( blake2b_state *S, int outlen )
 {
   blake2b_param P[1];
 
   if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1;
 
-  P->digest_length = (uint8_t)outlen;
+  P->digest_length = (u8int)outlen;
   P->key_length    = 0;
   P->fanout        = 1;
   P->depth         = 1;
@@ -117,7 +116,7 @@
 }
 
 
-int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen )
+int blake2b_init_key( blake2b_state *S, int outlen, const void *key, int keylen )
 {
   blake2b_param P[1];
 
@@ -125,8 +124,8 @@
 
   if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1;
 
-  P->digest_length = (uint8_t)outlen;
-  P->key_length    = (uint8_t)keylen;
+  P->digest_length = (u8int)outlen;
+  P->key_length    = (u8int)keylen;
   P->fanout        = 1;
   P->depth         = 1;
   store32( &P->leaf_length, 0 );
@@ -141,7 +140,7 @@
   if( blake2b_init_param( S, P ) < 0 ) return -1;
 
   {
-    uint8_t block[BLAKE2B_BLOCKBYTES];
+    u8int block[BLAKE2B_BLOCKBYTES];
     memset( block, 0, BLAKE2B_BLOCKBYTES );
     memcpy( block, key, keylen );
     blake2b_update( S, block, BLAKE2B_BLOCKBYTES );
@@ -174,11 +173,11 @@
     G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
   } while(0)
 
-static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
+static void blake2b_compress( blake2b_state *S, const u8int block[BLAKE2B_BLOCKBYTES] )
 {
-  uint64_t m[16];
-  uint64_t v[16];
-  size_t i;
+  u64int m[16];
+  u64int v[16];
+  int i;
 
   for( i = 0; i < 16; ++i ) {
     m[i] = load64( block + i * sizeof( m[i] ) );
@@ -218,13 +217,13 @@
 #undef G
 #undef ROUND
 
-int blake2b_update( blake2b_state *S, const void *pin, size_t inlen )
+int blake2b_update( blake2b_state *S, const void *pin, int inlen )
 {
   const unsigned char * in = (const unsigned char *)pin;
   if( inlen > 0 )
   {
-    size_t left = S->buflen;
-    size_t fill = BLAKE2B_BLOCKBYTES - left;
+    int left = S->buflen;
+    int fill = BLAKE2B_BLOCKBYTES - left;
     if( inlen > fill )
     {
       S->buflen = 0;
@@ -245,12 +244,12 @@
   return 0;
 }
 
-int blake2b_final( blake2b_state *S, void *out, size_t outlen )
+int blake2b_final( blake2b_state *S, void *out, int outlen )
 {
-  uint8_t buffer[BLAKE2B_OUTBYTES] = {0};
-  size_t i;
+  u8int buffer[BLAKE2B_OUTBYTES] = {0};
+  int i;
 
-  if( out == NULL || outlen < S->outlen )
+  if( out == nil || outlen < S->outlen )
     return -1;
 
   if( blake2b_is_lastblock( S ) )
@@ -269,17 +268,17 @@
   return 0;
 }
 
-/* inlen, at least, should be uint64_t. Others can be size_t. */
-int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen )
+/* inlen, at least, should be u64int. Others can be int. */
+int blake2b( void *out, int outlen, const void *in, int inlen, const void *key, int keylen )
 {
   blake2b_state S[1];
 
   /* Verify parameters */
-  if ( NULL == in && inlen > 0 ) return -1;
+  if ( nil == in && inlen > 0 ) return -1;
 
-  if ( NULL == out ) return -1;
+  if ( nil == out ) return -1;
 
-  if( NULL == key && keylen > 0 ) return -1;
+  if( nil == key && keylen > 0 ) return -1;
 
   if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1;
 
@@ -294,12 +293,12 @@
     if( blake2b_init( S, outlen ) < 0 ) return -1;
   }
 
-  blake2b_update( S, ( const uint8_t * )in, inlen );
+  blake2b_update( S, ( const u8int * )in, inlen );
   blake2b_final( S, out, outlen );
   return 0;
 }
 
-int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) {
+int blake2( void *out, int outlen, const void *in, int inlen, const void *key, int keylen ) {
   return blake2b(out, outlen, in, inlen, key, keylen);
 }
 
@@ -306,29 +305,28 @@
 #if defined(SUPERCOP)
 int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen )
 {
-  return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 );
+  return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, nil, 0 );
 }
 #endif
 
 #if defined(BLAKE2B_SELFTEST)
-#include <string.h>
 #include "blake2-kat.h"
 int main( void )
 {
-  uint8_t key[BLAKE2B_KEYBYTES];
-  uint8_t buf[BLAKE2_KAT_LENGTH];
-  size_t i, step;
+  u8int key[BLAKE2B_KEYBYTES];
+  u8int buf[BLAKE2_KAT_LENGTH];
+  int i, step;
 
   for( i = 0; i < BLAKE2B_KEYBYTES; ++i )
-    key[i] = ( uint8_t )i;
+    key[i] = ( u8int )i;
 
   for( i = 0; i < BLAKE2_KAT_LENGTH; ++i )
-    buf[i] = ( uint8_t )i;
+    buf[i] = ( u8int )i;
 
   /* Test simple API */
   for( i = 0; i < BLAKE2_KAT_LENGTH; ++i )
   {
-    uint8_t hash[BLAKE2B_OUTBYTES];
+    u8int hash[BLAKE2B_OUTBYTES];
     blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES );
 
     if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) )
@@ -340,10 +338,10 @@
   /* Test streaming API */
   for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) {
     for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) {
-      uint8_t hash[BLAKE2B_OUTBYTES];
+      u8int hash[BLAKE2B_OUTBYTES];
       blake2b_state S;
-      uint8_t * p = buf;
-      size_t mlen = i;
+      u8int * p = buf;
+      int mlen = i;
       int err = 0;
 
       if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) {
@@ -370,10 +368,9 @@
     }
   }
 
-  puts( "ok" );
-  return 0;
+  print( "ok\n" );
+  exits(nil);
 fail:
-  puts("error");
-  return -1;
+  sysfatal( "error" );
 }
 #endif
--- a/ref/blake2s-ref.c
+++ b/ref/blake2s-ref.c
@@ -13,20 +13,19 @@
    https://blake2.net.
 */
 
-#include <stdint.h>
-#include <string.h>
-#include <stdio.h>
+#include <u.h>
+#include <libc.h>
 
 #include "blake2.h"
 #include "blake2-impl.h"
 
-static const uint32_t blake2s_IV[8] =
+static const u32int blake2s_IV[8] =
 {
   0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL,
   0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL
 };
 
-static const uint8_t blake2s_sigma[10][16] =
+static const u8int blake2s_sigma[10][16] =
 {
   {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,
   { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 } ,
@@ -42,7 +41,7 @@
 
 static void blake2s_set_lastnode( blake2s_state *S )
 {
-  S->f[1] = (uint32_t)-1;
+  S->f[1] = (u32int)-1;
 }
 
 /* Some helper functions, not necessarily useful */
@@ -55,10 +54,10 @@
 {
   if( S->last_node ) blake2s_set_lastnode( S );
 
-  S->f[0] = (uint32_t)-1;
+  S->f[0] = (u32int)-1;
 }
 
-static void blake2s_increment_counter( blake2s_state *S, const uint32_t inc )
+static void blake2s_increment_counter( blake2s_state *S, const u32int inc )
 {
   S->t[0] += inc;
   S->t[1] += ( S->t[0] < inc );
@@ -66,7 +65,7 @@
 
 static void blake2s_init0( blake2s_state *S )
 {
-  size_t i;
+  int i;
   memset( S, 0, sizeof( blake2s_state ) );
 
   for( i = 0; i < 8; ++i ) S->h[i] = blake2s_IV[i];
@@ -76,7 +75,7 @@
 int blake2s_init_param( blake2s_state *S, const blake2s_param *P )
 {
   const unsigned char *p = ( const unsigned char * )( P );
-  size_t i;
+  int i;
 
   blake2s_init0( S );
 
@@ -90,7 +89,7 @@
 
 
 /* Sequential blake2s initialization */
-int blake2s_init( blake2s_state *S, size_t outlen )
+int blake2s_init( blake2s_state *S, int outlen )
 {
   blake2s_param P[1];
 
@@ -97,7 +96,7 @@
   /* Move interval verification here? */
   if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1;
 
-  P->digest_length = (uint8_t)outlen;
+  P->digest_length = (u8int)outlen;
   P->key_length    = 0;
   P->fanout        = 1;
   P->depth         = 1;
@@ -112,7 +111,7 @@
   return blake2s_init_param( S, P );
 }
 
-int blake2s_init_key( blake2s_state *S, size_t outlen, const void *key, size_t keylen )
+int blake2s_init_key( blake2s_state *S, int outlen, const void *key, int keylen )
 {
   blake2s_param P[1];
 
@@ -120,8 +119,8 @@
 
   if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1;
 
-  P->digest_length = (uint8_t)outlen;
-  P->key_length    = (uint8_t)keylen;
+  P->digest_length = (u8int)outlen;
+  P->key_length    = (u8int)keylen;
   P->fanout        = 1;
   P->depth         = 1;
   store32( &P->leaf_length, 0 );
@@ -136,7 +135,7 @@
   if( blake2s_init_param( S, P ) < 0 ) return -1;
 
   {
-    uint8_t block[BLAKE2S_BLOCKBYTES];
+    u8int block[BLAKE2S_BLOCKBYTES];
     memset( block, 0, BLAKE2S_BLOCKBYTES );
     memcpy( block, key, keylen );
     blake2s_update( S, block, BLAKE2S_BLOCKBYTES );
@@ -169,11 +168,11 @@
     G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
   } while(0)
 
-static void blake2s_compress( blake2s_state *S, const uint8_t in[BLAKE2S_BLOCKBYTES] )
+static void blake2s_compress( blake2s_state *S, const u8int in[BLAKE2S_BLOCKBYTES] )
 {
-  uint32_t m[16];
-  uint32_t v[16];
-  size_t i;
+  u32int m[16];
+  u32int v[16];
+  int i;
 
   for( i = 0; i < 16; ++i ) {
     m[i] = load32( in + i * sizeof( m[i] ) );
@@ -211,13 +210,13 @@
 #undef G
 #undef ROUND
 
-int blake2s_update( blake2s_state *S, const void *pin, size_t inlen )
+int blake2s_update( blake2s_state *S, const void *pin, int inlen )
 {
   const unsigned char * in = (const unsigned char *)pin;
   if( inlen > 0 )
   {
-    size_t left = S->buflen;
-    size_t fill = BLAKE2S_BLOCKBYTES - left;
+    int left = S->buflen;
+    int fill = BLAKE2S_BLOCKBYTES - left;
     if( inlen > fill )
     {
       S->buflen = 0;
@@ -238,18 +237,18 @@
   return 0;
 }
 
-int blake2s_final( blake2s_state *S, void *out, size_t outlen )
+int blake2s_final( blake2s_state *S, void *out, int outlen )
 {
-  uint8_t buffer[BLAKE2S_OUTBYTES] = {0};
-  size_t i;
+  u8int buffer[BLAKE2S_OUTBYTES] = {0};
+  int i;
 
-  if( out == NULL || outlen < S->outlen )
+  if( out == nil || outlen < S->outlen )
     return -1;
 
   if( blake2s_is_lastblock( S ) )
     return -1;
 
-  blake2s_increment_counter( S, ( uint32_t )S->buflen );
+  blake2s_increment_counter( S, ( u32int )S->buflen );
   blake2s_set_lastblock( S );
   memset( S->buf + S->buflen, 0, BLAKE2S_BLOCKBYTES - S->buflen ); /* Padding */
   blake2s_compress( S, S->buf );
@@ -262,16 +261,16 @@
   return 0;
 }
 
-int blake2s( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen )
+int blake2s( void *out, int outlen, const void *in, int inlen, const void *key, int keylen )
 {
   blake2s_state S[1];
 
   /* Verify parameters */
-  if ( NULL == in && inlen > 0 ) return -1;
+  if ( nil == in && inlen > 0 ) return -1;
 
-  if ( NULL == out ) return -1;
+  if ( nil == out ) return -1;
 
-  if ( NULL == key && keylen > 0) return -1;
+  if ( nil == key && keylen > 0) return -1;
 
   if( !outlen || outlen > BLAKE2S_OUTBYTES ) return -1;
 
@@ -286,7 +285,7 @@
     if( blake2s_init( S, outlen ) < 0 ) return -1;
   }
 
-  blake2s_update( S, ( const uint8_t * )in, inlen );
+  blake2s_update( S, ( const u8int * )in, inlen );
   blake2s_final( S, out, outlen );
   return 0;
 }
@@ -294,29 +293,28 @@
 #if defined(SUPERCOP)
 int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen )
 {
-  return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, NULL, 0 );
+  return blake2s( out, BLAKE2S_OUTBYTES, in, inlen, nil, 0 );
 }
 #endif
 
 #if defined(BLAKE2S_SELFTEST)
-#include <string.h>
 #include "blake2-kat.h"
 int main( void )
 {
-  uint8_t key[BLAKE2S_KEYBYTES];
-  uint8_t buf[BLAKE2_KAT_LENGTH];
-  size_t i, step;
+  u8int key[BLAKE2S_KEYBYTES];
+  u8int buf[BLAKE2_KAT_LENGTH];
+  int i, step;
 
   for( i = 0; i < BLAKE2S_KEYBYTES; ++i )
-    key[i] = ( uint8_t )i;
+    key[i] = ( u8int )i;
 
   for( i = 0; i < BLAKE2_KAT_LENGTH; ++i )
-    buf[i] = ( uint8_t )i;
+    buf[i] = ( u8int )i;
 
   /* Test simple API */
   for( i = 0; i < BLAKE2_KAT_LENGTH; ++i )
   {
-    uint8_t hash[BLAKE2S_OUTBYTES];
+    u8int hash[BLAKE2S_OUTBYTES];
     blake2s( hash, BLAKE2S_OUTBYTES, buf, i, key, BLAKE2S_KEYBYTES );
 
     if( 0 != memcmp( hash, blake2s_keyed_kat[i], BLAKE2S_OUTBYTES ) )
@@ -328,10 +326,10 @@
   /* Test streaming API */
   for(step = 1; step < BLAKE2S_BLOCKBYTES; ++step) {
     for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) {
-      uint8_t hash[BLAKE2S_OUTBYTES];
+      u8int hash[BLAKE2S_OUTBYTES];
       blake2s_state S;
-      uint8_t * p = buf;
-      size_t mlen = i;
+      u8int * p = buf;
+      int mlen = i;
       int err = 0;
 
       if( (err = blake2s_init_key(&S, BLAKE2S_OUTBYTES, key, BLAKE2S_KEYBYTES)) < 0 ) {
@@ -358,10 +356,9 @@
     }
   }
 
-  puts( "ok" );
-  return 0;
+  print( "ok\n" );
+  exits(nil);
 fail:
-  puts("error");
-  return -1;
+  sysfatal("fail");
 }
 #endif
--- /dev/null
+++ b/ref/mkfile
@@ -1,0 +1,18 @@
+</$objtype/mkfile
+TARG=\
+	blake2s-ref\
+	blake2b-ref\
+
+CFLAGS=$CFLAGS -p -D__plan9__ -I../testvectors/
+
+</sys/src/cmd/mkmany
+
+blake2s-ref.$O:	blake2s-ref.c
+	$CC $CFLAGS -D BLAKE2S_SELFTEST $prereq
+
+blake2b-ref.$O: blake2b-ref.c
+	$CC $CFLAGS -D BLAKE2B_SELFTEST $prereq
+
+run:V:	$PROGS
+	$O.blake2s-ref
+	$O.blake2b-ref
--- a/testvectors/blake2-kat.h
+++ b/testvectors/blake2-kat.h
@@ -2,13 +2,11 @@
 #define BLAKE2_KAT_H
 
 
-#include <stdint.h>
-
 #define BLAKE2_KAT_LENGTH 256
 
 
 
-static const uint8_t blake2s_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
+static const u8int blake2s_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
 {
 	{
 		0x69, 0x21, 0x7A, 0x30, 0x79, 0x90, 0x80, 0x94,
@@ -1551,7 +1549,7 @@
 
 
 
-static const uint8_t blake2s_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
+static const u8int blake2s_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
 {
 	{
 		0x48, 0xA8, 0x99, 0x7D, 0xA4, 0x07, 0x87, 0x6B,
@@ -3094,7 +3092,7 @@
 
 
 
-static const uint8_t blake2b_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
+static const u8int blake2b_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
 {
 	{
 		0x78, 0x6A, 0x02, 0xF7, 0x42, 0x01, 0x59, 0x03,
@@ -5661,7 +5659,7 @@
 
 
 
-static const uint8_t blake2b_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
+static const u8int blake2b_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
 {
 	{
 		0x10, 0xEB, 0xB6, 0x77, 0x00, 0xB1, 0x86, 0x8E,
@@ -8228,7 +8226,7 @@
 
 
 
-static const uint8_t blake2sp_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
+static const u8int blake2sp_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
 {
 	{
 		0xDD, 0x0E, 0x89, 0x17, 0x76, 0x93, 0x3F, 0x43,
@@ -9771,7 +9769,7 @@
 
 
 
-static const uint8_t blake2sp_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
+static const u8int blake2sp_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2S_OUTBYTES] = 
 {
 	{
 		0x71, 0x5C, 0xB1, 0x38, 0x95, 0xAE, 0xB6, 0x78,
@@ -11314,7 +11312,7 @@
 
 
 
-static const uint8_t blake2bp_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
+static const u8int blake2bp_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
 {
 	{
 		0xB5, 0xEF, 0x81, 0x1A, 0x80, 0x38, 0xF7, 0x0B,
@@ -13881,7 +13879,7 @@
 
 
 
-static const uint8_t blake2bp_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
+static const u8int blake2bp_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2B_OUTBYTES] = 
 {
 	{
 		0x9D, 0x94, 0x61, 0x07, 0x3E, 0x4E, 0xB6, 0x40,
@@ -16448,7 +16446,7 @@
 
 
 
-static const uint8_t blake2xs_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
+static const u8int blake2xs_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
 {
 	{
 		0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -25159,7 +25157,7 @@
 
 
 
-static const uint8_t blake2xs_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
+static const u8int blake2xs_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
 {
 	{
 		0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -33870,7 +33868,7 @@
 
 
 
-static const uint8_t blake2xb_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
+static const u8int blake2xb_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
 {
 	{
 		0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -42581,7 +42579,7 @@
 
 
 
-static const uint8_t blake2xb_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
+static const u8int blake2xb_keyed_kat[BLAKE2_KAT_LENGTH][BLAKE2_KAT_LENGTH] = 
 {
 	{
 		0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
--