/src/BearSSL/src/symcipher/aes_big_ctrcbc.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org> |
3 | | * |
4 | | * Permission is hereby granted, free of charge, to any person obtaining |
5 | | * a copy of this software and associated documentation files (the |
6 | | * "Software"), to deal in the Software without restriction, including |
7 | | * without limitation the rights to use, copy, modify, merge, publish, |
8 | | * distribute, sublicense, and/or sell copies of the Software, and to |
9 | | * permit persons to whom the Software is furnished to do so, subject to |
10 | | * the following conditions: |
11 | | * |
12 | | * The above copyright notice and this permission notice shall be |
13 | | * included in all copies or substantial portions of the Software. |
14 | | * |
15 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
16 | | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
17 | | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
18 | | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
19 | | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
20 | | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
21 | | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
22 | | * SOFTWARE. |
23 | | */ |
24 | | |
25 | | #include "inner.h" |
26 | | |
27 | | /* see bearssl_block.h */ |
28 | | void |
29 | | br_aes_big_ctrcbc_init(br_aes_big_ctrcbc_keys *ctx, |
30 | | const void *key, size_t len) |
31 | 2.07k | { |
32 | 2.07k | ctx->vtable = &br_aes_big_ctrcbc_vtable; |
33 | 2.07k | ctx->num_rounds = br_aes_keysched(ctx->skey, key, len); |
34 | 2.07k | } |
35 | | |
36 | | static void |
37 | | xorbuf(void *dst, const void *src, size_t len) |
38 | 209k | { |
39 | 209k | unsigned char *d; |
40 | 209k | const unsigned char *s; |
41 | | |
42 | 209k | d = dst; |
43 | 209k | s = src; |
44 | 3.56M | while (len -- > 0) { |
45 | 3.35M | *d ++ ^= *s ++; |
46 | 3.35M | } |
47 | 209k | } |
48 | | |
49 | | /* see bearssl_block.h */ |
50 | | void |
51 | | br_aes_big_ctrcbc_ctr(const br_aes_big_ctrcbc_keys *ctx, |
52 | | void *ctr, void *data, size_t len) |
53 | 10.1k | { |
54 | 10.1k | unsigned char *buf, *bctr; |
55 | 10.1k | uint32_t cc0, cc1, cc2, cc3; |
56 | | |
57 | 10.1k | buf = data; |
58 | 10.1k | bctr = ctr; |
59 | 10.1k | cc3 = br_dec32be(bctr + 0); |
60 | 10.1k | cc2 = br_dec32be(bctr + 4); |
61 | 10.1k | cc1 = br_dec32be(bctr + 8); |
62 | 10.1k | cc0 = br_dec32be(bctr + 12); |
63 | 42.2k | while (len > 0) { |
64 | 32.0k | unsigned char tmp[16]; |
65 | 32.0k | uint32_t carry; |
66 | | |
67 | 32.0k | br_enc32be(tmp + 0, cc3); |
68 | 32.0k | br_enc32be(tmp + 4, cc2); |
69 | 32.0k | br_enc32be(tmp + 8, cc1); |
70 | 32.0k | br_enc32be(tmp + 12, cc0); |
71 | 32.0k | br_aes_big_encrypt(ctx->num_rounds, ctx->skey, tmp); |
72 | 32.0k | xorbuf(buf, tmp, 16); |
73 | 32.0k | buf += 16; |
74 | 32.0k | len -= 16; |
75 | 32.0k | cc0 ++; |
76 | 32.0k | carry = (~(cc0 | -cc0)) >> 31; |
77 | 32.0k | cc1 += carry; |
78 | 32.0k | carry &= (~(cc1 | -cc1)) >> 31; |
79 | 32.0k | cc2 += carry; |
80 | 32.0k | carry &= (~(cc2 | -cc2)) >> 31; |
81 | 32.0k | cc3 += carry; |
82 | 32.0k | } |
83 | 10.1k | br_enc32be(bctr + 0, cc3); |
84 | 10.1k | br_enc32be(bctr + 4, cc2); |
85 | 10.1k | br_enc32be(bctr + 8, cc1); |
86 | 10.1k | br_enc32be(bctr + 12, cc0); |
87 | 10.1k | } |
88 | | |
89 | | /* see bearssl_block.h */ |
90 | | void |
91 | | br_aes_big_ctrcbc_mac(const br_aes_big_ctrcbc_keys *ctx, |
92 | | void *cbcmac, const void *data, size_t len) |
93 | 11.8k | { |
94 | 11.8k | const unsigned char *buf; |
95 | | |
96 | 11.8k | buf = data; |
97 | 189k | while (len > 0) { |
98 | 177k | xorbuf(cbcmac, buf, 16); |
99 | 177k | br_aes_big_encrypt(ctx->num_rounds, ctx->skey, cbcmac); |
100 | 177k | buf += 16; |
101 | 177k | len -= 16; |
102 | 177k | } |
103 | 11.8k | } |
104 | | |
105 | | /* see bearssl_block.h */ |
106 | | void |
107 | | br_aes_big_ctrcbc_encrypt(const br_aes_big_ctrcbc_keys *ctx, |
108 | | void *ctr, void *cbcmac, void *data, size_t len) |
109 | 1.70k | { |
110 | 1.70k | br_aes_big_ctrcbc_ctr(ctx, ctr, data, len); |
111 | 1.70k | br_aes_big_ctrcbc_mac(ctx, cbcmac, data, len); |
112 | 1.70k | } |
113 | | |
114 | | /* see bearssl_block.h */ |
115 | | void |
116 | | br_aes_big_ctrcbc_decrypt(const br_aes_big_ctrcbc_keys *ctx, |
117 | | void *ctr, void *cbcmac, void *data, size_t len) |
118 | 4.11k | { |
119 | 4.11k | br_aes_big_ctrcbc_mac(ctx, cbcmac, data, len); |
120 | 4.11k | br_aes_big_ctrcbc_ctr(ctx, ctr, data, len); |
121 | 4.11k | } |
122 | | |
123 | | /* see bearssl_block.h */ |
124 | | const br_block_ctrcbc_class br_aes_big_ctrcbc_vtable = { |
125 | | sizeof(br_aes_big_ctrcbc_keys), |
126 | | 16, |
127 | | 4, |
128 | | (void (*)(const br_block_ctrcbc_class **, const void *, size_t)) |
129 | | &br_aes_big_ctrcbc_init, |
130 | | (void (*)(const br_block_ctrcbc_class *const *, |
131 | | void *, void *, void *, size_t)) |
132 | | &br_aes_big_ctrcbc_encrypt, |
133 | | (void (*)(const br_block_ctrcbc_class *const *, |
134 | | void *, void *, void *, size_t)) |
135 | | &br_aes_big_ctrcbc_decrypt, |
136 | | (void (*)(const br_block_ctrcbc_class *const *, |
137 | | void *, void *, size_t)) |
138 | | &br_aes_big_ctrcbc_ctr, |
139 | | (void (*)(const br_block_ctrcbc_class *const *, |
140 | | void *, const void *, size_t)) |
141 | | &br_aes_big_ctrcbc_mac |
142 | | }; |