3 * ====================================================================
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
20 * ====================================================================
23 * @file svn_checksum.h
24 * @brief Subversion checksum routines
27 #ifndef SVN_CHECKSUM_H
28 #define SVN_CHECKSUM_H
30 #include <apr.h> /* for apr_size_t */
31 #include <apr_pools.h> /* for apr_pool_t */
33 #include "svn_types.h" /* for svn_boolean_t, svn_error_t */
37 #endif /* __cplusplus */
41 * Various types of checksums.
45 typedef enum svn_checksum_kind_t
47 /** The checksum is (or should be set to) an MD5 checksum. */
50 /** The checksum is (or should be set to) a SHA1 checksum. */
53 /** The checksum is (or should be set to) a FNV-1a 32 bit checksum,
54 * in big endian byte order.
55 * @since New in 1.9. */
56 svn_checksum_fnv1a_32,
58 /** The checksum is (or should be set to) a modified FNV-1a 32 bit,
59 * in big endian byte order.
60 * @since New in 1.9. */
61 svn_checksum_fnv1a_32x4
62 } svn_checksum_kind_t;
65 * A generic checksum representation.
69 typedef struct svn_checksum_t
71 /** The bytes of the checksum. */
72 const unsigned char *digest;
74 /** The type of the checksum. This should never be changed by consumers
76 svn_checksum_kind_t kind;
80 * Opaque type for creating checksums of data.
82 typedef struct svn_checksum_ctx_t svn_checksum_ctx_t;
84 /** Return a new checksum structure of type @a kind, initialized to the all-
85 * zeros value, allocated in @a pool.
90 svn_checksum_create(svn_checksum_kind_t kind,
93 /** Set @a checksum->digest to all zeros, which, by convention, matches
94 * all other checksums.
99 svn_checksum_clear(svn_checksum_t *checksum);
101 /** Compare checksums @a checksum1 and @a checksum2. If their kinds do not
102 * match or if neither is all zeros, and their content does not match, then
103 * return FALSE; else return TRUE.
108 svn_checksum_match(const svn_checksum_t *checksum1,
109 const svn_checksum_t *checksum2);
113 * Return a deep copy of @a checksum, allocated in @a pool. If @a
114 * checksum is NULL then NULL is returned.
119 svn_checksum_dup(const svn_checksum_t *checksum,
123 /** Return the hex representation of @a checksum, allocating the string
129 svn_checksum_to_cstring_display(const svn_checksum_t *checksum,
133 /** Return the hex representation of @a checksum, allocating the
134 * string in @a pool. If @a checksum->digest is all zeros (that is,
135 * 0, not '0') then return NULL. In 1.7+, @a checksum may be NULL
136 * and NULL will be returned in that case.
139 * @note Passing NULL for @a checksum in 1.6 will cause a segfault.
142 svn_checksum_to_cstring(const svn_checksum_t *checksum,
146 /** Return a serialized representation of @a checksum, allocated in
147 * @a result_pool. Temporary allocations are performed in @a scratch_pool.
149 * Note that @a checksum may not be NULL.
154 svn_checksum_serialize(const svn_checksum_t *checksum,
155 apr_pool_t *result_pool,
156 apr_pool_t *scratch_pool);
159 /** Return @a checksum from the serialized format at @a data. The checksum
160 * will be allocated in @a result_pool, with any temporary allocations
161 * performed in @a scratch_pool.
166 svn_checksum_deserialize(const svn_checksum_t **checksum,
168 apr_pool_t *result_pool,
169 apr_pool_t *scratch_pool);
172 /** Parse the hex representation @a hex of a checksum of kind @a kind and
173 * set @a *checksum to the result, allocating in @a pool.
175 * If @a hex is @c NULL or is the all-zeros checksum, then set @a *checksum
181 svn_checksum_parse_hex(svn_checksum_t **checksum,
182 svn_checksum_kind_t kind,
187 * Return in @a *checksum the checksum of type @a kind for the bytes beginning
188 * at @a data, and going for @a len. @a *checksum is allocated in @a pool.
193 svn_checksum(svn_checksum_t **checksum,
194 svn_checksum_kind_t kind,
201 * Return in @a pool a newly allocated checksum populated with the checksum
202 * of type @a kind for the empty string.
207 svn_checksum_empty_checksum(svn_checksum_kind_t kind,
212 * Create a new @c svn_checksum_ctx_t structure, allocated from @a pool for
213 * calculating checksums of type @a kind. @see svn_checksum_final()
218 svn_checksum_ctx_create(svn_checksum_kind_t kind,
222 * Update the checksum represented by @a ctx, with @a len bytes starting at
228 svn_checksum_update(svn_checksum_ctx_t *ctx,
234 * Finalize the checksum used when creating @a ctx, and put the resultant
235 * checksum in @a *checksum, allocated in @a pool.
240 svn_checksum_final(svn_checksum_t **checksum,
241 const svn_checksum_ctx_t *ctx,
246 * Return the digest size of @a checksum.
251 svn_checksum_size(const svn_checksum_t *checksum);
254 * Return @c TRUE iff @a checksum matches the checksum for the empty
260 svn_checksum_is_empty_checksum(svn_checksum_t *checksum);
264 * Return an error of type #SVN_ERR_CHECKSUM_MISMATCH for @a actual and
265 * @a expected checksums which do not match. Use @a fmt, and the following
266 * parameters to populate the error message.
268 * @note This function does not actually check for the mismatch, it just
269 * constructs the error.
271 * @a scratch_pool is used for temporary allocations; the returned error
272 * will be allocated in its own pool (as is typical).
277 svn_checksum_mismatch_err(const svn_checksum_t *expected,
278 const svn_checksum_t *actual,
279 apr_pool_t *scratch_pool,
282 __attribute__ ((format(printf, 4, 5)));
286 #endif /* __cplusplus */
288 #endif /* SVN_CHECKSUM_H */