Beispiel #1
0
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);
}
Beispiel #2
0
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;
}
Beispiel #3
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);
}