Fossil SCM

Update the base-64 encoder/decoder to conform to RFC 1421. Add test commands to verify both the endoder and the decoder.

drh 2009-09-12 21:03 trunk
Commit c198613ae13c8ae2a4af91f6b71ff111eb5dfeac
1 file changed +34 -2
+34 -2
--- src/encode.c
+++ src/encode.c
@@ -299,11 +299,11 @@
299299
300300
/*
301301
** The characters used for HTTP base64 encoding.
302302
*/
303303
static unsigned char zBase[] =
304
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
304
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
305305
306306
/*
307307
** Encode a string using a base-64 encoding.
308308
** The encoding can be reversed using the <b>decode64</b> function.
309309
**
@@ -314,11 +314,11 @@
314314
int i, n;
315315
316316
if( nData<=0 ){
317317
nData = strlen(zData);
318318
}
319
- z64 = malloc( (nData*4)/3 + 6 );
319
+ z64 = malloc( (nData*4)/3 + 8 );
320320
for(i=n=0; i+2<nData; i+=3){
321321
z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
322322
z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
323323
z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) | ((zData[i+2]>>6) & 0x03) ];
324324
z64[n++] = zBase[ zData[i+2] & 0x3f ];
@@ -325,17 +325,35 @@
325325
}
326326
if( i+1<nData ){
327327
z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
328328
z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
329329
z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) ];
330
+ z64[n++] = '=';
330331
}else if( i<nData ){
331332
z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
332333
z64[n++] = zBase[ ((zData[i]<<4) & 0x30) ];
334
+ z64[n++] = '=';
335
+ z64[n++] = '=';
333336
}
334337
z64[n] = 0;
335338
return z64;
336339
}
340
+
341
+/*
342
+** COMMAND: test-encode64
343
+** Usage: %fossil test-encode64 STRING
344
+*/
345
+void test_encode64_cmd(void){
346
+ char *z;
347
+ int i;
348
+ for(i=2; i<g.argc; i++){
349
+ z = encode64(g.argv[i], -1);
350
+ printf("%s\n", z);
351
+ free(z);
352
+ }
353
+}
354
+
337355
338356
/*
339357
** This function treats its input as a base-64 string and returns the
340358
** decoded value of that string. Characters of input that are not
341359
** valid base-64 characters (such as spaces and newlines) are ignored.
@@ -382,10 +400,24 @@
382400
}
383401
zData[j] = 0;
384402
*pnByte = j;
385403
return zData;
386404
}
405
+
406
+/*
407
+** COMMAND: test-decode64
408
+** Usage: %fossil test-decode64 STRING
409
+*/
410
+void test_decode64_cmd(void){
411
+ char *z;
412
+ int i, n;
413
+ for(i=2; i<g.argc; i++){
414
+ z = decode64(g.argv[i], &n);
415
+ printf("%d: %s\n", n, z);
416
+ free(z);
417
+ }
418
+}
387419
388420
/*
389421
** The base-16 encoding using the following characters:
390422
**
391423
** 0123456789abcdef
392424
--- src/encode.c
+++ src/encode.c
@@ -299,11 +299,11 @@
299
300 /*
301 ** The characters used for HTTP base64 encoding.
302 */
303 static unsigned char zBase[] =
304 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~";
305
306 /*
307 ** Encode a string using a base-64 encoding.
308 ** The encoding can be reversed using the <b>decode64</b> function.
309 **
@@ -314,11 +314,11 @@
314 int i, n;
315
316 if( nData<=0 ){
317 nData = strlen(zData);
318 }
319 z64 = malloc( (nData*4)/3 + 6 );
320 for(i=n=0; i+2<nData; i+=3){
321 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
322 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
323 z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) | ((zData[i+2]>>6) & 0x03) ];
324 z64[n++] = zBase[ zData[i+2] & 0x3f ];
@@ -325,17 +325,35 @@
325 }
326 if( i+1<nData ){
327 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
328 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
329 z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) ];
 
330 }else if( i<nData ){
331 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
332 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) ];
 
 
333 }
334 z64[n] = 0;
335 return z64;
336 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
338 /*
339 ** This function treats its input as a base-64 string and returns the
340 ** decoded value of that string. Characters of input that are not
341 ** valid base-64 characters (such as spaces and newlines) are ignored.
@@ -382,10 +400,24 @@
382 }
383 zData[j] = 0;
384 *pnByte = j;
385 return zData;
386 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387
388 /*
389 ** The base-16 encoding using the following characters:
390 **
391 ** 0123456789abcdef
392
--- src/encode.c
+++ src/encode.c
@@ -299,11 +299,11 @@
299
300 /*
301 ** The characters used for HTTP base64 encoding.
302 */
303 static unsigned char zBase[] =
304 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
305
306 /*
307 ** Encode a string using a base-64 encoding.
308 ** The encoding can be reversed using the <b>decode64</b> function.
309 **
@@ -314,11 +314,11 @@
314 int i, n;
315
316 if( nData<=0 ){
317 nData = strlen(zData);
318 }
319 z64 = malloc( (nData*4)/3 + 8 );
320 for(i=n=0; i+2<nData; i+=3){
321 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
322 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
323 z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) | ((zData[i+2]>>6) & 0x03) ];
324 z64[n++] = zBase[ zData[i+2] & 0x3f ];
@@ -325,17 +325,35 @@
325 }
326 if( i+1<nData ){
327 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
328 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ];
329 z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) ];
330 z64[n++] = '=';
331 }else if( i<nData ){
332 z64[n++] = zBase[ (zData[i]>>2) & 0x3f ];
333 z64[n++] = zBase[ ((zData[i]<<4) & 0x30) ];
334 z64[n++] = '=';
335 z64[n++] = '=';
336 }
337 z64[n] = 0;
338 return z64;
339 }
340
341 /*
342 ** COMMAND: test-encode64
343 ** Usage: %fossil test-encode64 STRING
344 */
345 void test_encode64_cmd(void){
346 char *z;
347 int i;
348 for(i=2; i<g.argc; i++){
349 z = encode64(g.argv[i], -1);
350 printf("%s\n", z);
351 free(z);
352 }
353 }
354
355
356 /*
357 ** This function treats its input as a base-64 string and returns the
358 ** decoded value of that string. Characters of input that are not
359 ** valid base-64 characters (such as spaces and newlines) are ignored.
@@ -382,10 +400,24 @@
400 }
401 zData[j] = 0;
402 *pnByte = j;
403 return zData;
404 }
405
406 /*
407 ** COMMAND: test-decode64
408 ** Usage: %fossil test-decode64 STRING
409 */
410 void test_decode64_cmd(void){
411 char *z;
412 int i, n;
413 for(i=2; i<g.argc; i++){
414 z = decode64(g.argv[i], &n);
415 printf("%d: %s\n", n, z);
416 free(z);
417 }
418 }
419
420 /*
421 ** The base-16 encoding using the following characters:
422 **
423 ** 0123456789abcdef
424

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button