BeRTOS
|
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 */