@@ -16,11 +16,13 @@
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*******************************************************************************
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
18 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file contains generic code for dealing with hashes used for
19 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** naming artifacts. Specific hash algorithms are implemented separately
20 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (for example in sha1.c and sha3.c). This file contains the generic
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** interface code.
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** interface logic.
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "hname" is intended to be an abbreviation of "hash name".
22 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
23 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
24 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "hname.h"
25 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -47,10 +49,19 @@
47 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
48 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The number of distinct hash algorithms:
49 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
50 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define HNAME_COUNT 2 /* Just SHA1 and SHA3-256. Let's keep it that way! */
51 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Hash naming policies
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HPOLICY_SHA1 0 /* Use SHA1 hashes */
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HPOLICY_AUTO 1 /* SHA1 but auto-promote to SHA3 */
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HPOLICY_SHA3 2 /* Use SHA3 hashes */
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HPOLICY_SHA3_ONLY 3 /* Use SHA3 hashes exclusively */
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HPOLICY_SHUN_SHA1 4 /* Shun all SHA1 objects */
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
52 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
53 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
54 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
55 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return a human-readable name for the hash algorithm given a hash with
56 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a length of nHash hexadecimal digits.
@@ -142,26 +153,112 @@
142 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
144 155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compute a hash on blob pContent. Write the hash into blob pHashOut.
145 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine assumes that pHashOut is uninitialized.
146 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The preferred hash is used for iHType==0, and various alternative hashes
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are used for iHType>0 && iHType<NHAME_COUNT.
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The preferred hash is used for iHType==0 and the alternative hash is
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used if iHType==1. (The interface is designed to accommodate more than
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** just two hashes, but HNAME_COUNT is currently fixed at 2.)
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Depending on the hash policy, the alternative hash may be disallowed.
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the alterative hash is disallowed, the routine returns 0. This
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine returns 1 if iHType>0 and the alternative hash is allowed,
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and it always returns 1 when iHType==0.
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Alternative hash is disallowed for all hash policies except sha1
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and sha3.
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int hname_hash(const Blob *pContent, unsigned int iHType, Blob *pHashOut){
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iHType==0 || iHType==1 );
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHType==1 ){
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( g.eHashPolicy ){
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHA1:
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sha3sum_blob(pContent, 256, pHashOut);
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHA3:
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sha1sum_blob(pContent, pHashOut);
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHType==0 ){
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( g.eHashPolicy ){
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHA1:
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_AUTO:
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sha1sum_blob(pContent, pHashOut);
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHA3:
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHA3_ONLY:
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case HPOLICY_SHUN_SHA1:
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sha3sum_blob(pContent, 256, pHashOut);
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(pHashOut, 0, 0);
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the default hash policy for repositories that do not currently
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have an assigned hash policy.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Make the default HPOLICY_AUTO if there are no SHA3 artifacts in the
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** repository, and make the default HPOLICY_SHA3 if there are one or more
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SHA3 artifacts.
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int hname_default_policy(void){
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_exists("SELECT 1 FROM blob WHERE length(uuid)>40") ){
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return HPOLICY_SHA3;
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return HPOLICY_AUTO;
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: hash-policy*
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: fossil hash-policy ?NEW-POLICY?
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Query or set the hash policy for the current repository. Available hash
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** policies are as follows:
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sha1 New artifact names are created using SHA1
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** auto New artifact names are created using SHA1, but
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** automatically change the policy to "sha3" when
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any SHA3 artifact enters the repository.
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sha3 New artifact names are created using SHA3, but
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** older artifacts with SHA1 names may be reused.
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sha3-only Use only SHA3 artifact names. Do not reuse legacy
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SHA1 names.
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shun-sha1 Shun any SHA1 artifacts received by sync operations
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** other than clones. Older legacy SHA1 artifacts are
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are allowed during a clone.
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The default hash policy for existing repositories is "auto", which will
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** immediately promote to "sha3" if the repository contains one or more
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** artifacts with SHA3 names. The default hash policy for new repositories
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is "shun-sha1".
149 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void hname_hash(const Blob *pContent, unsigned int iHType, Blob *pHashOut){
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if RELEASE_VERSION_NUMBER>=20100
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* For Fossil 2.1 and later, the preferred hash algorithm is SHA3-256 and
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SHA1 is the secondary hash algorithm. */
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( iHType ){
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case 0: sha3sum_blob(pContent, 256, pHashOut); break;
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case 1: sha1sum_blob(pContent, pHashOut); break;
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Prior to Fossil 2.1, the preferred hash algorithm is SHA1 (for backwards
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** compatibility with Fossil 1.x) and SHA3-256 is the only auxiliary
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** algorithm */
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( iHType ){
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case 0: sha1sum_blob(pContent, pHashOut); break;
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case 1: sha3sum_blob(pContent, 256, pHashOut); break;
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void hash_policy_command(void){
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *azPolicy[] = {
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sha1", "auto", "sha3", "sha3-only", "shun-sha1"
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_find_and_open_repository(0, 0);
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=2 && g.argc!=3 ) usage("?NEW-POLICY?");
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc==2 ){
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%s\n", azPolicy[g.eHashPolicy]);
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=HPOLICY_SHA1; i<=HPOLICY_SHUN_SHA1; i++){
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(g.argv[2],azPolicy[i])==0 ){
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.eHashPolicy = i;
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set_int("hash-policy", i, 0);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("unknown hash policy \"%s\" - should be one of: sha1 auto"
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " sha3 sha3-only shun-sha1", g.argv[2]);
167 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
168 265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!