Author: mturk
Date: Fri Aug  7 14:07:43 2009
New Revision: 802016

URL: http://svn.apache.org/viewvc?rev=802016&view=rev
Log:
Port APR's sha1 code

Added:
    commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h   (with 
props)
    commons/sandbox/runtime/trunk/src/main/native/shared/sha.c   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.in
    commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.in?rev=802016&r1=802015&r2=802016&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Fri Aug  7 
14:07:43 2009
@@ -87,6 +87,7 @@
        $(SRCDIR)/shared/nbb.$(OBJ) \
        $(SRCDIR)/shared/pointer.$(OBJ) \
        $(SRCDIR)/shared/object.$(OBJ) \
+       $(SRCDIR)/shared/sha.$(OBJ) \
        $(SRCDIR)/shared/string.$(OBJ) \
        $(SRCDIR)/shared/tables.$(OBJ) \
        $(SRCDIR)/shared/xdr.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=802016&r1=802015&r2=802016&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Fri Aug  7 
14:07:43 2009
@@ -80,6 +80,7 @@
        $(SRCDIR)/shared/nbb.$(OBJ) \
        $(SRCDIR)/shared/pointer.$(OBJ) \
        $(SRCDIR)/shared/object.$(OBJ) \
+       $(SRCDIR)/shared/sha.$(OBJ) \
        $(SRCDIR)/shared/string.$(OBJ) \
        $(SRCDIR)/shared/tables.$(OBJ) \
        $(SRCDIR)/shared/xdr.$(OBJ) \

Added: commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h?rev=802016&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h (added)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h Fri Aug  
7 14:07:43 2009
@@ -0,0 +1,132 @@
+/* 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.
+ */
+
+#ifndef _ACR_CRYPTO_H
+#define _ACR_CRYPTO_H
+
+#include "acr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file acr_crypto.h
+ * @brief
+ *
+ * ACR Cryptographic functions
+ *
+ */
+
+/** 
+ * Size of the SHA1 DIGEST
+ */
+#define ACR_SHA1_DIGESTSIZE 20
+
+/**
+ * Define the Magic String prefix that identifies a password as being
+ * hashed using our algorithm.
+ */
+#define ACR_SHA1PW_ID "{SHA}"
+
+/** length of the SHA Password */
+#define ACR_SHA1PW_IDLEN 5
+
+/** @see acr_sha1_ctx_t */
+typedef struct acr_sha1_ctx_t acr_sha1_ctx_t;
+
+/** 
+ * SHA1 context structure
+ */
+struct acr_sha1_ctx_t {
+    /** message digest */
+    acr_uint32_t digest[5];
+    /** 64-bit bit counts */
+    acr_uint32_t count_lo, count_hi;
+    /** SHA data buffer */
+    acr_uint32_t data[16];
+    /** unprocessed amount in data */
+    int local;
+};
+
+/**
+ * Initialize the SHA digest
+ * @param context The SHA context to initialize
+ */
+ACR_DECLARE(void) ACR_Sha1Init(acr_sha1_ctx_t *context);
+
+/**
+ * Update the SHA digest with binary data
+ * @param context The SHA1 context to update
+ * @param input The buffer to add to the SHA digest
+ * @param count The length of the input buffer
+ */
+ACR_DECLARE(void) ACR_Sha1Update(acr_sha1_ctx_t *context,
+                                 const unsigned char *input,
+                                 unsigned int count);
+
+/**
+ * Update the SHA digest
+ * @param context The SHA1 context to update
+ * @param input The buffer to add to the SHA digest
+ * @param count The length of the input buffer
+ */
+ACR_DECLARE(void) ACR_Sha1UpdateA(acr_sha1_ctx_t *context,
+                                  const char *input,
+                                  unsigned int count);
+
+/**
+ * Update the SHA digest
+ * @param context The SHA1 context to update
+ * @param input The buffer to add to the SHA digest
+ * @param count The length of the input buffer
+ */
+ACR_DECLARE(void) ACR_Sha1UpdateW(acr_sha1_ctx_t *context,
+                                  const wchar_t *input,
+                                  unsigned int count);
+
+/**
+ * Finish computing the SHA digest
+ * @param digest the output buffer in which to store the digest
+ * @param context The context to finalize
+ */
+ACR_DECLARE(void) ACR_Sha1Final(unsigned char digest[ACR_SHA1_DIGESTSIZE],
+                                acr_sha1_ctx_t *context);
+
+/**
+ * Provide a means to SHA1 crypt/encode a plaintext data using
+ * base 16 encoding.
+ * @param clear The plaintext data.
+ * @param len The length of the plaintext data
+ * @param out The encrypted/encoded password
+ */
+ACR_DECLARE(void) ACR_Sha1Base16A(const char *clear, int len, char *out);
+
+/**
+ * Provide a means to SHA1 crypt/encode a plaintext data using
+ * base 16 encoding.
+ * @param clear The plaintext data.
+ * @param len The length of the plaintext data
+ * @param out The encrypted/encoded password
+ */
+ACR_DECLARE(void) ACR_Sha1Base16W(const wchar_t *clear, int len, wchar_t *out);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACR_CRYPTO_H */
+

