1// Copyright 2012 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef POLO_UTIL_POLOUTIL_H_
16#define POLO_UTIL_POLOUTIL_H_
17
18#include <openssl/ssl.h>
19#include <stdint.h>
20#include <string>
21#include <vector>
22
23namespace polo {
24namespace util {
25
26// Utilites used for the Polo protocol.
27class PoloUtil {
28 public:
29  // Converts an array of big-endian bytes to a hex string.
30  // @param bytes an array of big-endian bytes
31  // @param length the length of the given byte array
32  // @return a hex string representing the given byte array
33  static const std::string BytesToHexString(const uint8_t* bytes,
34                                            size_t length);
35
36  // Converts a hex string to an array of big-endian bytes. A new byte array
37  // is created at the given bytes pointer, and the number of bytes is returned.
38  // The byte array must be freed using: delete[] bytes.
39  // @param hex_string the hex string to convert
40  // @param bytes pointer to a byte array that will be created with the
41  //              big-endian result
42  // @return the number of bytes in the resulting byte array
43  static const size_t HexStringToBytes(const std::string hex_string,
44                                       uint8_t*& bytes);
45
46  // Converts an integer value to a big-endian array of bytes. A new byte array
47  // is created at the given bytes pointer. There are always 4 bytes in the
48  // array. The byte array must be freed using: delete[] bytes.
49  // @param value the integer value to convert
50  // @param bytes pointer to a byte array that will be created with the 4-byte
51  //              big-endian array
52  static const void IntToBigEndianBytes(uint32_t value,
53                                        uint8_t*& bytes);
54
55  // Converts a big-endian array of bytes to an unsigned-integer. The given byte
56  // array must contain 4 bytes.
57  // @param bytes a big-endian array of bytes
58  // @return the unsigned integer representation of the given byte array
59  static const uint32_t BigEndianBytesToInt(const uint8_t* bytes);
60
61  // Generates a random array of bytes with the given length. NULL is returned
62  // if a random number could not be generated. The returned array must be freed
63  // using: delete[] bytes.
64  // @param length the number of random bytes to generate
65  // @return an array of random bytes of the given length
66  static uint8_t* GenerateRandomBytes(size_t length);
67};
68
69}  // namespace util
70}  // namespace polo
71
72#endif  // POLO_UTIL_POLOUTIL_H_
73