| /* SPDX-License-Identifier: GPL-2.0 */ |
| |
| /* |
| * NIST SP800-90A DRBG derivation function |
| * |
| * Copyright (C) 2014, Stephan Mueller <smueller@chronox.de> |
| */ |
| |
| #ifndef _INTERNAL_DRBG_H |
| #define _INTERNAL_DRBG_H |
| |
| /* |
| * Convert an integer into a byte representation of this integer. |
| * The byte representation is big-endian |
| * |
| * @val value to be converted |
| * @buf buffer holding the converted integer -- caller must ensure that |
| * buffer size is at least 32 bit |
| */ |
| static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf) |
| { |
| struct s { |
| __be32 conv; |
| }; |
| struct s *conversion = (struct s *)buf; |
| |
| conversion->conv = cpu_to_be32(val); |
| } |
| |
| /* |
| * Concatenation Helper and string operation helper |
| * |
| * SP800-90A requires the concatenation of different data. To avoid copying |
| * buffers around or allocate additional memory, the following data structure |
| * is used to point to the original memory with its size. In addition, it |
| * is used to build a linked list. The linked list defines the concatenation |
| * of individual buffers. The order of memory block referenced in that |
| * linked list determines the order of concatenation. |
| */ |
| struct drbg_string { |
| const unsigned char *buf; |
| size_t len; |
| struct list_head list; |
| }; |
| |
| static inline void drbg_string_fill(struct drbg_string *string, |
| const unsigned char *buf, size_t len) |
| { |
| string->buf = buf; |
| string->len = len; |
| INIT_LIST_HEAD(&string->list); |
| } |
| |
| #endif //_INTERNAL_DRBG_H |