1d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger/*
2d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Copyright 2012 Google Inc.
3d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger *
4d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * found in the LICENSE file.
6d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */
7d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
8d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#ifndef SkMD5_DEFINED
9d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#define SkMD5_DEFINED
10d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
11d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "SkTypes.h"
12d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "SkEndian.h"
13d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "SkStream.h"
14d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
15d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger//The following macros can be defined to affect the MD5 code generated.
16d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger//SK_MD5_CLEAR_DATA causes all intermediate state to be overwritten with 0's.
17d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger//SK_CPU_LENDIAN allows 32 bit <=> 8 bit conversions without copies (if alligned).
18d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger//SK_CPU_FAST_UNALIGNED_ACCESS allows 32 bit <=> 8 bit conversions without copies if SK_CPU_LENDIAN.
19d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
20d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass SkMD5 : SkWStream {
21d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerpublic:
22d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkMD5();
23d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
24d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /** Processes input, adding it to the digest.
25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     *  Note that this treats the buffer as a series of uint8_t values.
26d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger     */
27d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual bool write(const void* buffer, size_t size) SK_OVERRIDE {
28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        update(reinterpret_cast<const uint8_t*>(buffer), size);
29d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        return true;
30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    }
31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /** Processes input, adding it to the digest. Calling this after finish is undefined. */
33d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    void update(const uint8_t* input, size_t length);
34d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
35d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    struct Digest {
36d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        uint8_t data[16];
37d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    };
38d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
39d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    /** Computes and returns the digest. */
40d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    void finish(Digest& digest);
41d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
42d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprivate:
43d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // number of bytes, modulo 2^64
44d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    uint64_t byteCount;
45d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
46d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // state (ABCD)
47d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    uint32_t state[4];
48d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
49d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    // input buffer
50d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    uint8_t buffer[64];
51d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger};
52d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#endif
54