1*f0865ec9SKyle Evans /* 2*f0865ec9SKyle Evans * Copyright (C) 2017 - This file is part of libecc project 3*f0865ec9SKyle Evans * 4*f0865ec9SKyle Evans * Authors: 5*f0865ec9SKyle Evans * Ryad BENADJILA <ryadbenadjila@gmail.com> 6*f0865ec9SKyle Evans * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7*f0865ec9SKyle Evans * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8*f0865ec9SKyle Evans * 9*f0865ec9SKyle Evans * Contributors: 10*f0865ec9SKyle Evans * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11*f0865ec9SKyle Evans * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12*f0865ec9SKyle Evans * 13*f0865ec9SKyle Evans * This software is licensed under a dual BSD and GPL v2 license. 14*f0865ec9SKyle Evans * See LICENSE file at the root folder of the project. 15*f0865ec9SKyle Evans */ 16*f0865ec9SKyle Evans #include <libecc/utils/utils.h> 17*f0865ec9SKyle Evans 18*f0865ec9SKyle Evans /* 19*f0865ec9SKyle Evans * Return 1 in 'check' if first 'len' bytes of both buffers a and b are equal, 0 otherwise. 20*f0865ec9SKyle Evans * It returns 0 if success, -1 on error. 'check' is only relevant on success. 21*f0865ec9SKyle Evans * 22*f0865ec9SKyle Evans * The test is done in constant time. 23*f0865ec9SKyle Evans */ 24*f0865ec9SKyle Evans int are_equal(const void *a, const void *b, u32 len, int *check) 25*f0865ec9SKyle Evans { 26*f0865ec9SKyle Evans const u8 *la = (const u8*)a, *lb = (const u8*)b; 27*f0865ec9SKyle Evans int ret; 28*f0865ec9SKyle Evans u32 i; 29*f0865ec9SKyle Evans 30*f0865ec9SKyle Evans MUST_HAVE((a != NULL) && (b != NULL) && (check != NULL), ret, err); 31*f0865ec9SKyle Evans 32*f0865ec9SKyle Evans *check = 1; 33*f0865ec9SKyle Evans for (i = 0; i < len; i++) { 34*f0865ec9SKyle Evans (*check) &= (*la == *lb); 35*f0865ec9SKyle Evans la++; 36*f0865ec9SKyle Evans lb++; 37*f0865ec9SKyle Evans } 38*f0865ec9SKyle Evans 39*f0865ec9SKyle Evans ret = 0; 40*f0865ec9SKyle Evans 41*f0865ec9SKyle Evans err: 42*f0865ec9SKyle Evans return ret; 43*f0865ec9SKyle Evans } 44*f0865ec9SKyle Evans 45*f0865ec9SKyle Evans /* 46*f0865ec9SKyle Evans * This function is a simple (non-optimized) reimplementation of memcpy() 47*f0865ec9SKyle Evans * Returns 0 on success, -1 on error. 48*f0865ec9SKyle Evans */ 49*f0865ec9SKyle Evans int local_memcpy(void *dst, const void *src, u32 n) 50*f0865ec9SKyle Evans { 51*f0865ec9SKyle Evans const u8 *lsrc = (const u8*)src; 52*f0865ec9SKyle Evans u8 *ldst = (u8*)dst; 53*f0865ec9SKyle Evans u32 i; 54*f0865ec9SKyle Evans int ret; 55*f0865ec9SKyle Evans 56*f0865ec9SKyle Evans MUST_HAVE((dst != NULL) && (src != NULL), ret, err); 57*f0865ec9SKyle Evans 58*f0865ec9SKyle Evans for (i = 0; i < n; i++) { 59*f0865ec9SKyle Evans *ldst = *lsrc; 60*f0865ec9SKyle Evans ldst++; 61*f0865ec9SKyle Evans lsrc++; 62*f0865ec9SKyle Evans } 63*f0865ec9SKyle Evans 64*f0865ec9SKyle Evans ret = 0; 65*f0865ec9SKyle Evans 66*f0865ec9SKyle Evans err: 67*f0865ec9SKyle Evans return ret; 68*f0865ec9SKyle Evans } 69*f0865ec9SKyle Evans 70*f0865ec9SKyle Evans /* 71*f0865ec9SKyle Evans * This function is a simple (non-optimized) reimplementation of memset() 72*f0865ec9SKyle Evans * Returns 0 on success, -1 on error. 73*f0865ec9SKyle Evans */ 74*f0865ec9SKyle Evans int local_memset(void *v, u8 c, u32 n) 75*f0865ec9SKyle Evans { 76*f0865ec9SKyle Evans volatile u8 *p = (volatile u8*)v; 77*f0865ec9SKyle Evans u32 i; 78*f0865ec9SKyle Evans int ret; 79*f0865ec9SKyle Evans 80*f0865ec9SKyle Evans MUST_HAVE((v != NULL), ret, err); 81*f0865ec9SKyle Evans 82*f0865ec9SKyle Evans for (i = 0; i < n; i++) { 83*f0865ec9SKyle Evans *p = c; 84*f0865ec9SKyle Evans p++; 85*f0865ec9SKyle Evans } 86*f0865ec9SKyle Evans 87*f0865ec9SKyle Evans ret = 0; 88*f0865ec9SKyle Evans 89*f0865ec9SKyle Evans err: 90*f0865ec9SKyle Evans return ret; 91*f0865ec9SKyle Evans } 92*f0865ec9SKyle Evans 93*f0865ec9SKyle Evans /* 94*f0865ec9SKyle Evans * Return 1 in 'check' if strings are equal, 0 otherwise. 95*f0865ec9SKyle Evans * It returns 0 if success, -1 on error. 'check' is only relevant on success. 96*f0865ec9SKyle Evans * 97*f0865ec9SKyle Evans */ 98*f0865ec9SKyle Evans int are_str_equal(const char *s1, const char *s2, int *check) 99*f0865ec9SKyle Evans { 100*f0865ec9SKyle Evans const char *ls1 = s1, *ls2 = s2; 101*f0865ec9SKyle Evans int ret; 102*f0865ec9SKyle Evans 103*f0865ec9SKyle Evans MUST_HAVE((s1 != NULL) && (s2 != NULL) && (check != NULL), ret, err); 104*f0865ec9SKyle Evans 105*f0865ec9SKyle Evans while (*ls1 && (*ls1 == *ls2)) { 106*f0865ec9SKyle Evans ls1++; 107*f0865ec9SKyle Evans ls2++; 108*f0865ec9SKyle Evans } 109*f0865ec9SKyle Evans 110*f0865ec9SKyle Evans (*check) = (*ls1 == *ls2); 111*f0865ec9SKyle Evans 112*f0865ec9SKyle Evans ret = 0; 113*f0865ec9SKyle Evans 114*f0865ec9SKyle Evans err: 115*f0865ec9SKyle Evans return ret; 116*f0865ec9SKyle Evans } 117*f0865ec9SKyle Evans 118*f0865ec9SKyle Evans /* 119*f0865ec9SKyle Evans * Return 1 in 'check' if strings are equal up to maxlen, 0 otherwise. 120*f0865ec9SKyle Evans * It returns 0 if success, -1 on error. 'check' is only relevant on success. 121*f0865ec9SKyle Evans * 122*f0865ec9SKyle Evans */ 123*f0865ec9SKyle Evans int are_str_equal_nlen(const char *s1, const char *s2, u32 maxlen, int *check) 124*f0865ec9SKyle Evans { 125*f0865ec9SKyle Evans const char *ls1 = s1, *ls2 = s2; 126*f0865ec9SKyle Evans u32 i = 0; 127*f0865ec9SKyle Evans int ret; 128*f0865ec9SKyle Evans 129*f0865ec9SKyle Evans MUST_HAVE((s1 != NULL) && (s2 != NULL) && (check != NULL), ret, err); 130*f0865ec9SKyle Evans 131*f0865ec9SKyle Evans while (*ls1 && (*ls1 == *ls2) && (i < maxlen)) { 132*f0865ec9SKyle Evans ls1++; 133*f0865ec9SKyle Evans ls2++; 134*f0865ec9SKyle Evans i++; 135*f0865ec9SKyle Evans } 136*f0865ec9SKyle Evans 137*f0865ec9SKyle Evans (*check) = (*ls1 == *ls2); 138*f0865ec9SKyle Evans ret = 0; 139*f0865ec9SKyle Evans 140*f0865ec9SKyle Evans err: 141*f0865ec9SKyle Evans return ret; 142*f0865ec9SKyle Evans } 143*f0865ec9SKyle Evans 144*f0865ec9SKyle Evans 145*f0865ec9SKyle Evans 146*f0865ec9SKyle Evans /* 147*f0865ec9SKyle Evans * This function is a simple (non-optimized) reimplementation of strlen() 148*f0865ec9SKyle Evans * Returns the lenth in 'len'. 149*f0865ec9SKyle Evans * It returns 0 if success, -1 on error. 'len' is only relevant on success. 150*f0865ec9SKyle Evans */ 151*f0865ec9SKyle Evans int local_strlen(const char *s, u32 *len) 152*f0865ec9SKyle Evans { 153*f0865ec9SKyle Evans u32 i = 0; 154*f0865ec9SKyle Evans int ret; 155*f0865ec9SKyle Evans 156*f0865ec9SKyle Evans MUST_HAVE((s != NULL) && (len != NULL), ret, err); 157*f0865ec9SKyle Evans 158*f0865ec9SKyle Evans while (s[i]) { 159*f0865ec9SKyle Evans i++; 160*f0865ec9SKyle Evans } 161*f0865ec9SKyle Evans (*len) = i; 162*f0865ec9SKyle Evans 163*f0865ec9SKyle Evans ret = 0; 164*f0865ec9SKyle Evans 165*f0865ec9SKyle Evans err: 166*f0865ec9SKyle Evans return ret; 167*f0865ec9SKyle Evans } 168*f0865ec9SKyle Evans 169*f0865ec9SKyle Evans /* 170*f0865ec9SKyle Evans * This function is a simple (non-optimized) reimplementation of strnlen() 171*f0865ec9SKyle Evans * Returns the lenth in 'len'. 172*f0865ec9SKyle Evans * It returns 0 if success, -1 on error. 'len' is only relevant on success. 173*f0865ec9SKyle Evans */ 174*f0865ec9SKyle Evans int local_strnlen(const char *s, u32 maxlen, u32 *len) 175*f0865ec9SKyle Evans { 176*f0865ec9SKyle Evans u32 i = 0; 177*f0865ec9SKyle Evans int ret; 178*f0865ec9SKyle Evans 179*f0865ec9SKyle Evans MUST_HAVE((s != NULL) && (len != NULL), ret, err); 180*f0865ec9SKyle Evans 181*f0865ec9SKyle Evans while ((i < maxlen) && s[i]) { 182*f0865ec9SKyle Evans i++; 183*f0865ec9SKyle Evans } 184*f0865ec9SKyle Evans (*len) = i; 185*f0865ec9SKyle Evans 186*f0865ec9SKyle Evans ret = 0; 187*f0865ec9SKyle Evans 188*f0865ec9SKyle Evans err: 189*f0865ec9SKyle Evans return ret; 190*f0865ec9SKyle Evans } 191*f0865ec9SKyle Evans 192*f0865ec9SKyle Evans /* 193*f0865ec9SKyle Evans * This functin is a simple (non-optimized) reimplementation of strncpy() 194*f0865ec9SKyle Evans */ 195*f0865ec9SKyle Evans int local_strncpy(char *dst, const char *src, u32 n) 196*f0865ec9SKyle Evans { 197*f0865ec9SKyle Evans u32 i; 198*f0865ec9SKyle Evans int ret; 199*f0865ec9SKyle Evans 200*f0865ec9SKyle Evans MUST_HAVE((dst != NULL) && (src != NULL), ret, err); 201*f0865ec9SKyle Evans 202*f0865ec9SKyle Evans for (i = 0; (i < n) && src[i]; i++) { 203*f0865ec9SKyle Evans dst[i] = src[i]; 204*f0865ec9SKyle Evans } 205*f0865ec9SKyle Evans for (; i < n; i++) { 206*f0865ec9SKyle Evans dst[i] = 0; 207*f0865ec9SKyle Evans } 208*f0865ec9SKyle Evans 209*f0865ec9SKyle Evans ret = 0; 210*f0865ec9SKyle Evans err: 211*f0865ec9SKyle Evans return ret; 212*f0865ec9SKyle Evans } 213*f0865ec9SKyle Evans 214*f0865ec9SKyle Evans /* 215*f0865ec9SKyle Evans * This functin is a simple (non-optimized) reimplementation of strncat() 216*f0865ec9SKyle Evans */ 217*f0865ec9SKyle Evans int local_strncat(char *dst, const char *src, u32 n) 218*f0865ec9SKyle Evans { 219*f0865ec9SKyle Evans u32 dst_len, i; 220*f0865ec9SKyle Evans int ret; 221*f0865ec9SKyle Evans 222*f0865ec9SKyle Evans MUST_HAVE((dst != NULL) && (src != NULL), ret, err); 223*f0865ec9SKyle Evans 224*f0865ec9SKyle Evans ret = local_strlen(dst, &dst_len); EG(ret, err); 225*f0865ec9SKyle Evans for (i = 0; (i < n) && src[i]; i++) { 226*f0865ec9SKyle Evans dst[dst_len + i] = src[i]; 227*f0865ec9SKyle Evans } 228*f0865ec9SKyle Evans dst[dst_len + i] = 0; 229*f0865ec9SKyle Evans 230*f0865ec9SKyle Evans ret = 0; 231*f0865ec9SKyle Evans err: 232*f0865ec9SKyle Evans return ret; 233*f0865ec9SKyle Evans } 234