1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
1786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_provider.h"
1886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
19cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <memory>
20cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan
21a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
2286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_des_cbc.h"
2486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_rot47.h"
25b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
2686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovusing std::string;
2886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovnamespace shill {
3086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
3186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovconst char CryptoProvider::kKeyMatterFile[] = "/var/lib/whitelist/owner.key";
3286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
33d887589550018383cf6aa09e4c5313b067651891mukesh agrawalCryptoProvider::CryptoProvider()
34d887589550018383cf6aa09e4c5313b067651891mukesh agrawal    : key_matter_file_(kKeyMatterFile) {}
3586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
3686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovvoid CryptoProvider::Init() {
375ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart  cryptos_.clear();
3886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
3986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  // Register the crypto modules in priority order -- highest priority first.
40d887589550018383cf6aa09e4c5313b067651891mukesh agrawal  std::unique_ptr<CryptoDESCBC> des_cbc(new CryptoDESCBC());
4186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  if (des_cbc->LoadKeyMatter(key_matter_file_)) {
4286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    cryptos_.push_back(des_cbc.release());
4386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
4486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  cryptos_.push_back(new CryptoROT47());
4586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
4686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
47a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewartstring CryptoProvider::Encrypt(const string& plaintext) {
486db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart  for (auto crypto : cryptos_) {
4986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    string ciphertext;
5086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    if (crypto->Encrypt(plaintext, &ciphertext)) {
5186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      const string prefix = crypto->GetID() + ":";
5286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      return prefix + ciphertext;
5386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    }
5486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
5586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  LOG(WARNING) << "Unable to encrypt text, returning as is.";
5686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  return plaintext;
5786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
5886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
59a794cd60a7339d576ea2eed263a4f0a20fb255afPaul Stewartstring CryptoProvider::Decrypt(const string& ciphertext) {
606db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart  for (auto crypto : cryptos_) {
6186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    const string prefix = crypto->GetID() + ":";
623a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko    if (base::StartsWith(ciphertext, prefix, base::CompareCase::SENSITIVE)) {
6386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      string to_decrypt = ciphertext;
6486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      to_decrypt.erase(0, prefix.size());
6586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      string plaintext;
6692e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov      if (!crypto->Decrypt(to_decrypt, &plaintext)) {
6792e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov        LOG(WARNING) << "Crypto module " << crypto->GetID()
6892e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov                     << " failed to decrypt.";
6992e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov      }
7086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      return plaintext;
7186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    }
7286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
7386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  LOG(WARNING) << "Unable to decrypt text, returning as is.";
7486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  return ciphertext;
7586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
7686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
7786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}  // namespace shill
78