xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deSha1.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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