You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/08/08 11:09:25 UTC

svn commit: r802326 - /commons/sandbox/runtime/trunk/src/main/native/shared/base64.c

Author: mturk
Date: Sat Aug  8 09:09:25 2009
New Revision: 802326

URL: http://svn.apache.org/viewvc?rev=802326&view=rev
Log:
Port APR's base64 encoding

Added:
    commons/sandbox/runtime/trunk/src/main/native/shared/base64.c   (with props)

Added: commons/sandbox/runtime/trunk/src/main/native/shared/base64.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/base64.c?rev=802326&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/base64.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/base64.c Sat Aug  8 09:09:25 2009
@@ -0,0 +1,169 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+
+#include "acr.h"
+#include "acr_private.h"
+#include "acr_error.h"
+#include "acr_string.h"
+#include "acr_clazz.h"
+#include "acr_crypto.h"
+
+static const unsigned char pr2six[256] =
+{
+    /* ASCII table */
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
+    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
+    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
+    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
+};
+
+
+static const char basis64[] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+
+ACR_DECLARE(size_t) ACR_Base64DecodeLen(const char *bufcoded)
+{
+    size_t nbytesdecoded;
+    const unsigned char *bufin;
+    size_t nprbytes;
+
+    bufin = (const unsigned char *) bufcoded;
+    while (pr2six[*(bufin++)] <= 63);
+
+    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
+    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
+
+    return nbytesdecoded + 1;
+}
+
+/* This is the same as apr_base64_decode() except on EBCDIC machines, where
+ * the conversion of the output to ebcdic is left out.
+ */
+ACR_DECLARE(size_t) ACR_Base64Decode(unsigned char *bufplain,
+                                     const char *bufcoded)
+{
+    size_t nbytesdecoded;
+    const unsigned char *bufin;
+    unsigned char *bufout;
+    size_t nprbytes;
+
+    bufin = (const unsigned char *) bufcoded;
+    while (pr2six[*(bufin++)] <= 63);
+
+    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
+    nbytesdecoded = ((nprbytes + 3) / 4) * 3;
+
+    bufout = (unsigned char *) bufplain;
+    bufin  = (const unsigned char *) bufcoded;
+
+    while (nprbytes > 4) {
+        *(bufout++) =
+            (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
+        *(bufout++) =
+            (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
+        *(bufout++) =
+            (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
+        bufin += 4;
+        nprbytes -= 4;
+    }
+
+    /* Note: (nprbytes == 1) would be an error, so just ingore that case */
+    if (nprbytes > 1) {
+        *(bufout++) =
+            (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
+    }
+    if (nprbytes > 2) {
+        *(bufout++) =
+            (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
+    }
+    if (nprbytes > 3) {
+        *(bufout++) =
+            (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
+    }
+
+    nbytesdecoded -= (4 - nprbytes) & 3;
+    return nbytesdecoded;
+}
+
+ACR_DECLARE(size_t) ACR_Base64EncodeLen(size_t len)
+{
+    return ((len + 2) / 3 * 4) + 1;
+}
+
+/* This is the same as apr_base64_encode() except on EBCDIC machines, where
+ * the conversion of the input to ascii is left out.
+ */
+ACR_DECLARE(size_t) ACR_Base64Encode(char *encoded,
+                                     const unsigned char *string, size_t len)
+{
+    size_t i;
+    char *p;
+
+    p = encoded;
+    for (i = 0; i < len - 2; i += 3) {
+        *p++ = basis64[(string[i] >> 2) & 0x3F];
+        *p++ = basis64[((string[i] & 0x3) << 4) |
+                       ((int) (string[i + 1] & 0xF0) >> 4)];
+        *p++ = basis64[((string[i + 1] & 0xF) << 2) |
+                       ((int) (string[i + 2] & 0xC0) >> 6)];
+        *p++ = basis64[string[i + 2] & 0x3F];
+    }
+    if (i < len) {
+        *p++ = basis64[(string[i] >> 2) & 0x3F];
+        if (i == (len - 1)) {
+            *p++ = basis64[((string[i] & 0x3) << 4)];
+            *p++ = '=';
+        }
+        else {
+            *p++ = basis64[((string[i] & 0x3) << 4) |
+                           ((int) (string[i + 1] & 0xF0) >> 4)];
+            *p++ = basis64[((string[i + 1] & 0xF) << 2)];
+        }
+        *p++ = '=';
+    }
+
+    *p++ = '\0';
+    return (p - encoded);
+}
+
+ACR_DECLARE(size_t) ACR_Base64EncodeA(char *encoded, const char *string,
+                                      size_t len)
+{
+    return ACR_Base64Encode(encoded, (const unsigned char *)string, len);
+}
+
+ACR_DECLARE(size_t) ACR_Base64DecodeA(char *bufplain, const char *bufcoded)
+{
+    size_t len;
+    
+    len = ACR_Base64Decode((unsigned char *)bufplain, bufcoded);
+    bufplain[len] = '\0';
+    return len;
+}
+

Propchange: commons/sandbox/runtime/trunk/src/main/native/shared/base64.c
------------------------------------------------------------------------------
    svn:eol-style = native