Botan 3.11.0
Crypto and TLS for C&
sm3_fn.h
Go to the documentation of this file.
1/*
2* (C) 2017 Ribose Inc.
3* (C) 2021 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#ifndef BOTAN_SM3_FN_H_
9#define BOTAN_SM3_FN_H_
10
11#include <botan/types.h>
12#include <botan/internal/bit_ops.h>
13#include <botan/internal/rotate.h>
14
15namespace Botan {
16
17inline uint32_t P0(uint32_t X) {
18 return X ^ rotl<9>(X) ^ rotl<17>(X);
19}
20
21inline void R1(uint32_t A,
22 uint32_t& B,
23 uint32_t C,
24 uint32_t& D,
25 uint32_t E,
26 uint32_t& F,
27 uint32_t G,
28 uint32_t& H,
29 uint32_t TJ,
30 uint32_t Wi,
31 uint32_t Wj) {
32 const uint32_t A12 = rotl<12>(A);
33 const uint32_t SS1 = rotl<7>(A12 + E + TJ);
34 const uint32_t TT1 = (A ^ B ^ C) + D + (SS1 ^ A12) + (Wi ^ Wj);
35 const uint32_t TT2 = (E ^ F ^ G) + H + SS1 + Wi;
36
37 B = rotl<9>(B);
38 D = TT1;
39 F = rotl<19>(F);
40 H = P0(TT2);
41}
42
43inline void R2(uint32_t A,
44 uint32_t& B,
45 uint32_t C,
46 uint32_t& D,
47 uint32_t E,
48 uint32_t& F,
49 uint32_t G,
50 uint32_t& H,
51 uint32_t TJ,
52 uint32_t Wi,
53 uint32_t Wj) {
54 const uint32_t A12 = rotl<12>(A);
55 const uint32_t SS1 = rotl<7>(A12 + E + TJ);
56 const uint32_t TT1 = majority(A, B, C) + D + (SS1 ^ A12) + (Wi ^ Wj);
57 const uint32_t TT2 = choose(E, F, G) + H + SS1 + Wi;
58
59 B = rotl<9>(B);
60 D = TT1;
61 F = rotl<19>(F);
62 H = P0(TT2);
63}
64
65inline uint32_t P1(uint32_t X) {
66 return X ^ rotl<15>(X) ^ rotl<23>(X);
67}
68
69inline uint32_t SM3_E(uint32_t W0, uint32_t W7, uint32_t W13, uint32_t W3, uint32_t W10) {
70 return P1(W0 ^ W7 ^ rotl<15>(W13)) ^ rotl<7>(W3) ^ W10;
71}
72
73} // namespace Botan
74
75#endif
uint32_t P1(uint32_t X)
Definition sm3_fn.h:65
BOTAN_FORCE_INLINE constexpr T majority(T a, T b, T c)
Definition bit_ops.h:222
uint32_t SM3_E(uint32_t W0, uint32_t W7, uint32_t W13, uint32_t W3, uint32_t W10)
Definition sm3_fn.h:69
uint32_t P0(uint32_t X)
Definition sm3_fn.h:17
void R2(uint32_t A, uint32_t &B, uint32_t C, uint32_t &D, uint32_t E, uint32_t &F, uint32_t G, uint32_t &H, uint32_t TJ, uint32_t Wi, uint32_t Wj)
Definition sm3_fn.h:43
BOTAN_FORCE_INLINE constexpr T rotl(T input)
Definition rotate.h:23
void R1(uint32_t A, uint32_t &B, uint32_t C, uint32_t &D, uint32_t E, uint32_t &F, uint32_t G, uint32_t &H, uint32_t TJ, uint32_t Wi, uint32_t Wj)
Definition sm3_fn.h:21
BOTAN_FORCE_INLINE constexpr T choose(T mask, T a, T b)
Definition bit_ops.h:216