sizeof(crypto_sign_ed25519_ctx),
};
+////////////////////
+/// HMAC SHA 512 ///
+////////////////////
+void crypto_hmac_init(crypto_hmac_ctx *ctx, const u8 *key, size_t key_size)
+{
+ if (key_size <= 64) {
+ FOR (i, 0, key_size) { ctx->key[i] = key[i]; }
+ FOR (i, key_size, 64) { ctx->key[i] = 0; }
+ } else {
+ crypto_sha512(ctx->key, key, key_size);
+ }
+ FOR (i, 0, 64) {
+ ctx->key[i] ^= 0x36;
+ }
+ crypto_sha512_init (&ctx->ctx);
+ crypto_sha512_update(&ctx->ctx, ctx->key, 64);
+}
+
+void crypto_hmac_update(crypto_hmac_ctx *ctx,
+ const u8 *message, size_t message_size)
+{
+ crypto_sha512_update(&ctx->ctx, message, message_size);
+}
+
+void crypto_hmac_final(crypto_hmac_ctx *ctx, u8 hmac[64])
+{
+ crypto_sha512_final(&ctx->ctx, hmac);
+ FOR (i, 0, 64) {
+ ctx->key[i] ^= 0x36 ^ 0x5c;
+ }
+ crypto_sha512_init (&ctx->ctx);
+ crypto_sha512_update(&ctx->ctx, ctx->key , 64);
+ crypto_sha512_update(&ctx->ctx, hmac, 64);
+ crypto_sha512_final (&ctx->ctx, hmac);
+ WIPE_CTX(ctx);
+}
+
+void crypto_hmac(u8 *hmac, const u8 *key, size_t key_size,
+ const u8 *message, size_t message_size)
+{
+ crypto_hmac_ctx ctx;
+ crypto_hmac_init (&ctx, key, key_size);
+ crypto_hmac_update(&ctx, message, message_size);
+ crypto_hmac_final (&ctx, hmac);
+}
+
+
///////////////
/// Ed25519 ///
///////////////
size_t input_idx;
} crypto_sha512_ctx;
+typedef struct {
+ uint8_t key[64];
+ crypto_sha512_ctx ctx;
+} crypto_hmac_ctx;
+
typedef struct {
crypto_sign_ctx_abstract ctx;
crypto_sha512_ctx hash;
void crypto_sha512_update(crypto_sha512_ctx *ctx,
const uint8_t *message, size_t message_size);
void crypto_sha512_final (crypto_sha512_ctx *ctx, uint8_t hash[64]);
-void crypto_sha512(uint8_t *out,const uint8_t *message, size_t message_size);
+void crypto_sha512(uint8_t *hash, const uint8_t *message, size_t message_size);
// vtable for signatures
extern const crypto_sign_vtable crypto_sha512_vtable;
+// HMAC SHA 512
+// ------------
+void crypto_hmac_init(crypto_hmac_ctx *ctx,
+ const uint8_t *key, size_t key_size);
+void crypto_hmac_update(crypto_hmac_ctx *ctx,
+ const uint8_t *message, size_t message_size);
+void crypto_hmac_final(crypto_hmac_ctx *ctx, uint8_t hmac[64]);
+void crypto_hmac(uint8_t *hmac,
+ const uint8_t *key , size_t key_size,
+ const uint8_t *message, size_t message_size);
+
+
// Ed25519
// -------