158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h"
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/base64.h"
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests of NetworkingPrivateCrypto support for Networking Private API.
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class NetworkingPrivateCryptoTest : public testing::Test {
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Verify that decryption of |encrypted| data using |private_key_pem| matches
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // |plain| data.
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool VerifyByteString(const std::string& private_key_pem,
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::string& plain,
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const std::string& encrypted) {
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    NetworkingPrivateCrypto crypto;
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string decrypted;
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (crypto.DecryptByteString(private_key_pem, encrypted, &decrypted))
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return decrypted == plain;
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that NetworkingPrivateCrypto::VerifyCredentials behaves as expected.
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NetworkingPrivateCryptoTest, VerifyCredentials) {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kCertData[] =
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----BEGIN CERTIFICATE-----"
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MIIDhzCCAm8CBFE2SCMwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UEBhMCVVMxEzARBgNVBAgM"
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "CkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEzARBgNVBAoMCkdvb2dsZSBJ"
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "bmMxEjAQBgNVBAsMCUdvb2dsZSBUVjEYMBYGA1UEAwwPRXVyZWthIEdlbjEgSUNBMB4XDTEz"
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MDMwNTE5MzE0N1oXDTMzMDIyODE5MzE0N1owgYMxFjAUBgNVBAcTDU1vdW50YWluIFZpZXcx"
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "EjAQBgNVBAsTCUdvb2dsZSBUVjETMBEGA1UEChMKR29vZ2xlIEluYzETMBEGA1UECBMKQ2Fs"
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "aWZvcm5pYTELMAkGA1UEBhMCVVMxHjAcBgNVBAMUFWV2dF9lMTYxIDAwMWExMWZmYWNkZjCC"
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPHGDV0lLoTYK78q13y/2u77YTjgbBlW"
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "AOxgrSNcMmGHx1K0aPyo50p99dGQnjapW6jtGrMzReWV2Wz3VL8rYlqY7oWjeJwsLQwo2tcn"
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "7vIZ/PuvPz9xgnGMUbBOfhCf3Epb1N4Jz82pxxrOFhUawWAglC9C4fUeZLCZpOJsQd4QeAzn"
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "kydl3xbqdSm74kwxE6vkGEzSCDnC7aYx0Rvvr1mZOKdl4AinYrxzWgmVsTnaFT1soSjmC5e/"
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "i6Jcrs4dDFgY6mKy9Qtly2XPSCYljm6L4SgqgJNmlpY0qYJgO++BdofIbU2jsOiCMvIuKkbM"
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "n72NsPQG0QhnVMwk7kYg6kkCAwEAAaMNMAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOC"
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "AQEAW0bQl9yjBc7DgMp94i7ZDOUxKQrzthephuwzb3/wWiTHcw6KK6FRPefXn6NPWxKKeQmv"
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "/tBxHbVlmYRXUbrhksnD0aUki4InvtL2m0H1fPfMxmJRFE+HoSXu+s0sGON831JaMcYRbAku"
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "5uHnltaGNzOI0KPHFGoCDmjAZD+IuoR2LR4FuuTrECK7KLjkdf//z5d5j7nBDPZS7uTCwC/B"
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "wM9asRj3tJA5VRFbLbsit1VI7IaRCk9rsSKkpBUaVeKbPLz+y/Z6JonXXT6AxsfgUSKDd4B7"
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MYLrTwMQfGuUaaaKko6ldKIrovjrcPloQr1Hxb2bipFcjLmG7nxQLoS6vQ=="
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----END CERTIFICATE-----";
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kName[] = "eureka8997";
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kSsdpUdn[] = "c5b2a83b-5958-7ce6-b179-e1f44699429b";
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kHotspotBssid[] = "00:1A:11:FF:AC:DF";
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kPublicKey[] =
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MIGJAoGBAK3SXmWZBOhJibv8It05qIbgHXXhnCXxHkW+C6jNMHR5sZgDpFaOY1xwXERjKdJx"
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "cwrEy3VAT5Uv9MgHPBvxxJku76HYh1yVfIw1rhLnHBTHSxwUzJNCrgc3l3t/UACacLjVNIzc"
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "cDpYf2vnOcA+t1t6IXRjzuU2NdwY4dJXNtWPAgMBAAE=";
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kNonce[] = "+6KSGuRu833m1+TP";
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kSignedData[] =
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "vwMBgANrp5XpCswLyk/OTXT56ORPeIWjH7xAdCk3qgjkwI6+8o56zJS02+tC5hhIHWh7oppT"
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "mWYF4tKvBQ3GeCz7IW9f7HWDMtO7x7yRWxzJyehaJbCfXvLdfs0/WKllzvGVBgNpcIAwU2NS"
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "FUG/jpXclntFzds0EUJG9wHxS6PXXSYRu+PlIFdCDcQJsUlnwO9AGFOJRV/aARGh8YUTWCFI"
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "QPOtPEqT5eegt+TLf01Gq0YcrRwSTKy1I3twOnWiMfIdkJdQKPtBwwbvuAyGuqYFocfjKABb"
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "nH9Tvl04yyO3euKbYlSqaF/l8CXmzDJTyO7tDOFK59bV9auE4KljrQ==";
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBadSubjectCertData[] =
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----BEGIN CERTIFICATE-----"
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MIIDejCCAmICBFEtN4wwDQYJKoZIhvcNAQEFBQAwfTELMAkGA1UEBhMCVVMxEzARBgNVBAgM"
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "CkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEzARBgNVBAoMCkdvb2dsZSBJ"
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "bmMxEjAQBgNVBAsMCUdvb2dsZSBUVjEYMBYGA1UEAwwPRXVyZWthIEdlbjEgSUNBMB4XDTEz"
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MDIyNjIyMzAzNloXDTMzMDIyMTIyMzAzNlowdzETMBEGA1UECBMKQ2FsaWZvcm5pYTELMAkG"
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "A1UEBhMCVVMxFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEjAQBgNVBAsTCUdvb2dsZSBUVjET"
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MBEGA1UEChMKR29vZ2xlIEluYzESMBAGA1UEAxQJZXZ0X2UxMjYyMIIBIjANBgkqhkiG9w0B"
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "AQEFAAOCAQ8AMIIBCgKCAQEAo7Uu+bdyCjtiUYpmNU4ZvRjDg6VkEh/g0YPDG2pICBU4XKvs"
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "qHH1i0hbtWp1J79hV9Rqst1yHT02Oeh3o1SOd2zeamYzmvXRVN7AZqfQlzWxwxk/ltpXGwew"
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "m+EIR2bP4kpvyEKvvziTMtTxviOK+A395QyodMhMXClKTus/Gme2r1fBoQqJJR/zrmwXCsl5"
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "kpdhj7FOIII3BCYV0zejjQquzywjsKfCVON28VGgJdaKgmXxkeRYYWVNnuTNna57vXe16FP6"
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "hS1ty1U77ESffLTpNJ/M4tsd2dMVVTDuGeX3q8Ix4TN8cqpqu1AKEf59hygys9j6cHZRKR/d"
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "iv0+uQIDAQABow0wCzAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUAA4IBAQAZx6XyEK9SLHE+"
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "rbKCVsLN9+hTEa50aikPmxOZt+lFuB4+VJZ/GCPQCZJIde2tlWUe2YBgoZw2xUKgIsM3Yq42"
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Gawi35/oZ3qycTgYU8KJP9kUMbYNAH90mz9BDH7MmnRID5dFexHyBCG88EJ+ZvxmUVn0EVDc"
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "sSMt11wIAZ/T+/gsE1120d/GxhjYQ9YZz7SZXBQfRdqCdcPNl2+QSHHl+WvYLzdJa2xYj39/"
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "kQu47Vp7X5rZrHSBvzdVymH0Od2D18t+Q6lxbSdyUNhP1MVhdkT1Ct4OmRS3FJ4aannXMhfq"
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Ng7k4Sfif5iktYT4VRKpThe0EGJNfqKJKYtvHEVC"
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----END CERTIFICATE-----";
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBadCertData[] = "not a certificate";
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBadNonce[] = "bad nonce";
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBadHotspotBssid[] = "bad bssid";
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string unsigned_data = base::StringPrintf(
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "%s,%s,%s,%s,%s", kName, kSsdpUdn, kHotspotBssid, kPublicKey, kNonce);
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string signed_data;
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Base64Decode(kSignedData, &signed_data);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NetworkingPrivateCrypto crypto;
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking basic verification operation.
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(crypto.VerifyCredentials(
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kCertData, signed_data, unsigned_data, kHotspotBssid));
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking that verification fails when the certificate is signed, but
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // subject is malformed.
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(crypto.VerifyCredentials(
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kBadSubjectCertData, signed_data, unsigned_data, kHotspotBssid));
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking that verification fails when certificate has invalid format.
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(crypto.VerifyCredentials(
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kBadCertData, signed_data, unsigned_data, kHotspotBssid));
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking that verification fails when Hotspot Bssid is invalid.
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(crypto.VerifyCredentials(
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kCertData, signed_data, unsigned_data, kBadHotspotBssid));
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking that verification fails when there is bad nonce in unsigned_data.
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  unsigned_data = base::StringPrintf(
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "%s,%s,%s,%s,%s", kName, kSsdpUdn, kHotspotBssid, kPublicKey, kBadNonce);
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(crypto.VerifyCredentials(
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kCertData, signed_data, unsigned_data, kHotspotBssid));
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Test that NetworkingPrivateCrypto::EncryptByteString behaves as expected.
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NetworkingPrivateCryptoTest, EncryptByteString) {
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NetworkingPrivateCrypto crypto;
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kPublicKey[] =
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MIGJAoGBANTjeoILNkSKHVkd3my/rSwNi+9t473vPJU0lkM8nn9C7+gmaPvEWg4ZNkMd12aI"
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "XDXVHrjgjcS80bPE0ykhN9J7EYkJ+43oulJMrEnyDy5KQo7U3MKBdjaKFTS+OPyohHpI8GqH"
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "KM8UMkLPVtAKu1BXgGTSDvEaBAuoVT2PM4XNAgMBAAE=";
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kPrivateKey[] =
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----BEGIN PRIVATE KEY-----"
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANTjeoILNkSKHVkd"
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "3my/rSwNi+9t473vPJU0lkM8nn9C7+gmaPvEWg4ZNkMd12aIXDXVHrjgjcS80bPE"
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "0ykhN9J7EYkJ+43oulJMrEnyDy5KQo7U3MKBdjaKFTS+OPyohHpI8GqHKM8UMkLP"
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "VtAKu1BXgGTSDvEaBAuoVT2PM4XNAgMBAAECgYEAt91H/2zjj8qhkkhDxDS/wd5p"
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "T37fRTmMX2ktpiCC23LadOxHm7p39Nk9jjYFxV5cFXpdsFrw1kwl6VdC8LDp3eGu"
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "Ku1GCqj5H2fpnkmL2goD01HRkPR3ro4uBHPtTXDbCIz0qp+NGlGG4gPUysMXxHSb"
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "E5FIWeUx6gcPvidwrpkCQQD40FXY46KDJT8JVYJMqY6nFQZvptFl+9BGWfheVVSF"
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "KBlTQBx/QA+XcC/W9Q/I+NEhdGcxLlkEMUpihSpYffKbAkEA2wmFfccdheTtoOuY"
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "8oTurbnFHsS7gLtcR2IbRJKXw80CJxTQA/LMWz0YuFOAYJNl/9ILMfp6MQiI4L9F"
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "l6pbtwJAJqkAXcXo72WvKL0flNfXsYBj0p9h8+2vi+7Y15d8nYAAh13zz5XdllM5"
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "K7ZCMKDwpbkXe53O+QbLnwk/7iYLtwJAERT6AygfJk0HNzCIeglh78x4EgE3uj9i"
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "X/LHu55PFacMTu3xlw09YLQwFFf2wBFeuAeyddBZ7S8ENbrU+5H+mwJBAO2E6gwG"
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "e5ZqY4RmsQmv6K0rn5k+UT4qlPeVp1e6LnvO/PcKWOaUvDK59qFZoX4vN+iFUAbk"
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "IuvhmL9u/uPWWck="
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "-----END PRIVATE KEY-----";
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kBadKeyData[] = "bad key";
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kTestData[] = "disco boy";
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char kEmptyData[] = "";
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string public_key;
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Base64Decode(kPublicKey, &public_key);
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string plain;
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string encrypted_output;
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking basic encryption operation.
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  plain = kTestData;
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(crypto.EncryptByteString(public_key, plain, &encrypted_output));
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(VerifyByteString(kPrivateKey, plain, encrypted_output));
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking that we can encrypt the empty string.
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  plain = kEmptyData;
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(crypto.EncryptByteString(public_key, plain, &encrypted_output));
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking graceful fail for too much data to encrypt.
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      crypto.EncryptByteString(public_key,
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               std::string(500, 'x'),
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                               &encrypted_output));
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Checking graceful fail for a bad key format.
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      crypto.EncryptByteString(kBadKeyData, kTestData, &encrypted_output));
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
172