diff --git a/BUILD b/BUILD index 1575231..ac71288 100644 --- a/BUILD +++ b/BUILD @@ -15,6 +15,7 @@ pkg_tar( strip_prefix = "/", files = [ "//media_cas_packager_sdk/public:binary_release_files", + "//media_cas_packager_sdk/example:binary_release_files", ], mode = "0644", ) diff --git a/common/BUILD b/common/BUILD index 5b086ac..28b097e 100644 --- a/common/BUILD +++ b/common/BUILD @@ -1,16 +1,16 @@ ################################################################################ -# Copyright 2016 Google LLC. +# Copyright 2017 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: -# Build file for code common to multiple Widevine services. +# Constants, data structures, util classes for Widevine libraries. -package(default_visibility = ["//visibility:public"]) +package( + default_visibility = ["//visibility:public"], +) filegroup( name = "binary_release_files", @@ -19,6 +19,13 @@ filegroup( ], ) +cc_library( + name = "widevine_system_id", + srcs = ["widevine_system_id.cc"], + hdrs = ["widevine_system_id.h"], + deps = ["//base"], +) + cc_library( name = "certificate_type", hdrs = ["certificate_type.h"], @@ -48,10 +55,10 @@ cc_test( srcs = ["drm_root_certificate_test.cc"], deps = [ ":drm_root_certificate", + ":rsa_key", + ":rsa_test_keys", "//base", "//testing:gunit_main", - "//common:rsa_key", - "//common:rsa_test_keys", "//protos/public:drm_certificate_proto", "//protos/public:errors_proto", "//protos/public:signed_drm_certificate_proto", @@ -64,9 +71,12 @@ cc_library( hdrs = ["certificate_util.h"], deps = [ ":certificate_type", + ":drm_root_certificate", ":drm_service_certificate", ":verified_media_pipeline", ":vmp_checker", + "//base", + "//util:status", "//license_server_sdk/internal:sdk", ], ) @@ -105,6 +115,7 @@ cc_test( deps = [ ":rsa_test_keys", ":rsa_util", + "//base", "//testing:gunit", "//testing:gunit_main", "//external:openssl", @@ -139,6 +150,7 @@ cc_test( deps = [ ":rsa_key", ":rsa_test_keys", + ":rsa_util", "//testing:gunit", "//testing:gunit_main", ], @@ -320,6 +332,7 @@ cc_test( size = "small", srcs = ["signing_key_util_test.cc"], deps = [ + ":crypto_util", ":signing_key_util", "//testing:gunit", "//testing:gunit_main", @@ -519,9 +532,10 @@ cc_library( deps = [ ":certificate_type", ":error_space", + ":rsa_key", ":x509_cert", "//base", - "@abseil_repo//absl/strings", + "//util:status", "//protos/public:errors_proto", "//protos/public:verified_media_pipeline_proto", ], @@ -561,4 +575,3 @@ cc_test( "//testing:gunit_main", ], ) - diff --git a/common/aes_cbc_util_test.cc b/common/aes_cbc_util_test.cc index b6b7ba9..1eded76 100644 --- a/common/aes_cbc_util_test.cc +++ b/common/aes_cbc_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/aes_cbc_util.h" - #include "testing/gmock.h" #include "testing/gunit.h" diff --git a/common/certificate_util.cc b/common/certificate_util.cc index ad5c312..356ff69 100644 --- a/common/certificate_util.cc +++ b/common/certificate_util.cc @@ -8,6 +8,7 @@ #include "common/certificate_util.h" +#include "common/certificate_type.h" #include "common/drm_root_certificate.h" #include "common/drm_service_certificate.h" #include "common/verified_media_pipeline.h" diff --git a/common/client_id_util.h b/common/client_id_util.h index fc998bd..1f0e8b1 100644 --- a/common/client_id_util.h +++ b/common/client_id_util.h @@ -45,8 +45,8 @@ std::string GetClientInfo(const ClientIdentification& client_id, // |client_id| is owned by caller. // Returns util::Status::OK, if successful, else an error. util::Status DecryptEncryptedClientIdentification( - const EncryptedClientIdentification& encrypted_client_id, - ClientIdentification* client_id); + const EncryptedClientIdentification& encrypted_client_id, + ClientIdentification* client_id); // Decrypts the encrypted client identification in |encrypted_client_id| into // |client_id| using |privacy_key|. diff --git a/common/crypto_util.cc b/common/crypto_util.cc index 785e95f..48cc37e 100644 --- a/common/crypto_util.cc +++ b/common/crypto_util.cc @@ -10,14 +10,13 @@ #include "common/crypto_util.h" -#include -#include - #include "glog/logging.h" #include "absl/strings/string_view.h" #include "openssl/aes.h" #include "openssl/cmac.h" #include "openssl/evp.h" +#include "openssl/hmac.h" +#include "openssl/sha.h" #include "util/endian/endian.h" namespace widevine { diff --git a/common/crypto_util_test.cc b/common/crypto_util_test.cc index c6ade77..7445bbd 100644 --- a/common/crypto_util_test.cc +++ b/common/crypto_util_test.cc @@ -8,8 +8,6 @@ // Unit tests for the crypto_util helper functions. -#include "common/crypto_util.h" - #include #include "testing/gmock.h" @@ -17,6 +15,7 @@ #include "absl/strings/escaping.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" +#include "common/crypto_util.h" namespace widevine { namespace crypto_util { diff --git a/common/drm_root_certificate.cc b/common/drm_root_certificate.cc index bd5eb43..dc42f66 100644 --- a/common/drm_root_certificate.cc +++ b/common/drm_root_certificate.cc @@ -13,6 +13,7 @@ #include "glog/logging.h" #include "absl/strings/escaping.h" #include "openssl/sha.h" +#include "common/certificate_type.h" #include "common/error_space.h" #include "common/rsa_key.h" #include "protos/public/drm_certificate.pb.h" diff --git a/common/drm_root_certificate.h b/common/drm_root_certificate.h index d700cec..fdea567 100644 --- a/common/drm_root_certificate.h +++ b/common/drm_root_certificate.h @@ -10,8 +10,8 @@ // Root device certificate holder class which deserializes, validates, // and extracts the root certificate public key. -#ifndef COMMON_DRM_ROOT_CERTIFICATE_H__ -#define COMMON_DRM_ROOT_CERTIFICATE_H__ +#ifndef COMMON_DRM_ROOT_CERTIFICATE_H_ +#define COMMON_DRM_ROOT_CERTIFICATE_H_ #include #include @@ -63,4 +63,4 @@ class DrmRootCertificate { } // namespace widevine -#endif // COMMON_DRM_ROOT_CERTIFICATE_H__ +#endif // COMMON_DRM_ROOT_CERTIFICATE_H_ diff --git a/common/drm_root_certificate_test.cc b/common/drm_root_certificate_test.cc index 498d91e..f5029d9 100644 --- a/common/drm_root_certificate_test.cc +++ b/common/drm_root_certificate_test.cc @@ -9,11 +9,10 @@ // Description: // Unit tests for drm_root_certificate.cc -#include "common/drm_root_certificate.h" - #include #include "testing/gunit.h" +#include "common/drm_root_certificate.h" #include "common/rsa_key.h" #include "common/rsa_test_keys.h" #include "protos/public/drm_certificate.pb.h" diff --git a/common/drm_service_certificate.cc b/common/drm_service_certificate.cc index 4a3dc94..75c0047 100644 --- a/common/drm_service_certificate.cc +++ b/common/drm_service_certificate.cc @@ -18,6 +18,7 @@ #include "absl/synchronization/mutex.h" #include "util/gtl/map_util.h" #include "common/aes_cbc_util.h" +#include "common/certificate_type.h" #include "common/drm_root_certificate.h" #include "common/error_space.h" #include "common/rsa_util.h" @@ -299,6 +300,32 @@ void DrmServiceCertificate::ResetServiceCertificates() { DrmServiceCertificateMap::GetInstance()->Reset(); } +util::Status DrmServiceCertificate::ValidateDrmServiceCertificate() { + const DrmServiceCertificate* service_certificate = + GetDefaultDrmServiceCertificate(); + if (!service_certificate) { + return util::Status(error_space, SERVICE_CERTIFICATE_NOT_FOUND, + "drm service certificate is not found."); + } + SignedDrmCertificate signed_cert; + if (!signed_cert.ParseFromString(service_certificate->certificate())) { + return util::Status(error_space, INVALID_DRM_CERTIFICATE, + "signed drm service certificate is failed to parse."); + } + DrmCertificate drm_cert; + if (!drm_cert.ParseFromString(signed_cert.drm_certificate())) { + return util::Status(error_space, INVALID_DRM_CERTIFICATE, + "Drm service certificate is failed to parse."); + } + if (!drm_cert.has_creation_time_seconds()) { + return util::Status(error_space, INVALID_SERVICE_CERTIFICATE, + "missing certificate creation time"); + } + // TODO(user): Check creation_time_seconds field in DrmCertificate and also + // export the absl/time dependency through moe. + return util::OkStatus(); +} + DrmServiceCertificate::DrmServiceCertificate( const std::string& service_certificate, const std::string& provider_id, const std::string& serial_number, const uint32_t creation_time_seconds, diff --git a/common/drm_service_certificate.h b/common/drm_service_certificate.h index f1fc7e1..88a2161 100644 --- a/common/drm_service_certificate.h +++ b/common/drm_service_certificate.h @@ -9,8 +9,8 @@ // Description: // Service certificate holder used to decrypt encrypted client credentials. -#ifndef COMMON_DRM_SERVICE_CERTIFICATE_H__ -#define COMMON_DRM_SERVICE_CERTIFICATE_H__ +#ifndef COMMON_DRM_SERVICE_CERTIFICATE_H_ +#define COMMON_DRM_SERVICE_CERTIFICATE_H_ #include #include @@ -86,6 +86,12 @@ class DrmServiceCertificate { const RsaPrivateKey* const private_key() const { return private_key_.get(); } const RsaPublicKey* const public_key() const { return public_key_.get(); } + // Returns the validation result of drm service certificate. Returns + // status::OK if successful, or in case of error, contact + // widevine-tam@google.com to get the next valid service certificate renewed + // via get deviceCertificate StatusList. + static util::Status ValidateDrmServiceCertificate(); + private: friend class DrmServiceCertificateTest; friend class widevine::RequestInspectorTest; @@ -120,4 +126,4 @@ class DrmServiceCertificate { } // namespace widevine -#endif // COMMON_DRM_SERVICE_CERTIFICATE_H__ +#endif // COMMON_DRM_SERVICE_CERTIFICATE_H_ diff --git a/common/drm_service_certificate_test.cc b/common/drm_service_certificate_test.cc index 789ef39..fbd02bb 100644 --- a/common/drm_service_certificate_test.cc +++ b/common/drm_service_certificate_test.cc @@ -6,8 +6,6 @@ // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// -#include "common/drm_service_certificate.h" - #include #include "glog/logging.h" @@ -16,6 +14,7 @@ #include "testing/gunit.h" #include "absl/strings/escaping.h" #include "common/aes_cbc_util.h" +#include "common/drm_service_certificate.h" #include "common/rsa_key.h" #include "common/rsa_test_keys.h" #include "common/rsa_util.h" diff --git a/common/ecb_util.cc b/common/ecb_util.cc index e6de1a5..de7377d 100644 --- a/common/ecb_util.cc +++ b/common/ecb_util.cc @@ -80,7 +80,7 @@ bool EncryptAesEcb(absl::string_view key, absl::string_view src, std::string* ds } dst->resize(src.size()); for (int i = 0; i < src.size(); i += AES_BLOCK_SIZE) { - AES_encrypt(reinterpret_cast(src.data()+i), + AES_encrypt(reinterpret_cast(src.data() + i), reinterpret_cast(&(*dst)[i]), &aes_key); } return true; @@ -103,7 +103,7 @@ bool DecryptAesEcb(absl::string_view key, absl::string_view src, std::string* ds } dst->resize(src.size()); for (int i = 0; i < src.size(); i += AES_BLOCK_SIZE) { - AES_decrypt(reinterpret_cast(src.data()+i), + AES_decrypt(reinterpret_cast(src.data() + i), reinterpret_cast(&(*dst)[i]), &aes_key); } return true; diff --git a/common/file_util.cc b/common/file_util.cc index eb961d3..49147f4 100644 --- a/common/file_util.cc +++ b/common/file_util.cc @@ -39,7 +39,7 @@ bool GetContents(const std::string& file_name, std::string* contents) { LOG(WARNING) << "Failed to read all file contents."; return false; } - return true;; + return true; } bool SetContents(const std::string& file_name, const std::string& contents) { diff --git a/common/file_util_test.cc b/common/file_util_test.cc index 8d31cac..33399c9 100644 --- a/common/file_util_test.cc +++ b/common/file_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/file_util.h" - #include "testing/gunit.h" #include "absl/strings/str_cat.h" diff --git a/common/mock_rsa_key.h b/common/mock_rsa_key.h index 62ddead..dd8fa9a 100644 --- a/common/mock_rsa_key.h +++ b/common/mock_rsa_key.h @@ -39,8 +39,8 @@ class MockRsaPublicKey : public RsaPublicKey { MOCK_CONST_METHOD2(Encrypt, bool(const std::string& clear_message, std::string* encrypted_message)); - MOCK_CONST_METHOD2(VerifySignature, bool(const std::string& message, - const std::string& signature)); + MOCK_CONST_METHOD2(VerifySignature, + bool(const std::string& message, const std::string& signature)); MOCK_CONST_METHOD1(MatchesPrivateKey, bool(const RsaPrivateKey& private_key)); MOCK_CONST_METHOD1(MatchesPublicKey, bool(const RsaPublicKey& public_key)); @@ -49,7 +49,7 @@ class MockRsaPublicKey : public RsaPublicKey { MockRsaPublicKey& operator=(const MockRsaPublicKey&) = delete; }; -class MockRsaKeyFactory : public RsaKeyFactory{ +class MockRsaKeyFactory : public RsaKeyFactory { public: MockRsaKeyFactory() {} ~MockRsaKeyFactory() override {} diff --git a/common/openssl_util.h b/common/openssl_util.h index 1400a58..b715c8b 100644 --- a/common/openssl_util.h +++ b/common/openssl_util.h @@ -9,8 +9,8 @@ // RAII wrapper classes for cleaning up various OpenSSL dynamically allocated // structures. -#ifndef COMMON_OPENSSL_UTIL_H__ -#define COMMON_OPENSSL_UTIL_H__ +#ifndef COMMON_OPENSSL_UTIL_H_ +#define COMMON_OPENSSL_UTIL_H_ #include "openssl/bio.h" #include "openssl/evp.h" @@ -74,4 +74,4 @@ using ScopedX509InfoStack = ScopedOpenSSLStack; using ScopedX509InfoStackOnly = ScopedOpenSSLStackOnly; -#endif // COMMON_OPENSSL_UTIL_H__ +#endif // COMMON_OPENSSL_UTIL_H_ diff --git a/common/random_util_test.cc b/common/random_util_test.cc index a3cf2b3..1a52d6f 100644 --- a/common/random_util_test.cc +++ b/common/random_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/random_util.h" - #include "testing/gunit.h" namespace widevine { diff --git a/common/remote_attestation_verifier.h b/common/remote_attestation_verifier.h index 379a4d4..4ea7d2c 100644 --- a/common/remote_attestation_verifier.h +++ b/common/remote_attestation_verifier.h @@ -9,8 +9,8 @@ // Description: // Functionality used to verifier ChromeOS remote attestation. -#ifndef COMMON_REMOTE_ATTESTATION_VERIFIER_H__ -#define COMMON_REMOTE_ATTESTATION_VERIFIER_H__ +#ifndef COMMON_REMOTE_ATTESTATION_VERIFIER_H_ +#define COMMON_REMOTE_ATTESTATION_VERIFIER_H_ #include #include @@ -89,4 +89,4 @@ class RemoteAttestationVerifier { } // namespace widevine -#endif // COMMON_REMOTE_ATTESTATION_VERIFIER_H__ +#endif // COMMON_REMOTE_ATTESTATION_VERIFIER_H_ diff --git a/common/rsa_key.h b/common/rsa_key.h index af94c9a..30913a8 100644 --- a/common/rsa_key.h +++ b/common/rsa_key.h @@ -93,7 +93,6 @@ class RsaPublicKey { 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 diff --git a/common/rsa_test_keys.cc b/common/rsa_test_keys.cc index 357bf5d..315ae45 100644 --- a/common/rsa_test_keys.cc +++ b/common/rsa_test_keys.cc @@ -12,1136 +12,775 @@ #include "common/rsa_test_keys.h" - namespace widevine { static const unsigned char kTestRsaPrivateKey1_3072[] = { - 0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x81, 0x00, 0xa5, 0x62, 0x07, 0xdf, - 0xc8, 0x84, 0x74, 0xe1, 0x2a, 0xb7, 0xbb, 0xc0, - 0x78, 0x76, 0xbe, 0x13, 0x3b, 0xe6, 0x2c, 0x09, - 0x9d, 0x35, 0x3f, 0xf3, 0x0f, 0xe9, 0x61, 0x96, - 0x20, 0x53, 0x6e, 0x78, 0x62, 0xe0, 0x10, 0xd2, - 0xca, 0xe4, 0xdd, 0xd5, 0x96, 0xaf, 0x9a, 0xd7, - 0x08, 0x47, 0xe4, 0x55, 0x1b, 0x83, 0xbe, 0x10, - 0x66, 0x74, 0x08, 0xf2, 0x49, 0x79, 0xea, 0x29, - 0x46, 0xc2, 0x65, 0x97, 0xa6, 0xcc, 0x4b, 0xa4, - 0x08, 0xc3, 0x04, 0x17, 0x01, 0xb5, 0x11, 0x53, - 0xe9, 0x68, 0x34, 0x3c, 0x26, 0x56, 0x44, 0x37, - 0x5c, 0xb4, 0x7a, 0x1d, 0x5d, 0x6c, 0x58, 0xc2, - 0x82, 0xa0, 0x92, 0xf1, 0x14, 0xf1, 0x22, 0xff, - 0x64, 0xde, 0xdf, 0xb3, 0x3d, 0x9d, 0xa5, 0x86, - 0xcd, 0xa0, 0x0a, 0x63, 0x08, 0xdd, 0x60, 0x5d, - 0xfd, 0xa4, 0x01, 0xe3, 0xb6, 0x0e, 0x85, 0xe4, - 0xc3, 0x37, 0x61, 0xd0, 0xe7, 0x12, 0xe9, 0xc4, - 0xde, 0xf2, 0x59, 0x11, 0xe3, 0x5b, 0x02, 0x9f, - 0x24, 0xb9, 0xb0, 0xbb, 0x31, 0xa0, 0xee, 0x6a, - 0x2c, 0xb4, 0x30, 0xff, 0xe0, 0xf0, 0x93, 0xee, - 0x3a, 0xae, 0xb2, 0x2e, 0x84, 0xa0, 0x47, 0x42, - 0x51, 0xbb, 0xfa, 0xbb, 0x90, 0x97, 0x2c, 0x77, - 0x45, 0xee, 0x2c, 0xfb, 0xec, 0x5d, 0xd8, 0xca, - 0x49, 0x94, 0x53, 0x5d, 0x37, 0xaf, 0x86, 0x47, - 0xda, 0xe2, 0xbd, 0xf0, 0x5f, 0x07, 0x53, 0x8a, - 0x10, 0xd0, 0x9a, 0xd0, 0x7f, 0xe9, 0xef, 0xf6, - 0xda, 0xea, 0x1e, 0x2e, 0x54, 0xec, 0x44, 0xde, - 0x3a, 0xe1, 0xc8, 0xdb, 0x17, 0xe8, 0xc9, 0x3a, - 0x81, 0x11, 0x4d, 0xb7, 0x2d, 0x09, 0x83, 0xab, - 0x30, 0xb7, 0xf5, 0x1b, 0x03, 0x86, 0x21, 0xa9, - 0xf5, 0xca, 0x15, 0x26, 0xaf, 0x39, 0xf3, 0x5d, - 0x01, 0x7d, 0xe3, 0x19, 0x54, 0xd1, 0x2e, 0x10, - 0x16, 0x9c, 0xee, 0xc3, 0xbd, 0xcc, 0xdb, 0x02, - 0x82, 0xd0, 0x60, 0x0b, 0x42, 0x72, 0x85, 0xec, - 0xdc, 0x41, 0x7c, 0xf1, 0x34, 0xd8, 0x27, 0x21, - 0xf9, 0xa6, 0x82, 0x40, 0xd3, 0xc5, 0xc9, 0xf9, - 0x6b, 0xc9, 0x12, 0x64, 0xe4, 0x3a, 0x3b, 0xc9, - 0x8f, 0x3c, 0xd0, 0x2c, 0xb8, 0xb8, 0xf3, 0x05, - 0x4a, 0xe9, 0x4c, 0x46, 0x2b, 0xb6, 0xe1, 0xed, - 0x82, 0xb2, 0xf0, 0xd1, 0x72, 0x71, 0x04, 0x35, - 0x19, 0xc1, 0x16, 0x17, 0xd6, 0x75, 0xe0, 0xab, - 0xde, 0x8f, 0xe1, 0xc1, 0x49, 0x68, 0x0c, 0xc8, - 0xce, 0x6d, 0x87, 0x50, 0x04, 0xb5, 0xd7, 0x24, - 0xf4, 0x2e, 0x0c, 0x11, 0x35, 0xb2, 0x67, 0x85, - 0x1b, 0x38, 0xff, 0x2f, 0x71, 0xf5, 0x30, 0x18, - 0x1e, 0x6f, 0xd7, 0xf0, 0x33, 0x61, 0x53, 0x7e, - 0x55, 0x7f, 0x0d, 0x60, 0x83, 0xf3, 0x8a, 0x2b, - 0x67, 0xd5, 0xf0, 0x2e, 0x23, 0x23, 0x60, 0x0b, - 0x83, 0x9c, 0xc2, 0x87, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x80, 0x5a, 0x09, 0x3f, - 0x9e, 0x2e, 0x4d, 0x26, 0x50, 0x7b, 0x70, 0x21, - 0xb0, 0x0c, 0x25, 0x21, 0x1f, 0xd9, 0x89, 0x5a, - 0xca, 0x35, 0x23, 0x0b, 0x58, 0xa9, 0x7d, 0xf6, - 0x19, 0xc4, 0x29, 0x87, 0xc7, 0xd4, 0x94, 0x85, - 0xb4, 0x2c, 0xaf, 0x62, 0xb1, 0xe8, 0x62, 0x5b, - 0xda, 0xdb, 0x70, 0x40, 0x37, 0xb1, 0x4e, 0x0c, - 0xc8, 0x62, 0xee, 0xa2, 0xfc, 0x3c, 0xd2, 0x39, - 0x90, 0x15, 0x2c, 0xba, 0x20, 0x50, 0xb7, 0x82, - 0x2a, 0xa0, 0x76, 0x83, 0x20, 0x7f, 0x56, 0x73, - 0x43, 0x8a, 0x9b, 0xa7, 0x6c, 0x63, 0xb6, 0xad, - 0x56, 0xb2, 0x8a, 0xb2, 0xbc, 0x8f, 0xe2, 0xef, - 0x83, 0x9d, 0x98, 0x0b, 0xc7, 0x62, 0x0e, 0x51, - 0x6e, 0x57, 0x1d, 0x1b, 0x0e, 0x3a, 0xea, 0x3b, - 0x76, 0x63, 0x35, 0xd0, 0xd1, 0xcf, 0xbe, 0xad, - 0xbb, 0x1d, 0xde, 0x0f, 0x05, 0x48, 0x55, 0x29, - 0xc1, 0xbc, 0x21, 0xc7, 0x87, 0xf2, 0x75, 0x12, - 0x7d, 0x92, 0x9e, 0xbf, 0xad, 0x04, 0x68, 0xc4, - 0xc9, 0x9d, 0x35, 0xd6, 0xa8, 0x62, 0xc1, 0x69, - 0x6a, 0xb6, 0x41, 0xb7, 0x37, 0x66, 0xdf, 0xb2, - 0xb9, 0x8c, 0x8b, 0x15, 0x08, 0x4c, 0x3d, 0xf1, - 0xed, 0x82, 0x0f, 0xe3, 0xd5, 0xff, 0x46, 0xbd, - 0xf7, 0x85, 0x43, 0xc0, 0x8b, 0xba, 0x47, 0xf1, - 0x41, 0x57, 0xc3, 0x7f, 0x8b, 0x0d, 0x48, 0xea, - 0xc2, 0xed, 0xc0, 0x69, 0x84, 0xb6, 0x32, 0x08, - 0x49, 0x74, 0x14, 0x84, 0xa4, 0x1b, 0x48, 0x5b, - 0xec, 0xd3, 0x0b, 0x12, 0x2b, 0x4c, 0x9e, 0x5c, - 0x01, 0x60, 0xad, 0xef, 0xcb, 0x2b, 0x56, 0x84, - 0x07, 0xfa, 0x62, 0xc6, 0x08, 0x92, 0x98, 0x70, - 0xc9, 0x5b, 0x18, 0xc8, 0xfa, 0x27, 0x0c, 0xe2, - 0xbd, 0xfb, 0x3e, 0x43, 0xa5, 0xb7, 0x06, 0x2c, - 0x4e, 0xf1, 0x07, 0x5d, 0x8d, 0xdd, 0x53, 0xc5, - 0x8c, 0x4a, 0xf2, 0x2f, 0x8e, 0x80, 0x96, 0x16, - 0xc0, 0xfc, 0xf9, 0x20, 0x4f, 0x35, 0xc7, 0x53, - 0x8b, 0x2d, 0x37, 0x43, 0x93, 0x3d, 0x74, 0x3f, - 0x63, 0xf7, 0x0b, 0xbd, 0x46, 0xe4, 0x51, 0x67, - 0x33, 0x57, 0x15, 0xf5, 0x59, 0x27, 0x66, 0xe8, - 0xe2, 0x4b, 0xa3, 0x93, 0x03, 0x8a, 0x9c, 0x05, - 0x13, 0xf2, 0xcb, 0xf7, 0x9c, 0x68, 0xe7, 0x16, - 0x4b, 0x8e, 0x59, 0x71, 0x2b, 0x73, 0x9b, 0xb9, - 0xae, 0x50, 0xfa, 0xd7, 0xd3, 0x34, 0x17, 0x1d, - 0x62, 0x88, 0xbd, 0x8c, 0xba, 0x5a, 0x6b, 0x6a, - 0x5e, 0xb3, 0xa5, 0x80, 0xca, 0xbb, 0xb9, 0xb5, - 0xa8, 0x2e, 0xb1, 0x61, 0x6e, 0xd5, 0xd6, 0x62, - 0x98, 0x4a, 0xb0, 0xb8, 0x76, 0xa9, 0x19, 0x5c, - 0xe2, 0xbe, 0xb3, 0x9b, 0x4a, 0x39, 0xf5, 0xe6, - 0xbb, 0x11, 0x6e, 0x13, 0x13, 0x38, 0xb8, 0x1f, - 0x21, 0x19, 0xf5, 0xa7, 0x76, 0x93, 0xb3, 0x56, - 0xfa, 0xcc, 0x74, 0xbc, 0x19, 0x02, 0x81, 0xc1, - 0x00, 0xd1, 0xd1, 0x72, 0x57, 0xe5, 0xb0, 0x1c, - 0x09, 0x05, 0xbb, 0x55, 0x89, 0x3c, 0x4a, 0x81, - 0x90, 0x9a, 0xf9, 0x32, 0x63, 0x41, 0xad, 0x6a, - 0x5f, 0x65, 0x94, 0x92, 0xcc, 0xf7, 0xc7, 0x53, - 0x93, 0xa0, 0xf7, 0xbe, 0x48, 0x82, 0x63, 0x31, - 0x7b, 0xd0, 0x82, 0x09, 0xbb, 0x0a, 0xbc, 0x60, - 0xc9, 0x4d, 0x83, 0xe4, 0x5d, 0x50, 0xe6, 0x5f, - 0x8b, 0x47, 0x07, 0xa3, 0x3a, 0x36, 0x97, 0xaa, - 0x21, 0x70, 0x7f, 0xd5, 0x6c, 0xb0, 0x56, 0xf5, - 0x5c, 0x48, 0x74, 0x2a, 0xdd, 0xfe, 0x94, 0x83, - 0x05, 0xe0, 0x3d, 0x5d, 0xdd, 0x5a, 0x05, 0xcb, - 0x47, 0xd7, 0xf9, 0x89, 0x55, 0xaa, 0x0b, 0x21, - 0xc0, 0x71, 0x5d, 0xe1, 0x4c, 0x6a, 0x45, 0x86, - 0x86, 0xf2, 0xb9, 0x38, 0x6a, 0x56, 0x51, 0x0d, - 0x7d, 0xac, 0x30, 0x31, 0xca, 0x2d, 0xaa, 0xaa, - 0xba, 0xcc, 0x12, 0x40, 0xc1, 0x0d, 0xa6, 0xc1, - 0x7d, 0x22, 0xec, 0xb6, 0x51, 0x45, 0xfe, 0x4e, - 0xbb, 0x4a, 0xd2, 0xba, 0x9b, 0xa2, 0xcc, 0x28, - 0x2b, 0x01, 0x53, 0x53, 0xf3, 0xa9, 0x5a, 0x8f, - 0xeb, 0xb7, 0xb8, 0x62, 0x6b, 0x8a, 0x79, 0x24, - 0xcc, 0x86, 0x34, 0x45, 0xe2, 0xad, 0x1d, 0xd0, - 0x4c, 0xc9, 0x77, 0x2a, 0xf9, 0x1a, 0xe8, 0x58, - 0x78, 0x51, 0x8a, 0xea, 0x3f, 0x90, 0x36, 0x46, - 0x2a, 0xc0, 0x71, 0x41, 0x83, 0x2c, 0x48, 0xee, - 0xc5, 0x02, 0x81, 0xc1, 0x00, 0xc9, 0xc8, 0xce, - 0xc4, 0x50, 0xb2, 0x26, 0xcb, 0x35, 0x78, 0x55, - 0x3c, 0xcc, 0xf0, 0x7e, 0xba, 0xad, 0xeb, 0x58, - 0xe9, 0xb5, 0x78, 0x2f, 0x43, 0x5f, 0x07, 0x47, - 0x56, 0x05, 0x41, 0x38, 0x71, 0xe1, 0x58, 0x62, - 0xb1, 0x8e, 0xbc, 0xf9, 0x80, 0x04, 0x22, 0x39, - 0x22, 0x24, 0x28, 0x86, 0x9c, 0x00, 0x44, 0x5f, - 0xc4, 0x97, 0xe6, 0x71, 0x5f, 0x1f, 0x58, 0xea, - 0x75, 0x18, 0x0c, 0x23, 0x63, 0x09, 0xc5, 0x98, - 0xc4, 0x6d, 0x23, 0xc2, 0x2c, 0x93, 0x6a, 0x26, - 0xe4, 0x3d, 0x8d, 0xa1, 0x39, 0x70, 0x34, 0x25, - 0xcd, 0xbc, 0x82, 0x78, 0x2b, 0xf3, 0x7e, 0x81, - 0xb6, 0x5f, 0xc5, 0x69, 0xd0, 0x81, 0x69, 0x50, - 0x2f, 0x17, 0x0c, 0x17, 0x3c, 0x0b, 0x45, 0x38, - 0xce, 0xe3, 0xbf, 0x8a, 0x50, 0x0a, 0x00, 0x74, - 0x7e, 0x7a, 0xd8, 0x55, 0x52, 0x6b, 0x82, 0xfb, - 0x34, 0x15, 0x73, 0x6a, 0xf4, 0x51, 0x9b, 0x9f, - 0xa0, 0x45, 0xb9, 0x76, 0xe5, 0xd3, 0xd5, 0xf4, - 0xa9, 0xa4, 0xcd, 0x42, 0x2f, 0x29, 0x89, 0xec, - 0x28, 0x5f, 0x03, 0x45, 0x27, 0xaf, 0x8c, 0x39, - 0x3e, 0x59, 0x9d, 0xaf, 0x27, 0x5d, 0x17, 0x53, - 0x17, 0xeb, 0x8d, 0x7f, 0x3d, 0xb8, 0x2a, 0x50, - 0x1e, 0xb5, 0xc5, 0x04, 0xab, 0x9c, 0xa7, 0xaa, - 0x86, 0x41, 0xb9, 0x36, 0x29, 0x9e, 0xd2, 0xd8, - 0xde, 0x5f, 0xde, 0x80, 0xdb, 0x02, 0x81, 0xc0, - 0x03, 0xf3, 0x5f, 0xa5, 0xcc, 0x0b, 0x5e, 0xdb, - 0xc4, 0xa1, 0xdc, 0x60, 0x73, 0x24, 0x2c, 0x00, - 0x5f, 0x0a, 0xa6, 0x2a, 0x3c, 0x48, 0x59, 0xa2, - 0x66, 0x35, 0x3f, 0xf6, 0x60, 0x0b, 0xfe, 0xc4, - 0xde, 0xd9, 0x0b, 0x5a, 0x2e, 0x2a, 0x53, 0xfa, - 0x32, 0xd8, 0xdf, 0xfa, 0x07, 0x9f, 0xb8, 0x6a, - 0xd1, 0xec, 0xd3, 0xd5, 0xf5, 0xfa, 0x00, 0x7e, - 0x8c, 0xdd, 0xd5, 0xf2, 0xf8, 0xa8, 0x2e, 0x69, - 0xe6, 0xc6, 0x61, 0x6c, 0x64, 0x7d, 0x9e, 0xad, - 0x18, 0x28, 0x27, 0xce, 0x7a, 0x46, 0xad, 0x98, - 0xe4, 0xba, 0x03, 0x14, 0x71, 0xe7, 0x7e, 0x06, - 0x62, 0x48, 0xae, 0x8f, 0x50, 0x5e, 0x59, 0x4a, - 0x58, 0x58, 0x1e, 0x2f, 0xe4, 0x28, 0x5e, 0xfa, - 0x17, 0x83, 0xe9, 0x4e, 0x07, 0x46, 0x0b, 0x6c, - 0xfc, 0x5b, 0x03, 0xf4, 0xfc, 0x9b, 0x24, 0x0f, - 0xd4, 0x5b, 0xdb, 0xa0, 0x46, 0xf3, 0x86, 0xdd, - 0x26, 0x55, 0x32, 0xb1, 0xa1, 0x11, 0xc2, 0xc5, - 0xc0, 0x08, 0xeb, 0xbe, 0x96, 0x78, 0x25, 0xa1, - 0x79, 0xaa, 0xe9, 0xff, 0xc2, 0x86, 0x94, 0x03, - 0x2a, 0x38, 0x6c, 0x91, 0xfd, 0xcf, 0x7e, 0x23, - 0xe3, 0xbb, 0x04, 0x3d, 0xda, 0x68, 0x9f, 0x4d, - 0x72, 0xd5, 0xad, 0x97, 0x77, 0x2c, 0x3c, 0xce, - 0x37, 0x2a, 0xd8, 0x72, 0x4d, 0xf2, 0xd7, 0xab, - 0x62, 0x68, 0x3f, 0x85, 0x8a, 0xc5, 0xec, 0xc9, - 0x02, 0x81, 0xc1, 0x00, 0x92, 0x43, 0x0c, 0x1d, - 0x20, 0xa1, 0x01, 0x9d, 0xaa, 0x54, 0x5e, 0xf4, - 0x83, 0x58, 0x8f, 0x83, 0xa1, 0x2d, 0x46, 0x75, - 0xa1, 0x24, 0x4c, 0x9d, 0xf8, 0xf3, 0xbd, 0xb1, - 0x8c, 0x7d, 0x89, 0xfc, 0x81, 0xeb, 0x1f, 0x1e, - 0xb4, 0xe8, 0x25, 0xb1, 0xb5, 0x4d, 0x59, 0x3c, - 0x76, 0x19, 0x29, 0xf9, 0x49, 0xf8, 0x45, 0xb2, - 0xaa, 0xa8, 0x4e, 0xe5, 0x34, 0x43, 0xaf, 0x2e, - 0xd1, 0x0f, 0x7b, 0x56, 0xfe, 0x6e, 0x4c, 0x1d, - 0x95, 0x3e, 0xa6, 0x30, 0xc9, 0x69, 0xd8, 0x66, - 0xf8, 0x77, 0x00, 0xb6, 0x31, 0xae, 0x9a, 0xf8, - 0x55, 0xfb, 0xfc, 0x3f, 0x5f, 0x70, 0x03, 0x75, - 0xbe, 0x55, 0xca, 0x2d, 0x68, 0xa0, 0x7d, 0x8e, - 0xa4, 0x96, 0x0f, 0x01, 0x66, 0xe9, 0xf6, 0x13, - 0x80, 0xe2, 0x05, 0xcf, 0x9e, 0x70, 0x56, 0x00, - 0x97, 0xea, 0xd7, 0x6d, 0xb6, 0xa0, 0x6a, 0x95, - 0x86, 0x36, 0xf2, 0xff, 0xc5, 0x67, 0x98, 0x7d, - 0x04, 0x0d, 0x3b, 0x31, 0xbc, 0x2b, 0x09, 0xfd, - 0x2d, 0x87, 0xda, 0xc1, 0x74, 0xca, 0x94, 0x73, - 0x6e, 0xeb, 0x5f, 0xe5, 0x34, 0x49, 0xdf, 0xf4, - 0x61, 0xe0, 0xfa, 0x64, 0xfe, 0x05, 0x3a, 0x25, - 0xcc, 0x87, 0xf4, 0x03, 0x38, 0xca, 0xf2, 0xe8, - 0x4f, 0xb9, 0x4f, 0x79, 0x55, 0x43, 0xf3, 0x46, - 0xfd, 0xbc, 0xd2, 0x95, 0xb8, 0x99, 0xfc, 0xb8, - 0xb3, 0xa5, 0x04, 0xa1, 0x02, 0x81, 0xc0, 0x47, - 0xc6, 0x9c, 0x18, 0x54, 0xe5, 0xbb, 0xf9, 0xf4, - 0x38, 0xd2, 0xc0, 0xd1, 0x1a, 0xcc, 0xdb, 0x06, - 0x87, 0x75, 0x1f, 0x13, 0xa2, 0x7f, 0x8b, 0x45, - 0x54, 0xcb, 0x43, 0xf8, 0xbb, 0x94, 0xd6, 0x2e, - 0x56, 0x5c, 0x69, 0x6d, 0x83, 0xb5, 0x45, 0x46, - 0x68, 0x5c, 0x76, 0x1e, 0x6c, 0x0c, 0x53, 0x59, - 0xcc, 0x19, 0xc7, 0x81, 0x62, 0x66, 0x92, 0x02, - 0x8f, 0xa6, 0xdb, 0x50, 0x1c, 0x67, 0xfc, 0x82, - 0x56, 0x2b, 0x4b, 0x1f, 0x97, 0x87, 0xc4, 0x7d, - 0x20, 0xda, 0xd3, 0x3f, 0x28, 0xf9, 0x55, 0xfe, - 0x84, 0x50, 0xc5, 0x3b, 0xd4, 0xaf, 0xf5, 0x3d, - 0x43, 0xce, 0xdc, 0x55, 0x11, 0x87, 0xdb, 0x72, - 0x66, 0xcc, 0x83, 0xc4, 0x8b, 0x20, 0xae, 0x59, - 0x4d, 0xeb, 0xac, 0xb5, 0x4a, 0xec, 0x66, 0x09, - 0x37, 0x55, 0x14, 0x21, 0x57, 0xff, 0x0a, 0xac, - 0xda, 0xb1, 0xae, 0x31, 0xab, 0x41, 0x30, 0x65, - 0x02, 0x83, 0xd1, 0xdb, 0x65, 0xb7, 0x52, 0xa7, - 0x21, 0x9f, 0x1f, 0x8f, 0x69, 0x23, 0x3b, 0xb8, - 0xf9, 0x6d, 0xe7, 0xc1, 0x53, 0x9f, 0x8f, 0x67, - 0xfc, 0x6e, 0x20, 0x18, 0x31, 0x89, 0xe7, 0xbb, - 0xd4, 0xc1, 0x03, 0x67, 0xd6, 0xa5, 0x76, 0xc9, - 0xea, 0x97, 0x93, 0x02, 0xca, 0x44, 0x52, 0x55, - 0x0f, 0xed, 0x55, 0xb5, 0x49, 0xd6, 0x94, 0x59, - 0xee, 0xcc, 0x1b, 0x5a, 0x00, 0x3d, 0xcd }; + 0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x81, 0x00, + 0xa5, 0x62, 0x07, 0xdf, 0xc8, 0x84, 0x74, 0xe1, 0x2a, 0xb7, 0xbb, 0xc0, + 0x78, 0x76, 0xbe, 0x13, 0x3b, 0xe6, 0x2c, 0x09, 0x9d, 0x35, 0x3f, 0xf3, + 0x0f, 0xe9, 0x61, 0x96, 0x20, 0x53, 0x6e, 0x78, 0x62, 0xe0, 0x10, 0xd2, + 0xca, 0xe4, 0xdd, 0xd5, 0x96, 0xaf, 0x9a, 0xd7, 0x08, 0x47, 0xe4, 0x55, + 0x1b, 0x83, 0xbe, 0x10, 0x66, 0x74, 0x08, 0xf2, 0x49, 0x79, 0xea, 0x29, + 0x46, 0xc2, 0x65, 0x97, 0xa6, 0xcc, 0x4b, 0xa4, 0x08, 0xc3, 0x04, 0x17, + 0x01, 0xb5, 0x11, 0x53, 0xe9, 0x68, 0x34, 0x3c, 0x26, 0x56, 0x44, 0x37, + 0x5c, 0xb4, 0x7a, 0x1d, 0x5d, 0x6c, 0x58, 0xc2, 0x82, 0xa0, 0x92, 0xf1, + 0x14, 0xf1, 0x22, 0xff, 0x64, 0xde, 0xdf, 0xb3, 0x3d, 0x9d, 0xa5, 0x86, + 0xcd, 0xa0, 0x0a, 0x63, 0x08, 0xdd, 0x60, 0x5d, 0xfd, 0xa4, 0x01, 0xe3, + 0xb6, 0x0e, 0x85, 0xe4, 0xc3, 0x37, 0x61, 0xd0, 0xe7, 0x12, 0xe9, 0xc4, + 0xde, 0xf2, 0x59, 0x11, 0xe3, 0x5b, 0x02, 0x9f, 0x24, 0xb9, 0xb0, 0xbb, + 0x31, 0xa0, 0xee, 0x6a, 0x2c, 0xb4, 0x30, 0xff, 0xe0, 0xf0, 0x93, 0xee, + 0x3a, 0xae, 0xb2, 0x2e, 0x84, 0xa0, 0x47, 0x42, 0x51, 0xbb, 0xfa, 0xbb, + 0x90, 0x97, 0x2c, 0x77, 0x45, 0xee, 0x2c, 0xfb, 0xec, 0x5d, 0xd8, 0xca, + 0x49, 0x94, 0x53, 0x5d, 0x37, 0xaf, 0x86, 0x47, 0xda, 0xe2, 0xbd, 0xf0, + 0x5f, 0x07, 0x53, 0x8a, 0x10, 0xd0, 0x9a, 0xd0, 0x7f, 0xe9, 0xef, 0xf6, + 0xda, 0xea, 0x1e, 0x2e, 0x54, 0xec, 0x44, 0xde, 0x3a, 0xe1, 0xc8, 0xdb, + 0x17, 0xe8, 0xc9, 0x3a, 0x81, 0x11, 0x4d, 0xb7, 0x2d, 0x09, 0x83, 0xab, + 0x30, 0xb7, 0xf5, 0x1b, 0x03, 0x86, 0x21, 0xa9, 0xf5, 0xca, 0x15, 0x26, + 0xaf, 0x39, 0xf3, 0x5d, 0x01, 0x7d, 0xe3, 0x19, 0x54, 0xd1, 0x2e, 0x10, + 0x16, 0x9c, 0xee, 0xc3, 0xbd, 0xcc, 0xdb, 0x02, 0x82, 0xd0, 0x60, 0x0b, + 0x42, 0x72, 0x85, 0xec, 0xdc, 0x41, 0x7c, 0xf1, 0x34, 0xd8, 0x27, 0x21, + 0xf9, 0xa6, 0x82, 0x40, 0xd3, 0xc5, 0xc9, 0xf9, 0x6b, 0xc9, 0x12, 0x64, + 0xe4, 0x3a, 0x3b, 0xc9, 0x8f, 0x3c, 0xd0, 0x2c, 0xb8, 0xb8, 0xf3, 0x05, + 0x4a, 0xe9, 0x4c, 0x46, 0x2b, 0xb6, 0xe1, 0xed, 0x82, 0xb2, 0xf0, 0xd1, + 0x72, 0x71, 0x04, 0x35, 0x19, 0xc1, 0x16, 0x17, 0xd6, 0x75, 0xe0, 0xab, + 0xde, 0x8f, 0xe1, 0xc1, 0x49, 0x68, 0x0c, 0xc8, 0xce, 0x6d, 0x87, 0x50, + 0x04, 0xb5, 0xd7, 0x24, 0xf4, 0x2e, 0x0c, 0x11, 0x35, 0xb2, 0x67, 0x85, + 0x1b, 0x38, 0xff, 0x2f, 0x71, 0xf5, 0x30, 0x18, 0x1e, 0x6f, 0xd7, 0xf0, + 0x33, 0x61, 0x53, 0x7e, 0x55, 0x7f, 0x0d, 0x60, 0x83, 0xf3, 0x8a, 0x2b, + 0x67, 0xd5, 0xf0, 0x2e, 0x23, 0x23, 0x60, 0x0b, 0x83, 0x9c, 0xc2, 0x87, + 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x80, 0x5a, 0x09, 0x3f, + 0x9e, 0x2e, 0x4d, 0x26, 0x50, 0x7b, 0x70, 0x21, 0xb0, 0x0c, 0x25, 0x21, + 0x1f, 0xd9, 0x89, 0x5a, 0xca, 0x35, 0x23, 0x0b, 0x58, 0xa9, 0x7d, 0xf6, + 0x19, 0xc4, 0x29, 0x87, 0xc7, 0xd4, 0x94, 0x85, 0xb4, 0x2c, 0xaf, 0x62, + 0xb1, 0xe8, 0x62, 0x5b, 0xda, 0xdb, 0x70, 0x40, 0x37, 0xb1, 0x4e, 0x0c, + 0xc8, 0x62, 0xee, 0xa2, 0xfc, 0x3c, 0xd2, 0x39, 0x90, 0x15, 0x2c, 0xba, + 0x20, 0x50, 0xb7, 0x82, 0x2a, 0xa0, 0x76, 0x83, 0x20, 0x7f, 0x56, 0x73, + 0x43, 0x8a, 0x9b, 0xa7, 0x6c, 0x63, 0xb6, 0xad, 0x56, 0xb2, 0x8a, 0xb2, + 0xbc, 0x8f, 0xe2, 0xef, 0x83, 0x9d, 0x98, 0x0b, 0xc7, 0x62, 0x0e, 0x51, + 0x6e, 0x57, 0x1d, 0x1b, 0x0e, 0x3a, 0xea, 0x3b, 0x76, 0x63, 0x35, 0xd0, + 0xd1, 0xcf, 0xbe, 0xad, 0xbb, 0x1d, 0xde, 0x0f, 0x05, 0x48, 0x55, 0x29, + 0xc1, 0xbc, 0x21, 0xc7, 0x87, 0xf2, 0x75, 0x12, 0x7d, 0x92, 0x9e, 0xbf, + 0xad, 0x04, 0x68, 0xc4, 0xc9, 0x9d, 0x35, 0xd6, 0xa8, 0x62, 0xc1, 0x69, + 0x6a, 0xb6, 0x41, 0xb7, 0x37, 0x66, 0xdf, 0xb2, 0xb9, 0x8c, 0x8b, 0x15, + 0x08, 0x4c, 0x3d, 0xf1, 0xed, 0x82, 0x0f, 0xe3, 0xd5, 0xff, 0x46, 0xbd, + 0xf7, 0x85, 0x43, 0xc0, 0x8b, 0xba, 0x47, 0xf1, 0x41, 0x57, 0xc3, 0x7f, + 0x8b, 0x0d, 0x48, 0xea, 0xc2, 0xed, 0xc0, 0x69, 0x84, 0xb6, 0x32, 0x08, + 0x49, 0x74, 0x14, 0x84, 0xa4, 0x1b, 0x48, 0x5b, 0xec, 0xd3, 0x0b, 0x12, + 0x2b, 0x4c, 0x9e, 0x5c, 0x01, 0x60, 0xad, 0xef, 0xcb, 0x2b, 0x56, 0x84, + 0x07, 0xfa, 0x62, 0xc6, 0x08, 0x92, 0x98, 0x70, 0xc9, 0x5b, 0x18, 0xc8, + 0xfa, 0x27, 0x0c, 0xe2, 0xbd, 0xfb, 0x3e, 0x43, 0xa5, 0xb7, 0x06, 0x2c, + 0x4e, 0xf1, 0x07, 0x5d, 0x8d, 0xdd, 0x53, 0xc5, 0x8c, 0x4a, 0xf2, 0x2f, + 0x8e, 0x80, 0x96, 0x16, 0xc0, 0xfc, 0xf9, 0x20, 0x4f, 0x35, 0xc7, 0x53, + 0x8b, 0x2d, 0x37, 0x43, 0x93, 0x3d, 0x74, 0x3f, 0x63, 0xf7, 0x0b, 0xbd, + 0x46, 0xe4, 0x51, 0x67, 0x33, 0x57, 0x15, 0xf5, 0x59, 0x27, 0x66, 0xe8, + 0xe2, 0x4b, 0xa3, 0x93, 0x03, 0x8a, 0x9c, 0x05, 0x13, 0xf2, 0xcb, 0xf7, + 0x9c, 0x68, 0xe7, 0x16, 0x4b, 0x8e, 0x59, 0x71, 0x2b, 0x73, 0x9b, 0xb9, + 0xae, 0x50, 0xfa, 0xd7, 0xd3, 0x34, 0x17, 0x1d, 0x62, 0x88, 0xbd, 0x8c, + 0xba, 0x5a, 0x6b, 0x6a, 0x5e, 0xb3, 0xa5, 0x80, 0xca, 0xbb, 0xb9, 0xb5, + 0xa8, 0x2e, 0xb1, 0x61, 0x6e, 0xd5, 0xd6, 0x62, 0x98, 0x4a, 0xb0, 0xb8, + 0x76, 0xa9, 0x19, 0x5c, 0xe2, 0xbe, 0xb3, 0x9b, 0x4a, 0x39, 0xf5, 0xe6, + 0xbb, 0x11, 0x6e, 0x13, 0x13, 0x38, 0xb8, 0x1f, 0x21, 0x19, 0xf5, 0xa7, + 0x76, 0x93, 0xb3, 0x56, 0xfa, 0xcc, 0x74, 0xbc, 0x19, 0x02, 0x81, 0xc1, + 0x00, 0xd1, 0xd1, 0x72, 0x57, 0xe5, 0xb0, 0x1c, 0x09, 0x05, 0xbb, 0x55, + 0x89, 0x3c, 0x4a, 0x81, 0x90, 0x9a, 0xf9, 0x32, 0x63, 0x41, 0xad, 0x6a, + 0x5f, 0x65, 0x94, 0x92, 0xcc, 0xf7, 0xc7, 0x53, 0x93, 0xa0, 0xf7, 0xbe, + 0x48, 0x82, 0x63, 0x31, 0x7b, 0xd0, 0x82, 0x09, 0xbb, 0x0a, 0xbc, 0x60, + 0xc9, 0x4d, 0x83, 0xe4, 0x5d, 0x50, 0xe6, 0x5f, 0x8b, 0x47, 0x07, 0xa3, + 0x3a, 0x36, 0x97, 0xaa, 0x21, 0x70, 0x7f, 0xd5, 0x6c, 0xb0, 0x56, 0xf5, + 0x5c, 0x48, 0x74, 0x2a, 0xdd, 0xfe, 0x94, 0x83, 0x05, 0xe0, 0x3d, 0x5d, + 0xdd, 0x5a, 0x05, 0xcb, 0x47, 0xd7, 0xf9, 0x89, 0x55, 0xaa, 0x0b, 0x21, + 0xc0, 0x71, 0x5d, 0xe1, 0x4c, 0x6a, 0x45, 0x86, 0x86, 0xf2, 0xb9, 0x38, + 0x6a, 0x56, 0x51, 0x0d, 0x7d, 0xac, 0x30, 0x31, 0xca, 0x2d, 0xaa, 0xaa, + 0xba, 0xcc, 0x12, 0x40, 0xc1, 0x0d, 0xa6, 0xc1, 0x7d, 0x22, 0xec, 0xb6, + 0x51, 0x45, 0xfe, 0x4e, 0xbb, 0x4a, 0xd2, 0xba, 0x9b, 0xa2, 0xcc, 0x28, + 0x2b, 0x01, 0x53, 0x53, 0xf3, 0xa9, 0x5a, 0x8f, 0xeb, 0xb7, 0xb8, 0x62, + 0x6b, 0x8a, 0x79, 0x24, 0xcc, 0x86, 0x34, 0x45, 0xe2, 0xad, 0x1d, 0xd0, + 0x4c, 0xc9, 0x77, 0x2a, 0xf9, 0x1a, 0xe8, 0x58, 0x78, 0x51, 0x8a, 0xea, + 0x3f, 0x90, 0x36, 0x46, 0x2a, 0xc0, 0x71, 0x41, 0x83, 0x2c, 0x48, 0xee, + 0xc5, 0x02, 0x81, 0xc1, 0x00, 0xc9, 0xc8, 0xce, 0xc4, 0x50, 0xb2, 0x26, + 0xcb, 0x35, 0x78, 0x55, 0x3c, 0xcc, 0xf0, 0x7e, 0xba, 0xad, 0xeb, 0x58, + 0xe9, 0xb5, 0x78, 0x2f, 0x43, 0x5f, 0x07, 0x47, 0x56, 0x05, 0x41, 0x38, + 0x71, 0xe1, 0x58, 0x62, 0xb1, 0x8e, 0xbc, 0xf9, 0x80, 0x04, 0x22, 0x39, + 0x22, 0x24, 0x28, 0x86, 0x9c, 0x00, 0x44, 0x5f, 0xc4, 0x97, 0xe6, 0x71, + 0x5f, 0x1f, 0x58, 0xea, 0x75, 0x18, 0x0c, 0x23, 0x63, 0x09, 0xc5, 0x98, + 0xc4, 0x6d, 0x23, 0xc2, 0x2c, 0x93, 0x6a, 0x26, 0xe4, 0x3d, 0x8d, 0xa1, + 0x39, 0x70, 0x34, 0x25, 0xcd, 0xbc, 0x82, 0x78, 0x2b, 0xf3, 0x7e, 0x81, + 0xb6, 0x5f, 0xc5, 0x69, 0xd0, 0x81, 0x69, 0x50, 0x2f, 0x17, 0x0c, 0x17, + 0x3c, 0x0b, 0x45, 0x38, 0xce, 0xe3, 0xbf, 0x8a, 0x50, 0x0a, 0x00, 0x74, + 0x7e, 0x7a, 0xd8, 0x55, 0x52, 0x6b, 0x82, 0xfb, 0x34, 0x15, 0x73, 0x6a, + 0xf4, 0x51, 0x9b, 0x9f, 0xa0, 0x45, 0xb9, 0x76, 0xe5, 0xd3, 0xd5, 0xf4, + 0xa9, 0xa4, 0xcd, 0x42, 0x2f, 0x29, 0x89, 0xec, 0x28, 0x5f, 0x03, 0x45, + 0x27, 0xaf, 0x8c, 0x39, 0x3e, 0x59, 0x9d, 0xaf, 0x27, 0x5d, 0x17, 0x53, + 0x17, 0xeb, 0x8d, 0x7f, 0x3d, 0xb8, 0x2a, 0x50, 0x1e, 0xb5, 0xc5, 0x04, + 0xab, 0x9c, 0xa7, 0xaa, 0x86, 0x41, 0xb9, 0x36, 0x29, 0x9e, 0xd2, 0xd8, + 0xde, 0x5f, 0xde, 0x80, 0xdb, 0x02, 0x81, 0xc0, 0x03, 0xf3, 0x5f, 0xa5, + 0xcc, 0x0b, 0x5e, 0xdb, 0xc4, 0xa1, 0xdc, 0x60, 0x73, 0x24, 0x2c, 0x00, + 0x5f, 0x0a, 0xa6, 0x2a, 0x3c, 0x48, 0x59, 0xa2, 0x66, 0x35, 0x3f, 0xf6, + 0x60, 0x0b, 0xfe, 0xc4, 0xde, 0xd9, 0x0b, 0x5a, 0x2e, 0x2a, 0x53, 0xfa, + 0x32, 0xd8, 0xdf, 0xfa, 0x07, 0x9f, 0xb8, 0x6a, 0xd1, 0xec, 0xd3, 0xd5, + 0xf5, 0xfa, 0x00, 0x7e, 0x8c, 0xdd, 0xd5, 0xf2, 0xf8, 0xa8, 0x2e, 0x69, + 0xe6, 0xc6, 0x61, 0x6c, 0x64, 0x7d, 0x9e, 0xad, 0x18, 0x28, 0x27, 0xce, + 0x7a, 0x46, 0xad, 0x98, 0xe4, 0xba, 0x03, 0x14, 0x71, 0xe7, 0x7e, 0x06, + 0x62, 0x48, 0xae, 0x8f, 0x50, 0x5e, 0x59, 0x4a, 0x58, 0x58, 0x1e, 0x2f, + 0xe4, 0x28, 0x5e, 0xfa, 0x17, 0x83, 0xe9, 0x4e, 0x07, 0x46, 0x0b, 0x6c, + 0xfc, 0x5b, 0x03, 0xf4, 0xfc, 0x9b, 0x24, 0x0f, 0xd4, 0x5b, 0xdb, 0xa0, + 0x46, 0xf3, 0x86, 0xdd, 0x26, 0x55, 0x32, 0xb1, 0xa1, 0x11, 0xc2, 0xc5, + 0xc0, 0x08, 0xeb, 0xbe, 0x96, 0x78, 0x25, 0xa1, 0x79, 0xaa, 0xe9, 0xff, + 0xc2, 0x86, 0x94, 0x03, 0x2a, 0x38, 0x6c, 0x91, 0xfd, 0xcf, 0x7e, 0x23, + 0xe3, 0xbb, 0x04, 0x3d, 0xda, 0x68, 0x9f, 0x4d, 0x72, 0xd5, 0xad, 0x97, + 0x77, 0x2c, 0x3c, 0xce, 0x37, 0x2a, 0xd8, 0x72, 0x4d, 0xf2, 0xd7, 0xab, + 0x62, 0x68, 0x3f, 0x85, 0x8a, 0xc5, 0xec, 0xc9, 0x02, 0x81, 0xc1, 0x00, + 0x92, 0x43, 0x0c, 0x1d, 0x20, 0xa1, 0x01, 0x9d, 0xaa, 0x54, 0x5e, 0xf4, + 0x83, 0x58, 0x8f, 0x83, 0xa1, 0x2d, 0x46, 0x75, 0xa1, 0x24, 0x4c, 0x9d, + 0xf8, 0xf3, 0xbd, 0xb1, 0x8c, 0x7d, 0x89, 0xfc, 0x81, 0xeb, 0x1f, 0x1e, + 0xb4, 0xe8, 0x25, 0xb1, 0xb5, 0x4d, 0x59, 0x3c, 0x76, 0x19, 0x29, 0xf9, + 0x49, 0xf8, 0x45, 0xb2, 0xaa, 0xa8, 0x4e, 0xe5, 0x34, 0x43, 0xaf, 0x2e, + 0xd1, 0x0f, 0x7b, 0x56, 0xfe, 0x6e, 0x4c, 0x1d, 0x95, 0x3e, 0xa6, 0x30, + 0xc9, 0x69, 0xd8, 0x66, 0xf8, 0x77, 0x00, 0xb6, 0x31, 0xae, 0x9a, 0xf8, + 0x55, 0xfb, 0xfc, 0x3f, 0x5f, 0x70, 0x03, 0x75, 0xbe, 0x55, 0xca, 0x2d, + 0x68, 0xa0, 0x7d, 0x8e, 0xa4, 0x96, 0x0f, 0x01, 0x66, 0xe9, 0xf6, 0x13, + 0x80, 0xe2, 0x05, 0xcf, 0x9e, 0x70, 0x56, 0x00, 0x97, 0xea, 0xd7, 0x6d, + 0xb6, 0xa0, 0x6a, 0x95, 0x86, 0x36, 0xf2, 0xff, 0xc5, 0x67, 0x98, 0x7d, + 0x04, 0x0d, 0x3b, 0x31, 0xbc, 0x2b, 0x09, 0xfd, 0x2d, 0x87, 0xda, 0xc1, + 0x74, 0xca, 0x94, 0x73, 0x6e, 0xeb, 0x5f, 0xe5, 0x34, 0x49, 0xdf, 0xf4, + 0x61, 0xe0, 0xfa, 0x64, 0xfe, 0x05, 0x3a, 0x25, 0xcc, 0x87, 0xf4, 0x03, + 0x38, 0xca, 0xf2, 0xe8, 0x4f, 0xb9, 0x4f, 0x79, 0x55, 0x43, 0xf3, 0x46, + 0xfd, 0xbc, 0xd2, 0x95, 0xb8, 0x99, 0xfc, 0xb8, 0xb3, 0xa5, 0x04, 0xa1, + 0x02, 0x81, 0xc0, 0x47, 0xc6, 0x9c, 0x18, 0x54, 0xe5, 0xbb, 0xf9, 0xf4, + 0x38, 0xd2, 0xc0, 0xd1, 0x1a, 0xcc, 0xdb, 0x06, 0x87, 0x75, 0x1f, 0x13, + 0xa2, 0x7f, 0x8b, 0x45, 0x54, 0xcb, 0x43, 0xf8, 0xbb, 0x94, 0xd6, 0x2e, + 0x56, 0x5c, 0x69, 0x6d, 0x83, 0xb5, 0x45, 0x46, 0x68, 0x5c, 0x76, 0x1e, + 0x6c, 0x0c, 0x53, 0x59, 0xcc, 0x19, 0xc7, 0x81, 0x62, 0x66, 0x92, 0x02, + 0x8f, 0xa6, 0xdb, 0x50, 0x1c, 0x67, 0xfc, 0x82, 0x56, 0x2b, 0x4b, 0x1f, + 0x97, 0x87, 0xc4, 0x7d, 0x20, 0xda, 0xd3, 0x3f, 0x28, 0xf9, 0x55, 0xfe, + 0x84, 0x50, 0xc5, 0x3b, 0xd4, 0xaf, 0xf5, 0x3d, 0x43, 0xce, 0xdc, 0x55, + 0x11, 0x87, 0xdb, 0x72, 0x66, 0xcc, 0x83, 0xc4, 0x8b, 0x20, 0xae, 0x59, + 0x4d, 0xeb, 0xac, 0xb5, 0x4a, 0xec, 0x66, 0x09, 0x37, 0x55, 0x14, 0x21, + 0x57, 0xff, 0x0a, 0xac, 0xda, 0xb1, 0xae, 0x31, 0xab, 0x41, 0x30, 0x65, + 0x02, 0x83, 0xd1, 0xdb, 0x65, 0xb7, 0x52, 0xa7, 0x21, 0x9f, 0x1f, 0x8f, + 0x69, 0x23, 0x3b, 0xb8, 0xf9, 0x6d, 0xe7, 0xc1, 0x53, 0x9f, 0x8f, 0x67, + 0xfc, 0x6e, 0x20, 0x18, 0x31, 0x89, 0xe7, 0xbb, 0xd4, 0xc1, 0x03, 0x67, + 0xd6, 0xa5, 0x76, 0xc9, 0xea, 0x97, 0x93, 0x02, 0xca, 0x44, 0x52, 0x55, + 0x0f, 0xed, 0x55, 0xb5, 0x49, 0xd6, 0x94, 0x59, 0xee, 0xcc, 0x1b, 0x5a, + 0x00, 0x3d, 0xcd}; static const unsigned char kTestRsaPublicKey1_3072[] = { - 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, - 0x00, 0xa5, 0x62, 0x07, 0xdf, 0xc8, 0x84, 0x74, - 0xe1, 0x2a, 0xb7, 0xbb, 0xc0, 0x78, 0x76, 0xbe, - 0x13, 0x3b, 0xe6, 0x2c, 0x09, 0x9d, 0x35, 0x3f, - 0xf3, 0x0f, 0xe9, 0x61, 0x96, 0x20, 0x53, 0x6e, - 0x78, 0x62, 0xe0, 0x10, 0xd2, 0xca, 0xe4, 0xdd, - 0xd5, 0x96, 0xaf, 0x9a, 0xd7, 0x08, 0x47, 0xe4, - 0x55, 0x1b, 0x83, 0xbe, 0x10, 0x66, 0x74, 0x08, - 0xf2, 0x49, 0x79, 0xea, 0x29, 0x46, 0xc2, 0x65, - 0x97, 0xa6, 0xcc, 0x4b, 0xa4, 0x08, 0xc3, 0x04, - 0x17, 0x01, 0xb5, 0x11, 0x53, 0xe9, 0x68, 0x34, - 0x3c, 0x26, 0x56, 0x44, 0x37, 0x5c, 0xb4, 0x7a, - 0x1d, 0x5d, 0x6c, 0x58, 0xc2, 0x82, 0xa0, 0x92, - 0xf1, 0x14, 0xf1, 0x22, 0xff, 0x64, 0xde, 0xdf, - 0xb3, 0x3d, 0x9d, 0xa5, 0x86, 0xcd, 0xa0, 0x0a, - 0x63, 0x08, 0xdd, 0x60, 0x5d, 0xfd, 0xa4, 0x01, - 0xe3, 0xb6, 0x0e, 0x85, 0xe4, 0xc3, 0x37, 0x61, - 0xd0, 0xe7, 0x12, 0xe9, 0xc4, 0xde, 0xf2, 0x59, - 0x11, 0xe3, 0x5b, 0x02, 0x9f, 0x24, 0xb9, 0xb0, - 0xbb, 0x31, 0xa0, 0xee, 0x6a, 0x2c, 0xb4, 0x30, - 0xff, 0xe0, 0xf0, 0x93, 0xee, 0x3a, 0xae, 0xb2, - 0x2e, 0x84, 0xa0, 0x47, 0x42, 0x51, 0xbb, 0xfa, - 0xbb, 0x90, 0x97, 0x2c, 0x77, 0x45, 0xee, 0x2c, - 0xfb, 0xec, 0x5d, 0xd8, 0xca, 0x49, 0x94, 0x53, - 0x5d, 0x37, 0xaf, 0x86, 0x47, 0xda, 0xe2, 0xbd, - 0xf0, 0x5f, 0x07, 0x53, 0x8a, 0x10, 0xd0, 0x9a, - 0xd0, 0x7f, 0xe9, 0xef, 0xf6, 0xda, 0xea, 0x1e, - 0x2e, 0x54, 0xec, 0x44, 0xde, 0x3a, 0xe1, 0xc8, - 0xdb, 0x17, 0xe8, 0xc9, 0x3a, 0x81, 0x11, 0x4d, - 0xb7, 0x2d, 0x09, 0x83, 0xab, 0x30, 0xb7, 0xf5, - 0x1b, 0x03, 0x86, 0x21, 0xa9, 0xf5, 0xca, 0x15, - 0x26, 0xaf, 0x39, 0xf3, 0x5d, 0x01, 0x7d, 0xe3, - 0x19, 0x54, 0xd1, 0x2e, 0x10, 0x16, 0x9c, 0xee, - 0xc3, 0xbd, 0xcc, 0xdb, 0x02, 0x82, 0xd0, 0x60, - 0x0b, 0x42, 0x72, 0x85, 0xec, 0xdc, 0x41, 0x7c, - 0xf1, 0x34, 0xd8, 0x27, 0x21, 0xf9, 0xa6, 0x82, - 0x40, 0xd3, 0xc5, 0xc9, 0xf9, 0x6b, 0xc9, 0x12, - 0x64, 0xe4, 0x3a, 0x3b, 0xc9, 0x8f, 0x3c, 0xd0, - 0x2c, 0xb8, 0xb8, 0xf3, 0x05, 0x4a, 0xe9, 0x4c, - 0x46, 0x2b, 0xb6, 0xe1, 0xed, 0x82, 0xb2, 0xf0, - 0xd1, 0x72, 0x71, 0x04, 0x35, 0x19, 0xc1, 0x16, - 0x17, 0xd6, 0x75, 0xe0, 0xab, 0xde, 0x8f, 0xe1, - 0xc1, 0x49, 0x68, 0x0c, 0xc8, 0xce, 0x6d, 0x87, - 0x50, 0x04, 0xb5, 0xd7, 0x24, 0xf4, 0x2e, 0x0c, - 0x11, 0x35, 0xb2, 0x67, 0x85, 0x1b, 0x38, 0xff, - 0x2f, 0x71, 0xf5, 0x30, 0x18, 0x1e, 0x6f, 0xd7, - 0xf0, 0x33, 0x61, 0x53, 0x7e, 0x55, 0x7f, 0x0d, - 0x60, 0x83, 0xf3, 0x8a, 0x2b, 0x67, 0xd5, 0xf0, - 0x2e, 0x23, 0x23, 0x60, 0x0b, 0x83, 0x9c, 0xc2, - 0x87, 0x02, 0x03, 0x01, 0x00, 0x01 }; + 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xa5, 0x62, 0x07, + 0xdf, 0xc8, 0x84, 0x74, 0xe1, 0x2a, 0xb7, 0xbb, 0xc0, 0x78, 0x76, 0xbe, + 0x13, 0x3b, 0xe6, 0x2c, 0x09, 0x9d, 0x35, 0x3f, 0xf3, 0x0f, 0xe9, 0x61, + 0x96, 0x20, 0x53, 0x6e, 0x78, 0x62, 0xe0, 0x10, 0xd2, 0xca, 0xe4, 0xdd, + 0xd5, 0x96, 0xaf, 0x9a, 0xd7, 0x08, 0x47, 0xe4, 0x55, 0x1b, 0x83, 0xbe, + 0x10, 0x66, 0x74, 0x08, 0xf2, 0x49, 0x79, 0xea, 0x29, 0x46, 0xc2, 0x65, + 0x97, 0xa6, 0xcc, 0x4b, 0xa4, 0x08, 0xc3, 0x04, 0x17, 0x01, 0xb5, 0x11, + 0x53, 0xe9, 0x68, 0x34, 0x3c, 0x26, 0x56, 0x44, 0x37, 0x5c, 0xb4, 0x7a, + 0x1d, 0x5d, 0x6c, 0x58, 0xc2, 0x82, 0xa0, 0x92, 0xf1, 0x14, 0xf1, 0x22, + 0xff, 0x64, 0xde, 0xdf, 0xb3, 0x3d, 0x9d, 0xa5, 0x86, 0xcd, 0xa0, 0x0a, + 0x63, 0x08, 0xdd, 0x60, 0x5d, 0xfd, 0xa4, 0x01, 0xe3, 0xb6, 0x0e, 0x85, + 0xe4, 0xc3, 0x37, 0x61, 0xd0, 0xe7, 0x12, 0xe9, 0xc4, 0xde, 0xf2, 0x59, + 0x11, 0xe3, 0x5b, 0x02, 0x9f, 0x24, 0xb9, 0xb0, 0xbb, 0x31, 0xa0, 0xee, + 0x6a, 0x2c, 0xb4, 0x30, 0xff, 0xe0, 0xf0, 0x93, 0xee, 0x3a, 0xae, 0xb2, + 0x2e, 0x84, 0xa0, 0x47, 0x42, 0x51, 0xbb, 0xfa, 0xbb, 0x90, 0x97, 0x2c, + 0x77, 0x45, 0xee, 0x2c, 0xfb, 0xec, 0x5d, 0xd8, 0xca, 0x49, 0x94, 0x53, + 0x5d, 0x37, 0xaf, 0x86, 0x47, 0xda, 0xe2, 0xbd, 0xf0, 0x5f, 0x07, 0x53, + 0x8a, 0x10, 0xd0, 0x9a, 0xd0, 0x7f, 0xe9, 0xef, 0xf6, 0xda, 0xea, 0x1e, + 0x2e, 0x54, 0xec, 0x44, 0xde, 0x3a, 0xe1, 0xc8, 0xdb, 0x17, 0xe8, 0xc9, + 0x3a, 0x81, 0x11, 0x4d, 0xb7, 0x2d, 0x09, 0x83, 0xab, 0x30, 0xb7, 0xf5, + 0x1b, 0x03, 0x86, 0x21, 0xa9, 0xf5, 0xca, 0x15, 0x26, 0xaf, 0x39, 0xf3, + 0x5d, 0x01, 0x7d, 0xe3, 0x19, 0x54, 0xd1, 0x2e, 0x10, 0x16, 0x9c, 0xee, + 0xc3, 0xbd, 0xcc, 0xdb, 0x02, 0x82, 0xd0, 0x60, 0x0b, 0x42, 0x72, 0x85, + 0xec, 0xdc, 0x41, 0x7c, 0xf1, 0x34, 0xd8, 0x27, 0x21, 0xf9, 0xa6, 0x82, + 0x40, 0xd3, 0xc5, 0xc9, 0xf9, 0x6b, 0xc9, 0x12, 0x64, 0xe4, 0x3a, 0x3b, + 0xc9, 0x8f, 0x3c, 0xd0, 0x2c, 0xb8, 0xb8, 0xf3, 0x05, 0x4a, 0xe9, 0x4c, + 0x46, 0x2b, 0xb6, 0xe1, 0xed, 0x82, 0xb2, 0xf0, 0xd1, 0x72, 0x71, 0x04, + 0x35, 0x19, 0xc1, 0x16, 0x17, 0xd6, 0x75, 0xe0, 0xab, 0xde, 0x8f, 0xe1, + 0xc1, 0x49, 0x68, 0x0c, 0xc8, 0xce, 0x6d, 0x87, 0x50, 0x04, 0xb5, 0xd7, + 0x24, 0xf4, 0x2e, 0x0c, 0x11, 0x35, 0xb2, 0x67, 0x85, 0x1b, 0x38, 0xff, + 0x2f, 0x71, 0xf5, 0x30, 0x18, 0x1e, 0x6f, 0xd7, 0xf0, 0x33, 0x61, 0x53, + 0x7e, 0x55, 0x7f, 0x0d, 0x60, 0x83, 0xf3, 0x8a, 0x2b, 0x67, 0xd5, 0xf0, + 0x2e, 0x23, 0x23, 0x60, 0x0b, 0x83, 0x9c, 0xc2, 0x87, 0x02, 0x03, 0x01, + 0x00, 0x01}; static const unsigned char kTestRsaPrivateKey2_2048[] = { - 0x30, 0x82, 0x04, 0xa2, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xa7, 0x00, 0x36, 0x60, - 0x65, 0xdc, 0xbd, 0x54, 0x5a, 0x2a, 0x40, 0xb4, - 0xe1, 0x15, 0x94, 0x58, 0x11, 0x4f, 0x94, 0x58, - 0xdd, 0xde, 0xa7, 0x1f, 0x3c, 0x2c, 0xe0, 0x88, - 0x09, 0x29, 0x61, 0x57, 0x67, 0x5e, 0x56, 0x7e, - 0xee, 0x27, 0x8f, 0x59, 0x34, 0x9a, 0x2a, 0xaa, - 0x9d, 0xb4, 0x4e, 0xfa, 0xa7, 0x6a, 0xd4, 0xc9, - 0x7a, 0x53, 0xc1, 0x4e, 0x9f, 0xe3, 0x34, 0xf7, - 0x3d, 0xb7, 0xc9, 0x10, 0x47, 0x4f, 0x28, 0xda, - 0x3f, 0xce, 0x31, 0x7b, 0xfd, 0x06, 0x10, 0xeb, - 0xf7, 0xbe, 0x92, 0xf9, 0xaf, 0xfb, 0x3e, 0x68, - 0xda, 0xee, 0x1a, 0x64, 0x4c, 0xf3, 0x29, 0xf2, - 0x73, 0x9e, 0x39, 0xd8, 0xf6, 0x6f, 0xd8, 0xb2, - 0x80, 0x82, 0x71, 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, - 0x3e, 0xcd, 0x0a, 0xca, 0xb6, 0x04, 0xcd, 0x9a, - 0x13, 0x8b, 0x54, 0x73, 0x54, 0x25, 0x54, 0x8c, - 0xbe, 0x98, 0x7a, 0x67, 0xad, 0xda, 0xb3, 0x4e, - 0xb3, 0xfa, 0x82, 0xa8, 0x4a, 0x67, 0x98, 0x56, - 0x57, 0x54, 0x71, 0xcd, 0x12, 0x7f, 0xed, 0xa3, - 0x01, 0xc0, 0x6a, 0x8b, 0x24, 0x03, 0x96, 0x88, - 0xbe, 0x97, 0x66, 0x2a, 0xbc, 0x53, 0xc9, 0x83, - 0x06, 0x51, 0x5a, 0x88, 0x65, 0x13, 0x18, 0xe4, - 0x3a, 0xed, 0x6b, 0xf1, 0x61, 0x5b, 0x4c, 0xc8, - 0x1e, 0xf4, 0xc2, 0xae, 0x08, 0x5e, 0x2d, 0x5f, - 0xf8, 0x12, 0x7f, 0xa2, 0xfc, 0xbb, 0x21, 0x18, - 0x30, 0xda, 0xfe, 0x40, 0xfb, 0x01, 0xca, 0x2e, - 0x37, 0x0e, 0xce, 0xdd, 0x76, 0x87, 0x82, 0x46, - 0x0b, 0x3a, 0x77, 0x8f, 0xc0, 0x72, 0x07, 0x2c, - 0x7f, 0x9d, 0x1e, 0x86, 0x5b, 0xed, 0x27, 0x29, - 0xdf, 0x03, 0x97, 0x62, 0xef, 0x44, 0xd3, 0x5b, - 0x3d, 0xdb, 0x9c, 0x5e, 0x1b, 0x7b, 0x39, 0xb4, - 0x0b, 0x6d, 0x04, 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, - 0xcf, 0xb3, 0x7a, 0x05, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x00, 0x5e, 0x79, 0x65, - 0x49, 0xa5, 0x76, 0x79, 0xf9, 0x05, 0x45, 0x0f, - 0xf4, 0x03, 0xbd, 0xa4, 0x7d, 0x29, 0xd5, 0xde, - 0x33, 0x63, 0xd8, 0xb8, 0xac, 0x97, 0xeb, 0x3f, - 0x5e, 0x55, 0xe8, 0x7d, 0xf3, 0xe7, 0x3b, 0x5c, - 0x2d, 0x54, 0x67, 0x36, 0xd6, 0x1d, 0x46, 0xf5, - 0xca, 0x2d, 0x8b, 0x3a, 0x7e, 0xdc, 0x45, 0x38, - 0x79, 0x7e, 0x65, 0x71, 0x5f, 0x1c, 0x5e, 0x79, - 0xb1, 0x40, 0xcd, 0xfe, 0xc5, 0xe1, 0xc1, 0x6b, - 0x78, 0x04, 0x4e, 0x8e, 0x79, 0xf9, 0x0a, 0xfc, - 0x79, 0xb1, 0x5e, 0xb3, 0x60, 0xe3, 0x68, 0x7b, - 0xc6, 0xef, 0xcb, 0x71, 0x4c, 0xba, 0xa7, 0x79, - 0x5c, 0x7a, 0x81, 0xd1, 0x71, 0xe7, 0x00, 0x21, - 0x13, 0xe2, 0x55, 0x69, 0x0e, 0x75, 0xbe, 0x09, - 0xc3, 0x4f, 0xa9, 0xc9, 0x68, 0x22, 0x0e, 0x97, - 0x8d, 0x89, 0x6e, 0xf1, 0xe8, 0x88, 0x7a, 0xd1, - 0xd9, 0x09, 0x5d, 0xd3, 0x28, 0x78, 0x25, 0x0b, - 0x1c, 0x47, 0x73, 0x25, 0xcc, 0x21, 0xb6, 0xda, - 0xc6, 0x24, 0x5a, 0xd0, 0x37, 0x14, 0x46, 0xc7, - 0x94, 0x69, 0xe4, 0x43, 0x6f, 0x47, 0xde, 0x00, - 0x33, 0x4d, 0x8f, 0x95, 0x72, 0xfa, 0x68, 0x71, - 0x17, 0x66, 0x12, 0x1a, 0x87, 0x27, 0xf7, 0xef, - 0x7e, 0xe0, 0x35, 0x58, 0xf2, 0x4d, 0x6f, 0x35, - 0x01, 0xaa, 0x96, 0xe2, 0x3d, 0x51, 0x13, 0x86, - 0x9c, 0x79, 0xd0, 0xb7, 0xb6, 0x64, 0xe8, 0x86, - 0x65, 0x50, 0xbf, 0xcc, 0x27, 0x53, 0x1f, 0x51, - 0xd4, 0xca, 0xbe, 0xf5, 0xdd, 0x77, 0x70, 0x98, - 0x0f, 0xee, 0xa8, 0x96, 0x07, 0x5f, 0x45, 0x6a, - 0x7a, 0x0d, 0x03, 0x9c, 0x4f, 0x29, 0xf6, 0x06, - 0xf3, 0x5d, 0x58, 0x6c, 0x47, 0xd0, 0x96, 0xa9, - 0x03, 0x17, 0xbb, 0x4e, 0xc9, 0x21, 0xe0, 0xac, - 0xcd, 0x78, 0x78, 0xb2, 0xfe, 0x81, 0xb2, 0x51, - 0x53, 0xa6, 0x1f, 0x98, 0x45, 0x02, 0x81, 0x81, - 0x00, 0xcf, 0x73, 0x8c, 0xbe, 0x6d, 0x45, 0x2d, - 0x0c, 0x0b, 0x5d, 0x5c, 0x6c, 0x75, 0x78, 0xcc, - 0x35, 0x48, 0xb6, 0x98, 0xf1, 0xb9, 0x64, 0x60, - 0x8c, 0x43, 0xeb, 0x85, 0xab, 0x04, 0xb6, 0x7d, - 0x1b, 0x71, 0x75, 0x06, 0xe2, 0xda, 0x84, 0x68, - 0x2e, 0x7f, 0x4c, 0xe3, 0x73, 0xb4, 0xde, 0x51, - 0x4b, 0xb6, 0x51, 0x86, 0x7b, 0xd0, 0xe6, 0x4d, - 0xf3, 0xd1, 0xcf, 0x1a, 0xfe, 0x7f, 0x3a, 0x83, - 0xba, 0xb3, 0xe1, 0xff, 0x54, 0x13, 0x93, 0xd7, - 0x9c, 0x27, 0x80, 0xb7, 0x1e, 0x64, 0x9e, 0xf7, - 0x32, 0x2b, 0x46, 0x29, 0xf7, 0xf8, 0x18, 0x6c, - 0xf7, 0x4a, 0xbe, 0x4b, 0xee, 0x96, 0x90, 0x8f, - 0xa2, 0x16, 0x22, 0x6a, 0xcc, 0x48, 0x06, 0x74, - 0x63, 0x43, 0x7f, 0x27, 0x22, 0x44, 0x3c, 0x2d, - 0x3b, 0x62, 0xf1, 0x1c, 0xb4, 0x27, 0x33, 0x85, - 0x26, 0x60, 0x48, 0x16, 0xcb, 0xef, 0xf8, 0xcd, - 0x37, 0x02, 0x81, 0x81, 0x00, 0xce, 0x15, 0x43, - 0x6e, 0x4b, 0x0f, 0xf9, 0x3f, 0x87, 0xc3, 0x41, - 0x45, 0x97, 0xb1, 0x49, 0xc2, 0x19, 0x23, 0x87, - 0xe4, 0x24, 0x1c, 0x64, 0xe5, 0x28, 0xcb, 0x43, - 0x10, 0x14, 0x14, 0x0e, 0x19, 0xcb, 0xbb, 0xdb, - 0xfd, 0x11, 0x9d, 0x17, 0x68, 0x78, 0x6d, 0x61, - 0x70, 0x63, 0x3a, 0xa1, 0xb3, 0xf3, 0xa7, 0x5b, - 0x0e, 0xff, 0xb7, 0x61, 0x11, 0x54, 0x91, 0x99, - 0xe5, 0x91, 0x32, 0x2d, 0xeb, 0x3f, 0xd8, 0x3e, - 0xf7, 0xd4, 0xcb, 0xd2, 0xa3, 0x41, 0xc1, 0xee, - 0xc6, 0x92, 0x13, 0xeb, 0x7f, 0x42, 0x58, 0xf4, - 0xd0, 0xb2, 0x74, 0x1d, 0x8e, 0x87, 0x46, 0xcd, - 0x14, 0xb8, 0x16, 0xad, 0xb5, 0xbd, 0x0d, 0x6c, - 0x95, 0x5a, 0x16, 0xbf, 0xe9, 0x53, 0xda, 0xfb, - 0xed, 0x83, 0x51, 0x67, 0xa9, 0x55, 0xab, 0x54, - 0x02, 0x95, 0x20, 0xa6, 0x68, 0x17, 0x53, 0xa8, - 0xea, 0x43, 0xe5, 0xb0, 0xa3, 0x02, 0x81, 0x80, - 0x67, 0x9c, 0x32, 0x83, 0x39, 0x57, 0xff, 0x73, - 0xb0, 0x89, 0x64, 0x8b, 0xd6, 0xf0, 0x0a, 0x2d, - 0xe2, 0xaf, 0x30, 0x1c, 0x2a, 0x97, 0xf3, 0x90, - 0x9a, 0xab, 0x9b, 0x0b, 0x1b, 0x43, 0x79, 0xa0, - 0xa7, 0x3d, 0xe7, 0xbe, 0x8d, 0x9c, 0xeb, 0xdb, - 0xad, 0x40, 0xdd, 0xa9, 0x00, 0x80, 0xb8, 0xe1, - 0xb3, 0xa1, 0x6c, 0x25, 0x92, 0xe4, 0x33, 0xb2, - 0xbe, 0xeb, 0x4d, 0x74, 0x26, 0x5f, 0x37, 0x43, - 0x9c, 0x6c, 0x17, 0x76, 0x0a, 0x81, 0x20, 0x82, - 0xa1, 0x48, 0x2c, 0x2d, 0x45, 0xdc, 0x0f, 0x62, - 0x43, 0x32, 0xbb, 0xeb, 0x59, 0x41, 0xf9, 0xca, - 0x58, 0xce, 0x4a, 0x66, 0x53, 0x54, 0xc8, 0x28, - 0x10, 0x1e, 0x08, 0x71, 0x16, 0xd8, 0x02, 0x71, - 0x41, 0x58, 0xd4, 0x56, 0xcc, 0xf5, 0xb1, 0x31, - 0xa3, 0xed, 0x00, 0x85, 0x09, 0xbf, 0x35, 0x95, - 0x41, 0x29, 0x40, 0x19, 0x83, 0x35, 0x24, 0x69, - 0x02, 0x81, 0x80, 0x55, 0x10, 0x0b, 0xcc, 0x3b, - 0xa9, 0x75, 0x3d, 0x16, 0xe1, 0xae, 0x50, 0x76, - 0x63, 0x94, 0x49, 0x4c, 0xad, 0x10, 0xcb, 0x47, - 0x68, 0x7c, 0xf0, 0xe5, 0xdc, 0xb8, 0x6a, 0xab, - 0x8e, 0xf7, 0x9f, 0x08, 0x2c, 0x1b, 0x8a, 0xa2, - 0xb9, 0x8f, 0xce, 0xec, 0x5e, 0x61, 0xa8, 0xcd, - 0x1c, 0x87, 0x60, 0x4a, 0xc3, 0x1a, 0x5f, 0xdf, - 0x87, 0x26, 0xc6, 0xcb, 0x7c, 0x69, 0xe4, 0x8b, - 0x01, 0x06, 0x59, 0x22, 0xfa, 0x34, 0x4b, 0x81, - 0x87, 0x3c, 0x03, 0x6d, 0x02, 0x0a, 0x77, 0xe6, - 0x15, 0xd8, 0xcf, 0xa7, 0x68, 0x26, 0x6c, 0xfa, - 0x2b, 0xd9, 0x83, 0x5a, 0x2d, 0x0c, 0x3b, 0x70, - 0x1c, 0xd4, 0x48, 0xbe, 0xa7, 0x0a, 0xd9, 0xbe, - 0xdc, 0xc3, 0x0c, 0x21, 0x33, 0xb3, 0x66, 0xff, - 0x1c, 0x1b, 0xc8, 0x96, 0x76, 0xe8, 0x6f, 0x44, - 0x74, 0xbc, 0x9b, 0x1c, 0x7d, 0xc8, 0xac, 0x21, - 0xa8, 0x6e, 0x37, 0x02, 0x81, 0x80, 0x2c, 0x7c, - 0xad, 0x1e, 0x75, 0xf6, 0x69, 0x1d, 0xe7, 0xa6, - 0xca, 0x74, 0x7d, 0x67, 0xc8, 0x65, 0x28, 0x66, - 0xc4, 0x43, 0xa6, 0xbd, 0x40, 0x57, 0xae, 0xb7, - 0x65, 0x2c, 0x52, 0xf9, 0xe4, 0xc7, 0x81, 0x7b, - 0x56, 0xa3, 0xd2, 0x0d, 0xe8, 0x33, 0x70, 0xcf, - 0x06, 0x84, 0xb3, 0x4e, 0x44, 0x50, 0x75, 0x61, - 0x96, 0x86, 0x4b, 0xb6, 0x2b, 0xad, 0xf0, 0xad, - 0x57, 0xd0, 0x37, 0x0d, 0x1d, 0x35, 0x50, 0xcb, - 0x69, 0x22, 0x39, 0x29, 0xb9, 0x3a, 0xd3, 0x29, - 0x23, 0x02, 0x60, 0xf7, 0xab, 0x30, 0x40, 0xda, - 0x8e, 0x4d, 0x45, 0x70, 0x26, 0xf4, 0xa2, 0x0d, - 0xd0, 0x64, 0x5d, 0x47, 0x3c, 0x18, 0xf4, 0xd4, - 0x52, 0x95, 0x00, 0xae, 0x84, 0x6b, 0x47, 0xb2, - 0x3c, 0x82, 0xd3, 0x72, 0x53, 0xde, 0x72, 0x2c, - 0xf7, 0xc1, 0x22, 0x36, 0xd9, 0x18, 0x56, 0xfe, - 0x39, 0x28, 0x33, 0xe0, 0xdb, 0x03 }; + 0x30, 0x82, 0x04, 0xa2, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa7, 0x00, 0x36, 0x60, 0x65, 0xdc, 0xbd, 0x54, 0x5a, 0x2a, 0x40, 0xb4, + 0xe1, 0x15, 0x94, 0x58, 0x11, 0x4f, 0x94, 0x58, 0xdd, 0xde, 0xa7, 0x1f, + 0x3c, 0x2c, 0xe0, 0x88, 0x09, 0x29, 0x61, 0x57, 0x67, 0x5e, 0x56, 0x7e, + 0xee, 0x27, 0x8f, 0x59, 0x34, 0x9a, 0x2a, 0xaa, 0x9d, 0xb4, 0x4e, 0xfa, + 0xa7, 0x6a, 0xd4, 0xc9, 0x7a, 0x53, 0xc1, 0x4e, 0x9f, 0xe3, 0x34, 0xf7, + 0x3d, 0xb7, 0xc9, 0x10, 0x47, 0x4f, 0x28, 0xda, 0x3f, 0xce, 0x31, 0x7b, + 0xfd, 0x06, 0x10, 0xeb, 0xf7, 0xbe, 0x92, 0xf9, 0xaf, 0xfb, 0x3e, 0x68, + 0xda, 0xee, 0x1a, 0x64, 0x4c, 0xf3, 0x29, 0xf2, 0x73, 0x9e, 0x39, 0xd8, + 0xf6, 0x6f, 0xd8, 0xb2, 0x80, 0x82, 0x71, 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, + 0x3e, 0xcd, 0x0a, 0xca, 0xb6, 0x04, 0xcd, 0x9a, 0x13, 0x8b, 0x54, 0x73, + 0x54, 0x25, 0x54, 0x8c, 0xbe, 0x98, 0x7a, 0x67, 0xad, 0xda, 0xb3, 0x4e, + 0xb3, 0xfa, 0x82, 0xa8, 0x4a, 0x67, 0x98, 0x56, 0x57, 0x54, 0x71, 0xcd, + 0x12, 0x7f, 0xed, 0xa3, 0x01, 0xc0, 0x6a, 0x8b, 0x24, 0x03, 0x96, 0x88, + 0xbe, 0x97, 0x66, 0x2a, 0xbc, 0x53, 0xc9, 0x83, 0x06, 0x51, 0x5a, 0x88, + 0x65, 0x13, 0x18, 0xe4, 0x3a, 0xed, 0x6b, 0xf1, 0x61, 0x5b, 0x4c, 0xc8, + 0x1e, 0xf4, 0xc2, 0xae, 0x08, 0x5e, 0x2d, 0x5f, 0xf8, 0x12, 0x7f, 0xa2, + 0xfc, 0xbb, 0x21, 0x18, 0x30, 0xda, 0xfe, 0x40, 0xfb, 0x01, 0xca, 0x2e, + 0x37, 0x0e, 0xce, 0xdd, 0x76, 0x87, 0x82, 0x46, 0x0b, 0x3a, 0x77, 0x8f, + 0xc0, 0x72, 0x07, 0x2c, 0x7f, 0x9d, 0x1e, 0x86, 0x5b, 0xed, 0x27, 0x29, + 0xdf, 0x03, 0x97, 0x62, 0xef, 0x44, 0xd3, 0x5b, 0x3d, 0xdb, 0x9c, 0x5e, + 0x1b, 0x7b, 0x39, 0xb4, 0x0b, 0x6d, 0x04, 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, + 0xcf, 0xb3, 0x7a, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, + 0x00, 0x5e, 0x79, 0x65, 0x49, 0xa5, 0x76, 0x79, 0xf9, 0x05, 0x45, 0x0f, + 0xf4, 0x03, 0xbd, 0xa4, 0x7d, 0x29, 0xd5, 0xde, 0x33, 0x63, 0xd8, 0xb8, + 0xac, 0x97, 0xeb, 0x3f, 0x5e, 0x55, 0xe8, 0x7d, 0xf3, 0xe7, 0x3b, 0x5c, + 0x2d, 0x54, 0x67, 0x36, 0xd6, 0x1d, 0x46, 0xf5, 0xca, 0x2d, 0x8b, 0x3a, + 0x7e, 0xdc, 0x45, 0x38, 0x79, 0x7e, 0x65, 0x71, 0x5f, 0x1c, 0x5e, 0x79, + 0xb1, 0x40, 0xcd, 0xfe, 0xc5, 0xe1, 0xc1, 0x6b, 0x78, 0x04, 0x4e, 0x8e, + 0x79, 0xf9, 0x0a, 0xfc, 0x79, 0xb1, 0x5e, 0xb3, 0x60, 0xe3, 0x68, 0x7b, + 0xc6, 0xef, 0xcb, 0x71, 0x4c, 0xba, 0xa7, 0x79, 0x5c, 0x7a, 0x81, 0xd1, + 0x71, 0xe7, 0x00, 0x21, 0x13, 0xe2, 0x55, 0x69, 0x0e, 0x75, 0xbe, 0x09, + 0xc3, 0x4f, 0xa9, 0xc9, 0x68, 0x22, 0x0e, 0x97, 0x8d, 0x89, 0x6e, 0xf1, + 0xe8, 0x88, 0x7a, 0xd1, 0xd9, 0x09, 0x5d, 0xd3, 0x28, 0x78, 0x25, 0x0b, + 0x1c, 0x47, 0x73, 0x25, 0xcc, 0x21, 0xb6, 0xda, 0xc6, 0x24, 0x5a, 0xd0, + 0x37, 0x14, 0x46, 0xc7, 0x94, 0x69, 0xe4, 0x43, 0x6f, 0x47, 0xde, 0x00, + 0x33, 0x4d, 0x8f, 0x95, 0x72, 0xfa, 0x68, 0x71, 0x17, 0x66, 0x12, 0x1a, + 0x87, 0x27, 0xf7, 0xef, 0x7e, 0xe0, 0x35, 0x58, 0xf2, 0x4d, 0x6f, 0x35, + 0x01, 0xaa, 0x96, 0xe2, 0x3d, 0x51, 0x13, 0x86, 0x9c, 0x79, 0xd0, 0xb7, + 0xb6, 0x64, 0xe8, 0x86, 0x65, 0x50, 0xbf, 0xcc, 0x27, 0x53, 0x1f, 0x51, + 0xd4, 0xca, 0xbe, 0xf5, 0xdd, 0x77, 0x70, 0x98, 0x0f, 0xee, 0xa8, 0x96, + 0x07, 0x5f, 0x45, 0x6a, 0x7a, 0x0d, 0x03, 0x9c, 0x4f, 0x29, 0xf6, 0x06, + 0xf3, 0x5d, 0x58, 0x6c, 0x47, 0xd0, 0x96, 0xa9, 0x03, 0x17, 0xbb, 0x4e, + 0xc9, 0x21, 0xe0, 0xac, 0xcd, 0x78, 0x78, 0xb2, 0xfe, 0x81, 0xb2, 0x51, + 0x53, 0xa6, 0x1f, 0x98, 0x45, 0x02, 0x81, 0x81, 0x00, 0xcf, 0x73, 0x8c, + 0xbe, 0x6d, 0x45, 0x2d, 0x0c, 0x0b, 0x5d, 0x5c, 0x6c, 0x75, 0x78, 0xcc, + 0x35, 0x48, 0xb6, 0x98, 0xf1, 0xb9, 0x64, 0x60, 0x8c, 0x43, 0xeb, 0x85, + 0xab, 0x04, 0xb6, 0x7d, 0x1b, 0x71, 0x75, 0x06, 0xe2, 0xda, 0x84, 0x68, + 0x2e, 0x7f, 0x4c, 0xe3, 0x73, 0xb4, 0xde, 0x51, 0x4b, 0xb6, 0x51, 0x86, + 0x7b, 0xd0, 0xe6, 0x4d, 0xf3, 0xd1, 0xcf, 0x1a, 0xfe, 0x7f, 0x3a, 0x83, + 0xba, 0xb3, 0xe1, 0xff, 0x54, 0x13, 0x93, 0xd7, 0x9c, 0x27, 0x80, 0xb7, + 0x1e, 0x64, 0x9e, 0xf7, 0x32, 0x2b, 0x46, 0x29, 0xf7, 0xf8, 0x18, 0x6c, + 0xf7, 0x4a, 0xbe, 0x4b, 0xee, 0x96, 0x90, 0x8f, 0xa2, 0x16, 0x22, 0x6a, + 0xcc, 0x48, 0x06, 0x74, 0x63, 0x43, 0x7f, 0x27, 0x22, 0x44, 0x3c, 0x2d, + 0x3b, 0x62, 0xf1, 0x1c, 0xb4, 0x27, 0x33, 0x85, 0x26, 0x60, 0x48, 0x16, + 0xcb, 0xef, 0xf8, 0xcd, 0x37, 0x02, 0x81, 0x81, 0x00, 0xce, 0x15, 0x43, + 0x6e, 0x4b, 0x0f, 0xf9, 0x3f, 0x87, 0xc3, 0x41, 0x45, 0x97, 0xb1, 0x49, + 0xc2, 0x19, 0x23, 0x87, 0xe4, 0x24, 0x1c, 0x64, 0xe5, 0x28, 0xcb, 0x43, + 0x10, 0x14, 0x14, 0x0e, 0x19, 0xcb, 0xbb, 0xdb, 0xfd, 0x11, 0x9d, 0x17, + 0x68, 0x78, 0x6d, 0x61, 0x70, 0x63, 0x3a, 0xa1, 0xb3, 0xf3, 0xa7, 0x5b, + 0x0e, 0xff, 0xb7, 0x61, 0x11, 0x54, 0x91, 0x99, 0xe5, 0x91, 0x32, 0x2d, + 0xeb, 0x3f, 0xd8, 0x3e, 0xf7, 0xd4, 0xcb, 0xd2, 0xa3, 0x41, 0xc1, 0xee, + 0xc6, 0x92, 0x13, 0xeb, 0x7f, 0x42, 0x58, 0xf4, 0xd0, 0xb2, 0x74, 0x1d, + 0x8e, 0x87, 0x46, 0xcd, 0x14, 0xb8, 0x16, 0xad, 0xb5, 0xbd, 0x0d, 0x6c, + 0x95, 0x5a, 0x16, 0xbf, 0xe9, 0x53, 0xda, 0xfb, 0xed, 0x83, 0x51, 0x67, + 0xa9, 0x55, 0xab, 0x54, 0x02, 0x95, 0x20, 0xa6, 0x68, 0x17, 0x53, 0xa8, + 0xea, 0x43, 0xe5, 0xb0, 0xa3, 0x02, 0x81, 0x80, 0x67, 0x9c, 0x32, 0x83, + 0x39, 0x57, 0xff, 0x73, 0xb0, 0x89, 0x64, 0x8b, 0xd6, 0xf0, 0x0a, 0x2d, + 0xe2, 0xaf, 0x30, 0x1c, 0x2a, 0x97, 0xf3, 0x90, 0x9a, 0xab, 0x9b, 0x0b, + 0x1b, 0x43, 0x79, 0xa0, 0xa7, 0x3d, 0xe7, 0xbe, 0x8d, 0x9c, 0xeb, 0xdb, + 0xad, 0x40, 0xdd, 0xa9, 0x00, 0x80, 0xb8, 0xe1, 0xb3, 0xa1, 0x6c, 0x25, + 0x92, 0xe4, 0x33, 0xb2, 0xbe, 0xeb, 0x4d, 0x74, 0x26, 0x5f, 0x37, 0x43, + 0x9c, 0x6c, 0x17, 0x76, 0x0a, 0x81, 0x20, 0x82, 0xa1, 0x48, 0x2c, 0x2d, + 0x45, 0xdc, 0x0f, 0x62, 0x43, 0x32, 0xbb, 0xeb, 0x59, 0x41, 0xf9, 0xca, + 0x58, 0xce, 0x4a, 0x66, 0x53, 0x54, 0xc8, 0x28, 0x10, 0x1e, 0x08, 0x71, + 0x16, 0xd8, 0x02, 0x71, 0x41, 0x58, 0xd4, 0x56, 0xcc, 0xf5, 0xb1, 0x31, + 0xa3, 0xed, 0x00, 0x85, 0x09, 0xbf, 0x35, 0x95, 0x41, 0x29, 0x40, 0x19, + 0x83, 0x35, 0x24, 0x69, 0x02, 0x81, 0x80, 0x55, 0x10, 0x0b, 0xcc, 0x3b, + 0xa9, 0x75, 0x3d, 0x16, 0xe1, 0xae, 0x50, 0x76, 0x63, 0x94, 0x49, 0x4c, + 0xad, 0x10, 0xcb, 0x47, 0x68, 0x7c, 0xf0, 0xe5, 0xdc, 0xb8, 0x6a, 0xab, + 0x8e, 0xf7, 0x9f, 0x08, 0x2c, 0x1b, 0x8a, 0xa2, 0xb9, 0x8f, 0xce, 0xec, + 0x5e, 0x61, 0xa8, 0xcd, 0x1c, 0x87, 0x60, 0x4a, 0xc3, 0x1a, 0x5f, 0xdf, + 0x87, 0x26, 0xc6, 0xcb, 0x7c, 0x69, 0xe4, 0x8b, 0x01, 0x06, 0x59, 0x22, + 0xfa, 0x34, 0x4b, 0x81, 0x87, 0x3c, 0x03, 0x6d, 0x02, 0x0a, 0x77, 0xe6, + 0x15, 0xd8, 0xcf, 0xa7, 0x68, 0x26, 0x6c, 0xfa, 0x2b, 0xd9, 0x83, 0x5a, + 0x2d, 0x0c, 0x3b, 0x70, 0x1c, 0xd4, 0x48, 0xbe, 0xa7, 0x0a, 0xd9, 0xbe, + 0xdc, 0xc3, 0x0c, 0x21, 0x33, 0xb3, 0x66, 0xff, 0x1c, 0x1b, 0xc8, 0x96, + 0x76, 0xe8, 0x6f, 0x44, 0x74, 0xbc, 0x9b, 0x1c, 0x7d, 0xc8, 0xac, 0x21, + 0xa8, 0x6e, 0x37, 0x02, 0x81, 0x80, 0x2c, 0x7c, 0xad, 0x1e, 0x75, 0xf6, + 0x69, 0x1d, 0xe7, 0xa6, 0xca, 0x74, 0x7d, 0x67, 0xc8, 0x65, 0x28, 0x66, + 0xc4, 0x43, 0xa6, 0xbd, 0x40, 0x57, 0xae, 0xb7, 0x65, 0x2c, 0x52, 0xf9, + 0xe4, 0xc7, 0x81, 0x7b, 0x56, 0xa3, 0xd2, 0x0d, 0xe8, 0x33, 0x70, 0xcf, + 0x06, 0x84, 0xb3, 0x4e, 0x44, 0x50, 0x75, 0x61, 0x96, 0x86, 0x4b, 0xb6, + 0x2b, 0xad, 0xf0, 0xad, 0x57, 0xd0, 0x37, 0x0d, 0x1d, 0x35, 0x50, 0xcb, + 0x69, 0x22, 0x39, 0x29, 0xb9, 0x3a, 0xd3, 0x29, 0x23, 0x02, 0x60, 0xf7, + 0xab, 0x30, 0x40, 0xda, 0x8e, 0x4d, 0x45, 0x70, 0x26, 0xf4, 0xa2, 0x0d, + 0xd0, 0x64, 0x5d, 0x47, 0x3c, 0x18, 0xf4, 0xd4, 0x52, 0x95, 0x00, 0xae, + 0x84, 0x6b, 0x47, 0xb2, 0x3c, 0x82, 0xd3, 0x72, 0x53, 0xde, 0x72, 0x2c, + 0xf7, 0xc1, 0x22, 0x36, 0xd9, 0x18, 0x56, 0xfe, 0x39, 0x28, 0x33, 0xe0, + 0xdb, 0x03}; static const unsigned char kTestRsaPublicKey2_2048[] = { - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xa7, 0x00, 0x36, 0x60, 0x65, 0xdc, 0xbd, - 0x54, 0x5a, 0x2a, 0x40, 0xb4, 0xe1, 0x15, 0x94, - 0x58, 0x11, 0x4f, 0x94, 0x58, 0xdd, 0xde, 0xa7, - 0x1f, 0x3c, 0x2c, 0xe0, 0x88, 0x09, 0x29, 0x61, - 0x57, 0x67, 0x5e, 0x56, 0x7e, 0xee, 0x27, 0x8f, - 0x59, 0x34, 0x9a, 0x2a, 0xaa, 0x9d, 0xb4, 0x4e, - 0xfa, 0xa7, 0x6a, 0xd4, 0xc9, 0x7a, 0x53, 0xc1, - 0x4e, 0x9f, 0xe3, 0x34, 0xf7, 0x3d, 0xb7, 0xc9, - 0x10, 0x47, 0x4f, 0x28, 0xda, 0x3f, 0xce, 0x31, - 0x7b, 0xfd, 0x06, 0x10, 0xeb, 0xf7, 0xbe, 0x92, - 0xf9, 0xaf, 0xfb, 0x3e, 0x68, 0xda, 0xee, 0x1a, - 0x64, 0x4c, 0xf3, 0x29, 0xf2, 0x73, 0x9e, 0x39, - 0xd8, 0xf6, 0x6f, 0xd8, 0xb2, 0x80, 0x82, 0x71, - 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, 0x3e, 0xcd, 0x0a, - 0xca, 0xb6, 0x04, 0xcd, 0x9a, 0x13, 0x8b, 0x54, - 0x73, 0x54, 0x25, 0x54, 0x8c, 0xbe, 0x98, 0x7a, - 0x67, 0xad, 0xda, 0xb3, 0x4e, 0xb3, 0xfa, 0x82, - 0xa8, 0x4a, 0x67, 0x98, 0x56, 0x57, 0x54, 0x71, - 0xcd, 0x12, 0x7f, 0xed, 0xa3, 0x01, 0xc0, 0x6a, - 0x8b, 0x24, 0x03, 0x96, 0x88, 0xbe, 0x97, 0x66, - 0x2a, 0xbc, 0x53, 0xc9, 0x83, 0x06, 0x51, 0x5a, - 0x88, 0x65, 0x13, 0x18, 0xe4, 0x3a, 0xed, 0x6b, - 0xf1, 0x61, 0x5b, 0x4c, 0xc8, 0x1e, 0xf4, 0xc2, - 0xae, 0x08, 0x5e, 0x2d, 0x5f, 0xf8, 0x12, 0x7f, - 0xa2, 0xfc, 0xbb, 0x21, 0x18, 0x30, 0xda, 0xfe, - 0x40, 0xfb, 0x01, 0xca, 0x2e, 0x37, 0x0e, 0xce, - 0xdd, 0x76, 0x87, 0x82, 0x46, 0x0b, 0x3a, 0x77, - 0x8f, 0xc0, 0x72, 0x07, 0x2c, 0x7f, 0x9d, 0x1e, - 0x86, 0x5b, 0xed, 0x27, 0x29, 0xdf, 0x03, 0x97, - 0x62, 0xef, 0x44, 0xd3, 0x5b, 0x3d, 0xdb, 0x9c, - 0x5e, 0x1b, 0x7b, 0x39, 0xb4, 0x0b, 0x6d, 0x04, - 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, 0xcf, 0xb3, 0x7a, - 0x05, 0x02, 0x03, 0x01, 0x00, 0x01 }; + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa7, 0x00, 0x36, + 0x60, 0x65, 0xdc, 0xbd, 0x54, 0x5a, 0x2a, 0x40, 0xb4, 0xe1, 0x15, 0x94, + 0x58, 0x11, 0x4f, 0x94, 0x58, 0xdd, 0xde, 0xa7, 0x1f, 0x3c, 0x2c, 0xe0, + 0x88, 0x09, 0x29, 0x61, 0x57, 0x67, 0x5e, 0x56, 0x7e, 0xee, 0x27, 0x8f, + 0x59, 0x34, 0x9a, 0x2a, 0xaa, 0x9d, 0xb4, 0x4e, 0xfa, 0xa7, 0x6a, 0xd4, + 0xc9, 0x7a, 0x53, 0xc1, 0x4e, 0x9f, 0xe3, 0x34, 0xf7, 0x3d, 0xb7, 0xc9, + 0x10, 0x47, 0x4f, 0x28, 0xda, 0x3f, 0xce, 0x31, 0x7b, 0xfd, 0x06, 0x10, + 0xeb, 0xf7, 0xbe, 0x92, 0xf9, 0xaf, 0xfb, 0x3e, 0x68, 0xda, 0xee, 0x1a, + 0x64, 0x4c, 0xf3, 0x29, 0xf2, 0x73, 0x9e, 0x39, 0xd8, 0xf6, 0x6f, 0xd8, + 0xb2, 0x80, 0x82, 0x71, 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, 0x3e, 0xcd, 0x0a, + 0xca, 0xb6, 0x04, 0xcd, 0x9a, 0x13, 0x8b, 0x54, 0x73, 0x54, 0x25, 0x54, + 0x8c, 0xbe, 0x98, 0x7a, 0x67, 0xad, 0xda, 0xb3, 0x4e, 0xb3, 0xfa, 0x82, + 0xa8, 0x4a, 0x67, 0x98, 0x56, 0x57, 0x54, 0x71, 0xcd, 0x12, 0x7f, 0xed, + 0xa3, 0x01, 0xc0, 0x6a, 0x8b, 0x24, 0x03, 0x96, 0x88, 0xbe, 0x97, 0x66, + 0x2a, 0xbc, 0x53, 0xc9, 0x83, 0x06, 0x51, 0x5a, 0x88, 0x65, 0x13, 0x18, + 0xe4, 0x3a, 0xed, 0x6b, 0xf1, 0x61, 0x5b, 0x4c, 0xc8, 0x1e, 0xf4, 0xc2, + 0xae, 0x08, 0x5e, 0x2d, 0x5f, 0xf8, 0x12, 0x7f, 0xa2, 0xfc, 0xbb, 0x21, + 0x18, 0x30, 0xda, 0xfe, 0x40, 0xfb, 0x01, 0xca, 0x2e, 0x37, 0x0e, 0xce, + 0xdd, 0x76, 0x87, 0x82, 0x46, 0x0b, 0x3a, 0x77, 0x8f, 0xc0, 0x72, 0x07, + 0x2c, 0x7f, 0x9d, 0x1e, 0x86, 0x5b, 0xed, 0x27, 0x29, 0xdf, 0x03, 0x97, + 0x62, 0xef, 0x44, 0xd3, 0x5b, 0x3d, 0xdb, 0x9c, 0x5e, 0x1b, 0x7b, 0x39, + 0xb4, 0x0b, 0x6d, 0x04, 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, 0xcf, 0xb3, 0x7a, + 0x05, 0x02, 0x03, 0x01, 0x00, 0x01}; static const unsigned char kTestRsaPrivateKey3_2048[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xa5, 0xd0, 0xd7, 0x3e, - 0x0e, 0x2d, 0xfb, 0x43, 0x51, 0x99, 0xea, 0x40, - 0x1e, 0x2d, 0x89, 0xe4, 0xa2, 0x3e, 0xfc, 0x51, - 0x3d, 0x0e, 0x83, 0xa7, 0xe0, 0xa5, 0x41, 0x04, - 0x1e, 0x14, 0xc5, 0xa7, 0x5c, 0x61, 0x36, 0x44, - 0xb3, 0x08, 0x05, 0x5b, 0x14, 0xde, 0x01, 0x0c, - 0x32, 0x3c, 0x9a, 0x91, 0x00, 0x50, 0xa8, 0x1d, - 0xcc, 0x9f, 0x8f, 0x35, 0xb7, 0xc2, 0x75, 0x08, - 0x32, 0x8b, 0x10, 0x3a, 0x86, 0xf9, 0xd7, 0x78, - 0xa3, 0x9d, 0x74, 0x10, 0xc6, 0x24, 0xb1, 0x7f, - 0xa5, 0xbf, 0x5f, 0xc2, 0xd7, 0x15, 0xa3, 0x1d, - 0xe0, 0x15, 0x6b, 0x1b, 0x0e, 0x38, 0xba, 0x34, - 0xbc, 0x95, 0x47, 0x94, 0x40, 0x70, 0xac, 0x99, - 0x1f, 0x0b, 0x8e, 0x56, 0x93, 0x36, 0x2b, 0x6d, - 0x04, 0xe7, 0x95, 0x1a, 0x37, 0xda, 0x16, 0x57, - 0x99, 0xee, 0x03, 0x68, 0x16, 0x31, 0xaa, 0xc3, - 0xb7, 0x92, 0x75, 0x53, 0xfc, 0xf6, 0x20, 0x55, - 0x44, 0xf8, 0xd4, 0x8d, 0x78, 0x15, 0xc7, 0x1a, - 0xb6, 0xde, 0x6c, 0xe8, 0x49, 0x5d, 0xaf, 0xa8, - 0x4e, 0x6f, 0x7c, 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, - 0x8c, 0x8f, 0x0b, 0x5d, 0x3a, 0x09, 0xd6, 0xb3, - 0x44, 0xab, 0xe0, 0x35, 0x52, 0x7c, 0x66, 0x85, - 0xa4, 0x40, 0xd7, 0x20, 0xec, 0x24, 0x05, 0x06, - 0xd9, 0x84, 0x51, 0x5a, 0xd2, 0x38, 0xd5, 0x1d, - 0xea, 0x70, 0x2a, 0x21, 0xe6, 0x82, 0xfd, 0xa4, - 0x46, 0x1c, 0x4f, 0x59, 0x6e, 0x29, 0x3d, 0xae, - 0xb8, 0x8e, 0xee, 0x77, 0x1f, 0x15, 0x33, 0xcf, - 0x94, 0x1d, 0x87, 0x3c, 0x37, 0xc5, 0x89, 0xe8, - 0x7d, 0x85, 0xb3, 0xbc, 0xe8, 0x62, 0x6a, 0x84, - 0x7f, 0xfe, 0x9a, 0x85, 0x3f, 0x39, 0xe8, 0xaa, - 0x16, 0xa6, 0x8f, 0x87, 0x7f, 0xcb, 0xc1, 0xd6, - 0xf2, 0xec, 0x2b, 0xa7, 0xdd, 0x49, 0x98, 0x7b, - 0x6f, 0xdd, 0x69, 0x6d, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x00, 0x43, 0x8f, 0x19, - 0x83, 0xb1, 0x27, 0x4e, 0xee, 0x98, 0xba, 0xcb, - 0x54, 0xa0, 0x77, 0x11, 0x6d, 0xd4, 0x25, 0x31, - 0x8c, 0xb0, 0x01, 0xcf, 0xe6, 0x80, 0x83, 0x14, - 0x40, 0x67, 0x39, 0x33, 0x67, 0x03, 0x1e, 0xa0, - 0x8b, 0xd1, 0x1d, 0xfd, 0x80, 0xa4, 0xb9, 0xe7, - 0x57, 0x5e, 0xc8, 0x8e, 0x79, 0x71, 0xd5, 0x6b, - 0x09, 0xe9, 0x2b, 0x41, 0xa0, 0x33, 0x64, 0xc9, - 0x66, 0x33, 0xa1, 0xb1, 0x55, 0x07, 0x55, 0x98, - 0x53, 0x10, 0xe6, 0xc0, 0x39, 0x6d, 0x61, 0xd9, - 0xe8, 0x16, 0x52, 0x28, 0xe4, 0x2b, 0xda, 0x27, - 0x01, 0xaf, 0x21, 0x4a, 0xe8, 0x55, 0x1d, 0x0b, - 0xd1, 0x1c, 0xdc, 0xfd, 0xb3, 0x0b, 0xa6, 0x5c, - 0xcc, 0x6e, 0x77, 0xb8, 0xe0, 0xd1, 0x4e, 0x0a, - 0xd7, 0x7a, 0x5e, 0x18, 0xc3, 0xfb, 0xe9, 0xa1, - 0x9c, 0xc3, 0x9c, 0xd4, 0x4a, 0x7e, 0x70, 0x72, - 0x11, 0x18, 0x24, 0x56, 0x24, 0xdf, 0xf8, 0xba, - 0xac, 0x5b, 0x54, 0xd3, 0xc4, 0x65, 0x69, 0xc8, - 0x79, 0x94, 0x16, 0x88, 0x9a, 0x68, 0x1c, 0xbc, - 0xd4, 0xca, 0xec, 0x5e, 0x07, 0x4a, 0xc9, 0x54, - 0x7a, 0x4b, 0xdb, 0x19, 0x88, 0xf6, 0xbe, 0x50, - 0x9d, 0x9e, 0x9d, 0x88, 0x5b, 0x4a, 0x23, 0x86, - 0x2b, 0xa9, 0xa6, 0x6c, 0x70, 0x7d, 0xe1, 0x11, - 0xba, 0xbf, 0x03, 0x2e, 0xf1, 0x46, 0x7e, 0x1b, - 0xed, 0x06, 0x11, 0x57, 0xad, 0x4a, 0xcb, 0xe5, - 0xb1, 0x11, 0x05, 0x0a, 0x30, 0xb1, 0x73, 0x79, - 0xcd, 0x7a, 0x04, 0xcc, 0x70, 0xe9, 0x95, 0xe4, - 0x27, 0xc2, 0xd5, 0x2d, 0x92, 0x44, 0xdf, 0xb4, - 0x94, 0xa8, 0x73, 0xa1, 0x4a, 0xc3, 0xcc, 0xc4, - 0x0e, 0x8d, 0xa1, 0x6a, 0xc2, 0xd8, 0x03, 0x7f, - 0xfa, 0xa7, 0x76, 0x0d, 0xad, 0x87, 0x88, 0xa0, - 0x77, 0xaf, 0x3b, 0x23, 0xd1, 0x66, 0x0b, 0x31, - 0x2b, 0xaf, 0xef, 0xd5, 0x41, 0x02, 0x81, 0x81, - 0x00, 0xdb, 0xc1, 0xe7, 0xdd, 0xba, 0x3c, 0x1f, - 0x9c, 0x64, 0xca, 0xa0, 0x63, 0xdb, 0xd2, 0x47, - 0x5c, 0x6e, 0x8a, 0xa3, 0x16, 0xd5, 0xda, 0xc2, - 0x25, 0x64, 0x0a, 0x02, 0xbc, 0x7d, 0x7f, 0x50, - 0xab, 0xe0, 0x66, 0x03, 0x53, 0x7d, 0x77, 0x6d, - 0x6c, 0x61, 0x58, 0x09, 0x73, 0xcd, 0x18, 0xe9, - 0x53, 0x0b, 0x5c, 0xa2, 0x71, 0x14, 0x02, 0xfd, - 0x55, 0xda, 0xe9, 0x77, 0x24, 0x7c, 0x2a, 0x4e, - 0xb9, 0xd9, 0x5d, 0x58, 0xf6, 0x26, 0xd0, 0xd8, - 0x3d, 0xcf, 0x8c, 0x89, 0x65, 0x6c, 0x35, 0x19, - 0xb6, 0x63, 0xff, 0xa0, 0x71, 0x49, 0xcd, 0x6d, - 0x5b, 0x3d, 0x8f, 0xea, 0x6f, 0xa9, 0xba, 0x43, - 0xe5, 0xdd, 0x39, 0x3a, 0x78, 0x8f, 0x07, 0xb8, - 0xab, 0x58, 0x07, 0xb7, 0xd2, 0xf8, 0x07, 0x02, - 0x9b, 0x79, 0x26, 0x32, 0x22, 0x38, 0x91, 0x01, - 0x90, 0x81, 0x29, 0x94, 0xad, 0x77, 0xeb, 0x86, - 0xb9, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x29, 0x88, - 0xbd, 0x96, 0x31, 0x33, 0x7b, 0x77, 0x5d, 0x32, - 0x12, 0x5e, 0xdf, 0x28, 0x0c, 0x96, 0x0d, 0xa8, - 0x22, 0xdf, 0xd3, 0x35, 0xd7, 0xb0, 0x41, 0xcb, - 0xe7, 0x94, 0x8a, 0xa4, 0xed, 0xd2, 0xfb, 0xd2, - 0xf3, 0xf2, 0x95, 0xff, 0xd8, 0x33, 0x3f, 0x8c, - 0xd7, 0x65, 0xe4, 0x0c, 0xcc, 0xfe, 0x32, 0x66, - 0xfa, 0x50, 0xe2, 0xcf, 0xf0, 0xbe, 0x05, 0xb1, - 0xbc, 0xbe, 0x44, 0x09, 0xb4, 0xfe, 0x95, 0x06, - 0x18, 0xd7, 0x59, 0xc6, 0xef, 0x2d, 0x22, 0xa0, - 0x73, 0x5e, 0x77, 0xdf, 0x8d, 0x09, 0x2c, 0xb8, - 0xcc, 0xeb, 0x10, 0x4d, 0xa7, 0xd0, 0x4b, 0x46, - 0xba, 0x7d, 0x8b, 0x6a, 0x55, 0x47, 0x55, 0xd3, - 0xd7, 0xb1, 0x88, 0xfd, 0x27, 0x3e, 0xf9, 0x5b, - 0x7b, 0xae, 0x6d, 0x08, 0x9f, 0x0c, 0x2a, 0xe1, - 0xdd, 0xb9, 0xe3, 0x55, 0x13, 0x55, 0xa3, 0x6d, - 0x06, 0xbb, 0xe0, 0x1e, 0x55, 0x02, 0x81, 0x80, - 0x61, 0x73, 0x3d, 0x64, 0xff, 0xdf, 0x05, 0x8d, - 0x8e, 0xcc, 0xa4, 0x0f, 0x64, 0x3d, 0x7d, 0x53, - 0xa9, 0xd9, 0x64, 0xb5, 0x0d, 0xa4, 0x72, 0x8f, - 0xae, 0x2b, 0x1a, 0x47, 0x87, 0xc7, 0x5b, 0x78, - 0xbc, 0x8b, 0xc0, 0x51, 0xd7, 0xc3, 0x8c, 0x0c, - 0x91, 0xa6, 0x3e, 0x9a, 0xd1, 0x8a, 0x88, 0x7d, - 0x40, 0xfe, 0x95, 0x32, 0x5b, 0xd3, 0x6f, 0x90, - 0x11, 0x01, 0x92, 0xc9, 0xe5, 0x1d, 0xc5, 0xc7, - 0x78, 0x72, 0x82, 0xae, 0xb5, 0x4b, 0xcb, 0x78, - 0xad, 0x7e, 0xfe, 0xb6, 0xb1, 0x23, 0x63, 0x01, - 0x94, 0x9a, 0x99, 0x05, 0x63, 0xda, 0xea, 0xf1, - 0x98, 0xfd, 0x26, 0xd2, 0xd9, 0x8b, 0x35, 0xec, - 0xcb, 0x0b, 0x43, 0xb8, 0x8e, 0x84, 0xb8, 0x09, - 0x93, 0x81, 0xe8, 0xac, 0x6f, 0x3c, 0x7c, 0x95, - 0x81, 0x45, 0xc4, 0xd9, 0x94, 0x08, 0x09, 0x8f, - 0x91, 0x17, 0x65, 0x4c, 0xff, 0x6e, 0xbc, 0x51, - 0x02, 0x81, 0x81, 0x00, 0xc1, 0x0d, 0x9d, 0xd8, - 0xbd, 0xaf, 0x56, 0xe0, 0xe3, 0x1f, 0x85, 0xd7, - 0xce, 0x72, 0x02, 0x38, 0xf2, 0x0f, 0x9c, 0x27, - 0x9e, 0xc4, 0x1d, 0x60, 0x00, 0x8d, 0x02, 0x19, - 0xe5, 0xdf, 0xdb, 0x8e, 0xc5, 0xfb, 0x61, 0x8e, - 0xe6, 0xb8, 0xfc, 0x07, 0x3c, 0xd1, 0x1b, 0x16, - 0x7c, 0x83, 0x3c, 0x37, 0xf5, 0x26, 0xb2, 0xbd, - 0x22, 0xf2, 0x4d, 0x19, 0x33, 0x11, 0xc5, 0xdd, - 0xf9, 0xdb, 0x4e, 0x48, 0x52, 0xd8, 0xe6, 0x4b, - 0x15, 0x90, 0x68, 0xbe, 0xca, 0xc1, 0x7c, 0xd3, - 0x51, 0x6b, 0x45, 0x46, 0x54, 0x11, 0x1a, 0x71, - 0xd3, 0xcd, 0x6b, 0x8f, 0x79, 0x22, 0x83, 0x02, - 0x08, 0x4f, 0xba, 0x6a, 0x98, 0xed, 0x32, 0xd8, - 0xb4, 0x5b, 0x51, 0x88, 0x53, 0xec, 0x2c, 0x7e, - 0xa4, 0x89, 0xdc, 0xbf, 0xf9, 0x0d, 0x32, 0xc8, - 0xc3, 0xec, 0x6d, 0x2e, 0xf1, 0xbc, 0x70, 0x4e, - 0xf6, 0x9e, 0xbc, 0x31, 0x02, 0x81, 0x81, 0x00, - 0xd3, 0x35, 0x1b, 0x19, 0x75, 0x3f, 0x61, 0xf2, - 0x55, 0x03, 0xce, 0x25, 0xa9, 0xdf, 0x0c, 0x0a, - 0x3b, 0x47, 0x42, 0xdc, 0x38, 0x4b, 0x13, 0x4d, - 0x1f, 0x86, 0x58, 0x4f, 0xd8, 0xee, 0xfa, 0x76, - 0x15, 0xfb, 0x6e, 0x55, 0x31, 0xf2, 0xd2, 0x62, - 0x32, 0xa5, 0xc4, 0x23, 0x5e, 0x08, 0xa9, 0x83, - 0x07, 0xac, 0x8c, 0xa3, 0x7e, 0x18, 0xc0, 0x1c, - 0x57, 0x63, 0x8d, 0x05, 0x17, 0x47, 0x1b, 0xd3, - 0x74, 0x73, 0x20, 0x04, 0xfb, 0xc8, 0x1a, 0x43, - 0x04, 0x36, 0xc8, 0x19, 0xbe, 0xdc, 0xa6, 0xe5, - 0x0f, 0x25, 0x62, 0x24, 0x96, 0x92, 0xb6, 0xb3, - 0x97, 0xad, 0x57, 0x9a, 0x90, 0x37, 0x4e, 0x31, - 0x44, 0x74, 0xfa, 0x7c, 0xb4, 0xea, 0xfc, 0x15, - 0xa7, 0xb0, 0x51, 0xcc, 0xee, 0x1e, 0xed, 0x5b, - 0x98, 0x18, 0x0e, 0x65, 0xb6, 0x4b, 0x69, 0x0b, - 0x21, 0xdc, 0x86, 0x17, 0x6e, 0xc8, 0xee, 0x24 }; + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa5, 0xd0, 0xd7, 0x3e, 0x0e, 0x2d, 0xfb, 0x43, 0x51, 0x99, 0xea, 0x40, + 0x1e, 0x2d, 0x89, 0xe4, 0xa2, 0x3e, 0xfc, 0x51, 0x3d, 0x0e, 0x83, 0xa7, + 0xe0, 0xa5, 0x41, 0x04, 0x1e, 0x14, 0xc5, 0xa7, 0x5c, 0x61, 0x36, 0x44, + 0xb3, 0x08, 0x05, 0x5b, 0x14, 0xde, 0x01, 0x0c, 0x32, 0x3c, 0x9a, 0x91, + 0x00, 0x50, 0xa8, 0x1d, 0xcc, 0x9f, 0x8f, 0x35, 0xb7, 0xc2, 0x75, 0x08, + 0x32, 0x8b, 0x10, 0x3a, 0x86, 0xf9, 0xd7, 0x78, 0xa3, 0x9d, 0x74, 0x10, + 0xc6, 0x24, 0xb1, 0x7f, 0xa5, 0xbf, 0x5f, 0xc2, 0xd7, 0x15, 0xa3, 0x1d, + 0xe0, 0x15, 0x6b, 0x1b, 0x0e, 0x38, 0xba, 0x34, 0xbc, 0x95, 0x47, 0x94, + 0x40, 0x70, 0xac, 0x99, 0x1f, 0x0b, 0x8e, 0x56, 0x93, 0x36, 0x2b, 0x6d, + 0x04, 0xe7, 0x95, 0x1a, 0x37, 0xda, 0x16, 0x57, 0x99, 0xee, 0x03, 0x68, + 0x16, 0x31, 0xaa, 0xc3, 0xb7, 0x92, 0x75, 0x53, 0xfc, 0xf6, 0x20, 0x55, + 0x44, 0xf8, 0xd4, 0x8d, 0x78, 0x15, 0xc7, 0x1a, 0xb6, 0xde, 0x6c, 0xe8, + 0x49, 0x5d, 0xaf, 0xa8, 0x4e, 0x6f, 0x7c, 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, + 0x8c, 0x8f, 0x0b, 0x5d, 0x3a, 0x09, 0xd6, 0xb3, 0x44, 0xab, 0xe0, 0x35, + 0x52, 0x7c, 0x66, 0x85, 0xa4, 0x40, 0xd7, 0x20, 0xec, 0x24, 0x05, 0x06, + 0xd9, 0x84, 0x51, 0x5a, 0xd2, 0x38, 0xd5, 0x1d, 0xea, 0x70, 0x2a, 0x21, + 0xe6, 0x82, 0xfd, 0xa4, 0x46, 0x1c, 0x4f, 0x59, 0x6e, 0x29, 0x3d, 0xae, + 0xb8, 0x8e, 0xee, 0x77, 0x1f, 0x15, 0x33, 0xcf, 0x94, 0x1d, 0x87, 0x3c, + 0x37, 0xc5, 0x89, 0xe8, 0x7d, 0x85, 0xb3, 0xbc, 0xe8, 0x62, 0x6a, 0x84, + 0x7f, 0xfe, 0x9a, 0x85, 0x3f, 0x39, 0xe8, 0xaa, 0x16, 0xa6, 0x8f, 0x87, + 0x7f, 0xcb, 0xc1, 0xd6, 0xf2, 0xec, 0x2b, 0xa7, 0xdd, 0x49, 0x98, 0x7b, + 0x6f, 0xdd, 0x69, 0x6d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, + 0x00, 0x43, 0x8f, 0x19, 0x83, 0xb1, 0x27, 0x4e, 0xee, 0x98, 0xba, 0xcb, + 0x54, 0xa0, 0x77, 0x11, 0x6d, 0xd4, 0x25, 0x31, 0x8c, 0xb0, 0x01, 0xcf, + 0xe6, 0x80, 0x83, 0x14, 0x40, 0x67, 0x39, 0x33, 0x67, 0x03, 0x1e, 0xa0, + 0x8b, 0xd1, 0x1d, 0xfd, 0x80, 0xa4, 0xb9, 0xe7, 0x57, 0x5e, 0xc8, 0x8e, + 0x79, 0x71, 0xd5, 0x6b, 0x09, 0xe9, 0x2b, 0x41, 0xa0, 0x33, 0x64, 0xc9, + 0x66, 0x33, 0xa1, 0xb1, 0x55, 0x07, 0x55, 0x98, 0x53, 0x10, 0xe6, 0xc0, + 0x39, 0x6d, 0x61, 0xd9, 0xe8, 0x16, 0x52, 0x28, 0xe4, 0x2b, 0xda, 0x27, + 0x01, 0xaf, 0x21, 0x4a, 0xe8, 0x55, 0x1d, 0x0b, 0xd1, 0x1c, 0xdc, 0xfd, + 0xb3, 0x0b, 0xa6, 0x5c, 0xcc, 0x6e, 0x77, 0xb8, 0xe0, 0xd1, 0x4e, 0x0a, + 0xd7, 0x7a, 0x5e, 0x18, 0xc3, 0xfb, 0xe9, 0xa1, 0x9c, 0xc3, 0x9c, 0xd4, + 0x4a, 0x7e, 0x70, 0x72, 0x11, 0x18, 0x24, 0x56, 0x24, 0xdf, 0xf8, 0xba, + 0xac, 0x5b, 0x54, 0xd3, 0xc4, 0x65, 0x69, 0xc8, 0x79, 0x94, 0x16, 0x88, + 0x9a, 0x68, 0x1c, 0xbc, 0xd4, 0xca, 0xec, 0x5e, 0x07, 0x4a, 0xc9, 0x54, + 0x7a, 0x4b, 0xdb, 0x19, 0x88, 0xf6, 0xbe, 0x50, 0x9d, 0x9e, 0x9d, 0x88, + 0x5b, 0x4a, 0x23, 0x86, 0x2b, 0xa9, 0xa6, 0x6c, 0x70, 0x7d, 0xe1, 0x11, + 0xba, 0xbf, 0x03, 0x2e, 0xf1, 0x46, 0x7e, 0x1b, 0xed, 0x06, 0x11, 0x57, + 0xad, 0x4a, 0xcb, 0xe5, 0xb1, 0x11, 0x05, 0x0a, 0x30, 0xb1, 0x73, 0x79, + 0xcd, 0x7a, 0x04, 0xcc, 0x70, 0xe9, 0x95, 0xe4, 0x27, 0xc2, 0xd5, 0x2d, + 0x92, 0x44, 0xdf, 0xb4, 0x94, 0xa8, 0x73, 0xa1, 0x4a, 0xc3, 0xcc, 0xc4, + 0x0e, 0x8d, 0xa1, 0x6a, 0xc2, 0xd8, 0x03, 0x7f, 0xfa, 0xa7, 0x76, 0x0d, + 0xad, 0x87, 0x88, 0xa0, 0x77, 0xaf, 0x3b, 0x23, 0xd1, 0x66, 0x0b, 0x31, + 0x2b, 0xaf, 0xef, 0xd5, 0x41, 0x02, 0x81, 0x81, 0x00, 0xdb, 0xc1, 0xe7, + 0xdd, 0xba, 0x3c, 0x1f, 0x9c, 0x64, 0xca, 0xa0, 0x63, 0xdb, 0xd2, 0x47, + 0x5c, 0x6e, 0x8a, 0xa3, 0x16, 0xd5, 0xda, 0xc2, 0x25, 0x64, 0x0a, 0x02, + 0xbc, 0x7d, 0x7f, 0x50, 0xab, 0xe0, 0x66, 0x03, 0x53, 0x7d, 0x77, 0x6d, + 0x6c, 0x61, 0x58, 0x09, 0x73, 0xcd, 0x18, 0xe9, 0x53, 0x0b, 0x5c, 0xa2, + 0x71, 0x14, 0x02, 0xfd, 0x55, 0xda, 0xe9, 0x77, 0x24, 0x7c, 0x2a, 0x4e, + 0xb9, 0xd9, 0x5d, 0x58, 0xf6, 0x26, 0xd0, 0xd8, 0x3d, 0xcf, 0x8c, 0x89, + 0x65, 0x6c, 0x35, 0x19, 0xb6, 0x63, 0xff, 0xa0, 0x71, 0x49, 0xcd, 0x6d, + 0x5b, 0x3d, 0x8f, 0xea, 0x6f, 0xa9, 0xba, 0x43, 0xe5, 0xdd, 0x39, 0x3a, + 0x78, 0x8f, 0x07, 0xb8, 0xab, 0x58, 0x07, 0xb7, 0xd2, 0xf8, 0x07, 0x02, + 0x9b, 0x79, 0x26, 0x32, 0x22, 0x38, 0x91, 0x01, 0x90, 0x81, 0x29, 0x94, + 0xad, 0x77, 0xeb, 0x86, 0xb9, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x29, 0x88, + 0xbd, 0x96, 0x31, 0x33, 0x7b, 0x77, 0x5d, 0x32, 0x12, 0x5e, 0xdf, 0x28, + 0x0c, 0x96, 0x0d, 0xa8, 0x22, 0xdf, 0xd3, 0x35, 0xd7, 0xb0, 0x41, 0xcb, + 0xe7, 0x94, 0x8a, 0xa4, 0xed, 0xd2, 0xfb, 0xd2, 0xf3, 0xf2, 0x95, 0xff, + 0xd8, 0x33, 0x3f, 0x8c, 0xd7, 0x65, 0xe4, 0x0c, 0xcc, 0xfe, 0x32, 0x66, + 0xfa, 0x50, 0xe2, 0xcf, 0xf0, 0xbe, 0x05, 0xb1, 0xbc, 0xbe, 0x44, 0x09, + 0xb4, 0xfe, 0x95, 0x06, 0x18, 0xd7, 0x59, 0xc6, 0xef, 0x2d, 0x22, 0xa0, + 0x73, 0x5e, 0x77, 0xdf, 0x8d, 0x09, 0x2c, 0xb8, 0xcc, 0xeb, 0x10, 0x4d, + 0xa7, 0xd0, 0x4b, 0x46, 0xba, 0x7d, 0x8b, 0x6a, 0x55, 0x47, 0x55, 0xd3, + 0xd7, 0xb1, 0x88, 0xfd, 0x27, 0x3e, 0xf9, 0x5b, 0x7b, 0xae, 0x6d, 0x08, + 0x9f, 0x0c, 0x2a, 0xe1, 0xdd, 0xb9, 0xe3, 0x55, 0x13, 0x55, 0xa3, 0x6d, + 0x06, 0xbb, 0xe0, 0x1e, 0x55, 0x02, 0x81, 0x80, 0x61, 0x73, 0x3d, 0x64, + 0xff, 0xdf, 0x05, 0x8d, 0x8e, 0xcc, 0xa4, 0x0f, 0x64, 0x3d, 0x7d, 0x53, + 0xa9, 0xd9, 0x64, 0xb5, 0x0d, 0xa4, 0x72, 0x8f, 0xae, 0x2b, 0x1a, 0x47, + 0x87, 0xc7, 0x5b, 0x78, 0xbc, 0x8b, 0xc0, 0x51, 0xd7, 0xc3, 0x8c, 0x0c, + 0x91, 0xa6, 0x3e, 0x9a, 0xd1, 0x8a, 0x88, 0x7d, 0x40, 0xfe, 0x95, 0x32, + 0x5b, 0xd3, 0x6f, 0x90, 0x11, 0x01, 0x92, 0xc9, 0xe5, 0x1d, 0xc5, 0xc7, + 0x78, 0x72, 0x82, 0xae, 0xb5, 0x4b, 0xcb, 0x78, 0xad, 0x7e, 0xfe, 0xb6, + 0xb1, 0x23, 0x63, 0x01, 0x94, 0x9a, 0x99, 0x05, 0x63, 0xda, 0xea, 0xf1, + 0x98, 0xfd, 0x26, 0xd2, 0xd9, 0x8b, 0x35, 0xec, 0xcb, 0x0b, 0x43, 0xb8, + 0x8e, 0x84, 0xb8, 0x09, 0x93, 0x81, 0xe8, 0xac, 0x6f, 0x3c, 0x7c, 0x95, + 0x81, 0x45, 0xc4, 0xd9, 0x94, 0x08, 0x09, 0x8f, 0x91, 0x17, 0x65, 0x4c, + 0xff, 0x6e, 0xbc, 0x51, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x0d, 0x9d, 0xd8, + 0xbd, 0xaf, 0x56, 0xe0, 0xe3, 0x1f, 0x85, 0xd7, 0xce, 0x72, 0x02, 0x38, + 0xf2, 0x0f, 0x9c, 0x27, 0x9e, 0xc4, 0x1d, 0x60, 0x00, 0x8d, 0x02, 0x19, + 0xe5, 0xdf, 0xdb, 0x8e, 0xc5, 0xfb, 0x61, 0x8e, 0xe6, 0xb8, 0xfc, 0x07, + 0x3c, 0xd1, 0x1b, 0x16, 0x7c, 0x83, 0x3c, 0x37, 0xf5, 0x26, 0xb2, 0xbd, + 0x22, 0xf2, 0x4d, 0x19, 0x33, 0x11, 0xc5, 0xdd, 0xf9, 0xdb, 0x4e, 0x48, + 0x52, 0xd8, 0xe6, 0x4b, 0x15, 0x90, 0x68, 0xbe, 0xca, 0xc1, 0x7c, 0xd3, + 0x51, 0x6b, 0x45, 0x46, 0x54, 0x11, 0x1a, 0x71, 0xd3, 0xcd, 0x6b, 0x8f, + 0x79, 0x22, 0x83, 0x02, 0x08, 0x4f, 0xba, 0x6a, 0x98, 0xed, 0x32, 0xd8, + 0xb4, 0x5b, 0x51, 0x88, 0x53, 0xec, 0x2c, 0x7e, 0xa4, 0x89, 0xdc, 0xbf, + 0xf9, 0x0d, 0x32, 0xc8, 0xc3, 0xec, 0x6d, 0x2e, 0xf1, 0xbc, 0x70, 0x4e, + 0xf6, 0x9e, 0xbc, 0x31, 0x02, 0x81, 0x81, 0x00, 0xd3, 0x35, 0x1b, 0x19, + 0x75, 0x3f, 0x61, 0xf2, 0x55, 0x03, 0xce, 0x25, 0xa9, 0xdf, 0x0c, 0x0a, + 0x3b, 0x47, 0x42, 0xdc, 0x38, 0x4b, 0x13, 0x4d, 0x1f, 0x86, 0x58, 0x4f, + 0xd8, 0xee, 0xfa, 0x76, 0x15, 0xfb, 0x6e, 0x55, 0x31, 0xf2, 0xd2, 0x62, + 0x32, 0xa5, 0xc4, 0x23, 0x5e, 0x08, 0xa9, 0x83, 0x07, 0xac, 0x8c, 0xa3, + 0x7e, 0x18, 0xc0, 0x1c, 0x57, 0x63, 0x8d, 0x05, 0x17, 0x47, 0x1b, 0xd3, + 0x74, 0x73, 0x20, 0x04, 0xfb, 0xc8, 0x1a, 0x43, 0x04, 0x36, 0xc8, 0x19, + 0xbe, 0xdc, 0xa6, 0xe5, 0x0f, 0x25, 0x62, 0x24, 0x96, 0x92, 0xb6, 0xb3, + 0x97, 0xad, 0x57, 0x9a, 0x90, 0x37, 0x4e, 0x31, 0x44, 0x74, 0xfa, 0x7c, + 0xb4, 0xea, 0xfc, 0x15, 0xa7, 0xb0, 0x51, 0xcc, 0xee, 0x1e, 0xed, 0x5b, + 0x98, 0x18, 0x0e, 0x65, 0xb6, 0x4b, 0x69, 0x0b, 0x21, 0xdc, 0x86, 0x17, + 0x6e, 0xc8, 0xee, 0x24}; static const unsigned char kTestRsaPublicKey3_2048[] = { - 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xa5, 0xd0, 0xd7, 0x3e, 0x0e, 0x2d, 0xfb, - 0x43, 0x51, 0x99, 0xea, 0x40, 0x1e, 0x2d, 0x89, - 0xe4, 0xa2, 0x3e, 0xfc, 0x51, 0x3d, 0x0e, 0x83, - 0xa7, 0xe0, 0xa5, 0x41, 0x04, 0x1e, 0x14, 0xc5, - 0xa7, 0x5c, 0x61, 0x36, 0x44, 0xb3, 0x08, 0x05, - 0x5b, 0x14, 0xde, 0x01, 0x0c, 0x32, 0x3c, 0x9a, - 0x91, 0x00, 0x50, 0xa8, 0x1d, 0xcc, 0x9f, 0x8f, - 0x35, 0xb7, 0xc2, 0x75, 0x08, 0x32, 0x8b, 0x10, - 0x3a, 0x86, 0xf9, 0xd7, 0x78, 0xa3, 0x9d, 0x74, - 0x10, 0xc6, 0x24, 0xb1, 0x7f, 0xa5, 0xbf, 0x5f, - 0xc2, 0xd7, 0x15, 0xa3, 0x1d, 0xe0, 0x15, 0x6b, - 0x1b, 0x0e, 0x38, 0xba, 0x34, 0xbc, 0x95, 0x47, - 0x94, 0x40, 0x70, 0xac, 0x99, 0x1f, 0x0b, 0x8e, - 0x56, 0x93, 0x36, 0x2b, 0x6d, 0x04, 0xe7, 0x95, - 0x1a, 0x37, 0xda, 0x16, 0x57, 0x99, 0xee, 0x03, - 0x68, 0x16, 0x31, 0xaa, 0xc3, 0xb7, 0x92, 0x75, - 0x53, 0xfc, 0xf6, 0x20, 0x55, 0x44, 0xf8, 0xd4, - 0x8d, 0x78, 0x15, 0xc7, 0x1a, 0xb6, 0xde, 0x6c, - 0xe8, 0x49, 0x5d, 0xaf, 0xa8, 0x4e, 0x6f, 0x7c, - 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, 0x8c, 0x8f, 0x0b, - 0x5d, 0x3a, 0x09, 0xd6, 0xb3, 0x44, 0xab, 0xe0, - 0x35, 0x52, 0x7c, 0x66, 0x85, 0xa4, 0x40, 0xd7, - 0x20, 0xec, 0x24, 0x05, 0x06, 0xd9, 0x84, 0x51, - 0x5a, 0xd2, 0x38, 0xd5, 0x1d, 0xea, 0x70, 0x2a, - 0x21, 0xe6, 0x82, 0xfd, 0xa4, 0x46, 0x1c, 0x4f, - 0x59, 0x6e, 0x29, 0x3d, 0xae, 0xb8, 0x8e, 0xee, - 0x77, 0x1f, 0x15, 0x33, 0xcf, 0x94, 0x1d, 0x87, - 0x3c, 0x37, 0xc5, 0x89, 0xe8, 0x7d, 0x85, 0xb3, - 0xbc, 0xe8, 0x62, 0x6a, 0x84, 0x7f, 0xfe, 0x9a, - 0x85, 0x3f, 0x39, 0xe8, 0xaa, 0x16, 0xa6, 0x8f, - 0x87, 0x7f, 0xcb, 0xc1, 0xd6, 0xf2, 0xec, 0x2b, - 0xa7, 0xdd, 0x49, 0x98, 0x7b, 0x6f, 0xdd, 0x69, - 0x6d, 0x02, 0x03, 0x01, 0x00, 0x01 }; + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0xd0, 0xd7, + 0x3e, 0x0e, 0x2d, 0xfb, 0x43, 0x51, 0x99, 0xea, 0x40, 0x1e, 0x2d, 0x89, + 0xe4, 0xa2, 0x3e, 0xfc, 0x51, 0x3d, 0x0e, 0x83, 0xa7, 0xe0, 0xa5, 0x41, + 0x04, 0x1e, 0x14, 0xc5, 0xa7, 0x5c, 0x61, 0x36, 0x44, 0xb3, 0x08, 0x05, + 0x5b, 0x14, 0xde, 0x01, 0x0c, 0x32, 0x3c, 0x9a, 0x91, 0x00, 0x50, 0xa8, + 0x1d, 0xcc, 0x9f, 0x8f, 0x35, 0xb7, 0xc2, 0x75, 0x08, 0x32, 0x8b, 0x10, + 0x3a, 0x86, 0xf9, 0xd7, 0x78, 0xa3, 0x9d, 0x74, 0x10, 0xc6, 0x24, 0xb1, + 0x7f, 0xa5, 0xbf, 0x5f, 0xc2, 0xd7, 0x15, 0xa3, 0x1d, 0xe0, 0x15, 0x6b, + 0x1b, 0x0e, 0x38, 0xba, 0x34, 0xbc, 0x95, 0x47, 0x94, 0x40, 0x70, 0xac, + 0x99, 0x1f, 0x0b, 0x8e, 0x56, 0x93, 0x36, 0x2b, 0x6d, 0x04, 0xe7, 0x95, + 0x1a, 0x37, 0xda, 0x16, 0x57, 0x99, 0xee, 0x03, 0x68, 0x16, 0x31, 0xaa, + 0xc3, 0xb7, 0x92, 0x75, 0x53, 0xfc, 0xf6, 0x20, 0x55, 0x44, 0xf8, 0xd4, + 0x8d, 0x78, 0x15, 0xc7, 0x1a, 0xb6, 0xde, 0x6c, 0xe8, 0x49, 0x5d, 0xaf, + 0xa8, 0x4e, 0x6f, 0x7c, 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, 0x8c, 0x8f, 0x0b, + 0x5d, 0x3a, 0x09, 0xd6, 0xb3, 0x44, 0xab, 0xe0, 0x35, 0x52, 0x7c, 0x66, + 0x85, 0xa4, 0x40, 0xd7, 0x20, 0xec, 0x24, 0x05, 0x06, 0xd9, 0x84, 0x51, + 0x5a, 0xd2, 0x38, 0xd5, 0x1d, 0xea, 0x70, 0x2a, 0x21, 0xe6, 0x82, 0xfd, + 0xa4, 0x46, 0x1c, 0x4f, 0x59, 0x6e, 0x29, 0x3d, 0xae, 0xb8, 0x8e, 0xee, + 0x77, 0x1f, 0x15, 0x33, 0xcf, 0x94, 0x1d, 0x87, 0x3c, 0x37, 0xc5, 0x89, + 0xe8, 0x7d, 0x85, 0xb3, 0xbc, 0xe8, 0x62, 0x6a, 0x84, 0x7f, 0xfe, 0x9a, + 0x85, 0x3f, 0x39, 0xe8, 0xaa, 0x16, 0xa6, 0x8f, 0x87, 0x7f, 0xcb, 0xc1, + 0xd6, 0xf2, 0xec, 0x2b, 0xa7, 0xdd, 0x49, 0x98, 0x7b, 0x6f, 0xdd, 0x69, + 0x6d, 0x02, 0x03, 0x01, 0x00, 0x01}; unsigned char kTestRsaPrivateKey2CarmichaelTotient_2048[] = { - 0x30, 0x82, 0x04, 0xa2, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xa7, 0x00, 0x36, 0x60, - 0x65, 0xdc, 0xbd, 0x54, 0x5a, 0x2a, 0x40, 0xb4, - 0xe1, 0x15, 0x94, 0x58, 0x11, 0x4f, 0x94, 0x58, - 0xdd, 0xde, 0xa7, 0x1f, 0x3c, 0x2c, 0xe0, 0x88, - 0x09, 0x29, 0x61, 0x57, 0x67, 0x5e, 0x56, 0x7e, - 0xee, 0x27, 0x8f, 0x59, 0x34, 0x9a, 0x2a, 0xaa, - 0x9d, 0xb4, 0x4e, 0xfa, 0xa7, 0x6a, 0xd4, 0xc9, - 0x7a, 0x53, 0xc1, 0x4e, 0x9f, 0xe3, 0x34, 0xf7, - 0x3d, 0xb7, 0xc9, 0x10, 0x47, 0x4f, 0x28, 0xda, - 0x3f, 0xce, 0x31, 0x7b, 0xfd, 0x06, 0x10, 0xeb, - 0xf7, 0xbe, 0x92, 0xf9, 0xaf, 0xfb, 0x3e, 0x68, - 0xda, 0xee, 0x1a, 0x64, 0x4c, 0xf3, 0x29, 0xf2, - 0x73, 0x9e, 0x39, 0xd8, 0xf6, 0x6f, 0xd8, 0xb2, - 0x80, 0x82, 0x71, 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, - 0x3e, 0xcd, 0x0a, 0xca, 0xb6, 0x04, 0xcd, 0x9a, - 0x13, 0x8b, 0x54, 0x73, 0x54, 0x25, 0x54, 0x8c, - 0xbe, 0x98, 0x7a, 0x67, 0xad, 0xda, 0xb3, 0x4e, - 0xb3, 0xfa, 0x82, 0xa8, 0x4a, 0x67, 0x98, 0x56, - 0x57, 0x54, 0x71, 0xcd, 0x12, 0x7f, 0xed, 0xa3, - 0x01, 0xc0, 0x6a, 0x8b, 0x24, 0x03, 0x96, 0x88, - 0xbe, 0x97, 0x66, 0x2a, 0xbc, 0x53, 0xc9, 0x83, - 0x06, 0x51, 0x5a, 0x88, 0x65, 0x13, 0x18, 0xe4, - 0x3a, 0xed, 0x6b, 0xf1, 0x61, 0x5b, 0x4c, 0xc8, - 0x1e, 0xf4, 0xc2, 0xae, 0x08, 0x5e, 0x2d, 0x5f, - 0xf8, 0x12, 0x7f, 0xa2, 0xfc, 0xbb, 0x21, 0x18, - 0x30, 0xda, 0xfe, 0x40, 0xfb, 0x01, 0xca, 0x2e, - 0x37, 0x0e, 0xce, 0xdd, 0x76, 0x87, 0x82, 0x46, - 0x0b, 0x3a, 0x77, 0x8f, 0xc0, 0x72, 0x07, 0x2c, - 0x7f, 0x9d, 0x1e, 0x86, 0x5b, 0xed, 0x27, 0x29, - 0xdf, 0x03, 0x97, 0x62, 0xef, 0x44, 0xd3, 0x5b, - 0x3d, 0xdb, 0x9c, 0x5e, 0x1b, 0x7b, 0x39, 0xb4, - 0x0b, 0x6d, 0x04, 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, - 0xcf, 0xb3, 0x7a, 0x05, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x00, 0x0a, 0xf9, 0x4a, - 0x19, 0x72, 0x88, 0x1b, 0x4e, 0xd8, 0x2f, 0xef, - 0x99, 0x93, 0x32, 0xda, 0x51, 0x21, 0x2e, 0x14, - 0x06, 0xf4, 0xe9, 0x65, 0x1c, 0xf9, 0xd4, 0xcf, - 0x1a, 0x51, 0x53, 0xcd, 0x48, 0x33, 0x8c, 0x30, - 0xed, 0xdd, 0x53, 0x6f, 0x29, 0x82, 0xf9, 0xe0, - 0x74, 0xde, 0xb1, 0x13, 0x01, 0x88, 0x8f, 0xce, - 0x14, 0xc1, 0x3b, 0x90, 0xb7, 0xcc, 0x6c, 0xdf, - 0x35, 0xa1, 0xf2, 0x1a, 0x3d, 0xbe, 0x19, 0xd7, - 0x0a, 0xe4, 0x67, 0x75, 0xbb, 0xfa, 0x87, 0xf4, - 0x03, 0xb5, 0x7f, 0x69, 0xe4, 0x0b, 0x6a, 0xdc, - 0x92, 0x82, 0x54, 0x64, 0x1a, 0x94, 0x2d, 0xe4, - 0x63, 0x40, 0xb2, 0xb4, 0x85, 0x6b, 0xc8, 0x34, - 0xba, 0xa2, 0x14, 0x30, 0x47, 0x1a, 0xeb, 0x90, - 0x62, 0x30, 0x43, 0x44, 0x02, 0xc7, 0x0c, 0x30, - 0xc0, 0x7f, 0xa9, 0x47, 0xae, 0xde, 0x68, 0x27, - 0x92, 0xaa, 0x11, 0x95, 0xf5, 0x6f, 0xfc, 0x19, - 0x8b, 0x49, 0xa0, 0x77, 0x9d, 0xc6, 0x13, 0x5d, - 0x73, 0xff, 0x45, 0xa2, 0x4c, 0x3b, 0xf3, 0xe1, - 0x2d, 0xd7, 0xc4, 0x70, 0xe2, 0x6c, 0x37, 0x99, - 0x4c, 0x7a, 0xa9, 0x27, 0xf8, 0x3a, 0xd6, 0xfd, - 0xc5, 0xd8, 0xfa, 0x2d, 0x0e, 0x71, 0x4b, 0x85, - 0x7e, 0xce, 0xcb, 0x1c, 0x79, 0x71, 0xbd, 0xff, - 0x63, 0x03, 0x6b, 0x58, 0x68, 0xe0, 0x14, 0xca, - 0x5e, 0x85, 0xfd, 0xd0, 0xb7, 0xe0, 0x68, 0x14, - 0xff, 0x2c, 0x82, 0x22, 0x26, 0x8a, 0x3f, 0xbf, - 0xb0, 0x2a, 0x90, 0xff, 0xc7, 0x72, 0xfc, 0x66, - 0x51, 0x3e, 0x51, 0x9f, 0x82, 0x68, 0x0e, 0xf3, - 0x65, 0x74, 0x88, 0xab, 0xb7, 0xe5, 0x97, 0x5f, - 0x0f, 0x3e, 0xe5, 0x3a, 0xbc, 0xa4, 0xa1, 0x50, - 0xdd, 0x5c, 0x94, 0x4b, 0x0c, 0x70, 0x71, 0x48, - 0x4e, 0xd0, 0xec, 0x46, 0x8f, 0xdf, 0xa2, 0x9a, - 0xfe, 0xd8, 0x35, 0x1a, 0x2f, 0x02, 0x81, 0x81, - 0x00, 0xcf, 0x73, 0x8c, 0xbe, 0x6d, 0x45, 0x2d, - 0x0c, 0x0b, 0x5d, 0x5c, 0x6c, 0x75, 0x78, 0xcc, - 0x35, 0x48, 0xb6, 0x98, 0xf1, 0xb9, 0x64, 0x60, - 0x8c, 0x43, 0xeb, 0x85, 0xab, 0x04, 0xb6, 0x7d, - 0x1b, 0x71, 0x75, 0x06, 0xe2, 0xda, 0x84, 0x68, - 0x2e, 0x7f, 0x4c, 0xe3, 0x73, 0xb4, 0xde, 0x51, - 0x4b, 0xb6, 0x51, 0x86, 0x7b, 0xd0, 0xe6, 0x4d, - 0xf3, 0xd1, 0xcf, 0x1a, 0xfe, 0x7f, 0x3a, 0x83, - 0xba, 0xb3, 0xe1, 0xff, 0x54, 0x13, 0x93, 0xd7, - 0x9c, 0x27, 0x80, 0xb7, 0x1e, 0x64, 0x9e, 0xf7, - 0x32, 0x2b, 0x46, 0x29, 0xf7, 0xf8, 0x18, 0x6c, - 0xf7, 0x4a, 0xbe, 0x4b, 0xee, 0x96, 0x90, 0x8f, - 0xa2, 0x16, 0x22, 0x6a, 0xcc, 0x48, 0x06, 0x74, - 0x63, 0x43, 0x7f, 0x27, 0x22, 0x44, 0x3c, 0x2d, - 0x3b, 0x62, 0xf1, 0x1c, 0xb4, 0x27, 0x33, 0x85, - 0x26, 0x60, 0x48, 0x16, 0xcb, 0xef, 0xf8, 0xcd, - 0x37, 0x02, 0x81, 0x81, 0x00, 0xce, 0x15, 0x43, - 0x6e, 0x4b, 0x0f, 0xf9, 0x3f, 0x87, 0xc3, 0x41, - 0x45, 0x97, 0xb1, 0x49, 0xc2, 0x19, 0x23, 0x87, - 0xe4, 0x24, 0x1c, 0x64, 0xe5, 0x28, 0xcb, 0x43, - 0x10, 0x14, 0x14, 0x0e, 0x19, 0xcb, 0xbb, 0xdb, - 0xfd, 0x11, 0x9d, 0x17, 0x68, 0x78, 0x6d, 0x61, - 0x70, 0x63, 0x3a, 0xa1, 0xb3, 0xf3, 0xa7, 0x5b, - 0x0e, 0xff, 0xb7, 0x61, 0x11, 0x54, 0x91, 0x99, - 0xe5, 0x91, 0x32, 0x2d, 0xeb, 0x3f, 0xd8, 0x3e, - 0xf7, 0xd4, 0xcb, 0xd2, 0xa3, 0x41, 0xc1, 0xee, - 0xc6, 0x92, 0x13, 0xeb, 0x7f, 0x42, 0x58, 0xf4, - 0xd0, 0xb2, 0x74, 0x1d, 0x8e, 0x87, 0x46, 0xcd, - 0x14, 0xb8, 0x16, 0xad, 0xb5, 0xbd, 0x0d, 0x6c, - 0x95, 0x5a, 0x16, 0xbf, 0xe9, 0x53, 0xda, 0xfb, - 0xed, 0x83, 0x51, 0x67, 0xa9, 0x55, 0xab, 0x54, - 0x02, 0x95, 0x20, 0xa6, 0x68, 0x17, 0x53, 0xa8, - 0xea, 0x43, 0xe5, 0xb0, 0xa3, 0x02, 0x81, 0x80, - 0x67, 0x9c, 0x32, 0x83, 0x39, 0x57, 0xff, 0x73, - 0xb0, 0x89, 0x64, 0x8b, 0xd6, 0xf0, 0x0a, 0x2d, - 0xe2, 0xaf, 0x30, 0x1c, 0x2a, 0x97, 0xf3, 0x90, - 0x9a, 0xab, 0x9b, 0x0b, 0x1b, 0x43, 0x79, 0xa0, - 0xa7, 0x3d, 0xe7, 0xbe, 0x8d, 0x9c, 0xeb, 0xdb, - 0xad, 0x40, 0xdd, 0xa9, 0x00, 0x80, 0xb8, 0xe1, - 0xb3, 0xa1, 0x6c, 0x25, 0x92, 0xe4, 0x33, 0xb2, - 0xbe, 0xeb, 0x4d, 0x74, 0x26, 0x5f, 0x37, 0x43, - 0x9c, 0x6c, 0x17, 0x76, 0x0a, 0x81, 0x20, 0x82, - 0xa1, 0x48, 0x2c, 0x2d, 0x45, 0xdc, 0x0f, 0x62, - 0x43, 0x32, 0xbb, 0xeb, 0x59, 0x41, 0xf9, 0xca, - 0x58, 0xce, 0x4a, 0x66, 0x53, 0x54, 0xc8, 0x28, - 0x10, 0x1e, 0x08, 0x71, 0x16, 0xd8, 0x02, 0x71, - 0x41, 0x58, 0xd4, 0x56, 0xcc, 0xf5, 0xb1, 0x31, - 0xa3, 0xed, 0x00, 0x85, 0x09, 0xbf, 0x35, 0x95, - 0x41, 0x29, 0x40, 0x19, 0x83, 0x35, 0x24, 0x69, - 0x02, 0x81, 0x80, 0x55, 0x10, 0x0b, 0xcc, 0x3b, - 0xa9, 0x75, 0x3d, 0x16, 0xe1, 0xae, 0x50, 0x76, - 0x63, 0x94, 0x49, 0x4c, 0xad, 0x10, 0xcb, 0x47, - 0x68, 0x7c, 0xf0, 0xe5, 0xdc, 0xb8, 0x6a, 0xab, - 0x8e, 0xf7, 0x9f, 0x08, 0x2c, 0x1b, 0x8a, 0xa2, - 0xb9, 0x8f, 0xce, 0xec, 0x5e, 0x61, 0xa8, 0xcd, - 0x1c, 0x87, 0x60, 0x4a, 0xc3, 0x1a, 0x5f, 0xdf, - 0x87, 0x26, 0xc6, 0xcb, 0x7c, 0x69, 0xe4, 0x8b, - 0x01, 0x06, 0x59, 0x22, 0xfa, 0x34, 0x4b, 0x81, - 0x87, 0x3c, 0x03, 0x6d, 0x02, 0x0a, 0x77, 0xe6, - 0x15, 0xd8, 0xcf, 0xa7, 0x68, 0x26, 0x6c, 0xfa, - 0x2b, 0xd9, 0x83, 0x5a, 0x2d, 0x0c, 0x3b, 0x70, - 0x1c, 0xd4, 0x48, 0xbe, 0xa7, 0x0a, 0xd9, 0xbe, - 0xdc, 0xc3, 0x0c, 0x21, 0x33, 0xb3, 0x66, 0xff, - 0x1c, 0x1b, 0xc8, 0x96, 0x76, 0xe8, 0x6f, 0x44, - 0x74, 0xbc, 0x9b, 0x1c, 0x7d, 0xc8, 0xac, 0x21, - 0xa8, 0x6e, 0x37, 0x02, 0x81, 0x80, 0x2c, 0x7c, - 0xad, 0x1e, 0x75, 0xf6, 0x69, 0x1d, 0xe7, 0xa6, - 0xca, 0x74, 0x7d, 0x67, 0xc8, 0x65, 0x28, 0x66, - 0xc4, 0x43, 0xa6, 0xbd, 0x40, 0x57, 0xae, 0xb7, - 0x65, 0x2c, 0x52, 0xf9, 0xe4, 0xc7, 0x81, 0x7b, - 0x56, 0xa3, 0xd2, 0x0d, 0xe8, 0x33, 0x70, 0xcf, - 0x06, 0x84, 0xb3, 0x4e, 0x44, 0x50, 0x75, 0x61, - 0x96, 0x86, 0x4b, 0xb6, 0x2b, 0xad, 0xf0, 0xad, - 0x57, 0xd0, 0x37, 0x0d, 0x1d, 0x35, 0x50, 0xcb, - 0x69, 0x22, 0x39, 0x29, 0xb9, 0x3a, 0xd3, 0x29, - 0x23, 0x02, 0x60, 0xf7, 0xab, 0x30, 0x40, 0xda, - 0x8e, 0x4d, 0x45, 0x70, 0x26, 0xf4, 0xa2, 0x0d, - 0xd0, 0x64, 0x5d, 0x47, 0x3c, 0x18, 0xf4, 0xd4, - 0x52, 0x95, 0x00, 0xae, 0x84, 0x6b, 0x47, 0xb2, - 0x3c, 0x82, 0xd3, 0x72, 0x53, 0xde, 0x72, 0x2c, - 0xf7, 0xc1, 0x22, 0x36, 0xd9, 0x18, 0x56, 0xfe, - 0x39, 0x28, 0x33, 0xe0, 0xdb, 0x03 -}; + 0x30, 0x82, 0x04, 0xa2, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa7, 0x00, 0x36, 0x60, 0x65, 0xdc, 0xbd, 0x54, 0x5a, 0x2a, 0x40, 0xb4, + 0xe1, 0x15, 0x94, 0x58, 0x11, 0x4f, 0x94, 0x58, 0xdd, 0xde, 0xa7, 0x1f, + 0x3c, 0x2c, 0xe0, 0x88, 0x09, 0x29, 0x61, 0x57, 0x67, 0x5e, 0x56, 0x7e, + 0xee, 0x27, 0x8f, 0x59, 0x34, 0x9a, 0x2a, 0xaa, 0x9d, 0xb4, 0x4e, 0xfa, + 0xa7, 0x6a, 0xd4, 0xc9, 0x7a, 0x53, 0xc1, 0x4e, 0x9f, 0xe3, 0x34, 0xf7, + 0x3d, 0xb7, 0xc9, 0x10, 0x47, 0x4f, 0x28, 0xda, 0x3f, 0xce, 0x31, 0x7b, + 0xfd, 0x06, 0x10, 0xeb, 0xf7, 0xbe, 0x92, 0xf9, 0xaf, 0xfb, 0x3e, 0x68, + 0xda, 0xee, 0x1a, 0x64, 0x4c, 0xf3, 0x29, 0xf2, 0x73, 0x9e, 0x39, 0xd8, + 0xf6, 0x6f, 0xd8, 0xb2, 0x80, 0x82, 0x71, 0x8e, 0xb5, 0xa4, 0xf2, 0xc2, + 0x3e, 0xcd, 0x0a, 0xca, 0xb6, 0x04, 0xcd, 0x9a, 0x13, 0x8b, 0x54, 0x73, + 0x54, 0x25, 0x54, 0x8c, 0xbe, 0x98, 0x7a, 0x67, 0xad, 0xda, 0xb3, 0x4e, + 0xb3, 0xfa, 0x82, 0xa8, 0x4a, 0x67, 0x98, 0x56, 0x57, 0x54, 0x71, 0xcd, + 0x12, 0x7f, 0xed, 0xa3, 0x01, 0xc0, 0x6a, 0x8b, 0x24, 0x03, 0x96, 0x88, + 0xbe, 0x97, 0x66, 0x2a, 0xbc, 0x53, 0xc9, 0x83, 0x06, 0x51, 0x5a, 0x88, + 0x65, 0x13, 0x18, 0xe4, 0x3a, 0xed, 0x6b, 0xf1, 0x61, 0x5b, 0x4c, 0xc8, + 0x1e, 0xf4, 0xc2, 0xae, 0x08, 0x5e, 0x2d, 0x5f, 0xf8, 0x12, 0x7f, 0xa2, + 0xfc, 0xbb, 0x21, 0x18, 0x30, 0xda, 0xfe, 0x40, 0xfb, 0x01, 0xca, 0x2e, + 0x37, 0x0e, 0xce, 0xdd, 0x76, 0x87, 0x82, 0x46, 0x0b, 0x3a, 0x77, 0x8f, + 0xc0, 0x72, 0x07, 0x2c, 0x7f, 0x9d, 0x1e, 0x86, 0x5b, 0xed, 0x27, 0x29, + 0xdf, 0x03, 0x97, 0x62, 0xef, 0x44, 0xd3, 0x5b, 0x3d, 0xdb, 0x9c, 0x5e, + 0x1b, 0x7b, 0x39, 0xb4, 0x0b, 0x6d, 0x04, 0x6b, 0xbb, 0xbb, 0x2c, 0x5f, + 0xcf, 0xb3, 0x7a, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, + 0x00, 0x0a, 0xf9, 0x4a, 0x19, 0x72, 0x88, 0x1b, 0x4e, 0xd8, 0x2f, 0xef, + 0x99, 0x93, 0x32, 0xda, 0x51, 0x21, 0x2e, 0x14, 0x06, 0xf4, 0xe9, 0x65, + 0x1c, 0xf9, 0xd4, 0xcf, 0x1a, 0x51, 0x53, 0xcd, 0x48, 0x33, 0x8c, 0x30, + 0xed, 0xdd, 0x53, 0x6f, 0x29, 0x82, 0xf9, 0xe0, 0x74, 0xde, 0xb1, 0x13, + 0x01, 0x88, 0x8f, 0xce, 0x14, 0xc1, 0x3b, 0x90, 0xb7, 0xcc, 0x6c, 0xdf, + 0x35, 0xa1, 0xf2, 0x1a, 0x3d, 0xbe, 0x19, 0xd7, 0x0a, 0xe4, 0x67, 0x75, + 0xbb, 0xfa, 0x87, 0xf4, 0x03, 0xb5, 0x7f, 0x69, 0xe4, 0x0b, 0x6a, 0xdc, + 0x92, 0x82, 0x54, 0x64, 0x1a, 0x94, 0x2d, 0xe4, 0x63, 0x40, 0xb2, 0xb4, + 0x85, 0x6b, 0xc8, 0x34, 0xba, 0xa2, 0x14, 0x30, 0x47, 0x1a, 0xeb, 0x90, + 0x62, 0x30, 0x43, 0x44, 0x02, 0xc7, 0x0c, 0x30, 0xc0, 0x7f, 0xa9, 0x47, + 0xae, 0xde, 0x68, 0x27, 0x92, 0xaa, 0x11, 0x95, 0xf5, 0x6f, 0xfc, 0x19, + 0x8b, 0x49, 0xa0, 0x77, 0x9d, 0xc6, 0x13, 0x5d, 0x73, 0xff, 0x45, 0xa2, + 0x4c, 0x3b, 0xf3, 0xe1, 0x2d, 0xd7, 0xc4, 0x70, 0xe2, 0x6c, 0x37, 0x99, + 0x4c, 0x7a, 0xa9, 0x27, 0xf8, 0x3a, 0xd6, 0xfd, 0xc5, 0xd8, 0xfa, 0x2d, + 0x0e, 0x71, 0x4b, 0x85, 0x7e, 0xce, 0xcb, 0x1c, 0x79, 0x71, 0xbd, 0xff, + 0x63, 0x03, 0x6b, 0x58, 0x68, 0xe0, 0x14, 0xca, 0x5e, 0x85, 0xfd, 0xd0, + 0xb7, 0xe0, 0x68, 0x14, 0xff, 0x2c, 0x82, 0x22, 0x26, 0x8a, 0x3f, 0xbf, + 0xb0, 0x2a, 0x90, 0xff, 0xc7, 0x72, 0xfc, 0x66, 0x51, 0x3e, 0x51, 0x9f, + 0x82, 0x68, 0x0e, 0xf3, 0x65, 0x74, 0x88, 0xab, 0xb7, 0xe5, 0x97, 0x5f, + 0x0f, 0x3e, 0xe5, 0x3a, 0xbc, 0xa4, 0xa1, 0x50, 0xdd, 0x5c, 0x94, 0x4b, + 0x0c, 0x70, 0x71, 0x48, 0x4e, 0xd0, 0xec, 0x46, 0x8f, 0xdf, 0xa2, 0x9a, + 0xfe, 0xd8, 0x35, 0x1a, 0x2f, 0x02, 0x81, 0x81, 0x00, 0xcf, 0x73, 0x8c, + 0xbe, 0x6d, 0x45, 0x2d, 0x0c, 0x0b, 0x5d, 0x5c, 0x6c, 0x75, 0x78, 0xcc, + 0x35, 0x48, 0xb6, 0x98, 0xf1, 0xb9, 0x64, 0x60, 0x8c, 0x43, 0xeb, 0x85, + 0xab, 0x04, 0xb6, 0x7d, 0x1b, 0x71, 0x75, 0x06, 0xe2, 0xda, 0x84, 0x68, + 0x2e, 0x7f, 0x4c, 0xe3, 0x73, 0xb4, 0xde, 0x51, 0x4b, 0xb6, 0x51, 0x86, + 0x7b, 0xd0, 0xe6, 0x4d, 0xf3, 0xd1, 0xcf, 0x1a, 0xfe, 0x7f, 0x3a, 0x83, + 0xba, 0xb3, 0xe1, 0xff, 0x54, 0x13, 0x93, 0xd7, 0x9c, 0x27, 0x80, 0xb7, + 0x1e, 0x64, 0x9e, 0xf7, 0x32, 0x2b, 0x46, 0x29, 0xf7, 0xf8, 0x18, 0x6c, + 0xf7, 0x4a, 0xbe, 0x4b, 0xee, 0x96, 0x90, 0x8f, 0xa2, 0x16, 0x22, 0x6a, + 0xcc, 0x48, 0x06, 0x74, 0x63, 0x43, 0x7f, 0x27, 0x22, 0x44, 0x3c, 0x2d, + 0x3b, 0x62, 0xf1, 0x1c, 0xb4, 0x27, 0x33, 0x85, 0x26, 0x60, 0x48, 0x16, + 0xcb, 0xef, 0xf8, 0xcd, 0x37, 0x02, 0x81, 0x81, 0x00, 0xce, 0x15, 0x43, + 0x6e, 0x4b, 0x0f, 0xf9, 0x3f, 0x87, 0xc3, 0x41, 0x45, 0x97, 0xb1, 0x49, + 0xc2, 0x19, 0x23, 0x87, 0xe4, 0x24, 0x1c, 0x64, 0xe5, 0x28, 0xcb, 0x43, + 0x10, 0x14, 0x14, 0x0e, 0x19, 0xcb, 0xbb, 0xdb, 0xfd, 0x11, 0x9d, 0x17, + 0x68, 0x78, 0x6d, 0x61, 0x70, 0x63, 0x3a, 0xa1, 0xb3, 0xf3, 0xa7, 0x5b, + 0x0e, 0xff, 0xb7, 0x61, 0x11, 0x54, 0x91, 0x99, 0xe5, 0x91, 0x32, 0x2d, + 0xeb, 0x3f, 0xd8, 0x3e, 0xf7, 0xd4, 0xcb, 0xd2, 0xa3, 0x41, 0xc1, 0xee, + 0xc6, 0x92, 0x13, 0xeb, 0x7f, 0x42, 0x58, 0xf4, 0xd0, 0xb2, 0x74, 0x1d, + 0x8e, 0x87, 0x46, 0xcd, 0x14, 0xb8, 0x16, 0xad, 0xb5, 0xbd, 0x0d, 0x6c, + 0x95, 0x5a, 0x16, 0xbf, 0xe9, 0x53, 0xda, 0xfb, 0xed, 0x83, 0x51, 0x67, + 0xa9, 0x55, 0xab, 0x54, 0x02, 0x95, 0x20, 0xa6, 0x68, 0x17, 0x53, 0xa8, + 0xea, 0x43, 0xe5, 0xb0, 0xa3, 0x02, 0x81, 0x80, 0x67, 0x9c, 0x32, 0x83, + 0x39, 0x57, 0xff, 0x73, 0xb0, 0x89, 0x64, 0x8b, 0xd6, 0xf0, 0x0a, 0x2d, + 0xe2, 0xaf, 0x30, 0x1c, 0x2a, 0x97, 0xf3, 0x90, 0x9a, 0xab, 0x9b, 0x0b, + 0x1b, 0x43, 0x79, 0xa0, 0xa7, 0x3d, 0xe7, 0xbe, 0x8d, 0x9c, 0xeb, 0xdb, + 0xad, 0x40, 0xdd, 0xa9, 0x00, 0x80, 0xb8, 0xe1, 0xb3, 0xa1, 0x6c, 0x25, + 0x92, 0xe4, 0x33, 0xb2, 0xbe, 0xeb, 0x4d, 0x74, 0x26, 0x5f, 0x37, 0x43, + 0x9c, 0x6c, 0x17, 0x76, 0x0a, 0x81, 0x20, 0x82, 0xa1, 0x48, 0x2c, 0x2d, + 0x45, 0xdc, 0x0f, 0x62, 0x43, 0x32, 0xbb, 0xeb, 0x59, 0x41, 0xf9, 0xca, + 0x58, 0xce, 0x4a, 0x66, 0x53, 0x54, 0xc8, 0x28, 0x10, 0x1e, 0x08, 0x71, + 0x16, 0xd8, 0x02, 0x71, 0x41, 0x58, 0xd4, 0x56, 0xcc, 0xf5, 0xb1, 0x31, + 0xa3, 0xed, 0x00, 0x85, 0x09, 0xbf, 0x35, 0x95, 0x41, 0x29, 0x40, 0x19, + 0x83, 0x35, 0x24, 0x69, 0x02, 0x81, 0x80, 0x55, 0x10, 0x0b, 0xcc, 0x3b, + 0xa9, 0x75, 0x3d, 0x16, 0xe1, 0xae, 0x50, 0x76, 0x63, 0x94, 0x49, 0x4c, + 0xad, 0x10, 0xcb, 0x47, 0x68, 0x7c, 0xf0, 0xe5, 0xdc, 0xb8, 0x6a, 0xab, + 0x8e, 0xf7, 0x9f, 0x08, 0x2c, 0x1b, 0x8a, 0xa2, 0xb9, 0x8f, 0xce, 0xec, + 0x5e, 0x61, 0xa8, 0xcd, 0x1c, 0x87, 0x60, 0x4a, 0xc3, 0x1a, 0x5f, 0xdf, + 0x87, 0x26, 0xc6, 0xcb, 0x7c, 0x69, 0xe4, 0x8b, 0x01, 0x06, 0x59, 0x22, + 0xfa, 0x34, 0x4b, 0x81, 0x87, 0x3c, 0x03, 0x6d, 0x02, 0x0a, 0x77, 0xe6, + 0x15, 0xd8, 0xcf, 0xa7, 0x68, 0x26, 0x6c, 0xfa, 0x2b, 0xd9, 0x83, 0x5a, + 0x2d, 0x0c, 0x3b, 0x70, 0x1c, 0xd4, 0x48, 0xbe, 0xa7, 0x0a, 0xd9, 0xbe, + 0xdc, 0xc3, 0x0c, 0x21, 0x33, 0xb3, 0x66, 0xff, 0x1c, 0x1b, 0xc8, 0x96, + 0x76, 0xe8, 0x6f, 0x44, 0x74, 0xbc, 0x9b, 0x1c, 0x7d, 0xc8, 0xac, 0x21, + 0xa8, 0x6e, 0x37, 0x02, 0x81, 0x80, 0x2c, 0x7c, 0xad, 0x1e, 0x75, 0xf6, + 0x69, 0x1d, 0xe7, 0xa6, 0xca, 0x74, 0x7d, 0x67, 0xc8, 0x65, 0x28, 0x66, + 0xc4, 0x43, 0xa6, 0xbd, 0x40, 0x57, 0xae, 0xb7, 0x65, 0x2c, 0x52, 0xf9, + 0xe4, 0xc7, 0x81, 0x7b, 0x56, 0xa3, 0xd2, 0x0d, 0xe8, 0x33, 0x70, 0xcf, + 0x06, 0x84, 0xb3, 0x4e, 0x44, 0x50, 0x75, 0x61, 0x96, 0x86, 0x4b, 0xb6, + 0x2b, 0xad, 0xf0, 0xad, 0x57, 0xd0, 0x37, 0x0d, 0x1d, 0x35, 0x50, 0xcb, + 0x69, 0x22, 0x39, 0x29, 0xb9, 0x3a, 0xd3, 0x29, 0x23, 0x02, 0x60, 0xf7, + 0xab, 0x30, 0x40, 0xda, 0x8e, 0x4d, 0x45, 0x70, 0x26, 0xf4, 0xa2, 0x0d, + 0xd0, 0x64, 0x5d, 0x47, 0x3c, 0x18, 0xf4, 0xd4, 0x52, 0x95, 0x00, 0xae, + 0x84, 0x6b, 0x47, 0xb2, 0x3c, 0x82, 0xd3, 0x72, 0x53, 0xde, 0x72, 0x2c, + 0xf7, 0xc1, 0x22, 0x36, 0xd9, 0x18, 0x56, 0xfe, 0x39, 0x28, 0x33, 0xe0, + 0xdb, 0x03}; static const unsigned char kTestRsaPrivateKey3CarmichaelTotient_2048[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xa5, 0xd0, 0xd7, 0x3e, - 0x0e, 0x2d, 0xfb, 0x43, 0x51, 0x99, 0xea, 0x40, - 0x1e, 0x2d, 0x89, 0xe4, 0xa2, 0x3e, 0xfc, 0x51, - 0x3d, 0x0e, 0x83, 0xa7, 0xe0, 0xa5, 0x41, 0x04, - 0x1e, 0x14, 0xc5, 0xa7, 0x5c, 0x61, 0x36, 0x44, - 0xb3, 0x08, 0x05, 0x5b, 0x14, 0xde, 0x01, 0x0c, - 0x32, 0x3c, 0x9a, 0x91, 0x00, 0x50, 0xa8, 0x1d, - 0xcc, 0x9f, 0x8f, 0x35, 0xb7, 0xc2, 0x75, 0x08, - 0x32, 0x8b, 0x10, 0x3a, 0x86, 0xf9, 0xd7, 0x78, - 0xa3, 0x9d, 0x74, 0x10, 0xc6, 0x24, 0xb1, 0x7f, - 0xa5, 0xbf, 0x5f, 0xc2, 0xd7, 0x15, 0xa3, 0x1d, - 0xe0, 0x15, 0x6b, 0x1b, 0x0e, 0x38, 0xba, 0x34, - 0xbc, 0x95, 0x47, 0x94, 0x40, 0x70, 0xac, 0x99, - 0x1f, 0x0b, 0x8e, 0x56, 0x93, 0x36, 0x2b, 0x6d, - 0x04, 0xe7, 0x95, 0x1a, 0x37, 0xda, 0x16, 0x57, - 0x99, 0xee, 0x03, 0x68, 0x16, 0x31, 0xaa, 0xc3, - 0xb7, 0x92, 0x75, 0x53, 0xfc, 0xf6, 0x20, 0x55, - 0x44, 0xf8, 0xd4, 0x8d, 0x78, 0x15, 0xc7, 0x1a, - 0xb6, 0xde, 0x6c, 0xe8, 0x49, 0x5d, 0xaf, 0xa8, - 0x4e, 0x6f, 0x7c, 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, - 0x8c, 0x8f, 0x0b, 0x5d, 0x3a, 0x09, 0xd6, 0xb3, - 0x44, 0xab, 0xe0, 0x35, 0x52, 0x7c, 0x66, 0x85, - 0xa4, 0x40, 0xd7, 0x20, 0xec, 0x24, 0x05, 0x06, - 0xd9, 0x84, 0x51, 0x5a, 0xd2, 0x38, 0xd5, 0x1d, - 0xea, 0x70, 0x2a, 0x21, 0xe6, 0x82, 0xfd, 0xa4, - 0x46, 0x1c, 0x4f, 0x59, 0x6e, 0x29, 0x3d, 0xae, - 0xb8, 0x8e, 0xee, 0x77, 0x1f, 0x15, 0x33, 0xcf, - 0x94, 0x1d, 0x87, 0x3c, 0x37, 0xc5, 0x89, 0xe8, - 0x7d, 0x85, 0xb3, 0xbc, 0xe8, 0x62, 0x6a, 0x84, - 0x7f, 0xfe, 0x9a, 0x85, 0x3f, 0x39, 0xe8, 0xaa, - 0x16, 0xa6, 0x8f, 0x87, 0x7f, 0xcb, 0xc1, 0xd6, - 0xf2, 0xec, 0x2b, 0xa7, 0xdd, 0x49, 0x98, 0x7b, - 0x6f, 0xdd, 0x69, 0x6d, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x00, 0x1a, 0x1a, 0xe3, - 0xb4, 0x2d, 0x9b, 0xd0, 0x1d, 0xc4, 0x54, 0x50, - 0xc4, 0x98, 0xeb, 0xae, 0xf4, 0xab, 0x95, 0x72, - 0x78, 0x60, 0xbe, 0x2e, 0xfc, 0x88, 0x59, 0xc3, - 0xff, 0x5f, 0xb4, 0x01, 0xfd, 0x2c, 0x06, 0x52, - 0xfa, 0xa4, 0x5b, 0xfc, 0x29, 0xdf, 0x82, 0x67, - 0x14, 0x52, 0x39, 0x67, 0xd5, 0x31, 0xc1, 0x41, - 0x02, 0x76, 0x03, 0x5d, 0xd2, 0xc5, 0x74, 0x2c, - 0x24, 0x26, 0xfe, 0xed, 0x46, 0x65, 0x97, 0x22, - 0x74, 0xe7, 0xff, 0x63, 0x35, 0x3b, 0xd8, 0xad, - 0x88, 0x2c, 0xe2, 0x50, 0xf3, 0x76, 0x14, 0xbe, - 0x3a, 0x37, 0x1b, 0xf0, 0x21, 0x91, 0x8e, 0xdd, - 0x43, 0xed, 0xb7, 0xab, 0xcd, 0xfb, 0x8a, 0x31, - 0xa6, 0x26, 0xb4, 0xd5, 0x4b, 0x2c, 0x80, 0x7f, - 0xfc, 0x39, 0x24, 0x33, 0x7d, 0x6d, 0xf3, 0x1c, - 0x06, 0xdd, 0x21, 0x53, 0x70, 0x78, 0xe4, 0x07, - 0x60, 0x2a, 0x3f, 0xb8, 0xd0, 0x47, 0xf6, 0x0e, - 0xbd, 0xde, 0x31, 0xf3, 0x66, 0xfe, 0x6e, 0x4b, - 0x50, 0x75, 0x0b, 0x49, 0x3a, 0x96, 0xeb, 0x63, - 0xb9, 0x24, 0xbb, 0xfc, 0xcd, 0xf5, 0x49, 0x12, - 0xa9, 0x6d, 0x39, 0xd4, 0x18, 0x15, 0x14, 0x50, - 0x82, 0xa9, 0x75, 0xeb, 0x9f, 0x1a, 0xaa, 0x52, - 0x1d, 0x0d, 0x55, 0x74, 0x30, 0x45, 0x3b, 0xd2, - 0xd3, 0xe1, 0xdb, 0x8d, 0xec, 0x38, 0x2b, 0xb0, - 0xdd, 0xda, 0x10, 0xe3, 0x40, 0x87, 0x27, 0xbe, - 0x0b, 0xbf, 0x08, 0x9e, 0x25, 0x95, 0x14, 0xf4, - 0xd7, 0xfe, 0x8c, 0x4f, 0x23, 0xfd, 0x1b, 0xad, - 0x83, 0x6b, 0x05, 0x3a, 0x83, 0xfa, 0x65, 0x1e, - 0x65, 0x12, 0xe3, 0x9f, 0xea, 0x52, 0xd7, 0xed, - 0x01, 0x7d, 0xc5, 0xf1, 0x96, 0x2d, 0xf5, 0x4a, - 0xa3, 0xcb, 0x69, 0x6c, 0x9a, 0x48, 0xe9, 0xf5, - 0x01, 0xef, 0x1d, 0x2e, 0x90, 0x64, 0x6c, 0x0b, - 0x79, 0xe0, 0xeb, 0x64, 0x29, 0x02, 0x81, 0x81, - 0x00, 0xdb, 0xc1, 0xe7, 0xdd, 0xba, 0x3c, 0x1f, - 0x9c, 0x64, 0xca, 0xa0, 0x63, 0xdb, 0xd2, 0x47, - 0x5c, 0x6e, 0x8a, 0xa3, 0x16, 0xd5, 0xda, 0xc2, - 0x25, 0x64, 0x0a, 0x02, 0xbc, 0x7d, 0x7f, 0x50, - 0xab, 0xe0, 0x66, 0x03, 0x53, 0x7d, 0x77, 0x6d, - 0x6c, 0x61, 0x58, 0x09, 0x73, 0xcd, 0x18, 0xe9, - 0x53, 0x0b, 0x5c, 0xa2, 0x71, 0x14, 0x02, 0xfd, - 0x55, 0xda, 0xe9, 0x77, 0x24, 0x7c, 0x2a, 0x4e, - 0xb9, 0xd9, 0x5d, 0x58, 0xf6, 0x26, 0xd0, 0xd8, - 0x3d, 0xcf, 0x8c, 0x89, 0x65, 0x6c, 0x35, 0x19, - 0xb6, 0x63, 0xff, 0xa0, 0x71, 0x49, 0xcd, 0x6d, - 0x5b, 0x3d, 0x8f, 0xea, 0x6f, 0xa9, 0xba, 0x43, - 0xe5, 0xdd, 0x39, 0x3a, 0x78, 0x8f, 0x07, 0xb8, - 0xab, 0x58, 0x07, 0xb7, 0xd2, 0xf8, 0x07, 0x02, - 0x9b, 0x79, 0x26, 0x32, 0x22, 0x38, 0x91, 0x01, - 0x90, 0x81, 0x29, 0x94, 0xad, 0x77, 0xeb, 0x86, - 0xb9, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x29, 0x88, - 0xbd, 0x96, 0x31, 0x33, 0x7b, 0x77, 0x5d, 0x32, - 0x12, 0x5e, 0xdf, 0x28, 0x0c, 0x96, 0x0d, 0xa8, - 0x22, 0xdf, 0xd3, 0x35, 0xd7, 0xb0, 0x41, 0xcb, - 0xe7, 0x94, 0x8a, 0xa4, 0xed, 0xd2, 0xfb, 0xd2, - 0xf3, 0xf2, 0x95, 0xff, 0xd8, 0x33, 0x3f, 0x8c, - 0xd7, 0x65, 0xe4, 0x0c, 0xcc, 0xfe, 0x32, 0x66, - 0xfa, 0x50, 0xe2, 0xcf, 0xf0, 0xbe, 0x05, 0xb1, - 0xbc, 0xbe, 0x44, 0x09, 0xb4, 0xfe, 0x95, 0x06, - 0x18, 0xd7, 0x59, 0xc6, 0xef, 0x2d, 0x22, 0xa0, - 0x73, 0x5e, 0x77, 0xdf, 0x8d, 0x09, 0x2c, 0xb8, - 0xcc, 0xeb, 0x10, 0x4d, 0xa7, 0xd0, 0x4b, 0x46, - 0xba, 0x7d, 0x8b, 0x6a, 0x55, 0x47, 0x55, 0xd3, - 0xd7, 0xb1, 0x88, 0xfd, 0x27, 0x3e, 0xf9, 0x5b, - 0x7b, 0xae, 0x6d, 0x08, 0x9f, 0x0c, 0x2a, 0xe1, - 0xdd, 0xb9, 0xe3, 0x55, 0x13, 0x55, 0xa3, 0x6d, - 0x06, 0xbb, 0xe0, 0x1e, 0x55, 0x02, 0x81, 0x80, - 0x61, 0x73, 0x3d, 0x64, 0xff, 0xdf, 0x05, 0x8d, - 0x8e, 0xcc, 0xa4, 0x0f, 0x64, 0x3d, 0x7d, 0x53, - 0xa9, 0xd9, 0x64, 0xb5, 0x0d, 0xa4, 0x72, 0x8f, - 0xae, 0x2b, 0x1a, 0x47, 0x87, 0xc7, 0x5b, 0x78, - 0xbc, 0x8b, 0xc0, 0x51, 0xd7, 0xc3, 0x8c, 0x0c, - 0x91, 0xa6, 0x3e, 0x9a, 0xd1, 0x8a, 0x88, 0x7d, - 0x40, 0xfe, 0x95, 0x32, 0x5b, 0xd3, 0x6f, 0x90, - 0x11, 0x01, 0x92, 0xc9, 0xe5, 0x1d, 0xc5, 0xc7, - 0x78, 0x72, 0x82, 0xae, 0xb5, 0x4b, 0xcb, 0x78, - 0xad, 0x7e, 0xfe, 0xb6, 0xb1, 0x23, 0x63, 0x01, - 0x94, 0x9a, 0x99, 0x05, 0x63, 0xda, 0xea, 0xf1, - 0x98, 0xfd, 0x26, 0xd2, 0xd9, 0x8b, 0x35, 0xec, - 0xcb, 0x0b, 0x43, 0xb8, 0x8e, 0x84, 0xb8, 0x09, - 0x93, 0x81, 0xe8, 0xac, 0x6f, 0x3c, 0x7c, 0x95, - 0x81, 0x45, 0xc4, 0xd9, 0x94, 0x08, 0x09, 0x8f, - 0x91, 0x17, 0x65, 0x4c, 0xff, 0x6e, 0xbc, 0x51, - 0x02, 0x81, 0x81, 0x00, 0xc1, 0x0d, 0x9d, 0xd8, - 0xbd, 0xaf, 0x56, 0xe0, 0xe3, 0x1f, 0x85, 0xd7, - 0xce, 0x72, 0x02, 0x38, 0xf2, 0x0f, 0x9c, 0x27, - 0x9e, 0xc4, 0x1d, 0x60, 0x00, 0x8d, 0x02, 0x19, - 0xe5, 0xdf, 0xdb, 0x8e, 0xc5, 0xfb, 0x61, 0x8e, - 0xe6, 0xb8, 0xfc, 0x07, 0x3c, 0xd1, 0x1b, 0x16, - 0x7c, 0x83, 0x3c, 0x37, 0xf5, 0x26, 0xb2, 0xbd, - 0x22, 0xf2, 0x4d, 0x19, 0x33, 0x11, 0xc5, 0xdd, - 0xf9, 0xdb, 0x4e, 0x48, 0x52, 0xd8, 0xe6, 0x4b, - 0x15, 0x90, 0x68, 0xbe, 0xca, 0xc1, 0x7c, 0xd3, - 0x51, 0x6b, 0x45, 0x46, 0x54, 0x11, 0x1a, 0x71, - 0xd3, 0xcd, 0x6b, 0x8f, 0x79, 0x22, 0x83, 0x02, - 0x08, 0x4f, 0xba, 0x6a, 0x98, 0xed, 0x32, 0xd8, - 0xb4, 0x5b, 0x51, 0x88, 0x53, 0xec, 0x2c, 0x7e, - 0xa4, 0x89, 0xdc, 0xbf, 0xf9, 0x0d, 0x32, 0xc8, - 0xc3, 0xec, 0x6d, 0x2e, 0xf1, 0xbc, 0x70, 0x4e, - 0xf6, 0x9e, 0xbc, 0x31, 0x02, 0x81, 0x81, 0x00, - 0xd3, 0x35, 0x1b, 0x19, 0x75, 0x3f, 0x61, 0xf2, - 0x55, 0x03, 0xce, 0x25, 0xa9, 0xdf, 0x0c, 0x0a, - 0x3b, 0x47, 0x42, 0xdc, 0x38, 0x4b, 0x13, 0x4d, - 0x1f, 0x86, 0x58, 0x4f, 0xd8, 0xee, 0xfa, 0x76, - 0x15, 0xfb, 0x6e, 0x55, 0x31, 0xf2, 0xd2, 0x62, - 0x32, 0xa5, 0xc4, 0x23, 0x5e, 0x08, 0xa9, 0x83, - 0x07, 0xac, 0x8c, 0xa3, 0x7e, 0x18, 0xc0, 0x1c, - 0x57, 0x63, 0x8d, 0x05, 0x17, 0x47, 0x1b, 0xd3, - 0x74, 0x73, 0x20, 0x04, 0xfb, 0xc8, 0x1a, 0x43, - 0x04, 0x36, 0xc8, 0x19, 0xbe, 0xdc, 0xa6, 0xe5, - 0x0f, 0x25, 0x62, 0x24, 0x96, 0x92, 0xb6, 0xb3, - 0x97, 0xad, 0x57, 0x9a, 0x90, 0x37, 0x4e, 0x31, - 0x44, 0x74, 0xfa, 0x7c, 0xb4, 0xea, 0xfc, 0x15, - 0xa7, 0xb0, 0x51, 0xcc, 0xee, 0x1e, 0xed, 0x5b, - 0x98, 0x18, 0x0e, 0x65, 0xb6, 0x4b, 0x69, 0x0b, - 0x21, 0xdc, 0x86, 0x17, 0x6e, 0xc8, 0xee, 0x24 -}; + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa5, 0xd0, 0xd7, 0x3e, 0x0e, 0x2d, 0xfb, 0x43, 0x51, 0x99, 0xea, 0x40, + 0x1e, 0x2d, 0x89, 0xe4, 0xa2, 0x3e, 0xfc, 0x51, 0x3d, 0x0e, 0x83, 0xa7, + 0xe0, 0xa5, 0x41, 0x04, 0x1e, 0x14, 0xc5, 0xa7, 0x5c, 0x61, 0x36, 0x44, + 0xb3, 0x08, 0x05, 0x5b, 0x14, 0xde, 0x01, 0x0c, 0x32, 0x3c, 0x9a, 0x91, + 0x00, 0x50, 0xa8, 0x1d, 0xcc, 0x9f, 0x8f, 0x35, 0xb7, 0xc2, 0x75, 0x08, + 0x32, 0x8b, 0x10, 0x3a, 0x86, 0xf9, 0xd7, 0x78, 0xa3, 0x9d, 0x74, 0x10, + 0xc6, 0x24, 0xb1, 0x7f, 0xa5, 0xbf, 0x5f, 0xc2, 0xd7, 0x15, 0xa3, 0x1d, + 0xe0, 0x15, 0x6b, 0x1b, 0x0e, 0x38, 0xba, 0x34, 0xbc, 0x95, 0x47, 0x94, + 0x40, 0x70, 0xac, 0x99, 0x1f, 0x0b, 0x8e, 0x56, 0x93, 0x36, 0x2b, 0x6d, + 0x04, 0xe7, 0x95, 0x1a, 0x37, 0xda, 0x16, 0x57, 0x99, 0xee, 0x03, 0x68, + 0x16, 0x31, 0xaa, 0xc3, 0xb7, 0x92, 0x75, 0x53, 0xfc, 0xf6, 0x20, 0x55, + 0x44, 0xf8, 0xd4, 0x8d, 0x78, 0x15, 0xc7, 0x1a, 0xb6, 0xde, 0x6c, 0xe8, + 0x49, 0x5d, 0xaf, 0xa8, 0x4e, 0x6f, 0x7c, 0xe2, 0x6a, 0x4c, 0xd5, 0xe7, + 0x8c, 0x8f, 0x0b, 0x5d, 0x3a, 0x09, 0xd6, 0xb3, 0x44, 0xab, 0xe0, 0x35, + 0x52, 0x7c, 0x66, 0x85, 0xa4, 0x40, 0xd7, 0x20, 0xec, 0x24, 0x05, 0x06, + 0xd9, 0x84, 0x51, 0x5a, 0xd2, 0x38, 0xd5, 0x1d, 0xea, 0x70, 0x2a, 0x21, + 0xe6, 0x82, 0xfd, 0xa4, 0x46, 0x1c, 0x4f, 0x59, 0x6e, 0x29, 0x3d, 0xae, + 0xb8, 0x8e, 0xee, 0x77, 0x1f, 0x15, 0x33, 0xcf, 0x94, 0x1d, 0x87, 0x3c, + 0x37, 0xc5, 0x89, 0xe8, 0x7d, 0x85, 0xb3, 0xbc, 0xe8, 0x62, 0x6a, 0x84, + 0x7f, 0xfe, 0x9a, 0x85, 0x3f, 0x39, 0xe8, 0xaa, 0x16, 0xa6, 0x8f, 0x87, + 0x7f, 0xcb, 0xc1, 0xd6, 0xf2, 0xec, 0x2b, 0xa7, 0xdd, 0x49, 0x98, 0x7b, + 0x6f, 0xdd, 0x69, 0x6d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, + 0x00, 0x1a, 0x1a, 0xe3, 0xb4, 0x2d, 0x9b, 0xd0, 0x1d, 0xc4, 0x54, 0x50, + 0xc4, 0x98, 0xeb, 0xae, 0xf4, 0xab, 0x95, 0x72, 0x78, 0x60, 0xbe, 0x2e, + 0xfc, 0x88, 0x59, 0xc3, 0xff, 0x5f, 0xb4, 0x01, 0xfd, 0x2c, 0x06, 0x52, + 0xfa, 0xa4, 0x5b, 0xfc, 0x29, 0xdf, 0x82, 0x67, 0x14, 0x52, 0x39, 0x67, + 0xd5, 0x31, 0xc1, 0x41, 0x02, 0x76, 0x03, 0x5d, 0xd2, 0xc5, 0x74, 0x2c, + 0x24, 0x26, 0xfe, 0xed, 0x46, 0x65, 0x97, 0x22, 0x74, 0xe7, 0xff, 0x63, + 0x35, 0x3b, 0xd8, 0xad, 0x88, 0x2c, 0xe2, 0x50, 0xf3, 0x76, 0x14, 0xbe, + 0x3a, 0x37, 0x1b, 0xf0, 0x21, 0x91, 0x8e, 0xdd, 0x43, 0xed, 0xb7, 0xab, + 0xcd, 0xfb, 0x8a, 0x31, 0xa6, 0x26, 0xb4, 0xd5, 0x4b, 0x2c, 0x80, 0x7f, + 0xfc, 0x39, 0x24, 0x33, 0x7d, 0x6d, 0xf3, 0x1c, 0x06, 0xdd, 0x21, 0x53, + 0x70, 0x78, 0xe4, 0x07, 0x60, 0x2a, 0x3f, 0xb8, 0xd0, 0x47, 0xf6, 0x0e, + 0xbd, 0xde, 0x31, 0xf3, 0x66, 0xfe, 0x6e, 0x4b, 0x50, 0x75, 0x0b, 0x49, + 0x3a, 0x96, 0xeb, 0x63, 0xb9, 0x24, 0xbb, 0xfc, 0xcd, 0xf5, 0x49, 0x12, + 0xa9, 0x6d, 0x39, 0xd4, 0x18, 0x15, 0x14, 0x50, 0x82, 0xa9, 0x75, 0xeb, + 0x9f, 0x1a, 0xaa, 0x52, 0x1d, 0x0d, 0x55, 0x74, 0x30, 0x45, 0x3b, 0xd2, + 0xd3, 0xe1, 0xdb, 0x8d, 0xec, 0x38, 0x2b, 0xb0, 0xdd, 0xda, 0x10, 0xe3, + 0x40, 0x87, 0x27, 0xbe, 0x0b, 0xbf, 0x08, 0x9e, 0x25, 0x95, 0x14, 0xf4, + 0xd7, 0xfe, 0x8c, 0x4f, 0x23, 0xfd, 0x1b, 0xad, 0x83, 0x6b, 0x05, 0x3a, + 0x83, 0xfa, 0x65, 0x1e, 0x65, 0x12, 0xe3, 0x9f, 0xea, 0x52, 0xd7, 0xed, + 0x01, 0x7d, 0xc5, 0xf1, 0x96, 0x2d, 0xf5, 0x4a, 0xa3, 0xcb, 0x69, 0x6c, + 0x9a, 0x48, 0xe9, 0xf5, 0x01, 0xef, 0x1d, 0x2e, 0x90, 0x64, 0x6c, 0x0b, + 0x79, 0xe0, 0xeb, 0x64, 0x29, 0x02, 0x81, 0x81, 0x00, 0xdb, 0xc1, 0xe7, + 0xdd, 0xba, 0x3c, 0x1f, 0x9c, 0x64, 0xca, 0xa0, 0x63, 0xdb, 0xd2, 0x47, + 0x5c, 0x6e, 0x8a, 0xa3, 0x16, 0xd5, 0xda, 0xc2, 0x25, 0x64, 0x0a, 0x02, + 0xbc, 0x7d, 0x7f, 0x50, 0xab, 0xe0, 0x66, 0x03, 0x53, 0x7d, 0x77, 0x6d, + 0x6c, 0x61, 0x58, 0x09, 0x73, 0xcd, 0x18, 0xe9, 0x53, 0x0b, 0x5c, 0xa2, + 0x71, 0x14, 0x02, 0xfd, 0x55, 0xda, 0xe9, 0x77, 0x24, 0x7c, 0x2a, 0x4e, + 0xb9, 0xd9, 0x5d, 0x58, 0xf6, 0x26, 0xd0, 0xd8, 0x3d, 0xcf, 0x8c, 0x89, + 0x65, 0x6c, 0x35, 0x19, 0xb6, 0x63, 0xff, 0xa0, 0x71, 0x49, 0xcd, 0x6d, + 0x5b, 0x3d, 0x8f, 0xea, 0x6f, 0xa9, 0xba, 0x43, 0xe5, 0xdd, 0x39, 0x3a, + 0x78, 0x8f, 0x07, 0xb8, 0xab, 0x58, 0x07, 0xb7, 0xd2, 0xf8, 0x07, 0x02, + 0x9b, 0x79, 0x26, 0x32, 0x22, 0x38, 0x91, 0x01, 0x90, 0x81, 0x29, 0x94, + 0xad, 0x77, 0xeb, 0x86, 0xb9, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x29, 0x88, + 0xbd, 0x96, 0x31, 0x33, 0x7b, 0x77, 0x5d, 0x32, 0x12, 0x5e, 0xdf, 0x28, + 0x0c, 0x96, 0x0d, 0xa8, 0x22, 0xdf, 0xd3, 0x35, 0xd7, 0xb0, 0x41, 0xcb, + 0xe7, 0x94, 0x8a, 0xa4, 0xed, 0xd2, 0xfb, 0xd2, 0xf3, 0xf2, 0x95, 0xff, + 0xd8, 0x33, 0x3f, 0x8c, 0xd7, 0x65, 0xe4, 0x0c, 0xcc, 0xfe, 0x32, 0x66, + 0xfa, 0x50, 0xe2, 0xcf, 0xf0, 0xbe, 0x05, 0xb1, 0xbc, 0xbe, 0x44, 0x09, + 0xb4, 0xfe, 0x95, 0x06, 0x18, 0xd7, 0x59, 0xc6, 0xef, 0x2d, 0x22, 0xa0, + 0x73, 0x5e, 0x77, 0xdf, 0x8d, 0x09, 0x2c, 0xb8, 0xcc, 0xeb, 0x10, 0x4d, + 0xa7, 0xd0, 0x4b, 0x46, 0xba, 0x7d, 0x8b, 0x6a, 0x55, 0x47, 0x55, 0xd3, + 0xd7, 0xb1, 0x88, 0xfd, 0x27, 0x3e, 0xf9, 0x5b, 0x7b, 0xae, 0x6d, 0x08, + 0x9f, 0x0c, 0x2a, 0xe1, 0xdd, 0xb9, 0xe3, 0x55, 0x13, 0x55, 0xa3, 0x6d, + 0x06, 0xbb, 0xe0, 0x1e, 0x55, 0x02, 0x81, 0x80, 0x61, 0x73, 0x3d, 0x64, + 0xff, 0xdf, 0x05, 0x8d, 0x8e, 0xcc, 0xa4, 0x0f, 0x64, 0x3d, 0x7d, 0x53, + 0xa9, 0xd9, 0x64, 0xb5, 0x0d, 0xa4, 0x72, 0x8f, 0xae, 0x2b, 0x1a, 0x47, + 0x87, 0xc7, 0x5b, 0x78, 0xbc, 0x8b, 0xc0, 0x51, 0xd7, 0xc3, 0x8c, 0x0c, + 0x91, 0xa6, 0x3e, 0x9a, 0xd1, 0x8a, 0x88, 0x7d, 0x40, 0xfe, 0x95, 0x32, + 0x5b, 0xd3, 0x6f, 0x90, 0x11, 0x01, 0x92, 0xc9, 0xe5, 0x1d, 0xc5, 0xc7, + 0x78, 0x72, 0x82, 0xae, 0xb5, 0x4b, 0xcb, 0x78, 0xad, 0x7e, 0xfe, 0xb6, + 0xb1, 0x23, 0x63, 0x01, 0x94, 0x9a, 0x99, 0x05, 0x63, 0xda, 0xea, 0xf1, + 0x98, 0xfd, 0x26, 0xd2, 0xd9, 0x8b, 0x35, 0xec, 0xcb, 0x0b, 0x43, 0xb8, + 0x8e, 0x84, 0xb8, 0x09, 0x93, 0x81, 0xe8, 0xac, 0x6f, 0x3c, 0x7c, 0x95, + 0x81, 0x45, 0xc4, 0xd9, 0x94, 0x08, 0x09, 0x8f, 0x91, 0x17, 0x65, 0x4c, + 0xff, 0x6e, 0xbc, 0x51, 0x02, 0x81, 0x81, 0x00, 0xc1, 0x0d, 0x9d, 0xd8, + 0xbd, 0xaf, 0x56, 0xe0, 0xe3, 0x1f, 0x85, 0xd7, 0xce, 0x72, 0x02, 0x38, + 0xf2, 0x0f, 0x9c, 0x27, 0x9e, 0xc4, 0x1d, 0x60, 0x00, 0x8d, 0x02, 0x19, + 0xe5, 0xdf, 0xdb, 0x8e, 0xc5, 0xfb, 0x61, 0x8e, 0xe6, 0xb8, 0xfc, 0x07, + 0x3c, 0xd1, 0x1b, 0x16, 0x7c, 0x83, 0x3c, 0x37, 0xf5, 0x26, 0xb2, 0xbd, + 0x22, 0xf2, 0x4d, 0x19, 0x33, 0x11, 0xc5, 0xdd, 0xf9, 0xdb, 0x4e, 0x48, + 0x52, 0xd8, 0xe6, 0x4b, 0x15, 0x90, 0x68, 0xbe, 0xca, 0xc1, 0x7c, 0xd3, + 0x51, 0x6b, 0x45, 0x46, 0x54, 0x11, 0x1a, 0x71, 0xd3, 0xcd, 0x6b, 0x8f, + 0x79, 0x22, 0x83, 0x02, 0x08, 0x4f, 0xba, 0x6a, 0x98, 0xed, 0x32, 0xd8, + 0xb4, 0x5b, 0x51, 0x88, 0x53, 0xec, 0x2c, 0x7e, 0xa4, 0x89, 0xdc, 0xbf, + 0xf9, 0x0d, 0x32, 0xc8, 0xc3, 0xec, 0x6d, 0x2e, 0xf1, 0xbc, 0x70, 0x4e, + 0xf6, 0x9e, 0xbc, 0x31, 0x02, 0x81, 0x81, 0x00, 0xd3, 0x35, 0x1b, 0x19, + 0x75, 0x3f, 0x61, 0xf2, 0x55, 0x03, 0xce, 0x25, 0xa9, 0xdf, 0x0c, 0x0a, + 0x3b, 0x47, 0x42, 0xdc, 0x38, 0x4b, 0x13, 0x4d, 0x1f, 0x86, 0x58, 0x4f, + 0xd8, 0xee, 0xfa, 0x76, 0x15, 0xfb, 0x6e, 0x55, 0x31, 0xf2, 0xd2, 0x62, + 0x32, 0xa5, 0xc4, 0x23, 0x5e, 0x08, 0xa9, 0x83, 0x07, 0xac, 0x8c, 0xa3, + 0x7e, 0x18, 0xc0, 0x1c, 0x57, 0x63, 0x8d, 0x05, 0x17, 0x47, 0x1b, 0xd3, + 0x74, 0x73, 0x20, 0x04, 0xfb, 0xc8, 0x1a, 0x43, 0x04, 0x36, 0xc8, 0x19, + 0xbe, 0xdc, 0xa6, 0xe5, 0x0f, 0x25, 0x62, 0x24, 0x96, 0x92, 0xb6, 0xb3, + 0x97, 0xad, 0x57, 0x9a, 0x90, 0x37, 0x4e, 0x31, 0x44, 0x74, 0xfa, 0x7c, + 0xb4, 0xea, 0xfc, 0x15, 0xa7, 0xb0, 0x51, 0xcc, 0xee, 0x1e, 0xed, 0x5b, + 0x98, 0x18, 0x0e, 0x65, 0xb6, 0x4b, 0x69, 0x0b, 0x21, 0xdc, 0x86, 0x17, + 0x6e, 0xc8, 0xee, 0x24}; static const unsigned char kTestRsaPrivateKey4CarmichaelTotient_2048[] = { - 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, - 0x82, 0x01, 0x01, 0x00, 0xb5, 0xed, 0x90, 0x77, - 0xfe, 0xb4, 0xac, 0x2c, 0x7a, 0x53, 0x0a, 0xe0, - 0x94, 0x87, 0xfe, 0xc7, 0xc4, 0xa8, 0x3f, 0x09, - 0x5b, 0xdd, 0xa7, 0x6e, 0x70, 0xc9, 0xf0, 0xef, - 0x9e, 0x47, 0xad, 0xcf, 0xbe, 0xdc, 0x9b, 0x89, - 0xc7, 0xbd, 0xb5, 0x2f, 0xa9, 0x43, 0x97, 0xd5, - 0x5b, 0xae, 0x73, 0x46, 0xa9, 0x10, 0x47, 0x67, - 0x35, 0xa0, 0x6e, 0xfc, 0xfb, 0x45, 0xf8, 0x85, - 0xb0, 0xf1, 0xd3, 0x67, 0x84, 0x91, 0x03, 0x1b, - 0x90, 0xb1, 0x18, 0x12, 0xa4, 0x15, 0x7a, 0x65, - 0xfa, 0x74, 0x4f, 0x73, 0x34, 0x70, 0x9b, 0x64, - 0x91, 0x1f, 0x89, 0x4f, 0x40, 0x2d, 0x37, 0x2f, - 0xbf, 0x2b, 0x1e, 0x54, 0x95, 0x7c, 0x16, 0x14, - 0xd3, 0x60, 0xf4, 0xd7, 0x86, 0xf7, 0x0c, 0x2c, - 0xbb, 0x3f, 0xe7, 0x49, 0xdf, 0x74, 0x8b, 0xc9, - 0x8f, 0x7c, 0x22, 0x23, 0xd9, 0xbd, 0x2a, 0x57, - 0xfe, 0xfb, 0x7a, 0x77, 0x91, 0xce, 0xa9, 0xd8, - 0xa7, 0xfb, 0xf5, 0xe7, 0x39, 0xbe, 0xfb, 0xf5, - 0x47, 0x57, 0x48, 0xe7, 0x71, 0x37, 0xda, 0x53, - 0xe7, 0x89, 0xd3, 0x37, 0x31, 0x98, 0xba, 0xd8, - 0xd0, 0xd9, 0x74, 0xb2, 0xda, 0x06, 0x99, 0x3b, - 0x97, 0x87, 0xc4, 0x22, 0x3c, 0xf7, 0xa3, 0x13, - 0x84, 0x49, 0x27, 0x74, 0x50, 0x03, 0x51, 0xea, - 0xc9, 0x57, 0xeb, 0x16, 0xa9, 0x7a, 0xea, 0x3c, - 0x26, 0xda, 0xcb, 0xc6, 0x86, 0x85, 0xfc, 0xd0, - 0x73, 0x26, 0xce, 0xe8, 0xd9, 0x92, 0x09, 0xaf, - 0x68, 0x0c, 0x01, 0x8d, 0x95, 0xfd, 0x8d, 0x01, - 0xde, 0x26, 0x0f, 0x25, 0xb9, 0xd5, 0x80, 0x99, - 0x62, 0xb1, 0x71, 0xcd, 0xa1, 0x5f, 0x52, 0xab, - 0x97, 0x97, 0x3f, 0xa7, 0x93, 0x40, 0x89, 0x4f, - 0xbc, 0x7d, 0x99, 0x7a, 0x7e, 0x35, 0xa5, 0xfc, - 0x74, 0xfb, 0xe4, 0x5a, 0x0b, 0xed, 0xf0, 0xef, - 0x65, 0xed, 0x22, 0x95, 0x02, 0x03, 0x01, 0x00, - 0x01, 0x02, 0x82, 0x01, 0x00, 0x35, 0x4a, 0x9d, - 0x36, 0xa1, 0x3c, 0x50, 0x71, 0x08, 0xf6, 0x19, - 0x6a, 0x16, 0xe8, 0x4d, 0x68, 0x3c, 0x41, 0xa2, - 0x91, 0x7d, 0xc1, 0x0c, 0xa2, 0x2b, 0xd4, 0xe3, - 0xc8, 0x75, 0x3f, 0x7e, 0xf9, 0x2b, 0x6a, 0x18, - 0xff, 0xbf, 0xac, 0x61, 0x0e, 0x50, 0x91, 0x55, - 0xc1, 0x30, 0x85, 0x86, 0x0c, 0x0d, 0x4b, 0x10, - 0xf7, 0x79, 0x3c, 0x81, 0x36, 0x86, 0xee, 0x84, - 0xb1, 0xb8, 0xd6, 0xe5, 0xbb, 0xdd, 0x97, 0xd2, - 0xe6, 0xb8, 0xb8, 0x3f, 0x9a, 0x7a, 0x49, 0x36, - 0x5c, 0xf8, 0x04, 0x29, 0x1f, 0xd0, 0x9d, 0x29, - 0xcf, 0xc8, 0x39, 0x0a, 0x32, 0x56, 0x54, 0xc8, - 0x65, 0x2a, 0xa5, 0x19, 0x51, 0xe2, 0xa6, 0x02, - 0x1b, 0xe0, 0x9d, 0x76, 0xab, 0x49, 0xc4, 0x45, - 0x63, 0x37, 0x08, 0xad, 0x9a, 0x34, 0xa4, 0x41, - 0xac, 0x6d, 0xe5, 0x09, 0x65, 0x22, 0x0b, 0xa9, - 0x03, 0x34, 0xd4, 0x7a, 0x97, 0x5c, 0x5d, 0xdc, - 0xa3, 0xae, 0xfd, 0xe8, 0xd6, 0xe8, 0xf8, 0x52, - 0x44, 0x9c, 0xf6, 0x00, 0xe3, 0x8e, 0xad, 0xee, - 0xa3, 0x82, 0x8a, 0x85, 0x07, 0x8b, 0x46, 0x12, - 0x0f, 0xa1, 0xca, 0x07, 0x0d, 0x50, 0x02, 0x96, - 0x71, 0x2f, 0x1b, 0x2b, 0x59, 0x17, 0x95, 0xec, - 0x90, 0xa6, 0xb9, 0x05, 0xff, 0xa2, 0x25, 0x75, - 0xc5, 0x57, 0x42, 0x37, 0x12, 0xa0, 0xb6, 0x09, - 0xa1, 0xe0, 0xef, 0x70, 0x85, 0xa7, 0x39, 0x47, - 0xb1, 0x72, 0x78, 0x0d, 0xf4, 0x4a, 0xa7, 0xca, - 0x92, 0x68, 0x2c, 0xe8, 0x53, 0x54, 0x52, 0xe2, - 0x21, 0xce, 0xaf, 0x7e, 0x56, 0x05, 0x74, 0xe1, - 0xb7, 0x18, 0xed, 0x7f, 0x83, 0xf6, 0x7d, 0x99, - 0x33, 0xf9, 0x60, 0x24, 0xae, 0x59, 0x09, 0xc0, - 0x95, 0x90, 0x5a, 0x19, 0x25, 0xb0, 0x79, 0xfd, - 0x0b, 0x2c, 0x73, 0x85, 0xc5, 0xa0, 0xe5, 0x7b, - 0x3a, 0x47, 0xce, 0x8d, 0x03, 0x02, 0x81, 0x81, - 0x00, 0xe2, 0xd7, 0xeb, 0x7f, 0xc1, 0x1f, 0x13, - 0x8f, 0x52, 0x49, 0xa2, 0x83, 0x22, 0xb7, 0x3d, - 0x93, 0xfe, 0xe7, 0x20, 0x03, 0xf6, 0x6c, 0xd8, - 0x95, 0x25, 0xef, 0x5f, 0xa4, 0xd4, 0x8f, 0xb1, - 0x38, 0x39, 0x7c, 0xe0, 0xdd, 0xff, 0x56, 0xa7, - 0xdf, 0x59, 0xe1, 0x26, 0x36, 0x72, 0x78, 0xdf, - 0xd4, 0x19, 0xc0, 0x37, 0x58, 0x75, 0x85, 0xdd, - 0x8b, 0x2e, 0x73, 0xfa, 0xf5, 0x65, 0x93, 0xc7, - 0x36, 0x3d, 0xb7, 0x8e, 0xa9, 0x5e, 0x41, 0x71, - 0x55, 0x1d, 0x22, 0x83, 0x13, 0x91, 0x76, 0xa4, - 0x80, 0xa0, 0xac, 0xf6, 0xd5, 0xbb, 0x6a, 0xf3, - 0x47, 0x01, 0x81, 0x3d, 0x34, 0xd6, 0x32, 0x49, - 0xb2, 0xc9, 0xa7, 0xb3, 0x93, 0x64, 0x47, 0x6d, - 0x30, 0x8b, 0x23, 0xbd, 0xf0, 0xe8, 0x3c, 0xb5, - 0x4e, 0x33, 0x74, 0x4b, 0x60, 0x38, 0x25, 0x89, - 0xaf, 0xf8, 0x86, 0x53, 0x73, 0x62, 0x74, 0x35, - 0xb7, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x4f, 0xbd, - 0xe1, 0x43, 0xb4, 0xfe, 0x9a, 0x50, 0xb8, 0xeb, - 0xf3, 0xd6, 0x3f, 0x2a, 0xbe, 0x19, 0x7a, 0x2c, - 0xf4, 0x63, 0x35, 0x29, 0x47, 0x39, 0x17, 0xb4, - 0xc7, 0x58, 0xc0, 0x5a, 0xbf, 0x5c, 0xa4, 0xcf, - 0x9e, 0x4b, 0xad, 0x5a, 0x95, 0xfd, 0xfa, 0x50, - 0xbe, 0x54, 0x12, 0xbe, 0xd8, 0x8e, 0xaf, 0x8b, - 0xb2, 0x15, 0xa1, 0xb5, 0x78, 0x03, 0xa6, 0x3b, - 0x18, 0x13, 0x1d, 0xfe, 0x38, 0xb7, 0x65, 0x1e, - 0x20, 0x39, 0xa9, 0x25, 0x37, 0xed, 0xe8, 0x5b, - 0xc7, 0xd0, 0x60, 0xe2, 0x1f, 0xf2, 0x06, 0x5d, - 0x3c, 0x5c, 0x36, 0xe0, 0xc6, 0x83, 0x52, 0xd3, - 0xd3, 0x3f, 0x7c, 0x43, 0x82, 0x4a, 0x13, 0xf8, - 0x8d, 0x48, 0x03, 0x4f, 0xb8, 0xad, 0x64, 0x85, - 0xa9, 0xee, 0xde, 0x3d, 0x0c, 0x23, 0xb6, 0xe9, - 0x8d, 0xad, 0x02, 0x62, 0x32, 0x58, 0x39, 0xbf, - 0x5f, 0x3c, 0x6c, 0x0a, 0x13, 0x02, 0x81, 0x80, - 0x7f, 0x87, 0x3c, 0x12, 0x3a, 0x94, 0x29, 0xfe, - 0xed, 0x18, 0x10, 0x91, 0x00, 0xb7, 0x5b, 0x9b, - 0x14, 0x37, 0x03, 0xbc, 0xb6, 0x91, 0x42, 0xc1, - 0xb6, 0xed, 0xf8, 0x2b, 0x46, 0x84, 0xf1, 0xf0, - 0xd6, 0x00, 0xea, 0xba, 0x63, 0x8e, 0x68, 0x1a, - 0x1d, 0x01, 0x82, 0xe6, 0x21, 0x3c, 0xeb, 0x38, - 0xe6, 0xb1, 0x35, 0x6c, 0x39, 0xc5, 0xe4, 0x63, - 0x16, 0xde, 0x85, 0x3b, 0xe8, 0xbb, 0x47, 0xc7, - 0xaa, 0xb2, 0xc3, 0x35, 0x5c, 0x94, 0x16, 0x0e, - 0xef, 0xae, 0x33, 0x5a, 0x90, 0xf0, 0xce, 0x52, - 0xb2, 0x02, 0x0b, 0x52, 0xe5, 0x66, 0x9f, 0x16, - 0x50, 0x36, 0x44, 0x1e, 0xac, 0x3c, 0xe1, 0x49, - 0xee, 0x2c, 0xa5, 0xbc, 0x3b, 0x28, 0x1c, 0xae, - 0xa9, 0xca, 0x92, 0x42, 0x19, 0x8d, 0xe7, 0xaf, - 0xeb, 0x25, 0x7a, 0x2a, 0xc1, 0xe5, 0xf8, 0x9e, - 0x41, 0x6d, 0xe3, 0x04, 0x7f, 0x59, 0x2d, 0xc9, - 0x02, 0x81, 0x81, 0x00, 0xbe, 0xc3, 0x51, 0xdd, - 0x25, 0x48, 0xdd, 0xab, 0xca, 0x47, 0x17, 0xcd, - 0x57, 0x0b, 0x18, 0x0e, 0xcb, 0xa3, 0x4e, 0x73, - 0xc0, 0x5e, 0x1b, 0xbd, 0x76, 0x99, 0xc5, 0x39, - 0xd8, 0x07, 0xda, 0x09, 0xa5, 0xed, 0xe8, 0x8e, - 0xdf, 0x27, 0xf2, 0x5c, 0x1d, 0x40, 0xe0, 0x97, - 0x07, 0x8c, 0xe7, 0x50, 0x55, 0xbb, 0x5c, 0x24, - 0x1a, 0x9f, 0x46, 0xfa, 0x7d, 0x01, 0x8e, 0x34, - 0xbf, 0x46, 0x85, 0xf8, 0x72, 0xc6, 0x7c, 0x68, - 0x5a, 0xcb, 0x03, 0xae, 0xe4, 0xd9, 0x99, 0xb5, - 0x9d, 0xb2, 0xf7, 0x47, 0xd1, 0x5c, 0x02, 0x73, - 0x5c, 0x07, 0x0d, 0x70, 0xc5, 0x82, 0x47, 0x19, - 0x28, 0x0a, 0xb0, 0xbb, 0x35, 0x53, 0x3b, 0x05, - 0x22, 0x9d, 0x19, 0x0c, 0xb1, 0xe7, 0x0d, 0x9e, - 0xa8, 0x38, 0x4c, 0x26, 0xa4, 0x64, 0x86, 0xbb, - 0x41, 0xbe, 0x4e, 0x39, 0x12, 0xea, 0x8d, 0x1a, - 0xd3, 0x0c, 0x5b, 0x8b, 0x02, 0x81, 0x81, 0x00, - 0xa9, 0x2d, 0x4b, 0x43, 0x55, 0x7f, 0x90, 0xb4, - 0xea, 0xf9, 0xc2, 0x4c, 0x8c, 0x4d, 0xee, 0x62, - 0x85, 0xd2, 0x58, 0x71, 0xc7, 0xb3, 0xfb, 0x80, - 0x37, 0xd9, 0xc5, 0x20, 0x61, 0xeb, 0x39, 0x7f, - 0x4d, 0x09, 0x7c, 0x32, 0x46, 0x8b, 0x49, 0xa4, - 0xd6, 0x99, 0xb4, 0xdc, 0xb6, 0xe3, 0x2a, 0x77, - 0x53, 0xa3, 0xee, 0xdb, 0x4d, 0xf9, 0x59, 0x20, - 0x8a, 0x83, 0x94, 0x29, 0x72, 0x96, 0x76, 0x36, - 0x63, 0xbe, 0xa1, 0xe8, 0x94, 0xf9, 0x50, 0x71, - 0x56, 0xaa, 0xeb, 0x90, 0x06, 0xf2, 0x05, 0xb1, - 0x19, 0xf0, 0x13, 0x89, 0x2d, 0x7b, 0x94, 0xb7, - 0xf2, 0x18, 0xfa, 0x52, 0x09, 0x82, 0x99, 0x20, - 0xe9, 0x7a, 0x1c, 0x68, 0xfe, 0x44, 0xe5, 0xf8, - 0xc5, 0xd3, 0xc6, 0x66, 0x3d, 0xe3, 0x43, 0xc3, - 0x63, 0x81, 0xff, 0x78, 0x91, 0x5c, 0x48, 0x16, - 0xbe, 0x92, 0x90, 0x2f, 0x10, 0x9f, 0x2d, 0x17 -}; + 0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xb5, 0xed, 0x90, 0x77, 0xfe, 0xb4, 0xac, 0x2c, 0x7a, 0x53, 0x0a, 0xe0, + 0x94, 0x87, 0xfe, 0xc7, 0xc4, 0xa8, 0x3f, 0x09, 0x5b, 0xdd, 0xa7, 0x6e, + 0x70, 0xc9, 0xf0, 0xef, 0x9e, 0x47, 0xad, 0xcf, 0xbe, 0xdc, 0x9b, 0x89, + 0xc7, 0xbd, 0xb5, 0x2f, 0xa9, 0x43, 0x97, 0xd5, 0x5b, 0xae, 0x73, 0x46, + 0xa9, 0x10, 0x47, 0x67, 0x35, 0xa0, 0x6e, 0xfc, 0xfb, 0x45, 0xf8, 0x85, + 0xb0, 0xf1, 0xd3, 0x67, 0x84, 0x91, 0x03, 0x1b, 0x90, 0xb1, 0x18, 0x12, + 0xa4, 0x15, 0x7a, 0x65, 0xfa, 0x74, 0x4f, 0x73, 0x34, 0x70, 0x9b, 0x64, + 0x91, 0x1f, 0x89, 0x4f, 0x40, 0x2d, 0x37, 0x2f, 0xbf, 0x2b, 0x1e, 0x54, + 0x95, 0x7c, 0x16, 0x14, 0xd3, 0x60, 0xf4, 0xd7, 0x86, 0xf7, 0x0c, 0x2c, + 0xbb, 0x3f, 0xe7, 0x49, 0xdf, 0x74, 0x8b, 0xc9, 0x8f, 0x7c, 0x22, 0x23, + 0xd9, 0xbd, 0x2a, 0x57, 0xfe, 0xfb, 0x7a, 0x77, 0x91, 0xce, 0xa9, 0xd8, + 0xa7, 0xfb, 0xf5, 0xe7, 0x39, 0xbe, 0xfb, 0xf5, 0x47, 0x57, 0x48, 0xe7, + 0x71, 0x37, 0xda, 0x53, 0xe7, 0x89, 0xd3, 0x37, 0x31, 0x98, 0xba, 0xd8, + 0xd0, 0xd9, 0x74, 0xb2, 0xda, 0x06, 0x99, 0x3b, 0x97, 0x87, 0xc4, 0x22, + 0x3c, 0xf7, 0xa3, 0x13, 0x84, 0x49, 0x27, 0x74, 0x50, 0x03, 0x51, 0xea, + 0xc9, 0x57, 0xeb, 0x16, 0xa9, 0x7a, 0xea, 0x3c, 0x26, 0xda, 0xcb, 0xc6, + 0x86, 0x85, 0xfc, 0xd0, 0x73, 0x26, 0xce, 0xe8, 0xd9, 0x92, 0x09, 0xaf, + 0x68, 0x0c, 0x01, 0x8d, 0x95, 0xfd, 0x8d, 0x01, 0xde, 0x26, 0x0f, 0x25, + 0xb9, 0xd5, 0x80, 0x99, 0x62, 0xb1, 0x71, 0xcd, 0xa1, 0x5f, 0x52, 0xab, + 0x97, 0x97, 0x3f, 0xa7, 0x93, 0x40, 0x89, 0x4f, 0xbc, 0x7d, 0x99, 0x7a, + 0x7e, 0x35, 0xa5, 0xfc, 0x74, 0xfb, 0xe4, 0x5a, 0x0b, 0xed, 0xf0, 0xef, + 0x65, 0xed, 0x22, 0x95, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, + 0x00, 0x35, 0x4a, 0x9d, 0x36, 0xa1, 0x3c, 0x50, 0x71, 0x08, 0xf6, 0x19, + 0x6a, 0x16, 0xe8, 0x4d, 0x68, 0x3c, 0x41, 0xa2, 0x91, 0x7d, 0xc1, 0x0c, + 0xa2, 0x2b, 0xd4, 0xe3, 0xc8, 0x75, 0x3f, 0x7e, 0xf9, 0x2b, 0x6a, 0x18, + 0xff, 0xbf, 0xac, 0x61, 0x0e, 0x50, 0x91, 0x55, 0xc1, 0x30, 0x85, 0x86, + 0x0c, 0x0d, 0x4b, 0x10, 0xf7, 0x79, 0x3c, 0x81, 0x36, 0x86, 0xee, 0x84, + 0xb1, 0xb8, 0xd6, 0xe5, 0xbb, 0xdd, 0x97, 0xd2, 0xe6, 0xb8, 0xb8, 0x3f, + 0x9a, 0x7a, 0x49, 0x36, 0x5c, 0xf8, 0x04, 0x29, 0x1f, 0xd0, 0x9d, 0x29, + 0xcf, 0xc8, 0x39, 0x0a, 0x32, 0x56, 0x54, 0xc8, 0x65, 0x2a, 0xa5, 0x19, + 0x51, 0xe2, 0xa6, 0x02, 0x1b, 0xe0, 0x9d, 0x76, 0xab, 0x49, 0xc4, 0x45, + 0x63, 0x37, 0x08, 0xad, 0x9a, 0x34, 0xa4, 0x41, 0xac, 0x6d, 0xe5, 0x09, + 0x65, 0x22, 0x0b, 0xa9, 0x03, 0x34, 0xd4, 0x7a, 0x97, 0x5c, 0x5d, 0xdc, + 0xa3, 0xae, 0xfd, 0xe8, 0xd6, 0xe8, 0xf8, 0x52, 0x44, 0x9c, 0xf6, 0x00, + 0xe3, 0x8e, 0xad, 0xee, 0xa3, 0x82, 0x8a, 0x85, 0x07, 0x8b, 0x46, 0x12, + 0x0f, 0xa1, 0xca, 0x07, 0x0d, 0x50, 0x02, 0x96, 0x71, 0x2f, 0x1b, 0x2b, + 0x59, 0x17, 0x95, 0xec, 0x90, 0xa6, 0xb9, 0x05, 0xff, 0xa2, 0x25, 0x75, + 0xc5, 0x57, 0x42, 0x37, 0x12, 0xa0, 0xb6, 0x09, 0xa1, 0xe0, 0xef, 0x70, + 0x85, 0xa7, 0x39, 0x47, 0xb1, 0x72, 0x78, 0x0d, 0xf4, 0x4a, 0xa7, 0xca, + 0x92, 0x68, 0x2c, 0xe8, 0x53, 0x54, 0x52, 0xe2, 0x21, 0xce, 0xaf, 0x7e, + 0x56, 0x05, 0x74, 0xe1, 0xb7, 0x18, 0xed, 0x7f, 0x83, 0xf6, 0x7d, 0x99, + 0x33, 0xf9, 0x60, 0x24, 0xae, 0x59, 0x09, 0xc0, 0x95, 0x90, 0x5a, 0x19, + 0x25, 0xb0, 0x79, 0xfd, 0x0b, 0x2c, 0x73, 0x85, 0xc5, 0xa0, 0xe5, 0x7b, + 0x3a, 0x47, 0xce, 0x8d, 0x03, 0x02, 0x81, 0x81, 0x00, 0xe2, 0xd7, 0xeb, + 0x7f, 0xc1, 0x1f, 0x13, 0x8f, 0x52, 0x49, 0xa2, 0x83, 0x22, 0xb7, 0x3d, + 0x93, 0xfe, 0xe7, 0x20, 0x03, 0xf6, 0x6c, 0xd8, 0x95, 0x25, 0xef, 0x5f, + 0xa4, 0xd4, 0x8f, 0xb1, 0x38, 0x39, 0x7c, 0xe0, 0xdd, 0xff, 0x56, 0xa7, + 0xdf, 0x59, 0xe1, 0x26, 0x36, 0x72, 0x78, 0xdf, 0xd4, 0x19, 0xc0, 0x37, + 0x58, 0x75, 0x85, 0xdd, 0x8b, 0x2e, 0x73, 0xfa, 0xf5, 0x65, 0x93, 0xc7, + 0x36, 0x3d, 0xb7, 0x8e, 0xa9, 0x5e, 0x41, 0x71, 0x55, 0x1d, 0x22, 0x83, + 0x13, 0x91, 0x76, 0xa4, 0x80, 0xa0, 0xac, 0xf6, 0xd5, 0xbb, 0x6a, 0xf3, + 0x47, 0x01, 0x81, 0x3d, 0x34, 0xd6, 0x32, 0x49, 0xb2, 0xc9, 0xa7, 0xb3, + 0x93, 0x64, 0x47, 0x6d, 0x30, 0x8b, 0x23, 0xbd, 0xf0, 0xe8, 0x3c, 0xb5, + 0x4e, 0x33, 0x74, 0x4b, 0x60, 0x38, 0x25, 0x89, 0xaf, 0xf8, 0x86, 0x53, + 0x73, 0x62, 0x74, 0x35, 0xb7, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x4f, 0xbd, + 0xe1, 0x43, 0xb4, 0xfe, 0x9a, 0x50, 0xb8, 0xeb, 0xf3, 0xd6, 0x3f, 0x2a, + 0xbe, 0x19, 0x7a, 0x2c, 0xf4, 0x63, 0x35, 0x29, 0x47, 0x39, 0x17, 0xb4, + 0xc7, 0x58, 0xc0, 0x5a, 0xbf, 0x5c, 0xa4, 0xcf, 0x9e, 0x4b, 0xad, 0x5a, + 0x95, 0xfd, 0xfa, 0x50, 0xbe, 0x54, 0x12, 0xbe, 0xd8, 0x8e, 0xaf, 0x8b, + 0xb2, 0x15, 0xa1, 0xb5, 0x78, 0x03, 0xa6, 0x3b, 0x18, 0x13, 0x1d, 0xfe, + 0x38, 0xb7, 0x65, 0x1e, 0x20, 0x39, 0xa9, 0x25, 0x37, 0xed, 0xe8, 0x5b, + 0xc7, 0xd0, 0x60, 0xe2, 0x1f, 0xf2, 0x06, 0x5d, 0x3c, 0x5c, 0x36, 0xe0, + 0xc6, 0x83, 0x52, 0xd3, 0xd3, 0x3f, 0x7c, 0x43, 0x82, 0x4a, 0x13, 0xf8, + 0x8d, 0x48, 0x03, 0x4f, 0xb8, 0xad, 0x64, 0x85, 0xa9, 0xee, 0xde, 0x3d, + 0x0c, 0x23, 0xb6, 0xe9, 0x8d, 0xad, 0x02, 0x62, 0x32, 0x58, 0x39, 0xbf, + 0x5f, 0x3c, 0x6c, 0x0a, 0x13, 0x02, 0x81, 0x80, 0x7f, 0x87, 0x3c, 0x12, + 0x3a, 0x94, 0x29, 0xfe, 0xed, 0x18, 0x10, 0x91, 0x00, 0xb7, 0x5b, 0x9b, + 0x14, 0x37, 0x03, 0xbc, 0xb6, 0x91, 0x42, 0xc1, 0xb6, 0xed, 0xf8, 0x2b, + 0x46, 0x84, 0xf1, 0xf0, 0xd6, 0x00, 0xea, 0xba, 0x63, 0x8e, 0x68, 0x1a, + 0x1d, 0x01, 0x82, 0xe6, 0x21, 0x3c, 0xeb, 0x38, 0xe6, 0xb1, 0x35, 0x6c, + 0x39, 0xc5, 0xe4, 0x63, 0x16, 0xde, 0x85, 0x3b, 0xe8, 0xbb, 0x47, 0xc7, + 0xaa, 0xb2, 0xc3, 0x35, 0x5c, 0x94, 0x16, 0x0e, 0xef, 0xae, 0x33, 0x5a, + 0x90, 0xf0, 0xce, 0x52, 0xb2, 0x02, 0x0b, 0x52, 0xe5, 0x66, 0x9f, 0x16, + 0x50, 0x36, 0x44, 0x1e, 0xac, 0x3c, 0xe1, 0x49, 0xee, 0x2c, 0xa5, 0xbc, + 0x3b, 0x28, 0x1c, 0xae, 0xa9, 0xca, 0x92, 0x42, 0x19, 0x8d, 0xe7, 0xaf, + 0xeb, 0x25, 0x7a, 0x2a, 0xc1, 0xe5, 0xf8, 0x9e, 0x41, 0x6d, 0xe3, 0x04, + 0x7f, 0x59, 0x2d, 0xc9, 0x02, 0x81, 0x81, 0x00, 0xbe, 0xc3, 0x51, 0xdd, + 0x25, 0x48, 0xdd, 0xab, 0xca, 0x47, 0x17, 0xcd, 0x57, 0x0b, 0x18, 0x0e, + 0xcb, 0xa3, 0x4e, 0x73, 0xc0, 0x5e, 0x1b, 0xbd, 0x76, 0x99, 0xc5, 0x39, + 0xd8, 0x07, 0xda, 0x09, 0xa5, 0xed, 0xe8, 0x8e, 0xdf, 0x27, 0xf2, 0x5c, + 0x1d, 0x40, 0xe0, 0x97, 0x07, 0x8c, 0xe7, 0x50, 0x55, 0xbb, 0x5c, 0x24, + 0x1a, 0x9f, 0x46, 0xfa, 0x7d, 0x01, 0x8e, 0x34, 0xbf, 0x46, 0x85, 0xf8, + 0x72, 0xc6, 0x7c, 0x68, 0x5a, 0xcb, 0x03, 0xae, 0xe4, 0xd9, 0x99, 0xb5, + 0x9d, 0xb2, 0xf7, 0x47, 0xd1, 0x5c, 0x02, 0x73, 0x5c, 0x07, 0x0d, 0x70, + 0xc5, 0x82, 0x47, 0x19, 0x28, 0x0a, 0xb0, 0xbb, 0x35, 0x53, 0x3b, 0x05, + 0x22, 0x9d, 0x19, 0x0c, 0xb1, 0xe7, 0x0d, 0x9e, 0xa8, 0x38, 0x4c, 0x26, + 0xa4, 0x64, 0x86, 0xbb, 0x41, 0xbe, 0x4e, 0x39, 0x12, 0xea, 0x8d, 0x1a, + 0xd3, 0x0c, 0x5b, 0x8b, 0x02, 0x81, 0x81, 0x00, 0xa9, 0x2d, 0x4b, 0x43, + 0x55, 0x7f, 0x90, 0xb4, 0xea, 0xf9, 0xc2, 0x4c, 0x8c, 0x4d, 0xee, 0x62, + 0x85, 0xd2, 0x58, 0x71, 0xc7, 0xb3, 0xfb, 0x80, 0x37, 0xd9, 0xc5, 0x20, + 0x61, 0xeb, 0x39, 0x7f, 0x4d, 0x09, 0x7c, 0x32, 0x46, 0x8b, 0x49, 0xa4, + 0xd6, 0x99, 0xb4, 0xdc, 0xb6, 0xe3, 0x2a, 0x77, 0x53, 0xa3, 0xee, 0xdb, + 0x4d, 0xf9, 0x59, 0x20, 0x8a, 0x83, 0x94, 0x29, 0x72, 0x96, 0x76, 0x36, + 0x63, 0xbe, 0xa1, 0xe8, 0x94, 0xf9, 0x50, 0x71, 0x56, 0xaa, 0xeb, 0x90, + 0x06, 0xf2, 0x05, 0xb1, 0x19, 0xf0, 0x13, 0x89, 0x2d, 0x7b, 0x94, 0xb7, + 0xf2, 0x18, 0xfa, 0x52, 0x09, 0x82, 0x99, 0x20, 0xe9, 0x7a, 0x1c, 0x68, + 0xfe, 0x44, 0xe5, 0xf8, 0xc5, 0xd3, 0xc6, 0x66, 0x3d, 0xe3, 0x43, 0xc3, + 0x63, 0x81, 0xff, 0x78, 0x91, 0x5c, 0x48, 0x16, 0xbe, 0x92, 0x90, 0x2f, + 0x10, 0x9f, 0x2d, 0x17}; -RsaTestKeys::RsaTestKeys() : - private_key_1_3072_bits_(std::begin(kTestRsaPrivateKey1_3072), - std::end(kTestRsaPrivateKey1_3072)), - public_key_1_3072_bits_(std::begin(kTestRsaPublicKey1_3072), - std::end(kTestRsaPublicKey1_3072)), - private_key_2_2048_bits_(std::begin(kTestRsaPrivateKey2_2048), - std::end(kTestRsaPrivateKey2_2048)), - public_key_2_2048_bits_(std::begin(kTestRsaPublicKey2_2048), - std::end(kTestRsaPublicKey2_2048)), - private_key_3_2048_bits_(std::begin(kTestRsaPrivateKey3_2048), - std::end(kTestRsaPrivateKey3_2048)), - public_key_3_2048_bits_(std::begin(kTestRsaPublicKey3_2048), - std::end(kTestRsaPublicKey3_2048)), - private_key_2_carmichael_totient_2048_bits_( - std::begin(kTestRsaPrivateKey2CarmichaelTotient_2048), - std::end(kTestRsaPrivateKey2CarmichaelTotient_2048)), - private_key_3_carmichael_totient_2048_bits_( - std::begin(kTestRsaPrivateKey3CarmichaelTotient_2048), - std::end(kTestRsaPrivateKey3CarmichaelTotient_2048)), - private_key_4_carmichael_totient_2048_bits_( - std::begin(kTestRsaPrivateKey4CarmichaelTotient_2048), - std::end(kTestRsaPrivateKey4CarmichaelTotient_2048)) { -} +RsaTestKeys::RsaTestKeys() + : private_key_1_3072_bits_(std::begin(kTestRsaPrivateKey1_3072), + std::end(kTestRsaPrivateKey1_3072)), + public_key_1_3072_bits_(std::begin(kTestRsaPublicKey1_3072), + std::end(kTestRsaPublicKey1_3072)), + private_key_2_2048_bits_(std::begin(kTestRsaPrivateKey2_2048), + std::end(kTestRsaPrivateKey2_2048)), + public_key_2_2048_bits_(std::begin(kTestRsaPublicKey2_2048), + std::end(kTestRsaPublicKey2_2048)), + private_key_3_2048_bits_(std::begin(kTestRsaPrivateKey3_2048), + std::end(kTestRsaPrivateKey3_2048)), + public_key_3_2048_bits_(std::begin(kTestRsaPublicKey3_2048), + std::end(kTestRsaPublicKey3_2048)), + private_key_2_carmichael_totient_2048_bits_( + std::begin(kTestRsaPrivateKey2CarmichaelTotient_2048), + std::end(kTestRsaPrivateKey2CarmichaelTotient_2048)), + private_key_3_carmichael_totient_2048_bits_( + std::begin(kTestRsaPrivateKey3CarmichaelTotient_2048), + std::end(kTestRsaPrivateKey3CarmichaelTotient_2048)), + private_key_4_carmichael_totient_2048_bits_( + std::begin(kTestRsaPrivateKey4CarmichaelTotient_2048), + std::end(kTestRsaPrivateKey4CarmichaelTotient_2048)) {} } // namespace widevine diff --git a/common/rsa_util.cc b/common/rsa_util.cc index f32219d..d9a4b5c 100644 --- a/common/rsa_util.cc +++ b/common/rsa_util.cc @@ -42,8 +42,9 @@ static bool SerializeRsaKey(const RSA* key, std::string* serialized_key, return false; } if (serialized_key == nullptr) { - LOG(ERROR) << "Pointer to hold serialized RSA" << (serialize_private_key ? - "Private" : "Public") << "Key is nullptr."; + LOG(ERROR) << "Pointer to hold serialized RSA" + << (serialize_private_key ? "Private" : "Public") + << "Key is nullptr."; return false; } BIO* bio = BIO_new(BIO_s_mem()); @@ -52,9 +53,9 @@ static bool SerializeRsaKey(const RSA* key, std::string* serialized_key, return false; } bool success = false; - if ((serialize_private_key ? - i2d_RSAPrivateKey_bio(bio, const_cast(key)) : - i2d_RSAPublicKey_bio(bio, const_cast(key))) != 0) { + if ((serialize_private_key + ? i2d_RSAPrivateKey_bio(bio, const_cast(key)) + : i2d_RSAPublicKey_bio(bio, const_cast(key))) != 0) { int serialized_size = BIO_pending(bio); serialized_key->assign(serialized_size, 0); if (BIO_read(bio, &(*serialized_key)[0], serialized_size) == @@ -64,8 +65,8 @@ static bool SerializeRsaKey(const RSA* key, std::string* serialized_key, LOG(ERROR) << "BIO_read failure"; } } else { - LOG(ERROR) << (serialize_private_key ? "Private" : "Public") << - " key serialization failure"; + LOG(ERROR) << (serialize_private_key ? "Private" : "Public") + << " key serialization failure"; } BIO_free(bio); return success; @@ -74,13 +75,15 @@ static bool SerializeRsaKey(const RSA* key, std::string* serialized_key, static bool DeserializeRsaKey(const std::string& serialized_key, RSA** key, bool deserialize_private_key) { if (serialized_key.empty()) { - LOG(ERROR) << "Serialized RSA" << (deserialize_private_key ? - "Private" : "Public") << "Key is empty."; + LOG(ERROR) << "Serialized RSA" + << (deserialize_private_key ? "Private" : "Public") + << "Key is empty."; return false; } if (key == nullptr) { - LOG(ERROR) << "Pointer to hold new RSA " << (deserialize_private_key ? - "private" : "public") << " key is nullptr."; + LOG(ERROR) << "Pointer to hold new RSA " + << (deserialize_private_key ? "private" : "public") + << " key is nullptr."; return false; } BIO* bio = BIO_new_mem_buf(const_cast(serialized_key.data()), @@ -89,12 +92,12 @@ static bool DeserializeRsaKey(const std::string& serialized_key, RSA** key, LOG(ERROR) << "BIO_new_mem_buf returned nullptr"; return false; } - *key = deserialize_private_key ? d2i_RSAPrivateKey_bio(bio, nullptr) : - d2i_RSAPublicKey_bio(bio, nullptr); + *key = deserialize_private_key ? d2i_RSAPrivateKey_bio(bio, nullptr) + : d2i_RSAPublicKey_bio(bio, nullptr); BIO_free(bio); if (*key == nullptr) { - LOG(ERROR) << (deserialize_private_key ? "Private" : "Public") << - " RSA key deserialization failure"; + LOG(ERROR) << (deserialize_private_key ? "Private" : "Public") + << " RSA key deserialization failure"; } return *key != nullptr; } @@ -139,7 +142,7 @@ bool SerializePrivateKeyInfo(const RSA* private_key, return false; } bool success = false; - PKCS8_PRIV_KEY_INFO *pkcs8_pki = nullptr; + PKCS8_PRIV_KEY_INFO* pkcs8_pki = nullptr; BIO* bio = nullptr; if (EVP_PKEY_set1_RSA(evp, const_cast(private_key)) == 0) { LOG(ERROR) << "EVP_PKEY_set1_RSA failed."; @@ -203,7 +206,7 @@ bool DeserializePrivateKeyInfo(const std::string& serialized_private_key, } bool success = false; EVP_PKEY* evp = nullptr; - PKCS8_PRIV_KEY_INFO *pkcs8_pki = d2i_PKCS8_PRIV_KEY_INFO_bio(bio, nullptr); + PKCS8_PRIV_KEY_INFO* pkcs8_pki = d2i_PKCS8_PRIV_KEY_INFO_bio(bio, nullptr); if (pkcs8_pki == nullptr) { LOG(ERROR) << "d2i_PKCS8_PRIV_KEY_INFO_bio returned nullptr."; goto cleanup; @@ -312,7 +315,7 @@ cleanup: namespace { // Password retrieval function used by DeserializeEncryptedPrivateKeyInfo below. -int get_password(char *buf, int size, int rwflag, void *u) { +int get_password(char* buf, int size, int rwflag, void* u) { CHECK(buf); CHECK(u); const std::string* pass(static_cast(u)); @@ -372,9 +375,8 @@ bool RsaPrivateKeyToEncryptedPrivateKeyInfo(const std::string& rsa_private_key, std::string* private_key_info) { RSA* key = nullptr; if (DeserializeRsaPrivateKey(rsa_private_key, &key)) { - bool success = SerializeEncryptedPrivateKeyInfo(key, - passphrase, - private_key_info); + bool success = + SerializeEncryptedPrivateKeyInfo(key, passphrase, private_key_info); RSA_free(key); return success; } @@ -449,8 +451,8 @@ bool ConvertToEulerTotient(const std::string& private_key, return false; } bssl::UniquePtr rsa(rsa_ptr); - if (!rsa_util::ConvertToEulerTotient(rsa.get()) - || !rsa_util::SerializeRsaPrivateKey(rsa.get(), euler_private_key)) { + if (!rsa_util::ConvertToEulerTotient(rsa.get()) || + !rsa_util::SerializeRsaPrivateKey(rsa.get(), euler_private_key)) { return false; } @@ -502,8 +504,8 @@ bool ConvertToCarmichaelTotient(const std::string& private_key, return false; } bssl::UniquePtr rsa(rsa_ptr); - if (!rsa_util::ConvertToCarmichaelTotient(rsa.get()) - || !rsa_util::SerializeRsaPrivateKey(rsa.get(), carmichael_private_key)) { + if (!rsa_util::ConvertToCarmichaelTotient(rsa.get()) || + !rsa_util::SerializeRsaPrivateKey(rsa.get(), carmichael_private_key)) { return false; } diff --git a/common/rsa_util.h b/common/rsa_util.h index 8e30a78..63e91f7 100644 --- a/common/rsa_util.h +++ b/common/rsa_util.h @@ -99,7 +99,6 @@ bool RsaPrivateKeyToPrivateKeyInfo(const std::string& rsa_private_key, bool PrivateKeyInfoToRsaPrivateKey(const std::string& private_key_info, std::string* rsa_private_key); - // Serialize RSA private key into DER encoded PKCS#8 EncryptedPrivateKeyInfo. // - private_key is the RSA key to be serialized, which must not be NULL. // - passphrase is the password to use for PKCS#5 v2.0 3DES encryption. diff --git a/common/rsa_util_test.cc b/common/rsa_util_test.cc index 5a0a087..23cdf4b 100644 --- a/common/rsa_util_test.cc +++ b/common/rsa_util_test.cc @@ -10,8 +10,6 @@ // Description: // Unit test for rsa_util RSA utilties library. -#include "common/rsa_util.h" - #include #include @@ -21,6 +19,7 @@ #include "testing/gunit.h" #include "openssl/bn.h" #include "common/rsa_test_keys.h" +#include "common/rsa_util.h" using ::testing::NotNull; diff --git a/common/sha_util_test.cc b/common/sha_util_test.cc index fcdcc3b..6adc7ca 100644 --- a/common/sha_util_test.cc +++ b/common/sha_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/sha_util.h" - #include "testing/gunit.h" #include "absl/strings/escaping.h" diff --git a/common/signing_key_util_test.cc b/common/signing_key_util_test.cc index 25bea55..ae017a8 100644 --- a/common/signing_key_util_test.cc +++ b/common/signing_key_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/signing_key_util.h" - #include "testing/gunit.h" #include "absl/strings/escaping.h" #include "common/crypto_util.h" diff --git a/common/string_util_test.cc b/common/string_util_test.cc index a28e619..9354571 100644 --- a/common/string_util_test.cc +++ b/common/string_util_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/string_util.h" - #include "testing/gmock.h" #include "testing/gunit.h" diff --git a/common/test_certificates.h b/common/test_certificates.h index 4dae390..598b492 100644 --- a/common/test_certificates.h +++ b/common/test_certificates.h @@ -24,9 +24,7 @@ class TestCertificates { virtual ~TestCertificates() {} // returns a test root certificate - const std::string& test_root_certificate() const { - return test_root_certificate_; - } + const std::string& test_root_certificate() const { return test_root_certificate_; } // returns a test intermediate certificate const std::string& test_intermediate_certificate() const { diff --git a/common/test_utils.h b/common/test_utils.h index 0527cac..e78ef12 100644 --- a/common/test_utils.h +++ b/common/test_utils.h @@ -9,8 +9,8 @@ // Description: // Auxiliary functions for license server SDK testing. -#ifndef COMMON_TEST_UTILS_H__ -#define COMMON_TEST_UTILS_H__ +#ifndef COMMON_TEST_UTILS_H_ +#define COMMON_TEST_UTILS_H_ #include @@ -29,4 +29,4 @@ util::Status GenerateRsaSignatureSha256Pkcs1(const std::string& pem_private_key, } // namespace widevine -#endif // COMMON_TEST_UTILS_H__ +#endif // COMMON_TEST_UTILS_H_ diff --git a/common/vmp_checker.cc b/common/vmp_checker.cc index c40b45c..cbba839 100644 --- a/common/vmp_checker.cc +++ b/common/vmp_checker.cc @@ -17,6 +17,7 @@ #include #include "glog/logging.h" +#include "common/certificate_type.h" #include "common/error_space.h" #include "common/rsa_key.h" #include "common/x509_cert.h" diff --git a/common/vmp_checker.h b/common/vmp_checker.h index 9122fa0..e5269ad 100644 --- a/common/vmp_checker.h +++ b/common/vmp_checker.h @@ -41,9 +41,7 @@ class VmpChecker { virtual util::Status VerifyVmpData(const std::string& vmp_data, Result* result); // Enable/disable development code signing certificates. - void set_allow_development_vmp(bool allow) { - allow_development_vmp_ = allow; - } + void set_allow_development_vmp(bool allow) { allow_development_vmp_ = allow; } bool allow_development_vmp() const { return allow_development_vmp_; } private: diff --git a/common/widevine_system_id.cc b/common/widevine_system_id.cc new file mode 100644 index 0000000..3caf4ac --- /dev/null +++ b/common/widevine_system_id.cc @@ -0,0 +1,19 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2017 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. +//////////////////////////////////////////////////////////////////////////////// +// +// Common Encryption (CENC) system ID for Widevine DRM. + +#include "common/widevine_system_id.h" + +namespace widevine { + +const uint8_t kWidevineSystemId[16] = {0xed, 0xef, 0x8b, 0xa9, 0x79, 0xd6, + 0x4a, 0xce, 0xa3, 0xc8, 0x27, 0xdc, + 0xd5, 0x1d, 0x21, 0xed}; + +} // namespace widevine diff --git a/common/widevine_system_id.h b/common/widevine_system_id.h new file mode 100644 index 0000000..4b02791 --- /dev/null +++ b/common/widevine_system_id.h @@ -0,0 +1,22 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2017 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. +//////////////////////////////////////////////////////////////////////////////// +// +// Common Encryption (CENC) system ID for Widevine DRM. + +#ifndef COMMON_WIDEVINE_SYSTEM_ID_H_ +#define COMMON_WIDEVINE_SYSTEM_ID_H_ + +#include + +namespace widevine { + +extern const uint8_t kWidevineSystemId[16]; + +} // namespace widevine + +#endif // COMMON_WIDEVINE_SYSTEM_ID_H_ diff --git a/common/wvm_token_handler_test.cc b/common/wvm_token_handler_test.cc index 6e8c36e..364d568 100644 --- a/common/wvm_token_handler_test.cc +++ b/common/wvm_token_handler_test.cc @@ -7,7 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// #include "common/wvm_token_handler.h" - #include "testing/gmock.h" #include "testing/gunit.h" #include "absl/strings/escaping.h" diff --git a/common/x509_cert.cc b/common/x509_cert.cc index 5ba683f..ddd40e6 100644 --- a/common/x509_cert.cc +++ b/common/x509_cert.cc @@ -17,6 +17,7 @@ #include "openssl/bio.h" #include "openssl/evp.h" #include "openssl/pem.h" +#include "openssl/pkcs7.h" #include "openssl/x509.h" #include "openssl/x509v3.h" #include "common/openssl_util.h" @@ -52,8 +53,7 @@ bool PemEncodeX509Certificate(const X509& certificate, namespace widevine { -std::unique_ptr X509Cert::FromOpenSslCert( - ScopedX509 certificate) { +std::unique_ptr X509Cert::FromOpenSslCert(ScopedX509 certificate) { return std::unique_ptr(new X509Cert(certificate.release())); } @@ -194,10 +194,11 @@ bool X509Cert::GetV3BooleanExtension(const std::string& oid, bool* value) const if (ext_pos < 0) return false; X509_EXTENSION* extension(X509_get_ext(openssl_cert_, ext_pos)); if (!extension) return false; - ASN1_OCTET_STRING *extension_data(X509_EXTENSION_get_data(extension)); + ASN1_OCTET_STRING* extension_data(X509_EXTENSION_get_data(extension)); if (!extension_data) return false; if ((extension_data->length != 3) || (extension_data->data[0] != 1) || - (extension_data->data[1] != 1)) return false; + (extension_data->data[1] != 1)) + return false; *value = extension_data->data[2] != 0; return true; diff --git a/common/x509_cert.h b/common/x509_cert.h index deb093c..db08235 100644 --- a/common/x509_cert.h +++ b/common/x509_cert.h @@ -9,8 +9,8 @@ // Description: // X.509 certificate classes used by the license server SDK. -#ifndef COMMON_X509_CERT_H__ -#define COMMON_X509_CERT_H__ +#ifndef COMMON_X509_CERT_H_ +#define COMMON_X509_CERT_H_ #include #include @@ -26,11 +26,10 @@ #include "openssl/x509v3.h" #include "util/status.h" #include "common/openssl_util.h" +#include "common/rsa_key.h" namespace widevine { -class RsaPublicKey; - // NOTE: All util::Status codes are in the canonical error space. // Class which holds a single X.509 certificates. @@ -141,7 +140,7 @@ class X509CA { private: util::Status InitializeStore(); - util::Status OpenSslX509Verify(const X509* cert, STACK_OF(X509)* stack); + util::Status OpenSslX509Verify(const X509* cert, STACK_OF(X509) * stack); std::unique_ptr ca_cert_; absl::Mutex openssl_store_mutex_; @@ -152,4 +151,4 @@ class X509CA { } // namespace widevine -#endif // COMMON_X509_CERT_H__ +#endif // COMMON_X509_CERT_H_ diff --git a/common/x509_cert_test.cc b/common/x509_cert_test.cc index 8a67001..0cc8ccb 100644 --- a/common/x509_cert_test.cc +++ b/common/x509_cert_test.cc @@ -6,14 +6,13 @@ // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// -#include "common/x509_cert.h" - #include #include "testing/gunit.h" #include "absl/strings/escaping.h" #include "common/rsa_key.h" #include "common/test_utils.h" +#include "common/x509_cert.h" namespace widevine { const char kTestRootCaDerCert[] = diff --git a/example/BUILD b/example/BUILD new file mode 100644 index 0000000..6cee210 --- /dev/null +++ b/example/BUILD @@ -0,0 +1,39 @@ +################################################################################ +# Copyright 2018 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. +################################################################################ + +# Build file for the example code. + +package( + default_visibility = ["//visibility:public"], +) + + +filegroup( + name = "binary_release_files", + srcs = [ + "simulcrypt_client.cc", + "test_simulcrypt_messages.h", + ":simulcrypt_client", + ], +) + +cc_binary( + name = "simulcrypt_client", + srcs = ["simulcrypt_client.cc"], + deps = [ + "//base", + ], +) + +cc_library( + name = "test_simulcrypt_messages", + hdrs = ["test_simulcrypt_messages.h"], + deps = [ + "//base", + ], +) diff --git a/example/simulcrypt_client.cc b/example/simulcrypt_client.cc new file mode 100644 index 0000000..f2a6979 --- /dev/null +++ b/example/simulcrypt_client.cc @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +// Example client that talks to server_main. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gflags/gflags.h" +#include "glog/logging.h" + +DEFINE_string(server, "", "Server host name"); +DEFINE_int32(port, 0, "Server port number"); + +constexpr uint32_t kBufferSize = 256; + +int main(int argc, char **argv) { + gflags::ParseCommandLineFlags(&argc, &argv, true); + CHECK(!FLAGS_server.empty()) << "need --server"; + CHECK(FLAGS_port != 0) << "need --port"; + + struct hostent server; + { + int buflen = 1024; + char buf[1024]; + struct hostent *result; + int h_errnop; + gethostbyname_r(/* __name= */ FLAGS_server.c_str(), + /* __result_buf= */ &server, /* __buf= */ buf, + /* __buflen= */ buflen, + /* __result= */ &result, /* __h_errnop= */ &h_errnop); + } + + struct sockaddr_in server_addr; + bzero(reinterpret_cast(&server_addr), sizeof(server_addr)); + server_addr.sin_family = AF_INET; + // TODO(user): Consider using inet_pton() to populate server_addr.sin_addr. + bcopy(server.h_addr, reinterpret_cast(&server_addr.sin_addr.s_addr), + server.h_length); + server_addr.sin_port = htons(FLAGS_port); + + int socket_fd = socket(AF_INET, SOCK_STREAM, /* protocol= */ 0); + CHECK(socket_fd >= 0) << "failed to opening socket"; + CHECK(connect(socket_fd, (struct sockaddr *)&server_addr, + sizeof(server_addr)) >= 0) + << "failed to connect to socket"; + + printf("Please enter the message: "); + char buffer[kBufferSize]; + bzero(buffer, kBufferSize); + fgets(buffer, kBufferSize - 1, stdin); + int total_bytes_written = 0; + while (total_bytes_written != strlen(buffer)) { + int num_bytes_written = write(socket_fd, buffer, strlen(buffer)); + if (num_bytes_written < 0) { + LOG(FATAL) << "ERROR writing to socket: " << strerror(errno); + } + total_bytes_written += num_bytes_written; + } + bzero(buffer, kBufferSize); + if (read(socket_fd, buffer, kBufferSize - 1) < 0) { + LOG(FATAL) << "ERROR reading from socket: " << strerror(errno); + } + printf("Read from buffer: %s\n", buffer); + + close(socket_fd); + return 0; +} diff --git a/example/test_simulcrypt_messages.h b/example/test_simulcrypt_messages.h new file mode 100644 index 0000000..7bff06d --- /dev/null +++ b/example/test_simulcrypt_messages.h @@ -0,0 +1,166 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +// Example Simulcrypt messages used in unit tests and example client. + +#ifndef MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_SIMULCRYPT_MESSAGES_H_ +#define MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_SIMULCRYPT_MESSAGES_H_ + +namespace widevine { +namespace cas { + +const char kTestEcmgStreamSetupMessage[] = { // protocol_version + '\x01', + // message_type - Stream_set-up + '\x01', '\x01', + // message_length + // 18 bytes below, 3 parameters 6 bytes each + '\x00', '\x12', + // parameter_type - ECM_channel_id + '\x00', '\x0e', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x01', + // parameter_type - ECM_stream_id + '\x00', '\x0f', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x02', + // parameter_type - nominal_CP_duration + '\x00', '\x10', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x03'}; + +const char kTestEcmgCwProvisionMessageWithOneCw[] = { + // protocol_version + '\x01', + // message_type - CW_provision + '\x02', '\x01', + // message_length + // 64 bytes below, 3 * 6 + 8 + 10 + 1 * 22 + 6 + '\x00', '\x40', + // parameter_type - ECM_channel_id + '\x00', '\x0e', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x01', + // parameter_type - ECM_stream_id + '\x00', '\x0f', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x02', + // parameter_type - CP_number + '\x00', '\x12', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\xa1', + // parameter_type - access_criteria + '\x00', '\x0d', + // parameter_length + '\x00', '\x04', + // parameter_value + '\x00', '\x00', '\x00', '\x00', + // parameter_type - CW_encryption + '\x00', '\x18', + // parameter_length + '\x00', '\x06', + // parameter_value + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + // parameter_type - CP_CW_combination + '\x00', '\x14', + // parameter_length - 2 + 16 + '\x00', '\x12', + // parameter_value - CP then CW + // CP + '\x00', '\xa1', + // CW (16 bytes) + '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', + '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', + // parameter_type - CP_duration + '\x00', '\x13', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x0a'}; + +const char kTestEcmgCwProvisionMessageWithTwoCw[] = { + // protocol_version + '\x01', + // message_type - CW_provision + '\x02', '\x01', + // message_length + // 86 bytes below, 3 * 6 + 8 + 10 + 2 * 22 + 6 + '\x00', '\x56', + // parameter_type - ECM_channel_id + '\x00', '\x0e', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x01', + // parameter_type - ECM_stream_id + '\x00', '\x0f', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x02', + // parameter_type - CP_number + '\x00', '\x12', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\xa1', + // parameter_type - access_criteria + '\x00', '\x0d', + // parameter_length + '\x00', '\x04', + // parameter_value + '\x00', '\x00', '\x00', '\x00', + // parameter_type - CW_encryption + '\x00', '\x18', + // parameter_length + '\x00', '\x06', + // parameter_value + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + // parameter_type - CP_CW_combination + '\x00', '\x14', + // parameter_length - 2 + 16 + '\x00', '\x12', + // parameter_value - CP then CW + // CP + '\x00', '\xa1', + // CW (16 bytes) + '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', + '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', '\x11', + // parameter_type - CP_CW_combination + '\x00', '\x14', + // parameter_length - 2 + 16 + '\x00', '\x12', + // parameter_value - CP then CW + // CP + '\x00', '\xa2', + // CW (16 bytes) + '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', + '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', '\x22', + // parameter_type - CP_duration + '\x00', '\x13', + // parameter_length + '\x00', '\x02', + // parameter_value + '\x00', '\x0a'}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_EXAMPLE_TEST_SIMULCRYPT_MESSAGES_H_ diff --git a/media_cas_packager_sdk/internal/BUILD b/media_cas_packager_sdk/internal/BUILD index 218876e..1ed3cda 100644 --- a/media_cas_packager_sdk/internal/BUILD +++ b/media_cas_packager_sdk/internal/BUILD @@ -48,3 +48,109 @@ cc_test( "//protos/public:media_cas_encryption_proto", ], ) + +cc_library( + name = "ecm_generator", + srcs = ["ecm_generator.cc"], + hdrs = ["ecm_generator.h"], + deps = [ + "//base", + "@abseil_repo//absl/base:core_headers", + "//util:status", + "//media_cas_packager_sdk/internal:ecm", + ], +) + +cc_test( + name = "ecm_generator_test", + size = "small", + srcs = ["ecm_generator_test.cc"], + deps = [ + ":ecm_generator", + "//testing:gunit_main", + "@abseil_repo//absl/memory", + "//common:aes_cbc_util", + "//protos/public:media_cas_encryption_proto", + ], +) + +cc_library( + name = "ecmg", + srcs = ["ecmg.cc"], + hdrs = [ + "ecmg.h", + "ecmg_constants.h", + ], + deps = [ + ":ecm", + ":ecm_generator", + ":fixed_key_fetcher", + ":util", + "//base", + "@abseil_repo//absl/base:core_headers", + "@abseil_repo//absl/memory", + "@abseil_repo//absl/strings", + "//util:status", + ], +) + +cc_library( + name = "fixed_key_fetcher", + srcs = [ + "fixed_key_fetcher.cc", + ], + hdrs = [ + "fixed_key_fetcher.h", + ], + deps = [ + ":key_fetcher", + "//util:status", + "//protos/public:media_cas_encryption_proto", + ], +) + +cc_library( + name = "key_fetcher", + hdrs = [ + "key_fetcher.h", + ], + deps = ["//util:status"], +) + +cc_library( + name = "simulcrypt", + srcs = ["simulcrypt.cc"], + hdrs = [ + "simulcrypt.h", + "simulcrypt_constants.h", + ], + deps = [ + ":ecmg", + ":util", + "//base", + "@abseil_repo//absl/base:core_headers", + "@abseil_repo//absl/strings", + "//util:status", + ], +) + +cc_test( + name = "simulcrypt_test", + size = "small", + srcs = ["simulcrypt_test.cc"], + deps = [ + ":simulcrypt", + "//testing:gunit_main", + "//example:test_simulcrypt_messages", + ], +) + +cc_library( + name = "util", + srcs = ["util.cc"], + hdrs = ["util.h"], + deps = [ + "//base", + "@abseil_repo//absl/base:core_headers", + ], +) diff --git a/media_cas_packager_sdk/internal/ecm.cc b/media_cas_packager_sdk/internal/ecm.cc index a675d87..b1c1991 100644 --- a/media_cas_packager_sdk/internal/ecm.cc +++ b/media_cas_packager_sdk/internal/ecm.cc @@ -61,6 +61,7 @@ static constexpr int kNumBitsUnusedField = 6; static constexpr size_t kKeyIdSizeBytes = 16; static constexpr size_t kKeyDataSizeBytes = 16; static constexpr size_t kWrappedKeyIvSizeBytes = 16; +static constexpr size_t kWrappingKeyIvSizeBytes = 16; // BitField constants for the ECM payload @@ -309,6 +310,9 @@ util::Status CasEcm::WrapEntitledKeys( std::string CasEcm::WrapKey(const std::string& wrapping_key, const std::string& iv, const std::string& key_value) { + if (iv.size() != kWrappingKeyIvSizeBytes) { + LOG(WARNING) << "Incorrect iv size for WrapKey(): " << iv.size(); + } // Wrapped key IV is always 16 bytes. return crypto_util::EncryptAesCbcNoPad(wrapping_key, iv, key_value); } @@ -491,13 +495,13 @@ util::Status CasEcm::ParseEntitlementResponse(const std::string& response_string } if (paired_keys_required()) { if (key.key_slot() == CasEncryptionResponse_KeyInfo_KeySlot_EVEN) { - PushEntitlementKey(key.track_type(), true, ekey); + PushEntitlementKey(key.track_type(), /* is_even_key= */ true, ekey); } else if (key.key_slot() == CasEncryptionResponse_KeyInfo_KeySlot_ODD) { - PushEntitlementKey(key.track_type(), false, ekey); + PushEntitlementKey(key.track_type(), /* is_even_key= */ false, ekey); } } else { if (key.key_slot() == CasEncryptionResponse_KeyInfo_KeySlot_SINGLE) { - PushEntitlementKey(key.track_type(), false, ekey); + PushEntitlementKey(key.track_type(), /* is_even_key= */ true, ekey); } } } diff --git a/media_cas_packager_sdk/internal/ecm.h b/media_cas_packager_sdk/internal/ecm.h index 3f8c2ff..51a9f40 100644 --- a/media_cas_packager_sdk/internal/ecm.h +++ b/media_cas_packager_sdk/internal/ecm.h @@ -71,6 +71,7 @@ struct EcmInitParameters { // TODO(user): Add usage example. // // Class CasEcm is not thread safe. +// TODO(user): Rename class to Ecm. class CasEcm { public: CasEcm() = default; diff --git a/media_cas_packager_sdk/public/ecm_generator.cc b/media_cas_packager_sdk/internal/ecm_generator.cc similarity index 95% rename from media_cas_packager_sdk/public/ecm_generator.cc rename to media_cas_packager_sdk/internal/ecm_generator.cc index 6b61d56..83d670a 100644 --- a/media_cas_packager_sdk/public/ecm_generator.cc +++ b/media_cas_packager_sdk/internal/ecm_generator.cc @@ -6,7 +6,7 @@ // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// -#include "media_cas_packager_sdk/public/ecm_generator.h" +#include "media_cas_packager_sdk/internal/ecm_generator.h" #include "glog/logging.h" @@ -56,6 +56,10 @@ util::Status CasEcmGenerator::ProcessEcmParameters( "Number of supplied keys is wrong (check rotation periods)."}; } for (int i = 0; i < keys_needed; i++) { + util::Status status = ValidateKeyParameters(ecm_params.key_params[i]); + if (!status.ok()) { + return status; + } keys->emplace_back(EntitledKeyInfo()); EntitledKeyInfo& key = keys->back(); key.key_id = ecm_params.key_params[i].key_id; @@ -131,10 +135,6 @@ util::Status CasEcmGenerator::ValidateKeyParameters( util::Status status; status = ValidateKeyId(key_params.key_id); if (!status.ok()) return status; - status = ValidateKeyData(key_params.wrapped_key_data); - if (!status.ok()) return status; - status = ValidateWrappedKeyIv(key_params.wrapped_key_iv); - if (!status.ok()) return status; if (key_params.content_ivs.empty()) { return {util::error::INVALID_ARGUMENT, "Content IVs is empty."}; } diff --git a/media_cas_packager_sdk/public/ecm_generator.h b/media_cas_packager_sdk/internal/ecm_generator.h similarity index 74% rename from media_cas_packager_sdk/public/ecm_generator.h rename to media_cas_packager_sdk/internal/ecm_generator.h index a95733d..8489dc2 100644 --- a/media_cas_packager_sdk/public/ecm_generator.h +++ b/media_cas_packager_sdk/internal/ecm_generator.h @@ -6,8 +6,8 @@ // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// -#ifndef MEDIA_CAS_PACKAGER_SDK_PUBLIC_ECM_GENERATOR_H_ -#define MEDIA_CAS_PACKAGER_SDK_PUBLIC_ECM_GENERATOR_H_ +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECM_GENERATOR_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECM_GENERATOR_H_ #include #include @@ -27,32 +27,35 @@ namespace cas { struct KeyParameters { std::string key_id; std::string key_data; + // TODO(user): wrapped_key_data does not seem to be used, but assumed + // to exist by unit tests. std::string wrapped_key_data; + // wrapped_key_iv is randomly generated right before it is used to encrypt + // key_data in ecm.cc. std::string wrapped_key_iv; + // TODO(user): Probably only need a single content_iv instead of a vector. std::vector content_ivs; }; // EcmParameters holds information that is needed by the EcmGenerator. It is // partially set up with data from a KeyGenerator (obtained via GenerateKey()). // IVs are added later. -// TODO(user): may need a starting crypto period index. +// TODO(user): Consider rename to EcmGeneratorParameters. struct EcmParameters { - static constexpr int kDefaultIVSize = 8; - int iv_size = kDefaultIVSize; - bool current_key_even = true; - uint32_t current_key_index = 0; + // TODO(user): entitlement_key_id does not seem to be used, but assumed + // to exist by unit tests. std::string entitlement_key_id; bool rotation_enabled = true; + // TODO(user): rotation_periods does not seem to be used, but assumed + // to exist by unit tests. uint32_t rotation_periods; + // TODO(user): Consider changing the vector to just two variables, + // one for even key, the other for odd key. std::vector key_params; - uint16_t program_id; - uint64_t rotation_period_microseconds; - // For video, this is zero. For audio, this is the size of the audio frame, - // which is a constant in the audio track. - uint16_t offset = 0; }; // ECM Generator for Widevine/MediaCAS entitled keys. +// TODO(user): Rename class to EcmGenerator. class CasEcmGenerator { public: CasEcmGenerator() = default; @@ -92,4 +95,4 @@ class CasEcmGenerator { } // namespace cas } // namespace widevine -#endif // MEDIA_CAS_PACKAGER_SDK_PUBLIC_ECM_GENERATOR_H_ +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECM_GENERATOR_H_ diff --git a/media_cas_packager_sdk/public/ecm_generator_test.cc b/media_cas_packager_sdk/internal/ecm_generator_test.cc similarity index 99% rename from media_cas_packager_sdk/public/ecm_generator_test.cc rename to media_cas_packager_sdk/internal/ecm_generator_test.cc index b30a761..43dbd19 100644 --- a/media_cas_packager_sdk/public/ecm_generator_test.cc +++ b/media_cas_packager_sdk/internal/ecm_generator_test.cc @@ -6,7 +6,7 @@ // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// -#include "media_cas_packager_sdk/public/ecm_generator.h" +#include "media_cas_packager_sdk/internal/ecm_generator.h" #include #include diff --git a/media_cas_packager_sdk/internal/ecmg.cc b/media_cas_packager_sdk/internal/ecmg.cc new file mode 100644 index 0000000..46c6248 --- /dev/null +++ b/media_cas_packager_sdk/internal/ecmg.cc @@ -0,0 +1,287 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#include "media_cas_packager_sdk/internal/ecmg.h" + +#include +#include +#include +#include +#include +#include + +#include "glog/logging.h" +#include "absl/memory/memory.h" +#include "absl/strings/str_cat.h" +#include "util/status.h" +#include "media_cas_packager_sdk/internal/ecm_generator.h" +#include "media_cas_packager_sdk/internal/ecmg_constants.h" +#include "media_cas_packager_sdk/internal/util.h" + +namespace widevine { +namespace cas { + +namespace { + +static const char kDefaultContentId[] = "21140844"; +static const char kDefaultProvider[] = "widevine"; +// Size of this IV needs to match ecm_init_params.content_iv_size. +static const char kDefaultContentIv[] = {'\x01', '\x01', '\x01', '\x01', + '\x01', '\x01', '\x01', '\x01'}; +static const char kDefaultTrackTypeSd[] = "SD"; + +// Local helper function that processes all the parameters in an ECMG message. +util::Status ProcessParameters(const char* message, size_t message_length, + EcmgParameters* parameters) { + DCHECK(message); + DCHECK(parameters); + + uint16_t parameter_type; + uint16_t parameter_length; + // 'offset' is used to track where we are within |message|. + size_t offset = 0; + // There could be CW_per_msg instances of CP_CW_combinations, + // so we need to track how many we have processed so far + // in order to know where to store the next CP_CW_combination. + int current_cp_cw_combination_index = 0; + while (offset != message_length) { + BigEndianToHost16(¶meter_type, message + offset); + offset += PARAMETER_TYPE_SIZE; + BigEndianToHost16(¶meter_length, message + offset); + offset += PARAMETER_LENGTH_SIZE; + switch (parameter_type) { + case ACCESS_CRITERIA: { + LOG(WARNING) << "Ignoring access_criteria parameter of " + << parameter_length << " bytes long"; + offset += parameter_length; + break; + } + case ECM_CHANNEL_ID: { + if (parameter_length != ECM_CHANNEL_ID_SIZE) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid parameter length ", parameter_length, + " for parameter type ", parameter_type)); + } + BigEndianToHost16(¶meters->ecm_channel_id, message + offset); + offset += parameter_length; + break; + } + case ECM_STREAM_ID: { + if (parameter_length != ECM_STREAM_ID_SIZE) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid parameter length ", parameter_length, + " for parameter type ", parameter_type)); + } + BigEndianToHost16(¶meters->ecm_stream_id, message + offset); + offset += parameter_length; + break; + } + case CP_CW_COMBINATION: { + if (current_cp_cw_combination_index > 2) { + // We can have at most 3 CP_CW_Combinations. + return util::Status(util::error::INVALID_ARGUMENT, + "We only support up to 2 control words in the " + "CW_provision message"); + } + EcmgCpCwCombination* combination = + ¶meters->cp_cw_combinations[current_cp_cw_combination_index++]; + BigEndianToHost16(&combination->cp, message + offset); + offset += CP_SIZE; + size_t cw_size = parameter_length - CP_SIZE; + combination->cw = std::string(message + offset, cw_size); + offset += cw_size; + // TODO(user): This is a temporary hack to let the ECM generator + // know how many keys to include in the ECM. + // CW_per_msg should have been set during channel set-up instead. + parameters->cw_per_msg = current_cp_cw_combination_index; + break; + } + case CP_DURATION: { + if (parameter_length != CP_DURATION_SIZE) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid parameter length ", parameter_length, + " for parameter type ", parameter_type)); + } + BigEndianToHost16(¶meters->cp_duration, message + offset); + offset += parameter_length; + break; + } + case CP_NUMBER: { + if (parameter_length != CP_NUMBER_SIZE) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid parameter length ", parameter_length, + " for parameter type ", parameter_type)); + } + BigEndianToHost16(¶meters->cp_number, message + offset); + offset += parameter_length; + break; + } + case CW_ENCRYPTION: { + LOG(WARNING) << "Ignoring CW_encryption parameter of " + << parameter_length << " bytes long"; + offset += parameter_length; + break; + } + case NOMINAL_CP_DURATION: { + if (parameter_length != NOMINAL_CP_DURATION_SIZE) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid parameter length ", parameter_length, + " for parameter type ", parameter_type)); + } + BigEndianToHost16(¶meters->nominal_cp_duration, message + offset); + offset += parameter_length; + break; + } + default: { + return util::Status( + util::error::UNIMPLEMENTED, + absl::StrCat("No implementation yet to process parameter of type ", + parameter_type)); + break; + } + } + } + return util::OkStatus(); +} +} // namespace + +util::Status Ecmg::ProcessStreamSetupMessage(const char* message, + size_t message_length) { + DCHECK(message); + + EcmgParameters parameters; + util::Status status = ProcessParameters(message, message_length, ¶meters); + if (!status.ok()) { + return status; + } + if (parameters.ecm_channel_id == 0 || parameters.ecm_stream_id == 0 || + parameters.nominal_cp_duration == 0) { + return util::Status(util::error::INVALID_ARGUMENT, + "Missing required parameter"); + } + + if (channels_.find(parameters.ecm_channel_id) == channels_.end()) { + std::unique_ptr new_channel = absl::make_unique(); + channels_[parameters.ecm_channel_id] = std::move(new_channel); + } + EcmgChannel* channel = + channels_.find(parameters.ecm_channel_id)->second.get(); + auto stream_entry = channel->streams.find(parameters.ecm_stream_id); + if (stream_entry == channel->streams.end()) { + std::unique_ptr new_stream = absl::make_unique(); + new_stream->nominal_cp_duration = parameters.nominal_cp_duration; + channel->streams[parameters.ecm_stream_id] = std::move(new_stream); + } else { + EcmgStream* existing_stream = stream_entry->second.get(); + existing_stream->nominal_cp_duration = parameters.nominal_cp_duration; + } + + return util::OkStatus(); +} + +util::Status Ecmg::ProcessCwProvisionMessage(const char* message, + size_t message_length, + std::string* response) { + DCHECK(message); + DCHECK(response); + + EcmgParameters parameters; + util::Status status = ProcessParameters(message, message_length, ¶meters); + if (!status.ok()) { + return status; + } + if (parameters.ecm_channel_id == 0 || parameters.ecm_stream_id == 0 || + parameters.cp_number == 0 || parameters.cw_per_msg == 0) { + return util::Status(util::error::INVALID_ARGUMENT, + "Missing required parameter"); + } + + // TODO(user): Figure out what to do with ECM_channel_ID and ECM_stream_ID. + // - We certainly need to check the channel/stream has been setup + // - Retrieve config parameters such as lead_CW and CW_per_msg + // - In some config, we need to keep CW for previous CP to be included in the + // current ECM + // TODO(user): Remove debug loop below. + for (int i = 0; i < 3; i++) { + for (int j = 0; j < parameters.cp_cw_combinations[i].cw.size(); j++) { + printf("%x ", + static_cast(parameters.cp_cw_combinations[i].cw[j])); + } + std::cout << std::endl; + } + + bool key_rotation_enabled = parameters.cw_per_msg > 1; + + // Create an instance of CasEcm in order to set the entitlement keys. + // TODO(user): The section of code below for constructing CasEcm should + // be optimized. There should be a single instance of CasEcm for each stream. + // Right now, this is hard to do because CasEcmGenerator contains the CasEcm. + std::unique_ptr ecm = absl::make_unique(); + // TODO(user): Revisit this hardcoded ecm_init_params. + EcmInitParameters ecm_init_params; + ecm_init_params.content_iv_size = kIvSize8; + ecm_init_params.key_rotation_enabled = key_rotation_enabled; + // Only CTR is supported for now. + ecm_init_params.crypto_mode = CasCryptoMode::CTR; + // Only encrypt one video track. + ecm_init_params.track_types.push_back(kDefaultTrackTypeSd); + std::string entitlement_request; + std::string entitlement_response; + // 'content_id' and 'provider' are used in entitlement key request/response + // only, NOT needed for generating ECM. + // So for initial demo, we can just use hardcoded value because we are using + // hardcoded entitlement key anyway. + // TODO(user): When we want to retrieve entitlement key from License Server + // we need to figure out a way to provide real 'content_id' and 'provder' + // to this function here from the Simulcrypt API. + if (!(status = ecm->Initialize(kDefaultContentId, kDefaultProvider, + ecm_init_params, &entitlement_request)) + .ok()) { + return status; + } + if (!(status = fixed_key_fetcher_.RequestEntitlementKey( + entitlement_request, &entitlement_response)) + .ok()) { + return status; + } + if (!(status = ecm->ProcessCasEncryptionResponse(entitlement_response)) + .ok()) { + return status; + } + + CasEcmGenerator ecm_generator; + ecm_generator.set_ecm(std::move(ecm)); + EcmParameters ecm_param; + ecm_param.rotation_enabled = key_rotation_enabled; + for (int i = 0; i <= parameters.cw_per_msg; i++) { + ecm_param.key_params.emplace_back(); + ecm_param.key_params[i].key_data = parameters.cp_cw_combinations[i].cw; + // TODO(user): MUST have a better way to derive/retrieve key_id. + // Currently set it to be the same as the key itself just for demo purpose. + ecm_param.key_params[i].key_id = ecm_param.key_params[i].key_data; + // TODO(user): MUST have a better way to generate/retrieve content_iv. + ecm_param.key_params[i].content_ivs.push_back( + std::string(kDefaultContentIv)); + } + std::string serialized_ecm = ecm_generator.GenerateEcm(ecm_param); + std::cout << "serialized_ecm: " << serialized_ecm << std::endl; + for (int i = 0; i < serialized_ecm.size(); i++) { + printf("'\\x%x', ", static_cast(serialized_ecm.at(i))); + } + std::cout << std::endl; + LOG(INFO) << "ECM size: " << serialized_ecm.size(); + return util::OkStatus(); +} + +} // namespace cas +} // namespace widevine diff --git a/media_cas_packager_sdk/internal/ecmg.h b/media_cas_packager_sdk/internal/ecmg.h new file mode 100644 index 0000000..ab1c209 --- /dev/null +++ b/media_cas_packager_sdk/internal/ecmg.h @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "util/status.h" +#include "media_cas_packager_sdk/internal/ecm.h" +#include "media_cas_packager_sdk/internal/fixed_key_fetcher.h" + +namespace widevine { +namespace cas { + +// A struct that represent a CP_CW_Combination. +struct EcmgCpCwCombination { + uint16_t cp = 0; // crypto period + std::string cw; // control word +}; + +// A struct that is used to hold all possible parameters for a ECMG message. +struct EcmgParameters { + // Default value of 0 for fields below is usually considered invalid. + // Hence checking against 0 is used to detect whether each parameter + // is set in the message. + uint8_t cw_per_msg = 0; + uint16_t ecm_channel_id = 0; + uint16_t ecm_stream_id = 0; + uint16_t nominal_cp_duration = 0; + uint16_t cp_number = 0; // crypto period number + uint16_t cp_duration = 0; // crypto period duration + // CW_per_msg could 1, 2, or 3, + // so there can be up to 3 CP_CW_Combinations + EcmgCpCwCombination cp_cw_combinations[3]; +}; + +// A struct that holds information about a ECMG stream within a channel. +struct EcmgStream { + uint16_t nominal_cp_duration = 0; +}; + +// A struct that holds information about a ECMG channel. +struct EcmgChannel { + // Map from ECM_stream_ID to an instance of EcmgStream. + std::map> streams; +}; + +// A class that process Simulcrypt ECMG messages. +// This class is NOT thread-safe. +class Ecmg { + public: + Ecmg() = default; + Ecmg(const Ecmg&) = delete; + Ecmg& operator=(const Ecmg&) = delete; + virtual ~Ecmg() = default; + + // Process |message| of length |message_length|. + // |message| is expected to be a Stream_set-up message. + // Any error during processing would be turned via util::Status. + util::Status ProcessStreamSetupMessage(const char* message, + size_t message_length); + + // Process |message| of length |message_length|. + // |message| is expected to be a CW_provision request message. + // ECM_response response message will be returned via |response|. + // Any error during processing would be turned via util::Status. + util::Status ProcessCwProvisionMessage(const char* message, + size_t message_length, + std::string* response); + + private: + // Keep track of all the channels. + std::map> channels_; + FixedKeyFetcher fixed_key_fetcher_; +}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_H_ diff --git a/media_cas_packager_sdk/internal/ecmg_constants.h b/media_cas_packager_sdk/internal/ecmg_constants.h new file mode 100644 index 0000000..e5bd773 --- /dev/null +++ b/media_cas_packager_sdk/internal/ecmg_constants.h @@ -0,0 +1,53 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_CONSTANTS_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_CONSTANTS_H_ + +// ECMG <> SCS +// Parameter_type values +#define DVB_RESERVED 0x0000 +#define SUPER_CAS_ID 0x0001 +#define SECTION_TSPKT_FLAG 0x0002 +#define DELAY_START 0x0003 +#define DELAY_STOP 0x0004 +#define TRANSITION_DELAY_START 0x0005 +#define TRANSITION_DELAY_STOP 0x0006 +#define ECM_REP_PERIOD 0x0007 +#define MAX_STREAMS 0x0008 +#define MIN_CP_DURATION 0x0009 +#define LEAD_CW 0x000A +#define CW_PER_MESSAGE 0x000B +#define MAX_COMP_TIME 0x000C +#define ACCESS_CRITERIA 0x000D +#define ECM_CHANNEL_ID 0x000E +#define ECM_STREAM_ID 0x000F +#define NOMINAL_CP_DURATION 0x0010 +#define ACCESS_CRITERIA_TRANSFER_MODE 0x0011 +#define CP_NUMBER 0x0012 +#define CP_DURATION 0x0013 +#define CP_CW_COMBINATION 0x0014 +#define ECM_DATAGRAM 0x0015 +#define AC_DELAY_START 0x0016 +#define AC_DELAY_STOP 0x0017 +#define CW_ENCRYPTION 0x0018 +#define ECM_ID 0x0019 +#define ERROR_STATUS 0x7000 +#define ERROR_INFORMATION 0x7001 + +// Size (in # of bytes) of various fields. +#define PARAMETER_TYPE_SIZE 2 +#define PARAMETER_LENGTH_SIZE 2 +#define ECM_CHANNEL_ID_SIZE 2 +#define ECM_STREAM_ID_SIZE 2 +#define NOMINAL_CP_DURATION_SIZE 2 +#define CP_NUMBER_SIZE 2 +#define CP_DURATION_SIZE 2 +#define CP_SIZE 2 + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_ECMG_CONSTANTS_H_ diff --git a/media_cas_packager_sdk/internal/fixed_key_fetcher.cc b/media_cas_packager_sdk/internal/fixed_key_fetcher.cc new file mode 100644 index 0000000..f65e24c --- /dev/null +++ b/media_cas_packager_sdk/internal/fixed_key_fetcher.cc @@ -0,0 +1,66 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#include "media_cas_packager_sdk/internal/fixed_key_fetcher.h" + +#include "util/status.h" +#include "protos/public/media_cas_encryption.pb.h" + +namespace widevine { +namespace cas { + +namespace { + +// Key IDs are 16 bytes, keys are 32 bytes. +static const char* kKeyId1 = "fake_key_id1...."; +static const char* kKey1 = "fakefakefakefakefakefakefake1..."; +static const char* kKeyId2 = "fake_key_id2...."; +static const char* kKey2 = "fakefakefakefakefakefakefake2..."; + +} // namespace + +util::Status FixedKeyFetcher::RequestEntitlementKey( + const std::string& request_string, std::string* signed_response_string) { + CasEncryptionRequest request; + request.ParseFromString(request_string); + + CasEncryptionResponse response; + response.set_status(CasEncryptionResponse_Status_OK); + response.set_content_id(request.content_id()); + for (const auto& track_type : request.track_types()) { + if (request.key_rotation()) { + // Add the Even key. + auto key = response.add_entitlement_keys(); + key->set_key_id(kKeyId1); + key->set_key(kKey1); + key->set_track_type(track_type); + key->set_key_slot(CasEncryptionResponse_KeyInfo_KeySlot_EVEN); + // Add the Odd key. + key = response.add_entitlement_keys(); + key->set_key_id(kKeyId2); + key->set_key(kKey2); + key->set_track_type(track_type); + key->set_key_slot(CasEncryptionResponse_KeyInfo_KeySlot_ODD); + } else { + auto key = response.add_entitlement_keys(); + key->set_key_id(kKeyId1); + key->set_key(kKey1); + key->set_track_type(track_type); + key->set_key_slot(CasEncryptionResponse_KeyInfo_KeySlot_SINGLE); + } + } + std::string response_string; + response.SerializeToString(&response_string); + SignedCasEncryptionResponse signed_response; + signed_response.set_response(response_string); + signed_response.SerializeToString(signed_response_string); + return util::OkStatus(); +} + +} // namespace cas +} // namespace widevine diff --git a/media_cas_packager_sdk/internal/fixed_key_fetcher.h b/media_cas_packager_sdk/internal/fixed_key_fetcher.h new file mode 100644 index 0000000..6a7bc3e --- /dev/null +++ b/media_cas_packager_sdk/internal/fixed_key_fetcher.h @@ -0,0 +1,40 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_FIXED_KEY_FETCHER_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_FIXED_KEY_FETCHER_H_ + +#include "media_cas_packager_sdk/internal/key_fetcher.h" + +namespace widevine { +namespace cas { + +// Perform the same role as a WV CAS KeyFetcher, but return a +// locally-constructed response that has known (predefined) entitlement keys. +class FixedKeyFetcher : public KeyFetcher { + public: + FixedKeyFetcher() {} + ~FixedKeyFetcher() override = default; + + // Get entitlement keys. Process a CasEncryptionRequest message to + // determine the keys that are needed, generate a fixed set of keys, + // and package them into a SignedCasEncryptionResponse message. + // Args: + // |request_string| a serialized CasEncryptionRequest message, produced + // by WvCasEcm::Initialize(). + // |signed_response_string| a serialized SignedCasEncryptionResponse + // message. It should be passed into + // WvCasEcm::ProcessCasEncryptionResponse(). + util::Status RequestEntitlementKey(const std::string& request_string, + std::string* signed_response_string) override; +}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_FIXED_KEY_FETCHER_H_ diff --git a/media_cas_packager_sdk/internal/key_fetcher.h b/media_cas_packager_sdk/internal/key_fetcher.h new file mode 100644 index 0000000..cd06f14 --- /dev/null +++ b/media_cas_packager_sdk/internal/key_fetcher.h @@ -0,0 +1,43 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_KEY_FETCHER_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_KEY_FETCHER_H_ + +#include + +#include "util/status.h" + +namespace widevine { +namespace cas { + +// Interface for fetching various types of keys. +class KeyFetcher { + public: + KeyFetcher() = default; + KeyFetcher(const KeyFetcher&) = delete; + KeyFetcher& operator=(const KeyFetcher&) = delete; + virtual ~KeyFetcher() = default; + + // Get entitlement keys. Process a CasEncryptionRequest message to + // determine the keys that are needed, generate a fixed set of keys, + // and package them into a SignedCasEncryptionResponse message. + // Args: + // |request_string| a serialized CasEncryptionRequest message, produced + // by WvCasEcm::Initialize(). + // |signed_response_string| a serialized SignedCasEncryptionResponse + // message. It should be passed into + // WvCasEcm::ProcessCasEncryptionResponse(). + virtual util::Status RequestEntitlementKey( + const std::string& request_string, std::string* signed_response_string) = 0; +}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_KEY_FETCHER_H_ diff --git a/media_cas_packager_sdk/internal/simulcrypt.cc b/media_cas_packager_sdk/internal/simulcrypt.cc new file mode 100644 index 0000000..1880d72 --- /dev/null +++ b/media_cas_packager_sdk/internal/simulcrypt.cc @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#include "media_cas_packager_sdk/internal/simulcrypt.h" + +#include +#include + +#include "glog/logging.h" +#include "absl/strings/str_cat.h" +#include "util/status.h" +#include "media_cas_packager_sdk/internal/ecmg.h" +#include "media_cas_packager_sdk/internal/simulcrypt_constants.h" +#include "media_cas_packager_sdk/internal/util.h" + +namespace widevine { +namespace cas { + +// TODO(user): Caller should check |message| is at lest 5 bytes long. +util::Status Simulcrypt::ProcessMessage(const char* message, std::string* response) { + DCHECK(message); + DCHECK(response); + + uint8_t protocol_version; + uint16_t message_type; + uint16_t message_length; + // 'offset' is used to track where we are within |message|. + size_t offset = 0; + memcpy(&protocol_version, message, PROTOCOL_VERSION_SIZE); + if (protocol_version != EXPECTED_PROTOCOL_VERSION) { + return util::Status( + util::error::INVALID_ARGUMENT, + absl::StrCat("Invalid protocol version ", protocol_version)); + } + offset += PROTOCOL_VERSION_SIZE; + BigEndianToHost16(&message_type, message + offset); + offset += MESSAGE_TYPE_SIZE; + BigEndianToHost16(&message_length, message + offset); + offset += MESSAGE_LENGTH_SIZE; + switch (message_type) { + case ECMG_STREAM_SETUP: { + return ecmg_.ProcessStreamSetupMessage(message + offset, message_length); + break; + } + case ECMG_CW_PROVISION: { + return ecmg_.ProcessCwProvisionMessage(message + offset, message_length, + response); + break; + } + default: { + return util::Status( + util::error::UNIMPLEMENTED, + absl::StrCat("No implementation yet to process message of type ", + message_type)); + break; + } + } + return util::OkStatus(); +} + +} // namespace cas +} // namespace widevine diff --git a/media_cas_packager_sdk/internal/simulcrypt.h b/media_cas_packager_sdk/internal/simulcrypt.h new file mode 100644 index 0000000..a5d65ed --- /dev/null +++ b/media_cas_packager_sdk/internal/simulcrypt.h @@ -0,0 +1,50 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_H_ + +#include +#include +#include +#include +#include +#include + +#include +#include "util/status.h" +#include "media_cas_packager_sdk/internal/ecmg.h" + +namespace widevine { +namespace cas { + +// A class that handles Simulcrypt messages. +// The expected usage is by a TCP server that receives Simulcrypt message +// from the network then forward that message to an instance of this class +// for processing. +// This class is NOT thread-safe. +class Simulcrypt { + public: + Simulcrypt() = default; + Simulcrypt(const Simulcrypt&) = delete; + Simulcrypt& operator=(const Simulcrypt&) = delete; + virtual ~Simulcrypt() = default; + + // Process a Simulcrypt |message|. + // If any response is generated, it would returned via |response|. + // Any error during processing would be turned via util::Status. + util::Status ProcessMessage(const char* message, std::string* response); + + private: + Ecmg ecmg_; +}; + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_H_ diff --git a/media_cas_packager_sdk/internal/simulcrypt_constants.h b/media_cas_packager_sdk/internal/simulcrypt_constants.h new file mode 100644 index 0000000..f855975 --- /dev/null +++ b/media_cas_packager_sdk/internal/simulcrypt_constants.h @@ -0,0 +1,55 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_CONSTANTS_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_CONSTANTS_H_ + +// Message_type Values +// 0x0000 DVB reserved. +#define ECMG_CHANNEL_SETUP 0x0001 +#define ECMG_CHANNEL_TEST 0x0002 +#define ECMG_CHANNEL_STATUS 0x0003 +#define ECMG_CHANNEL_CLOSE 0x0004 +#define ECMG_CHANNEL_ERROR 0x0005 +// 0x0006 - 0x0010 DVB reserved. +#define EMMG_CHANNEL_SETUP 0x0011 +#define EMMG_CHANNEL_TEST 0x0012 +#define EMMG_CHANNEL_STATUS 0x0013 +#define EMMG_CHANNEL_CLOSE 0x0014 +#define EMMG_CHANNEL_ERROR 0x0015 +// 0x0016 - 0x0100 DVB reserved. +#define ECMG_STREAM_SETUP 0x0101 +#define ECMG_STREAM_TEST 0x0102 +#define ECMG_STREAM_STATUS 0x0103 +#define ECMG_STREAM_CLOSE_REQUEST 0x0104 +#define ECMG_STREAM_CLOSE_RESPONSE 0x0105 +#define ECMG_STREAM_ERROR 0x0106 +// 0x0107 - 0x0110 DVB reserved. +#define EMMG_STREAM_SETUP 0x0111 +#define EMMG_STREAM_TEST 0x0112 +#define EMMG_STREAM_STATUS 0x0113 +#define EMMG_STREAM_CLOSE_REQUEST 0x0114 +#define EMMG_STREAM_CLOSE_RESPONSE 0x0115 +#define EMMG_STREAM_ERROR 0x0116 +#define EMMG_STREAM_BW_REQUEST 0x0117 +#define EMMG_STREAM_BW_ALLOCATION 0x0118 +// 0x0119 - 0x0200 DVB reserved. +#define ECMG_CW_PROVISION 0x0201 +#define ECMG_ECM_RESPONSE 0x0202 +// 0x0203 - 0x0210 DVB reserved. +#define EMMG_DATA_PROVISION 0x0211 +// 0x0212 - 0x0300 DVB reserved. + +#define EXPECTED_PROTOCOL_VERSION 0x01 + +// Size (in # of bytes) of various fields. +#define PROTOCOL_VERSION_SIZE 1 +#define MESSAGE_TYPE_SIZE 2 +#define MESSAGE_LENGTH_SIZE 2 + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_SIMULCRYPT_CONSTANTS_H_ diff --git a/media_cas_packager_sdk/internal/simulcrypt_test.cc b/media_cas_packager_sdk/internal/simulcrypt_test.cc new file mode 100644 index 0000000..2a3af37 --- /dev/null +++ b/media_cas_packager_sdk/internal/simulcrypt_test.cc @@ -0,0 +1,54 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#include "media_cas_packager_sdk/internal/simulcrypt.h" + +#include + +#include "testing/gmock.h" +#include "testing/gunit.h" +#include "example/test_simulcrypt_messages.h" + +namespace widevine { +namespace cas { +namespace { + +class SimulcryptTest : public ::testing::Test { + protected: + SimulcryptTest() {} + + protected: + Simulcrypt simulcrypt_; +}; + +TEST_F(SimulcryptTest, ProcessEcmgStreamSetupMessage) { + std::string response = ""; + EXPECT_OK(simulcrypt_.ProcessMessage(kTestEcmgStreamSetupMessage, &response)); + + EXPECT_EQ("", response); +} + +TEST_F(SimulcryptTest, ProcessEcmgCwProvisionMessageWithOneCw) { + std::string response = ""; + EXPECT_OK(simulcrypt_.ProcessMessage(kTestEcmgCwProvisionMessageWithOneCw, + &response)); + + EXPECT_EQ("", response); +} + +TEST_F(SimulcryptTest, ProcessEcmgCwProvisionMessageWithTwoCw) { + std::string response = ""; + EXPECT_OK(simulcrypt_.ProcessMessage(kTestEcmgCwProvisionMessageWithTwoCw, + &response)); + + EXPECT_EQ("", response); +} + +} // namespace +} // namespace cas +} // namespace widevine diff --git a/media_cas_packager_sdk/internal/util.cc b/media_cas_packager_sdk/internal/util.cc new file mode 100644 index 0000000..31e7b00 --- /dev/null +++ b/media_cas_packager_sdk/internal/util.cc @@ -0,0 +1,28 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#include "media_cas_packager_sdk/internal/util.h" + +#include +#include + +#include "glog/logging.h" + +namespace widevine { +namespace cas { + +void BigEndianToHost16(uint16_t* destination, const void* source) { + DCHECK(destination); + DCHECK(source); + uint16_t big_endian_number; + memcpy(&big_endian_number, source, 2); + *destination = ntohs(big_endian_number); +} + +} // namespace cas +} // namespace widevine diff --git a/media_cas_packager_sdk/internal/util.h b/media_cas_packager_sdk/internal/util.h new file mode 100644 index 0000000..3f8cfc8 --- /dev/null +++ b/media_cas_packager_sdk/internal/util.h @@ -0,0 +1,25 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +#ifndef MEDIA_CAS_PACKAGER_SDK_INTERNAL_UTIL_H_ +#define MEDIA_CAS_PACKAGER_SDK_INTERNAL_UTIL_H_ + +#include + +namespace widevine { +namespace cas { + +// Read 16 bits (short int) from |source|, treat it as a big-endian number +// (network byte order), finally covert it to host endianness and return +// the result in |destination|. +void BigEndianToHost16(uint16_t* destination, const void* source); + +} // namespace cas +} // namespace widevine + +#endif // MEDIA_CAS_PACKAGER_SDK_INTERNAL_UTIL_H_ diff --git a/media_cas_packager_sdk/public/BUILD b/media_cas_packager_sdk/public/BUILD index fe34d53..7820717 100644 --- a/media_cas_packager_sdk/public/BUILD +++ b/media_cas_packager_sdk/public/BUILD @@ -20,13 +20,15 @@ PUBLIC_COPTS = ["-fvisibility=default"] filegroup( name = "binary_release_files", - srcs = glob(["*.h"]), + srcs = glob(["*.h"]) + [ + "simulcrypt_server.cc", + ":simulcrypt_server", + ], ) cc_binary( name = "libmedia_cas_packager_sdk.so", linkshared = 1, - deps = [":ecm_generator"], ) cc_library( @@ -38,31 +40,14 @@ cc_library( "@abseil_repo//absl/base:core_headers", "//util:status", "//media_cas_packager_sdk/internal:ecm", + "//media_cas_packager_sdk/internal:ecm_generator", ], ) -cc_library( - name = "ecm_generator", - srcs = ["ecm_generator.cc"], - hdrs = ["ecm_generator.h"], - copts = PUBLIC_COPTS, +cc_binary( + name = "simulcrypt_server", + srcs = ["simulcrypt_server.cc"], deps = [ "//base", - "@abseil_repo//absl/base:core_headers", - "//util:status", - "//media_cas_packager_sdk/internal:ecm", - ], -) - -cc_test( - name = "ecm_generator_test", - size = "small", - srcs = ["ecm_generator_test.cc"], - deps = [ - ":ecm_generator", - "//testing:gunit_main", - "@abseil_repo//absl/memory", - "//common:aes_cbc_util", - "//protos/public:media_cas_encryption_proto", ], ) diff --git a/media_cas_packager_sdk/public/simulcrypt_server.cc b/media_cas_packager_sdk/public/simulcrypt_server.cc new file mode 100644 index 0000000..96321e3 --- /dev/null +++ b/media_cas_packager_sdk/public/simulcrypt_server.cc @@ -0,0 +1,84 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright 2018 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. +//////////////////////////////////////////////////////////////////////////////// + +// Example server that listens on a port for Simulcrypt API messages. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gflags/gflags.h" +#include "glog/logging.h" + +DEFINE_int32(port, 0, "Server port number"); + +constexpr uint32_t kBufferSize = 256; +constexpr uint32_t kLicenseBacklog = 5; +constexpr uint32_t kWriteChunkSize = 18; + +int main(int argc, char **argv) { + gflags::ParseCommandLineFlags(&argc, &argv, true); + CHECK(FLAGS_port != 0) << "need --port"; + + struct sockaddr_in server_address; + bzero(reinterpret_cast(&server_address), sizeof(server_address)); + server_address.sin_family = AF_INET; + server_address.sin_addr.s_addr = htonl(INADDR_ANY); + server_address.sin_port = htons(FLAGS_port); + + int listen_socket_fd = socket(AF_INET, SOCK_STREAM, /* protocol= */ 0); + CHECK(listen_socket_fd >= 0) << "failed to open socket"; + CHECK(bind(listen_socket_fd, (struct sockaddr *)&server_address, + sizeof(server_address)) >= 0) + << "error on binding"; + std::cout << "Server listening ..." << std::endl << std::flush; + int return_val = listen(listen_socket_fd, kLicenseBacklog); + switch (return_val) { + case EADDRINUSE: + LOG(FATAL) << "Another socket is already listening on the same port."; + break; + case EBADF: + LOG(FATAL) << "The argument sockfd is not a valid descriptor."; + break; + case ENOTSOCK: + LOG(FATAL) << "The argument sockfd is not a socket."; + break; + case EOPNOTSUPP: + LOG(FATAL) << "The socket is not of a type that supports the listen() " + "operation."; + default: + break; + } + + struct sockaddr_in client_address; + socklen_t clilet_address_size = sizeof(client_address); + int client_socket_fd = accept( + listen_socket_fd, reinterpret_cast(&client_address), + &clilet_address_size); + CHECK(client_socket_fd >= 0) << "error on accept"; + + char buffer[kBufferSize]; + bzero(buffer, kBufferSize); + if (read(client_socket_fd, buffer, kBufferSize - 1) < 0) { + LOG(FATAL) << "ERROR reading from socket"; + } + printf("Here is the message: %s", buffer); + if (write(client_socket_fd, "I got your message", kWriteChunkSize) < 0) { + LOG(FATAL) << "ERROR writing to socket"; + } + + close(client_socket_fd); + close(listen_socket_fd); + return 0; +}