summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llbase32.cpp214
-rw-r--r--indra/llcommon/llbase32.h19
-rw-r--r--indra/llmessage/llmail.cpp28
-rw-r--r--indra/newview/licenses-linux.txt32
-rw-r--r--indra/newview/licenses-mac.txt32
-rw-r--r--indra/newview/licenses-win32.txt32
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
==========