version 1.2, 2014/02/02 03:44:31 |
version 1.3, 2014/06/24 01:13:21 |
|
|
#include <sha1.h> |
#include <sha1.h> |
#include <sha2.h> |
#include <sha2.h> |
|
|
#include "buffer.h" |
#include "ssherr.h" |
|
#include "sshbuf.h" |
#include "digest.h" |
#include "digest.h" |
|
|
typedef void md_init_fn(void *mdctx); |
typedef void md_init_fn(void *mdctx); |
|
|
const struct ssh_digest *digest = ssh_digest_by_alg(from->alg); |
const struct ssh_digest *digest = ssh_digest_by_alg(from->alg); |
|
|
if (digest == NULL || from->alg != to->alg) |
if (digest == NULL || from->alg != to->alg) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
memcpy(to->mdctx, from->mdctx, digest->ctx_len); |
memcpy(to->mdctx, from->mdctx, digest->ctx_len); |
return 0; |
return 0; |
} |
} |
|
|
const struct ssh_digest *digest = ssh_digest_by_alg(ctx->alg); |
const struct ssh_digest *digest = ssh_digest_by_alg(ctx->alg); |
|
|
if (digest == NULL) |
if (digest == NULL) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
digest->md_update(ctx->mdctx, m, mlen); |
digest->md_update(ctx->mdctx, m, mlen); |
return 0; |
return 0; |
} |
} |
|
|
int |
int |
ssh_digest_update_buffer(struct ssh_digest_ctx *ctx, const Buffer *b) |
ssh_digest_update_buffer(struct ssh_digest_ctx *ctx, const struct sshbuf *b) |
{ |
{ |
return ssh_digest_update(ctx, buffer_ptr(b), buffer_len(b)); |
return ssh_digest_update(ctx, sshbuf_ptr(b), sshbuf_len(b)); |
} |
} |
|
|
int |
int |
|
|
const struct ssh_digest *digest = ssh_digest_by_alg(ctx->alg); |
const struct ssh_digest *digest = ssh_digest_by_alg(ctx->alg); |
|
|
if (digest == NULL) |
if (digest == NULL) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
if (dlen > UINT_MAX) |
if (dlen > UINT_MAX) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
if (dlen < digest->digest_len) /* No truncation allowed */ |
if (dlen < digest->digest_len) /* No truncation allowed */ |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
digest->md_final(d, ctx->mdctx); |
digest->md_final(d, ctx->mdctx); |
return 0; |
return 0; |
} |
} |
|
|
struct ssh_digest_ctx *ctx = ssh_digest_start(alg); |
struct ssh_digest_ctx *ctx = ssh_digest_start(alg); |
|
|
if (ctx == NULL) |
if (ctx == NULL) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
if (ssh_digest_update(ctx, m, mlen) != 0 || |
if (ssh_digest_update(ctx, m, mlen) != 0 || |
ssh_digest_final(ctx, d, dlen) != 0) |
ssh_digest_final(ctx, d, dlen) != 0) |
return -1; |
return SSH_ERR_INVALID_ARGUMENT; |
ssh_digest_free(ctx); |
ssh_digest_free(ctx); |
return 0; |
return 0; |
} |
} |
|
|
int |
int |
ssh_digest_buffer(int alg, const Buffer *b, u_char *d, size_t dlen) |
ssh_digest_buffer(int alg, const struct sshbuf *b, u_char *d, size_t dlen) |
{ |
{ |
return ssh_digest_memory(alg, buffer_ptr(b), buffer_len(b), d, dlen); |
return ssh_digest_memory(alg, sshbuf_ptr(b), sshbuf_len(b), d, dlen); |
} |
} |