------------- Add libcurl to media_cas_packager_sdk. libcurl will later be used by a key fetcher to retrieve entitlement key from License Server using a HTTP request. ------------- Add a function named parsehelper to parse DCSL from the key smith response. ------------- Move wv_cas_key_fetcher to media_cas_packager_sdk so partners can use it request entitlement keys from License Server. ------------- Add pkcs7 write method to x509_cert.cc ------------- Update boringssl_repo to latest in master-with-bazel ------------- Add a TsPacket class to media_cas_packager_sdk to allow the construction of a ECM TS packet in the SDK. ------------- Move InsertEcm() from our internal CAS directory to the media_cas_packager_sdk, to be used to build a ECM TS packet by the SDK. ------------- Add METADATA in common folder ------------- Refactoring of certificate verification into DrmRootCertificate. ------------- Extend the default duration of leaf certificates. ------------- Fix moe_test ------------- Add a new method to WvCasEcm to allow partner to create a TS packet carrying the generated ECM. ------------- Change from SHA1 to SHA256 for Cast certificates ------------- Update crypto mode enumeration to match WV ECM document ------------- Fix the way we set the validity dates ------------- Move exported_root/util/status to common/ to prepare for util::Status migration Also added constructor/operator to copy from/to util::Status. ------------- Add GenerateDCSLrequest function to certificate_util.h. ------------- Fix build break ------------- Allow 'table_id' (in the section header) be specified by caller of SDK method WvCasEcm::GenerateTsPacket(). ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=224535399
157 lines
5.5 KiB
C++
157 lines
5.5 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright 2016 Google LLC.
|
|
//
|
|
// This software is licensed under the terms defined in the Widevine Master
|
|
// License Agreement. For a copy of this agreement, please contact
|
|
// widevine-licensing@google.com.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Description:
|
|
// Declaration of classes representing RSA private and public keys used
|
|
// for message signing, signature verification, encryption and decryption.
|
|
|
|
#ifndef COMMON_RSA_KEY_H_
|
|
#define COMMON_RSA_KEY_H_
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include <cstdint>
|
|
#include "base/macros.h"
|
|
#include "openssl/rsa.h"
|
|
|
|
namespace widevine {
|
|
|
|
class RsaPublicKey;
|
|
|
|
class RsaPrivateKey {
|
|
public:
|
|
explicit RsaPrivateKey(RSA* key);
|
|
RsaPrivateKey(const RsaPrivateKey&);
|
|
virtual ~RsaPrivateKey();
|
|
|
|
// Create an RsaPrivateKey object using a DER encoded PKCS#1 RSAPrivateKey.
|
|
// Returns NULL on failure.
|
|
static RsaPrivateKey* Create(const std::string& serialized_key);
|
|
|
|
// Decrypt a message using RSA-OAEP. Caller retains ownership of all
|
|
// parameters. Returns true if successful, false otherwise.
|
|
virtual bool Decrypt(const std::string& encrypted_message,
|
|
std::string* decrypted_message) const;
|
|
|
|
// Generate RSSASSA-PSS signature. Caller retains ownership of all parameters.
|
|
// Returns true if successful, false otherwise.
|
|
virtual bool GenerateSignature(const std::string& message,
|
|
std::string* signature) const;
|
|
|
|
// Generate SHA256 digest, PKCS#7 padded signature. Caller retains ownership
|
|
// of all parameters. Returns true if successful, false otherwise.
|
|
virtual bool GenerateSignatureSha256Pkcs7(const std::string& message,
|
|
std::string* signature) const;
|
|
|
|
// Return true if the underlying key matches with |private_key|.
|
|
virtual bool MatchesPrivateKey(const RsaPrivateKey& private_key) const;
|
|
|
|
// Return true if the underlying key is a public-private key pair with
|
|
// |public_key|.
|
|
virtual bool MatchesPublicKey(const RsaPublicKey& public_key) const;
|
|
|
|
// Returns the RSA key size (modulus) in bytes.
|
|
virtual uint32_t KeySize() const;
|
|
|
|
private:
|
|
friend class RsaPublicKey;
|
|
friend class X509CertificateBuilder; // TODO(user): Get rid of this.
|
|
|
|
const RSA* key() const { return key_; }
|
|
|
|
RSA* key_;
|
|
|
|
// SWIG appears to think this declaration is a syntax error. Excluding it for
|
|
// python SWIG wrapping.
|
|
#ifndef SWIG
|
|
// Disallow assignment operator.
|
|
RsaPrivateKey& operator=(const RsaPrivateKey&) = delete;
|
|
#endif // SWIG
|
|
};
|
|
|
|
class RsaPublicKey {
|
|
public:
|
|
explicit RsaPublicKey(RSA* key);
|
|
RsaPublicKey(const RsaPublicKey&);
|
|
virtual ~RsaPublicKey();
|
|
|
|
// Create an RsaPublicKey object using a DER encoded PKCS#1 RSAPublicKey.
|
|
// Returns NULL on failure.
|
|
static RsaPublicKey* Create(const std::string& serialized_key);
|
|
|
|
// Encrypt a message using RSA-OAEP. Caller retains ownership of all
|
|
// parameters. Returns true if successful, false otherwise.
|
|
virtual bool Encrypt(const std::string& clear_message,
|
|
std::string* encrypted_message) const;
|
|
|
|
// Verify RSSASSA-PSS signature. Caller retains ownership of all parameters.
|
|
// Returns true if validation succeeds, false otherwise.
|
|
virtual bool VerifySignature(const std::string& message,
|
|
const std::string& signature) const;
|
|
|
|
// Verify a signature. This method takes two parameters: |message| which is a
|
|
// std::string containing the data which was signed, and |signature| which is a
|
|
// std::string containing the message SHA256 digest signature with PKCS#7
|
|
// padding. Returns true if verification succeeds, false otherwise.
|
|
virtual bool VerifySignatureSha256Pkcs7(const std::string& message,
|
|
const std::string& signature) const;
|
|
|
|
// Return true if the underlying key is a public-private key pair with
|
|
// |private_key|.
|
|
virtual bool MatchesPrivateKey(const RsaPrivateKey& private_key) const;
|
|
|
|
// Return true if the underlying key matches with |public_key|.
|
|
virtual bool MatchesPublicKey(const RsaPublicKey& public_key) const;
|
|
|
|
// Returns the RSA key size (modulus) in bytes.
|
|
virtual uint32_t KeySize() const;
|
|
|
|
private:
|
|
friend class RsaPrivateKey;
|
|
friend class X509CertificateBuilder; // TODO(user): Get rid of this.
|
|
|
|
const RSA* key() const { return key_; }
|
|
|
|
RSA* key_;
|
|
|
|
// SWIG appears to think this declaration is a syntax error. Excluding it for
|
|
// python SWIG wrapping.
|
|
#ifndef SWIG
|
|
// Disallow assignment operator.
|
|
RsaPublicKey& operator=(const RsaPublicKey&) = delete;
|
|
#endif // SWIG
|
|
};
|
|
|
|
class RsaKeyFactory {
|
|
public:
|
|
RsaKeyFactory();
|
|
virtual ~RsaKeyFactory();
|
|
|
|
// Create an RsaPrivateKey object using a DER encoded PKCS#1 RSAPrivateKey.
|
|
virtual std::unique_ptr<RsaPrivateKey> CreateFromPkcs1PrivateKey(
|
|
const std::string& private_key) const;
|
|
|
|
// Create a PKCS#1 RsaPrivateKey object using an PKCS#8 PrivateKeyInfo or
|
|
// EncryptedPrivateKeyInfo (if |private_key_passprhase| is not empty).
|
|
virtual std::unique_ptr<RsaPrivateKey> CreateFromPkcs8PrivateKey(
|
|
const std::string& private_key, const std::string& private_key_passphrase) const;
|
|
|
|
// Create an RsaPublicKey object using a DER encoded PKCS#1 RSAPublicKey.
|
|
virtual std::unique_ptr<RsaPublicKey> CreateFromPkcs1PublicKey(
|
|
const std::string& public_key) const;
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(RsaKeyFactory);
|
|
};
|
|
|
|
} // namespace widevine
|
|
|
|
#endif // COMMON_RSA_KEY_H_
|