00001
00002
00003
00004 #include <openssl/hmac.h>
00005 #include <openssl/evp.h>
00006
00007 #include <sstream>
00008
00009 #include "DigestRequest.h"
00010 #include "Credentials.h"
00011 #include "Base64.h"
00012
00013 using namespace Yosokumo;
00014
00015 std::string DigestRequest::makeDigest(
00016 const std::string &message,
00017 const std::vector<uint8_t> &key)
00018 throw(ServiceException)
00019 {
00020 if (key.size() != Credentials::KEY_LEN)
00021 {
00022 std::stringstream s;
00023 s << "Invalid key length (" << key.size() << ") for making digest";
00024 throw ServiceException(s.str());
00025 }
00026
00027
00028
00029 unsigned char digest[EVP_MAX_MD_SIZE];
00030 unsigned digest_size;
00031
00032 HMAC
00033 (
00034 EVP_sha512(),
00035 (void*) &key[0],
00036 Credentials::KEY_LEN,
00037 (unsigned char*) message.c_str(),
00038 message.size(),
00039 digest,
00040 &digest_size
00041 );
00042
00043 std::vector<uint8_t> digest_vec;
00044 for (unsigned i = 0; i < digest_size; ++i)
00045 digest_vec.push_back(digest[i]);
00046
00047 std::string request;
00048 Base64::encodeBytes(digest_vec, request);
00049
00050 if (request.size() != ENCODED_LEN)
00051 {
00052 std::stringstream s;
00053 s << "Invalid encoded digest length (" << request.size() << ")";
00054 throw ServiceException(s.str());
00055 }
00056
00057 return request;
00058
00059 }
00060
00061
00062