]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
siphash: Add the C and D round parameters for SipHash.
authorPauli <ppzgs1@gmail.com>
Wed, 24 Feb 2021 23:52:26 +0000 (09:52 +1000)
committerPauli <ppzgs1@gmail.com>
Sun, 28 Feb 2021 07:25:48 +0000 (17:25 +1000)
This represents a gap in functionality from the low level APIs.

Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/14310)

crypto/siphash/siphash.c
crypto/siphash/siphash_local.h
doc/man7/EVP_MAC-Siphash.pod
include/openssl/core_names.h
providers/implementations/macs/siphash_prov.c

index 03f9b4982d4b70ed809c6916e3fa80e3c931cec0..eaad0a8e4a7d37def6856016c4afb2f6614c044d 100644 (file)
 #include "crypto/siphash.h"
 #include "siphash_local.h"
 
-/* default: SipHash-2-4 */
-#define SIPHASH_C_ROUNDS 2
-#define SIPHASH_D_ROUNDS 4
-
 #define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
 
 #define U32TO8_LE(p, v)                                                        \
@@ -146,7 +142,7 @@ void SipHash_Update(SIPHASH *ctx, const unsigned char *in, size_t inlen)
     uint64_t m;
     const uint8_t *end;
     int left;
-    int i;
+    unsigned int i;
     uint64_t v0 = ctx->v0;
     uint64_t v1 = ctx->v1;
     uint64_t v2 = ctx->v2;
@@ -202,7 +198,7 @@ void SipHash_Update(SIPHASH *ctx, const unsigned char *in, size_t inlen)
 int SipHash_Final(SIPHASH *ctx, unsigned char *out, size_t outlen)
 {
     /* finalize hash */
-    int i;
+    unsigned int i;
     uint64_t b = ctx->total_inlen << 56;
     uint64_t v0 = ctx->v0;
     uint64_t v1 = ctx->v1;
index 4841284c04f0c5f2c22ce71f1fc80ab84a8cc569..8cd7c208ccf25aaa8a5dc82c4faab0e5f61a124d 100644 (file)
@@ -16,8 +16,13 @@ struct siphash_st {
     uint64_t v2;
     uint64_t v3;
     unsigned int len;
-    int hash_size;
-    int crounds;
-    int drounds;
+    unsigned int hash_size;
+    unsigned int crounds;
+    unsigned int drounds;
     unsigned char leavings[SIPHASH_BLOCK_SIZE];
 };
+
+/* default: SipHash-2-4 */
+#define SIPHASH_C_ROUNDS 2
+#define SIPHASH_D_ROUNDS 4
+
index d0a4226ae5f9c16f1d2e4a5c1b9a9634bc61be6c..2b6f2ae4e4070283d917876c45ef07870a54c5c4 100644 (file)
@@ -36,6 +36,14 @@ The length of the "size" parameter should not exceed that of a B<size_t>.
 
 =item "size" (B<OSSL_MAC_PARAM_SIZE>) <unsigned integer>
 
+=item "c-rounds" (B<OSSL_MAC_PARAM_C_ROUNDS>) <unsigned integer>
+
+Specifies the number of rounds per message block.  By default this is I<2>.
+
+=item "d-rounds" (B<OSSL_MAC_PARAM_D_ROUNDS>) <unsigned integer>
+
+Specifies the number of finalisation rounds.  By default this is I<4>.
+
 =back
 
 =head1 SEE ALSO
index cb8d83ba88ad00737953070a016431c4405c3f84..0f242e36055b280cc9abd5cc5f22beec268e694e 100644 (file)
@@ -158,6 +158,8 @@ extern "C" {
 #define OSSL_MAC_PARAM_XOF            "xof"            /* int, 0 or 1 */
 #define OSSL_MAC_PARAM_DIGEST_NOINIT  "digest-noinit"  /* int, 0 or 1 */
 #define OSSL_MAC_PARAM_DIGEST_ONESHOT "digest-oneshot" /* int, 0 or 1 */
+#define OSSL_MAC_PARAM_C_ROUNDS       "c-rounds"       /* unsigned int */
+#define OSSL_MAC_PARAM_D_ROUNDS       "d-rounds"       /* unsigned int */
 
 /*
  * If "engine" or "properties" are specified, they should always be paired
index 95a345495ef37017ee7a8672d104b2e768e546ae..bc7cb0e3ed052cbd5f34563bb96a7ad3bcb9c6d5 100644 (file)
@@ -88,7 +88,6 @@ static size_t siphash_size(void *vmacctx)
 
 static int siphash_init(void *vmacctx)
 {
-    /* Not much to do here, actual initialization happens through controls */
     return ossl_prov_is_running();
 }
 
@@ -140,6 +139,8 @@ static int siphash_get_ctx_params(void *vmacctx, OSSL_PARAM params[])
 static const OSSL_PARAM known_settable_ctx_params[] = {
     OSSL_PARAM_size_t(OSSL_MAC_PARAM_SIZE, NULL),
     OSSL_PARAM_octet_string(OSSL_MAC_PARAM_KEY, NULL, 0),
+    OSSL_PARAM_uint(OSSL_MAC_PARAM_C_ROUNDS, NULL),
+    OSSL_PARAM_uint(OSSL_MAC_PARAM_D_ROUNDS, NULL),
     OSSL_PARAM_END
 };
 
@@ -153,10 +154,10 @@ static int siphash_set_params(void *vmacctx, const OSSL_PARAM *params)
 {
     struct siphash_data_st *ctx = vmacctx;
     const OSSL_PARAM *p = NULL;
+    unsigned int u;
+    size_t size;
 
     if ((p = OSSL_PARAM_locate_const(params, OSSL_MAC_PARAM_SIZE)) != NULL) {
-        size_t size;
-
         if (!OSSL_PARAM_get_size_t(p, &size)
             || !SipHash_set_hash_size(&ctx->siphash, size))
             return 0;
@@ -166,6 +167,18 @@ static int siphash_set_params(void *vmacctx, const OSSL_PARAM *params)
             || p->data_size != SIPHASH_KEY_SIZE
             || !SipHash_Init(&ctx->siphash, p->data, 0, 0))
             return 0;
+    if ((p = OSSL_PARAM_locate_const(params, OSSL_MAC_PARAM_C_ROUNDS)) != NULL) {
+        if (!OSSL_PARAM_get_uint(p, &ctx->siphash.crounds))
+            return 0;
+        if (ctx->siphash.crounds == 0)
+            ctx->siphash.crounds = SIPHASH_C_ROUNDS;
+    }
+    if ((p = OSSL_PARAM_locate_const(params, OSSL_MAC_PARAM_D_ROUNDS)) != NULL) {
+        if (!OSSL_PARAM_get_uint(p, &ctx->siphash.drounds))
+            return 0;
+        if (ctx->siphash.drounds == 0)
+            ctx->siphash.drounds = SIPHASH_D_ROUNDS;
+    }
     return 1;
 }