Propchange: commons/sandbox/runtime/trunk/src/main/native/include/acr_crypto.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: commons/sandbox/runtime/trunk/src/main/native/shared/sha.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/sha.c?rev=802016&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/sha.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/sha.c Fri Aug  7 
14:07:43 2009
@@ -0,0 +1,285 @@
+/* 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.
+ */
+
+/*
+ *
+ * @author Mladen Turk
+ */
+
+#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 char basis16[] =
+    "0123456789abcdef";
+
+#define HI_NIBBLE_HEX(a) (basis16[((unsigned char)(a) >> 4)])
+#define LO_NIBBLE_HEX(a) (basis16[((unsigned char)(a) & 0x0F)])
+
+/* a bit faster & bigger, if defined */
+#define UNROLL_LOOPS
+
+/* NIST's proposed modification to SHA, 7/11/94 */
+#define USE_MODIFIED_SHA
+
+/* SHA f()-functions */
+#define f1(x,y,z)   ((x & y) | (~x & z))
+#define f2(x,y,z)   (x ^ y ^ z)
+#define f3(x,y,z)   ((x & y) | (x & z) | (y & z))
+#define f4(x,y,z)   (x ^ y ^ z)
+
+/* SHA constants */
+#define CONST1      0x5a827999L
+#define CONST2      0x6ed9eba1L
+#define CONST3      0x8f1bbcdcL
+#define CONST4      0xca62c1d6L
+
+/* 32-bit rotate */
+
+#define ROT32(x,n)  ((x << n) | (x >> (32 - n)))
+
+#define FUNC(n,i)                       \
+    temp = ROT32(A,5) + f##n(B,C,D) + E + W[i] + CONST##n;  \
+    E = D; D = C; C = ROT32(B,30); B = A; A = temp
+
+#define SHA_BLOCKSIZE           64
+
+/* do SHA transformation */
+static void sha_transform(acr_sha1_ctx_t *context)
+{
+    int i;
+    acr_uint32_t temp, A, B, C, D, E, W[80];
+
+    for (i = 0; i < 16; ++i) {
+        W[i] = context->data[i];
+    }
+    for (i = 16; i < 80; ++i) {
+        W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];
+#ifdef USE_MODIFIED_SHA
+        W[i] = ROT32(W[i], 1);
+#endif /* USE_MODIFIED_SHA */
+    }
+    A = context->digest[0];
+    B = context->digest[1];
+    C = context->digest[2];
+    D = context->digest[3];
+    E = context->digest[4];
+
+    FUNC(1, 0);  FUNC(1, 1);  FUNC(1, 2);  FUNC(1, 3);  FUNC(1, 4);
+    FUNC(1, 5);  FUNC(1, 6);  FUNC(1, 7);  FUNC(1, 8);  FUNC(1, 9);
+    FUNC(1,10);  FUNC(1,11);  FUNC(1,12);  FUNC(1,13);  FUNC(1,14);
+    FUNC(1,15);  FUNC(1,16);  FUNC(1,17);  FUNC(1,18);  FUNC(1,19);
+
+    FUNC(2,20);  FUNC(2,21);  FUNC(2,22);  FUNC(2,23);  FUNC(2,24);
+    FUNC(2,25);  FUNC(2,26);  FUNC(2,27);  FUNC(2,28);  FUNC(2,29);
+    FUNC(2,30);  FUNC(2,31);  FUNC(2,32);  FUNC(2,33);  FUNC(2,34);
+    FUNC(2,35);  FUNC(2,36);  FUNC(2,37);  FUNC(2,38);  FUNC(2,39);
+
+    FUNC(3,40);  FUNC(3,41);  FUNC(3,42);  FUNC(3,43);  FUNC(3,44);
+    FUNC(3,45);  FUNC(3,46);  FUNC(3,47);  FUNC(3,48);  FUNC(3,49);
+    FUNC(3,50);  FUNC(3,51);  FUNC(3,52);  FUNC(3,53);  FUNC(3,54);
+    FUNC(3,55);  FUNC(3,56);  FUNC(3,57);  FUNC(3,58);  FUNC(3,59);
+
+    FUNC(4,60);  FUNC(4,61);  FUNC(4,62);  FUNC(4,63);  FUNC(4,64);
+    FUNC(4,65);  FUNC(4,66);  FUNC(4,67);  FUNC(4,68);  FUNC(4,69);
+    FUNC(4,70);  FUNC(4,71);  FUNC(4,72);  FUNC(4,73);  FUNC(4,74);
+    FUNC(4,75);  FUNC(4,76);  FUNC(4,77);  FUNC(4,78);  FUNC(4,79);
+
+    context->digest[0] += A;
+    context->digest[1] += B;
+    context->digest[2] += C;
+    context->digest[3] += D;
+    context->digest[4] += E;
+}
+
+#if !CC_IS_BIG_ENDIAN
+/* Change endianness of data.
+ * count is the number of bytes to do an endian flip
+ */
+static void byte_reverse(acr_uint32_t *buffer, int count)
+{
+    int i;
+    acr_byte_t ct[4], *cp;
+
+    count /= sizeof(acr_uint32_t);
+    cp = (acr_byte_t *) buffer;
+    for (i = 0; i < count; ++i) {
+        ct[0] = cp[0];
+        ct[1] = cp[1];
+        ct[2] = cp[2];
+        ct[3] = cp[3];
+        cp[0] = ct[3];
+        cp[1] = ct[2];
+        cp[2] = ct[1];
+        cp[3] = ct[0];
+        cp += sizeof(acr_uint32_t);
+    }
+}
+#endif
+
+/* initialize the SHA digest */
+
+ACR_DECLARE(void) ACR_Sha1Init(acr_sha1_ctx_t *context)
+{
+    context->digest[0] = 0x67452301L;
+    context->digest[1] = 0xefcdab89L;
+    context->digest[2] = 0x98badcfeL;
+    context->digest[3] = 0x10325476L;
+    context->digest[4] = 0xc3d2e1f0L;
+    context->count_lo  = 0L;
+    context->count_hi  = 0L;
+    context->local     = 0;
+}
+
+/* 
+ * Update the SHA digest
+ */
+ACR_DECLARE(void) ACR_Sha1Update(acr_sha1_ctx_t *context,
+                                 const unsigned char *buffer,
+                                 unsigned int count)
+{
+    unsigned int i;
+
+    if ((context->count_lo + ((acr_uint32_t) count << 3)) < context->count_lo) 
{
+        ++context->count_hi;
+    }
+    context->count_lo += (acr_uint32_t) count << 3;
+    context->count_hi += (acr_uint32_t) count >> 29;
+    if (context->local) {
+        i = SHA_BLOCKSIZE - context->local;
+        if (i > count) {
+            i = count;
+        }
+        memcpy(((acr_byte_t *) context->data) + context->local, buffer, i);
+        count -= i;
+        buffer += i;
+        context->local += i;
+        if (context->local == SHA_BLOCKSIZE) {
+#if !CC_IS_BIG_ENDIAN
+            byte_reverse(context->data, SHA_BLOCKSIZE);
+#endif
+            sha_transform(context);
+        }
+        else {
+            return;
+        }
+    }
+    while (count >= SHA_BLOCKSIZE) {
+        memcpy(context->data, buffer, SHA_BLOCKSIZE);
+        buffer += SHA_BLOCKSIZE;
+        count -= SHA_BLOCKSIZE;
+#if !CC_IS_BIG_ENDIAN
+        byte_reverse(context->data, SHA_BLOCKSIZE);
+#endif
+        sha_transform(context);
+    }
+    memcpy(context->data, buffer, count);
+    context->local = count;
+}
+
+ACR_DECLARE(void) ACR_Sha1UpdateA(acr_sha1_ctx_t *context,
+                                  const char *buf,
+                                  unsigned int count)
+{
+    ACR_Sha1Update(context, (const unsigned char *)buf, count);
+}
+
+ACR_DECLARE(void) ACR_Sha1UpdateW(acr_sha1_ctx_t *context,
+                                  const wchar_t *buf,
+                                  unsigned int count)
+{
+    ACR_Sha1Update(context, (const unsigned char *)buf,
+                   count * sizeof(wchar_t));
+}
+
+/* 
+ * Finish computing the SHA digest
+ */
+ACR_DECLARE(void) ACR_Sha1Final(unsigned char digest[ACR_SHA1_DIGESTSIZE],
+                                acr_sha1_ctx_t *context)
+{
+    int count, i, j;
+    acr_uint32_t lo_bit_count, hi_bit_count, k;
+
+    lo_bit_count = context->count_lo;
+    hi_bit_count = context->count_hi;
+    count = (int) ((lo_bit_count >> 3) & 0x3f);
+    ((acr_byte_t *) context->data)[count++] = 0x80;
+
+    if (count > SHA_BLOCKSIZE - 8) {
+        memset(((acr_byte_t *) context->data) + count, 0, SHA_BLOCKSIZE - 
count);
+#if !CC_IS_BIG_ENDIAN
+        byte_reverse(context->data, SHA_BLOCKSIZE);
+#endif
+        sha_transform(context);
+        memset((acr_byte_t *) context->data, 0, SHA_BLOCKSIZE - 8);
+    }
+    else {
+        memset(((acr_byte_t *) context->data) + count, 0,
+               SHA_BLOCKSIZE - 8 - count);
+    }
+#if !CC_IS_BIG_ENDIAN
+    byte_reverse(context->data, SHA_BLOCKSIZE);
+#endif
+    context->data[14] = hi_bit_count;
+    context->data[15] = lo_bit_count;
+    sha_transform(context);
+
+    for (i = 0, j = 0; j < ACR_SHA1_DIGESTSIZE; i++) {
+        k = context->digest[i];
+        digest[j++] = (unsigned char)((k >> 24) & 0xff);
+        digest[j++] = (unsigned char)((k >> 16) & 0xff);
+        digest[j++] = (unsigned char)((k >> 8 ) & 0xff);
+        digest[j++] = (unsigned char)( k        & 0xff);
+    }
+}
+
+ACR_DECLARE(void) ACR_Sha1Base16A(const char *clear, int len, char *out)
+{
+    int i, x = 0;
+    acr_sha1_ctx_t context;
+    acr_byte_t digest[ACR_SHA1_DIGESTSIZE];
+
+    ACR_Sha1Init(&context);
+    ACR_Sha1UpdateA(&context, clear, len);
+    ACR_Sha1Final(digest, &context);
+    for (i = 0; i < ACR_SHA1_DIGESTSIZE; i++) {
+        out[x++] = HI_NIBBLE_HEX(digest[i]);
+        out[x++] = LO_NIBBLE_HEX(digest[i]);
+    }
+    out[x] = '\0';
+
+}
+
+ACR_DECLARE(void) ACR_Sha1Base16W(const wchar_t *clear, int len, wchar_t *out)
+{
+    int i, x = 0;
+    acr_sha1_ctx_t context;
+    acr_byte_t digest[ACR_SHA1_DIGESTSIZE];
+
+    ACR_Sha1Init(&context);
+    ACR_Sha1UpdateW(&context, clear, len);
+    ACR_Sha1Final(digest, &context);
+    for (i = 0; i < ACR_SHA1_DIGESTSIZE; i++) {
+        out[x++] = HI_NIBBLE_HEX(digest[i]);
+        out[x++] = LO_NIBBLE_HEX(digest[i]);
+    }
+    out[x] = L'\0';
+}
+

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


Reply via email to