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