1 /* af_alg.h - Compute message digests from file streams and buffers. 2 Copyright (C) 2018-2021 Free Software Foundation, Inc. 3 4 This file is free software: you can redistribute it and/or modify 5 it under the terms of the GNU Lesser General Public License as 6 published by the Free Software Foundation; either version 2.1 of the 7 License, or (at your option) any later version. 8 9 This file is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 17 /* Written by Matteo Croce <mcroce@redhat.com>, 2018. 18 Documentation by Bruno Haible <bruno@clisp.org>, 2018. */ 19 20 /* Declare specific functions for computing message digests 21 using the Linux kernel crypto API, if available. This kernel API gives 22 access to specialized crypto instructions (that would also be available 23 in user space) or to crypto devices (not directly available in user space). 24 25 For a more complete set of facilities that use the Linux kernel crypto API, 26 look at libkcapi. */ 27 28 #ifndef AF_ALG_H 29 # define AF_ALG_H 1 30 31 # include <stdio.h> 32 # include <errno.h> 33 34 # ifdef __cplusplus 35 extern "C" { 36 # endif 37 38 # if USE_LINUX_CRYPTO_API 39 40 /* Compute a message digest of a memory region. 41 42 The memory region starts at BUFFER and is LEN bytes long. 43 44 ALG is the message digest algorithm; see the file /proc/crypto. 45 46 RESBLOCK points to a block of HASHLEN bytes, for the result. 47 HASHLEN must be the length of the message digest, in bytes, in particular: 48 49 alg | hashlen 50 -------+-------- 51 md5 | 16 52 sha1 | 20 53 sha224 | 28 54 sha256 | 32 55 sha384 | 48 56 sha512 | 64 57 58 If successful, fill RESBLOCK and return 0. 59 Upon failure, return a negated error number. */ 60 int 61 afalg_buffer (const char *buffer, size_t len, const char *alg, 62 void *resblock, ssize_t hashlen); 63 64 /* Compute a message digest of data read from STREAM. 65 66 STREAM is an open file stream. The last operation on STREAM should 67 not be 'ungetc', and if STREAM is also open for writing it should 68 have been fflushed since its last write. Read from the current 69 position to the end of STREAM. Handle regular files efficiently. 70 71 ALG is the message digest algorithm; see the file /proc/crypto. 72 73 RESBLOCK points to a block of HASHLEN bytes, for the result. 74 HASHLEN must be the length of the message digest, in bytes, in particular: 75 76 alg | hashlen 77 -------+-------- 78 md5 | 16 79 sha1 | 20 80 sha224 | 28 81 sha256 | 32 82 sha384 | 48 83 sha512 | 64 84 85 If successful, fill RESBLOCK and return 0. 86 Upon failure, return a negated error number. 87 Unless returning 0 or -EIO, restore STREAM's file position so that 88 the caller can fall back on some other method. */ 89 int 90 afalg_stream (FILE *stream, const char *alg, 91 void *resblock, ssize_t hashlen); 92 93 # else 94 95 static inline int 96 afalg_buffer (const char *buffer, size_t len, const char *alg, /* */ 97 void *resblock, ssize_t hashlen) 98 { 99 return -EAFNOSUPPORT; 100 } 101 102 static inline int 103 afalg_stream (FILE *stream, const char *alg, /* */ 104 void *resblock, ssize_t hashlen) 105 { 106 return -EAFNOSUPPORT; 107 } 108 109 # endif 110 111 # ifdef __cplusplus 112 } 113 # endif 114 115 #endif /* AF_ALG_H */