crypto_provider.cc revision cd47732488cd101eaf0d3558dde5a7d4e4fc260b
192e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov// Use of this source code is governed by a BSD-style license that can be
386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov// found in the LICENSE file.
486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_provider.h"
686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
7cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <memory>
8cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan
9a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_util.h>
1086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
1186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_des_cbc.h"
1286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov#include "shill/crypto_rot47.h"
13b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h"
1486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
1586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovusing std::string;
1686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
1786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovnamespace shill {
1886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
1986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovconst char CryptoProvider::kKeyMatterFile[] = "/var/lib/whitelist/owner.key";
2086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2186964e0bae1a38c6817243959026603b4b8c69b7Darin PetkovCryptoProvider::CryptoProvider(GLib *glib)
2286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    : glib_(glib),
2386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      key_matter_file_(kKeyMatterFile) {}
2486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovvoid CryptoProvider::Init() {
265ad1606ad8b3f74b2b7960a3003a2d1ca75d52b8Paul Stewart  cryptos_.clear();
2786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
2886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  // Register the crypto modules in priority order -- highest priority first.
29cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan  std::unique_ptr<CryptoDESCBC> des_cbc(new CryptoDESCBC(glib_));
3086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  if (des_cbc->LoadKeyMatter(key_matter_file_)) {
3186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    cryptos_.push_back(des_cbc.release());
3286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
3386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  cryptos_.push_back(new CryptoROT47());
3486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
3586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
3686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovstring CryptoProvider::Encrypt(const string &plaintext) {
376db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart  for (auto crypto : cryptos_) {
3886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    string ciphertext;
3986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    if (crypto->Encrypt(plaintext, &ciphertext)) {
4086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      const string prefix = crypto->GetID() + ":";
4186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      return prefix + ciphertext;
4286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    }
4386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
4486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  LOG(WARNING) << "Unable to encrypt text, returning as is.";
4586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  return plaintext;
4686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
4786964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
4886964e0bae1a38c6817243959026603b4b8c69b7Darin Petkovstring CryptoProvider::Decrypt(const string &ciphertext) {
496db7b24348e69639e19cd6c408388b10d6ee54fePaul Stewart  for (auto crypto : cryptos_) {
5086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    const string prefix = crypto->GetID() + ":";
5186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    if (StartsWithASCII(ciphertext, prefix, true)) {
5286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      string to_decrypt = ciphertext;
5386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      to_decrypt.erase(0, prefix.size());
5486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      string plaintext;
5592e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov      if (!crypto->Decrypt(to_decrypt, &plaintext)) {
5692e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov        LOG(WARNING) << "Crypto module " << crypto->GetID()
5792e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov                     << " failed to decrypt.";
5892e6561671667edc1cfa2517ece57f9f38a51fe5Darin Petkov      }
5986964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov      return plaintext;
6086964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov    }
6186964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  }
6286964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  LOG(WARNING) << "Unable to decrypt text, returning as is.";
6386964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov  return ciphertext;
6486964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}
6586964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov
6686964e0bae1a38c6817243959026603b4b8c69b7Darin Petkov}  // namespace shill
67