Botan
1.11.15
|
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 }