void hmac_sha384_final(hmac_sha384_ctx *ctx, unsigned char *mac, unsigned int mac_size) { unsigned char digest_inside[SHA384_DIGEST_SIZE]; unsigned char mac_temp[SHA384_DIGEST_SIZE]; sha384_final(&ctx->ctx_inside, digest_inside); sha384_update(&ctx->ctx_outside, digest_inside, SHA384_DIGEST_SIZE); sha384_final(&ctx->ctx_outside, mac_temp); memcpy(mac, mac_temp, mac_size); }
unsigned char* sha384_MemBlock(const unsigned char* msg, size_t size, HASH_ctx* ctx) { sha384_init(ctx); sha384_update(ctx, msg, size); sha384_final(ctx, msg, size); return ctx->SHA384_result; }
void sha384(unsigned char *digest, int len, unsigned char *hash) { SHA384CTX c = sha384_init(); if (c != NULL) { sha384_update(c, digest, len); sha384_final(hash, c); } }
void sha384(const unsigned char *message, unsigned int len, unsigned char *digest) { sha384_ctx ctx; sha384_init(&ctx); sha384_update(&ctx, message, len); sha384_final(&ctx, digest); }
void sha384_complete(const void *buf, size_t len, uint8_t *digest) { sha384_ctx ctx; sha384_init(&ctx); sha384_update(&ctx, buf, len); sha384_final(&ctx, digest); }
ssh_string SshAgentSignEcdsaSha384(uint8_t* data, int dataSize, ssh_key key, uint32_t flags) { // Compute the hash. unsigned char hash[SHA384_DIGEST_LEN] = {0}; SHACTX ctx; ctx = sha384_init(); if (ctx == NULL) { return NULL; } sha384_update(ctx, data, dataSize); sha384_final(hash, ctx); // This release ctx. // Sign the hash. ECDSA_SIG* sig = NULL; sig = ECDSA_do_sign(hash, sizeof(hash), key->ecdsa); if (sig == NULL) { return NULL; } // Format the signature in a blob of the form: // blobLength[ typeNameLength[ typeName ] signatureLength[ rLength[ r ] sLength[ s ] ] ] int rMpiLength = BN_bn2mpi(sig->r, NULL); int sMpiLength = BN_bn2mpi(sig->s, NULL); int signatureLength = rMpiLength + sMpiLength; int typeNameLength = 19; int blobLength = 8 + typeNameLength + signatureLength; uint8_t* signatureBlob = malloc(4 + blobLength); if (signatureBlob == NULL) { return NULL; } pack32(signatureBlob, blobLength); int index = 4; pack32(signatureBlob + index, typeNameLength); index += 4; memcpy(signatureBlob + index, "ecdsa-sha2-nistp384", typeNameLength); index += typeNameLength; pack32(signatureBlob + 15, signatureLength); index += 4; BN_bn2mpi(sig->r, signatureBlob + index); index += rMpiLength; BN_bn2mpi(sig->s, signatureBlob + index); return (ssh_string)signatureBlob; }
void ssh_mac_final(unsigned char *md, ssh_mac_ctx ctx) { switch(ctx->mac_type){ case SSH_MAC_SHA1: sha1_final(md,ctx->ctx.sha1_ctx); break; case SSH_MAC_SHA256: sha256_final(md,ctx->ctx.sha256_ctx); break; case SSH_MAC_SHA384: sha384_final(md,ctx->ctx.sha384_ctx); break; case SSH_MAC_SHA512: sha512_final(md,ctx->ctx.sha512_ctx); break; default: break; } SAFE_FREE(ctx); }
static void sha384_final_thunk(u_char *hash, union hash_ctx *ctx) { sha384_final(hash, &ctx->ctx_sha384); }
void mySHA384_Final(char md[20], void *c) { sha384_final((sha384_ctx *)c, md); }