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