1 /*
2  * Copyright (c) 2019, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /** ============================================================================
33  *  @file       CryptoUtils.h
34  *
35  *  @brief      A collection of utility functions for cryptographic purposes
36  *
37  */
38 
39 #ifndef ti_drivers_cryptoutils_utils_CryptoUtils__include
40 #define ti_drivers_cryptoutils_utils_CryptoUtils__include
41 
42 #include <stdint.h>
43 #include <stdbool.h>
44 #include <string.h>
45 
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 /**
52  *  @brief Compares two buffers for equality without branching
53  *
54  *  @note   This is not a drop-in replacement for memcmp!
55  *
56  *  Most memcmp implementations break out of their comparison loop immediately
57  *  once a mismatch is detected to save execution time. For cryptographic
58  *  purposes, this is a flaw.
59  *
60  *  This function compares two buffers without branching thus requiring a
61  *  an amount of time that does not vary with the content of @c buffer0 and
62  *  @c buffer1.
63  *
64  *  @param  buffer0             Buffer to compare against @c buffer1.
65  *  @param  buffer1             Buffer tp compare against @c buffer0
66  *  @param  bufferByteLength    Length in bytes of @c buffer0 and @c buffer1.
67  *  @retval true                The contents of the buffers match.
68  *  @retval false               The contents of the buffers do not match.
69  */
70 bool CryptoUtils_buffersMatch(const void *buffer0,
71                               const void *buffer1,
72                               size_t bufferByteLength);
73 
74 /**
75  *  @brief Compares two buffers for equality word-by-word without branching
76  *
77  *  @note   This is not a drop-in replacement for memcmp!
78  *
79  *  Most memcmp implementations break out of their comparison loop immediately
80  *  once a mismatch is detected to save execution time. For cryptographic
81  *  purposes, this is a flaw.
82  *
83  *  This function compares two buffers without branching thus requiring a
84  *  an amount of time that does not vary with the content of @c buffer0 and
85  *  @c buffer1.
86  *
87  *  Unlike #CryptoUtils_buffersMatch(), this function expects @c buffer0 and
88  *  @c buffer1 to be 32-bit aligned. It will only perform 32-bit aligned
89  *  accesses to memory. This is needed to access the registers of certain
90  *  peripherals.
91  *
92  *  @param  buffer0             Buffer to compare against @c buffer1.
93  *  @param  buffer1             Buffer tp compare against @c buffer0
94  *  @param  bufferByteLength    Length in bytes of @c buffer0 and @c buffer1.
95  *                              Must be evenly divisible by sizeof(uint32_t).
96  *                              This function will return false if @c
97  *                              bufferByteLength is not evenly divisible by
98  *                              sizeof(uin32_t).
99  *  @retval true                The contents of the buffers match.
100  *  @retval false               The contents of the buffers do not match.
101  */
102 bool CryptoUtils_buffersMatchWordAligned(const uint32_t *buffer0,
103                                          const uint32_t *buffer1,
104                                          size_t bufferByteLength);
105 
106 /**
107  *  @brief Reverses the byte order in a buffer of a given length
108  *
109  *  The left-most byte will become the right-most byte and vice versa.
110  *
111  *  @param  buffer              Buffer containing the data to be reversed.
112  *  @param  bufferByteLength    Length in bytes of @c buffer.
113  */
114 void CryptoUtils_reverseBufferBytewise(void * buffer, size_t bufferByteLength);
115 
116 /**
117  *  @brief Reverses, copies, and pads an array of words.
118  *
119  *  The \c source array is reversed byte-wise and copied into the \c destination
120  *  array. Writes are done word-wise. If \c sourceLength is not a multiple of 4,
121  *  any remaining bytes up to the next word boundary are padded with 0.
122  *
123  *  The length of the destination array must be a multiple of 4, rounded up to the
124  *  padded \c sourceLength if required.
125  *
126  *  @param source       Source array
127  *
128  *  @param destination  Destination array
129  *
130  *  @param sourceLength Length of the source array (multiple of 4)
131  */
132 void CryptoUtils_reverseCopyPad(const void *source,
133                                 void *destination,
134                                 size_t sourceLength);
135 
136 #ifdef __cplusplus
137 }
138 #endif
139 
140 #endif /* ti_drivers_cryptoutils_utils_CryptoUtils__include */
141