ASCON Suite
ascon-sliced64.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2022 Southern Storm Software, Pty Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
23 /* SnP helper functions for backends that use the "sliced64" method */
24 
25 #include <ascon/permutation.h>
26 #include <ascon/utility.h>
27 #include "ascon-select-backend.h"
28 #include "ascon-util.h"
29 #include "ascon-util-snp.h"
30 
31 #if defined(ASCON_BACKEND_SLICED64)
32 
35 #if defined(LW_UTIL_LITTLE_ENDIAN)
36 #define ASCON_C64_BYTE_FOR_OFFSET(state, offset) \
37  (state->B[((offset) & 0x38) + (7 - (offset & 0x07))])
38 #else
39 #define ASCON_C64_BYTE_FOR_OFFSET(state, offset) (state->B[(offset)])
40 #endif
41 
45 {
46  state->S[0] = 0;
47  state->S[1] = 0;
48  state->S[2] = 0;
49  state->S[3] = 0;
50  state->S[4] = 0;
52 }
53 
55 {
56  if (state) {
59  }
60 }
61 
62 void ascon_add_bytes
63  (ascon_state_t *state, const uint8_t *data, unsigned offset, unsigned size)
64 {
65  while (offset < 40 && size > 0) {
66  ASCON_C64_BYTE_FOR_OFFSET(state, offset) ^= *data++;
67  ++offset;
68  --size;
69  }
70 }
71 
73  (ascon_state_t *state, const uint8_t *data, unsigned offset, unsigned size)
74 {
75  while (offset < 40 && size > 0) {
76  ASCON_C64_BYTE_FOR_OFFSET(state, offset) = *data++;
77  ++offset;
78  --size;
79  }
80 }
81 
83  (ascon_state_t *state, unsigned offset, unsigned size)
84 {
85  while (offset < 40 && size > 0) {
86  ASCON_C64_BYTE_FOR_OFFSET(state, offset) = 0;
87  ++offset;
88  --size;
89  }
90 }
91 
93  (const ascon_state_t *state, uint8_t *data, unsigned offset, unsigned size)
94 {
95  while (offset < 40 && size > 0) {
96  *data++ = ASCON_C64_BYTE_FOR_OFFSET(state, offset);
97  ++offset;
98  --size;
99  }
100 }
101 
103  (const ascon_state_t *state, const uint8_t *input, uint8_t *output,
104  unsigned offset, unsigned size)
105 {
106  while (offset < 40 && size > 0) {
107  *output++ = *input++ ^ ASCON_C64_BYTE_FOR_OFFSET(state, offset);
108  ++offset;
109  --size;
110  }
111 }
112 
114  (ascon_state_t *state, const uint8_t *input, uint8_t *output,
115  unsigned offset, unsigned size)
116 {
117  while (offset < 40 && size > 0) {
118  unsigned char in = *input++;
119  *output++ = in ^ ASCON_C64_BYTE_FOR_OFFSET(state, offset);
120  ASCON_C64_BYTE_FOR_OFFSET(state, offset) = in;
121  ++offset;
122  --size;
123  }
124 }
125 
127 {
128  /* Not needed in this implementation */
129  (void)state;
130 }
131 
133 {
134  /* Not needed in this implementation */
135  (void)state;
136 }
137 
138 void ascon_copy(ascon_state_t *dest, const ascon_state_t *src)
139 {
140  memcpy(dest->S, src->S, sizeof(dest->S));
141 }
142 
143 #endif /* ASCON_BACKEND_SLICED64 */
#define ascon_backend_free(state)
#define ascon_backend_init(state)
Direct access to the ASCON permutation primitive.
void ascon_overwrite_with_zeroes(ascon_state_t *state, unsigned offset, unsigned size)
Overwrites a part of the ASCON state with zeroes.
void ascon_free(ascon_state_t *state)
Frees an ASCON permutation state and attempts to destroy any sensitive material.
void ascon_release(ascon_state_t *state)
Temporarily releases access to any shared hardware resources that a permutation state was using.
void ascon_overwrite_bytes(ascon_state_t *state, const uint8_t *data, unsigned offset, unsigned size)
Overwrites existing bytes in the ASCON state.
void ascon_copy(ascon_state_t *dest, const ascon_state_t *src)
Copies the entire ASCON permutation state from a source to a destination.
void ascon_extract_bytes(const ascon_state_t *state, uint8_t *data, unsigned offset, unsigned size)
Extracts bytes from the ASCON state.
void ascon_extract_and_overwrite_bytes(ascon_state_t *state, const uint8_t *input, uint8_t *output, unsigned offset, unsigned size)
Extracts bytes from the ASCON state and XOR's them with input bytes to produce output bytes....
void ascon_add_bytes(ascon_state_t *state, const uint8_t *data, unsigned offset, unsigned size)
Adds bytes to the ASCON state by XOR'ing them with existing bytes.
void ascon_extract_and_add_bytes(const ascon_state_t *state, const uint8_t *input, uint8_t *output, unsigned offset, unsigned size)
Extracts bytes from the ASCON state and XOR's them with input bytes to produce output bytes.
void ascon_acquire(ascon_state_t *state)
Re-acquires access to any shared hardware resources that a permutation state was using.
void ascon_init(ascon_state_t *state)
Initializes the words of the ASCON permutation state to zero.
ascon_state_t state
[snippet_key]
Definition: snippets.c:2
unsigned char data[8]
[snippet_key]
Definition: snippets.c:14
Structure of the internal state of the ASCON permutation.
Definition: permutation.h:63
uint64_t S[5]
Definition: permutation.h:64
System utilities of use to applications that use ASCON.
void ascon_clean(void *buf, unsigned size)
Cleans a buffer that contains sensitive material.
Definition: ascon-clean.c:38