Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/boringssl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Benjamin <davidben@google.com>2016-04-20 06:51:11 +0300
committerAdam Langley <agl@google.com>2016-04-27 21:45:12 +0300
commita90aa643024459c1698dbec84f4c79a3238b3db8 (patch)
tree792c14ec005b323bdaebef87b8a03b814827a5b9
parente3118b8dc4c05abc8ed822a181e81a2a070ebe61 (diff)
Pull HASH_MAKE_STRING out of md32_common.h.
This is in preparation for taking md_len out of SHA256_CTX by allowing us to do something similar to SHA512_CTX. md32_common.h now emits a static "finish" function which Final composes with the extraction step. Change-Id: I314fb31e2482af642fd280500cc0e4716aef1ac6 Reviewed-on: https://boringssl-review.googlesource.com/7721 Reviewed-by: Adam Langley <agl@google.com>
-rw-r--r--crypto/digest/md32_common.h21
-rw-r--r--crypto/md4/md4.c30
-rw-r--r--crypto/md5/md5.c30
-rw-r--r--crypto/sha/sha1.c34
-rw-r--r--crypto/sha/sha256.c75
-rw-r--r--decrepit/ripemd/internal.h16
-rw-r--r--decrepit/ripemd/ripemd.c18
7 files changed, 112 insertions, 112 deletions
diff --git a/crypto/digest/md32_common.h b/crypto/digest/md32_common.h
index 4cf050ca..77aaa449 100644
--- a/crypto/digest/md32_common.h
+++ b/crypto/digest/md32_common.h
@@ -90,7 +90,7 @@ extern "C" {
* |HASH_TRANSFORM| must be defined as the the name of the "Transform"
* function to generate.
*
- * |HASH_FINAL| must be defined as the name of "Final" function to generate.
+ * |HASH_FINISH| must be defined as the name of "finish" function to generate.
*
* |HASH_BLOCK_DATA_ORDER| must be defined as the name of the "Block" function.
* That function must be implemented manually. It must be capable of operating
@@ -103,11 +103,7 @@ extern "C" {
* It must update the hash state |state| with |num| blocks of data from |data|,
* where each block is |HASH_CBLOCK| bytes; i.e. |data| points to a array of
* |HASH_CBLOCK * num| bytes. |state| points to the |h| member of a |HASH_CTX|,
- * and so will have |<chaining length> / sizeof(uint32_t)| elements.
- *
- * |HASH_MAKE_STRING(c, s)| must be defined as a block statement that converts
- * the hash state |c->h| into the output byte order, storing the result in |s|.
- */
+ * and so will have |<chaining length> / sizeof(uint32_t)| elements. */
#if !defined(DATA_ORDER_IS_BIG_ENDIAN) && !defined(DATA_ORDER_IS_LITTLE_ENDIAN)
#error "DATA_ORDER must be defined!"
@@ -126,18 +122,14 @@ extern "C" {
#ifndef HASH_TRANSFORM
#error "HASH_TRANSFORM must be defined!"
#endif
-#ifndef HASH_FINAL
-#error "HASH_FINAL must be defined!"
+#ifndef HASH_FINISH
+#error "HASH_FINISH must be defined!"
#endif
#ifndef HASH_BLOCK_DATA_ORDER
#error "HASH_BLOCK_DATA_ORDER must be defined!"
#endif
-#ifndef HASH_MAKE_STRING
-#error "HASH_MAKE_STRING must be defined!"
-#endif
-
#if defined(DATA_ORDER_IS_BIG_ENDIAN)
#define HOST_c2l(c, l) \
@@ -220,7 +212,7 @@ void HASH_TRANSFORM(HASH_CTX *c, const uint8_t *data) {
}
-int HASH_FINAL(uint8_t *md, HASH_CTX *c) {
+static void HASH_FINISH(HASH_CTX *c) {
/* |c->data| always has room for at least one byte. A full block would have
* been consumed. */
size_t n = c->num;
@@ -249,9 +241,6 @@ int HASH_FINAL(uint8_t *md, HASH_CTX *c) {
HASH_BLOCK_DATA_ORDER(c->h, c->data, 1);
c->num = 0;
memset(c->data, 0, HASH_CBLOCK);
-
- HASH_MAKE_STRING(c, md);
- return 1;
}
diff --git a/crypto/md4/md4.c b/crypto/md4/md4.c
index f79da9fd..5293f14a 100644
--- a/crypto/md4/md4.c
+++ b/crypto/md4/md4.c
@@ -88,23 +88,27 @@ void md4_block_data_order(uint32_t *state, const uint8_t *data, size_t num);
#define HASH_CBLOCK 64
#define HASH_UPDATE MD4_Update
#define HASH_TRANSFORM MD4_Transform
-#define HASH_FINAL MD4_Final
-#define HASH_MAKE_STRING(c, s) \
- do { \
- uint32_t ll; \
- ll = (c)->h[0]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[1]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[2]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[3]; \
- HOST_l2c(ll, (s)); \
- } while (0)
+#define HASH_FINISH md4_finish
#define HASH_BLOCK_DATA_ORDER md4_block_data_order
#include "../digest/md32_common.h"
+int MD4_Final(uint8_t *md, MD4_CTX *md4) {
+ md4_finish(md4);
+
+ uint32_t ll;
+ ll = md4->h[0];
+ HOST_l2c(ll, md);
+ ll = md4->h[1];
+ HOST_l2c(ll, md);
+ ll = md4->h[2];
+ HOST_l2c(ll, md);
+ ll = md4->h[3];
+ HOST_l2c(ll, md);
+
+ return 1;
+}
+
/* As pointed out by Wei Dai <weidai@eskimo.com>, the above can be
* simplified to the code below. Wei attributes these optimizations
* to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel. */
diff --git a/crypto/md5/md5.c b/crypto/md5/md5.c
index 66483b84..ad37537b 100644
--- a/crypto/md5/md5.c
+++ b/crypto/md5/md5.c
@@ -101,23 +101,27 @@ void md5_block_data_order(uint32_t *state, const uint8_t *data, size_t num);
#define HASH_CBLOCK 64
#define HASH_UPDATE MD5_Update
#define HASH_TRANSFORM MD5_Transform
-#define HASH_FINAL MD5_Final
-#define HASH_MAKE_STRING(c, s) \
- do { \
- uint32_t ll; \
- ll = (c)->h[0]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[1]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[2]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[3]; \
- HOST_l2c(ll, (s)); \
- } while (0)
+#define HASH_FINISH md5_finish
#define HASH_BLOCK_DATA_ORDER md5_block_data_order
#include "../digest/md32_common.h"
+int MD5_Final(uint8_t *md, MD5_CTX *md5) {
+ md5_finish(md5);
+
+ uint32_t ll;
+ ll = md5->h[0];
+ HOST_l2c(ll, md);
+ ll = md5->h[1];
+ HOST_l2c(ll, md);
+ ll = md5->h[2];
+ HOST_l2c(ll, md);
+ ll = md5->h[3];
+ HOST_l2c(ll, md);
+
+ return 1;
+}
+
/* As pointed out by Wei Dai <weidai@eskimo.com>, the above can be
* simplified to the code below. Wei attributes these optimizations
* to Peter Gutmann's SHS code, and he attributes it to Rich Schroeppel.
diff --git a/crypto/sha/sha1.c b/crypto/sha/sha1.c
index 74e841ca..5967af0c 100644
--- a/crypto/sha/sha1.c
+++ b/crypto/sha/sha1.c
@@ -98,24 +98,10 @@ uint8_t *SHA1(const uint8_t *data, size_t len, uint8_t *out) {
#define HASH_CTX SHA_CTX
#define HASH_CBLOCK 64
-#define HASH_MAKE_STRING(c, s) \
- do { \
- uint32_t ll; \
- ll = (c)->h[0]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[1]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[2]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[3]; \
- HOST_l2c(ll, (s)); \
- ll = (c)->h[4]; \
- HOST_l2c(ll, (s)); \
- } while (0)
#define HASH_UPDATE SHA1_Update
#define HASH_TRANSFORM SHA1_Transform
-#define HASH_FINAL SHA1_Final
+#define HASH_FINISH sha1_finish
#define HASH_BLOCK_DATA_ORDER sha1_block_data_order
#define ROTATE(a, n) (((a) << (n)) | ((a) >> (32 - (n))))
#define Xupdate(a, ix, ia, ib, ic, id) \
@@ -128,6 +114,24 @@ void sha1_block_data_order(uint32_t *state, const uint8_t *data, size_t num);
#include "../digest/md32_common.h"
+int SHA1_Final(uint8_t *md, SHA_CTX *sha) {
+ sha1_finish(sha);
+
+ uint32_t ll;
+ ll = sha->h[0];
+ HOST_l2c(ll, md);
+ ll = sha->h[1];
+ HOST_l2c(ll, md);
+ ll = sha->h[2];
+ HOST_l2c(ll, md);
+ ll = sha->h[3];
+ HOST_l2c(ll, md);
+ ll = sha->h[4];
+ HOST_l2c(ll, md);
+
+ return 1;
+}
+
#define K_00_19 0x5a827999UL
#define K_20_39 0x6ed9eba1UL
#define K_40_59 0x8f1bbcdcUL
diff --git a/crypto/sha/sha256.c b/crypto/sha/sha256.c
index 0ddacbad..d165cffe 100644
--- a/crypto/sha/sha256.c
+++ b/crypto/sha/sha256.c
@@ -138,48 +138,9 @@ int SHA224_Final(uint8_t *md, SHA256_CTX *ctx) {
#define HASH_CTX SHA256_CTX
#define HASH_CBLOCK 64
-/* Note that FIPS180-2 discusses "Truncation of the Hash Function Output."
- * default: case below covers for it. It's not clear however if it's permitted
- * to truncate to amount of bytes not divisible by 4. I bet not, but if it is,
- * then default: case shall be extended. For reference. Idea behind separate
- * cases for pre-defined lenghts is to let the compiler decide if it's
- * appropriate to unroll small loops.
- *
- * TODO(davidben): The small |md_len| case is one of the few places a low-level
- * hash 'final' function can fail. This should never happen. */
-#define HASH_MAKE_STRING(c, s) \
- do { \
- uint32_t ll; \
- unsigned int nn; \
- switch ((c)->md_len) { \
- case SHA224_DIGEST_LENGTH: \
- for (nn = 0; nn < SHA224_DIGEST_LENGTH / 4; nn++) { \
- ll = (c)->h[nn]; \
- HOST_l2c(ll, (s)); \
- } \
- break; \
- case SHA256_DIGEST_LENGTH: \
- for (nn = 0; nn < SHA256_DIGEST_LENGTH / 4; nn++) { \
- ll = (c)->h[nn]; \
- HOST_l2c(ll, (s)); \
- } \
- break; \
- default: \
- if ((c)->md_len > SHA256_DIGEST_LENGTH) { \
- return 0; \
- } \
- for (nn = 0; nn < (c)->md_len / 4; nn++) { \
- ll = (c)->h[nn]; \
- HOST_l2c(ll, (s)); \
- } \
- break; \
- } \
- } while (0)
-
-
#define HASH_UPDATE SHA256_Update
#define HASH_TRANSFORM SHA256_Transform
-#define HASH_FINAL SHA256_Final
+#define HASH_FINISH sha256_finish
#define HASH_BLOCK_DATA_ORDER sha256_block_data_order
#ifndef SHA256_ASM
static
@@ -188,6 +149,40 @@ void sha256_block_data_order(uint32_t *state, const uint8_t *in, size_t num);
#include "../digest/md32_common.h"
+int SHA256_Final(uint8_t *md, SHA256_CTX *sha) {
+ sha256_finish(sha);
+
+ /* TODO(davidben): Replace this with different versions of SHA256_Final
+ * and SHA224_Final. */
+ uint32_t ll;
+ unsigned int nn;
+ switch (sha->md_len) {
+ case SHA224_DIGEST_LENGTH:
+ for (nn = 0; nn < SHA224_DIGEST_LENGTH / 4; nn++) {
+ ll = sha->h[nn];
+ HOST_l2c(ll, md);
+ }
+ break;
+ case SHA256_DIGEST_LENGTH:
+ for (nn = 0; nn < SHA256_DIGEST_LENGTH / 4; nn++) {
+ ll = sha->h[nn];
+ HOST_l2c(ll, md);
+ }
+ break;
+ default:
+ if (sha->md_len > SHA256_DIGEST_LENGTH) {
+ return 0;
+ }
+ for (nn = 0; nn < sha->md_len / 4; nn++) {
+ ll = sha->h[nn];
+ HOST_l2c(ll, md);
+ }
+ break;
+ }
+
+ return 1;
+}
+
#ifndef SHA256_ASM
static const uint32_t K256[64] = {
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
diff --git a/decrepit/ripemd/internal.h b/decrepit/ripemd/internal.h
index c4db4b23..dea532ba 100644
--- a/decrepit/ripemd/internal.h
+++ b/decrepit/ripemd/internal.h
@@ -74,21 +74,7 @@ static void ripemd160_block_data_order(uint32_t h[5], const uint8_t *data,
#define HASH_CBLOCK RIPEMD160_CBLOCK
#define HASH_UPDATE RIPEMD160_Update
#define HASH_TRANSFORM RIPEMD160_Transform
-#define HASH_FINAL RIPEMD160_Final
-#define HASH_MAKE_STRING(c, s) \
- do { \
- unsigned long ll; \
- ll = (c)->h[0]; \
- (void)HOST_l2c(ll, (s)); \
- ll = (c)->h[1]; \
- (void)HOST_l2c(ll, (s)); \
- ll = (c)->h[2]; \
- (void)HOST_l2c(ll, (s)); \
- ll = (c)->h[3]; \
- (void)HOST_l2c(ll, (s)); \
- ll = (c)->h[4]; \
- (void)HOST_l2c(ll, (s)); \
- } while (0)
+#define HASH_FINISH ripemd160_finish
#define HASH_BLOCK_DATA_ORDER ripemd160_block_data_order
#include "../../crypto/digest/md32_common.h"
diff --git a/decrepit/ripemd/ripemd.c b/decrepit/ripemd/ripemd.c
index 6ed7816c..c871ea76 100644
--- a/decrepit/ripemd/ripemd.c
+++ b/decrepit/ripemd/ripemd.c
@@ -71,6 +71,24 @@ int RIPEMD160_Init(RIPEMD160_CTX *ctx) {
return 1;
}
+int RIPEMD160_Final(uint8_t *md, RIPEMD160_CTX *ctx) {
+ ripemd160_finish(ctx);
+
+ unsigned long ll;
+ ll = ctx->h[0];
+ (void)HOST_l2c(ll, md);
+ ll = ctx->h[1];
+ (void)HOST_l2c(ll, md);
+ ll = ctx->h[2];
+ (void)HOST_l2c(ll, md);
+ ll = ctx->h[3];
+ (void)HOST_l2c(ll, md);
+ ll = ctx->h[4];
+ (void)HOST_l2c(ll, md);
+
+ return 1;
+}
+
static void ripemd160_block_data_order(uint32_t h[5], const uint8_t *data,
size_t num) {
uint32_t A, B, C, D, E;