bool asignify_pubkey_check_signature(struct asignify_public_data *pk, struct asignify_public_data *sig, const unsigned char *data, size_t dlen) { SHA2_CTX sh; unsigned char h[crypto_sign_HASHBYTES]; if (pk == NULL || sig == NULL) { return (false); } /* Check sanity */ if (pk->version != sig->version || pk->id_len != sig->id_len || (pk->id_len > 0 && memcmp(pk->id, sig->id, sig->id_len) != 0)) { return (false); } if (pk->version == sig->version) { switch (pk->version) { case 0: if (pk->data_len == crypto_sign_PUBLICKEYBYTES && sig->data_len == crypto_sign_BYTES) { SHA512Init(&sh); SHA512Update(&sh, sig->data, 32); SHA512Update(&sh, pk->data, 32); SHA512Update(&sh, data, dlen); SHA512Final(h, &sh); if (crypto_sign_ed25519_verify_detached(sig->data, h, pk->data) == 0) { return (true); } } break; case 1: if (pk->data_len == crypto_sign_PUBLICKEYBYTES && sig->data_len == crypto_sign_BYTES) { /* ED25519 */ SHA512Init(&sh); SHA512Update(&sh, sig->data, 32); SHA512Update(&sh, pk->data, 32); SHA512Update(&sh, (const uint8_t *)&sig->version, sizeof(sig->version)); SHA512Update(&sh, data, dlen); SHA512Final(h, &sh); if (crypto_sign_ed25519_verify_detached(sig->data, h, pk->data) == 0) { return (true); } } break; default: break; } } return (false); }
int crypto_hash_sha512(unsigned char *out, const unsigned char *in, unsigned long long inlen) { SHA2_CTX ctx; SHA512Init(&ctx); SHA512Update(&ctx, in, inlen); SHA512Final(out, &ctx); return 0; }
/* ARGSUSED */ char * SHA512End(SHA2_CTX *ctx, char *buf) { int i; u_int8_t digest[SHA512_DIGEST_LENGTH]; static const char hex[] = "0123456789abcdef"; if (buf == NULL && (buf = malloc(SHA512_DIGEST_STRING_LENGTH)) == NULL) return (NULL); SHA512Final(digest, ctx); for (i = 0; i < SHA512_DIGEST_LENGTH; i++) { buf[i + i] = hex[digest[i] >> 4]; buf[i + i + 1] = hex[digest[i] & 0x0f]; } buf[i + i] = '\0'; memset(digest, 0, sizeof(digest)); return (buf); }
static int __archive_libc3_sha512final(archive_sha512_ctx *ctx, void *md) { SHA512Final(md, ctx); return (ARCHIVE_OK); }