| // Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "shill/crypto_rot47.h" |
| |
| using std::string; |
| |
| namespace shill { |
| |
| const char CryptoROT47::kID[] = "rot47"; |
| |
| CryptoROT47::CryptoROT47() {} |
| |
| string CryptoROT47::GetID() { |
| return kID; |
| } |
| |
| bool CryptoROT47::Encrypt(const string &plaintext, string *ciphertext) { |
| const int kRotSize = 94; |
| const int kRotHalf = kRotSize / 2; |
| const char kRotMin = '!'; |
| const char kRotMax = kRotMin + kRotSize - 1; |
| |
| *ciphertext = plaintext; |
| for (string::iterator ch = ciphertext->begin(); |
| ch != ciphertext->end(); ++ch) { |
| if (*ch < kRotMin || *ch > kRotMax) { |
| continue; |
| } |
| int rot = *ch + kRotHalf; |
| *ch = (rot > kRotMax) ? rot - kRotSize : rot; |
| } |
| return true; |
| } |
| |
| bool CryptoROT47::Decrypt(const string &ciphertext, string *plaintext) { |
| // ROT47 is self-reciprocal. |
| return Encrypt(ciphertext, plaintext); |
| } |
| |
| } // namespace shill |