BeRTOS
|
00001 #ifndef SEC_UTIL_H 00002 #define SEC_UTIL_H 00003 00004 #include <cfg/macros.h> 00005 #include <cfg/compiler.h> 00006 #include <cfg/debug.h> 00007 #include <string.h> 00008 00015 #define PURGE(x) \ 00016 memset(&x, 0, sizeof(x)) 00017 00033 void password2key(const char *pwd, size_t pwd_len, 00034 uint8_t *key, size_t key_len); 00035 00036 INLINE void xor_block_8(uint8_t *out, 00037 const uint8_t *in1, const uint8_t *in2, size_t len) 00038 { 00039 while (len--) 00040 *out++ = *in1++ ^ *in2++; 00041 } 00042 00043 INLINE void xor_block_const_8(uint8_t *out, 00044 const uint8_t *in, uint8_t k, size_t len) 00045 { 00046 while (len--) 00047 *out++ = *in++ ^ k; 00048 } 00049 00050 INLINE void xor_block_32(uint32_t *out, const uint32_t *in1, 00051 const uint32_t *in2, size_t len) 00052 { 00053 size_t rem = (len & (sizeof(uint32_t) - 1)); 00054 00055 len /= sizeof(uint32_t); 00056 while (len--) 00057 *out++ = *in1++ ^ *in2++; 00058 xor_block_8((uint8_t *)out, 00059 (const uint8_t *)in1, (const uint8_t *)in2, rem); 00060 } 00061 00062 INLINE void xor_block_const_32(uint32_t *out, const uint32_t *in, 00063 uint8_t k, size_t len) 00064 { 00065 uint32_t k32 = k | ((uint32_t)k << 8) | 00066 ((uint32_t)k << 16) | ((uint32_t)k << 24); 00067 size_t rem = (len & (sizeof(uint32_t) - 1)); 00068 00069 len /= sizeof(uint32_t); 00070 while (len--) 00071 *out++ = *in++ ^ k32; 00072 xor_block_const_8((uint8_t *)out, (const uint8_t *)in, k, rem); 00073 } 00074 00079 INLINE void xor_block(void *out, const void *in1, const void *in2, size_t len) 00080 { 00081 if (is_aligned(out, sizeof(uint32_t)) && 00082 is_aligned(in1, sizeof(uint32_t)) && 00083 is_aligned(in2, sizeof(uint32_t))) 00084 { 00085 uint32_t *obuf = (uint32_t *)((size_t)out); 00086 const uint32_t *ibuf1 = (const uint32_t *)((size_t)in1); 00087 const uint32_t *ibuf2 = (const uint32_t *)((size_t)in2); 00088 00089 xor_block_32(obuf, ibuf1, ibuf2, len); 00090 } 00091 else 00092 { 00093 uint8_t *obuf = (uint8_t *)((size_t)out); 00094 const uint8_t *ibuf1 = (const uint8_t *)((size_t)in1); 00095 const uint8_t *ibuf2 = (const uint8_t *)((size_t)in2); 00096 00097 xor_block_8(obuf, ibuf1, ibuf2, len); 00098 } 00099 } 00100 00104 INLINE void xor_block_const(uint8_t *out, const uint8_t *in, uint8_t k, size_t len) 00105 { 00106 if (is_aligned(out, sizeof(uint32_t)) && 00107 is_aligned(in, sizeof(uint32_t))) 00108 { 00109 uint32_t *obuf = (uint32_t *)((size_t)out); 00110 const uint32_t *ibuf = (const uint32_t *)((size_t)in); 00111 00112 xor_block_const_32(obuf, ibuf, k, len); 00113 } 00114 else 00115 { 00116 uint8_t *obuf = (uint8_t *)((size_t)out); 00117 const uint8_t *ibuf = (const uint8_t *)((size_t)in); 00118 00119 xor_block_const_8(obuf, ibuf, k, len); 00120 } 00121 } 00122 00123 #endif /* SEC_UTIL_H */