streebog_generic.c (95d002e0a34cb0f238abb39987f9980f325d8332) streebog_generic.c (c4741b23059794bd99beef0f700103b0d983b3fd)
1// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause
2/*
3 * Streebog hash function as specified by GOST R 34.11-2012 and
4 * described at https://tools.ietf.org/html/rfc6986
5 *
6 * Copyright (c) 2013 Alexey Degtyarev <alexey@renatasystems.org>
7 * Copyright (c) 2018 Vitaly Chikunov <vt@altlinux.org>
8 *

--- 982 unchanged lines hidden (view full) ---

991 if (sum != left)
992 carry = (sum < left);
993 r->qword[i] = cpu_to_le64(sum);
994 }
995}
996
997static void streebog_g(struct streebog_uint512 *h,
998 const struct streebog_uint512 *N,
1// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause
2/*
3 * Streebog hash function as specified by GOST R 34.11-2012 and
4 * described at https://tools.ietf.org/html/rfc6986
5 *
6 * Copyright (c) 2013 Alexey Degtyarev <alexey@renatasystems.org>
7 * Copyright (c) 2018 Vitaly Chikunov <vt@altlinux.org>
8 *

--- 982 unchanged lines hidden (view full) ---

991 if (sum != left)
992 carry = (sum < left);
993 r->qword[i] = cpu_to_le64(sum);
994 }
995}
996
997static void streebog_g(struct streebog_uint512 *h,
998 const struct streebog_uint512 *N,
999 const u8 *m)
999 const struct streebog_uint512 *m)
1000{
1001 struct streebog_uint512 Ki, data;
1002 unsigned int i;
1003
1004 streebog_xlps(h, N, &data);
1005
1006 /* Starting E() */
1007 Ki = data;
1000{
1001 struct streebog_uint512 Ki, data;
1002 unsigned int i;
1003
1004 streebog_xlps(h, N, &data);
1005
1006 /* Starting E() */
1007 Ki = data;
1008 streebog_xlps(&Ki, (const struct streebog_uint512 *)&m[0], &data);
1008 streebog_xlps(&Ki, m, &data);
1009
1010 for (i = 0; i < 11; i++)
1011 streebog_round(i, &Ki, &data);
1012
1013 streebog_xlps(&Ki, &C[11], &Ki);
1014 streebog_xor(&Ki, &data, &data);
1015 /* E() done */
1016
1017 streebog_xor(&data, h, &data);
1009
1010 for (i = 0; i < 11; i++)
1011 streebog_round(i, &Ki, &data);
1012
1013 streebog_xlps(&Ki, &C[11], &Ki);
1014 streebog_xor(&Ki, &data, &data);
1015 /* E() done */
1016
1017 streebog_xor(&data, h, &data);
1018 streebog_xor(&data, (const struct streebog_uint512 *)&m[0], h);
1018 streebog_xor(&data, m, h);
1019}
1020
1021static void streebog_stage2(struct streebog_state *ctx, const u8 *data)
1022{
1019}
1020
1021static void streebog_stage2(struct streebog_state *ctx, const u8 *data)
1022{
1023 streebog_g(&ctx->h, &ctx->N, data);
1023 struct streebog_uint512 m;
1024
1024
1025 memcpy(&m, data, sizeof(m));
1026
1027 streebog_g(&ctx->h, &ctx->N, &m);
1028
1025 streebog_add512(&ctx->N, &buffer512, &ctx->N);
1029 streebog_add512(&ctx->N, &buffer512, &ctx->N);
1026 streebog_add512(&ctx->Sigma, (const struct streebog_uint512 *)data,
1027 &ctx->Sigma);
1030 streebog_add512(&ctx->Sigma, &m, &ctx->Sigma);
1028}
1029
1030static void streebog_stage3(struct streebog_state *ctx)
1031{
1032 struct streebog_uint512 buf = { { 0 } };
1033
1034 buf.qword[0] = cpu_to_le64(ctx->fillsize << 3);
1035 streebog_pad(ctx);
1036
1031}
1032
1033static void streebog_stage3(struct streebog_state *ctx)
1034{
1035 struct streebog_uint512 buf = { { 0 } };
1036
1037 buf.qword[0] = cpu_to_le64(ctx->fillsize << 3);
1038 streebog_pad(ctx);
1039
1037 streebog_g(&ctx->h, &ctx->N, (const u8 *)&ctx->buffer);
1040 streebog_g(&ctx->h, &ctx->N, &ctx->m);
1038 streebog_add512(&ctx->N, &buf, &ctx->N);
1041 streebog_add512(&ctx->N, &buf, &ctx->N);
1039 streebog_add512(&ctx->Sigma,
1040 (const struct streebog_uint512 *)&ctx->buffer[0],
1041 &ctx->Sigma);
1042 streebog_g(&ctx->h, &buffer0, (const u8 *)&ctx->N);
1043 streebog_g(&ctx->h, &buffer0, (const u8 *)&ctx->Sigma);
1042 streebog_add512(&ctx->Sigma, &ctx->m, &ctx->Sigma);
1043 streebog_g(&ctx->h, &buffer0, &ctx->N);
1044 streebog_g(&ctx->h, &buffer0, &ctx->Sigma);
1044 memcpy(&ctx->hash, &ctx->h, sizeof(struct streebog_uint512));
1045}
1046
1047static int streebog_update(struct shash_desc *desc, const u8 *data,
1048 unsigned int len)
1049{
1050 struct streebog_state *ctx = shash_desc_ctx(desc);
1051 size_t chunksize;

--- 70 unchanged lines hidden (view full) ---

1122 return crypto_register_shashes(algs, ARRAY_SIZE(algs));
1123}
1124
1125static void __exit streebog_mod_fini(void)
1126{
1127 crypto_unregister_shashes(algs, ARRAY_SIZE(algs));
1128}
1129
1045 memcpy(&ctx->hash, &ctx->h, sizeof(struct streebog_uint512));
1046}
1047
1048static int streebog_update(struct shash_desc *desc, const u8 *data,
1049 unsigned int len)
1050{
1051 struct streebog_state *ctx = shash_desc_ctx(desc);
1052 size_t chunksize;

--- 70 unchanged lines hidden (view full) ---

1123 return crypto_register_shashes(algs, ARRAY_SIZE(algs));
1124}
1125
1126static void __exit streebog_mod_fini(void)
1127{
1128 crypto_unregister_shashes(algs, ARRAY_SIZE(algs));
1129}
1130
1130module_init(streebog_mod_init);
1131subsys_initcall(streebog_mod_init);
1131module_exit(streebog_mod_fini);
1132
1133MODULE_LICENSE("GPL");
1134MODULE_AUTHOR("Vitaly Chikunov <vt@altlinux.org>");
1135MODULE_DESCRIPTION("Streebog Hash Function");
1136
1137MODULE_ALIAS_CRYPTO("streebog256");
1138MODULE_ALIAS_CRYPTO("streebog256-generic");
1139MODULE_ALIAS_CRYPTO("streebog512");
1140MODULE_ALIAS_CRYPTO("streebog512-generic");
1132module_exit(streebog_mod_fini);
1133
1134MODULE_LICENSE("GPL");
1135MODULE_AUTHOR("Vitaly Chikunov <vt@altlinux.org>");
1136MODULE_DESCRIPTION("Streebog Hash Function");
1137
1138MODULE_ALIAS_CRYPTO("streebog256");
1139MODULE_ALIAS_CRYPTO("streebog256-generic");
1140MODULE_ALIAS_CRYPTO("streebog512");
1141MODULE_ALIAS_CRYPTO("streebog512-generic");