You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/01/12 14:06:46 UTC

[38/50] [abbrv] directory-kerberos git commit: Clean up a bit

Clean up a bit


Project: http://git-wip-us.apache.org/repos/asf/directory-kerberos/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerberos/commit/8a72a1c5
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerberos/tree/8a72a1c5
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerberos/diff/8a72a1c5

Branch: refs/heads/master
Commit: 8a72a1c5ddea99736b0ec9f94f70017e3cecf877
Parents: 1c98238
Author: Drankye <dr...@gmail.com>
Authored: Fri Dec 26 09:46:52 2014 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Fri Dec 26 09:46:52 2014 +0800

----------------------------------------------------------------------
 .../org/apache/kerberos/kerb/crypto/Nfold.java  | 82 +++++++++++++-------
 .../apache/kerberos/kerb/crypto/Nfold2Bak.java  | 57 ++++++++++++++
 2 files changed, 111 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/8a72a1c5/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold.java b/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold.java
index 46e9bf2..29c2362 100644
--- a/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold.java
+++ b/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold.java
@@ -2,56 +2,82 @@ package org.apache.kerberos.kerb.crypto;
 
 import java.util.Arrays;
 
-public class Nfold {
+/**
+ * Based on MIT krb5 nfold.c
+ */
 
-    public static byte[] nfold(byte[] input, int size) {
+/*
+ * n-fold(k-bits):
+ * l = lcm(n,k)
+ * r = l/k
+ * s = k-bits | k-bits rot 13 | k-bits rot 13*2 | ... | k-bits rot 13*(r-1)
+ * compute the 1's complement sum:
+ * n-fold = s[0..n-1]+s[n..2n-1]+s[2n..3n-1]+..+s[(k-1)*n..k*n-1]
+ */
+public class Nfold {
 
-        int inbits = input.length;
+    /**
+     * representation: msb first, assume n and k are multiples of 8, and
+     * that k>=16.  this is the case of all the cryptosystems which are
+     * likely to be used.  this function can be replaced if that
+     * assumption ever fails.
+     */
+    public static byte[] nfold(byte[] inBytes, int size) {
+        int inBytesNum = inBytes.length; // count inBytes byte
+        int outBytesNum = size; // count inBytes byte
 
         int a, b, c, lcm;
-        a = size;
-        b = inbits;
+        a = outBytesNum;
+        b = inBytesNum;
 
         while (b != 0) {
             c = b;
             b = a % b;
             a = c;
         }
-        lcm = size*inbits/a;
+        lcm = (outBytesNum * inBytesNum) / a;
 
-        byte[] out = new byte[size];
-        Arrays.fill(out, (byte)0);
+        byte[] outBytes = new byte[outBytesNum];
+        Arrays.fill(outBytes, (byte)0);
 
-        int thisbyte = 0;
-        int msbit, i, bval, oval;
+        int tmpByte = 0;
+        int msbit, i, tmp;
 
         for (i = lcm-1; i >= 0; i--) {
-            msbit = (
-                ((inbits<<3)-1)
-                + (((inbits<<3)+13)*(i/inbits))
-                + ((inbits-(i%inbits)) << 3)) % (inbits << 3);
+            // first, start with the msbit inBytes the first, unrotated byte
+            tmp = ((inBytesNum<<3)-1);
+            // then, for each byte, shift to the right for each repetition
+            tmp += (((inBytesNum<<3)+13)*(i/inBytesNum));
+            // last, pick outBytes the correct byte within that shifted repetition
+            tmp += ((inBytesNum-(i%inBytesNum)) << 3);
+
+            msbit = tmp % (inBytesNum << 3);
+
+            // pull outBytes the byte value itself
+            tmp =  ((((inBytes[((inBytesNum - 1)-(msbit >>> 3)) % inBytesNum] & 0xff) << 8) |
+                (inBytes[((inBytesNum) - (msbit >>> 3)) % inBytesNum] & 0xff))
+                >>>((msbit & 7)+1)) & 0xff;
 
-            bval =  ((((input[((inbits-1)-(msbit>>>3))%inbits]&0xff)<<8)|
-                (input[((inbits)-(msbit>>>3))%inbits]&0xff))
-                >>>((msbit&7)+1))&0xff;
+            tmpByte += tmp;
+            tmp = (outBytes[i % outBytesNum] & 0xff);
+            tmpByte += tmp;
 
-            thisbyte += bval;
-            oval = (out[i%size]&0xff);
-            thisbyte += oval;
-            out[i%size] = (byte) (thisbyte&0xff);
+            outBytes[i % outBytesNum] = (byte) (tmpByte & 0xff);
 
-            thisbyte >>>= 8;
+            tmpByte >>>= 8;
         }
 
-        if (thisbyte != 0) {
-            for (i = size-1; i >= 0; i--) {
-                thisbyte += (out[i]&0xff);
-                out[i] = (byte) (thisbyte&0xff);
+        // if there's a carry bit left over, add it back inBytes
+        if (tmpByte != 0) {
+            for (i = outBytesNum-1; i >= 0; i--) {
+                // do the addition
+                tmpByte += (outBytes[i] & 0xff);
+                outBytes[i] = (byte) (tmpByte & 0xff);
 
-                thisbyte >>>= 8;
+                tmpByte >>>= 8;
             }
         }
 
-        return out;
+        return outBytes;
     }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/8a72a1c5/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold2Bak.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold2Bak.java b/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold2Bak.java
new file mode 100644
index 0000000..985416d
--- /dev/null
+++ b/haox-kerb/kerb-crypto/src/main/java/org/apache/kerberos/kerb/crypto/Nfold2Bak.java
@@ -0,0 +1,57 @@
+package org.apache.kerberos.kerb.crypto;
+
+import java.util.Arrays;
+
+public class Nfold2Bak {
+
+    public static byte[] nfold(byte[] input, int size) {
+
+        int inbits = input.length;
+
+        int a, b, c, lcm;
+        a = size;
+        b = inbits;
+
+        while (b != 0) {
+            c = b;
+            b = a % b;
+            a = c;
+        }
+        lcm = size*inbits/a;
+
+        byte[] out = new byte[size];
+        Arrays.fill(out, (byte)0);
+
+        int thisbyte = 0;
+        int msbit, i, bval, oval;
+
+        for (i = lcm-1; i >= 0; i--) {
+            msbit = (
+                ((inbits<<3)-1)
+                + (((inbits<<3)+13)*(i/inbits))
+                + ((inbits-(i%inbits)) << 3)) % (inbits << 3);
+
+            bval =  ((((input[((inbits-1)-(msbit>>>3))%inbits]&0xff)<<8)|
+                (input[((inbits)-(msbit>>>3))%inbits]&0xff))
+                >>>((msbit&7)+1))&0xff;
+
+            thisbyte += bval;
+            oval = (out[i%size]&0xff);
+            thisbyte += oval;
+            out[i%size] = (byte) (thisbyte&0xff);
+
+            thisbyte >>>= 8;
+        }
+
+        if (thisbyte != 0) {
+            for (i = size-1; i >= 0; i--) {
+                thisbyte += (out[i]&0xff);
+                out[i] = (byte) (thisbyte&0xff);
+
+                thisbyte >>>= 8;
+            }
+        }
+
+        return out;
+    }
+}