CAMLprim value stub_sha512_finalize(value ctx) { CAMLparam1(ctx); CAMLlocal1(result); result = caml_alloc_string(64); sha512_finalize(GET_CTX_STRUCT(ctx), String_val(result)); CAMLreturn(result); }
static inline int sha512_file(char *filename, uint8_t *digest) { #define BLKSIZE 4096 unsigned char buf[BLKSIZE]; int fd; ssize_t n; struct sha512_ctx ctx; fd = open(filename, O_RDONLY); if (fd == -1) return 1; sha512_init(&ctx); while ((n = read(fd, buf, BLKSIZE)) > 0) sha512_update(&ctx, buf, n); if (n == 0) sha512_finalize(&ctx, digest); close(fd); return n < 0; #undef BLKSIZE }
static NTSTATUS hash_finish( struct hash_impl *hash, enum alg_id alg_id, UCHAR *output, ULONG size ) { switch (alg_id) { case ALG_ID_MD2: md2_finalize( &hash->u.md2, output ); break; case ALG_ID_MD4: MD4Final( &hash->u.md4 ); memcpy( output, hash->u.md4.digest, 16 ); break; case ALG_ID_MD5: MD5Final( &hash->u.md5 ); memcpy( output, hash->u.md5.digest, 16 ); break; case ALG_ID_SHA1: A_SHAFinal( &hash->u.sha1, (ULONG *)output ); break; case ALG_ID_SHA256: sha256_finalize( &hash->u.sha256, output ); break; case ALG_ID_SHA384: sha384_finalize( &hash->u.sha512, output ); break; case ALG_ID_SHA512: sha512_finalize( &hash->u.sha512, output ); break; default: ERR( "unhandled id %u\n", alg_id ); return STATUS_NOT_IMPLEMENTED; } return STATUS_SUCCESS; }