BeRTOS
kdf.h
Go to the documentation of this file.
00001 
00038 #ifndef SEC_KDF_H
00039 #define SEC_KDF_H
00040 
00041 #include <cfg/compiler.h>
00042 #include <cfg/macros.h>
00043 #include <cfg/debug.h>
00044 #include <string.h>
00045 
00046 typedef struct Kdf
00047 {
00048     const uint8_t* block;
00049     size_t block_len;
00050     size_t to_read;
00051         
00052     void (*begin)(struct Kdf *kdf, const char *pwd, size_t pwd_len,
00053                   const uint8_t *salt, size_t salt_len);
00054     void (*next)(struct Kdf *kdf);
00055 } Kdf;
00056 
00060 INLINE void kdf_begin(Kdf *kdf, const char *pwd, size_t pwd_len,
00061                       const uint8_t *salt, size_t salt_len)
00062 {
00063     ASSERT(kdf->begin);
00064     kdf->begin(kdf, pwd, pwd_len, salt, salt_len);
00065 }
00066 
00076 INLINE void kdf_read(Kdf *kdf, uint8_t *out, size_t len)
00077 {
00078     do
00079     {
00080         if (kdf->to_read == 0)
00081         {
00082             kdf->next(kdf);
00083             ASSERT(kdf->to_read != 0);
00084         }
00085 
00086         size_t c = MIN(len, kdf->to_read);
00087         memcpy(out, kdf->block, c);
00088         len -= c;
00089         out += c;
00090         kdf->block += c;
00091         kdf->to_read -= c;
00092     } while (len);
00093 }
00094 
00095 #endif /* SEC_KDF_H */