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