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