0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 #include <crypto/algapi.h>
0063 #include <asm/unaligned.h>
0064
0065 #ifndef __HAVE_ARCH_CRYPTO_MEMNEQ
0066
0067
0068 static inline unsigned long
0069 __crypto_memneq_generic(const void *a, const void *b, size_t size)
0070 {
0071 unsigned long neq = 0;
0072
0073 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
0074 while (size >= sizeof(unsigned long)) {
0075 neq |= get_unaligned((unsigned long *)a) ^
0076 get_unaligned((unsigned long *)b);
0077 OPTIMIZER_HIDE_VAR(neq);
0078 a += sizeof(unsigned long);
0079 b += sizeof(unsigned long);
0080 size -= sizeof(unsigned long);
0081 }
0082 #endif
0083 while (size > 0) {
0084 neq |= *(unsigned char *)a ^ *(unsigned char *)b;
0085 OPTIMIZER_HIDE_VAR(neq);
0086 a += 1;
0087 b += 1;
0088 size -= 1;
0089 }
0090 return neq;
0091 }
0092
0093
0094 static inline unsigned long __crypto_memneq_16(const void *a, const void *b)
0095 {
0096 unsigned long neq = 0;
0097
0098 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
0099 if (sizeof(unsigned long) == 8) {
0100 neq |= get_unaligned((unsigned long *)a) ^
0101 get_unaligned((unsigned long *)b);
0102 OPTIMIZER_HIDE_VAR(neq);
0103 neq |= get_unaligned((unsigned long *)(a + 8)) ^
0104 get_unaligned((unsigned long *)(b + 8));
0105 OPTIMIZER_HIDE_VAR(neq);
0106 } else if (sizeof(unsigned int) == 4) {
0107 neq |= get_unaligned((unsigned int *)a) ^
0108 get_unaligned((unsigned int *)b);
0109 OPTIMIZER_HIDE_VAR(neq);
0110 neq |= get_unaligned((unsigned int *)(a + 4)) ^
0111 get_unaligned((unsigned int *)(b + 4));
0112 OPTIMIZER_HIDE_VAR(neq);
0113 neq |= get_unaligned((unsigned int *)(a + 8)) ^
0114 get_unaligned((unsigned int *)(b + 8));
0115 OPTIMIZER_HIDE_VAR(neq);
0116 neq |= get_unaligned((unsigned int *)(a + 12)) ^
0117 get_unaligned((unsigned int *)(b + 12));
0118 OPTIMIZER_HIDE_VAR(neq);
0119 } else
0120 #endif
0121 {
0122 neq |= *(unsigned char *)(a) ^ *(unsigned char *)(b);
0123 OPTIMIZER_HIDE_VAR(neq);
0124 neq |= *(unsigned char *)(a+1) ^ *(unsigned char *)(b+1);
0125 OPTIMIZER_HIDE_VAR(neq);
0126 neq |= *(unsigned char *)(a+2) ^ *(unsigned char *)(b+2);
0127 OPTIMIZER_HIDE_VAR(neq);
0128 neq |= *(unsigned char *)(a+3) ^ *(unsigned char *)(b+3);
0129 OPTIMIZER_HIDE_VAR(neq);
0130 neq |= *(unsigned char *)(a+4) ^ *(unsigned char *)(b+4);
0131 OPTIMIZER_HIDE_VAR(neq);
0132 neq |= *(unsigned char *)(a+5) ^ *(unsigned char *)(b+5);
0133 OPTIMIZER_HIDE_VAR(neq);
0134 neq |= *(unsigned char *)(a+6) ^ *(unsigned char *)(b+6);
0135 OPTIMIZER_HIDE_VAR(neq);
0136 neq |= *(unsigned char *)(a+7) ^ *(unsigned char *)(b+7);
0137 OPTIMIZER_HIDE_VAR(neq);
0138 neq |= *(unsigned char *)(a+8) ^ *(unsigned char *)(b+8);
0139 OPTIMIZER_HIDE_VAR(neq);
0140 neq |= *(unsigned char *)(a+9) ^ *(unsigned char *)(b+9);
0141 OPTIMIZER_HIDE_VAR(neq);
0142 neq |= *(unsigned char *)(a+10) ^ *(unsigned char *)(b+10);
0143 OPTIMIZER_HIDE_VAR(neq);
0144 neq |= *(unsigned char *)(a+11) ^ *(unsigned char *)(b+11);
0145 OPTIMIZER_HIDE_VAR(neq);
0146 neq |= *(unsigned char *)(a+12) ^ *(unsigned char *)(b+12);
0147 OPTIMIZER_HIDE_VAR(neq);
0148 neq |= *(unsigned char *)(a+13) ^ *(unsigned char *)(b+13);
0149 OPTIMIZER_HIDE_VAR(neq);
0150 neq |= *(unsigned char *)(a+14) ^ *(unsigned char *)(b+14);
0151 OPTIMIZER_HIDE_VAR(neq);
0152 neq |= *(unsigned char *)(a+15) ^ *(unsigned char *)(b+15);
0153 OPTIMIZER_HIDE_VAR(neq);
0154 }
0155
0156 return neq;
0157 }
0158
0159
0160
0161
0162
0163
0164 noinline unsigned long __crypto_memneq(const void *a, const void *b,
0165 size_t size)
0166 {
0167 switch (size) {
0168 case 16:
0169 return __crypto_memneq_16(a, b);
0170 default:
0171 return __crypto_memneq_generic(a, b, size);
0172 }
0173 }
0174 EXPORT_SYMBOL(__crypto_memneq);
0175
0176 #endif