1e5c31af7Sopenharmony_ci#ifndef _DESHA1_HPP 2e5c31af7Sopenharmony_ci#define _DESHA1_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * drawElements C++ Base Library 5e5c31af7Sopenharmony_ci * ----------------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright 2015 The Android Open Source Project 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief SHA1 hash functions 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "deDefs.hpp" 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_ci#include "deSha1.h" 29e5c31af7Sopenharmony_ci 30e5c31af7Sopenharmony_ci#include <string> 31e5c31af7Sopenharmony_ci#include <vector> 32e5c31af7Sopenharmony_ci 33e5c31af7Sopenharmony_cinamespace de 34e5c31af7Sopenharmony_ci{ 35e5c31af7Sopenharmony_ci 36e5c31af7Sopenharmony_ciclass Sha1 37e5c31af7Sopenharmony_ci{ 38e5c31af7Sopenharmony_cipublic: 39e5c31af7Sopenharmony_ci Sha1 (const deSha1& hash) : m_hash(hash) {} 40e5c31af7Sopenharmony_ci 41e5c31af7Sopenharmony_ci static Sha1 parse (const std::string& str); 42e5c31af7Sopenharmony_ci static Sha1 compute (size_t size, const void* data); 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ci bool operator== (const Sha1& other) const { return deSha1_equal(&m_hash, &other.m_hash) == DE_TRUE; } 45e5c31af7Sopenharmony_ci bool operator!= (const Sha1& other) const { return !(*this == other); } 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_ciprivate: 48e5c31af7Sopenharmony_ci deSha1 m_hash; 49e5c31af7Sopenharmony_ci}; 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ciclass Sha1Stream 52e5c31af7Sopenharmony_ci{ 53e5c31af7Sopenharmony_cipublic: 54e5c31af7Sopenharmony_ci Sha1Stream (void); 55e5c31af7Sopenharmony_ci void process (size_t size, const void* data); 56e5c31af7Sopenharmony_ci Sha1 finalize (void); 57e5c31af7Sopenharmony_ci 58e5c31af7Sopenharmony_ciprivate: 59e5c31af7Sopenharmony_ci deSha1Stream m_stream; 60e5c31af7Sopenharmony_ci}; 61e5c31af7Sopenharmony_ci 62e5c31af7Sopenharmony_ci// Utility functions for building hash from values. 63e5c31af7Sopenharmony_ci// \note This is not same as serializing the values and computing hash from the data. 64e5c31af7Sopenharmony_ci// Some extra care is required when dealing with types that have platform 65e5c31af7Sopenharmony_ci// specific size. 66e5c31af7Sopenharmony_ci// All vectors and strings will include their size in the hash. Following codes 67e5c31af7Sopenharmony_ci// produce different results: 68e5c31af7Sopenharmony_ci// stream << "Hi" << "Hello"; 69e5c31af7Sopenharmony_ci// and 70e5c31af7Sopenharmony_ci// stream << "HiHello"; 71e5c31af7Sopenharmony_ci 72e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, bool b) 73e5c31af7Sopenharmony_ci{ 74e5c31af7Sopenharmony_ci const deUint8 value = b ? 1 : 0; 75e5c31af7Sopenharmony_ci stream.process(sizeof(value), &value); 76e5c31af7Sopenharmony_ci return stream; 77e5c31af7Sopenharmony_ci} 78e5c31af7Sopenharmony_ci 79e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, deUint32 value) 80e5c31af7Sopenharmony_ci{ 81e5c31af7Sopenharmony_ci const deUint8 data[] = 82e5c31af7Sopenharmony_ci { 83e5c31af7Sopenharmony_ci (deUint8)(0xFFu & (value >> 24)), 84e5c31af7Sopenharmony_ci (deUint8)(0xFFu & (value >> 16)), 85e5c31af7Sopenharmony_ci (deUint8)(0xFFu & (value >> 8)), 86e5c31af7Sopenharmony_ci (deUint8)(0xFFu & (value >> 0)) 87e5c31af7Sopenharmony_ci }; 88e5c31af7Sopenharmony_ci 89e5c31af7Sopenharmony_ci stream.process(sizeof(data), data); 90e5c31af7Sopenharmony_ci return stream; 91e5c31af7Sopenharmony_ci} 92e5c31af7Sopenharmony_ci 93e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, deInt32 value) 94e5c31af7Sopenharmony_ci{ 95e5c31af7Sopenharmony_ci return stream << (deUint32)value; 96e5c31af7Sopenharmony_ci} 97e5c31af7Sopenharmony_ci 98e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, deUint64 value) 99e5c31af7Sopenharmony_ci{ 100e5c31af7Sopenharmony_ci const deUint8 data[] = 101e5c31af7Sopenharmony_ci { 102e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 56)), 103e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 48)), 104e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 40)), 105e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 32)), 106e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 24)), 107e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 16)), 108e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 8)), 109e5c31af7Sopenharmony_ci (deUint8)(0xFFull & (value >> 0)) 110e5c31af7Sopenharmony_ci }; 111e5c31af7Sopenharmony_ci 112e5c31af7Sopenharmony_ci stream.process(sizeof(data), data); 113e5c31af7Sopenharmony_ci return stream; 114e5c31af7Sopenharmony_ci} 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, deInt64 value) 117e5c31af7Sopenharmony_ci{ 118e5c31af7Sopenharmony_ci return stream << (deUint64)value; 119e5c31af7Sopenharmony_ci} 120e5c31af7Sopenharmony_ci 121e5c31af7Sopenharmony_citemplate<typename T> 122e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, const std::vector<T>& values) 123e5c31af7Sopenharmony_ci{ 124e5c31af7Sopenharmony_ci stream << (deUint64)values.size(); 125e5c31af7Sopenharmony_ci 126e5c31af7Sopenharmony_ci for (size_t ndx = 0; ndx < values.size(); ndx++) 127e5c31af7Sopenharmony_ci stream << values[ndx]; 128e5c31af7Sopenharmony_ci 129e5c31af7Sopenharmony_ci return stream; 130e5c31af7Sopenharmony_ci} 131e5c31af7Sopenharmony_ci 132e5c31af7Sopenharmony_ciinline Sha1Stream& operator<< (Sha1Stream& stream, const std::string& str) 133e5c31af7Sopenharmony_ci{ 134e5c31af7Sopenharmony_ci stream << (deUint64)str.size(); 135e5c31af7Sopenharmony_ci stream.process(str.size(), str.c_str()); 136e5c31af7Sopenharmony_ci return stream; 137e5c31af7Sopenharmony_ci} 138e5c31af7Sopenharmony_ci 139e5c31af7Sopenharmony_ci} // de 140e5c31af7Sopenharmony_ci 141e5c31af7Sopenharmony_ci#endif // _DESHA1_HPP 142