Shaka Packager SDK
Loading...
Searching...
No Matches
request_signer.cc
1// Copyright 2014 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/base/request_signer.h>
8
9#include <cstddef>
10#include <cstdint>
11#include <memory>
12#include <string>
13#include <utility>
14#include <vector>
15
16#include <absl/log/check.h>
17#include <mbedtls/md.h>
18
19#include <packager/media/base/aes_cryptor.h>
20#include <packager/media/base/aes_encryptor.h>
21#include <packager/media/base/rsa_key.h>
22
23namespace shaka {
24namespace media {
25
26RequestSigner::RequestSigner(const std::string& signer_name)
27 : signer_name_(signer_name) {}
28RequestSigner::~RequestSigner() {}
29
30AesRequestSigner::AesRequestSigner(const std::string& signer_name,
31 std::unique_ptr<AesCbcEncryptor> encryptor)
32 : RequestSigner(signer_name), aes_cbc_encryptor_(std::move(encryptor)) {
33 DCHECK(aes_cbc_encryptor_);
34}
35AesRequestSigner::~AesRequestSigner() {}
36
37AesRequestSigner* AesRequestSigner::CreateSigner(
38 const std::string& signer_name,
39 const std::vector<uint8_t>& aes_key,
40 const std::vector<uint8_t>& iv) {
41 std::unique_ptr<AesCbcEncryptor> encryptor(
42 new AesCbcEncryptor(kPkcs5Padding, AesCryptor::kUseConstantIv));
43 if (!encryptor->InitializeWithIv(aes_key, iv))
44 return NULL;
45 return new AesRequestSigner(signer_name, std::move(encryptor));
46}
47
48bool AesRequestSigner::GenerateSignature(const std::string& message,
49 std::string* signature) {
50 const mbedtls_md_info_t* md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
51 DCHECK(md_info);
52
53 std::string hash(mbedtls_md_get_size(md_info), 0);
54 CHECK_EQ(0,
55 mbedtls_md(md_info, reinterpret_cast<const uint8_t*>(message.data()),
56 message.size(), reinterpret_cast<uint8_t*>(hash.data())));
57
58 return aes_cbc_encryptor_->Crypt(hash, signature);
59}
60
61RsaRequestSigner::RsaRequestSigner(
62 const std::string& signer_name,
63 std::unique_ptr<RsaPrivateKey> rsa_private_key)
64 : RequestSigner(signer_name), rsa_private_key_(std::move(rsa_private_key)) {
65 DCHECK(rsa_private_key_);
66}
67RsaRequestSigner::~RsaRequestSigner() {}
68
70 const std::string& signer_name,
71 const std::string& pkcs1_rsa_key) {
72 std::unique_ptr<RsaPrivateKey> rsa_private_key(
73 RsaPrivateKey::Create(pkcs1_rsa_key));
74 if (!rsa_private_key)
75 return NULL;
76 return new RsaRequestSigner(signer_name, std::move(rsa_private_key));
77}
78
79bool RsaRequestSigner::GenerateSignature(const std::string& message,
80 std::string* signature) {
81 return rsa_private_key_->GenerateSignature(message, signature);
82}
83
84} // namespace media
85} // namespace shaka
AesRequestSigner uses AES-CBC signing.
Abstract class used for signature generation.
static RsaPrivateKey * Create(const std::string &serialized_key)
Definition rsa_key.cc:84
RsaRequestSigner uses RSA-PSS signing.
bool GenerateSignature(const std::string &message, std::string *signature) override
RequestSigner implementation override.
static RsaRequestSigner * CreateSigner(const std::string &signer_name, const std::string &pkcs1_rsa_key)
All the methods that are virtual are virtual for mocking.