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