consttime_memequal.c revision 1.4
11.4Sriastrad/* $NetBSD: consttime_memequal.c,v 1.4 2013/08/28 19:31:14 riastradh Exp $ */ 21.1Sriastrad 31.1Sriastrad#if !defined(_KERNEL) && !defined(_STANDALONE) 41.3Sriastrad#include "namespace.h" 51.1Sriastrad#include <string.h> 61.3Sriastrad#ifdef __weak_alias 71.3Sriastrad__weak_alias(consttime_memequal,_consttime_memequal) 81.3Sriastrad#endif 91.1Sriastrad#else 101.1Sriastrad#include <lib/libkern/libkern.h> 111.1Sriastrad#endif 121.1Sriastrad 131.1Sriastradint 141.1Sriastradconsttime_memequal(const void *b1, const void *b2, size_t len) 151.1Sriastrad{ 161.1Sriastrad const char *c1 = b1, *c2 = b2; 171.1Sriastrad int res = 0; 181.1Sriastrad 191.1Sriastrad while (len --) 201.1Sriastrad res |= *c1++ ^ *c2++; 211.4Sriastrad 221.4Sriastrad /* 231.4Sriastrad * If the compiler for your favourite architecture generates a 241.4Sriastrad * conditional branch for `!res', it will be a data-dependent 251.4Sriastrad * branch, in which case this should be replaced by 261.4Sriastrad * 271.4Sriastrad * return (1 - (1 & ((res - 1) >> 8))); 281.4Sriastrad * 291.4Sriastrad * or rewritten in assembly. 301.4Sriastrad */ 311.2Sriastrad return !res; 321.1Sriastrad} 33