Return-Path: X-Original-To: apmail-directory-commits-archive@www.apache.org Delivered-To: apmail-directory-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3036317782 for ; Thu, 22 Jan 2015 00:56:27 +0000 (UTC) Received: (qmail 22803 invoked by uid 500); 22 Jan 2015 00:56:27 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 22648 invoked by uid 500); 22 Jan 2015 00:56:27 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 22614 invoked by uid 99); 22 Jan 2015 00:56:27 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Jan 2015 00:56:27 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 0B15EE0D6E; Thu, 22 Jan 2015 00:56:25 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: drankye@apache.org To: commits@directory.apache.org Date: Thu, 22 Jan 2015 00:56:28 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [04/50] [abbrv] directory-kerberos git commit: Relayouted the project http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSequence.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSequence.java b/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSequence.java new file mode 100644 index 0000000..0901f54 --- /dev/null +++ b/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSequence.java @@ -0,0 +1,35 @@ +/** + * 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.haox.asn1.type; + +/** + * For tagging a sequence type with tagNo, either application specific or context specific class + */ +public class TaggingSequence extends TaggingCollection { + + public TaggingSequence(int taggingTagNo, Asn1FieldInfo[] tags, boolean isAppSpecific) { + super(taggingTagNo, tags, isAppSpecific); + } + + @Override + protected Asn1CollectionType createTaggedCollection(Asn1FieldInfo[] tags) { + return new Asn1SequenceType(tags); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSet.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSet.java b/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSet.java new file mode 100644 index 0000000..0dc5fe4 --- /dev/null +++ b/haox-asn1/src/main/java/org/apache/haox/asn1/type/TaggingSet.java @@ -0,0 +1,35 @@ +/** + * 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.haox.asn1.type; + +/** + * For tagging a sequence type with tagNo, either application specific or context specific class + */ +public class TaggingSet extends TaggingCollection { + + public TaggingSet(int taggingTagNo, Asn1FieldInfo[] tags, boolean isAppSpecific) { + super(taggingTagNo, tags, isAppSpecific); + } + + @Override + protected Asn1CollectionType createTaggedCollection(Asn1FieldInfo[] tags) { + return new Asn1SetType(tags); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/PersonnelRecord.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/PersonnelRecord.java b/haox-asn1/src/test/java/org/apache/haox/asn1/PersonnelRecord.java new file mode 100644 index 0000000..2677c96 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/PersonnelRecord.java @@ -0,0 +1,208 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.*; + +/** + * Ref. X.690-0207(http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf), + * Annex A, A.1 ASN.1 description of the record structure + */ +public class PersonnelRecord extends TaggingSet { + private static int NAME = 0; + private static int TITLE = 1; + private static int NUMBER = 2; + private static int DATEOFHIRE= 3; + private static int NAMEOFSPOUSE = 4; + private static int CHILDREN = 5; + + static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] { + new Asn1FieldInfo(NAME, -1, Name.class), + new Asn1FieldInfo(TITLE, 0, Asn1VisibleString.class), + new Asn1FieldInfo(NUMBER, -1, EmployeeNumber.class), + new Asn1FieldInfo(DATEOFHIRE, 1, Date.class), + new Asn1FieldInfo(NAMEOFSPOUSE, 2, Name.class), + new Asn1FieldInfo(CHILDREN, 3, Children.class, true) + }; + + public PersonnelRecord() { + super(0, fieldInfos, true); + setEncodingOption(EncodingOption.IMPLICIT); + } + + public void setName(Name name) { + setFieldAs(NAME, name); + } + + public Name getName() { + return getFieldAs(NAME, Name.class); + } + + public void setTitle(String title) { + setFieldAs(TITLE, new Asn1VisibleString(title)); + } + + public String getTitle() { + return getFieldAsString(TITLE); + } + + public void setEmployeeNumber(EmployeeNumber employeeNumber) { + setFieldAs(NUMBER, employeeNumber); + } + + public EmployeeNumber getEmployeeNumber() { + return getFieldAs(NUMBER, EmployeeNumber.class); + } + + public void setDateOfHire(Date dateOfHire) { + setFieldAs(DATEOFHIRE, dateOfHire); + } + + public Date getDateOfHire() { + return getFieldAs(DATEOFHIRE, Date.class); + } + + public void setNameOfSpouse(Name spouse) { + setFieldAs(NAMEOFSPOUSE, spouse); + } + + public Name getNameOfSpouse() { + return getFieldAs(NAMEOFSPOUSE, Name.class); + } + + public void setChildren(Children children) { + setFieldAs(CHILDREN, children); + } + + public Children getChildren() { + return getFieldAs(CHILDREN, Children.class); + } + + public static class Children extends Asn1SequenceOf { + public Children(ChildInformation ... children) { + super(); + for (ChildInformation child : children) { + addElement(child); + } + } + + public Children() { + super(); + } + } + + public static class ChildInformation extends Asn1SetType { + private static int NAME = 0; + private static int DATEOFBIRTH = 1; + + static Asn1FieldInfo[] tags = new Asn1FieldInfo[] { + new Asn1FieldInfo(NAME, -1, Name.class), + new Asn1FieldInfo(DATEOFBIRTH, 0, Date.class) + }; + + public ChildInformation() { + super(tags); + } + + public void setName(Name name) { + setFieldAs(NAME, name); + } + + public Name getName() { + return getFieldAs(NAME, Name.class); + } + + public void setDateOfBirth(Date date) { + setFieldAs(DATEOFBIRTH, date); + } + + public Date getDateOfBirth() { + return getFieldAs(DATEOFBIRTH, Date.class); + } + } + + public static class Name extends TaggingSequence { + private static int GIVENNAME = 0; + private static int INITIAL = 1; + private static int FAMILYNAME = 2; + + static Asn1FieldInfo[] tags = new Asn1FieldInfo[] { + new Asn1FieldInfo(GIVENNAME, -1, Asn1VisibleString.class), + new Asn1FieldInfo(INITIAL, -1, Asn1VisibleString.class), + new Asn1FieldInfo(FAMILYNAME, -1, Asn1VisibleString.class) + }; + + public Name() { + super(1, tags, true); + setEncodingOption(EncodingOption.IMPLICIT); + } + + public Name(String givenName, String initial, String familyName) { + this(); + setGivenName(givenName); + setInitial(initial); + setFamilyName(familyName); + } + + public void setGivenName(String givenName) { + setFieldAs(GIVENNAME, new Asn1VisibleString(givenName)); + } + + public String getGivenName() { + return getFieldAsString(GIVENNAME); + } + + public void setInitial(String initial) { + setFieldAs(INITIAL, new Asn1VisibleString(initial)); + } + + public String getInitial() { + return getFieldAsString(INITIAL); + } + + public void setFamilyName(String familyName) { + setFieldAs(FAMILYNAME, new Asn1VisibleString(familyName)); + } + + public String getFamilyName() { + return getFieldAsString(FAMILYNAME); + } + } + + public static class EmployeeNumber extends Asn1Tagging { + public EmployeeNumber(Integer value) { + super(2, new Asn1Integer(value), true); + setEncodingOption(EncodingOption.IMPLICIT); + } + public EmployeeNumber() { + this(null); + } + } + + public static class Date extends Asn1Tagging { + public Date(String value) { + super(3, new Asn1VisibleString(value), true); + setEncodingOption(EncodingOption.IMPLICIT); + } + public Date() { + this(null); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Boolean.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Boolean.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Boolean.java new file mode 100644 index 0000000..be931ac --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Boolean.java @@ -0,0 +1,56 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.Asn1Boolean; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +public class TestAsn1Boolean { + + @Test + public void testEncoding() { + testEncodingWith(true, "0x01 01 FF"); + testEncodingWith(false, "0x01 01 00"); + } + + private void testEncodingWith(Boolean value, String expectedEncoding) { + byte[] expected = Util.hex2bytes(expectedEncoding); + Asn1Boolean aValue = new Asn1Boolean(value); + aValue.setEncodingOption(EncodingOption.DER); + byte[] encodingBytes = aValue.encode(); + Assert.assertArrayEquals(expected, encodingBytes); + } + + @Test + public void testDecoding() throws IOException { + testDecodingWith(true, "0x01 01 FF"); + testDecodingWith(false, "0x01 01 00"); + } + + private void testDecodingWith(Boolean expectedValue, String content) throws IOException { + Asn1Boolean decoded = new Asn1Boolean(); + decoded.setEncodingOption(EncodingOption.DER); + decoded.decode(Util.hex2bytes(content)); + Assert.assertEquals(expectedValue, decoded.getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Collection.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Collection.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Collection.java new file mode 100644 index 0000000..feb6608 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Collection.java @@ -0,0 +1,55 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.*; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +public class TestAsn1Collection { + static String TEST_STR = "Jones"; + static Boolean TEST_BOOL = true; + static byte[] EXPECTED_BYTES = new byte[] {(byte) 0x30, (byte) 0x0A, + (byte) 0x16, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73, + (byte) 0x01, (byte) 0x01, (byte) 0xFF + }; + + @Test + public void testSequenceEncoding() { + Asn1Sequence seq = new Asn1Sequence(); + seq.addItem(new Asn1IA5String(TEST_STR)); + seq.addItem(new Asn1Boolean(TEST_BOOL)); + + Assert.assertArrayEquals(EXPECTED_BYTES, seq.encode()); + } + + @Test + public void testSequenceDecoding() throws IOException { + Asn1Sequence seq = new Asn1Sequence(); + seq.decode(EXPECTED_BYTES); + AbstractAsn1Type field = (AbstractAsn1Type) seq.getValue().get(0).getValue(); + Assert.assertEquals(TEST_STR, field.getValue()); + + field = (AbstractAsn1Type) seq.getValue().get(1).getValue(); + Assert.assertEquals(TEST_BOOL, field.getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Input.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Input.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Input.java new file mode 100644 index 0000000..b74fe7e --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Input.java @@ -0,0 +1,35 @@ +/** + * 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.haox.asn1; + +import org.junit.Test; + +import java.io.IOException; + +public class TestAsn1Input { + + @Test + public void testDecoding() throws IOException { + //PersonnelRecord expected = TestData.createSamplePersonnel(); + byte[] data = TestData.createSammplePersonnelEncodingData(); + //Asn1InputBuffer ib = new Asn1InputBuffer(data); + Asn1Dump.dump(data); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Integer.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Integer.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Integer.java new file mode 100644 index 0000000..30a0604 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1Integer.java @@ -0,0 +1,70 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.Asn1Integer; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +public class TestAsn1Integer { + + @Test + public void testEncoding() { + testEncodingWith(0, "0x02 01 00"); + testEncodingWith(1, "0x02 01 01"); + testEncodingWith(2, "0x02 01 02"); + testEncodingWith(127, "0x02 01 7F"); + testEncodingWith(128, "0x02 02 00 80"); + testEncodingWith(-1, "0x02 01 FF"); + testEncodingWith(-128, "0x02 01 80"); + testEncodingWith(-32768, "0x02 02 80 00"); + testEncodingWith(1234567890, "0x02 04 49 96 02 D2"); + } + + private void testEncodingWith(int value, String expectedEncoding) { + byte[] expected = Util.hex2bytes(expectedEncoding); + Asn1Integer aValue = new Asn1Integer(value); + aValue.setEncodingOption(EncodingOption.DER); + byte[] encodingBytes = aValue.encode(); + Assert.assertArrayEquals(expected, encodingBytes); + } + + @Test + public void testDecoding() throws IOException { + testDecodingWith(0, "0x02 01 00"); + testDecodingWith(1, "0x02 01 01"); + testDecodingWith(2, "0x02 01 02"); + testDecodingWith(127, "0x02 01 7F"); + testDecodingWith(128, "0x02 02 00 80"); + testDecodingWith(-1, "0x02 01 FF"); + testDecodingWith(-128, "0x02 01 80"); + testDecodingWith(-32768, "0x02 02 80 00"); + testDecodingWith(1234567890, "0x02 04 49 96 02 D2"); + } + + private void testDecodingWith(Integer expectedValue, String content) throws IOException { + Asn1Integer decoded = new Asn1Integer(); + decoded.setEncodingOption(EncodingOption.DER); + decoded.decode(Util.hex2bytes(content)); + Assert.assertEquals(expectedValue, decoded.getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1ObjectIdentifier.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1ObjectIdentifier.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1ObjectIdentifier.java new file mode 100644 index 0000000..a45482f --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1ObjectIdentifier.java @@ -0,0 +1,64 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.Asn1ObjectIdentifier; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +public class TestAsn1ObjectIdentifier { + + @Test + public void testEncoding() throws Exception { + /** + * Cryptography for Developers -> ASN.1 UTCTIME Type + * Applying this to the MD5 OID, we first transform the dotted decimal form into the + * array of words.Thus, 1.2.840.113549.2.5 becomes {42, 840, 113549, 2, 5}, and then further + * 404_CRYPTO_02.qxd 10/27/06 3:40 PM Page 36split into seven-bit digits with the proper most significant bits as + * {{0x2A}, {0x86, 0x48},{0x86, 0xF7, 0x0D}, {0x02}, {0x05}}.Therefore, the full encoding for MD5 is 0x06 08 2A + * 86 48 86 F7 0D 02 05. + */ + testEncodingWith("1.2.840.113549.2.5", + "0x06 08 2A 86 48 86 F7 0D 02 05"); + } + + private void testEncodingWith(String oid, String expectedEncoding) { + byte[] expected = Util.hex2bytes(expectedEncoding); + Asn1ObjectIdentifier aValue = new Asn1ObjectIdentifier(oid); + aValue.setEncodingOption(EncodingOption.DER); + byte[] encodingBytes = aValue.encode(); + Assert.assertArrayEquals(expected, encodingBytes); + } + + @Test + public void testDecoding() throws Exception { + testDecodingWith("1.2.840.113549.2.5", + "0x06 08 2A 86 48 86 F7 0D 02 05"); + } + + private void testDecodingWith(String expectedValue, String content) throws IOException { + Asn1ObjectIdentifier decoded = new Asn1ObjectIdentifier(); + decoded.setEncodingOption(EncodingOption.DER); + decoded.decode(Util.hex2bytes(content)); + Assert.assertEquals(expectedValue, decoded.getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1UtcTime.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1UtcTime.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1UtcTime.java new file mode 100644 index 0000000..1f86492 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestAsn1UtcTime.java @@ -0,0 +1,70 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.Asn1UtcTime; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.SimpleTimeZone; + +public class TestAsn1UtcTime { + + @Test + public void testEncoding() throws Exception { + /** + * Cryptography for Developers -> ASN.1 UTCTIME Type + * the encoding of July 4, 2003 at 11:33 and 28 seconds would be + “030704113328Z” and be encoded as 0x17 0D 30 33 30 37 30 34 31 31 33 33 32 38 5A. + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + sdf.setTimeZone(new SimpleTimeZone(0, "Z")); + String dateInString = "2003-07-04 11:33:28"; + Date date = sdf.parse(dateInString); + testEncodingWith(date, "0x17 0D 30 33 30 37 30 34 31 31 33 33 32 38 5A"); + } + + private void testEncodingWith(Date value, String expectedEncoding) { + byte[] expected = Util.hex2bytes(expectedEncoding); + Asn1UtcTime aValue = new Asn1UtcTime(value); + aValue.setEncodingOption(EncodingOption.DER); + byte[] encodingBytes = aValue.encode(); + Assert.assertArrayEquals(expected, encodingBytes); + } + + @Test + public void testDecoding() throws Exception { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateInString = "2003-07-04 11:33:28"; + sdf.setTimeZone(new SimpleTimeZone(0, "Z")); + Date date = sdf.parse(dateInString); + testDecodingWith(date, "0x17 0D 30 33 30 37 30 34 31 31 33 33 32 38 5A"); + } + + private void testDecodingWith(Date expectedValue, String content) throws IOException { + Asn1UtcTime decoded = new Asn1UtcTime(); + decoded.setEncodingOption(EncodingOption.DER); + decoded.decode(Util.hex2bytes(content)); + Assert.assertEquals(expectedValue, decoded.getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestData.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestData.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestData.java new file mode 100644 index 0000000..d0d8cd3 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestData.java @@ -0,0 +1,129 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.PersonnelRecord.*; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +public class TestData { + + public static PersonnelRecord createSamplePersonnel() { + PersonnelRecord pr = new PersonnelRecord(); + + pr.setName(new Name("John", "P", "Smith")); + + pr.setTitle("Director"); + + pr.setEmployeeNumber(new EmployeeNumber(51)); + + pr.setDateOfHire(new Date("19710917")); + + pr.setNameOfSpouse(new Name("Mary", "T", "Smith")); + + ChildInformation child1 = new ChildInformation(); + child1.setName(new Name("Ralph", "T", "Smith")); + child1.setDateOfBirth(new Date("19571111")); + + ChildInformation child2 = new ChildInformation(); + child2.setName(new Name("Susan", "B", "Jones")); + child2.setDateOfBirth(new Date("19590717")); + + pr.setChildren(new Children(child1, child2)); + + return pr; + } + + public static byte[] createSammplePersonnelEncodingData() { + class BufferOutput { + ByteBuffer buffer; + + void put(byte ... bytes) { + buffer.put(bytes); + } + + void put(String s) { + byte[] bytes = s.getBytes(StandardCharsets.US_ASCII); + buffer.put(bytes); + } + + public byte[] output() { + int len = (int) 0x85 + 3; + buffer = ByteBuffer.allocate(len); + + // personnel record + put((byte) 0x60, (byte) 0x81, (byte) 0x85); + + // -name + put((byte) 0x61, (byte) 0x10); + put((byte) 0x1A, (byte) 0x04); put("John"); + put((byte) 0x1A, (byte) 0x01); put("P"); + put((byte) 0x1A, (byte) 0x05); put("Smith"); + + //-title + put((byte) 0xA0, (byte) 0x0A); + put((byte) 0x1A, (byte) 0x08); put("Director"); + + //-employee number + put((byte) 0x42, (byte) 0x01, (byte) 0x33); + + //-date of hire + put((byte) 0xA1, (byte) 0x0A); + put((byte) 0x43, (byte) 0x08); put("19710917"); + + //-spouse + put((byte) 0xA2, (byte) 0x12); + put((byte) 0x61, (byte) 0x10); + put((byte) 0x1A, (byte) 0x04); put("Mary"); + put((byte) 0x1A, (byte) 0x01); put("T"); + put((byte) 0x1A, (byte) 0x05); put("Smith"); + + //-children + put((byte) 0xA3, (byte) 0x42); + //--child 1 + put((byte) 0x31, (byte) 0x1F); + //---name + put((byte) 0x61, (byte) 0x11); + put((byte) 0x1A, (byte) 0x05); put("Ralph"); + put((byte) 0x1A, (byte) 0x01); put("T"); + put((byte) 0x1A, (byte) 0x05); put("Smith"); + //-date of birth + put((byte) 0xA0, (byte) 0x0A); + put((byte) 0x43, (byte) 0x08); put("19571111"); + //--child 2 + put((byte) 0x31, (byte) 0x1F); + //---name + put((byte) 0x61, (byte) 0x11); + put((byte) 0x1A, (byte) 0x05); put("Susan"); + put((byte) 0x1A, (byte) 0x01); put("B"); + put((byte) 0x1A, (byte) 0x05); put("Jones"); + //-date of birth + put((byte) 0xA0, (byte) 0x0A); + put((byte) 0x43, (byte) 0x08); put("19590717"); + + return buffer.array(); + } + } + + BufferOutput buffer = new BufferOutput(); + return buffer.output(); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestPersonnelRecord.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestPersonnelRecord.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestPersonnelRecord.java new file mode 100644 index 0000000..1df46d9 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestPersonnelRecord.java @@ -0,0 +1,126 @@ +/** + * 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.haox.asn1; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +/** + * Ref. X.690-0207(http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf), + * Annex A, A.1 ASN.1 description of the record structure + */ +public class TestPersonnelRecord { + + static boolean verbose = false; + + @Test + public void testEncoding() { + PersonnelRecord pr = TestData.createSamplePersonnel(); + + if (verbose) { + System.out.println("Name:"); + System.out.println(Util.bytesToHex(pr.getName().encode())); + + /* + System.out.println("Title:"); + System.out.println(Util.bytesToHex(pr.getFieldAs(1, Asn1VisibleString.class).encode())); + + System.out.println("EmployeeNumber:"); + System.out.println(Util.bytesToHex(pr.getFieldAs(2, EmployeeNumber.class).encode())); + */ + + System.out.println("DateOfHire:"); + System.out.println(Util.bytesToHex(pr.getDateOfHire().encode())); + + System.out.println("SpouseName:"); + System.out.println(Util.bytesToHex(pr.getNameOfSpouse().encode())); + + System.out.println("Child1:"); + System.out.println(Util.bytesToHex(pr.getChildren().getElements().get(0).encode())); + + System.out.println("Child2:"); + System.out.println(Util.bytesToHex(pr.getChildren().getElements().get(1).encode())); + + System.out.println("Children:"); + System.out.println(Util.bytesToHex(pr.getChildren().encode())); + } + + byte[] data = TestData.createSammplePersonnelEncodingData(); + byte[] encoded = pr.encode(); + + if (verbose) { + System.out.println("ExpectedData:"); + System.out.println(Util.bytesToHex(data)); + + System.out.println("Encoded:"); + System.out.println(Util.bytesToHex(encoded)); + } + + Assert.assertArrayEquals(data, encoded); + } + + @Test + public void testDecoding() throws IOException { + PersonnelRecord expected = TestData.createSamplePersonnel(); + byte[] data = TestData.createSammplePersonnelEncodingData(); + PersonnelRecord decoded = new PersonnelRecord(); + decoded.decode(data); + + Assert.assertEquals(expected.getName().getGivenName(), + decoded.getName().getGivenName()); + Assert.assertEquals(expected.getName().getInitial(), + decoded.getName().getInitial()); + Assert.assertEquals(expected.getName().getFamilyName(), + decoded.getName().getFamilyName()); + + Assert.assertEquals(expected.getDateOfHire().getValue().getValue(), + decoded.getDateOfHire().getValue().getValue()); + Assert.assertEquals(expected.getTitle(), decoded.getTitle()); + Assert.assertEquals(expected.getEmployeeNumber().getValue().getValue(), + decoded.getEmployeeNumber().getValue().getValue()); + + Assert.assertEquals(expected.getNameOfSpouse().getGivenName(), + decoded.getNameOfSpouse().getGivenName()); + Assert.assertEquals(expected.getNameOfSpouse().getInitial(), + decoded.getNameOfSpouse().getInitial()); + Assert.assertEquals(expected.getNameOfSpouse().getFamilyName(), + decoded.getNameOfSpouse().getFamilyName()); + + Assert.assertEquals(expected.getChildren().getElements().get(0).getName().getGivenName(), + decoded.getChildren().getElements().get(0).getName().getGivenName()); + Assert.assertEquals(expected.getChildren().getElements().get(0).getName().getInitial(), + decoded.getChildren().getElements().get(0).getName().getInitial()); + Assert.assertEquals(expected.getChildren().getElements().get(0).getName().getFamilyName(), + decoded.getChildren().getElements().get(0).getName().getFamilyName()); + Assert.assertEquals(expected.getChildren().getElements().get(0).getDateOfBirth().getValue().getValue(), + decoded.getChildren().getElements().get(0).getDateOfBirth().getValue().getValue()); + + Assert.assertEquals(expected.getChildren().getElements().get(1).getName().getGivenName(), + decoded.getChildren().getElements().get(1).getName().getGivenName()); + Assert.assertEquals(expected.getChildren().getElements().get(1).getName().getInitial(), + decoded.getChildren().getElements().get(1).getName().getInitial()); + Assert.assertEquals(expected.getChildren().getElements().get(1).getName().getFamilyName(), + decoded.getChildren().getElements().get(1).getName().getFamilyName()); + Assert.assertEquals(expected.getChildren().getElements().get(1).getDateOfBirth().getValue().getValue(), + decoded.getChildren().getElements().get(1).getDateOfBirth().getValue().getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/TestTaggingEncoding.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/TestTaggingEncoding.java b/haox-asn1/src/test/java/org/apache/haox/asn1/TestTaggingEncoding.java new file mode 100644 index 0000000..a2bff5f --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/TestTaggingEncoding.java @@ -0,0 +1,203 @@ +/** + * 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.haox.asn1; + +import org.apache.haox.asn1.type.Asn1Tagging; +import org.apache.haox.asn1.type.Asn1VisibleString; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; + +/** + Ref. X.690-0207 8.14 Encoding of a tagged value + EXAMPLE + With ASN.1 type definitions (in an explicit tagging environment) of: + Type1 ::= VisibleString + Type2 ::= [APPLICATION 3] IMPLICIT Type1 + Type3 ::= [2] Type2 + Type4 ::= [APPLICATION 7] IMPLICIT Type3 + Type5 ::= [2] IMPLICIT Type2 + a value of: + "Jones" + is encoded as follows: + For Type1: + VisibleString Length Contents + 1A16 0516 4A6F6E657316 + For Type2: + [Application 3] Length Contents + 4316 0516 4A6F6E657316 + For Type3: + [2] Length Contents + A216 0716 + [APPLICATION 3] Length Contents + 4316 0516 4A6F6E657316 + For Type4: + [Application 7] Length Contents + 6716 0716 + [APPLICATION 3] Length Contents + 4316 0516 4A6F6E657316 + For Type5: + [2] Length Contents + 8216 0516 4A6F6E657316 + */ + +public class TestTaggingEncoding { + static final String TEST_STRING = "Jones"; + static byte[] TYPE1_EXPECTED_BYTES = new byte[] {(byte) 0x1A, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73}; + static byte[] TYPE2_EXPECTED_BYTES = new byte[] {(byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73}; + static byte[] TYPE3_EXPECTED_BYTES = new byte[] {(byte) 0xA2, (byte) 0x07, (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73}; + static byte[] TYPE4_EXPECTED_BYTES = new byte[] {(byte) 0x67, (byte) 0x07, (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73}; + static byte[] TYPE5_EXPECTED_BYTES = new byte[] {(byte) 0x82, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73}; + + + public static class Type1 extends Asn1VisibleString { + public Type1(String value) { + super(value); + } + public Type1() { + this(null); + } + } + + public static class Type2 extends Asn1Tagging { + public Type2(Type1 value) { + super(3, value, true); + setEncodingOption(EncodingOption.IMPLICIT); + } + public Type2() { + this(null); + } + } + + public static class Type3 extends Asn1Tagging { + public Type3(Type2 value) { + super(2, value, false); + setEncodingOption(EncodingOption.EXPLICIT); + } + public Type3() { + this(null); + } + } + + public static class Type4 extends Asn1Tagging { + public Type4(Type3 value) { + super(7, value, true); + setEncodingOption(EncodingOption.IMPLICIT); + } + public Type4() { + this(null); + } + } + + public static class Type5 extends Asn1Tagging { + public Type5(Type2 value) { + super(2, value, false); + setEncodingOption(EncodingOption.IMPLICIT); + } + public Type5() { + this(null); + } + } + + @Test + public void testAsn1TaggingEncoding() { + Type1 aType1 = new Type1(TEST_STRING); + Type2 aType2 = new Type2(aType1); + Type3 aType3 = new Type3(aType2); + Type4 aType4 = new Type4(aType3); + Type5 aType5 = new Type5(aType2); + + Assert.assertArrayEquals(TYPE1_EXPECTED_BYTES, aType1.encode()); + Assert.assertArrayEquals(TYPE2_EXPECTED_BYTES, aType2.encode()); + Assert.assertArrayEquals(TYPE3_EXPECTED_BYTES, aType3.encode()); + Assert.assertArrayEquals(TYPE4_EXPECTED_BYTES, aType4.encode()); + Assert.assertArrayEquals(TYPE5_EXPECTED_BYTES, aType5.encode()); + } + + @Test + public void testAsn1TaggingDecoding() throws IOException { + Type1 aType1 = new Type1(); + aType1.decode(TYPE1_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType1.getValue()); + + Type2 aType2 = new Type2(); + aType2.decode(TYPE2_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType2.getValue().getValue()); + + Type3 aType3 = new Type3(); + aType3.decode(TYPE3_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType3.getValue().getValue().getValue()); + + Type4 aType4 = new Type4(); + aType4.decode(TYPE4_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType4.getValue().getValue().getValue().getValue()); + + Type5 aType5 = new Type5(); + aType5.decode(TYPE5_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType5.getValue().getValue().getValue()); + } + + @Test + public void testTaggingEncodingOption() { + Type1 aType1 = new Type1(TEST_STRING); + Type2 aType2 = new Type2(aType1); + Type3 aType3 = new Type3(aType2); + Type4 aType4 = new Type4(aType3); + Type5 aType5 = new Type5(aType2); + + Assert.assertArrayEquals(TYPE1_EXPECTED_BYTES, aType1.encode()); + Assert.assertArrayEquals(TYPE2_EXPECTED_BYTES, + aType1.taggedEncode(TaggingOption.newImplicitAppSpecific(3))); // for Type2 + Assert.assertArrayEquals(TYPE3_EXPECTED_BYTES, + aType2.taggedEncode(TaggingOption.newExplicitContextSpecific(2))); // for Type3 + Assert.assertArrayEquals(TYPE4_EXPECTED_BYTES, + aType3.taggedEncode(TaggingOption.newImplicitAppSpecific(7))); // for Type4 + Assert.assertArrayEquals(TYPE5_EXPECTED_BYTES, + aType2.taggedEncode(TaggingOption.newImplicitContextSpecific(2))); // for Type5 + } + + @Test + public void testTaggingDecodingOption() throws IOException { + Type1 aType1 = new Type1(); + aType1.decode(TYPE1_EXPECTED_BYTES); + Assert.assertEquals(TEST_STRING, aType1.getValue()); + + // for Type2 + aType1 = new Type1(); + aType1.taggedDecode(TYPE2_EXPECTED_BYTES, TaggingOption.newImplicitAppSpecific(3)); + Assert.assertEquals(TEST_STRING, aType1.getValue()); + + // for Type3 + Type2 aType2 = new Type2(); + aType2.taggedDecode(TYPE3_EXPECTED_BYTES, TaggingOption.newExplicitContextSpecific(2)); + Assert.assertEquals(TEST_STRING, aType2.getValue().getValue()); + + // for Type4 + Type3 aType3 = new Type3(); + aType3.taggedDecode(TYPE4_EXPECTED_BYTES, TaggingOption.newImplicitAppSpecific(7)); + Assert.assertEquals(TEST_STRING, aType3.getValue().getValue().getValue()); + + // for Type5 + aType2 = new Type2(); + aType2.taggedDecode(TYPE5_EXPECTED_BYTES, TaggingOption.newImplicitContextSpecific(2)); + Assert.assertEquals(TEST_STRING, aType2.getValue().getValue()); + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-asn1/src/test/java/org/apache/haox/asn1/Util.java ---------------------------------------------------------------------- diff --git a/haox-asn1/src/test/java/org/apache/haox/asn1/Util.java b/haox-asn1/src/test/java/org/apache/haox/asn1/Util.java new file mode 100644 index 0000000..695bdd0 --- /dev/null +++ b/haox-asn1/src/test/java/org/apache/haox/asn1/Util.java @@ -0,0 +1,72 @@ +/** + * 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.haox.asn1; + +public class Util { + + final static String HEX_CHARS_STR = "0123456789ABCDEF"; + final static char[] HEX_CHARS = HEX_CHARS_STR.toCharArray(); + + /** + * Convert bytes into format as: + * 0x02 02 00 80 + */ + public static String bytesToHex(byte[] bytes) { + int len = bytes.length * 2; + len += bytes.length; // for ' ' appended for each char + len += 2; // for '0x' prefix + char[] hexChars = new char[len]; + hexChars[0] = '0'; + hexChars[1] = 'x'; + for ( int j = 0; j < bytes.length; j++ ) { + int v = bytes[j] & 0xFF; + hexChars[j * 3 + 2] = HEX_CHARS[v >>> 4]; + hexChars[j * 3 + 3] = HEX_CHARS[v & 0x0F]; + hexChars[j * 3 + 4] = ' '; + } + + return new String(hexChars); + } + + /** + * Convert hex string like follows into byte array + * 0x02 02 00 80 + */ + public static byte[] hex2bytes(String hexString) { + hexString = hexString.toUpperCase(); + String hexStr = hexString; + if (hexString.startsWith("0X")) { + hexStr = hexString.substring(2); + } + String[] hexParts = hexStr.split(" "); + + byte[] bytes = new byte[hexParts.length]; + char[] hexPart; + for (int i = 0; i < hexParts.length; ++i) { + hexPart = hexParts[i].toCharArray(); + if (hexPart.length != 2) { + throw new IllegalArgumentException("Invalid hex string to convert"); + } + bytes[i] = (byte) ((HEX_CHARS_STR.indexOf(hexPart[0]) << 4) + HEX_CHARS_STR.indexOf(hexPart[1])); + } + + return bytes; + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/README ---------------------------------------------------------------------- diff --git a/haox-kdc/README b/haox-kdc/README deleted file mode 100644 index 583763c..0000000 --- a/haox-kdc/README +++ /dev/null @@ -1,5 +0,0 @@ -A KDC implementation that integrates PKI and OAuth Token with an LDAP backend. -The KDC server can be standalone. -The LDAP backend can be standalone or embedded. -Various tools like kinit, kadmin will be provided or -at least, existing tools can be supported. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/kdc-server/pom.xml ---------------------------------------------------------------------- diff --git a/haox-kdc/kdc-server/pom.xml b/haox-kdc/kdc-server/pom.xml deleted file mode 100644 index 8b4bf68..0000000 --- a/haox-kdc/kdc-server/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - 4.0.0 - - - org.haox - haox-kdc - 1.0-SNAPSHOT - - - kdc-server - - Haox KDC Server - Haox-kdc Server - - - - org.haox - haox-config - ${project.version} - - - org.haox - kerb-server - ${project.version} - - - org.haox - ldap-identity-backend - ${project.version} - - - org.haox - haox-token - ${project.version} - - - junit - junit - test - - - http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java ---------------------------------------------------------------------- diff --git a/haox-kdc/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java b/haox-kdc/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java deleted file mode 100644 index 380586b..0000000 --- a/haox-kdc/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * 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.kerberos.kdc.server; - -import org.apache.kerberos.kdc.identitybackend.LdapIdentityBackend; -import org.apache.kerberos.kerb.identity.IdentityService; -import org.apache.kerberos.kerb.server.KdcServer; - -public class ApacheKdcServer extends KdcServer { - - public ApacheKdcServer() { - super(); - } - - public void init() { - super.init(); - initIdentityService(); - } - - protected void initIdentityService() { - IdentityService identityService = new LdapIdentityBackend(); - setIdentityService(identityService); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java ---------------------------------------------------------------------- diff --git a/haox-kdc/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java b/haox-kdc/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java deleted file mode 100644 index b84a43a..0000000 --- a/haox-kdc/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * 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.kerberos.kdc.server; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SocketChannel; - -public class KdcTest { - - private String serverHost = "localhost"; - private short serverPort = 8088; - - private ApacheKdcServer kdcServer; - - @Before - public void setUp() throws Exception { - kdcServer = new ApacheKdcServer(); - kdcServer.setKdcHost(serverHost); - kdcServer.setKdcTcpPort(serverPort); - kdcServer.init(); - kdcServer.start(); - } - - @Test - public void testKdc() throws IOException, InterruptedException { - Thread.sleep(10); - - SocketChannel socketChannel = SocketChannel.open(); - socketChannel.configureBlocking(true); - SocketAddress sa = new InetSocketAddress(serverHost, serverPort); - socketChannel.connect(sa); - - String BAD_KRB_MESSAGE = "Hello World!"; - ByteBuffer writeBuffer = ByteBuffer.allocate(4 + BAD_KRB_MESSAGE.getBytes().length); - writeBuffer.putInt(BAD_KRB_MESSAGE.getBytes().length); - writeBuffer.put(BAD_KRB_MESSAGE.getBytes()); - writeBuffer.flip(); - - socketChannel.write(writeBuffer); - } - - @After - public void tearDown() throws Exception { - kdcServer.stop(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/ldap-identity-backend/pom.xml ---------------------------------------------------------------------- diff --git a/haox-kdc/ldap-identity-backend/pom.xml b/haox-kdc/ldap-identity-backend/pom.xml deleted file mode 100644 index 55cfef1..0000000 --- a/haox-kdc/ldap-identity-backend/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - 4.0.0 - - - org.haox - haox-kdc - 1.0-SNAPSHOT - - - ldap-identity-backend - - Ldap identity backend - Ldap identity backend - - - - org.haox - haox-config - ${project.version} - - - org.haox - kerb-identity - ${project.version} - - - http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java ---------------------------------------------------------------------- diff --git a/haox-kdc/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java b/haox-kdc/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java deleted file mode 100644 index 1248f6a..0000000 --- a/haox-kdc/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * 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.kerberos.kdc.identitybackend; - -import org.apache.kerberos.kerb.identity.KrbIdentity; -import org.apache.kerberos.kerb.identity.backend.AbstractIdentityBackend; - -import java.util.List; - -public class LdapIdentityBackend extends AbstractIdentityBackend { - - - public LdapIdentityBackend() { - super(); - } - - /** - * Load identities from file - */ - public void load() { - // todo - } - - /** - * Persist the updated identities back - */ - public void save() { - // todo - } - - @Override - public List getIdentities() { - return null; - } - - @Override - public boolean checkIdentity(String name) { - return false; - } - - @Override - public KrbIdentity getIdentity(String name) { - return null; - } - - @Override - public void addIdentity(KrbIdentity identity) { - - } - - @Override - public void updateIdentity(KrbIdentity identity) { - - } - - @Override - public void deleteIdentity(KrbIdentity identity) { - - } -} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/pom.xml ---------------------------------------------------------------------- diff --git a/haox-kdc/pom.xml b/haox-kdc/pom.xml deleted file mode 100644 index a21a1c0..0000000 --- a/haox-kdc/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 4.0.0 - - - org.haox - haox-all - 1.0-SNAPSHOT - - - haox-kdc - Haox-kdc Project - 1.0-SNAPSHOT - pom - - - ldap-identity-backend - kdc-server - tools - - http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/tools/pom.xml ---------------------------------------------------------------------- diff --git a/haox-kdc/tools/pom.xml b/haox-kdc/tools/pom.xml deleted file mode 100644 index b13c9fc..0000000 --- a/haox-kdc/tools/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - 4.0.0 - - - org.haox - haox-kdc - 1.0-SNAPSHOT - - - tools - - Tools - Haox KDC Tools - - - - org.haox - haox-config - ${project.version} - - - org.haox - kerb-client - ${project.version} - - - org.haox - haox-token - ${project.version} - - - http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/haox-kdc/tools/src/main/java/org/apache/kerberos/tool/Kinit.java ---------------------------------------------------------------------- diff --git a/haox-kdc/tools/src/main/java/org/apache/kerberos/tool/Kinit.java b/haox-kdc/tools/src/main/java/org/apache/kerberos/tool/Kinit.java deleted file mode 100644 index 891b84a..0000000 --- a/haox-kdc/tools/src/main/java/org/apache/kerberos/tool/Kinit.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 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.kerberos.tool; - -import org.apache.kerberos.kerb.client.KrbClient; - -/** - * kinit like tool - */ -public class Kinit { - - public static void main(String[] args) throws Exception { - if (args.length < 2 || args.length > 3) { - System.err.println( - "Usage: " + Kinit.class.getSimpleName() + - " "); - return; - } - - final String host = args[0]; - final Integer port = Integer.parseInt(args[1]); - KrbClient krbClnt = new KrbClient(host, port.shortValue()); - } - -} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-backend/README ---------------------------------------------------------------------- diff --git a/kdc-backend/README b/kdc-backend/README new file mode 100644 index 0000000..583763c --- /dev/null +++ b/kdc-backend/README @@ -0,0 +1,5 @@ +A KDC implementation that integrates PKI and OAuth Token with an LDAP backend. +The KDC server can be standalone. +The LDAP backend can be standalone or embedded. +Various tools like kinit, kadmin will be provided or +at least, existing tools can be supported. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-backend/ldap-identity-backend/pom.xml ---------------------------------------------------------------------- diff --git a/kdc-backend/ldap-identity-backend/pom.xml b/kdc-backend/ldap-identity-backend/pom.xml new file mode 100644 index 0000000..4fc2593 --- /dev/null +++ b/kdc-backend/ldap-identity-backend/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + + org.haox + kdc-backend + 1.0-SNAPSHOT + + + ldap-identity-backend + + Ldap identity backend + Ldap identity backend + + + + org.haox + haox-config + ${project.version} + + + org.haox + kerb-identity + ${project.version} + + + http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-backend/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java ---------------------------------------------------------------------- diff --git a/kdc-backend/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java b/kdc-backend/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java new file mode 100644 index 0000000..1248f6a --- /dev/null +++ b/kdc-backend/ldap-identity-backend/src/main/java/org/apache/kerberos/kdc/identitybackend/LdapIdentityBackend.java @@ -0,0 +1,77 @@ +/** + * 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.kerberos.kdc.identitybackend; + +import org.apache.kerberos.kerb.identity.KrbIdentity; +import org.apache.kerberos.kerb.identity.backend.AbstractIdentityBackend; + +import java.util.List; + +public class LdapIdentityBackend extends AbstractIdentityBackend { + + + public LdapIdentityBackend() { + super(); + } + + /** + * Load identities from file + */ + public void load() { + // todo + } + + /** + * Persist the updated identities back + */ + public void save() { + // todo + } + + @Override + public List getIdentities() { + return null; + } + + @Override + public boolean checkIdentity(String name) { + return false; + } + + @Override + public KrbIdentity getIdentity(String name) { + return null; + } + + @Override + public void addIdentity(KrbIdentity identity) { + + } + + @Override + public void updateIdentity(KrbIdentity identity) { + + } + + @Override + public void deleteIdentity(KrbIdentity identity) { + + } +} http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-backend/pom.xml ---------------------------------------------------------------------- diff --git a/kdc-backend/pom.xml b/kdc-backend/pom.xml new file mode 100644 index 0000000..f09a399 --- /dev/null +++ b/kdc-backend/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + + org.haox + haox-all + 1.0-SNAPSHOT + + + kdc-backend + Kdc Backend Project + 1.0-SNAPSHOT + pom + + + ldap-identity-backend + + http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-server/pom.xml ---------------------------------------------------------------------- diff --git a/kdc-server/pom.xml b/kdc-server/pom.xml new file mode 100644 index 0000000..a8fedcb --- /dev/null +++ b/kdc-server/pom.xml @@ -0,0 +1,55 @@ + + + + 4.0.0 + + + org.haox + haox-all + 1.0-SNAPSHOT + + + kdc-server + Haox KDC Server + Haox-kdc Server + + + + org.haox + haox-config + ${project.version} + + + org.haox + kerb-server + ${project.version} + + + org.haox + ldap-identity-backend + ${project.version} + + + org.haox + haox-token + ${project.version} + + + junit + junit + test + + + http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java ---------------------------------------------------------------------- diff --git a/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java b/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java new file mode 100644 index 0000000..380586b --- /dev/null +++ b/kdc-server/src/main/java/org/apache/kerberos/kdc/server/ApacheKdcServer.java @@ -0,0 +1,41 @@ +/** + * 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.kerberos.kdc.server; + +import org.apache.kerberos.kdc.identitybackend.LdapIdentityBackend; +import org.apache.kerberos.kerb.identity.IdentityService; +import org.apache.kerberos.kerb.server.KdcServer; + +public class ApacheKdcServer extends KdcServer { + + public ApacheKdcServer() { + super(); + } + + public void init() { + super.init(); + initIdentityService(); + } + + protected void initIdentityService() { + IdentityService identityService = new LdapIdentityBackend(); + setIdentityService(identityService); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/430a1954/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java ---------------------------------------------------------------------- diff --git a/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java b/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java new file mode 100644 index 0000000..b84a43a --- /dev/null +++ b/kdc-server/src/test/java/org/apache/kerberos/kdc/server/KdcTest.java @@ -0,0 +1,70 @@ +/** + * 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.kerberos.kdc.server; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; + +public class KdcTest { + + private String serverHost = "localhost"; + private short serverPort = 8088; + + private ApacheKdcServer kdcServer; + + @Before + public void setUp() throws Exception { + kdcServer = new ApacheKdcServer(); + kdcServer.setKdcHost(serverHost); + kdcServer.setKdcTcpPort(serverPort); + kdcServer.init(); + kdcServer.start(); + } + + @Test + public void testKdc() throws IOException, InterruptedException { + Thread.sleep(10); + + SocketChannel socketChannel = SocketChannel.open(); + socketChannel.configureBlocking(true); + SocketAddress sa = new InetSocketAddress(serverHost, serverPort); + socketChannel.connect(sa); + + String BAD_KRB_MESSAGE = "Hello World!"; + ByteBuffer writeBuffer = ByteBuffer.allocate(4 + BAD_KRB_MESSAGE.getBytes().length); + writeBuffer.putInt(BAD_KRB_MESSAGE.getBytes().length); + writeBuffer.put(BAD_KRB_MESSAGE.getBytes()); + writeBuffer.flip(); + + socketChannel.write(writeBuffer); + } + + @After + public void tearDown() throws Exception { + kdcServer.stop(); + } +} \ No newline at end of file