tWrite keys encoded in base64 format - sick - sign and check files using ed25519
 (HTM) git clone git://z3bra.org/sick
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 65c927600a8e8db3a65a2b62fce53a05aa97948c
 (DIR) parent 0806ed0a99136ae1d118d0e19c2ec9648c9fc603
 (HTM) Author: Willy Goiffon <contact@z3bra.org>
       Date:   Thu, 10 Aug 2023 18:01:49 +0200
       
       Write keys encoded in base64 format
       
       Diffstat:
         M sick.c                              |      37 +++++++++++++++++--------------
       
       1 file changed, 20 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git a/sick.c b/sick.c
       t@@ -201,50 +201,53 @@ extractsig(unsigned char **sig, unsigned char *buf, size_t len)
        static int
        createkeypair(const char *alias)
        {
       -        size_t len = 0;
       +        size_t klen = 0;
                FILE *fp = NULL;
                char fn[PATH_MAX];
       -        unsigned char pub[32], priv[64];
       -
       -        /*
       -         * don't bother checking if `len > 0`. If the user wants to create
       -         * files named ".key" and ".pub", that's OK.
       -         */
       -        len = strnlen(alias, PATH_MAX);
       +        unsigned char pub[32], priv[64], base64[96], *buf = NULL;
        
                crypto_sign_ed25519_keypair(pub, priv);
        
       -        /* write private key to "<alias>.key" */
                memset(fn, 0, PATH_MAX);
       -        memcpy(fn, alias, len);
       -        memcpy(fn+len, ".key", 4);
       +        memset(base64, 0, sizeof(base64));
       +
       +        /* write public key to "<alias>.pub" */
       +        sprintf(fn, "%s.pub", alias);
                if (verbose)
       -                fprintf(stderr, "Creating private key %s\n", fn);
       +                fprintf(stderr, "Creating public key %s\n", fn);
                if ((fp = fopen(fn, "w")) == NULL) {
                        perror(fn);
                        return -1;
                }
       -        if (fwrite(priv, 1, sizeof(priv), fp) < sizeof(priv)) {
       +        klen = base64_encode((char **)&buf, pub, sizeof(pub));
       +        memcpy(base64, buf, klen);
       +        base64[klen] = '\n';
       +        if (fwrite(base64, 1, klen+1, fp) < klen) {
                        fclose(fp);
                        perror(fn);
                        return -1;
                }
                fclose(fp);
       +        free(buf);
        
       -        /* write public key to "<alias>.pub" */
       -        memcpy(fn+len, ".pub", 4);
       +        /* write private key to "<alias>.key" */
       +        sprintf(fn, "%s.key", alias);
                if (verbose)
       -                fprintf(stderr, "Creating public key %s\n", fn);
       +                fprintf(stderr, "Creating private key %s\n", fn);
                if ((fp = fopen(fn, "w")) == NULL) {
                        perror(fn);
                        return -1;
                }
       -        if (fwrite(pub, 1, sizeof(pub), fp) < sizeof(pub)) {
       +        klen = base64_encode((char **)&buf, priv, sizeof(priv));
       +        memcpy(base64, buf, klen);
       +        base64[klen] = '\n';
       +        if (fwrite(base64, 1, klen + 1, fp) < klen) {
                        fclose(fp);
                        perror(fn);
                        return -1;
                }
                fclose(fp);
       +        free(buf);
        
                return 0;
        }