1// 2// Copyright (C) 2012 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17#include "shill/crypto_provider.h" 18 19#include <memory> 20 21#include <base/strings/string_util.h> 22 23#include "shill/crypto_des_cbc.h" 24#include "shill/crypto_rot47.h" 25#include "shill/logging.h" 26 27using std::string; 28 29namespace shill { 30 31const char CryptoProvider::kKeyMatterFile[] = "/var/lib/whitelist/owner.key"; 32 33CryptoProvider::CryptoProvider() 34 : key_matter_file_(kKeyMatterFile) {} 35 36void CryptoProvider::Init() { 37 cryptos_.clear(); 38 39 // Register the crypto modules in priority order -- highest priority first. 40 std::unique_ptr<CryptoDESCBC> des_cbc(new CryptoDESCBC()); 41 if (des_cbc->LoadKeyMatter(key_matter_file_)) { 42 cryptos_.push_back(des_cbc.release()); 43 } 44 cryptos_.push_back(new CryptoROT47()); 45} 46 47string CryptoProvider::Encrypt(const string& plaintext) { 48 for (auto crypto : cryptos_) { 49 string ciphertext; 50 if (crypto->Encrypt(plaintext, &ciphertext)) { 51 const string prefix = crypto->GetID() + ":"; 52 return prefix + ciphertext; 53 } 54 } 55 LOG(WARNING) << "Unable to encrypt text, returning as is."; 56 return plaintext; 57} 58 59string CryptoProvider::Decrypt(const string& ciphertext) { 60 for (auto crypto : cryptos_) { 61 const string prefix = crypto->GetID() + ":"; 62 if (base::StartsWith(ciphertext, prefix, base::CompareCase::SENSITIVE)) { 63 string to_decrypt = ciphertext; 64 to_decrypt.erase(0, prefix.size()); 65 string plaintext; 66 if (!crypto->Decrypt(to_decrypt, &plaintext)) { 67 LOG(WARNING) << "Crypto module " << crypto->GetID() 68 << " failed to decrypt."; 69 } 70 return plaintext; 71 } 72 } 73 LOG(WARNING) << "Unable to decrypt text, returning as is."; 74 return ciphertext; 75} 76 77} // namespace shill 78