diff options
-rw-r--r-- | indra/llcommon/llbase32.cpp | 214 | ||||
-rw-r--r-- | indra/llcommon/llbase32.h | 19 | ||||
-rw-r--r-- | indra/llmessage/llmail.cpp | 28 | ||||
-rw-r--r-- | indra/newview/licenses-linux.txt | 32 | ||||
-rw-r--r-- | indra/newview/licenses-mac.txt | 32 | ||||
-rw-r--r-- | indra/newview/licenses-win32.txt | 32 |
6 files changed, 333 insertions, 24 deletions
diff --git a/indra/llcommon/llbase32.cpp b/indra/llcommon/llbase32.cpp new file mode 100644 index 0000000000..711ba63ea2 --- /dev/null +++ b/indra/llcommon/llbase32.cpp @@ -0,0 +1,214 @@ +/** + * @file llbase32.cpp + * @brief base32 encoding that returns a std::string + * @author James Cook + * + * Based on code from bitter + * http://ghostwhitecrab.com/bitter/ + * + * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "linden_common.h" + +#include "llbase32.h" + +#include <string> + +// bitter - base32.c starts here + +/* + * See RFC 3548 for details about Base 32 encoding: + * http://www.faqs.org/rfcs/rfc3548.html + */ + +static const char base32_alphabet[32] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', '2', '3', '4', '5', '6', '7' +}; + +size_t +base32_encode(char *dst, size_t size, const void *data, size_t len) +{ + size_t i = 0; + const U8 *p = (const U8*)data; + const char *end = &dst[size]; + char *q = dst; + + do { + size_t j, k; + U8 x[5]; + char s[8]; + + switch (len - i) { + case 4: k = 7; break; + case 3: k = 5; break; + case 2: k = 3; break; + case 1: k = 2; break; + default: + k = 8; + } + + for (j = 0; j < 5; j++) + x[j] = i < len ? p[i++] : 0; + +/* + +-------+-----------+--------+ + | target| source | source | + | byte | bits | byte | + +-------+-----------+--------+ + | 0 | 7 6 5 4 3 | 0 | + | 1 | 2 1 0 7 6 | 0-1 | + | 2 | 5 4 3 2 1 | 1 | + | 3 | 0 7 6 5 4 | 1-2 | + | 4 | 3 2 1 0 7 | 2-3 | + | 5 | 6 5 4 3 2 | 3 | + | 6 | 1 0 7 6 5 | 3-4 | + | 7 | 4 3 2 1 0 | 4 | + +-------+-----------+--------+ + +*/ + + s[0] = (x[0] >> 3); + s[1] = ((x[0] & 0x07) << 2) | (x[1] >> 6); + s[2] = (x[1] >> 1) & 0x1f; + s[3] = ((x[1] & 0x01) << 4) | (x[2] >> 4); + s[4] = ((x[2] & 0x0f) << 1) | (x[3] >> 7); + s[5] = (x[3] >> 2) & 0x1f; + s[6] = ((x[3] & 0x03) << 3) | (x[4] >> 5); + s[7] = x[4] & 0x1f; + + for (j = 0; j < k && q != end; j++) + *q++ = base32_alphabet[(U8) s[j]]; + + } while (i < len); + + return q - dst; +} + +/* *TODO: Implement base32 encode. + +#define ARRAY_LEN(a) (sizeof (a) / sizeof((a)[0])) + +static inline int +ascii_toupper(int c) +{ + return c >= 97 && c <= 122 ? c - 32 : c; +} + +static inline int +ascii_tolower(int c) +{ + return c >= 65 && c <= 90 ? c + 32 : c; +} + + +static char base32_map[(unsigned char) -1]; + +size_t +base32_decode(char *dst, size_t size, const void *data, size_t len) +{ + const char *end = &dst[size]; + const unsigned char *p = data; + char *q = dst; + size_t i; + unsigned max_pad = 3; + + if (0 == base32_map[0]) { + for (i = 0; i < ARRAY_LEN(base32_map); i++) { + const char *x; + + x = memchr(base32_alphabet, ascii_toupper(i), sizeof base32_alphabet); + base32_map[i] = x ? (x - base32_alphabet) : (unsigned char) -1; + } + } + + for (i = 0; i < len && max_pad > 0; i++) { + unsigned char c; + char s[8]; + size_t j; + + c = p[i]; + if ('=' == c) { + max_pad--; + c = 0; + } else { + c = base32_map[c]; + if ((unsigned char) -1 == c) { + return -1; + } + } + + j = i % ARRAY_LEN(s); + s[j] = c; + + if (7 == j) { + char b[5]; + + b[0] = ((s[0] << 3) & 0xf8) | ((s[1] >> 2) & 0x07); + b[1] = ((s[1] & 0x03) << 6) | ((s[2] & 0x1f) << 1) | ((s[3] >> 4) & 1); + b[2] = ((s[3] & 0x0f) << 4) | ((s[4] >> 1) & 0x0f); + b[3] = ((s[4] & 1) << 7) | ((s[5] & 0x1f) << 2) | ((s[6] >> 3) & 0x03); + b[4] = ((s[6] & 0x07) << 5) | (s[7] & 0x1f); + + for (j = 0; j < ARRAY_LEN(b); j++) { + if (q != end) + *q = b[j]; + q++; + } + } + } + + return q - dst; +} +*/ + + +// static +std::string LLBase32::encode(const U8* input, size_t input_size) +{ + std::string output; + if (input) + { + // Each 5 byte chunk of input is represented by an + // 8 byte chunk of output. + size_t input_chunks = (input_size + 4) / 5; + size_t output_size = input_chunks * 8; + + output.resize(output_size); + + size_t encoded = base32_encode(&output[0], output_size, input, input_size); + + llinfos << "encoded " << encoded << " into buffer of size " << output_size + << llendl; + } + return output; +} diff --git a/indra/llcommon/llbase32.h b/indra/llcommon/llbase32.h new file mode 100644 index 0000000000..5fd06f9e30 --- /dev/null +++ b/indra/llcommon/llbase32.h @@ -0,0 +1,19 @@ +/**
+ * @file llbase32.h
+ * @brief base32 encoding that returns a std::string
+ * @author James Cook
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LLBASE32_H
+#define LLBASE32_h
+
+class LLBase32
+{
+public:
+ static std::string encode(const U8* input, size_t input_size);
+};
+
+#endif
diff --git a/indra/llmessage/llmail.cpp b/indra/llmessage/llmail.cpp index 1e0eb7fe3a..dd878e1679 100644 --- a/indra/llmessage/llmail.cpp +++ b/indra/llmessage/llmail.cpp @@ -25,7 +25,7 @@ #include "apr-1/apr_network_io.h" #include "llapr.h" -#include "llbase64.h" // IM-to-email address +#include "llbase32.h" // IM-to-email address #include "llblowfishcipher.h" #include "llerror.h" #include "llhost.h" @@ -326,30 +326,10 @@ std::string LLMail::encryptIMEmailAddress(const LLUUID& from_agent_id, U8* encrypted = new U8[encrypted_size]; cipher.encrypt(&data[0], data_size, encrypted, encrypted_size); - // Base64 encoded and replace the pieces of base64 that are less compatible - // with e-mail local-parts. - // See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet" - std::string address = LLBase64::encode(encrypted, encrypted_size); - LLString::replaceChar(address, '+', '-'); - LLString::replaceChar(address, '/', '_'); + std::string address = LLBase32::encode(encrypted, encrypted_size); - // Strip padding = signs, see RFC - size_t extra_bytes = encrypted_size % 3; - size_t padding_size = 0; - if (extra_bytes == 0) - { - padding_size = 0; - } - else if (extra_bytes == 1) - { - padding_size = 2; - } - else if (extra_bytes == 2) - { - padding_size = 1; - } - - address.resize(address.size() - padding_size); + // Make it more pretty for humans. + LLString::toLower(address); delete [] encrypted; diff --git a/indra/newview/licenses-linux.txt b/indra/newview/licenses-linux.txt index 57df413ae0..20b76c8bc7 100644 --- a/indra/newview/licenses-linux.txt +++ b/indra/newview/licenses-linux.txt @@ -16,6 +16,38 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +============== +Base32 License +============== + + * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + ========== Cg License ========== diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt index f761ed6cbb..77541ba7ea 100644 --- a/indra/newview/licenses-mac.txt +++ b/indra/newview/licenses-mac.txt @@ -16,6 +16,38 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +============== +Base32 License +============== + + * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + ========== Cg License ========== diff --git a/indra/newview/licenses-win32.txt b/indra/newview/licenses-win32.txt index f761ed6cbb..77541ba7ea 100644 --- a/indra/newview/licenses-win32.txt +++ b/indra/newview/licenses-win32.txt @@ -16,6 +16,38 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +============== +Base32 License +============== + + * Copyright (c) 2006 Christian Biere <christianbiere@gmx.de> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the authors nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + ========== Cg License ========== |