#ifndef _DESHA1_HPP #define _DESHA1_HPP /*------------------------------------------------------------------------- * drawElements C++ Base Library * ----------------------------- * * Copyright 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief SHA1 hash functions *//*--------------------------------------------------------------------*/ #include "deDefs.hpp" #include "deSha1.h" #include #include namespace de { class Sha1 { public: Sha1 (const deSha1& hash) : m_hash(hash) {} static Sha1 parse (const std::string& str); static Sha1 compute (size_t size, const void* data); bool operator== (const Sha1& other) const { return deSha1_equal(&m_hash, &other.m_hash) == DE_TRUE; } bool operator!= (const Sha1& other) const { return !(*this == other); } private: deSha1 m_hash; }; class Sha1Stream { public: Sha1Stream (void); void process (size_t size, const void* data); Sha1 finalize (void); private: deSha1Stream m_stream; }; // Utility functions for building hash from values. // \note This is not same as serializing the values and computing hash from the data. // Some extra care is required when dealing with types that have platform // specific size. // All vectors and strings will include their size in the hash. Following codes // produce different results: // stream << "Hi" << "Hello"; // and // stream << "HiHello"; inline Sha1Stream& operator<< (Sha1Stream& stream, bool b) { const deUint8 value = b ? 1 : 0; stream.process(sizeof(value), &value); return stream; } inline Sha1Stream& operator<< (Sha1Stream& stream, deUint32 value) { const deUint8 data[] = { (deUint8)(0xFFu & (value >> 24)), (deUint8)(0xFFu & (value >> 16)), (deUint8)(0xFFu & (value >> 8)), (deUint8)(0xFFu & (value >> 0)) }; stream.process(sizeof(data), data); return stream; } inline Sha1Stream& operator<< (Sha1Stream& stream, deInt32 value) { return stream << (deUint32)value; } inline Sha1Stream& operator<< (Sha1Stream& stream, deUint64 value) { const deUint8 data[] = { (deUint8)(0xFFull & (value >> 56)), (deUint8)(0xFFull & (value >> 48)), (deUint8)(0xFFull & (value >> 40)), (deUint8)(0xFFull & (value >> 32)), (deUint8)(0xFFull & (value >> 24)), (deUint8)(0xFFull & (value >> 16)), (deUint8)(0xFFull & (value >> 8)), (deUint8)(0xFFull & (value >> 0)) }; stream.process(sizeof(data), data); return stream; } inline Sha1Stream& operator<< (Sha1Stream& stream, deInt64 value) { return stream << (deUint64)value; } template inline Sha1Stream& operator<< (Sha1Stream& stream, const std::vector& values) { stream << (deUint64)values.size(); for (size_t ndx = 0; ndx < values.size(); ndx++) stream << values[ndx]; return stream; } inline Sha1Stream& operator<< (Sha1Stream& stream, const std::string& str) { stream << (deUint64)str.size(); stream.process(str.size(), str.c_str()); return stream; } } // de #endif // _DESHA1_HPP