1
/* base64dec -- an decoder for base64
3
* Copyright (C) 2006, 2012 Jeronimo Pellegrini, Niels Möller
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU Lesser General Public License as published by
7
* the Free Software Foundation; either version 2.1 of the License, or (at your
8
* option) any later version.
10
* This program is distributed in the hope that it will be useful, but
11
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
13
* License for more details.
15
* You should have received a copy of the GNU Lesser General Public License
16
* along with the nettle library; see the file COPYING.LIB. If not, write to
17
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
37
#define CHUNK_SIZE 16392
39
/* The maximum number of bytes generated for each chunk: */
40
#define DECODED_SIZE BASE64_DECODE_LENGTH(CHUNK_SIZE)
44
* Reads base-64 encoded from stdin, writes decoded to stdout.
47
main(int argc UNUSED, char **argv UNUSED)
49
/* "buffer" will hold the bytes from disk: */
50
uint8_t * buffer = xalloc (CHUNK_SIZE);
52
/* "result" will hold bytes before output: */
53
uint8_t * result = xalloc (DECODED_SIZE);
55
/* We need a Base64 context for decoding: */
56
struct base64_decode_ctx b64_ctx;
58
/* Init the context: */
59
base64_decode_init(&b64_ctx);
62
_setmode(1, O_BINARY);
67
int nbytes; /* Number of bytes read frmo disk at each iteration */
68
unsigned decoded_bytes; /* Bytes actually generated at each iteration */
70
nbytes = fread(buffer, 1, CHUNK_SIZE, stdin);
72
if (nbytes < CHUNK_SIZE && ferror(stdin))
74
werror ("Error reading file: %s\n", strerror(errno));
78
decoded_bytes = BASE64_DECODE_LENGTH(nbytes);
80
/* Decodes one chunk: */
81
if (!base64_decode_update(&b64_ctx, &decoded_bytes, result, nbytes, buffer))
83
werror ("Error decoding input (not base64?)\n");
87
if (!write_string (stdout, decoded_bytes, result))
89
werror ("Error writing file: %s\n", strerror(errno));
93
if (nbytes < CHUNK_SIZE)
95
/* Check if decoding finalized OK: */
96
if (!base64_decode_final(&b64_ctx))
98
werror ("Decoding did not finish properly.\n");
105
if (fflush (stdout) != 0)
107
werror ("Error writing file: %s\n", strerror(errno));