int cert_fingerprint(X509* cert, char *buf, size_t n, neo4j_logger_t *logger) { unsigned char *der = NULL; int derlen = i2d_X509(cert, &der); if (derlen < 0) { errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__); return -1; } unsigned char digest[EVP_MAX_MD_SIZE]; unsigned int dlen; if (sha512_digest(digest, &dlen, der, derlen, logger)) { free(der); return -1; } assert(dlen <= EVP_MAX_MD_SIZE); size_t c = 0; for (unsigned int i = 0; i < dlen && c < n; i++) { snprintf(buf + c, n - c, "%02x", digest[i]); c += 2; } return 0; }
static int _digest_nettle(int algo, uint8_t* buf, size_t len, unsigned char* res) { switch(algo) { case SHA1_DIGEST_SIZE: { struct sha1_ctx ctx; sha1_init(&ctx); sha1_update(&ctx, len, buf); sha1_digest(&ctx, SHA1_DIGEST_SIZE, res); return 1; } case SHA256_DIGEST_SIZE: { struct sha256_ctx ctx; sha256_init(&ctx); sha256_update(&ctx, len, buf); sha256_digest(&ctx, SHA256_DIGEST_SIZE, res); return 1; } case SHA384_DIGEST_SIZE: { struct sha384_ctx ctx; sha384_init(&ctx); sha384_update(&ctx, len, buf); sha384_digest(&ctx, SHA384_DIGEST_SIZE, res); return 1; } case SHA512_DIGEST_SIZE: { struct sha512_ctx ctx; sha512_init(&ctx); sha512_update(&ctx, len, buf); sha512_digest(&ctx, SHA512_DIGEST_SIZE, res); return 1; } default: break; } return 0; }
void libmaus::digest::SHA2_512::digest(uint8_t * digest) { sha512_digest(reinterpret_cast<sha512_ctx *>(ctx),digestlength,&digest[0]); }
static int __archive_nettle_sha512final(archive_sha512_ctx *ctx, void *md) { sha512_digest(ctx, SHA512_DIGEST_SIZE, md); return (ARCHIVE_OK); }