Line | Count | Source (jump to first uncovered line) |
1 | | /* af_alg.h - Compute message digests from file streams and buffers. |
2 | | Copyright (C) 2018-2023 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 | 0 | { |
99 | 0 | return -EAFNOSUPPORT; |
100 | 0 | } |
101 | | |
102 | | static inline int |
103 | | afalg_stream (FILE *stream, const char *alg, |
104 | | void *resblock, ssize_t hashlen) |
105 | 0 | { |
106 | 0 | return -EAFNOSUPPORT; |
107 | 0 | } |
108 | | |
109 | | # endif |
110 | | |
111 | | # ifdef __cplusplus |
112 | | } |
113 | | # endif |
114 | | |
115 | | #endif /* AF_ALG_H */ |