diff options
author | Andreas Fankhauser hiddenalpha.ch | 2023-08-25 18:05:05 +0200 |
---|---|---|
committer | Andreas Fankhauser hiddenalpha.ch | 2023-08-25 18:05:05 +0200 |
commit | 428d1d892f1e06854352160acc8f333cc2e4ec80 (patch) | |
tree | 4936537d430ad50221632970c8262abf555e4190 | |
parent | deccdca92670bdcd788103164dacb7b156ea026e (diff) | |
download | UnspecifiedGarbage-428d1d892f1e06854352160acc8f333cc2e4ec80.zip UnspecifiedGarbage-428d1d892f1e06854352160acc8f333cc2e4ec80.tar.gz |
(PemCodec) Cleanup.
-rw-r--r-- | src/main/c/foo/PemCodec.c | 132 |
1 files changed, 70 insertions, 62 deletions
diff --git a/src/main/c/foo/PemCodec.c b/src/main/c/foo/PemCodec.c index c797610..79f486e 100644 --- a/src/main/c/foo/PemCodec.c +++ b/src/main/c/foo/PemCodec.c @@ -1,17 +1,3 @@ -/* - -TODO move to some kind of makefile - - true \ - && CFLAGS="-Wall -std=c99 -Werror -fmax-errors=3" \ - && `# CFLAGS="-Wall -std=c99 -Werror -fmax-errors=3 -ggdb -O0 -g3" ` \ - && BINEXT= \ - && CC=x86_64-w64-mingw32-gcc \ - && (mkdir build build/bin || true) \ - && ${CC:?} -o build/bin/pem-codec${BINEXT} ${CFLAGS} src/main/c/foo/PemCodec.c \ - && true - -*/ /* System */ #include <assert.h> @@ -41,8 +27,8 @@ enum Mode { struct PemCodec { int isHelp; /* TODO flg */ enum Mode mode; /* one of "ENCODE" or "DECODE" */ - unsigned char buf[BUF_CAP]; int buf_len; + unsigned char buf[BUF_CAP]; }; @@ -80,46 +66,15 @@ static int parseArgs( int argc, char**argv, PemCodec*app ){ } -static int decode( PemCodec*app ){ +static int decodeB64UpToDash( PemCodec*app ){ int err; size_t sz; - - sz = fread(app->buf, 11, 1, stdin); - if( sz != 1 ){ - assert(!fprintf(stderr, "fread: %s %s:%d\n", strerror(errno), __FILE__, __LINE__)); return -1; - } - - if( memcmp(app->buf, "-----BEGIN ", 11) ){ - fprintf(stderr, "EINVAL: No valid PEM header found\n"); - return -EINVAL; - } - - /* read until EOL */ - int numDashesInSequence = 0; - for(;;){ - sz = fread(app->buf, 1, 1, stdin); - if( sz != 1 ){ - assert(!fprintf(stderr, "TODO %llu %s:%d\n", sz, __FILE__, __LINE__)); - } - if( app->buf[0] == '\n' ){ - if( numDashesInSequence != 5 ){ - fprintf(stderr, "EINVAL: No valid PEM header found\n"); - return -1; - } - break; - } - if( app->buf[0] == '-' ){ - numDashesInSequence += 1; - }else{ - numDashesInSequence = 0; - } - } - - /* decode b64 */ int iByte; int sextets[4]; + readFourInputOctets: iByte = 0; + readNextInputOctet: sz = fread(app->buf, 1, 1, stdin); if( sz != 1 ){ assert(!"TODO_20230825155237"); } @@ -141,9 +96,10 @@ readNextInputOctet: }else if( app->buf[0] == '\n' ){ /* ignore newlines */ goto readNextInputOctet; }else if( app->buf[0] == '-' ){ /* EndOf b64 data */ - goto readEndOfPemLine; + goto endFn; }else{ - assert(!"TODO_20230825155655"); + fprintf(stderr, "Unexpected octet 0x%02X in b64 stream\n", app->buf[0]); + err = -1; goto endFn; } if( ++iByte < 4 ) goto readNextInputOctet; /* aka loop */ @@ -157,13 +113,63 @@ readNextInputOctet: if( err < 0 ){ err = errno; fprintf(stderr, "printf: %s\n", strerror(errno)); - return -errno; + err = -errno; goto endFn; } goto readFourInputOctets; /* aka loop */ -readEndOfPemLine: - /* 1st dash got already consumed above */ + err = 0; +endFn: + return err; +} + + +static int decodePem( PemCodec*app ){ + int err; + size_t sz; + + sz = fread(app->buf, 11, 1, stdin); + if( sz != 1 ){ + const char *fmt = feof(stdin) + ? "Unexpected EOF while reading PEM header: %s\n" + : "Cannot read PEM header: %s\n"; + fprintf(stderr, fmt, strerror(errno)); + err = -1; goto endFn; + } + + if( memcmp(app->buf, "-----BEGIN ", 11) ){ + fprintf(stderr, "EINVAL: No valid PEM header found\n"); + err = -1; goto endFn; + } + + /* read until EOL */ + int numDashesInSequence = 0; + for(;;){ + sz = fread(app->buf, 1, 1, stdin); + if( sz != 1 ){ + const char *fmt = feof(stdin) + ? "Unexpected EOF while reading PEM header: %s\n" + : "Cannot read PEM header: %s\n"; + fprintf(stderr, fmt, strerror(errno)); + err = -1; goto endFn; + } + if( app->buf[0] == '\n' ){ + if( numDashesInSequence != 5 ){ + fprintf(stderr, "EINVAL: No valid PEM header found\n"); + err = -1; goto endFn; + } + break; + } + if( app->buf[0] == '-' ){ + numDashesInSequence += 1; + }else{ + numDashesInSequence = 0; + } + } + + if( (err=decodeB64UpToDash(app)) < 0 ){ goto endFn; } + + /* readEndOfPemLine. 1st dash got already consumed in func above */ sz = fread(app->buf, 8, 1, stdin); if( sz != 1 || memcmp(app->buf, "----END ", 8)){ assert(fprintf(stderr, "sz=%llu\n", sz)); @@ -180,33 +186,35 @@ drain: if( sz > 0 ) goto drain; if( ferror(stdin) ){ fprintf(stderr, "fread: %s\n", strerror(errno)); - return -1; + err = -1; goto endFn; } - return 0; + err = 0; +endFn: + return err; } int main( int argc, char**argv ){ - int ax; + int err; PemCodec app; #define app (&app) - if( (ax=parseArgs(argc, argv, app)) != 0 ){ goto endFn; } + if( (err=parseArgs(argc, argv, app)) != 0 ){ goto endFn; } - if( app->isHelp ){ printHelp(app); ax = 0; goto endFn; } + if( app->isHelp ){ printHelp(app); err = 0; goto endFn; } if( app->mode == MODE_ENCODE ){ fprintf(stderr, "ENOTSUP: PEM Encode not implented yet\n"); - ax = -1; goto endFn; + err = -1; goto endFn; }else{ assert(app->mode == MODE_DECODE); - ax = decode(app); + err = decodePem(app); goto endFn; } endFn: - return !!ax; + return !!err; #undef app } |