randomsync/sign.c

70 lines
2.5 KiB
C

/* Copyright (C) 2021 Noisytoot
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sodium.h>
#include "common.h"
int main(int argc, char *argv[]) {
FILE *keyfile;
char base64_sk[base64_sk_len + 1];
unsigned char sk[crypto_sign_SECRETKEYBYTES];
size_t sk_len;
unsigned char message[max_message_len + 1];
ssize_t message_len;
unsigned char signature[crypto_sign_BYTES];
char base64_signature[base64_signature_len];
if (argc < 2) {
fprintf(stderr, "usage: %s <keyfile>\n", argv[0]);
return 1;
}
if ((keyfile = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "open: %s: %s\n", argv[1], strerror(errno));
return 1;
}
memset(base64_sk, 0, base64_sk_len + 1); /* sodium_base642bin expects a string */
fread(base64_sk, base64_sk_len, 1, keyfile);
if (sodium_init() == -1) {
fprintf(stderr, "error: sodium_init failed\n");
return 1;
}
if ((sodium_base642bin(sk, crypto_sign_SECRETKEYBYTES,
base64_sk, base64_sk_len,
base64_ignore, &sk_len,
NULL, base64_variant)) != 0) {
fprintf(stderr, "error: failed to decode private key\n");
return 1;
}
if (sk_len != crypto_sign_SECRETKEYBYTES) {
fprintf(stderr, "error: key too short (got %ld bytes, expected %d bytes)\n", sk_len, crypto_sign_SECRETKEYBYTES);
return 1;
}
memset(message, 0, max_message_len + 1); /* so %s can be used to print it */
message_len = read(0, message, max_message_len);
if (message_len == -1) {
perror("read");
return 1;
}
crypto_sign_detached(signature, NULL, message, message_len, sk);
sodium_bin2base64(base64_signature, base64_signature_len,
signature, crypto_sign_BYTES, base64_variant);
printf("%s %s\n", base64_signature, message);
return 0;
}