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