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/04/23 08:57:55 UTC

directory-kerby git commit: DIRKRB-215 Implement the PRF function for DES_CBC. Thanks Yaning for the contribution

Repository: directory-kerby
Updated Branches:
  refs/heads/master 8d9a4f9c8 -> 521830f32


DIRKRB-215 Implement the PRF function for DES_CBC. Thanks Yaning for the contribution


Project: http://git-wip-us.apache.org/repos/asf/directory-kerby/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerby/commit/521830f3
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerby/tree/521830f3
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerby/diff/521830f3

Branch: refs/heads/master
Commit: 521830f32af56665cee43dd83d246776a011db7e
Parents: 8d9a4f9
Author: Drankye <dr...@gmail.com>
Authored: Thu Apr 23 22:55:33 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Thu Apr 23 22:55:33 2015 +0800

----------------------------------------------------------------------
 .../kerberos/kerb/crypto/EncTypeHandler.java    |  2 +-
 .../kerberos/kerb/crypto/enc/DesCbcEnc.java     | 11 ++-
 .../kerby/kerberos/kerb/crypto/PrfTest.java     | 91 ++++++++++++++++++++
 3 files changed, 100 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/521830f3/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncTypeHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncTypeHandler.java b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncTypeHandler.java
index 7a9a6a6..ba5d8d5 100644
--- a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncTypeHandler.java
+++ b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncTypeHandler.java
@@ -38,7 +38,7 @@ public interface EncTypeHandler extends CryptoTypeHandler {
 
     public int prfSize();
 
-    public byte[] prf(byte[] key, byte[] seed);
+    public byte[] prf(byte[] key, byte[] seed) throws KrbException;
 
     public int paddingSize();
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/521830f3/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/enc/DesCbcEnc.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/enc/DesCbcEnc.java b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/enc/DesCbcEnc.java
index 38c1eb1..21d15a8 100644
--- a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/enc/DesCbcEnc.java
+++ b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/enc/DesCbcEnc.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.crypto.enc;
 
 import org.apache.kerby.kerberos.kerb.KrbErrorCode;
+import org.apache.kerby.kerberos.kerb.crypto.cksum.provider.Md5Provider;
 import org.apache.kerby.kerberos.kerb.crypto.util.Confounder;
 import org.apache.kerby.kerberos.kerb.crypto.cksum.HashProvider;
 import org.apache.kerby.kerberos.kerb.crypto.enc.provider.DesProvider;
@@ -34,9 +35,13 @@ abstract class DesCbcEnc extends AbstractEncTypeHandler {
     }
 
     @Override
-    public byte[] prf(byte[] key, byte[] seed) {
-        // TODO: krb5int_des_prf
-        return null;
+    public byte[] prf(byte[] key, byte[] seed) throws KrbException {
+        byte[] output;
+        Md5Provider md5Provider = new Md5Provider();
+        md5Provider.hash(seed);
+        output = md5Provider.output();
+        encProvider().encrypt(key, output);
+        return output;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/521830f3/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
new file mode 100644
index 0000000..739cc87
--- /dev/null
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
@@ -0,0 +1,91 @@
+/**
+ *  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.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.crypto;
+
+import org.apache.kerby.kerberos.kerb.spec.base.EncryptionType;
+import org.apache.kerby.util.HexUtil;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.fail;
+
+public class PrfTest {
+    static class TestCase {
+        EncryptionType encType;
+        String keyData;
+        String seed;
+        String answer;
+        TestCase(EncryptionType encType, String keyData,
+                 String seed, String answer) {
+            this.encType = encType;
+            this.keyData = keyData;
+            this.seed = seed;
+            this.answer = answer;
+        }
+
+    }
+
+    @Test
+    public void testPrf_DES_CBC_CRC() throws Exception {
+        performTest(new TestCase(
+                EncryptionType.DES_CBC_CRC,
+                "key1",
+                "0161",
+                "e91cff96b939270009308b073b66313e"
+        ));
+    }
+
+    @Test
+    public void testPrf_DES_CBC_MD4() throws Exception {
+        performTest(new TestCase(
+                EncryptionType.DES_CBC_MD4,
+                "key1",
+                "0161",
+                "e91cff96b939270009308b073b66313e"
+        ));
+    }
+
+    @Test
+    public void testPrf_DES_CBC_MD5() throws Exception {
+        performTest(new TestCase(
+                EncryptionType.DES_CBC_MD5,
+                "key1",
+                "0161",
+                "e91cff96b939270009308b073b66313e"
+        ));
+    }
+
+    private static void performTest(TestCase testCase) throws Exception {
+        byte[] keyData = EncryptionHandler.getEncHandler(testCase.encType).str2key(testCase.keyData, testCase.keyData, null);
+        byte[] seed = HexUtil.hex2bytes(testCase.seed);
+        byte[] answer = HexUtil.hex2bytes(testCase.answer);
+        byte[] outkey = EncryptionHandler.getEncHandler(testCase.encType).prf(keyData, seed);
+
+        if (! Arrays.equals(answer, outkey)) {
+            System.err.println("failed with:");
+            System.err.println("outKey:" + HexUtil.bytesToHex(outkey));
+            System.err.println("answer:" + testCase.answer);
+            fail("KeyDerive test failed for " + testCase.encType.getName());
+        } else {
+            System.out.println("Prf test OK for " + testCase.encType.getName());
+        }
+    }
+}