Menu

- Learn
- Documentation
  - Language Reference
  - Library Reference
  - Command-line Reference
  - Feature Overview
  - Articles
- Packages
- Community
  - Blog
  - Orgs using D
  - Twitter
  - Forums
  - IRC
  - Wiki
  - GitHub
  - Issues
  - Foundation
  - Donate
- Resources
  - Books
  - Tutorials
  - Tools
  - Editors
  - IDEs
  - Visual D
  - Acknowledgments
  - D Style
  - Glossary
  - Sitemap

Search
Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.

# std.digest.hmac

This package implements the hash-based message authentication code (HMAC) algorithm as defined in RFC2104. See also the corresponding Wikipedia article.
License:
Boost License 1.0.

Source: std/digest/hmac.d

Examples:
Computes an HMAC over data read from stdin.
Template API HMAC implementation.
This implements an HMAC over the digest H. If H doesn't provide information about the block size, it can be supplied explicitly using the second overload.
This type conforms to std.digest.digest.isDigest.

    import std.digest.hmac, std.digest.sha, std.stdio;
    import std.string : representation;

    auto secret = "secret".representation;
    stdin.byChunk(4096)
         .hmac!SHA1(secret)
         .toHexString!(LetterCase.lower)
         .writeln;

struct `HMAC`(H, size_t hashBlockSize) if (hashBlockSize % 8 == 0);
  Overload of `HMAC` to be used if H doesn't provide information about its block size.
  this(scope const(ubyte)[] `secret`);
    Constructs the HMAC digest using the specified `secret`.
    Examples:

        import std.digest.hmac, std.digest.sha;
        import std.string : representation;
        auto hmac = HMAC!SHA1("My s3cR3T keY".representation);
        hmac.put("Hello, world".representation);
        static immutable expected = [
            130, 32, 235, 44, 208, 141,
            150, 232, 211, 214, 162, 195,
            188, 127, 52, 89, 100, 68, 90, 216];
        assert(hmac.finish() == expected);

  ref return HMAC!(H, blockSize) `start`();
    Reinitializes the digest, making it ready for reuse.

    Note: The constructor leaves the digest in an initialized state, so that this method only needs to be called if an unfinished digest is to be reused.

    Returns:
    A reference to the digest for convenient chaining.
    Examples:

        import std.digest.hmac, std.digest.sha;
        import std.string : representation;
        string data1 = "Hello, world", data2 = "Hola mundo";
        auto hmac = HMAC!SHA1("My s3cR3T keY".representation);
        hmac.put(data1.representation);
        hmac.start();                   // reset digest
        hmac.put(data2.representation); // start over
        static immutable expected = [
            122, 151, 232, 240, 249, 80,
            19, 178, 186, 77, 110, 23, 208,
            52, 11, 88, 34, 151, 192, 255];
        assert(hmac.finish() == expected);

  ref return HMAC!(H, blockSize) `put`(in ubyte[] `data`...);
    Feeds a piece of `data` into the hash computation. This method allows the type to be used as an std.range.OutputRange.
    Returns:
    A reference to the digest for convenient chaining.
    Examples:

        import std.digest.hmac, std.digest.sha;
        import std.string : representation;
        string data1 = "Hello, world", data2 = "Hola mundo";
        auto hmac = HMAC!SHA1("My s3cR3T keY".representation);
        hmac.put(data1.representation)
            .put(data2.representation);
        static immutable expected = [
            197, 57, 52, 3, 13, 194, 13,
            36, 117, 228, 8, 11, 111, 51,
            165, 3, 123, 31, 251, 113];
        assert(hmac.finish() == expected);

  DigestType!H `finish`();
    Resets the digest and returns the finished hash.
    Examples:

        import std.digest.hmac, std.digest.sha;
        import std.string : representation;
        string data1 = "Hello, world", data2 = "Hola mundo";
        auto hmac = HMAC!SHA1("My s3cR3T keY".representation);
        auto digest = hmac.put(data1.representation)
                          .put(data2.representation)
                          .finish();
        static immutable expected = [
            197, 57, 52, 3, 13, 194, 13,
            36, 117, 228, 8, 11, 111, 51,
            165, 3, 123, 31, 251, 113];
        assert(digest == expected);

template `hmac`(H) if (isDigest!H && hasBlockSize!H)
auto `hmac`(H, size_t blockSize)(scope const(ubyte)[] `secret`)
if (isDigest!H);
  Convenience constructor for HMAC.

Copyright © 1999-2017 by the D Language Foundation | Page generated by Ddoc on Thu Aug 10 17:51:10 2017