diff options
author | Stephan Mueller <smueller@chronox.de> | 2014-08-17 11:37:34 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-08-25 08:34:07 -0400 |
commit | 72f3e00dd67ec449199a8844bc012a4fa1e0340a (patch) | |
tree | b73c93435e7f60dd8064e6e73b83b974ecff0abe /crypto | |
parent | 4451d494b1910bf7b7f8381a637d0fe6d2142467 (diff) |
crypto: drbg - replace int2byte with cpu_to_be
The DRBG requires the conversion of an integer into a string
representation of that integer. The previous implementation converted
the given integer byte-wise. However, the kernel offers the cpu_to_be
function which already re-arranges the memory representation of an
integer such that it applies when interpreting the same memory as
character string.
The change therefore uses an integer-cast / union of the target
character array together with the cpu_to_be function to convert an
integer into its string representation.
Tests show that the Hash and CTR DRBG implementations (the HMAC DRBG
does not require such conversion) is about 10% faster (or requires less
computing power, respectively).
Signed-off-by: Stephan Mueller <smueller@chronox.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/drbg.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/crypto/drbg.c b/crypto/drbg.c index 7894db9ca90b..d86c67792e61 100644 --- a/crypto/drbg.c +++ b/crypto/drbg.c | |||
@@ -302,20 +302,19 @@ static bool drbg_fips_continuous_test(struct drbg_state *drbg, | |||
302 | * Convert an integer into a byte representation of this integer. | 302 | * Convert an integer into a byte representation of this integer. |
303 | * The byte representation is big-endian | 303 | * The byte representation is big-endian |
304 | * | 304 | * |
305 | * @buf buffer holding the converted integer | ||
306 | * @val value to be converted | 305 | * @val value to be converted |
307 | * @buflen length of buffer | 306 | * @buf buffer holding the converted integer -- caller must ensure that |
307 | * buffer size is at least 32 bit | ||
308 | */ | 308 | */ |
309 | #if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR)) | 309 | #if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR)) |
310 | static inline void drbg_int2byte(unsigned char *buf, uint64_t val, | 310 | static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf) |
311 | size_t buflen) | ||
312 | { | 311 | { |
313 | unsigned char *byte; | 312 | struct s { |
314 | uint64_t i; | 313 | __u32 conv; |
314 | }; | ||
315 | struct s *conversion = (struct s *) buf; | ||
315 | 316 | ||
316 | byte = buf + (buflen - 1); | 317 | conversion->conv = cpu_to_be32(val); |
317 | for (i = 0; i < buflen; i++) | ||
318 | *(byte--) = val >> (i * 8) & 0xff; | ||
319 | } | 318 | } |
320 | 319 | ||
321 | /* | 320 | /* |
@@ -483,10 +482,10 @@ static int drbg_ctr_df(struct drbg_state *drbg, | |||
483 | /* 10.4.2 step 2 -- calculate the entire length of all input data */ | 482 | /* 10.4.2 step 2 -- calculate the entire length of all input data */ |
484 | list_for_each_entry(seed, seedlist, list) | 483 | list_for_each_entry(seed, seedlist, list) |
485 | inputlen += seed->len; | 484 | inputlen += seed->len; |
486 | drbg_int2byte(&L_N[0], inputlen, 4); | 485 | drbg_cpu_to_be32(inputlen, &L_N[0]); |
487 | 486 | ||
488 | /* 10.4.2 step 3 */ | 487 | /* 10.4.2 step 3 */ |
489 | drbg_int2byte(&L_N[4], bytes_to_return, 4); | 488 | drbg_cpu_to_be32(bytes_to_return, &L_N[4]); |
490 | 489 | ||
491 | /* 10.4.2 step 5: length is L_N, input_string, one byte, padding */ | 490 | /* 10.4.2 step 5: length is L_N, input_string, one byte, padding */ |
492 | padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg)); | 491 | padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg)); |
@@ -517,7 +516,7 @@ static int drbg_ctr_df(struct drbg_state *drbg, | |||
517 | * holds zeros after allocation -- even the increment of i | 516 | * holds zeros after allocation -- even the increment of i |
518 | * is irrelevant as the increment remains within length of i | 517 | * is irrelevant as the increment remains within length of i |
519 | */ | 518 | */ |
520 | drbg_int2byte(iv, i, 4); | 519 | drbg_cpu_to_be32(i, iv); |
521 | /* 10.4.2 step 9.2 -- BCC and concatenation with temp */ | 520 | /* 10.4.2 step 9.2 -- BCC and concatenation with temp */ |
522 | ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list); | 521 | ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list); |
523 | if (ret) | 522 | if (ret) |
@@ -862,7 +861,7 @@ static int drbg_hash_df(struct drbg_state *drbg, | |||
862 | 861 | ||
863 | /* 10.4.1 step 3 */ | 862 | /* 10.4.1 step 3 */ |
864 | input[0] = 1; | 863 | input[0] = 1; |
865 | drbg_int2byte(&input[1], (outlen * 8), 4); | 864 | drbg_cpu_to_be32((outlen * 8), &input[1]); |
866 | 865 | ||
867 | /* 10.4.1 step 4.1 -- concatenation of data for input into hash */ | 866 | /* 10.4.1 step 4.1 -- concatenation of data for input into hash */ |
868 | drbg_string_fill(&data, input, 5); | 867 | drbg_string_fill(&data, input, 5); |
@@ -1023,7 +1022,10 @@ static int drbg_hash_generate(struct drbg_state *drbg, | |||
1023 | { | 1022 | { |
1024 | int len = 0; | 1023 | int len = 0; |
1025 | int ret = 0; | 1024 | int ret = 0; |
1026 | unsigned char req[8]; | 1025 | union { |
1026 | unsigned char req[8]; | ||
1027 | __u64 req_int; | ||
1028 | } u; | ||
1027 | unsigned char prefix = DRBG_PREFIX3; | 1029 | unsigned char prefix = DRBG_PREFIX3; |
1028 | struct drbg_string data1, data2; | 1030 | struct drbg_string data1, data2; |
1029 | LIST_HEAD(datalist); | 1031 | LIST_HEAD(datalist); |
@@ -1053,8 +1055,8 @@ static int drbg_hash_generate(struct drbg_state *drbg, | |||
1053 | drbg->scratchpad, drbg_blocklen(drbg)); | 1055 | drbg->scratchpad, drbg_blocklen(drbg)); |
1054 | drbg_add_buf(drbg->V, drbg_statelen(drbg), | 1056 | drbg_add_buf(drbg->V, drbg_statelen(drbg), |
1055 | drbg->C, drbg_statelen(drbg)); | 1057 | drbg->C, drbg_statelen(drbg)); |
1056 | drbg_int2byte(req, drbg->reseed_ctr, sizeof(req)); | 1058 | u.req_int = cpu_to_be64(drbg->reseed_ctr); |
1057 | drbg_add_buf(drbg->V, drbg_statelen(drbg), req, 8); | 1059 | drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8); |
1058 | 1060 | ||
1059 | out: | 1061 | out: |
1060 | memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); | 1062 | memset(drbg->scratchpad, 0, drbg_blocklen(drbg)); |