1 /* librepo - A library providing (libcURL like) API to downloading repository
2  * Copyright (C) 2012  Tomas Mlcoch
3  *
4  * Licensed under the GNU Lesser General Public License Version 2.1
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #ifndef __LR_CHECKSUM_H__
22 #define __LR_CHECKSUM_H__
23 
24 #include <glib.h>
25 
26 G_BEGIN_DECLS
27 
28 /** \defgroup   checksum    Checksum calculation and checking
29  *  \addtogroup checksum
30  *  @{
31  */
32 
33 /** Enum of supported checksum types.
34  * NOTE! This enum guarantee to be sorted by "hash quality"
35  */
36 typedef enum {
37     LR_CHECKSUM_UNKNOWN,
38     LR_CHECKSUM_MD5,        /*    The most weakest hash */
39     LR_CHECKSUM_SHA1,       /*  |                       */
40     LR_CHECKSUM_SHA224,     /*  |                       */
41     LR_CHECKSUM_SHA256,     /*  |                       */
42     LR_CHECKSUM_SHA384,     /* \|/                      */
43     LR_CHECKSUM_SHA512,     /*    The most secure hash  */
44 } LrChecksumType;
45 
46 /** Convert checksum name (string) to ::LrChecksumType.
47  * @param type      String with a checksum name (e.g. "sha1", "SHA256", ...)
48  * @return          ::LrChecksumType value representing the checksum
49  *                  or LR_CHECKSUM_UNKNOWN
50  */
51 LrChecksumType
52 lr_checksum_type(const char *type);
53 
54 /** Convert LrChecksumType to string
55  * @param type      Checksum type
56  * @return          Constant string with name of the checksum
57  */
58 const char *
59 lr_checksum_type_to_str(LrChecksumType type);
60 
61 /** Calculate checksum for data pointed by file descriptor.
62  * @param type      Checksum type
63  * @param fd        Opened file descriptor. Function seeks to the begin
64  *                  of the file.
65  * @param err       GError **
66  * @return          Malloced checksum string or NULL on error.
67  */
68 char *
69 lr_checksum_fd(LrChecksumType type, int fd, GError **err);
70 
71 /** Calculate checksum for data pointed by file descriptor and
72  * compare it to the expected checksum value.
73  * @param type      Checksum type
74  * @param fd        File descriptor
75  * @param expected  String with expected checksum value
76  * @param caching   Cache/Use cached checksum value as extended file attr.
77  * @param matches   Set pointed variable to TRUE if checksum matches.
78  * @param err       GError **
79  * @return          returns TRUE if error is not set and FALSE if it is
80  */
81 gboolean
82 lr_checksum_fd_cmp(LrChecksumType type,
83                    int fd,
84                    const char *expected,
85                    gboolean caching,
86                    gboolean *matches,
87                    GError **err);
88 
89 /** Calculate checksum for data pointed by file descriptor and
90  * compare it to the expected checksum value.
91  * @param type          Checksum type
92  * @param fd            File descriptor
93  * @param expected      String with expected checksum value
94  * @param caching       Cache/Use cached checksum value as extended file attr.
95  * @param matches       Set pointed variable to TRUE if checksum matches.
96  * @param calculated    If not NULL, the calculated checksum will be pointed
97  *                      here, the pointed string must be freed by caller.
98  * @param err           GError **
99  * @return              returns TRUE if error is not set and FALSE if it is
100  */
101 gboolean
102 lr_checksum_fd_compare(LrChecksumType type,
103                        int fd,
104                        const char *expected,
105                        gboolean caching,
106                        gboolean *matches,
107                        gchar **calculated,
108                        GError **err);
109 
110 /** Clear all checksums cached in extended file attributes
111  * @param fd            File descriptor
112  */
113 void
114 lr_checksum_clear_cache(int fd);
115 
116 /** @} */
117 
118 G_END_DECLS
119 
120 #endif
121