summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Fankhauser hiddenalpha.ch2023-08-25 18:05:05 +0200
committerAndreas Fankhauser hiddenalpha.ch2023-08-25 18:05:05 +0200
commit428d1d892f1e06854352160acc8f333cc2e4ec80 (patch)
tree4936537d430ad50221632970c8262abf555e4190
parentdeccdca92670bdcd788103164dacb7b156ea026e (diff)
downloadUnspecifiedGarbage-428d1d892f1e06854352160acc8f333cc2e4ec80.zip
UnspecifiedGarbage-428d1d892f1e06854352160acc8f333cc2e4ec80.tar.gz
(PemCodec) Cleanup.
-rw-r--r--src/main/c/foo/PemCodec.c132
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
}