Botan  1.11.15
src/lib/base/symkey.cpp
Go to the documentation of this file.
00001 /*
00002 * OctetString
00003 * (C) 1999-2007 Jack Lloyd
00004 *
00005 * Botan is released under the Simplified BSD License (see license.txt)
00006 */
00007 
00008 #include <botan/symkey.h>
00009 #include <botan/internal/xor_buf.h>
00010 #include <botan/rng.h>
00011 #include <botan/hex.h>
00012 #include <algorithm>
00013 
00014 namespace Botan {
00015 
00016 /*
00017 * Create an OctetString from RNG output
00018 */
00019 OctetString::OctetString(RandomNumberGenerator& rng,
00020                          size_t length)
00021    {
00022    bits = rng.random_vec(length);
00023    }
00024 
00025 /*
00026 * Create an OctetString from a hex string
00027 */
00028 OctetString::OctetString(const std::string& hex_string)
00029    {
00030    bits.resize(1 + hex_string.length() / 2);
00031    bits.resize(hex_decode(&bits[0], hex_string));
00032    }
00033 
00034 /*
00035 * Create an OctetString from a byte string
00036 */
00037 OctetString::OctetString(const byte in[], size_t n)
00038    {
00039    bits.assign(in, in + n);
00040    }
00041 
00042 /*
00043 * Set the parity of each key byte to odd
00044 */
00045 void OctetString::set_odd_parity()
00046    {
00047    const byte ODD_PARITY[256] = {
00048       0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x07, 0x07, 0x08, 0x08, 0x0B, 0x0B,
00049       0x0D, 0x0D, 0x0E, 0x0E, 0x10, 0x10, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16,
00050       0x19, 0x19, 0x1A, 0x1A, 0x1C, 0x1C, 0x1F, 0x1F, 0x20, 0x20, 0x23, 0x23,
00051       0x25, 0x25, 0x26, 0x26, 0x29, 0x29, 0x2A, 0x2A, 0x2C, 0x2C, 0x2F, 0x2F,
00052       0x31, 0x31, 0x32, 0x32, 0x34, 0x34, 0x37, 0x37, 0x38, 0x38, 0x3B, 0x3B,
00053       0x3D, 0x3D, 0x3E, 0x3E, 0x40, 0x40, 0x43, 0x43, 0x45, 0x45, 0x46, 0x46,
00054       0x49, 0x49, 0x4A, 0x4A, 0x4C, 0x4C, 0x4F, 0x4F, 0x51, 0x51, 0x52, 0x52,
00055       0x54, 0x54, 0x57, 0x57, 0x58, 0x58, 0x5B, 0x5B, 0x5D, 0x5D, 0x5E, 0x5E,
00056       0x61, 0x61, 0x62, 0x62, 0x64, 0x64, 0x67, 0x67, 0x68, 0x68, 0x6B, 0x6B,
00057       0x6D, 0x6D, 0x6E, 0x6E, 0x70, 0x70, 0x73, 0x73, 0x75, 0x75, 0x76, 0x76,
00058       0x79, 0x79, 0x7A, 0x7A, 0x7C, 0x7C, 0x7F, 0x7F, 0x80, 0x80, 0x83, 0x83,
00059       0x85, 0x85, 0x86, 0x86, 0x89, 0x89, 0x8A, 0x8A, 0x8C, 0x8C, 0x8F, 0x8F,
00060       0x91, 0x91, 0x92, 0x92, 0x94, 0x94, 0x97, 0x97, 0x98, 0x98, 0x9B, 0x9B,
00061       0x9D, 0x9D, 0x9E, 0x9E, 0xA1, 0xA1, 0xA2, 0xA2, 0xA4, 0xA4, 0xA7, 0xA7,
00062       0xA8, 0xA8, 0xAB, 0xAB, 0xAD, 0xAD, 0xAE, 0xAE, 0xB0, 0xB0, 0xB3, 0xB3,
00063       0xB5, 0xB5, 0xB6, 0xB6, 0xB9, 0xB9, 0xBA, 0xBA, 0xBC, 0xBC, 0xBF, 0xBF,
00064       0xC1, 0xC1, 0xC2, 0xC2, 0xC4, 0xC4, 0xC7, 0xC7, 0xC8, 0xC8, 0xCB, 0xCB,
00065       0xCD, 0xCD, 0xCE, 0xCE, 0xD0, 0xD0, 0xD3, 0xD3, 0xD5, 0xD5, 0xD6, 0xD6,
00066       0xD9, 0xD9, 0xDA, 0xDA, 0xDC, 0xDC, 0xDF, 0xDF, 0xE0, 0xE0, 0xE3, 0xE3,
00067       0xE5, 0xE5, 0xE6, 0xE6, 0xE9, 0xE9, 0xEA, 0xEA, 0xEC, 0xEC, 0xEF, 0xEF,
00068       0xF1, 0xF1, 0xF2, 0xF2, 0xF4, 0xF4, 0xF7, 0xF7, 0xF8, 0xF8, 0xFB, 0xFB,
00069       0xFD, 0xFD, 0xFE, 0xFE };
00070 
00071    for(size_t j = 0; j != bits.size(); ++j)
00072       bits[j] = ODD_PARITY[bits[j]];
00073    }
00074 
00075 /*
00076 * Hex encode an OctetString
00077 */
00078 std::string OctetString::as_string() const
00079    {
00080    return hex_encode(&bits[0], bits.size());
00081    }
00082 
00083 /*
00084 * XOR Operation for OctetStrings
00085 */
00086 OctetString& OctetString::operator^=(const OctetString& k)
00087    {
00088    if(&k == this) { zeroise(bits); return (*this); }
00089    xor_buf(&bits[0], k.begin(), std::min(length(), k.length()));
00090    return (*this);
00091    }
00092 
00093 /*
00094 * Equality Operation for OctetStrings
00095 */
00096 bool operator==(const OctetString& s1, const OctetString& s2)
00097    {
00098    return (s1.bits_of() == s2.bits_of());
00099    }
00100 
00101 /*
00102 * Unequality Operation for OctetStrings
00103 */
00104 bool operator!=(const OctetString& s1, const OctetString& s2)
00105    {
00106    return !(s1 == s2);
00107    }
00108 
00109 /*
00110 * Append Operation for OctetStrings
00111 */
00112 OctetString operator+(const OctetString& k1, const OctetString& k2)
00113    {
00114    secure_vector<byte> out;
00115    out += k1.bits_of();
00116    out += k2.bits_of();
00117    return OctetString(out);
00118    }
00119 
00120 /*
00121 * XOR Operation for OctetStrings
00122 */
00123 OctetString operator^(const OctetString& k1, const OctetString& k2)
00124    {
00125    secure_vector<byte> ret(std::max(k1.length(), k2.length()));
00126 
00127    copy_mem(&ret[0], k1.begin(), k1.length());
00128    xor_buf(&ret[0], k2.begin(), k2.length());
00129    return OctetString(ret);
00130    }
00131 
00132 }