blob: d87fd993790d8f1fdb07c869665040d7ff8984a6 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_SECURITY_FCRYPTO_HMAC_H_
#define SRC_SECURITY_FCRYPTO_HMAC_H_
#include <stddef.h>
#include <stdint.h>
#include <zircon/types.h>
#include <memory>
#include <fbl/macros.h>
#include "src/security/fcrypto/bytes.h"
#include "src/security/fcrypto/digest.h"
#include "src/security/fcrypto/secret.h"
// |crypto::hmac| is a block-sized hash-bashed message authentication code.
namespace crypto {
class __EXPORT HMAC final {
public:
enum Flags : uint16_t {
ALLOW_WEAK_KEY = 0x0001,
ALLOW_TRUNCATION = 0x0002,
};
HMAC();
~HMAC();
// Convenience method that calls |Init|, |Update|, and |Final| in one shot to create a keyed
// digest that it saves in |out|. Callers must omit |flags| unless the security implications
// are clearly understood.
static zx_status_t Create(digest::Algorithm digest, const Secret& key, const void* in,
size_t in_len, Bytes* out, uint16_t flags = 0);
// Convenience method that checks if the given |digest| matches the one that |Create| would
// generate using |digest|, |key|, |in|, and |in_len|. On failure, it returns
// |ZX_ERR_IO_DATA_INTEGRITY|. Callers must omit |flags| unless the security implications are
// clearly understood.
static zx_status_t Verify(digest::Algorithm digest, const Secret& key, const void* in,
size_t in_len, const Bytes& hmac, uint16_t flags = 0);
// Initializes the HMAC algorithm indicated by |digest| with the given |key|. A call to |Init|
// must precede any calls to |Update| or |Final|. Callers must omit |flags| unless the security
// implications are clearly understood.
zx_status_t Init(digest::Algorithm digest, const Secret& key, uint16_t flags = 0);
// Updates the HMAC with |in_len| bytes of additional data from |in|. This can only be called
// between calls to |Init| and |Final|.
zx_status_t Update(const void* in, size_t in_len);
// Returns the keyed digest in |out|. |Init| must be called again before calling |Update|
// again.
zx_status_t Final(Bytes* out);
private:
DISALLOW_COPY_ASSIGN_AND_MOVE(HMAC);
// Opaque crypto implementation context.
struct Context;
// Opaque pointer to the crypto implementation context.
std::unique_ptr<Context> ctx_;
};
} // namespace crypto
#endif // SRC_SECURITY_FCRYPTO_HMAC_H_