/* * GraxRabble * Demo programs for libsodium. */ #include #include #include #include /* library header */ #include "utils.h" /* utility functions shared by demos */ /* * Signs a message with secret key which will authenticate a message. * Everybody else can use the public key to ensure that the message is both * valid and untampered. * * Note that the signed message will have 16 bytes of signature prepended. * Ensure that the signed buffer is at least crypto_sign_BYTES longer then * the actual message. */ static int sign(void) { unsigned char pk[crypto_sign_PUBLICKEYBYTES]; /* Bob public */ unsigned char sk[crypto_sign_SECRETKEYBYTES]; /* Bob secret */ unsigned char m[MAX_INPUT_SIZE]; /* message */ unsigned char sm[MAX_INPUT_SIZE + crypto_sign_BYTES]; /* signed message */ unsigned long long int mlen; /* message length */ unsigned long long int smlen; /* signed length */ int r; puts("Example: crypto_sign\n"); puts("Generating keypair..."); crypto_sign_keypair(pk, sk); /* generate Bob's keys */ fputs("Public: ", stdout); print_hex(pk, sizeof pk); putchar('\n'); fputs("Secret: ", stdout); print_hex(sk, sizeof sk); putchar('\n'); mlen = prompt_input("a message", (char*)m, sizeof m, 1); putchar('\n'); puts("Notice the message has no prepended padding"); print_hex(m, mlen); putchar('\n'); printf("Signing message with %s...\n", crypto_sign_primitive()); crypto_sign(sm, &smlen, m, mlen, sk); puts("Notice the signed message has prepended signature"); print_hex(sm, smlen); putchar('\n'); fputs("Signature: ", stdout); print_hex(sm, crypto_sign_BYTES); putchar('\n'); fputs("Message: ", stdout); fwrite(sm + crypto_sign_BYTES, 1U, smlen - crypto_sign_BYTES, stdout); putchar('\n'); puts("Validating message..."); r = crypto_sign_open(m, &mlen, sm, smlen, pk); print_verification(r); if (r == 0) printf("Message: %s\n", m); sodium_memzero(sk, sizeof sk); /* wipe sensitive data */ sodium_memzero(m, sizeof m); sodium_memzero(sm, sizeof sm); return r; } int main(void) { init(); return sign() != 0; }