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;
+ }
+}