md5.h 2.1 KB
Newer Older
Kenton Varda's avatar
Kenton Varda committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
// This file was modified by Kenton Varda from code placed in the public domain.
// The code, which was originally C, was modified to give it a C++ interface.
// The original code bore the following notice:

/*
 * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
 * MD5 Message-Digest Algorithm (RFC 1321).
 *
 * Homepage:
 * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
 *
 * Author:
 * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
 *
 * This software was written by Alexander Peslyak in 2001.  No copyright is
 * claimed, and the software is hereby placed in the public domain.
 * In case this attempt to disclaim copyright and place the software in the
 * public domain is deemed null and void, then the software is
 * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
 * general public under the following terms:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted.
 *
 * There's ABSOLUTELY NO WARRANTY, express or implied.
 *
 * See md5.c for more information.
 */

// TODO(someday):  Put in KJ?

#ifndef CAPNP_COMPILER_MD5_H
#define CAPNP_COMPILER_MD5_H

#include <kj/string.h>
#include <kj/array.h>

namespace capnp {
namespace compiler {

class Md5 {
public:
  Md5();

  void update(kj::ArrayPtr<const kj::byte> data);
  inline void update(kj::ArrayPtr<const char> data) {
47
    return update(data.asBytes());
Kenton Varda's avatar
Kenton Varda committed
48 49 50 51
  }
  inline void update(kj::StringPtr data) {
    return update(data.asArray());
  }
52 53 54
  inline void update(const char* data) {
    return update(kj::StringPtr(data));
  }
Kenton Varda's avatar
Kenton Varda committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

  kj::ArrayPtr<const kj::byte> finish();
  kj::StringPtr finishAsHex();

private:
  /* Any 32-bit or wider unsigned integer data type will do */
  typedef unsigned int MD5_u32plus;

  bool finished = false;

  typedef struct {
    MD5_u32plus lo, hi;
    MD5_u32plus a, b, c, d;
    kj::byte buffer[64];
    MD5_u32plus block[16];
  } MD5_CTX;

  MD5_CTX ctx;

  const kj::byte* body(const kj::byte* ptr, size_t size);
};

}  // namespace compiler
}  // namespace capnp

#endif  // CAPNP_COMPILER_MD5_H