BeRTOS
util.h
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 */