Fossil SCM
Update the base-64 encoder/decoder to conform to RFC 1421. Add test commands to verify both the endoder and the decoder.
Commit
c198613ae13c8ae2a4af91f6b71ff111eb5dfeac
Parent
7879c250fb79c6c…
1 file changed
+34
-2
+34
-2
| --- src/encode.c | ||
| +++ src/encode.c | ||
| @@ -299,11 +299,11 @@ | ||
| 299 | 299 | |
| 300 | 300 | /* |
| 301 | 301 | ** The characters used for HTTP base64 encoding. |
| 302 | 302 | */ |
| 303 | 303 | static unsigned char zBase[] = |
| 304 | - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"; | |
| 304 | + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | |
| 305 | 305 | |
| 306 | 306 | /* |
| 307 | 307 | ** Encode a string using a base-64 encoding. |
| 308 | 308 | ** The encoding can be reversed using the <b>decode64</b> function. |
| 309 | 309 | ** |
| @@ -314,11 +314,11 @@ | ||
| 314 | 314 | int i, n; |
| 315 | 315 | |
| 316 | 316 | if( nData<=0 ){ |
| 317 | 317 | nData = strlen(zData); |
| 318 | 318 | } |
| 319 | - z64 = malloc( (nData*4)/3 + 6 ); | |
| 319 | + z64 = malloc( (nData*4)/3 + 8 ); | |
| 320 | 320 | for(i=n=0; i+2<nData; i+=3){ |
| 321 | 321 | z64[n++] = zBase[ (zData[i]>>2) & 0x3f ]; |
| 322 | 322 | z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ]; |
| 323 | 323 | z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) | ((zData[i+2]>>6) & 0x03) ]; |
| 324 | 324 | z64[n++] = zBase[ zData[i+2] & 0x3f ]; |
| @@ -325,17 +325,35 @@ | ||
| 325 | 325 | } |
| 326 | 326 | if( i+1<nData ){ |
| 327 | 327 | z64[n++] = zBase[ (zData[i]>>2) & 0x3f ]; |
| 328 | 328 | z64[n++] = zBase[ ((zData[i]<<4) & 0x30) | ((zData[i+1]>>4) & 0x0f) ]; |
| 329 | 329 | z64[n++] = zBase[ ((zData[i+1]<<2) & 0x3c) ]; |
| 330 | + z64[n++] = '='; | |
| 330 | 331 | }else if( i<nData ){ |
| 331 | 332 | z64[n++] = zBase[ (zData[i]>>2) & 0x3f ]; |
| 332 | 333 | z64[n++] = zBase[ ((zData[i]<<4) & 0x30) ]; |
| 334 | + z64[n++] = '='; | |
| 335 | + z64[n++] = '='; | |
| 333 | 336 | } |
| 334 | 337 | z64[n] = 0; |
| 335 | 338 | return z64; |
| 336 | 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 | + | |
| 337 | 355 | |
| 338 | 356 | /* |
| 339 | 357 | ** This function treats its input as a base-64 string and returns the |
| 340 | 358 | ** decoded value of that string. Characters of input that are not |
| 341 | 359 | ** valid base-64 characters (such as spaces and newlines) are ignored. |
| @@ -382,10 +400,24 @@ | ||
| 382 | 400 | } |
| 383 | 401 | zData[j] = 0; |
| 384 | 402 | *pnByte = j; |
| 385 | 403 | return zData; |
| 386 | 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 | +} | |
| 387 | 419 | |
| 388 | 420 | /* |
| 389 | 421 | ** The base-16 encoding using the following characters: |
| 390 | 422 | ** |
| 391 | 423 | ** 0123456789abcdef |
| 392 | 424 |
| --- 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 |