17c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Copyright 2012 Google Inc. All Rights Reserved. 27c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 37c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Licensed under the Apache License, Version 2.0 (the "License"); 47c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// you may not use this file except in compliance with the License. 57c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// You may obtain a copy of the License at 67c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 77c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// http://www.apache.org/licenses/LICENSE-2.0 87c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 97c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Unless required by applicable law or agreed to in writing, software 107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// distributed under the License is distributed on an "AS IS" BASIS, 117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// See the License for the specific language governing permissions and 137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// limitations under the License. 147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#ifndef POLO_UTIL_POLOUTIL_H_ 167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#define POLO_UTIL_POLOUTIL_H_ 177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <openssl/ssl.h> 197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <stdint.h> 207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <string> 217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <vector> 227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetnamespace polo { 247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetnamespace util { 257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Utilites used for the Polo protocol. 277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetclass PoloUtil { 287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet public: 297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts an array of big-endian bytes to a hex string. 307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param bytes an array of big-endian bytes 317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param length the length of the given byte array 327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @return a hex string representing the given byte array 337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet static const std::string BytesToHexString(const uint8_t* bytes, 347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet size_t length); 357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts a hex string to an array of big-endian bytes. A new byte array 377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // is created at the given bytes pointer, and the number of bytes is returned. 387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // The byte array must be freed using: delete[] bytes. 397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param hex_string the hex string to convert 407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param bytes pointer to a byte array that will be created with the 417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // big-endian result 427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @return the number of bytes in the resulting byte array 437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet static const size_t HexStringToBytes(const std::string hex_string, 447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet uint8_t*& bytes); 457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts an integer value to a big-endian array of bytes. A new byte array 477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // is created at the given bytes pointer. There are always 4 bytes in the 487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // array. The byte array must be freed using: delete[] bytes. 497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param value the integer value to convert 507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param bytes pointer to a byte array that will be created with the 4-byte 517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // big-endian array 527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet static const void IntToBigEndianBytes(uint32_t value, 537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet uint8_t*& bytes); 547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts a big-endian array of bytes to an unsigned-integer. The given byte 567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // array must contain 4 bytes. 577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param bytes a big-endian array of bytes 587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @return the unsigned integer representation of the given byte array 597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet static const uint32_t BigEndianBytesToInt(const uint8_t* bytes); 607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Generates a random array of bytes with the given length. NULL is returned 627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // if a random number could not be generated. The returned array must be freed 637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // using: delete[] bytes. 647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param length the number of random bytes to generate 657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @return an array of random bytes of the given length 667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet static uint8_t* GenerateRandomBytes(size_t length); 677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet}; 687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet} // namespace util 707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet} // namespace polo 717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#endif // POLO_UTIL_POLOUTIL_H_ 73