From eb93599f0b975356271e4c40c143efac258d6be9 Mon Sep 17 00:00:00 2001 From: David Blacka Date: Sat, 13 Aug 2005 23:18:03 +0000 Subject: [PATCH] initial import git-svn-id: https://svn.verisignlabs.com/jdnssec/tools/trunk@13 4cbd57fe-54e5-0310-bd9a-f30fe5ea5e6e --- .cvsignore | 2 + README | 51 + VERSION | 3 + bin/_makeDsSet.sh | 27 + bin/_makeKeySet.sh | 27 + bin/jdnssec-keygen | 14 + bin/jdnssec-signzone | 14 + bin/jdnssec-verifyzone | 14 + build.properties | 3 + build.xml | 176 ++++ .../dnssec/cl/KeyGen$CLIState.class | Bin 0 -> 2458 bytes .../com/verisignlabs/dnssec/cl/KeyGen.class | Bin 0 -> 6496 bytes .../verisignlabs/dnssec/cl/SignZone$1.class | Bin 0 -> 254 bytes .../dnssec/cl/SignZone$CLIState.class | Bin 0 -> 3577 bytes .../dnssec/cl/SignZone$KeysetFileFilter.class | Bin 0 -> 752 bytes .../com/verisignlabs/dnssec/cl/SignZone.class | Bin 0 -> 12503 bytes .../dnssec/cl/VerifyZone$CLIState.class | Bin 0 -> 2183 bytes .../verisignlabs/dnssec/cl/VerifyZone.class | Bin 0 -> 6880 bytes .../dnssec/security/BINDKeyUtils.class | Bin 0 -> 5922 bytes .../dnssec/security/ByteArrayComparator.class | Bin 0 -> 1215 bytes .../dnssec/security/DnsKeyConverter.class | Bin 0 -> 8432 bytes .../dnssec/security/DnsKeyPair.class | Bin 0 -> 5017 bytes .../DnsSecVerifier$TrustedKeyStore.class | Bin 0 -> 2034 bytes .../dnssec/security/DnsSecVerifier.class | Bin 0 -> 5407 bytes .../dnssec/security/JCEDnsSecSigner.class | Bin 0 -> 6174 bytes .../dnssec/security/RecordComparator.class | Bin 0 -> 1048 bytes .../dnssec/security/SignUtils$NodeInfo.class | Bin 0 -> 1372 bytes .../dnssec/security/SignUtils.class | Bin 0 -> 10793 bytes .../dnssec/security/ZoneUtils.class | Bin 0 -> 2609 bytes build/lib/java-dnssec-tools.jar | Bin 0 -> 47015 bytes docs/.cvsignore | 1 + lib/commons-cli-1.0.jar | Bin 0 -> 30117 bytes lib/commons-logging.jar | Bin 0 -> 26388 bytes lib/dnsjava-1.5.2.jar | Bin 0 -> 228170 bytes lib/jce1_2_2.jar | Bin 0 -> 74869 bytes licenses/commons-cli-LICENSE.txt | 60 ++ licenses/commons-logging-LICENSE.txt | 60 ++ licenses/dnsjava-LICENSE.txt | 36 + licenses/java-dnssec-tools-LICENSE.txt | 508 ++++++++++ licenses/jce-LICENSE.txt | 169 ++++ src/com/verisignlabs/dnssec/cl/KeyGen.java | 352 +++++++ src/com/verisignlabs/dnssec/cl/SignZone.java | 719 ++++++++++++++ .../verisignlabs/dnssec/cl/VerifyZone.java | 331 +++++++ src/com/verisignlabs/dnssec/cl/package.html | 33 + .../dnssec/security/BINDKeyUtils.java | 398 ++++++++ .../dnssec/security/ByteArrayComparator.java | 66 ++ .../dnssec/security/DnsKeyConverter.java | 471 +++++++++ .../dnssec/security/DnsKeyPair.java | 356 +++++++ .../dnssec/security/DnsSecVerifier.java | 321 ++++++ .../dnssec/security/JCEDnsSecSigner.java | 373 +++++++ .../dnssec/security/RecordComparator.java | 91 ++ .../dnssec/security/SignUtils.java | 927 ++++++++++++++++++ .../verisignlabs/dnssec/security/TypeMap.java | 182 ++++ .../dnssec/security/ZoneUtils.java | 138 +++ .../verisignlabs/dnssec/security/package.html | 35 + svn-commit.tmp | 4 + 56 files changed, 5962 insertions(+) create mode 100644 .cvsignore create mode 100644 README create mode 100644 VERSION create mode 100755 bin/_makeDsSet.sh create mode 100755 bin/_makeKeySet.sh create mode 100755 bin/jdnssec-keygen create mode 100755 bin/jdnssec-signzone create mode 100755 bin/jdnssec-verifyzone create mode 100644 build.properties create mode 100644 build.xml create mode 100644 build/classes/com/verisignlabs/dnssec/cl/KeyGen$CLIState.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/KeyGen.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/SignZone$1.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/SignZone$CLIState.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/SignZone$KeysetFileFilter.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/SignZone.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/VerifyZone$CLIState.class create mode 100644 build/classes/com/verisignlabs/dnssec/cl/VerifyZone.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/BINDKeyUtils.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/ByteArrayComparator.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/DnsKeyConverter.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/DnsKeyPair.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier$TrustedKeyStore.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/JCEDnsSecSigner.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/RecordComparator.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/SignUtils$NodeInfo.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/SignUtils.class create mode 100644 build/classes/com/verisignlabs/dnssec/security/ZoneUtils.class create mode 100644 build/lib/java-dnssec-tools.jar create mode 100644 docs/.cvsignore create mode 100644 lib/commons-cli-1.0.jar create mode 100644 lib/commons-logging.jar create mode 100644 lib/dnsjava-1.5.2.jar create mode 100644 lib/jce1_2_2.jar create mode 100644 licenses/commons-cli-LICENSE.txt create mode 100644 licenses/commons-logging-LICENSE.txt create mode 100644 licenses/dnsjava-LICENSE.txt create mode 100644 licenses/java-dnssec-tools-LICENSE.txt create mode 100644 licenses/jce-LICENSE.txt create mode 100644 src/com/verisignlabs/dnssec/cl/KeyGen.java create mode 100644 src/com/verisignlabs/dnssec/cl/SignZone.java create mode 100644 src/com/verisignlabs/dnssec/cl/VerifyZone.java create mode 100644 src/com/verisignlabs/dnssec/cl/package.html create mode 100644 src/com/verisignlabs/dnssec/security/BINDKeyUtils.java create mode 100644 src/com/verisignlabs/dnssec/security/ByteArrayComparator.java create mode 100644 src/com/verisignlabs/dnssec/security/DnsKeyConverter.java create mode 100644 src/com/verisignlabs/dnssec/security/DnsKeyPair.java create mode 100644 src/com/verisignlabs/dnssec/security/DnsSecVerifier.java create mode 100644 src/com/verisignlabs/dnssec/security/JCEDnsSecSigner.java create mode 100644 src/com/verisignlabs/dnssec/security/RecordComparator.java create mode 100644 src/com/verisignlabs/dnssec/security/SignUtils.java create mode 100644 src/com/verisignlabs/dnssec/security/TypeMap.java create mode 100644 src/com/verisignlabs/dnssec/security/ZoneUtils.java create mode 100644 src/com/verisignlabs/dnssec/security/package.html create mode 100644 svn-commit.tmp diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..4b0b18a --- /dev/null +++ b/.cvsignore @@ -0,0 +1,2 @@ +build +*.tar.gz diff --git a/README b/README new file mode 100644 index 0000000..3a0e770 --- /dev/null +++ b/README @@ -0,0 +1,51 @@ +java-dnssec-tools + +http://www.dnssec.verisignlabs.com/ + +Author: David Blacka (davidb@verisignlabs.com) + +This is a collection of DNSSEC tools written in Java. They are +intended to be an addition or replacement for the DNSSEC tools that +are part of BIND 9. + +These tools depend upon DNSjava (http://www.xbill.org/dnsjava), the +Jakarta Commons CLI and Logging libraries (http://jakarta.apache.org), +and Sun's Java Cryptography extensions. A copy of each of these +libraries is included in the distribution. + +See the "licenses" directory for the licensing information of this +package and the other packages that are distributed with it. + +Getting started: + +1. unpack the binary distribution: + +% tar zxvf java-dnssec-tools-x.x.x.tar.gz + +2. run the various tools from their unpacked location: + +% cd java-dnssec-tools-x.x.x +% ./bin/signZone.sh -h + +Building from source: + +1. unpack the source distribution, preferably into the same directory +that the binary distribution was unpacked. + +% tar zxvf java-dnssec-tools-x.x.x-src.tar.gz + +2. edit the build.properties file to suit your environment, +particularly the use of the jikes compiler. + +2. run Ant (see http://jakara.apache.org for information about the Ant +build tool). + +% ant + +--- + +Questions or comments may be directed to the author +(mailto:davidb@verisignlabs.com) or sent to the +dnssec@verisignlabs.com mailing list +(http://lists.verisignlabs.com/mailman/listinfo/dnssec). + diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..176df46 --- /dev/null +++ b/VERSION @@ -0,0 +1,3 @@ +version=0.3.0 +tagversion=0_3_0 + diff --git a/bin/_makeDsSet.sh b/bin/_makeDsSet.sh new file mode 100755 index 0000000..d0e3bc5 --- /dev/null +++ b/bin/_makeDsSet.sh @@ -0,0 +1,27 @@ +#! /bin/sh + +thisdir=`dirname $0` +basedir=`cd $thisdir/..; pwd` + +ulimit -n `ulimit -H -n` + +if [ x$JAVA_HOME = x ]; then + JAVA_HOME=/usr/local/jdk1.3 + export JAVA_HOME +fi + +LD_LIBRARY_PATH=${basedir}/obj:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH + +# set the classpath +CLASSPATH=\ +$JAVA_HOME/jre/lib/rt.jar:\ +$basedir/obj/classes:\ +$basedir/lib/dnsjava.jar:\ +$basedir/lib/protomatter-1.1.5.jar:\ +$basedir/lib/jdom-B6.jar:\ +$basedir/lib/jce1_2_1.jar + +export CLASSPATH + +exec $JAVA_HOME/bin/java -Xmx64m com.nsi.dnssec.cl.MakeDSSet "$@" diff --git a/bin/_makeKeySet.sh b/bin/_makeKeySet.sh new file mode 100755 index 0000000..7a69b50 --- /dev/null +++ b/bin/_makeKeySet.sh @@ -0,0 +1,27 @@ +#! /bin/sh + +thisdir=`dirname $0` +basedir=`cd $thisdir/..; pwd` + +ulimit -n `ulimit -H -n` + +if [ x$JAVA_HOME = x ]; then + JAVA_HOME=/usr/local/jdk1.3 + export JAVA_HOME +fi + +LD_LIBRARY_PATH=${basedir}/obj:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH + +# set the classpath +CLASSPATH=\ +$JAVA_HOME/jre/lib/rt.jar:\ +$basedir/obj/classes:\ +$basedir/lib/dnsjava.jar:\ +$basedir/lib/protomatter-1.1.5.jar:\ +$basedir/lib/jdom-B6.jar:\ +$basedir/lib/jce1_2_1.jar + +export CLASSPATH + +exec $JAVA_HOME/bin/java -Xmx64m com.nsi.dnssec.cl.MakeKeySet "$@" diff --git a/bin/jdnssec-keygen b/bin/jdnssec-keygen new file mode 100755 index 0000000..6edaaf0 --- /dev/null +++ b/bin/jdnssec-keygen @@ -0,0 +1,14 @@ +#! /bin/sh + +thisdir=`dirname $0` +basedir=`cd $thisdir/..; pwd` + +ulimit -n `ulimit -H -n` + +# set the classpath +for i in $basedir/lib/*.jar $basedir/lib/*.zip; do + CLASSPATH="$CLASSPATH":"$i" +done +export CLASSPATH + +exec java com.verisignlabs.dnssec.cl.KeyGen "$@" diff --git a/bin/jdnssec-signzone b/bin/jdnssec-signzone new file mode 100755 index 0000000..726e7d6 --- /dev/null +++ b/bin/jdnssec-signzone @@ -0,0 +1,14 @@ +#! /bin/sh + +thisdir=`dirname $0` +basedir=`cd $thisdir/..; pwd` + +ulimit -n `ulimit -H -n` + +# set the classpath +for i in $basedir/lib/*.jar $basedir/lib/*.zip; do + CLASSPATH="$CLASSPATH":"$i" +done +export CLASSPATH + +exec java com.verisignlabs.dnssec.cl.SignZone "$@" diff --git a/bin/jdnssec-verifyzone b/bin/jdnssec-verifyzone new file mode 100755 index 0000000..c63165b --- /dev/null +++ b/bin/jdnssec-verifyzone @@ -0,0 +1,14 @@ +#! /bin/sh + +thisdir=`dirname $0` +basedir=`cd $thisdir/..; pwd` + +ulimit -n `ulimit -H -n` + +# set the classpath +for i in $basedir/lib/*.jar $basedir/lib/*.zip; do + CLASSPATH="$CLASSPATH":"$i" +done +export CLASSPATH + +exec java com.verisignlabs.dnssec.cl.VerifyZone "$@" diff --git a/build.properties b/build.properties new file mode 100644 index 0000000..f034b8c --- /dev/null +++ b/build.properties @@ -0,0 +1,3 @@ +build.compiler=jikes +#build.compiler=modern +build.deprecation=true diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..e6beaab --- /dev/null +++ b/build.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/classes/com/verisignlabs/dnssec/cl/KeyGen$CLIState.class b/build/classes/com/verisignlabs/dnssec/cl/KeyGen$CLIState.class new file mode 100644 index 0000000000000000000000000000000000000000..b96173c19dfc29d26027d832037a70f6d01dc5a7 GIT binary patch literal 2458 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 literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/cl/SignZone$1.class b/build/classes/com/verisignlabs/dnssec/cl/SignZone$1.class new file mode 100644 index 0000000000000000000000000000000000000000..767f80c108fdfce4fbbd5e21d9b9a4dcc230e306 GIT binary patch literal 254 zcmXv|!D_-l5Pch?(KOclf}o&+UA-4Cf*_Rk5b@w`vl+t5x`C|vUp*Ci@B{i$#WAIa zdGGON=FR;4e%}B{JVyuw#=1JmE7iuE(pi;zSvc=WOKoMw)}eAVT1E&3(xbX6X_YJG zM}8!I7U;YhXU;2u)?~UD2-j6X0)sc>=>2lasotsFQi3)*Fh+PN-8$c7WGTHq$88SP&&dkO{ z+xSzov^}<<#fsG8A4RQL{MjU$%0(~Qp5C^nSH0=!U3*S1deKWypKoS2S(@bN>7Fy+ z_kOeQ_rA~jKY#rE)9V0|xE@BGz~)RLpB$IA;TR*9sSi8JtmQZ|lgyaO0lpe4SaL&8 zUwXjRT^U9|py`x8t|v|18cFsKpOP6@KpT^jy@pM?U{4CH?DJTRLUO-h%5H&G{NIso z4NGLq8B>2c0;?bL**%E^u5DN&yb|G+3Pa>^V#twMpm{0QpyTQ`Q8f8~mR!S3_7W|n zgyck#xCEkwl3OgfzLco4H#bT1s9p>aza!0@vi2ZxQg_Lb{Y5uz39Klny{BL~(jKRr zRk@OBs+%6GRJI#d#w=y!VLh*`sRhwzI4(gn6?NN@J%xN;x3YbPMKN9RzJfiH)Qfs% zR3;gMJT=heMv{6B(%nlqrR_NFxOXBWeU>n86WF+nm?KK%JZ~7c3#{{k;>rm(`M>{u zjZvtEEZskUO(4)y$SSK9>cge{u(Xfr!zS}!qre@@sV+Figr~vQ@D0QngI1~!Jr%B zJ#9l#+=Y%Xwk>aYjVKMjOQmnxhH~q1(NhzyPv4-1f>$S-7JiZ zuuR(>BVRNnPwiQm(@UmHGJ^XU*qrX_riL^Q2sE<|F8*&a50RQT_cSU0csc4L6~=0RrFBu*Rp3YH0DP;~Lib)PrF>#4@ht zziK)vZy#2UTml$_G=vix!U!qZk7yW1hDI7rO?zXaGhc?FYsg`Qi7#!N@_cdZi$~by zT=qJt=erxw2UgT6#=^r;(+BsJaye;7U!)4&MvoIo5*b!Fe7H zXYd1on=&QamX>?e$jd{9X&SVh5jqg1=f5B1Fa)~(^^^+wk5#Q7P=)v`p4YI-mwh&Z z7m0UM=eC`l9UUDSnxHA2Kh^Lvyv+7^V+B(BT9)7v9bDDmOBy0*P}g74@G5?>;E1gP zv5F(AqqEj%Z<;8hf3D$XtWy$R)9@zVVgv|audSw8OME%KZ$xlKpskWddBbs7!7(*j zV`?hKIGb4NF^*mD>}Y88t$aI-U)@-9-i+1|_04!s!>@6T4O6#meKJ!hvd9y)3F&_& zbf;@#T78vPuI|J80=wgVU!vvBe~DDnq3S5AADFbSs>7N*;ECv}H-V$JF^5M2|+QA3uokay@fpCF)czlcMJ< zJ45Q7=@W0K@4TJa>FvxUZ)fIsJ3EuN6QZ}XKY2U5lee=sc{>BmJwQ#ZxP^LeeFZH9_3Yp* zez*odk~8=TUlOyd@~%!$$LR|DxhrV$&do1)*Uu%$nj>o&=M_0NjSFR5B$ck-zj@x| zR4CCJn#H9uUT+Od<8mt08oC~Q1FL9$^Dir=lBK@0jCZ(S4`e^XyJcK$4F!ndYQ6Vr z79V`T5b~3P>tC>q>j9?FK_=KC4#R%j&SyRD#}*8*xg7JJQ9Otu=a++r+0-Aw6m&d? z44)C4<#QgRxWwlz&XV^rhL2!kmP6^ce14Bd@n_!r8(jR8vm}hiL?frdI!uX;cv2+U z{14(8(a(l`0%wGQ=fx8^E6(5r@iJZ#mvKQ{!$mQNSH&N2N&E?~iNE4a@poJn|6mXM zH{KTiVN3cP@6|!8X4x6xw3J*XmnjfC%jkoR&cjb}Hw;lhhN zsSEcdL>W_RIjNS5YPqVGchquPE$7s7K2gv7RvA34sAFn*KrMsn-`5v>p7Kh68(T&f zTjq8Sl^y&X*~x-Vv533r`(1=`H~qgGo!CQ;d-!Ir`cfkxen4|o7H#CN05&9MFvI7Q d1rFsba@_{dnR zk~m4@F1vb}Q5$d7g;nmAP8Ew&xj>aLb0W`WoJuo@-}g^c;sol1X6e;g{3n}Gmr0^d z9bq=?jK|wik5Jvqjuc_Kqm9}>8}?OxAp5Bb5MYv_+7^`vUKsU!OyiEg3?UdV6QGH^ z1Tj!OY7EKiD! z^F)(3Z?RJh&hx)9M&)~{|4Pa-ygGul1TyLcnMnnKd6EYPN?7sp0X}hNZ3RK{}=C1qa*+T literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/cl/SignZone.class b/build/classes/com/verisignlabs/dnssec/cl/SignZone.class new file mode 100644 index 0000000000000000000000000000000000000000..dbc8a70cc704e7b1f76f1179b85a64bae31d0175 GIT binary patch literal 12503 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 literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/cl/VerifyZone$CLIState.class b/build/classes/com/verisignlabs/dnssec/cl/VerifyZone$CLIState.class new file mode 100644 index 0000000000000000000000000000000000000000..ab0eba451b146ce7ffd83d1dd793fdf5060a22c7 GIT binary patch literal 2183 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 A@&Et; literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/BINDKeyUtils.class b/build/classes/com/verisignlabs/dnssec/security/BINDKeyUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..bfa50a2ced7333476ecf98d908174cfeb483b7fc GIT binary patch literal 5922 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 a^*WE#i_=;lMR1y?_fzfw;q%M|kof}v(hJxC literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/DnsKeyConverter.class b/build/classes/com/verisignlabs/dnssec/security/DnsKeyConverter.class new file mode 100644 index 0000000000000000000000000000000000000000..aced62922a31aeede07bbc789d0f081dd7d80506 GIT binary patch literal 8432 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 literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier$TrustedKeyStore.class b/build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier$TrustedKeyStore.class new file mode 100644 index 0000000000000000000000000000000000000000..8f481aa2faf372b457f2bda91de49456c9c608b7 GIT binary patch literal 2034 zcmb7ETT|O+5Ivv478n<3xTJ2#r3p=a!3Y|l!Oo?GOK@!*iU|bTrj>1BD`O-^l4R!bRmFK-*BDnST@(z>pi zvsHzjmVkUoObP7*JuScjy|0vAMXoA(S$y1{JdquHDugTO6Nq1gej~1gfglFa zFVJBddE3YSA!DZg))o?+uUA@#HO=+OA@&RGGd`QYlB~2TsJEAdAj)$6N8- z9!j?Y)e2Ru=-~)tF6q+>*2-$eVfBQazoqG%nfdeK)6q+f5_?&*Ra4=P@kZrD`EquB)#p^y#iYZnkfbVb`C9kg(K+9I`w-p3a$S+2G=dxwK&hp_4$Kj&(yC|1s;!7gNDtmB1)z9BGiu|3kXXI;g+5ORj=`ye_n?sOp= zI+!H-t}9U)2$ete7J d(^c~09^og@&no-ess#z+V}$~I{zMQTln;Oy{-Xc@ literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier.class b/build/classes/com/verisignlabs/dnssec/security/DnsSecVerifier.class new file mode 100644 index 0000000000000000000000000000000000000000..3a82b84e9c39b690b830dbcd96588a38d2d36f40 GIT binary patch literal 5407 zcmbtY3w&E;75{&2UQI){70L*s5FTS`+AbT90WC1Mb&qbN8|y&2DR7(IrgtQ{U2@Z{ zATI?KCa8dq6=4H}DHa{V(v2bvQ9wjQ5D^g(6~#A*ilQ?A=ia1gLpPZA_q+Gze&2bY z|2gNoef;hF9sn>)`4pltGZpREGe*`(q?1~AHX2W7vwAGbE0-~>foNMg+o{LSCP|N> zXS`4flh-3oAMWw>QW+oBc*li?}(YB7xXoee%>weF-IfET_hRNx?Lr_cZn#uSCQ|7QfeID{Uzr_*|7 zK~iJB=-{N1!FHhi2x6+jtnhmZH)Fd}Gcxo=Osp5?!xd(i``w|X^w##}cK$~ZvNG45 zG-8xc;0_7*k+$mbkg&P;!K_e|)va-PbcNf+q-yvjipMfFq$uS+fGTIFfvDt8S<+qM zHNqXh0m9u(?j9o@Um%$mG%2hpchKHzEz7p!b$i2pMUu{lvU%wN2PRBWbGbH0aKqX% zeXCZ{mDT`e<2Z!_$H&k%(2EoNI1$GaRGAC~9~^FQ!kV*;WVGGVGa74+5>CR&?~q_i z_oBs*R-8iQruB`M!a+q5W6GKWPQ&R6wRXP8$@b!X)tHC53WtujZ)|0Fv4Aj5=+?Ys z!ele)P0`?RLwf)VvB-}$EOxdRnWoj3G1685?aszhg~s<%BL&!cv0TA(s*yGR-scoUdoYCg?oBE&EU zF5|Oi8yvuSIA2hqDFnywuUa)K%Zr#FaiQ_(>vLL?@T&_uK^+Sn30V)=ZfnO&5=~wh zeyl@p05zB-m6=oskNOu%lOz;3^=v3@TA`F?#d<@whxU#SX@b^B_n3Q8%!2R3dWFM9 z@!s3K7ujl9$T)#nJ+tDwZ&SrOHSBWi66lgV!)LgrX+WoWB?y? zRzF_wfs8jCEX z+k-nE3a8Btq0>S>++3DfM}R$DI`CF6F%NlyzgxEYf@ znb-?mpbz*kLZcHpB{{8#pkxO)VZV)TSW5%Hfd>>K@7mwR^0PS5vR>@=;~_lAb048^ z&v+h16{Z#IWb`O98c-(sVSGzk`L_v`T%UAM!Zf^gzEr@YcuZmH_*2X%s~3;^@m+k! znN6e1Qa-lz-@}s_MmX|;9E8$;$1CF14}@U)oy3=MG7T`+)^^(=lQI-Vok zMma-0nvvAwAB|`WS=f)x8;WgPc|E`g#dJm#+A-!m;DSv)ImklAi+hXTccF zzhsjuE*I6m!uh=q$Kp9%+|-Na`|umu8`ryYi2#0!^^r=m|*s2+q6|(P)oBdyy#oC*BgKe-Q*E<>!SxzDv!~p=+>buNlI(iIK za>{8(1!+KQSHoY58ZsbQSCT^P?&7~Hd4ZKo0^Z^!YQ z3p@=}VUWolWU_C@Vc1HSZ$UG!S-6$oCbwZJ?!Z~xI}dl#WR9bP$xG;jhZ2sFWHr^- zx$;=!m|ffW2x=mYvNntl$XZEjt)1ZQgxcNwh`oo<%u_1Ip(9nDNl=K?mnp;B#1K>r z5pLbgs-DLMw36CVwdOA52uRu5$gPXEP@k+{Y_E^t(yn2AxPv<%ZE^8_Rg0V3ksEQc zJZ{D`p$O98YvldPgK({(597KPSFoV9k23{NFknxzTNc855|bu4+s5<^Sba_PkTe%tEGp~j}2 z_-2boe0fA*81&@v1nHk@@d>AAEBryJxTuj(cM%`}lNPKF4CYbz1CAOiq zu=4A|ioN~nF8sa%l|w|!25jWX{->D3{vuC#--KV;@A7oe>;&;O2Jv;G`E@p~H(2g( zqJiE01iVG+JvfaGw@p=GnR4Mwacjar_?ADkfa(BNVd1umwkGfyW5|J>pVx||X#KPz^U&(ejO&TcUS)v5t? zsu3a8grigx)75OuR>z}Norop8mZ_6)4zIQ96n>+%@*6BlcjvMMIWO50|3!k;)y2$Zdw)#`LlpNZaipq7uYyFRA&tR0vTULnPdx$T0rS>mQLw9{=8{Ds~_h u89}fsGOXM?P*>`VPGd+hfoYDFJ{*DdwBS(6@KaKdzo(%>No%N3-v0u%5Qg>u literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/JCEDnsSecSigner.class b/build/classes/com/verisignlabs/dnssec/security/JCEDnsSecSigner.class new file mode 100644 index 0000000000000000000000000000000000000000..5becfa9ea9bd7f1c38661e5fac831e3fc653ec50 GIT binary patch literal 6174 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 literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/RecordComparator.class b/build/classes/com/verisignlabs/dnssec/security/RecordComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..7073f340bed505afb8e05d731727e3b91aa5fbfc GIT binary patch literal 1048 zcmZuwO>YuW6g>|HhK^XUc3KhahuRh>Fg8XKZPPYl+YkwATQw$b2AGg(fFaD#v~En? zm>BzwRrmy!s!r3`w>q|K z*INy<;u^J<>snQV((TyZp|NdMoldRbG}~s!^qh_gMIgFo?wdx#Y}Jitl|8HKsR#;; z_tCCrH;kdbK$tZcZ0#PlEmt6rEEZEm0j1#7EP+VLZdv7Svto62%}RradhRc&t?rb-tbCBCd7im@;zaYJC_PkWAl{vX1rqK2E8P!Sgx`!`n@w=gv*DF-Cr zPs)fW5-Mf|VizN}w|9zLgO!AFM+T0Ps|+kST%%RfFoWA+s0e8gm=g%D*e%;z?dN?J z#sZQW{77+RJ5IM#wKi=zbN%v~b8>)~Wez_jz)!}HF`1Uu2(5kihyb~G;s^nMFCGo@ z^z{<`Q|ZM615+Nf5?|#@rN;p@*T!Td0h9+C+| zJ^!%RJ?1kXVF1nF#{d8T literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/SignUtils$NodeInfo.class b/build/classes/com/verisignlabs/dnssec/security/SignUtils$NodeInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..227f49db5587cfc49c88ce8e905b8949f29abaaa GIT binary patch literal 1372 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 AX#fBK literal 0 HcmV?d00001 diff --git a/build/classes/com/verisignlabs/dnssec/security/ZoneUtils.class b/build/classes/com/verisignlabs/dnssec/security/ZoneUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..4483412a942d6081a9340f1449d925cae3753590 GIT binary patch literal 2609 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 literal 0 HcmV?d00001 diff --git a/docs/.cvsignore b/docs/.cvsignore new file mode 100644 index 0000000..863d673 --- /dev/null +++ b/docs/.cvsignore @@ -0,0 +1 @@ +javadoc diff --git a/lib/commons-cli-1.0.jar b/lib/commons-cli-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..22a004e14e16720cae9af97d4d1475b12d2388aa GIT binary patch literal 30117 zcma&Nb8u(d5;h#$wr$(CZQHgdwrz7_ClgQ1i6^$5U;NI!=T?39yY-$^@Ae-gpee!Vc+nd@Gev|9kIc{WsKYimz6P}6KYN8+h@r@>Q1iAA=C zoQj_A=-u?{IFD*0Tv5{VES0n1SkWa~ih8IS>e<+)kM_8a`(f{OcR`{5CMsTy7|2K& zTpMu5!1u|94{+4&xIaY%1m-kDD#=1ZG2U%yRsB)K6&MKUU#k9vi1hy;0`^D3(Z%xL zVEo@DVE-dw>||_eW&RI>sQ-UKQ%8GyM+et`7=ZbIA7E-{{a@eae_xpW?*|FnxtJT9 zd8?Y+nVY(qn~8gwnmf5!J326!+8MjLrYXtG4hbRo>zWof>d>D|he8e@x}A2aAkC}J ziIhHHT1aUo|89~N4@{>V2o?N6NUl)ql|-=lEsN7}y9fJe|Nau6mP=IdXes79zOf`x z57Y7zY4Goo17Us|ZK|BfmZ#C9q5UW!r$ZK$6Y|l8%i`SRe$B;@tbn~18j6XW@=xMW z9}Ajb;XOZwUwWt5(w7qpYcgkpKPLxMCh}Ejq*hY(1+BAJM%Rjj)Kt`~dfY#oql9w1 zzOA^KW;4G{`px9bFo4v;{0zJza_T5Gt@RV{=fNu+GF-(Q$gp&V>%?K+-o?w$?Gx!? zIwRV{YQMlgAJsB#d9EAe=`R$=J!vz@v7cSW{MXb#W)Dq-{4*_T|1&lIvV#9bn)dIJ zRx);RHUA%c9hM17>A`*qDTF?gaK=;URAkiLG2B<~E#d{s&(s0N<%qt?d_rivQ z5qC^n~Th;2TbKzCe zB;v;*{a-2{iaBNwz!qd8gv8IEDGiBoI?6O(C)kd7``c%6{UMn(z!5&v#xMl2x9Ogc zZ!_2=Z_EYjp%q1sNUz4nPg#diOQ5J%YR$)Ly9aPedKJ-^U%=_tg(@D`?L6BA{umb| zR0US*@XH^({QeP9s=r56^pCX|JDAB?JDC49UE?%$-SpJ4KRqm1EL|*)Wl(*9edT$w zT0>l#~xt4vPzm#f5~3i;KlKTC98ccXjw) z3uhS!{ge&;Rr`BqXR>4|utm5;SbT zDUB0ATUt|wi~6MEsep>kOj6Tdrp;^(GG@}9E~Zno5*rsV0EC;=W~y?ta1~`$X;;i zA?#$;{OR2dCUQGqos31Ex{yNKk>Xkr-&qDa)5z!PGa6$}DR`OcVq?!Sv?Ui`+g4j@ zp6XhWsBEP6OQO2ZAb6|8QF@EoO!ci-r9SaDw^t^eRgj9uG;!L9WLg*&d2j9ci)|9axthylG+<4;T|<#*UY0-Zi5H}7Q6XT)zMj>HfV+f2=@MQN2Y-bc z?upkH{qA#F0teS5{8ZB1a>i8_q^5eoB9=E^lMb8s)xm#}?38pU+{VFC=!7Sag!RhV zlHnTLQX*I6#dyTs*6)D_neNpxp+0NN%hachv1lT4ARf^`R|lCgrDzxidOQS*`>Z9- zWU{K8dTZG5bzM5+5px>bk`@zz10e)oth4qzWKM?NhFw*r$D}!@=qkPL6-f2Od6GTt z8AQ$QG}Gn5R5~~a-0{WByrW&qyu%4*0Km6O8Xuig0ptN?Py$5GzzqyJ<>aF<`8n>g zDA)V^hpC3L?+}>e493BA7NNuD=7;EXQgTM~gX&S29dW@nTemiubk9{!*`L!-c?=kQ zl$uoA4R>V}(DM7r{Id)2W@lXY(Q7Iz-sy)pkG1)>s`2KAPK3litG$M3tE&-Ct~!$A z&fEy&rfOW`%4F;JJIkYU9zqj}*A;pL3hpP>H7x`fzf){+jkTHrO66>90e;T-495iS zk0!AZ2J=0kw}2!FI-H9tpV{xV#b@e|1%pn0a+nVnxtf**ovwLL;_o~S&%TFAPKvYK zFHPG>qcPuVF%0wOe@xGm*N^Cf6IqYJ|>V>hlM7CipU$K~p8S>Tj(D+Y4I$8tKk-1%`087K%7BOgmK4{g<}v=!gW7kyd&esoSijBU}t+#t$0!`G7BK z=vT5{mQj>9(&AQvrYaBnq+0i)hWn9W<5U@~;~cY_^w&Fc0ysf7^Ml%KB2rQ{aLP4^ zXwS#{Hp1v|dxKvg%}MYS8Hy69J@>`P6=zH}<+Ugx+>JcKjvF21y|@K!SODC;JAJ`^?S!^2N6fW*&#&||VXA!x? zns9|i+D@LQGwAWL_RAnm#v{lPciHA>AGYZ;L^zM5UTab*!u=;!m2)fB!YvP%nxW&D z81Lt|UjWavgk>E2%XiPr(`vs5@h3_{NtuRV4RBq>S3!07T6UrjBs|v_0#PL#1>B!i z3uvvb;*2K64bky%PGs@e$K^@Pk%1OKsl)`xC9>BzOa%FR@u5{GLa? zV!aV}c`|owze0R-j9O?>D}qp;4YVZ0C8_U&ddGcQ2?C8t2HRouCae%6Ky5K~nMlxh z=%Q3HyVZ$4!RiE}Jo2{7%<%fCDgm$9Z&yrLS87l6D5|Nop}E1% zvHNeJnYUndSSr{H{?OyZSBpKy=38xDWXRpdG2PB3tGeiE0VTr}*Qm9IBPKtLWye}%mN_qc}i@4c|%f5nS&TF`!Ihv;8{&6erXQ1fC$khGO{9-zWD z#9~4sLR}nWKdDPKB7RG=bgaSqD$VK45@^)?(y42KF&LrQvM>ctATVitw6SlklXSH0 z)v42LoqO)f%Ck#fqj|sUGu?Xm+Vb7b;A{KpgWMT}yLjI95p;kO+8G71*nN}p0C$3O zxZ8yU1~@enw%>H*jMoKhj_zNg4?9ENZ;khOzBqdVJsV|Wz5ww!v$DnloE(ANkM<(o zF9q^1jhiyYKja9E?ub$%GT$S|6SCfi6AE5$zZ1T_dxh0~P9;ccPny~Rj%!~q`FwN7 zQG5K7$5jRRruF&{MjHIQMk5UGUpeLS&F}D1wpm{AQ?^;X^T%Q349xCOQUsY^NK*uv zUz!mEZ+9C&(rmj*e$W4!kFP%oFOvlmOMT)|9hcLPwOFx<%Dv(d`U0z7aq|?sueMv4dLpFVku6RB;D2A^Ei~s@_$Unk zwYNR}bg);##KK%*ZERsqWmk~~4%FGsWnJ*e6(~K(PfrxFVd3mhR(yV#ry<>$all;| z%f49akWMfkFZG1&mXm8eTG3mUYVjytTyJ9_9fFG%J`<w;JitabgB020OMC_D~hf47&f;$IlJc)#m z_FEpA9M9{cUFx3ex9n4_-ut-HBz-ET-^6&wK%xk_xVhRJf=LT3g9a{Y;VxE{Ys{`E zZ#Lc&rq~y*Pv$UirZW?-GZY}D#Wjh6!E*D(G^B9}M;W{=!Q|Cc(qk8>v0$!2ZIb5F z=gE7eWue;K*=?oXZX*)BFjX^Gu?$l#Oqc?$Nz9>5Dtu_>33{mj5L7E&jXfHFDOuY! zwRJgQi^Lb+qAw$eyWYj&`K6QDayhrt#ZkS2AH$(ehPmhGi;H0OhB0GheJp80g9S~Q8fY!9#u3@Rd15s71odt-<05-M zF^tsvDJAHm(0o+C?dzsZl$pNXLSSBS-9K11W&T)FCY=`(xz3PI!d*(y?q-^nKxbna zFk?tkN*W%gF&Hh3?%zj82Q6f&cMZ?V`VuyTS9PCrqoOi~SJ1qrF)+R3N#m|#5SAG6 zu~WMJlY=|s&jretYrHy>$6>b4!B-?34*h%+bIS-lOHB`1a6&FGh2wYW zZES=We31K!_UzwvM|iz5EH$gW5U*LZxW<Z%pyJK5 zgIboH&z9oa-G!5JbKh5t3YT%Oaw_{CX#TZ=vij@8`?H_f=-bqj=^G^+Y^9V{-&*{N zLmFY*^SeY|8upv0`zQ{gng=ZUtfNb)N)g=kNnJrMCHGS=B?^ivG_6kUqIka<=x!N_ zQ?xUivgdUvEmhGg4KLYExH$*V{`_26v;+~$$mTW8Rbc9_Tt~EFFKHL$Fc-&$dE}w; zSRLAZpgAk8*hf(_MoHiE%4P&D++l5r$EZ^*B&xt%ysLEp@l`oDlr!QOI6N*ex2YcZ_^eQDq7mK(as&giohV_^v525^S5(Y8 zOuH5iG`WaI(U%aD9%D&WT?4|^55Vi$zDHqkpU=DkV6%J2Lcqa33hBc_7L8T zEZDGw2qYkyLF8Q<>;d8uNaVye!!SZdX>#F|`KPi$kPOS*d>Q0KJCmO*jiWN09P>;= z1H(0Dd+gREb}T&EJJCvZru8VMIrOHU^O!TiZ8uN|@U%mf@Ylll<~zninOO0$Mk-t^ zvE#ex#!H+A;DM{tba6vgP>RLY`<0HY%<(60X8UqY-UJ9`xaKJOc=7N0@e;rLt=-m5KdM=|$9b;l5?J+}*3Vo&*jnOz`re(aN!W~s=9b3wo zR}`{dMQJYv;nh_KEyKt+k)$!ni?)*IY5I}yj_$F=eM?E$@$qx+rw3C0Riv&zlRC}u zv>A*s{qPA(YXY!TW!&jW^zqHzoNLVW-THaK*vm@yhFQi6`^;cxTf=Cvll*7o#U9Y8 zt6I|BHe@i6IRk4*$y+r=4~u*Pv(m|y(XDHmTk{URq~gjV+@ekSEO|qa>00@AsQlvZ ztH5Lx%~|tgx~8gXTNDoUj_tU6)K*SQ&tqA-G_=-S@<~Y|GDuwVO_h!}BHgqGBN}f6 z2gq*IkF!{^(X@dzG z<+;hz|8i$N?JA3{hpn@X-MT?YRHTPLbCCSW=+OgeEBo!42gcBZ@F_(Dt!hx$9EV@2 zi)7Q&x@o3%5jrWG)M^BFi%s*rZkGm(gk3T_M>2~pZn>R;+R~omkU39FBspbEu*8}@ zCpXj!D{T*XDN1slia=D1FL-T_dJ0w1G|3C%_nvkw@+>h${usrr2y!hoZK+K0_HY?W z)Z`64E0;5hKE2=Cg}IqS(#hg}BHg{=hLzo3|LFYc&N}`~$qPRMwe& zDTmS&5+f;_0|u+TZ;5KzcMe_-aY$Vx-DV7o*02!f)AfJfwm|_ zr*HrgW@LgB_2nfJq!TZ&S4HuTz=-+-(3&mfnSmaIuPE5!t-Va(xBS@q+N>Qz@;Wpf zlV2xhw6T{rQTmm8=)L8-goCxo6vdU|(%fqb6SPickBO&k$qT}!z0IRt#krYwl1$n@ zv=@@2o~3Cubp48@NzJBwc_Z_ax+gp~MfoV$>h!eQ)*+HvDi2V2jx~e{mncMt&ISyI zTp-&c&vcKIbXquLV9dgUE`k<^%x}bg)ok&n;y>Bef9lEiqu}YCqso5M#kcj3_+aXa z6*3CKxE^3Wr#?|!oXtg^N?Th^uhy39jW@Pm%*Rt(tFIR}ujbP) zk`-!W&Okw94@Gm2q_WN|%Z*__;YX)}frdYAGFf9o^Onc9Z&aVwRsTl#uNXN`l#+4r z57X;|^-nP}!{5iq|HV}On+A0Gi?8B+bX*aDuz=8qFz|q2@PKfTfLIP0F5Xj<2$zB{ zcrSMQ7!Daeh*kSIc;DQ7?=kr}$d&W|3Q3kD+TdBIq-~^A7Nlfm)EDe1rDA3Lt%I6D zU`fQw%s4{H%J?fgDR{D#gd5!ih8Gl(R1}TdLmb&w+bO_W*`-?70%1rx}jGr_VXps6-TDxkTJQl8+%Pq9^2mj>g&mTX33b(oIVny8Z^9>94cS*;H$>{BWPCL z#|smW0&N21NQ^v{EkQQD^ZDvaoyAWV>y(R3{adM3r-}T_)Ta)GRymZs=MC}=U!lU1 zz@0)NuLxHAM)+>CI8Dn6x@Tn9YAN1vW=cy8#O(TM+g9u+7>-k^IBo|4+w^I@fr+Es zHSG$u@uO%D50UKZ#9s`qK0d|9T1K8K+fES8$} z7G3pFP9DI)mh}yZqeek0z@8r7&Y~@-3;1_BJ*Wj;0B3bMPL-iRPCX4>va2u_=G{4% zND<(BiyGv|>l2?v98X_{k!&N3!Izvr*Qc#wmOJSRkLewY^AmJmA+uSUhNv;>a$($7 zlk5;SQYiv6_3?_Ls`km`l5a!Q=^$xRV$`ZZq>|@9;%IKkO@UE@c{jrDAOe`NsW{!? zCpWAMQ{BNe)X*q9Ls^g za9aAI>oxrYJr{k|X@6KrExuHZti3G0llwqB}6t(o`dF@IZ?OZy{mKM9EW=c22YKO>FvQUpDG^NW$A{r@VM7n zw&(=2H^h6{ibY1)VDgwPJF`B$vfsWNnU0{9dE9Z)E_!=wPlnHu5LW4v8c{%qZT9dh z_0%ka8rON77a`)u(9K${R28&u8=U+cxYOL^vn||@lN-?U0gkO~=W-jYcXgXnLA$o6 zy&4Jn>u2D>bUI}{nu!-!Wt7}Rb1U(1mnIFGe2b4XDIB(u2a#7xT6^vp1Z@hfVa;*% z;=98>uRz`KLYV^BmA7+r!@ZL6OI8P733|9lo6RTQgmrkYJZNlN`S}r2hQcRvd^`-K zo0$?;>(Z*1EX8rZSH-JbaQQXoHSv^)79~$&E=5~78nG9_#zrGqq#&FGx5P_+fO@sF z7?AE8Zmm)&~)kdCQ(blH%XZTbTh_rLpR`6KQ6_`gfb?I zm9`sY%1DsD;2gqM9ebfFVP|CqaZ&{4MmPaiuZ^8A*$^vI)2R7#v3X%t|1<4}mZDK@ zL=SG-0{?N-NhCAdPQBAlq;_pY8X%4Ri4OkB8Fqy)^4MKod#xUc8g>q(PWFK_ zH%^+YV@-A&fR~ytzXuBQ7Fj(lM*9R2ra*o3R?Z^}=I%kIlvJ+K7g$+NmUP^t2BO$?m2Fr*BNKtw@C_s%j)gq|~+32n<>xh8J>)O~C z719&Z;|R%u7cF#2BN!8pm*>E%;O99@H1sUioR#etn!2xNp_H?f^xh2$?)58eH+S2C zNXKAu6JC1@7Cd{Wyg$x5_Ll&E0K~$hqloIqZ;Xqfe|HcJm&QuSNqNa$I8JiKhH=S5 z=UF#SMIPc8ebmR|X2S24hdq-`jYAn5{M^p4*0vfYagYWSV#{{m5931DkP?DFD zm4@yJ)3LH)gUfQ>spz7nGwD3hM!TR3zFC=s?!>LbV$Drax}tZmTpMv11&T`XaBv%k_I$zm z>*=yv`PoAhtaF!rm{7ar_sK|f?5l`xinIh7Gis6 z(Hd&(V@mQa`I?>)#!8n(Q$AwKRk-e+!xrRl`2rMF#pPCsSfs8g+awd^ke z1l4H|%h5jJJ!rNDHg-klH z7E(`IDbr|P!)?ok0esuvpAfS&4PlAdM`Nf}J$bRn^5s&%nLBg(R)x231qN(*Uch)S z^Q1(4Q8Tf?bbL=e(%7&si%vMS+#vhD*|XUVeEn>TTv!*u`9bzBRhagK^&4#r!v8@Q zgr`7a^ReAX5+YubaHv02!UYowax&4xoNZnsT(08iS_rIRaf zK-*>32?5k0)Ab2IQ7n@sHM%{BepaoF+S@umF#QAe?J}Lxt|>~D7mEI3a89FbzjY1+fmh3Je~u8na_9gZfQAo<%?5Bw+?u14 zm=chfGLSSZt||IP3Sc^q*U?`sFH@OZGG5eF590I=LNFiTBqX*$VMG$FiTIMUS4bPC zOmnJJgZHF@aCD39Ok&liNWF#nNBL=TCLuRO_e<**HXapcM5fQ*g5|-fHr~X9ZM{>3 zzvUOk>{25rj@czokG_{$y*JfKO;;MROVvX5 zRV;rA$*-06GYIZc1r);smWvT0!3Px41df0am_Q^jNnU&2U`^pxLP;W!n~`}yxwZj!c2x9U#=Pwt<#rvI;*>3`ce{-NCQ-}zgf zrmvEoCiWM;))T|zHzcS``RVY)(H~82_6GLEbs};LRKXl%!d8BI>60$wP2HWom?=8C zb#1Nkt*vn!Mmnf<;^(AM@_aWygz-ykbC#US{H-(7Z zt!uwy-tFhN{Nt;UuY6yE5vx&JgUuj+13R&n)C6QklSo;bBBOpxhl>{W{l!~q#s@yuA&T?qI7P7vXk6^Gk5_y6+!|Wl->q1Cn+&~(YJ^PB`yIL zlmv3o-Ad$jIh`1IH!S8}b)hIqx=>vZ_iqSp+$d-UW@m4z;Z=xk<_PK@aJD5nROZ<8 zN)bsdR0msT!*J&qdsbGPq&w?)gmd0%>*sQD59db=b%HVq>XLl5;?Gv)#4Fb2lQ=Au z9^%Aw?ba45oa9#nl@{7Qaz?&GB0sL3gd|$E$d>H0B!9W=2;q zZdImZOC=sM#RY5bi*Fpbk(Tj!VFW1Wo?rR=?49)JfJn4cTlS(jYFG(e-C!aGNaopX zR}%YF6?MQIMxIZZv&?}Lj8DrgM&yIbG}C@OJs`Nl%9e8{M2twsP-Y-$du`9u*iMkU zyK+i8#w%zB+Bh-UvP;_YzIa%tl23VQDN<}qLAAEhA@wYa+?d~DuyWn2nd*QZO0bhK zDB{kDeeX1`zrNQoHD{U<)zJ`@9*(U*xo2x8?U0ulA3Tk(nEKxLE3r=P=wZTrp)k6A zr;f%!ydqk|PUWU0dUhWhoij8}r{AflvICl)rp+WL1RCA&2PQgS&7LfvDWstiK%?M< zp?6s;r0m)pox(MuLUhZ{SFy)7Q;C(DzyzTtXCfos0OpCYNaL}aD`fw+TmC zOb_H0ktCGWpR*@MH$Atws+BH)xQSh)z@!iUk z7U!G#!}T#{#W zusc$92fN|01J+~kZgise61A^rQENhHzyae6E;qU*i&iiw8*6!7;%12_$VvVYCf|#H zy%UA7z~JJsy3UJ#xz})z=5p*(cnTK{8oXEtzk)52AKdK;GlA_D&Dmw;`$8r&JGh~; zN1G*q-A}oR%5~|gD2m=AKcSmi4O74pC2mUPZto^fq@tc>@Rn}r^?T_$X>$a1^+>gv zhEkb5+~Vr3%)C>TKb~gd2=KOhf?)%L>iyj9&Z<{Lsq-Skgig8s}KcI6s5_eWvP+=KT^_gv+EPpvU@ z{*XNT;C222WnA^%JU1iF8Jj$jIlgt_Nl5O3Z)e>Ocu(eXu!I2Z2y?(Nf_668X&-V} zmf)Sg5Jr@}BdNYsP|455p-SGyIfdbs(Qoou$3{4Mf(KFDm54B)nPUbegf(7^hgJj2 zDR+)5q;J`Y15Ox9F#$PeXLV_zmHy9x+2`ixntS#cAwj2 zulS}LL-DYSK=NRUZhBjv+x2)~!0Cr`-!Sfa%g-15I3Rb$YmUs`96qX~a3m8j$wfx@2d1?16hoUk30;11u8^_g8SGFN&8|lUIr3B!q z6}{c;@+nmCH7xgzy|T}!HT#is%V}|;jy3iDfqjQ)=Ex)SSIJr@e)&pwRWF|H+^ih> z>;zgr;^J=~RBwkXJj}KlFfDptBfL*+u%^`RYpDIEcDF$c!nK&6EZVZOF6{qZ08Ru;&$8Svtx;j{xbmbAcM z2WN(G8~u$~U&4t3j!5LIWSgtB6G+H3PcbfdXy_e^-yerj_$X|g!~jlmbj_ijG5cN| zUSmb9N`vLOJLrve=0Y*n$4ogY9HRkrqF|zSv75J+t0&=Ki2ve>&FbcbtVV!=YdszP2==*#7drZLnA6OKAqis-oK#g~DbYY`-B;5JF z5Q&q^Q&Yq(mgC_mLf?MtRSk2fkL%K2W<7K`tTidm*bvcBJ$2I!Omb#j$tQ9-mm$V% z%A{3Z?P?p1DPGvq@tvJ15ihCh^rKS)0u|Ary*9`83+xF^l)qR&Ka**feG2sCwms&F zY?L|qvK8FDLHy9-Y3Ot35*jX8A=sPD;iAxk&r0B;q^y`Nq?ABbiPtugti?5ro8PK{ zIo}i(!aV_Nm}Y8z1pXJq(#2X&Ab*JF@_!_oDgGW}NeB1;4&&l9^yTo>(LND)yPJ9O zwYoZfsZ+N`>r;JCr_uPK6a6vZ5DXH6LC8b5Xl|6XHZ!$cP#M?8F%QsWKeItCmSASK zW@=+wZaE8OKTYv(ogEchghVZvcYTJ`ZVE#5y?*K5=6=q-R(M(;ETg?C#8#w&GR=wA z07qZN_(8wQQ2K_RPHXEpF5v>w}#z zu_}7gxt!|26XxWn!dpMWQlAvyXvvp# z(X@-dG_GtFC0ZAnp1pQ0d=6G(JdX*>*LAZgg_*vNoZ>-iFgw3Zjxt>eyV2jG+^`w{ z_mNogPtnALa<-LU@*;|EWv2etD@L8BY=*8ftSODcD;!g1W4qxj5)!R9y)z3Ewk;)O$C;wzg)(EdW60D`orSbJ6p=0boTA6JPlG_3DwW)<_Wb&2Xp;U5iK>jvWnjUu0!v$`G3D9QBK# z0CfJEAFY$V52n1uO|%RSa`y zo?M7*73g-%MsxL;j73{2DvIzl2j}me(tK3t#yN|)^*vagZvZ?l28UhdD-+Y{NOAG$ z)~eXJS9=NKSU`w|--F2!C*`mW94+lV6(Fl|8AEXTMMqLFcRPVjZQIm$5DaR#Kq5s= zEWo_`Q`p%9AzD{6V`_AVZTIy7?{UY((?f5B@c^LUC{j~1=;JXb33G1fu4RCjHj zCU(M-wn^j{%LDZUPlB|;qXa;MNeox_Fdh~)j#k5jaB&|;j1zGnfs$5e*_k17=WksK z;gp~6flX85J(|qu#-dCyV#bJ!@`L_aBQ=AndE%99z0>T=X%Cf4f=bmMF=mrQCbmLg zn#w~c1^kC4Ybr`@VgB-(0x!oF$~soa0kh_{1(GL_OH=fBhd4Ukd1ef9%$6!sgelmT z%$^HV?WR^Cq4-XXkYmnJil%6@yHNSZk(jHmBnAV}evuhY7>uS6l+Fkh&e#pRl0ET; zHxL0MIRI2gV_-`w{H-FK9$9y4J(zDSqHzdnb>Zv(2figCM5>!C0 z!X7M7oVE|H;R0M=v1?|DEFipZ%=;A@^MvP`(`dmFz%lk*;s<)<7JMzT9@{;FYjjGm z6tgn0(7QT#Enl7!*+eE>Bsdo&;iW9yZ%Vtp9-(}8+z%PIi4F@nH<(=D=vG36Y|=@v z_55cs1|*dBv-X+VpIlS=k30DLTvPb(|5H-tc1{wGF80Q5Zssmzs%|cS{DO$Pg@w7x zpMs*3v5T>r<9{lNWoo|_P?eEBXHI7qJc41$K#EPoR@+j+hY6{EiJ_RJglDHZSvTpo zeK+ggxX8!x!zKIy+e;mVDG-Ecp4;4Qjpj2yY%ulZ$7*TO)*tW%hyttj${9hE(KaJd zNw*=7kyj&MOBU1oUSgy<;2Qo=bh*9W+vxS;Jn^9a`g#5czm1eXTgai8K^Kn<}jW z^Ck(@veNf4pzvspH8Bqx7tVK|9OFH>v%-%x^o;cH^5J$HxPWqZyNK?0N)K6%1`q}B33w18}ncBdIcA8aH@kb)ySzF z9`G+49NDsd5)}kPgB|V*YX>J5CH}2lZqPcSIIIJOsKZ3CW;mLT_Q}hQGKA*g2t=?% z&ulCM&Ry`O6P!ES(mR>N+36DbqjcjoXhD2O#0`}}-?+4u+@b+4oh)K|5aTI# z7G!v2HL~NxDu$AgtPhUB`J&-9na7L7cLu5Wq_S0!Z^o_Wbjib2r@mSw^uow61c_uD z6){n~04bc^Vx@7-2&olK0A?x57;x zUQ>l=kS3e~0tBQE{!dmw_y1}I%>N;skMaSf3A z(9|uI%D_aJ?f~JzBt=KTBR(0Orx;$3p@P~m$ucW2lbcz3-s?n9KpA@@En>`YZo2Qa zvu|^YOK9;L(l}@vid(O+%|MjNmjxWX!~+e!Th#%2cag}DF!;r=+sb(KZRYWbzaqlb z&By^XQ3bw)CMc{i@WxA+|7Msj(rn$+|7bJ!=lpxCr}=->_b+XGwF3Rrex(Uo27Gx* zhX+IRNg2r@rC^JEmq`VlM*c5uw{3~L>5TEcm% zN$}cg_s*z&kBj)REb91DnI1qny)fQ?B(!bj~(XPCjW6SbRjRxLs#+w_od)=OFCn*dpUJXB1cPCjwA$U+p9QDZe z`KR^)J`N3|&@+o7#ru>&D$c%BOFQ6WoSFrI zr}UP4pr({iFUHKX%x`e8wD2cgMmj2zlaXZQd)cV+<)rp;pZr85b9R8$VO{%t1vvFs z5-D$|VB-vqFFltgKiZ;J?f%NTP~t04G(#4?W)jKDP%bBDw;To7`RoXx+_4C2EwC=p zp2Q|Hb+V3I-5dPdT(2$5{%2(5R& zvSjr@>28tQPPEdq(_iN?&g8_Z^?&xV6zhG5-wxB^ph(Gj^%!rOv0ISp!eEB@X*t#EWzt3qQJL5zZjN#+ZSt%{IYlQ*&RYH+t0N-L9=T7( z+yb0RPbQh;+Zl4t(bVp>tT9e3o1>G%p_bAd4H(XdpVRQVy9g4B!);<&xkIO#^dQ$sAR34<}MdD!!>1-_?9}N zYl4H1CyTq;`x5UQ3<__>^@h~gchz8F8U*tPLCwvml4f*E$Ju-*rU?}+?{;_XEG(Ni z=V_yD*hP1q@^B^_+u9s0)FB!9`FFr8I1B}q#O)No%tC(?niL?6BwQE z%WxQXA<8FQkNQV5ZVz!74>Lz6xsHwwaSR7yj8A+TJ4E(rUucFIdN9LZAmVUeXyP!RK?scrHfA zRCL+qQnjV(R4!w2y1PzyZ$7skd#3sNuc{=obI|HFgdQxsjC5awk!q;(WfB269=?@jDj?Kd_ ze3$;3>%^Cl-}Qai_q=uio|)UVuL==ioFMDS4^P6B`x{8y5_r&h{1R=Erm+{uD_Gnl z!pB&hB*M?C2iT;JWGA?!fn=3&%F<+7JQC&!v~s-j5<$5^o4_psM0B8C*g_n*mDRzO z7*=P&X3$ETVQJaMX&&TBdMD}&NKx<=xQ>EDSRE()~Plpi!fV0qD9~h%ORS!12wHXzjSVFHZG=aGMUnjA;+fD(F_A(76*pw}hR9xU@mYM(r0@&hL-(kSW1(PLDe$}rPP z@2sV^tbnoW54ciE?{KHNVJ>&3K2#)b%Aoutc%?FvuGEG(`3<4OFlJMAHqe!FP=i~M z1zB|fHhl(jHfHs-NPG=Uqsl-ue-xXnc;H+;hfi6h=NXF%V|(2jY`|c7p2$?w^u<3f>iOAePq)w*1l-ty~bi z96eu%ULs5@5vmajQHKSu!;I5n!e%vMH5Z#CxJORpZHl)G z)dC?U0wJ}XqLX85&3XM3@!c?aPYoWfEfM(#$sf2f7M$}XD7mE=T_X+lwI5)YPwDH; zjymZCbuFFPHE+K06>RN@1I*W^VAVA)nH5?S)f1;`L(DADOMPSi+~fik!N}OkjbJCjvVaAROK^fxjoXg*;q8Hv&PhA zYuhcyCNPvjGE;OWY;RE1`v%FLk=cPnc9L|}6f=}E6w>mPbjj{&Ipf^knIHUFOkGhH zsU&BtZF|!AJ&c~t7*=+*D|xV5179Xt$DJhnu<+hDIO4DXgrYAlGfCY*Y|?;}oG9AN z8{8W(A)V2?0hg7XUnr0P0r>|`R7wV0Qdrpy<;c!!SQ z8wJgwdZ{a`IFg_`s_eG5k&sZjVbk5+of4a7)1XLqw@7z)BO#51q;wG}QQXd?jbL8aNEj2_!EAcgvWM*w;mN_;A1{ z`-xrgql?8?JGBkMuxOSwlcPY@V9&yR_#7ywKJjhCM)Sh@ItJys(%1;46!^J1gpc&6 z#mfA?6n-2iC;65PD}|n}e%}kZMbabfG)2H9G2ynTHTM0iwI-;<(S*ztICntTy+FYl z@dynrTWHYo=}c6{l!7P6i2VW(y#eZrEg!Wr4c#iP3B1#oYq%1}#c*a`oIo`MWF`a%91*v*u=(R`X!hXWcG-%NZnfP~Tw`?a9P*w*4)$f&W z?3*I^ebf;frllf;K49`Mhw|{)YBE{zR;d zLC>H8cZi`N9E?`LYbvG?GQ6#>tnV)HAiqUvx9+*oR}&slFJn<^`$mA!X}Q65v%IEg-{jL^3`UF^WWx$?M_oc%txwa)W%!u2~Fl{UQLOKoD?Ew=!*o z5`bu@w__deL)|^G%(>R=Zn!l0whC!fLDPo>=cu(lOdB3y7Ge#aiyC39-?)W`DOYz- z*VYg4ikhZctknlGdW_uGM=w_E8jvR(-V1G_qdaY_r0T{K@0$TTH1QE(kY(P_=0As0oJfgfJMx#LY8*C35y znvgY%4qTppcS4#wBClqj_m^t zlrGQQz@pqaz%6U`2&CEDfz+o9w?cL}LK5ubpxDudfoKvnpRZZB23n4F{m@n4p~>Ck zyRPs=eL^aU9G;a0%>|$oSbNU1^NFQF%iYqNmI`9XWhB$6cUwh&@Cft1p@X`jBXmnK zT-NM61pWx(zlu5z4c0=c?^a$jKdq5ktq6?Q3S;NpWiP6dxm*xzx_|!2iB7z1A?|tz zJ=}c=vH3GQ@(+SFf4RqmY>gZ&3@q*chl5N;8iEPQU1>^NyJ*6Df!7)7M$l(dN=Q_$ zNSV4ZkI9^*UQ*Jrvw2Qt^J;mH03&5aSZi1(TFtw#^( zH^|LX^ky{IL(>&+Je#ZX(;NRgzFQx z1G^8`Cv!#{Ay)j?&|1@8Zv3Id^dbp1T>%6n%OuYI0Wi@y#-6RDoolqHF_Otaouut+ zfSB+6p?bnyPy{L@J-yQW-mlM>DK4pER1~!42oSF_gaf=&zdc_zP-riMX zHov)(W_aIuGo^Fme`VEJ+i~+5Q#J8^FvKbGej!BQ>t%MR6B*?#g!?=nv<|>L1b;iW zjN4V5FHaoB)RuKLN`7qHka^p}qq;)x&7|lymu-Gyg_X+Lz7_6PDyWw`%i{L7VkUVo zd;S(;ud#@S+h~#&5$ZI+!x$tO(d(qKgvv_>Xw)~56 zY&t`_^5Gb4o}46yOSK(dRTxJZY>;gR$YK&5) zg+h};)K+6A4ddkTV#0Om*0C%Kha!+Sjj{k`>%4Agq=}2NoT+06#12(Cmubg%M~3N6 zF;B*9@GjbFc)o79_;@T%h*?x36T2blSd^M@1VDvOnkA-@N}3~jADfRUD`|WvE<2em zpPV^4Mvrh@;q|a%y{~=^F-8KRgM7?sr3HhxUCb4uwoj~SF54yyY`q8+{hkWj)O~Zy zUf`u=Pk}l#ddP(m%=Qa3VUDU?Qn`dF1b4GzDX9*QT4w^bi8 zW*&%>#M`q*MJ}h8@Nlx*trgnjZAgT(T;YRit21jfK=V9?H_fy$hoSw;kTt8}Ttrf$}GZECc#gvJkPhV)WS zcOSVv+ZAv3E>Icn>XTaj?CrR`?Ocgup)$;5B_%RX=1{-Qft_%ZZHqN z;uYR%x50Z0LQ9;@{k)b}EDuTNc@qkXlm0siIJqr~m~Lg1p5HhoV}_%%RkV1e=Xr5$ zCd@0G&+B)$g<$wkQTh!wf{M1;W9B9T{1aSWY`muUkbaPoVteQ^AB-4CWd%ov|NU@( z95uV^gy(g))w~EtltTeG^XP6rNYfbmy8!{0`A0cRNI@uSmpO^TwQs05umOjTm-qo3 z+&7W|0_#V4P!}g#g2F6>mGQ(DR#B50ANiC%?$eCU1XrFDf65m89w~|lGeSQ~+(EWN zwtRi`4%h|>@U-NWZio$7{B}d8{(UBh`o3v5(k?Qu@J2@XB)U>vB8Suh zH9F#>j4(AxftUoG^omhpDqVO*v zql96Mu7<*JVso=Jm1kbYtpLQ_(zEcpb%Ae?Fd0J=UfA+@iL9mBWhV^v&@Hb`iheOD z4>;*17UnWgkh{_^53=paN(==EhggKZm1Z4{EBJImp)e$Rl>!^}W^x&N| z@0gSg**oMPdog4&jxMnEnCbq_ov-VsUeE5B+DprjA(s7^c2{O~(F!{u)q#OtGbuLt zl-@d1Wc+^obxP-;l$=422Vp(Mvf}_DBbxQln|XPIo|lt|eB3^-auvArc}Th^+$fOq z&#fB56`e>dsK``7GGwKFih>K)tFtL>>ywA8pGR31^K^?zq}W>EdsoSOkMKcD?mv+4 zJY5}LRMm!ks+D%Hd*#F8mwgG@eN3g(!m8ZA^xz5I5y+swOXGHYQM&S4x!z-yCJtyX>$jxCZu!QNRw? zqW-D_cxhiYZ2;kFiUlv_(Hs0GKs962L{|;WJ866=1fs583trMAd3+i>7?!4iu6A(5 z&2s91{m{d*<9+bO^jBO0q|ub}i4VF6t`YL;PNUX%AJ5Z1f`=)w&@13tDnQ&xepOvj z80jG6zQudoJP#paJ}f*311pFBr&G#5BuU6y*_k*$jWO|4F|(c!|w)ZZ7(3j?mwuliId0i&OWwi4+L z;qFIX52luvEVmQ7{w95u0y7BxM*(+qsU#*-((=&)uQnIl4xAP?ciQjouPny1Fd6bC z-b8peQk#}h1k>;7+43=1y|GjzWA2~P^_lBEsrD8^N6;d7L5H@%jS+cw%NR3@4p12J;sYMMv8AwD z%vs9!u7@HnaR`aBgG_#fxCMQtzra?}Lo_>y7?B*#Lzsb6#}mcmh#gKtNDhUg=rYT0 zdvMucrorXKmK~oayYt@jw%*kjllJuCyoyRx+$u#^$5P9b1_X984!!8)aF&8^CR`htX?6Qp z>;=(ks7V|t6WUXRs^Tk~pRIZ$6jg?DV(PVL`*Wbl>xJ2&vg*V57q5pVJG=B1zi>lI}9 z=C;xvbM71X(vsFdf3t_%PHGQ=j!xL2$t4~B#1Rh~8gK6MMZ+ZoKIo{{U;E_`NDNlq zpgdOIFe6H}Jlrxm0Uonyob*m6_@T_N7`zN+cXM%c!|%y6m$YOJ;OFVx8qtKPeFG1y z0Z{b8s+jwir_V^%5$r)AMMi>nce_^^gD<5*X)C5i5*T7r9^oRb2c4oVGxI0jo92V7^Sa_K=i=i7zT&7MqeT z;B4)9X-(8#4ZQ*P6pbLP;+IGp-6tw-j3J>L3ps2^k_44B8V zDfV#5E%nA*3A1a{pHbp587Ij(Ea@`K4WGH2OQ&ez?!}g6`A+kDuuR9C*YuDTzYGs% zyixM7aW4+~wgFx#n$i#$Ph1_7PA(@G;8e~q3W)k33XxXBkW~c}_XTB;<}JwWN=Gva zlDamC-2}O4`g{UB!o4a^&U8^&1a`AIstURj(eNLZc(905G>)0jM;XaXye<#l@(`0sDhW^q zt7{w&oUNs63A!QEOpjPH=mGo>TJDDuf@p@4iD1DR724$WPKriPeg39R!txttI zRqC6210nCk<8GXay9BmMPn33AJx0GZQ!?J?3f@3ZEjK527=aLgAV6Z<1=YK~7B+O~ zYAA$!q94kKYtqzy_n_qhbYArAXZVdB&lVJbH?xpe-rK89Oi9ST=w?9V~i^#tKs_puy0=Leng`ELY((n^K&fl<@q-aViS3laU zXN*&zmk-YaE8gBpYE2KdhTHlSug6or@wRY-z++9JUkTq`s~ALKciyIa0WEv^1y66u zP;#c(Q+J4ELptyp!IB6X7d5@Db}HIzFn3u;l2v+N&OL`gOfOQLNEBLsL=yR%CkApi zca&h>Ru}t-kIhI3b~$p1#0t9&Rd}F`v*78ndbEe6dBINAYFr>*spy_F5)<~2+q|;0 z$Tim4xnr=#i?dS)ozhR)uWPhPF*AAU`TEG4{>24UQv2;7J)|Or{{QZ>$}ZLh5)TTX z=KsE#`l)Ezp@ER@3?-Sr^$-#fEkQ|uL&livD<~7fN}!-fq-uS&Bt}M}sE8RLtzg;R zqeYTO?zo0RMqA5zIDMIYWR+JmFfoY(@fWNkmYue8cz7blyBo@}SERs8nhw3olXLQz z=W`!S{cwN1p-J0HQcIKxOG2C;ht%dph_Hf$o31z3{*rGfvUiwL1V@C)-`>9qE12aW zmc&Pf0xMbnYb=tWurIoA*vCLj(&9D=D!@6gyfyB@X_@P&+)=Iw4C2%YMn%!_rCuR} zWmwgx(m}S7Y7+o7`TgSH^{j@nuz9s^xj7`ol)Ss)HOhz38rHe9z;^Ii1a2&}f9CeB6(<#_CFS>VREv1mT- zsQTEd8CR<|1SOdqxbNs@xvn?0p6lPop}r=4WUd2e#~`HIV#!ES78t>rFCMK~%l=FDhv4hhsWgg z8~WrqT=g5e=kZ4 zS2PVKaF?jZ1)e)%=iY%s`dZy&+~OO&q#%lQDAH@5$i@*G@X3YxTf;Et5AyeP@8OgN zz7G*U%Y@o{t~@n?SG1^SCWmVn$`wg6(t6Ou7Z5NTn<<-oUUOmZC|WVrl(}#|*!r!Y zvYu{+i-&4geug;eL8H4STDx#>ZV@ktx#qnIc8Wf{ckB%tN2{*aW0SE(%-H_@_kAT(Lo7kJ8WIr>a;`p3&@V?na3lJQIdv>oFv6 zEGZQBJsqH{IL)5_*3LKOa_&~%)FOStHj9MkRPYUn*TsIWJi?HFOi|0ptsrQkHe91l zmDTH35^1_eNH5V)*A?!R*0KS9SsMJAd2V?JD#DTi&Uz>~emjQi^X+#o-nfT^`(QC_ z{!JoF2=Ty8F3v43wIqeMnCTrcqz-oTJco_Kr1~Ez^~nu>S;LrUgQs+8s1JHzJ}7O( z-8sHK0BPSo&Ujdc^-KP?zIU~$tLwfroF%Ck8{YdOWMR)mf%5X?y-|Yb^NlJbl74pb z5omF=GRydxEfKnyxm%=s&-@NFueVC72q8ou;&ku&B`iUo>W77jHKPP4a(GaY$FO zi?S+bw<NsA{}YVMVMr$`9Bg_gDw6*vv20#TmU| z&BJ@Dg@;z67jDn$zeC1<`a1LnJbh&EIUztf`UIQ6#(G( z;X@9NRO|=mA)IH6hp})kECVvY7(;zps={%d{3-0cAS~tt^FTdUJ^cQeU$p6YY zOWUIwpxxb(%8-w3qiU3SR>~974O1G6;jb$QQu|SUn#iIYvrh&}lIunvomLGuTJpJu z(|m*DqgYpqpy%t3J8&p+o2TwRyk{Xz;(oRA_8{#`<3)Yx;r$o^f%|v7w&@5&2lI9y zK$DTC(@e2n^0*GoO5#CG$$)Ahc7+a4^{9HV#_4TsVe9ya7Zm(97KX!VOY~dG;7~Mm zDs!s%oLX`*S@BIh>yPO{nS@Av=&8U=HH@t^9d@h4p44sqXcmJhN9I?MGnk(gXR1OB z>X(MU*|T5{G>~O{nLG>L*9ZY$`Ruu@eDWebMT2|WP>NLsRDF15W5-unlhVTWl{=@w&r`cE(tEPiY@j8Hfw}^ zj(uClWF^U-0)Xs|8!ZW4LL8fPVW();dSX<^db~TRfP&zVbcHf!Hb?qw{ZuM~i)#_P z$hgk%%Tg~|3|$^fQDcW`Sgih@@@~1lpCE;v(!lk>2`&syw%)!>%-JCI#wGcoLf-ng zHp-?wi&M7A6mwt4{Bg&D!S;^CmXT!+oxxiZ5xE(nc7!{RYKdgD2Amp!5fD%B5YEI| zl5nStrjdo1`65`CKJs&`Bqj)-Y0Ebf!Ff5;VSLXW-{g7e?lDJ3T9II}m0@1LrNpU4 zm}=qDTFSur1YEaO5w|Fcu1U3Zrv=CT9;fJ1rd&CCKDsY-$Q)I$&c;YtwlBaF9e!Gp zp}+Lp5~r4|(_)Uv8uJk6L7o!#Qt(^IMbPh3mp4u&OH3erHCK4)#=198&AO zyU^^~*=LFt{Jnzj;svkC_HT?+`(cK-__$3@)55Xft16I|6;g_@O)0V%wnT@s1Mqi; zoPGIRpqw!wCCmJpxdZ`qYv7CaJqS4gyfTKAGPaa5b(CpGdmn>G^og8ge76GLqiTh|0Q+fGT5e2ORaYCwK8ldbFnBsoxCYK=LKn&gNcGLl)GoArBiXP z0me=#QWFg(o!D320Ze;wg<@*)0Yu4+{KQ?|)GLvgHmQ!-V=PElDCJ-IM1{kKH%>ns z8QqTMp7KF{D;RCYnil2+TeZu*Z<}ho;1Q+LID3n>aZ`@Zd+DD;%}G*PB@c zeGT%g6mt9FV{(6*!&iVH1IXJkxo|Oomqg`HX0W5UM}@p29$XB4-|@A_b?rUFXAyJ& zfSR>3h;v0)H8bMHha)(S=QmNAxnJMo7t0KHY~((FnR<@H=~MAc)a?2KsY7<<<+ZncZ(MBr+ zSWEm7P6Y(lpzVt@^_ptz(6tvY9NlUMQ28VB6UA#JK8e&XWx9)}khT}Fo%ToY3mV7W z>m88UqvPghfy_US7H(w+gGS^gR65BEozYVY+CaQ#NDywgcwx5mNUFMltn7heFJTtu z-@?L12`TC`(VGKMr>uoJ3wQ4{p!QtrlUq6Ii94lm(aoH5-uIBlaSW4{eqb|CdfhpR zzIAaMrWc>7ddV-nTU1ynegCjJL&NlaWp7e>h|OijHN#`a`70*R>^AOV4yJ=1`y_-hp|<+RWH8K5xTc z=x<26_*`*)`~Av~SGHVrqs&6DyNf>4xkT829_C8CLawajEQVBB8@=~{6{~kk=%u^i zPRY6NB4(7-4z@{Bc`$5uNw|1;B8(L+o*c9nf?oIcI6Jbp>+>O$@d_z#1g_h#uu&{= zLeQL0vpKB<>KIl)oJ}yVWQRnl0aefgT%`3oKw(ZbLn+E2V^(;5W9N5vCE9H4uC^w1 z-2KXsI7q#Gd||xb6nZAB1kBRNFwoT~k;3Df!F4@a+xTR1z9D<{okIMpIX$m8gU`F#X=)p4 zYXRC?VO@Gy9_d;-GW7IBs&(M!7dQ)=UnMM+!<10Xh6iNE#AO#)a~)<*b`dXK^PS0B zwezs=U>eP<3!;{afGSn?OFB5j0drlqj&h|=;(Vnzmx*bump^{|00f0E`X+5x_l`Y( z<_~76;K^1D+x1l=Ijlc`&z#f_#39aCRf#uB9Z(&gL7nel#%yAgt{j()M_WZ@23=jK z?!|ttS_7XM%dILMr=Ea-0pYcpIt`utw9g9@$@G{K@@*Ncv=ZmF-@ zYdETei}<>{NQmL0k~wX4quP=&i(IS@GL?TDp6*Nv8RmVQrMwEXQ$Ef^ftAE;BivLdlB)TwN8`5-iH{=rE~} zAC%29xb){>d98cdH@ubWq(wJ?kd_A9jKX4LxhTdtB{b;q&(Ly3X=7BQxQ)S-15F@T z&96q1M==X<%|gIJdt&@hGob71Z(ruV3YSK8j2)0-{kXeDYUu`z6;ou7IM(CkI?l?c zY>s@h9-gg->IG#Qc9zKXOZ(?*I_IpK}nyS;L;Y-q4fY&5Kel*RnWEqu8 zx_K7{Z*~D!+hxmWpn>Lg=}uizr>txew2Wwc`D*I;jqa&x5*q~cbDgOhYYBenQnW2> zJO?a$s#b7c3dwH33mK*As#cPSDxbQ9x+u3>v)EZma}2&wlms3Jgw_i_Fgi2`NRd}f zI|v@yvv({!gBOh5Am~XypcyxbnttLDJy$b*9#QA5_qe7#rHs2Xb}%(!)=Pwd zp=p`x?F30sF6PZZSyQ$gbPZSaqGtB&S-LgvCb%eP2*F(7vv5oW=b=1vxYtd!;1vAt zz&H|D7D>vQF_2Ngr`ljH=i4^TrLc@~z6kXvS$jgKe*n5z@3zRGh#++>edoc?Rse8s zh40hJ^}~>+w&H~}a1GXS%xxZLpYg2Pc=GG|(`&2MD)cvYIFYE4ju4~0jAT!e`*QRy zVX>S_hm2RSyX8O~$tSVC$?CT5#Z>zTk+KR#*j&s0cCb~Vm-sJ^+6cor6%k3EalGuQ z=iuL+%Z60KXJW`@j37Z=7ancm(|Fs;8?J{IqMK@Yx)rGbLo@vW_MlxXvCip$4)y5R ztqNvUnGqO}Ai5VWEEFVaOY#<~#36!` zlJubEScbSZE*6?8BuifiF13~SonUKZL5jS;f?G;li+|XO-v|jZA)mP;z&Vj6HA2Fo zC|TMTMtLYiu39}7MlWb3#+m3%4S%zNSGO@6X$Ca?H1E*nUyAC$}ovi z+;p@Oy%_j+&ks)1XW{nQ^@3m)5|k)HB^q2lcrGJ)P^G2Y?4h$QaGx`kjfjP$K^(r> zA?&XI(y>WAk3^;;>YH)o*r{2T^8$HjKSnF3^JL=K{rXIFzi3>W1%y6-Iv*cSk&yNA%Wcr zJw81tarW5kXBmXYW>0H^JubDsjN;+(Kh2($JbT*l@5(|CWBbb zhn`>N@$l{*U)FyCexmRDGhy#{)Tau+7^#|0S*WmvS_*8KBQF!>5Q9Zo2 zKL9=%=F{`q?}L3R5lH$A_~A+VK>+y=*gpsRmw@l@h)-3w{ywQ^1pf=-6QRN1QJ+d} z{C!eSABO#hasJZ>e=02TsL=7tKo2Dm{{Z+;dL6%y_-RJ?qdvtit9^Khf9T*hwTj;{ zpXS#J{Q`V=dh_rZ{($*^&n*AFyQk@`e>;YP8M6N$yZbAJ_jlx{p`nlD&@WTr_`f0l z_pi#+NXWmhM)nea#Qo4bee-A0oIE%DBkupW06#^2ysbSwmHhn(k!keg2=V0ZCNB;3Kv#o-;XeE{z<_~`nLqyZ F{{Zietb70f literal 0 HcmV?d00001 diff --git a/lib/commons-logging.jar b/lib/commons-logging.jar new file mode 100644 index 0000000000000000000000000000000000000000..aca1e4132652cb9c8aa7fdf4647d61bc740a1b95 GIT binary patch literal 26388 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%0A|!W_++shbKru1br41U@Uxer;v9KuDmvA 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�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

@&duNWrG|dmA+R4h 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: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 literal 0 HcmV?d00001 diff --git a/licenses/commons-cli-LICENSE.txt b/licenses/commons-cli-LICENSE.txt new file mode 100644 index 0000000..58c4c55 --- /dev/null +++ b/licenses/commons-cli-LICENSE.txt @@ -0,0 +1,60 @@ +/* + * $Header: /home/radcvs/dnssec_pilot/sectools/licenses/commons-cli-LICENSE.txt,v 1.1 2003/04/02 22:40:49 davidb Exp $ + * $Revision: 1.1 $ + * $Date: 2003/04/02 22:40:49 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ diff --git a/licenses/commons-logging-LICENSE.txt b/licenses/commons-logging-LICENSE.txt new file mode 100644 index 0000000..c76c408 --- /dev/null +++ b/licenses/commons-logging-LICENSE.txt @@ -0,0 +1,60 @@ +/* + * $Header: /home/radcvs/dnssec_pilot/sectools/licenses/commons-logging-LICENSE.txt,v 1.1 2003/04/02 22:40:49 davidb Exp $ + * $Revision: 1.1 $ + * $Date: 2003/04/02 22:40:49 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ \ No newline at end of file diff --git a/licenses/dnsjava-LICENSE.txt b/licenses/dnsjava-LICENSE.txt new file mode 100644 index 0000000..0bfe227 --- /dev/null +++ b/licenses/dnsjava-LICENSE.txt @@ -0,0 +1,36 @@ +dnsjava is placed under the BSD license. Several files are also under +additional licenses; see the individual files for details. + +Copyright (c) 1999-2003, Brian Wellington +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the dnsjava project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Final notes: + + - Thanks to Network Associates, Inc. for sponsoring some of the original + dnsjava work in 1999-2000. + + - Thanks to Nominum, Inc. for sponsoring some work on dnsjava from 2000-2003. diff --git a/licenses/java-dnssec-tools-LICENSE.txt b/licenses/java-dnssec-tools-LICENSE.txt new file mode 100644 index 0000000..6c0a161 --- /dev/null +++ b/licenses/java-dnssec-tools-LICENSE.txt @@ -0,0 +1,508 @@ +jDNSSECtools Copyright (c) 2002 VeriSign, Inc. +jDNSSECtools is released under the following license: + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/licenses/jce-LICENSE.txt b/licenses/jce-LICENSE.txt new file mode 100644 index 0000000..cd19cee --- /dev/null +++ b/licenses/jce-LICENSE.txt @@ -0,0 +1,169 @@ + Sun Microsystems, Inc. + Binary Code License Agreement + +READ THE TERMS OF THIS AGREEMENT AND ANY PROVIDED SUPPLEMENTAL LICENSE +TERMS (COLLECTIVELY "AGREEMENT") CAREFULLY BEFORE OPENING THE SOFTWARE +MEDIA PACKAGE. BY OPENING THE SOFTWARE MEDIA PACKAGE, YOU AGREE TO THE +TERMS OF THIS AGREEMENT. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, +INDICATE YOUR ACCEPTANCE OF THESE TERMS BY SELECTING THE "ACCEPT" BUTTON AT +THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL THESE TERMS, +PROMPTLY RETURN THE UNUSED SOFTWARE TO YOUR PLACE OF PURCHASE FOR A REFUND +OR, IF THE SOFTWARE IS ACCESSED ELECTRONICALLY, SELECT THE "DECLINE" BUTTON +AT THE END OF THIS AGREEMENT. + +1. LICENSE TO USE. Sun grants you a non-exclusive and non-transferable +license for the internal use only of the accompanying software and +documentation and any error corrections provided by Sun (collectively +"Software"), by the number of users and the class of computer hardware for +which the corresponding fee has been paid. + +2. RESTRICTIONS. Software is confidential and copyrighted. Title to +Software and all associated intellectual property rights is retained by Sun +and/or its licensors. Except as specifically authorized in any +Supplemental License Terms, you may not make copies of Software, other than +a single copy of Software for archival purposes. Unless enforcement is +prohibited by applicable law, you may not modify, decompile, or reverse +engineer Software. You acknowledge that Software is not designed, licensed +or intended for use in the design, construction, operation or maintenance +of any nuclear facility. Sun disclaims any express or implied warranty of +fitness for such uses. No right, title or interest in or to any trademark, +service mark, logo or trade name of Sun or its licensors is granted under +this Agreement. + +3. LIMITED WARRANTY. Sun warrants to you that for a period of ninety (90) +days from the date of purchase, as evidenced by a copy of the receipt, the +media on which Software is furnished (if any) will be free of defects in +materials and workmanship under normal use. Except for the foregoing, +Software is provided "AS IS". Your exclusive remedy and Sun's entire +liability under this limited warranty will be at Sun's option to replace +Software media or refund the fee paid for Software. + +4. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS +OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY +IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR +NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE +DISCLAIMERS ARE HELD TO BE LEGALLY INVALID. + +5. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO +EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR +DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE +DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT +OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will Sun's +liability to you, whether in contract, tort (including negligence), or +otherwise, exceed the amount paid by you for Software under this +Agreement. The foregoing limitations will apply even if the above stated +warranty fails of its essential purpose. + +6. Termination. This Agreement is effective until terminated. You may +terminate this Agreement at any time by destroying all copies of Software. +This Agreement will terminate immediately without notice from Sun if you +fail to comply with any provision of this Agreement. Upon Termination, you +must destroy all copies of Software. + +7. Export Regulations. All Software and technical data delivered under this +Agreement are subject to US export control laws and may be subject to +export or import regulations in other countries. You agree to comply +strictly with all such laws and regulations and acknowledge that you have +the responsibility to obtain such licenses to export, re-export, or import +as may be required after delivery to you. + +8. U.S. Government Restricted Rights. If Software is being acquired by or +on behalf of the U.S. Government or by a U.S. Government prime contractor +or subcontractor (at any tier), then the Government's rights in Software +and accompanying documentation will be only as set forth in this Agreement; +this is in accordance with 48 CFR 227.7201 through 227.7202-4 (for +Department of Defense (DOD) acquisitions) and with 48 CFR 2.101 and 12.212 +(for non-DOD acquisitions). + +9. Governing Law. Any action related to this Agreement will be governed by +California law and controlling U.S. federal law. No choice of law rules of +any jurisdiction will apply. + +10. Severability. If any provision of this Agreement is held to be +unenforceable, this Agreement will remain in effect with the provision +omitted, unless omission would frustrate the intent of the parties, in +which case this Agreement will immediately terminate. + +11. Integration. This Agreement is the entire agreement between you and +Sun relating to its subject matter. It supersedes all prior or +contemporaneous oral or written communications, proposals, representations +and warranties and prevails over any conflicting or additional terms of any +quote, order, acknowledgment, or other communication between the parties +relating to its subject matter during the term of this Agreement. No +modification of this Agreement will be binding, unless in writing and +signed by an authorized representative of each party. + + JAVA OPTIONAL PACKAGE + JAVATM CRYPTOGRAPHY EXTENSION, VERSION 1.2.2 + + SUPPLEMENTAL LICENSE TERMS + +These supplemental license terms ("Supplemental Terms") add to or modify +the terms of the Binary Code License Agreement (collectively, the +"Agreement"). Capitalized terms not defined in these Supplemental Terms +shall have the same meanings ascribed to them in the Agreement. These +Supplemental Terms shall supersede any inconsistent or conflicting terms in +the Agreement, or in any license contained within the Software. + +1. Software Internal Use and Development License Grant. Subject to the +terms and conditions of this Agreement, including, but not limited to +Section 3 (Java(TM) Technology Restrictions) of these Supplemental Terms, +Sun grants you a non-exclusive, non-transferable, limited license to +reproduce internally and use internally the binary form of the Software, +complete and unmodified, for the sole purpose of designing, developing and +testing your Java applets and applications ("Programs"). + +2. License to Distribute Software. In addition to the license granted in +Section 1 (Software Internal Use and Development License Grant) of these +Supplemental Terms, subject to the terms and conditions of this Agreement, +including but not limited to, Section 3 (Java Technology Restrictions) of +these Supplemental Terms, Sun grants you a non-exclusive, non-transferable, +limited license to reproduce and distribute the Software in binary code +form only, provided that you (i) distribute the Software complete and +unmodified and only bundled as part of your Programs, (ii) do not +distribute additional software intended to replace any component(s) of the +Software, (iii) do not remove or alter any proprietary legends or notices +contained in the Software, (iv) only distribute the Software subject to a +license agreement that protects Sun's interests consistent with the terms +contained in this Agreement, and (v) agree to defend and indemnify Sun and +its licensors from and against any damages, costs, liabilities, settlement +amounts and/or expenses (including attorneys' fees) incurred in connection +with any claim, lawsuit or action by any third party that arises or results +from the use or distribution of any and all Programs and/or Software. + +3. Java Technology Restrictions. You may not modify the Java Platform +Interface ("JPI", identified as classes contained within the "java" package +or any subpackages of the "java" package), by creating additional classes +within the JPI or otherwise causing the addition to or modification of the +classes in the JPI. In the event that you create an additional class and +associated API(s) which (i) extends the functionality of the Java platform, +and (ii) is exposed to third party software developers for the purpose of +developing additional software which invokes such additional API, you must +promptly publish broadly an accurate specification for such API for free +use by all developers. You may not create, or authorize your licensees to +create additional classes, interfaces, or subpackages that are in any way +identified as "java", "javax", "sun" or similar convention as specified by +Sun in any naming convention designation. + +4. Trademarks and Logos. You acknowledge and agree as between you and Sun +that Sun owns the SUN, SOLARIS, JAVA, JINI, FORTE, STAROFFICE, STARPORTAL +and iPLANET trademarks and all SUN, SOLARIS, JAVA, JINI, FORTE, STAROFFICE, +STARPORTAL and iPLANET-related trademarks, service marks, logos and other +brand designations ("Sun Marks"), and you agree to comply with the Sun +Trademark and Logo Usage Requirements currently located at +http://www.sun.com/policies/trademarks. Any use you make of the Sun Marks +inures to Sun's benefit. + +5. Source Code. Software may contain source code that is provided solely +for reference purposes pursuant to the terms of this Agreement. Source +code may not be redistributed unless expressly provided for in this +Agreement. + +6. Termination for Infringement. Either party may terminate this Agreement +immediately should any Software become, or in either party's opinion be +likely to become, the subject of a claim of infringement of any +intellectual property right. +For inquiries please contact: Sun Microsystems, Inc. 4150 Network Circle, +Santa Clara, California 95054 +(LFI#113313/Form ID#011801) diff --git a/src/com/verisignlabs/dnssec/cl/KeyGen.java b/src/com/verisignlabs/dnssec/cl/KeyGen.java new file mode 100644 index 0000000..6a195c1 --- /dev/null +++ b/src/com/verisignlabs/dnssec/cl/KeyGen.java @@ -0,0 +1,352 @@ +// $Id: KeyGen.java,v 1.2 2004/01/16 17:56:17 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.cl; + +import java.util.*; +import java.io.*; +import java.text.SimpleDateFormat; +import java.text.ParseException; +import java.security.GeneralSecurityException; + +import org.xbill.DNS.*; + +import com.verisignlabs.dnssec.security.*; + +import org.apache.commons.cli.*; +import org.apache.commons.cli.Options; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** This class forms the command line implementation of a DNSSEC key + * generator + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.2 $ + */ +public class KeyGen +{ + private static Log log; + + /** This is a small inner class used to hold all of the command line + * option state. */ + private static class CLIState + { + public int algorithm = 5; + public int keylength = 1024; + public String outputfile = null; + public File keydir = null; + public boolean zoneKey = true; + public boolean kskFlag = false; + public String owner = null; + public long ttl = 86400; + + public CLIState() { } + + public void parseCommandLine(Options opts, String[] args) + throws org.apache.commons.cli.ParseException, ParseException, + IOException + { + CommandLineParser cli_parser = new PosixParser(); + CommandLine cli = cli_parser.parse(opts, args); + + String optstr = null; + + if (cli.hasOption('h')) usage(opts); + + if (cli.hasOption('v')) + { + int value = parseInt(cli.getOptionValue('v'), 5); + + switch (value) + { + case 0: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "fatal"); + break; + case 5: + default: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "debug"); + break; + case 6: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "trace"); + break; + } + } + + if (cli.hasOption('k')) kskFlag = true; + + outputfile = cli.getOptionValue('f'); + + if ((optstr = cli.getOptionValue('d')) != null) + { + keydir = new File(optstr); + } + + if ((optstr = cli.getOptionValue('n')) != null) + { + if (! optstr.equalsIgnoreCase("ZONE")) + { + zoneKey = false; + } + } + if ((optstr = cli.getOptionValue('a')) != null) + { + algorithm = parseAlg(optstr); + } + + if ((optstr = cli.getOptionValue('b')) != null) + { + keylength = parseInt(optstr, 1024); + } + + if ((optstr = cli.getOptionValue("ttl")) != null) + { + ttl = parseInt(optstr, 86400); + } + + String[] cl_args = cli.getArgs(); + + if (cl_args.length < 1) + { + System.err.println("error: missing key owner name"); + usage(opts); + } + + owner = cl_args[0]; + } + } + + /** This is just a convenience method for parsing integers from + * strings. + * + * @param s the string to parse. + * @param def the default value, if the string doesn't parse. + * @return the parsed integer, or the default. + */ + private static int parseInt(String s, int def) + { + try + { + int v = Integer.parseInt(s); + return v; + } + catch (NumberFormatException e) + { + return def; + } + } + + private static int parseAlg(String s) + { + int alg = parseInt(s, -1); + if (alg > 0) return alg; + + s = s.toUpperCase(); + + if (s.equals("RSA")) + { + return DNSSEC.RSASHA1; + } + else if (s.equals("RSAMD5")) + { + return DNSSEC.RSA; + } + else if (s.equals("DH")) + { + return DNSSEC.DH; + } + else if (s.equals("DSA")) + { + return DNSSEC.DSA; + } + else if (s.equals("RSASHA1")) + { + return DNSSEC.RSASHA1; + } + + // default + return DNSSEC.RSASHA1; + } + + /** Set up the command line options. + * + * @return a set of command line options. + */ + private static Options setupCLI() + { + Options options = new Options(); + + // boolean options + options.addOption("h", "help", false, "Print this message."); + options.addOption("k", "kskflag", false, + "Key is a key-signing-key (sets the SEP flag)."); + + // Argument options + options.addOption(OptionBuilder.hasArg() + .withLongOpt("nametype") + .withArgName("type") + .withDescription("ZONE | OTHER (default ZONE)") + .create('n')); + options.addOption(OptionBuilder.hasOptionalArg() + .withLongOpt("verbose") + .withArgName("level") + .withDescription("verbosity level -- 0 is silence, " + + "5 is debug information, " + + "6 is trace information.\n"+ + "default is level 5.") + .create('v')); + options.addOption(OptionBuilder.hasArg() + .withArgName("algorithm") + .withDescription("RSA | RSASHA1 | RSAMD5 | DH | DSA, " + + "RSASHA1 is default.") + .create('a')); + options.addOption(OptionBuilder.hasArg() + .withArgName("size") + .withDescription + ("key size, in bits. (default = 1024)\n" + + "RSA|RSASHA1|RSAMD5: [512..4096]\n" + + "DSA: [512..1024]\n" + + "DH: [128..4096]") + .create('b')); + options.addOption(OptionBuilder.hasArg() + .withArgName("file") + .withLongOpt("output-file") + .withDescription + ("base filename for the public/private key files") + .create('f')); + options.addOption(OptionBuilder.hasArg() + .withLongOpt("keydir") + .withArgName("dir") + .withDescription + ("place generated key files in this directory") + .create('d')); + + return options; + } + + /** Print out the usage and help statements, then quit. */ + private static void usage(Options opts) + { + HelpFormatter f = new HelpFormatter(); + + PrintWriter out = new PrintWriter(System.err); + + // print our own usage statement: + f.printHelp(out, 75, "keyGen.sh [..options..] name", null, opts, + HelpFormatter.DEFAULT_LEFT_PAD, + HelpFormatter.DEFAULT_DESC_PAD, null); + + out.flush(); + System.exit(64); + } + + + public static void execute(CLIState state, Options opts) + throws Exception + { + JCEDnsSecSigner signer = new JCEDnsSecSigner(); + + // Minor hack to make the owner name absolute. + if (! state.owner.endsWith(".")) + { + state.owner = state.owner + "."; + } + + Name owner_name = Name.fromString(state.owner); + + // Calculate our flags + int flags = 0; + if (state.zoneKey) flags |= DNSKEYRecord.OWNER_ZONE; + if (state.kskFlag) flags |= DNSKEYRecord.FLAG_SEP; + + log.debug("create key pair with (name = " + owner_name + ", ttl = " + + state.ttl + ", alg = " + state.algorithm + ", flags = " + + flags + ", length = " + state.keylength + ")"); + + + DnsKeyPair pair = signer.generateKey(owner_name, + state.ttl, + DClass.IN, + state.algorithm, + flags, + state.keylength); + + if (state.outputfile != null) + { + BINDKeyUtils.writeKeyFiles(state.outputfile, pair, state.keydir); + } + else + { + BINDKeyUtils.writeKeyFiles(pair, state.keydir); + } + } + + public static void main(String[] args) + { + // set up logging. + // For now, we force the commons logging to use the built-in + // SimpleLog. + System.setProperty("org.apache.commons.logging.Log", + "org.apache.commons.logging.impl.SimpleLog"); + + // set up the command line options + Options opts = setupCLI(); + + CLIState state = new CLIState(); + + try + { + state.parseCommandLine(opts, args); + } + catch (UnrecognizedOptionException e) + { + System.err.println("error: unknown option encountered: " + + e.getMessage()); + usage(opts); + } + catch (AlreadySelectedException e) + { + System.err.println("error: mutually exclusive options have " + + "been selected:\n " + e.getMessage()); + usage(opts); + } + catch (Exception e) + { + System.err.println("error: unknown command line parsing exception:"); + e.printStackTrace(); + usage(opts); + } + + log = LogFactory.getLog(KeyGen.class); + + try + { + execute(state, opts); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/com/verisignlabs/dnssec/cl/SignZone.java b/src/com/verisignlabs/dnssec/cl/SignZone.java new file mode 100644 index 0000000..8884acb --- /dev/null +++ b/src/com/verisignlabs/dnssec/cl/SignZone.java @@ -0,0 +1,719 @@ +// $Id: SignZone.java,v 1.4 2004/01/16 17:57:47 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.cl; + +import java.util.*; +import java.io.*; +import java.text.SimpleDateFormat; +import java.text.ParseException; +import java.security.GeneralSecurityException; + +import org.xbill.DNS.*; + +import com.verisignlabs.dnssec.security.*; + +import org.apache.commons.cli.*; +import org.apache.commons.cli.Options; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** This class forms the command line implementation of a DNSSEC zone + * signer. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.4 $ + */ +public class SignZone +{ + private static Log log; + + /** This is a small inner class used to hold all of the command line + * option state. */ + private static class CLIState + { + private File keyDirectory = null; + public File keysetDirectory = null; + public String[] kskFiles = null; + public String[] keyFiles = null; + public String zonefile = null; + public Date start = null; + public Date expire = null; + public String outputfile = null; + public boolean verifySigs = false; + public boolean selfSignKeys = true; + public boolean useOptIn = false; + public boolean optInConserve = false; + public boolean fullySignKeyset = false; + public List includeNames = null; + + public CLIState() { } + + public void parseCommandLine(Options opts, String[] args) + throws org.apache.commons.cli.ParseException, ParseException, + IOException + { + CommandLineParser cli_parser = new PosixParser(); + CommandLine cli = cli_parser.parse(opts, args); + + String optstr = null; + + if (cli.hasOption('h')) usage(opts); + + if (cli.hasOption('v')) + { + int value = parseInt(cli.getOptionValue('v'), 5); + + switch (value) + { + case 0: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "fatal"); + break; + case 5: + default: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "debug"); + break; + case 6: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "trace"); + break; + } + } + + if (cli.hasOption('a')) verifySigs = true; + if (cli.hasOption('O')) useOptIn = true; + if (cli.hasOption('C')) + { + useOptIn = true; + optInConserve = true; + } + + if (cli.hasOption('F')) fullySignKeyset = true; + + if ((optstr = cli.getOptionValue('d')) != null) + { + keysetDirectory = new File(optstr); + if (! keysetDirectory.isDirectory()) + { + System.err.println("error: " + optstr + " is not a directory"); + usage(opts); + + } + } + + if ((optstr = cli.getOptionValue('D')) != null) + { + keyDirectory = new File(optstr); + if (! keyDirectory.isDirectory()) + { + System.err.println("error: " + optstr + " is not a directory"); + usage(opts); + } + } + + if ((optstr = cli.getOptionValue('s')) != null) + { + start = convertDuration(null, optstr); + } + else + { + // default is now - 1 hour. + start = new Date(System.currentTimeMillis() - (3600 * 1000)); + } + + if ((optstr = cli.getOptionValue('e')) != null) + { + expire = convertDuration(start, optstr); + } + else + { + expire = convertDuration(start, "+2592000"); // 30 days + } + + outputfile = cli.getOptionValue('f'); + + kskFiles = cli.getOptionValues('k'); + + if ((optstr = cli.getOptionValue('I')) != null) + { + File includeNamesFile = new File(optstr); + includeNames = getNameList(includeNamesFile); + } + + String[] files = cli.getArgs(); + + if (files.length < 2) + { + System.err.println("error: missing zone file and/or key files"); + usage(opts); + } + + zonefile = files[0]; + keyFiles = new String[files.length - 1]; + System.arraycopy(files, 1, keyFiles, 0, files.length - 1); + } + } + + /** This is just a convenience method for parsing integers from + * strings. + * + * @param s the string to parse. + * @param def the default value, if the string doesn't parse. + * @return the parsed integer, or the default. + */ + private static int parseInt(String s, int def) + { + try + { + int v = Integer.parseInt(s); + return v; + } + catch (NumberFormatException e) + { + return def; + } + } + + /** Verify the generated signatures. + * + * @param zonename the origin name of the zone. + * @param records a list of {@link org.xbill.DNS.Record}s. + * @param keypairs a list of keypairs used the sign the zone. + * @return true if all of the signatures validated. + */ + private static boolean verifyZoneSigs(Name zonename, List records, + List keypairs) + { + boolean secure = true; + + DnsSecVerifier verifier = new DnsSecVerifier(); + + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + verifier.addTrustedKey((DnsKeyPair) i.next()); + } + + verifier.setVerifyAllSigs(true); + + List rrsets = SignUtils.assembleIntoRRsets(records); + + for (Iterator i = rrsets.iterator(); i.hasNext(); ) + { + RRset rrset = (RRset) i.next(); + + // skip unsigned rrsets. + if (!rrset.sigs().hasNext()) continue; + + byte result = verifier.verify(rrset, null); + + if (result != DNSSEC.Secure) + { + log.debug("Signatures did not verify for RRset: (" + result + "): " + + rrset); + secure = false; + } + } + + return secure; + } + + /** Load the key pairs from the key files. + * + * @param keyfiles a string array containing the base names or + * paths of the keys to be loaded. + * @param start_index the starting index of keyfiles string array + * to use. This allows us to use the straight command line + * argument array. + * @param inDirectory the directory to look in (may be null). + * @return a list of keypair objects. + */ + private static List getKeys(String[] keyfiles, int start_index, + File inDirectory) + throws IOException + { + if (keyfiles == null) return null; + + int len = keyfiles.length - start_index; + if (len <= 0) return null; + + ArrayList keys = new ArrayList(len); + + for (int i = start_index; i < keyfiles.length; i++) + { + DnsKeyPair k = BINDKeyUtils.loadKeyPair(keyfiles[i], inDirectory); + if (k != null) keys.add(k); + } + + return keys; + } + + /** Load a single key from a given keyfile. + * + * @param keyfile the keyfile. + * @param inDirectory the default directory to look in (may be + * null). + * @return a list containing one or zero keypair objects. + */ + private static List getKeys(File keyfile, File inDirectory) + throws IOException + { + if (keyfile == null) return null; + + DnsKeyPair k = BINDKeyUtils.loadKeyPair(keyfile.getPath(), + inDirectory); + if (k != null) + { + ArrayList keys = new ArrayList(1); + keys.add(k); + return keys; + } + + return null; + } + + /** This is an implementation of a file filter used for finding BIND + * 9-style keyset-* files. */ + private static class KeysetFileFilter implements FileFilter + { + public boolean accept(File pathname) + { + if (! pathname.isFile()) return false; + String name = pathname.getName(); + if (name.startsWith("keyset-")) return true; + return false; + } + } + + /** Load keysets (which contain delegation point security info). + * + * @param inDirectory the directory to look for the keyset files + * (may be null, in which case it defaults to looking in the + * current working directory). + * @param zonename the name of the zone we are signing, so we can + * ignore keysets that do not belong in the zone. + * @return a list of {@link org.xbill.DNS.Record}s found in the + * keyset files. + */ + private static List getKeysets(File inDirectory, Name zonename) + throws IOException + { + if (inDirectory == null) + { + // FIXME: dunno how cross-platform this is + inDirectory = new File("."); + } + + // get the list of "keyset-" files. + FileFilter filter = new KeysetFileFilter(); + File[] files = inDirectory.listFiles(filter); + + // read in all of the records + ArrayList keysetRecords = new ArrayList(); + for (int i = 0; i < files.length; i++) + { + List l = ZoneUtils.readZoneFile(files[i].getAbsolutePath(), zonename); + keysetRecords.addAll(l); + } + + // discard records that do not belong to the zone in question. + for (Iterator i = keysetRecords.iterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + if (!r.getName().subdomain(zonename)) + { + i.remove(); + } + } + + return keysetRecords; + } + + /** Load a list of DNS names from a file. + * + * @param nameListFile the path of a file containing a bare list of + * DNS names. + * @return a list of {@link org.xbill.DNS.Name} objects. + */ + private static List getNameList(File nameListFile) + throws IOException + { + BufferedReader br = new BufferedReader(new FileReader(nameListFile)); + List res = new ArrayList(); + + String line = null; + while ( (line = br.readLine()) != null ) + { + try + { + Name n = Name.fromString(line); + // force the name to be absolute. + // FIXME: we should probably get some fancy logic here to + // detect if the name needs the origin appended, or just the + // root. + if (! n.isAbsolute()) n = Name.concatenate(n, Name.root); + + res.add(n); + } + catch (TextParseException e) + { + log.error("DNS Name parsing error", e); + } + } + + if (res.size() == 0) return null; + return res; + } + + /** Calculate a date/time from a command line time/offset duration string. + * + * @param start the start time to calculate offsets from. + * @param duration the time/offset string to parse. + * @return the calculated time. + */ + private static Date convertDuration(Date start, String duration) + throws ParseException + { + if (start == null) start = new Date(); + if (duration.startsWith("now")) + { + start = new Date(); + if (duration.indexOf("+") < 0) return start; + + duration = duration.substring(3); + } + + if (duration.startsWith("+")) + { + long offset = (long) parseInt(duration.substring(1), 0) * 1000; + return new Date(start.getTime() + offset); + } + + SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMddHHmmss"); + dateFormatter.setTimeZone(TimeZone.getTimeZone("GMT")); + return dateFormatter.parse(duration); + } + + /** Determine if the given keypairs can be used to sign the zone. + * @param zonename the zone origin. + * @param keypairs a list of {@link DnsKeyPair} objects that will + * be used to sign the zone. + * @return true if the keypairs valid. + */ + private static boolean keyPairsValidForZone(Name zonename, List keypairs) + { + if (keypairs == null) return true; // technically true, I guess. + + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + DnsKeyPair kp = (DnsKeyPair) i.next(); + Name keyname = kp.getDNSKEYRecord().getName(); + if (!keyname.equals(zonename)) + { + return false; + } + } + + return true; + } + + /** Set up the command line options. + * + * @return a set of command line options. + */ + private static Options setupCLI() + { + Options options = new Options(); + + // boolean options + options.addOption("h", "help", false, "Print this message."); + options.addOption("a", false, "verify generated signatures>"); + options.addOption("F", "fully-sign-keyset", false, + "sign the zone apex keyset with all " + + "available keys, instead of just key-signing-keys."); + + // Opt-In generation switches + OptionGroup opt_in_opts = new OptionGroup(); + opt_in_opts.addOption(new Option + ("O", "generate a fully Opt-In zone.")); + opt_in_opts.addOption(new Option + ("C", "generate a conservative Opt-In zone.")); + options.addOptionGroup(opt_in_opts); + + // Argument options + options.addOption(OptionBuilder.hasOptionalArg() + .withArgName("level") + .withDescription("verbosity level -- 0 is silence, " + + "5 is debug information, " + + "6 is trace information. " + + "No argument means 5.") + .create('v')); + options.addOption(OptionBuilder.hasArg() + .withArgName("dir") + .withLongOpt("keyset-directory") + .withDescription + ("directory to find keyset files (default '.').") + .create('d')); + options.addOption(OptionBuilder.hasArg() + .withArgName("dir") + .withLongOpt("key-directory") + .withDescription + ("directory to find key files (default '.').") + .create('D')); + options.addOption(OptionBuilder.hasArg() + .withArgName("time/offset") + .withLongOpt("start-time") + .withDescription + ("signature starting time (default is now - 1 hour)") + .create('s')); + options.addOption(OptionBuilder.hasArg() + .withArgName("time/offset") + .withLongOpt("expire-time") + .withDescription + ("signature expiration time (default is " + + "start-time + 30 days") + .create('e')); + options.addOption(OptionBuilder.hasArg() + .withArgName("outfile") + .withDescription("file the signed zone is written " + + "to (default is .signed).") + .create('f')); + options.addOption(OptionBuilder.hasArgs() + .withArgName("KSK file") + .withLongOpt("ksk-file") + .withDescription("this key is a key signing key " + + "(may repeat)") + .create('k')); + options.addOption(OptionBuilder.hasArg() + .withArgName("file") + .withLongOpt("include-file") + .withDescription("include names in this file " + + "in the NSEC chain") + .create('I')); + + return options; + } + + /** Print out the usage and help statements, then quit. */ + private static void usage(Options opts) + { + HelpFormatter f = new HelpFormatter(); + + PrintWriter out = new PrintWriter(System.err); + + // print our own usage statement: + out.println("usage: signZone.sh [..options..] zone_file [key_file ...] "); + f.printHelp(out, 75, "signZone.sh", null, opts, + HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD, + "\ntime/offset = YYYYMMDDHHmmss|+offset|\"now\"+offset\n"); + + out.flush(); + System.exit(64); + } + + + public static void execute(CLIState state, Options opts) + throws Exception + { + // Load the key pairs. + + // FIXME: should we do what BIND 9.3.x snapshots do and look at + // zone apex DNSKEY RRs, and from that be able to load all of the + // keys? + + List keypairs = getKeys(state.keyFiles, 0, state.keyDirectory); + List kskpairs = getKeys(state.kskFiles, 0, state.keyDirectory); + + // If we don't have any KSKs, but we do have more than one zone + // signing key (presumably), presume that the zone signing keys + // are just not differentiated and try to figure out which keys + // are actually ksks by looking at the SEP flag. + if ( (kskpairs == null || kskpairs.size() == 0) && + keypairs != null && keypairs.size() > 1) + { + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + DnsKeyPair pair = (DnsKeyPair) i.next(); + DNSKEYRecord kr = pair.getDNSKEYRecord(); + if ((kr.getFlags() & DNSKEYRecord.FLAG_SEP) != 0) + { + if (kskpairs == null) kskpairs = new ArrayList(); + kskpairs.add(pair); + i.remove(); + } + } + } + + // Read in the zone + List records = ZoneUtils.readZoneFile(state.zonefile, null); + if (records == null || records.size() == 0) + { + System.err.println("error: empty zone file"); + usage(opts); + } + + // calculate the zone name. + Name zonename = ZoneUtils.findZoneName(records); + if (zonename == null) + { + System.err.println("error: invalid zone file - no SOA"); + usage(opts); + } + + // default the output file, if not set. + if (state.outputfile == null) + { + if (zonename.isAbsolute()) + { + state.outputfile = zonename + "signed"; + } + else + { + state.outputfile = zonename + ".signed"; + } + } + + // Verify that the keys can be in the zone. + List kpairs = keypairs; + + if (!keyPairsValidForZone(zonename, keypairs) || + !keyPairsValidForZone(zonename, kskpairs)) + { + usage(opts); + } + + // We force the signing keys to be in the zone by just appending + // them to the zone here. Currently JCEDnsSecSigner.signZone + // removes duplicate records. + if (kskpairs != null) + { + for (Iterator i = kskpairs.iterator(); i.hasNext(); ) + { + records.add( ((DnsKeyPair) i.next()).getDNSKEYRecord() ); + } + } + if (keypairs != null) + { + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + records.add( ((DnsKeyPair) i.next()).getDNSKEYRecord() ); + } + } + + // read in the keysets, if any. + List keysetrecs = getKeysets(state.keysetDirectory, zonename); + if (keysetrecs != null) + { + records.addAll(keysetrecs); + } + + JCEDnsSecSigner signer = new JCEDnsSecSigner(); + + // Sign the zone. + List signed_records = signer.signZone(zonename, + records, + kskpairs, + keypairs, + state.start, + state.expire, + state.useOptIn, + state.optInConserve, + state.fullySignKeyset, + state.includeNames); + + // write out the signed zone + // force multiline mode for now + org.xbill.DNS.Options.set("multiline"); + ZoneUtils.writeZoneFile(signed_records, state.outputfile); + + if (state.verifySigs) + { + // FIXME: ugh. + if (kskpairs != null) + { + keypairs.addAll(kskpairs); + } + + log.debug("verifying generated signatures"); + boolean res = verifyZoneSigs(zonename, signed_records, keypairs); + + if (res) + { + System.out.println("Generated signatures verified"); + // log.info("Generated signatures verified"); + } + else + { + System.out.println("Generated signatures did not verify."); + // log.warn("Generated signatures did not verify."); + } + } + + } + + public static void main(String[] args) + { + // set up logging. + // For now, we force the commons logging to use the built-in + // SimpleLog. + System.setProperty("org.apache.commons.logging.Log", + "org.apache.commons.logging.impl.SimpleLog"); + + // set up the command line options + Options opts = setupCLI(); + + CLIState state = new CLIState(); + try + { + state.parseCommandLine(opts, args); + } + catch (UnrecognizedOptionException e) + { + System.err.println("error: unknown option encountered: " + + e.getMessage()); + usage(opts); + } + catch (AlreadySelectedException e) + { + System.err.println("error: mutually exclusive options have " + + "been selected:\n " + e.getMessage()); + usage(opts); + } + catch (Exception e) + { + System.err.println("error: unknown command line parsing exception:"); + e.printStackTrace(); + usage(opts); + } + + log = LogFactory.getLog(SignZone.class); + + try + { + execute(state, opts); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/com/verisignlabs/dnssec/cl/VerifyZone.java b/src/com/verisignlabs/dnssec/cl/VerifyZone.java new file mode 100644 index 0000000..7586ec7 --- /dev/null +++ b/src/com/verisignlabs/dnssec/cl/VerifyZone.java @@ -0,0 +1,331 @@ +// $Id: VerifyZone.java,v 1.1 2004/01/16 17:57:59 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.cl; + +import java.util.*; +import java.io.*; +import java.text.SimpleDateFormat; +import java.text.ParseException; +import java.security.GeneralSecurityException; + +import org.xbill.DNS.*; + +import com.verisignlabs.dnssec.security.*; + +import org.apache.commons.cli.*; +import org.apache.commons.cli.Options; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** This class forms the command line implementation of a DNSSEC zone + * validator. + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.1 $ + */ +public class VerifyZone +{ + private static Log log; + + /** This is a small inner class used to hold all of the command line + * option state. */ + private static class CLIState + { + + public boolean strict = false; + public File keydir = null; + public String zonefile = null; + public String[] keyfiles = null; + + public CLIState() { } + + public void parseCommandLine(Options opts, String[] args) + throws org.apache.commons.cli.ParseException, ParseException, + IOException + { + CommandLineParser cli_parser = new PosixParser(); + CommandLine cli = cli_parser.parse(opts, args); + + String optstr = null; + + if (cli.hasOption('h')) usage(opts); + + if (cli.hasOption('v')) + { + int value = parseInt(cli.getOptionValue('v'), 5); + + switch (value) + { + case 0: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "fatal"); + break; + case 5: + default: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "debug"); + break; + case 6: + System.setProperty("org.apache.commons.logging.simplelog.defaultlog", + "trace"); + break; + } + } + + if (cli.hasOption('s')) strict = true; + + if ((optstr = cli.getOptionValue('d')) != null) + { + keydir = new File(optstr); + } + + + String[] cl_args = cli.getArgs(); + + if (cl_args.length < 1) + { + System.err.println("error: missing zone file"); + usage(opts); + } + + zonefile = cl_args[0]; + + if (cl_args.length < 2) + { + System.err.println("error: at least one trusted key is required"); + usage(opts); + } + + keyfiles = new String[cl_args.length - 1]; + System.arraycopy(cl_args, 1, keyfiles, 0, keyfiles.length); + } + } + + /** This is just a convenience method for parsing integers from + * strings. + * + * @param s the string to parse. + * @param def the default value, if the string doesn't parse. + * @return the parsed integer, or the default. + */ + private static int parseInt(String s, int def) + { + try + { + int v = Integer.parseInt(s); + return v; + } + catch (NumberFormatException e) + { + return def; + } + } + + /** Set up the command line options. + * + * @return a set of command line options. + */ + private static Options setupCLI() + { + Options options = new Options(); + + // boolean options + options.addOption("h", "help", false, "Print this message."); + options.addOption("s", "strict", false, + "Zone will only be considered valid if all " + + "signatures could be cryptographically verified"); + + // Argument options + options.addOption(OptionBuilder.hasArg() + .withLongOpt("keydir") + .withArgName("dir") + .withDescription("directory to find trusted key files") + .create('d')); + + options.addOption(OptionBuilder.hasOptionalArg() + .withLongOpt("verbose") + .withArgName("level") + .withDescription("verbosity level -- 0 is silence, " + + "5 is debug information, " + + "6 is trace information.\n" + + "default is level 5.") + .create('v')); + + return options; + } + + /** Print out the usage and help statements, then quit. */ + private static void usage(Options opts) + { + HelpFormatter f = new HelpFormatter(); + + PrintWriter out = new PrintWriter(System.err); + + // print our own usage statement: + f.printHelp(out, 75, + "verifyZone.sh [..options..] zonefile " + + "keyfile [keyfile...]", null, opts, + HelpFormatter.DEFAULT_LEFT_PAD, + HelpFormatter.DEFAULT_DESC_PAD, null); + + out.flush(); + System.exit(64); + } + + + private static byte verifyZoneSignatures(List records, List keypairs) + { + // Zone is secure until proven otherwise. + byte result = DNSSEC.Secure; + + DnsSecVerifier verifier = new DnsSecVerifier(); + + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + verifier.addTrustedKey((DnsKeyPair) i.next()); + } + + List rrsets = SignUtils.assembleIntoRRsets(records); + + for (Iterator i = rrsets.iterator(); i.hasNext(); ) + { + RRset rrset = (RRset) i.next(); + + // We verify each signature separately so that we can report + // which exact signature failed. + for (Iterator j = rrset.sigs(); j.hasNext(); ) + { + Object o = j.next(); + if (! (o instanceof RRSIGRecord)) + { + log.debug("found " + o + " where expecting a RRSIG"); + continue; + } + RRSIGRecord sigrec = (RRSIGRecord) o; + + byte res = verifier.verifySignature(rrset, sigrec, null); + if (res != DNSSEC.Secure) + { + log.info("Signature failed to verify RRset: " + rrset + "\nsig: " + sigrec); + } + if (res < result) result = res; + } + } + + return result; + } + + private static List getTrustedKeys(String[] keyfiles, File inDirectory) + throws IOException + { + if (keyfiles == null) return null; + + List keys = new ArrayList(keyfiles.length); + + for (int i = 0; i < keyfiles.length; i++) + { + DnsKeyPair pair = BINDKeyUtils.loadKeyPair(keyfiles[i], inDirectory); + if (pair != null) keys.add(pair); + } + + return keys; + } + + public static void execute(CLIState state, Options opts) + throws Exception + { + + List keypairs = getTrustedKeys(state.keyfiles, state.keydir); + + List records = ZoneUtils.readZoneFile(state.zonefile, null); + Collections.sort(records, new RecordComparator()); + + log.debug("verifying signatures..."); + byte result = verifyZoneSignatures(records, keypairs); + log.debug("completed verification process."); + + switch (result) + { + case DNSSEC.Failed: + System.out.println("zone did not verify."); + System.exit(1); + break; + case DNSSEC.Insecure: + if (state.strict) + { + System.out.println("zone did not verify."); + System.exit(1); + } + case DNSSEC.Secure: + System.out.println("zone verified."); + break; + } + System.exit(0); + } + + public static void main(String[] args) + { + // set up logging. + // For now, we force the commons logging to use the built-in + // SimpleLog. + System.setProperty("org.apache.commons.logging.Log", + "org.apache.commons.logging.impl.SimpleLog"); + + // set up the command line options + Options opts = setupCLI(); + + CLIState state = new CLIState(); + + try + { + state.parseCommandLine(opts, args); + } + catch (UnrecognizedOptionException e) + { + System.err.println("error: unknown option encountered: " + + e.getMessage()); + usage(opts); + } + catch (AlreadySelectedException e) + { + System.err.println("error: mutually exclusive options have " + + "been selected:\n " + e.getMessage()); + usage(opts); + } + catch (Exception e) + { + System.err.println("error: unknown command line parsing exception:"); + e.printStackTrace(); + usage(opts); + } + + log = LogFactory.getLog(VerifyZone.class); + + try + { + execute(state, opts); + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/com/verisignlabs/dnssec/cl/package.html b/src/com/verisignlabs/dnssec/cl/package.html new file mode 100644 index 0000000..a240662 --- /dev/null +++ b/src/com/verisignlabs/dnssec/cl/package.html @@ -0,0 +1,33 @@ + + +java-dnssec-tools is a collection of Java-based command line tools for +managing DNSSEC zones and keys. +

+ +

+ + +
+ +Copyright © 2003 Verisign, Inc. by +David Blacka

+ +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version.

+ +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details.

+ +You should have received a copy of the +GNU Library General Public License +along with this library; if not, write to the +Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +

+

+ + diff --git a/src/com/verisignlabs/dnssec/security/BINDKeyUtils.java b/src/com/verisignlabs/dnssec/security/BINDKeyUtils.java new file mode 100644 index 0000000..b04f956 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/BINDKeyUtils.java @@ -0,0 +1,398 @@ +// $Id: BINDKeyUtils.java,v 1.5 2004/02/25 20:46:14 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.security; + +import java.io.*; +import java.security.*; +import java.text.NumberFormat; + +import org.xbill.DNS.*; +import org.xbill.DNS.utils.base64; + +/** This class contains a series of static methods used for + * manipulating BIND 9.x.x-style DNSSEC key files. + * + * In this class, the "base" key path or name is the file name + * without the trailing ".key" or ".private". + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.5 $ + */ +public class BINDKeyUtils +{ + // formatters used to generated the BIND key file names + private static NumberFormat mAlgNumberFormatter; + private static NumberFormat mKeyIdNumberFormatter; + + /** Calculate the BIND9 key file base name (i.e., without the ".key" + * or ".private" extensions) */ + private static String getKeyFileBase(Name signer, int algorithm, + int keyid) + { + if (mAlgNumberFormatter == null) + { + mAlgNumberFormatter = NumberFormat.getNumberInstance(); + mAlgNumberFormatter.setMaximumIntegerDigits(3); + mAlgNumberFormatter.setMinimumIntegerDigits(3); + } + if (mKeyIdNumberFormatter == null) + { + mKeyIdNumberFormatter = NumberFormat.getNumberInstance(); + mKeyIdNumberFormatter.setMaximumIntegerDigits(5); + mKeyIdNumberFormatter.setMinimumIntegerDigits(5); + mKeyIdNumberFormatter.setGroupingUsed(false); + + } + + keyid &= 0xFFFF; + + String fn = "K" + signer + "+" + + mAlgNumberFormatter.format(algorithm) + + "+" + + mKeyIdNumberFormatter.format(keyid); + + return fn; + } + + /** Reads in the KEYRecord from the public key file */ + private static DNSKEYRecord loadPublicKeyFile(File publicKeyFile) + throws IOException + { + Master m = new Master(publicKeyFile.getAbsolutePath(), null, 600); + + Record r; + DNSKEYRecord result = null; + + while ( (r = m.nextRecord()) != null ) + { + if (r.getType() == Type.DNSKEY) + { + result = (DNSKEYRecord) r; + } + } + + return result; + } + + /** Reads in the private key verbatim from the private key file */ + private static String loadPrivateKeyFile(File privateKeyFile) + throws IOException + { + BufferedReader in = new BufferedReader(new FileReader(privateKeyFile)); + StringBuffer key_buf = new StringBuffer(); + + String line; + + while ( (line = in.readLine()) != null) + { + key_buf.append(line); + key_buf.append('\n'); + } + + return key_buf.toString().trim(); + } + + /** Given an actual path for one of the key files, return the base + * name */ + private static String fixKeyFileBasePath(String basePath) + { + if (basePath == null) throw new IllegalArgumentException(); + if (basePath.endsWith(".key") || + basePath.endsWith(".private")) + { + basePath = basePath.substring + (0, basePath.lastIndexOf(".")); + } + + return basePath; + } + + /** Given the information necessary to construct the path to a BIND9 + * generated key pair, load the key pair. + * + * @param signer the DNS name of the key. + * @param algorithm the DNSSEC algorithm of the key. + * @param keyid the DNSSEC key footprint. + * @param inDirectory the directory to look for the files (may be + * null). + * @return the loaded key pair. + * @throws IOException if there was a problem reading the BIND9 + * files. */ + public static DnsKeyPair loadKeyPair(Name signer, int algorithm, + int keyid, File inDirectory) + throws IOException + { + String keyFileBase = getKeyFileBase(signer, algorithm, keyid); + + return loadKeyPair(keyFileBase, inDirectory); + } + + /** Given a base path to a BIND9 key pair, load the key pair. + * + * @param keyFileBasePath the base filename (or real filename for + * either the public or private key) of the key. + * @param inDirectory the directory to look in, if the + * keyFileBasePath is relative. + * @return the loaded key pair. + * @throws IOException if there was a problem reading the files */ + public static DnsKeyPair loadKeyPair(String keyFileBasePath, + File inDirectory) + throws IOException + { + keyFileBasePath = fixKeyFileBasePath(keyFileBasePath); + // FIXME: should we throw the IOException when one of the files + // cannot be found, or just when both cannot be found? + File publicKeyFile = new File(inDirectory, keyFileBasePath + ".key"); + File privateKeyFile = new File(inDirectory, keyFileBasePath + ".private"); + + DnsKeyPair kp = new DnsKeyPair(); + + DNSKEYRecord kr = loadPublicKeyFile(publicKeyFile); + kp.setDNSKEYRecord(kr); + + String pk = loadPrivateKeyFile(privateKeyFile); + kp.setPrivateKeyString(pk); + + return kp; + } + + /** Given a base path to a BIND9 key pair, load the public part + * (only) of the key pair + * + * @param keyFileBasePath the base or real path to the public part + * of a key pair. + * @param inDirectory the directory to look in if the path is + * relative (may be null). + * @return a {@link DnsKeyPair} containing just the public key + * information. + * @throws IOException if there was a problem reading the public + * key file. + */ + public static DnsKeyPair loadKey(String keyFileBasePath, File inDirectory) + throws IOException + { + keyFileBasePath = fixKeyFileBasePath(keyFileBasePath); + File publicKeyFile = new File(inDirectory, keyFileBasePath + ".key"); + + DnsKeyPair kp = new DnsKeyPair(); + + DNSKEYRecord kr = loadPublicKeyFile(publicKeyFile); + kp.setDNSKEYRecord(kr); + + return kp; + } + + /** Load a BIND keyset file. The BIND 9 dnssec tools typically call + * these files "keyset-[signer]." where [signer] is the DNS owner + * name of the key. The keyset may be signed, but doesn't have to + * be. + * + * @param keysetFileName the name of the keyset file. + * @param inDirectory the directory to look in if the path is + * relative (may be null, defaults to the current working + * directory). + * @return a RRset contain the KEY records and any associated SIG records. + * @throws IOException if there was a problem reading the keyset + * file. + */ + public static RRset loadKeySet(String keysetFileName, File inDirectory) + throws IOException + { + File keysetFile = new File(inDirectory, keysetFileName); + + Master m = new Master(keysetFile.getAbsolutePath()); + + Record r; + RRset keyset = new RRset(); + while ( (r = m.nextRecord()) != null ) + { + keyset.addRR(r); + } + + return keyset; + } + + /** Calculate the key file base for this key pair. + * + * @param pair the {@link DnsKeyPair} to work from. It only needs a public + * key. + * @return the base name of the key files. + */ + public static String keyFileBase(DnsKeyPair pair) + { + DNSKEYRecord keyrec = pair.getDNSKEYRecord(); + if (keyrec == null) return null; + + return getKeyFileBase(keyrec.getName(), + keyrec.getAlgorithm(), + keyrec.getFootprint()); + } + + + /** @return a {@link java.io.File} object representing the BIND9 + * public key file. */ + public static File getPublicKeyFile(DnsKeyPair pair, File inDirectory) + { + String keyfilebase = keyFileBase(pair); + if (keyfilebase == null) return null; + + return new File(inDirectory, keyfilebase + ".key"); + } + + /** @return a {@link java.io.File} object representing the BIND9 + * private key file */ + public static File getPrivateKeyFile(DnsKeyPair pair, File inDirectory) + { + String keyfilebase = keyFileBase(pair); + if (keyfilebase == null) return null; + + return new File(inDirectory, keyfilebase + ".private"); + } + + /** Given a the contents of a BIND9 private key file, convert it + * into a native {@link java.security.PrivateKey} object. + * @param privateKeyString the contents of a BIND9 key file in + * string form. + * @return a {@link java.security.PrivateKey} + */ + public static PrivateKey convertPrivateKeyString(String privateKeyString) + { + if (privateKeyString == null) return null; + + // FIXME: should this swallow exceptions or actually propagate + // them? + try + { + DnsKeyConverter conv = new DnsKeyConverter(); + return conv.parsePrivateKeyString(privateKeyString); + } + catch (IOException e) + { + e.printStackTrace(); + } + catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } + + return null; + } + + /** Given a native private key, convert it into a BIND9 private key + * file format. + * @param priv the private key to convert. + * @param pub the private key's corresponding public key. Some + * algorithms require information from both. + * @return a string containing the contents of a BIND9 private key + * file. + */ + public static String convertPrivateKey(PrivateKey priv, PublicKey pub, + int alg) + { + if (priv != null) + { + // debug + // System.out.println("converting from privatekey to bind9 string"); + DnsKeyConverter keyconv = new DnsKeyConverter(); + String priv_string + = keyconv.generatePrivateKeyString(priv, pub, alg); + + return priv_string; + } + + return null; + } + + + /** Convert the KEY record to the exact string format that the + * dnssec-* routines need. Currently, the DNSJAVA package uses a + * multiline mode for its record formatting. The BIND9 tools + * require everything on a single line. */ + private static String DNSKEYtoString(DNSKEYRecord rec) + { + StringBuffer buf = new StringBuffer(); + + buf.append(rec.getName()); + buf.append(" IN DNSKEY "); + buf.append(rec.getFlags() & 0xFFFF); + buf.append(" "); + buf.append(rec.getProtocol()); + buf.append(" "); + buf.append(rec.getAlgorithm()); + buf.append(" "); + buf.append(base64.toString(rec.getKey())); + + return buf.toString(); + } + + /** This routine will write out the BIND9 dnssec-* tool compatible + * files. + * + * @param baseFileName use this base file name. If null, the + * standard BIND9 base file name will be computed. + * @param pair the keypair in question. + * @param inDirectory the directory to write to (may be null). + * @throws IOException if there is a problem writing the files. + */ + public static void writeKeyFiles(String baseFileName, DnsKeyPair pair, + File inDirectory) + throws IOException + { + DNSKEYRecord pub = pair.getDNSKEYRecord(); + String priv = pair.getPrivateKeyString(); + + if (priv == null) + { + priv = convertPrivateKey(pair.getPrivate(), pair.getPublic(), + pair.getDNSKEYAlgorithm()); + } + + if (pub == null || priv == null) return; + + // Write the public key file + File pubkeyfile = new File(inDirectory, baseFileName + ".key"); + PrintWriter out + = new PrintWriter(new FileWriter(pubkeyfile)); + out.println(DNSKEYtoString(pub)); + out.close(); + + // Write the private key file + File privkeyfile = new File(inDirectory, baseFileName + ".private"); + out = new PrintWriter(new FileWriter(privkeyfile)); + out.print(priv); + out.close(); + + } + + /** This routine will write out the BIND9 dnssec-* tool compatible + * files to the standard file names. + * + * @param pair the key pair in question. + * @param inDirectory the directory to write to (may be null). + */ + public static void writeKeyFiles(DnsKeyPair pair, File inDirectory) + throws IOException + { + String base = keyFileBase(pair); + writeKeyFiles(base, pair, inDirectory); + } + +} diff --git a/src/com/verisignlabs/dnssec/security/ByteArrayComparator.java b/src/com/verisignlabs/dnssec/security/ByteArrayComparator.java new file mode 100644 index 0000000..ca3a6ac --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/ByteArrayComparator.java @@ -0,0 +1,66 @@ +// $Id: ByteArrayComparator.java,v 1.2 2004/02/25 20:46:14 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.verisignlabs.dnssec.security; + +import java.util.*; + + +/** This class implements a basic comparitor for byte arrays. It is + * primarily useful for comparing RDATA portions of DNS records in + * doing DNSSEC canonical ordering. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.2 $ + */ +public class ByteArrayComparator implements Comparator +{ + private int mOffset = 0; + private boolean mDebug = false; + + public ByteArrayComparator() + {} + + public ByteArrayComparator(int offset, boolean debug) + { + mOffset = offset; + mDebug = debug; + } + + public int compare(Object o1, Object o2) throws ClassCastException + { + byte[] b1 = (byte[]) o1; + byte[] b2 = (byte[]) o2; + + for (int i = mOffset; i < b1.length && i < b2.length; i++) + { + if (b1[i] != b2[i]) + { + if (mDebug) + { + System.out.println("offset " + i + " differs (this is " + + (i - mOffset) +" bytes in from our offset.)"); + } + return (b1[i] & 0xFF) - (b2[i] & 0xFF); + } + } + + return b1.length - b2.length; + } +} diff --git a/src/com/verisignlabs/dnssec/security/DnsKeyConverter.java b/src/com/verisignlabs/dnssec/security/DnsKeyConverter.java new file mode 100644 index 0000000..2587f63 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/DnsKeyConverter.java @@ -0,0 +1,471 @@ +// $Id: DnsKeyConverter.java,v 1.4 2004/02/23 15:06:15 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.verisignlabs.dnssec.security; + +import java.io.*; +import java.util.StringTokenizer; +import java.math.BigInteger; +import java.security.*; +import java.security.spec.*; +import javax.crypto.spec.DHPrivateKeySpec; +import javax.crypto.spec.DHParameterSpec; +import javax.crypto.interfaces.DHPrivateKey; +import javax.crypto.interfaces.DHPublicKey; +import java.security.interfaces.*; + +import org.xbill.DNS.*; +import org.xbill.DNS.security.KEYConverter; +import org.xbill.DNS.utils.base64; + +/** This class handles conversions between JCA key formats and DNSSEC + * and BIND9 key formats. + * + * @author David Blacka (original) + * @author $Author: davidb $ (latest) + * @version $Revision: 1.4 $ + */ +public class DnsKeyConverter +{ + private KeyFactory mRSAKeyFactory; + private KeyFactory mDSAKeyFactory; + private KeyFactory mDHKeyFactory; + + public DnsKeyConverter() + { + } + + /** Given a DNS KEY record, return the JCA public key */ + public PublicKey parseDNSKEYRecord(DNSKEYRecord pKeyRecord) + { + if (pKeyRecord.getKey() == null) return null; + + return KEYConverter.parseRecord(pKeyRecord); + } + + /** Given a JCA public key and the ancillary data, generate a DNSKEY + * record. */ + public DNSKEYRecord generateDNSKEYRecord(Name name, + int dclass, + long ttl, + int flags, + int alg, + PublicKey key) + { + // FIXME: currenty org.xbill.DNS.security.KEYConverter will only + // convert to KEYRecords, and even then, assume that an RSA + // PublicKey means alg 1. + KEYRecord kr = KEYConverter.buildRecord(name, dclass, ttl, flags, + KEYRecord.PROTOCOL_DNSSEC, key); + + return new DNSKEYRecord(name, dclass, ttl, flags, + DNSKEYRecord.Protocol.DNSSEC, alg, + kr.getKey()); + } + + + // Private Key Specific Parsing routines + + /** Convert a PKCS#8 encoded private key into a PrivateKey + * object. */ + public PrivateKey convertEncodedPrivateKey(byte[] key, int algorithm) + { + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(key); + + try + { + switch (algorithm) + { + case DNSSEC.RSAMD5: + case DNSSEC.RSASHA1: + return mRSAKeyFactory.generatePrivate(spec); + case DNSSEC.DSA: + return mDSAKeyFactory.generatePrivate(spec); + } + } + catch (GeneralSecurityException e) + { + } + + return null; + } + + /** @return a JCA private key, given a BIND9-style textual + * encoding */ + public PrivateKey parsePrivateKeyString(String key) + throws IOException, NoSuchAlgorithmException + { + StringTokenizer lines = new StringTokenizer(key, "\n"); + + while (lines.hasMoreTokens()) + { + String line = lines.nextToken(); + if (line == null) continue; + + if (line.startsWith("#")) continue; + + String val = value(line); + if (val == null) continue; + + if (line.startsWith("Private-key-format: ")) + { + if (! val.equals("v1.2")) + { + throw new IOException("unsupported private key format: " + val); + } + } + else if (line.startsWith("Algorithm: ")) + { + if (val.startsWith("1 ")) return parsePrivateRSA(lines); + if (val.startsWith("5 ")) return parsePrivateRSA(lines); + if (val.startsWith("2 ")) return parsePrivateDH(lines); + if (val.startsWith("3 ")) return parsePrivateDSA(lines); + throw new IOException("unsupported private key algorithm: " + val); + } + } + return null; + } + + /** @return the value part of an "attribute:value" pair. The value + * is trimmed. */ + private String value(String av) + { + if (av == null) return null; + + int pos = av.indexOf(':'); + if (pos < 0) return av; + + if (pos >= av.length()) return null; + + return av.substring(pos + 1).trim(); + } + + /** prints the bytes of an original byte array and the BigInteger + * copy */ + private void printBigIntCompare(byte[] orig, BigInteger copy) + { + byte[] copy_bytes = copy.toByteArray(); + + for (int i = 0; i < 10 && i < orig.length; i++) { + System.err.print((int) orig[i] & 0xFF); + System.err.print(" "); + } + System.err.println(); + + for (int i = 0; i < 10 && i < copy_bytes.length; i++) { + System.err.print((int) copy_bytes[i] & 0xFF); + System.err.print(" "); + } + System.err.println(); + } + + /** Given the rest of the RSA BIND9 string format private key, parse + * and translate into a JCA private key + * + * @throws NoSuchAlgorithmException if the RSA algorithm is not + * available. */ + private PrivateKey parsePrivateRSA(StringTokenizer lines) + throws NoSuchAlgorithmException + { + BigInteger modulus = null; + BigInteger public_exponent = null; + BigInteger private_exponent = null; + BigInteger prime_p = null; + BigInteger prime_q = null; + BigInteger prime_p_exponent = null; + BigInteger prime_q_exponent = null; + BigInteger coefficient = null; + + while (lines.hasMoreTokens()) + { + String line = lines.nextToken(); + if (line == null) continue; + + if (line.startsWith("#")) continue; + + String val = value(line); + if (val == null) continue; + + byte[] data = base64.fromString(val); + + if (line.startsWith("Modulus: ")) { + modulus = new BigInteger(1, data); + // printBigIntCompare(data, modulus); + } else if (line.startsWith("PublicExponent: ")) { + public_exponent = new BigInteger(1, data); + // printBigIntCompare(data, public_exponent); + } else if (line.startsWith("PrivateExponent: ")) { + private_exponent = new BigInteger(1, data); + // printBigIntCompare(data, private_exponent); + } else if (line.startsWith("Prime1: ")) { + prime_p = new BigInteger(1, data); + // printBigIntCompare(data, prime_p); + } else if (line.startsWith("Prime2: ")) { + prime_q = new BigInteger(1, data); + // printBigIntCompare(data, prime_q); + } else if (line.startsWith("Exponent1: ")) { + prime_p_exponent = new BigInteger(1, data); + } else if (line.startsWith("Exponent2: ")) { + prime_q_exponent = new BigInteger(1, data); + } else if (line.startsWith("Coefficient: ")) { + coefficient = new BigInteger(1, data); + } + } + + try + { + KeySpec spec = new RSAPrivateCrtKeySpec(modulus, public_exponent, + private_exponent, prime_p, + prime_q, prime_p_exponent, + prime_q_exponent, coefficient); + if (mRSAKeyFactory == null) + { + mRSAKeyFactory = KeyFactory.getInstance("RSA"); + } + return mRSAKeyFactory.generatePrivate(spec); + } + catch (InvalidKeySpecException e) + { + e.printStackTrace(); + return null; + } + } + + /** Given the remaining lines in a BIND9 style DH private key, parse + * the key info and translate it into a JCA private key. + * + * @throws NoSuchAlgorithmException if the DH algorithm is not + * available. */ + private PrivateKey parsePrivateDH(StringTokenizer lines) + throws NoSuchAlgorithmException + { + BigInteger p = null; + BigInteger x = null; + BigInteger g = null; + + while (lines.hasMoreTokens()) + { + String line = lines.nextToken(); + if (line == null) continue; + + if (line.startsWith("#")) continue; + + String val = value(line); + if (val == null) continue; + + byte[] data = base64.fromString(val); + + if (line.startsWith("Prime(p): ")) { + p = new BigInteger(1, data); + } else if (line.startsWith("Generator(g): ")) { + g = new BigInteger(1, data); + } else if (line.startsWith("Private_value(x): ")) { + x = new BigInteger(1, data); + } + } + + try + { + KeySpec spec = new DHPrivateKeySpec(x, p, g); + if (mDHKeyFactory == null) + { + mDHKeyFactory = KeyFactory.getInstance("DH"); + } + return mDHKeyFactory.generatePrivate(spec); + } + catch (InvalidKeySpecException e) + { + e.printStackTrace(); + return null; + } + } + + /** Given the remaining lines in a BIND9 style DSA private key, + * parse the key info and translate it into a JCA private key. + * + * @throws NoSuchAlgorithmException if the DSA algorithm is not + * available. */ + private PrivateKey parsePrivateDSA(StringTokenizer lines) + throws NoSuchAlgorithmException + { + BigInteger p = null; + BigInteger q = null; + BigInteger g = null; + BigInteger x = null; + + while (lines.hasMoreTokens()) + { + String line = lines.nextToken(); + if (line == null) continue; + + if (line.startsWith("#")) continue; + + String val = value(line); + if (val == null) continue; + + byte[] data = base64.fromString(val); + + if (line.startsWith("Prime(p): ")) { + p = new BigInteger(1, data); + } else if (line.startsWith("Subprime(q): ")) { + q = new BigInteger(1, data); + } else if (line.startsWith("Base(g): ")) { + g = new BigInteger(1, data); + } else if (line.startsWith("Private_value(x): ")) { + x = new BigInteger(1, data); + } + } + + try + { + KeySpec spec = new DSAPrivateKeySpec(x, p, q, g); + if (mDSAKeyFactory == null) + { + mDSAKeyFactory = KeyFactory.getInstance("DSA"); + } + return mDSAKeyFactory.generatePrivate(spec); + } + catch (InvalidKeySpecException e) + { + e.printStackTrace(); + return null; + } + } + + /** Given a private key and public key, generate the BIND9 style + * private key format. */ + public String generatePrivateKeyString(PrivateKey priv, PublicKey pub, + int alg) + { + if (priv instanceof RSAPrivateCrtKey) + { + return generatePrivateRSA((RSAPrivateCrtKey) priv, alg); + } + else if (priv instanceof DSAPrivateKey && + pub instanceof DSAPublicKey) + { + return generatePrivateDSA((DSAPrivateKey) priv, (DSAPublicKey) pub); + } + else if (priv instanceof DHPrivateKey && + pub instanceof DHPublicKey) + { + return generatePrivateDH((DHPrivateKey) priv, (DHPublicKey) pub); + } + + return null; + } + + /** Convert from 'unsigned' big integer to original 'signed format' + * in Base64 */ + private String b64BigInt(BigInteger i) + { + byte[] orig_bytes = i.toByteArray(); + + if (orig_bytes[0] != 0 || orig_bytes.length == 1) + { + return base64.toString(orig_bytes); + } + + byte[] signed_bytes = new byte[orig_bytes.length - 1]; + System.arraycopy(orig_bytes, 1, signed_bytes, 0, signed_bytes.length); + + return base64.toString(signed_bytes); + } + + /** Given a RSA private key (in Crt format), return the BIND9-style + * text encoding. */ + private String generatePrivateRSA(RSAPrivateCrtKey key, int algorithm) + { + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + + out.println("Private-key-format: v1.2"); + if (algorithm == DNSSEC.RSAMD5) + { + out.println("Algorithm: 1 (RSAMD5)"); + } + else + { + out.println("Algorithm: 5 (RSASHA1)"); + } + out.print("Modulus: "); + out.println(b64BigInt(key.getModulus())); + out.print("PublicExponent: "); + out.println(b64BigInt(key.getPublicExponent())); + out.print("PrivateExponent: "); + out.println(b64BigInt(key.getPrivateExponent())); + out.print("Prime1: "); + out.println(b64BigInt(key.getPrimeP())); + out.print("Prime2: "); + out.println(b64BigInt(key.getPrimeQ())); + out.print("Exponent1: "); + out.println(b64BigInt(key.getPrimeExponentP())); + out.print("Exponent2: "); + out.println(b64BigInt(key.getPrimeExponentQ())); + out.print("Coefficient: "); + out.println(b64BigInt(key.getCrtCoefficient())); + + return sw.toString(); + } + + /** Given a DH key pair, return the BIND9-style text encoding */ + private String generatePrivateDH(DHPrivateKey key, DHPublicKey pub) + { + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + + DHParameterSpec p = key.getParams(); + + out.println("Private-key-format: v1.2"); + out.println("Algorithm: 2 (DH)"); + out.print("Prime(p): "); + out.println(b64BigInt(p.getP())); + out.print("Generator(g): "); + out.println(b64BigInt(p.getG())); + out.print("Private_value(x): "); + out.println(b64BigInt(key.getX())); + out.print("Public_value(y): "); + out.println(b64BigInt(pub.getY())); + + return sw.toString(); + } + + /** Given a DSA key pair, return the BIND9-style text encoding */ + private String generatePrivateDSA(DSAPrivateKey key, DSAPublicKey pub) + { + StringWriter sw = new StringWriter(); + PrintWriter out = new PrintWriter(sw); + + DSAParams p = key.getParams(); + + out.println("Private-key-format: v1.2"); + out.println("Algorithm: 3 (DSA)"); + out.print("Prime(p): "); + out.println(b64BigInt(p.getP())); + out.print("Subprime(q): "); + out.println(b64BigInt(p.getQ())); + out.print("Base(g): "); + out.println(b64BigInt(p.getG())); + out.print("Private_value(x): "); + out.println(b64BigInt(key.getX())); + out.print("Public_value(y): "); + out.println(b64BigInt(pub.getY())); + + return sw.toString(); + } +} diff --git a/src/com/verisignlabs/dnssec/security/DnsKeyPair.java b/src/com/verisignlabs/dnssec/security/DnsKeyPair.java new file mode 100644 index 0000000..d477cd9 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/DnsKeyPair.java @@ -0,0 +1,356 @@ +// $Id: DnsKeyPair.java,v 1.3 2004/01/16 21:07:09 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.verisignlabs.dnssec.security; + +import java.security.*; +import java.security.interfaces.*; +import org.xbill.DNS.*; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** This class forms the basis for representing public/private key + * pairs in a DNSSEC context. It is possible to get a JCA public and + * private key from this object, as well as a KEYRecord encoding of + * the public key. This class is implemented as a UNION of all the + * functionality needed for handing native java, BIND, and possibly + * other underlying KEY engines. + * + * JCA == Java Cryptography Architecture. + * + * @author David Blacka (orig) + * @author $Author: davidb $ (latest) + * @version $Revision: 1.3 $ + */ + +// FIXME: this class is not a generic DnsKeyPair at all. It is really +// a JCEDnsKeyPair. We probably need to reexamine the class design here. + +// NOTE: this class is designed to do "lazy" evaluation of it's +// various cached objects and format conversions, so methods should +// avoid direct access to the member variables. + +public class DnsKeyPair +{ + /** This is the real (base) encoding of the public key. */ + protected DNSKEYRecord mPublicKeyRecord; + + /** This is a precalcuated cache of the KEYRecord converted into a + * JCA public key. */ + private PublicKey mPublicKey; + + /** The private key in Base64 encoded format. This version is + * presumed to be opaque, so no attempts will be made to convert it + * to a JCA private key. */ + protected String mPrivateKeyString; + + /** The private key in JCA format. This is the base encoding for + * instances were JCA private keys are used. */ + protected PrivateKey mPrivateKey; + + /** The local key converter. */ + protected DnsKeyConverter mKeyConverter; + + /** a cached Signature used for signing (initialized with the + * private key) */ + protected Signature mSigner; + + /** a caches Signature used for verifying (intialized with the + * public key) */ + protected Signature mVerifier; + + + private Log log; + + public DnsKeyPair() + { + log = LogFactory.getLog(this.getClass()); + } + + public DnsKeyPair(DNSKEYRecord keyRecord, PrivateKey privateKey) + { + this(); + + setDNSKEYRecord(keyRecord); + setPrivate(privateKey); + } + + public DnsKeyPair(DNSKEYRecord keyRecord, String privateKeyString) + { + this(); + + setDNSKEYRecord(keyRecord); + setPrivateKeyString(privateKeyString); + } + + public DnsKeyPair(Name keyName, int algorithm, PublicKey publicKey, + PrivateKey privateKey) + { + this(); + + DnsKeyConverter conv = new DnsKeyConverter(); + DNSKEYRecord keyrec = conv.generateDNSKEYRecord(keyName, DClass.IN, 0, 0, + algorithm, publicKey); + setDNSKEYRecord(keyrec); + setPrivate(privateKey); + } + + public DnsKeyPair(DnsKeyPair pair) + { + this(); + + setDNSKEYRecord(pair.getDNSKEYRecord()); + setPrivate(pair.getPrivate()); + setPrivateKeyString(pair.getPrivateKeyString()); + } + + /** @return cached DnsKeyConverter object. */ + protected DnsKeyConverter getKeyConverter() + { + if (mKeyConverter == null) + { + mKeyConverter = new DnsKeyConverter(); + } + + return mKeyConverter; + } + + /** @return the appropriate Signature object for this keypair. */ + protected Signature getSignature() + { + Signature s = null; + + // First try and deduce the algorithm from the KEYRecord (which + // will be specific), then try and deduce it from the private key. + // We should have one or the other. + try + { + switch (getDNSKEYAlgorithm()) + { + case DNSSEC.RSAMD5: + s = Signature.getInstance("MD5withRSA"); + break; + case DNSSEC.DSA: + s = Signature.getInstance("SHA1withDSA"); + break; + case DNSSEC.RSASHA1: + s = Signature.getInstance("SHA1withRSA"); + break; + case -1: + s = null; + break; + } + } + catch (NoSuchAlgorithmException e) + { + log.error("error getting Signature object", e); + } + + return s; + } + + /** @return the public key, translated from the KEYRecord, if + * necessary. */ + public PublicKey getPublic() + { + if (mPublicKey == null && getDNSKEYRecord() != null) + { + DnsKeyConverter conv = getKeyConverter(); + setPublic(conv.parseDNSKEYRecord(getDNSKEYRecord())); + } + + return mPublicKey; + } + + + /** sets the public key. This method is generally not used + * directly. */ + protected void setPublic(PublicKey k) + { + mPublicKey = k; + } + + /** @return the private key. */ + public PrivateKey getPrivate() + { + // attempt to convert the private key string format into a JCA + // private key. + if (mPrivateKey == null && mPrivateKeyString != null) + { + mPrivateKey = BINDKeyUtils.convertPrivateKeyString(mPrivateKeyString); + } + + return mPrivateKey; + } + + /** sets the private key */ + public void setPrivate(PrivateKey k) + { + mPrivateKey = k; + } + + /** @return the opaque private key string, null if one doesn't + * exist. */ + public String getPrivateKeyString() + { + if (mPrivateKeyString == null && mPrivateKey != null) + { + PublicKey pub = getPublic(); + mPrivateKeyString = BINDKeyUtils.convertPrivateKey(mPrivateKey, pub, + getDNSKEYAlgorithm()); + } + + return mPrivateKeyString; + } + + /** sets the opaque private key string. */ + public void setPrivateKeyString(String p) + { + mPrivateKeyString = p; + } + + /** @return the private key in an encoded form (normally PKCS#8). */ + public byte[] getEncodedPrivate() + { + PrivateKey priv = getPrivate(); + if (priv != null) return priv.getEncoded(); + return null; + } + + /** Sets the private key from the encoded form (PKCS#8). This + * routine requires that the public key already be assigned. + * Currently it can only handle DSA and RSA keys. */ + public void setEncodedPrivate(byte[] encoded) + { + int alg = getDNSKEYAlgorithm(); + + if (alg >= 0) + { + DnsKeyConverter conv = getKeyConverter(); + setPrivate(conv.convertEncodedPrivateKey(encoded, alg)); + } + } + + /** @return the public DNSKEY record */ + public DNSKEYRecord getDNSKEYRecord() + { + return mPublicKeyRecord; + } + + /** @return a Signature object initialized for signing, or null if + * this key pair does not have a valid private key. */ + public Signature getSigner() + { + if (mSigner == null) + { + mSigner = getSignature(); + PrivateKey priv = getPrivate(); + if (mSigner != null && priv != null) + { + try + { + mSigner.initSign(priv); + } + catch (InvalidKeyException e) + { + log.error("Signature error", e); + } + } + else + { + // do not return an unitialized signer. + return null; + } + } + + return mSigner; + } + + /** @return a Signature object initialized for verifying, or null if + * this key pair does not have a valid public key. */ + public Signature getVerifier() + { + if (mVerifier == null) + { + mVerifier = getSignature(); + PublicKey pk = getPublic(); + if (mVerifier != null && pk != null) + { + try + { + mVerifier.initVerify(pk); + } + catch (InvalidKeyException e) {} + } + else + { + // do not return an unitialized verifier + return null; + } + } + + return mVerifier; + } + + /** sets the public key record */ + public void setDNSKEYRecord(DNSKEYRecord r) + { + mPublicKeyRecord = r; + // force the conversion to PublicKey: + mPublicKey = null; + } + + + public Name getDNSKEYName() + { + DNSKEYRecord kr = getDNSKEYRecord(); + if (kr != null) return kr.getName(); + return null; + } + + public int getDNSKEYAlgorithm() + { + DNSKEYRecord kr = getDNSKEYRecord(); + if (kr != null) return kr.getAlgorithm(); + + PublicKey pk = getPublic(); + if (pk != null) + { + // currently, alg 5 is the default over alg 1 (RSASHA1). + if (pk instanceof RSAPublicKey) return DNSSEC.RSASHA1; + if (pk instanceof DSAPublicKey) return DNSSEC.DSA; + } + + PrivateKey priv = getPrivate(); + if (priv != null) + { + if (priv instanceof RSAPrivateKey) return DNSSEC.RSASHA1; + if (priv instanceof DSAPrivateKey) return DNSSEC.DSA; + } + + return -1; + } + + public int getDNSKEYFootprint() + { + DNSKEYRecord kr = getDNSKEYRecord(); + if (kr != null) return kr.getFootprint(); + return -1; + } +} diff --git a/src/com/verisignlabs/dnssec/security/DnsSecVerifier.java b/src/com/verisignlabs/dnssec/security/DnsSecVerifier.java new file mode 100644 index 0000000..c3012d5 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/DnsSecVerifier.java @@ -0,0 +1,321 @@ +// $Id: DnsSecVerifier.java,v 1.5 2004/02/25 20:46:14 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.security; + +import java.util.*; +import java.io.*; +import java.security.*; + +import org.xbill.DNS.*; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** A class for performing basic DNSSEC verification. The DNSJAVA + * package contains a similar class. This differs (for the moment, + * anyway) by allowing timing "fudge" factors and logging more + * specifically why an RRset did not validate. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.5 $ + */ +public class DnsSecVerifier implements Verifier +{ + + private class TrustedKeyStore + { + // for now, this is implemented as a hashtable of lists of + // DnsKeyPair objects (obviously, all of them will not have + // private keys). + private HashMap mKeyMap; + + public TrustedKeyStore() + { + mKeyMap = new HashMap(); + } + + public void add(DnsKeyPair pair) + { + String n = pair.getDNSKEYName().toString().toLowerCase(); + List l = (List) mKeyMap.get(n); + if (l == null) + { + l = new ArrayList(); + mKeyMap.put(n, l); + } + + l.add(pair); + } + + public void add(DNSKEYRecord keyrec) + { + DnsKeyPair pair = new DnsKeyPair(keyrec, (PrivateKey) null); + add(pair); + } + + public void add(Name name, int algorithm, PublicKey key) + { + DnsKeyPair pair = new DnsKeyPair(name, algorithm, key, null); + add(pair); + } + + public DnsKeyPair find(Name name, int algorithm, int keyid) + { + String n = name.toString().toLowerCase(); + List l = (List) mKeyMap.get(n); + if (l == null) return null; + + // FIXME: this algorithm assumes that name+alg+footprint is + // unique, which isn't necessarily true. + for (Iterator i = l.iterator(); i.hasNext(); ) + { + DnsKeyPair p = (DnsKeyPair) i.next(); + if (p.getDNSKEYAlgorithm() == algorithm && + p.getDNSKEYFootprint() == keyid) + { + return p; + } + } + return null; + } + } + + private TrustedKeyStore mKeyStore; + private int mStartFudge = 0; + private int mExpireFudge = 0; + private boolean mVerifyAllSigs = false; + + private Log log; + + public DnsSecVerifier() + { + log = LogFactory.getLog(this.getClass()); + + mKeyStore = new TrustedKeyStore(); + } + + public void addTrustedKey(DNSKEYRecord keyrec) + { + mKeyStore.add(keyrec); + } + + public void addTrustedKey(DnsKeyPair pair) + { + mKeyStore.add(pair); + } + + public void addTrustedKey(Name name, int algorithm, PublicKey key) + { + mKeyStore.add(name, algorithm, key); + } + + public void addTrustedKey(Name name, PublicKey key) + { + mKeyStore.add(name, 0, key); + } + + public void setExpireFudge(int fudge) + { + mExpireFudge = fudge; + } + + public void setStartFudge(int fudge) + { + mStartFudge = fudge; + } + + public void setVerifyAllSigs(boolean v) + { + mVerifyAllSigs = v; + } + + private DnsKeyPair findCachedKey(Cache cache, Name name, int algorithm, + int footprint) + { + RRset[] keysets = cache.findAnyRecords(name, Type.KEY); + if (keysets == null) return null; + + // look for the particular key + // FIXME: this assumes that name+alg+footprint is unique. + for (Iterator i = keysets[0].rrs(); i.hasNext(); ) + { + Object o = i.next(); + if (! (o instanceof DNSKEYRecord)) continue; + DNSKEYRecord keyrec = (DNSKEYRecord) o; + if (keyrec.getAlgorithm() == algorithm && + keyrec.getFootprint() == footprint) + { + return new DnsKeyPair(keyrec, (PrivateKey) null); + } + } + + return null; + } + + private DnsKeyPair findKey(Cache cache, Name name, int algorithm, + int footprint) + { + DnsKeyPair pair = mKeyStore.find(name, algorithm, footprint); + if (pair == null && cache != null) + { + pair = findCachedKey(cache, name, algorithm, footprint); + } + + return pair; + } + + private byte validateSignature(RRset rrset, RRSIGRecord sigrec) + { + if (rrset == null || sigrec == null) return DNSSEC.Failed; + if (! rrset.getName().equals(sigrec.getName())) + { + log.info("Signature name does not match RRset name"); + return DNSSEC.Failed; + } + if (rrset.getType() != sigrec.getTypeCovered()) + { + log.info("Signature type does not match RRset type"); + } + + Date now = new Date(); + Date start = sigrec.getTimeSigned(); + Date expire = sigrec.getExpire(); + + if (mStartFudge >= 0) + { + if (mStartFudge > 0) + { + start = new Date(start.getTime() - ((long) mStartFudge * 1000)); + } + if (now.before(start)) + { + log.info("Signature is not yet valid"); + return DNSSEC.Failed; + } + } + + if (mExpireFudge >= 0) + { + if (mExpireFudge > 0) + { + expire = new Date(expire.getTime() + ((long) mExpireFudge * 1000)); + } + if (now.after(expire)) + { + log.info("Signature has expired (now = " + now + + ", sig expires = " + expire); + return DNSSEC.Failed; + } + } + + return DNSSEC.Secure; + } + + /** Verify an RRset against a particular signature. + * + * @return DNSSEC.Secure if the signature verfied, DNSSEC.Failed if + * it did not verify (for any reason), and DNSSEC.Insecure if + * verification could not be completed (usually because the public + * key was not available). */ + public byte verifySignature(RRset rrset, RRSIGRecord sigrec, Cache cache) + { + byte result = validateSignature(rrset, sigrec); + if (result != DNSSEC.Secure) return result; + + DnsKeyPair keypair = findKey(cache, sigrec.getSigner(), + sigrec.getAlgorithm(), + sigrec.getFootprint()); + + if (keypair == null) + { + log.info("could not find appropriate key"); + return DNSSEC.Insecure; + } + + try + { + byte[] data = SignUtils.generateSigData(rrset, sigrec); + + Signature signer = keypair.getVerifier(); + signer.update(data); + + byte[] sig = sigrec.getSignature(); + if (sigrec.getAlgorithm() == DNSSEC.DSA) + { + sig = SignUtils.convertDSASignature(sig); + } + if (!signer.verify(sig)) + { + log.info("Signature failed to verify cryptographically"); + return DNSSEC.Failed; + } + + return DNSSEC.Secure; + } + catch (IOException e) + { + log.error("I/O error", e); + } + catch (GeneralSecurityException e) + { + log.error("Security error", e); + } + + log.debug("Signature failed to verify due to exception"); + return DNSSEC.Insecure; + } + + /** Verifies an RRset. This routine does not modify the RRset. + * + * @return DNSSEC.Secure if the set verified, DNSSEC.Failed if it + * did not, and DNSSEC.Insecure if verification could not + * complete. */ + public int verify(RRset rrset, Cache cache) + { + int result = mVerifyAllSigs ? DNSSEC.Secure: DNSSEC.Insecure; + + Iterator i = rrset.sigs(); + + if ( ! i.hasNext()) + { + log.info("RRset failed to verify due to lack of signatures"); + return DNSSEC.Insecure; + } + + while (i.hasNext()) + { + RRSIGRecord sigrec = (RRSIGRecord) i.next(); + + byte res = verifySignature(rrset, sigrec, cache); + + if (!mVerifyAllSigs && res == DNSSEC.Secure) return res; + + if (!mVerifyAllSigs && res < result) result = res; + + if (mVerifyAllSigs && res != DNSSEC.Secure && res < result) + { + result = res; + } + } + + return result; + } +} diff --git a/src/com/verisignlabs/dnssec/security/JCEDnsSecSigner.java b/src/com/verisignlabs/dnssec/security/JCEDnsSecSigner.java new file mode 100644 index 0000000..84eab56 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/JCEDnsSecSigner.java @@ -0,0 +1,373 @@ +// $Id: JCEDnsSecSigner.java,v 1.3 2004/02/25 20:46:14 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA +package com.verisignlabs.dnssec.security; + +import java.util.*; +import java.io.*; +import java.security.*; +import java.security.interfaces.*; + +import org.xbill.DNS.*; + +/** This class contains routines for signing DNS zones. + * + * In particular, it contains both an ability to sign an individual + * RRset and the ability to sign and entire zone. It primarily glues + * together the more basic primitives found in {@link SignUtils}. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.3 $ + */ +public class JCEDnsSecSigner +{ + private DnsKeyConverter mKeyConverter; + + private KeyPairGenerator mRSAKeyGenerator; + private KeyPairGenerator mDSAKeyGenerator; + + + /** Cryptographically generate a new DNSSEC key. + * + * @param owner the KEY RR's owner name. + * @param ttl the KEY RR's TTL. + * @param dclass the KEY RR's DNS class. + * @param algorithm the DNSSEC algorithm (RSAMD5, RSASHA1, or DSA). + * @param flags any flags for the KEY RR. + * @param keysize the size of the key to generate. + * @return a DnsKeyPair with the public and private keys populated. + */ + public DnsKeyPair generateKey(Name owner, + long ttl, + int dclass, + int algorithm, + int flags, + int keysize) + throws IOException, NoSuchAlgorithmException + { + KeyPair pair; + + if (ttl < 0) ttl = 86400; // set to a reasonable default. + + switch (algorithm) + { + case DNSSEC.RSAMD5: + case DNSSEC.RSASHA1: + if (mRSAKeyGenerator == null) + { + mRSAKeyGenerator = KeyPairGenerator.getInstance("RSA"); + } + mRSAKeyGenerator.initialize(keysize); + pair = mRSAKeyGenerator.generateKeyPair(); + break; + case DNSSEC.DSA: + if (mDSAKeyGenerator == null) + { + mDSAKeyGenerator = KeyPairGenerator.getInstance("DSA"); + } + mDSAKeyGenerator.initialize(keysize); + pair = mDSAKeyGenerator.generateKeyPair(); + break; + default: + throw new NoSuchAlgorithmException("Alg " + algorithm); + } + + if (mKeyConverter == null) + { + mKeyConverter = new DnsKeyConverter(); + } + + DNSKEYRecord keyrec = mKeyConverter.generateDNSKEYRecord(owner, + dclass, + ttl, + flags, + algorithm, + pair.getPublic()); + DnsKeyPair dnspair = new DnsKeyPair(); + dnspair.setDNSKEYRecord(keyrec); + dnspair.setPublic(pair.getPublic()); // keep from conv. the keyrec back. + dnspair.setPrivate(pair.getPrivate()); + + return dnspair; + } + + /** Sign an RRset. + * + * @param rrset the RRset to sign -- any existing signatures are ignored. + * @param keypars a list of DnsKeyPair objects containing private keys. + * @param start the inception time for the resulting RRSIG records. + * @param expire the expiration time for the resulting RRSIG records. + * @return a list of RRSIGRecord objects. + */ + public List signRRset(RRset rrset, List keypairs, Date start, Date expire) + throws IOException, GeneralSecurityException + { + if (rrset == null || keypairs == null) return null; + + // default start to now, expire to start + 1 second. + if (start == null) start = new Date(); + if (expire == null) expire = new Date(start.getTime() + 1000L); + if (keypairs.size() == 0) return null; + + // first, pre-calculate the rrset bytes. + byte[] rrset_data = SignUtils.generateCanonicalRRsetData(rrset); + + ArrayList sigs = new ArrayList(keypairs.size()); + + // for each keypair, sign the rrset. + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + DnsKeyPair pair = (DnsKeyPair) i.next(); + DNSKEYRecord keyrec = pair.getDNSKEYRecord(); + if (keyrec == null) continue; + + RRSIGRecord presig = SignUtils.generatePreRRSIG(rrset, keyrec, start, + expire, rrset.getTTL()); + byte[] sign_data = SignUtils.generateSigData(rrset_data, presig); + + Signature signer = pair.getSigner(); + + if (signer == null) + { + // debug + System.out.println("missing private key that goes with:\n" + + pair.getDNSKEYRecord()); + throw new GeneralSecurityException + ("cannot sign without a valid Signer " + + "(probably missing private key)"); + } + + // sign the data. + signer.update(sign_data); + byte[] sig = signer.sign(); + + // Convert to RFC 2536 format, if necessary. + if (pair.getDNSKEYAlgorithm() == DNSSEC.DSA) + { + sig = SignUtils.convertDSASignature + (((DSAPublicKey)pair.getPublic()).getParams(), sig); + } + RRSIGRecord sigrec = SignUtils.generateRRSIG(sig, presig); + sigs.add(sigrec); + } + + return sigs; + } + + /** Create a completely self-signed KEY RRset. + * + * @param keypairs the public & private keypairs to use in the keyset. + * @param start the RRSIG inception time. + * @param expire the RRSIG expiration time. + * @return a signed RRset. + */ + public RRset makeKeySet(List keypairs, Date start, Date expire) + throws IOException, GeneralSecurityException + { + // Generate a KEY RR set to sign. + + RRset keyset = new RRset(); + + for (Iterator i = keypairs.iterator(); i.hasNext(); ) + { + DnsKeyPair pair = (DnsKeyPair) i.next(); + keyset.addRR(pair.getDNSKEYRecord()); + } + + List records = signRRset(keyset, keypairs, start, expire); + + for (Iterator i = records.iterator(); i.hasNext(); ) + { + keyset.addRR((Record) i.next()); + } + + return keyset; + } + + /** Conditionally sign an RRset and add it to the toList. + * + * @param toList the list to which we are adding the processed RRsets. + * @param zonename the zone apex name. + * @param rrset the rrset under consideration. + * @param keysigningkeypairs the List of KSKs.. + * @param zonekeypairs the List of zone keys. + * @param start the RRSIG inception time. + * @param expire the RRSIG expiration time. + * @param fullySignKeyset if true, sign the zone apex keyset with + * both KSKs and ZSKs. + * @param last_cut the name of the last delegation point encountered. + * @return the name of the new last_cut. + */ + private Name addRRset(List toList, Name zonename, RRset rrset, + List keysigningkeypairs, List zonekeypairs, + Date start, Date expire, boolean fullySignKeyset, + Name last_cut) + throws IOException, GeneralSecurityException + { + // add the records themselves + for (Iterator i = rrset.rrs(); i.hasNext(); ) + { + toList.add(i.next()); + } + + int type = SignUtils.recordSecType(zonename, rrset.getName(), + rrset.getType(), last_cut); + + // we don't sign non-normal sets (delegations, glue, invalid). + // we also don't sign the zone key set unless we've been asked. + if (type == SignUtils.RR_DELEGATION) + { + return rrset.getName(); + } + if (type == SignUtils.RR_GLUE || type == SignUtils.RR_INVALID) + { + return last_cut; + } + + // check for the zone apex keyset. + if (rrset.getName().equals(zonename) && rrset.getType() == Type.DNSKEY) + { + // if we have key signing keys, sign the keyset with them, + // otherwise we will just sign them with the zonesigning keys. + if (keysigningkeypairs != null && keysigningkeypairs.size() > 0) + { + List sigs = signRRset(rrset, keysigningkeypairs, start, expire); + toList.addAll(sigs); + + // If we aren't going to sign with all the keys, bail out now. + if (!fullySignKeyset) return last_cut; + } + } + + // otherwise, we are OK to sign this set. + List sigs = signRRset(rrset, zonekeypairs, start, expire); + toList.addAll(sigs); + + return last_cut; + } + + /** Given a zone, sign it. + * + * @param zonename the name of the zone. + * @param records the records comprising the zone. They do not + * have to be in any particular order, as this method will order + * them as necessary. + * @param keysigningkeypairs the key pairs that are designated as + * "key signing keys". + * @param zonekeypair this key pairs that are designated as "zone + * signing keys". + * @param start the RRSIG inception time. + * @param expire the RRSIG expiration time. + * @param useOptIn generate Opt-In style NXT records. It will + * consider any insecure delegation to be unsigned. To override + * this, include the name of the insecure delegation in the + * NXTIncludeNames list. + * @param useConservativeOptIn if true, Opt-In NXT records will + * only be generated if there are insecure, unsigned delegations in + * the span. Not effect if useOptIn is false. + * @param fullySignKeyset sign the zone apex keyset with all available keys. + * @param NXTIncludeNames names that are to be included in the NXT + * chain regardless. This may be null and is only used if useOptIn + * is true. + * + * @return an ordered list of {@link org.xbill.DNS.Record} objects, + * representing the signed zone. + */ + public List signZone(Name zonename, + List records, + List keysigningkeypairs, + List zonekeypairs, + Date start, + Date expire, + boolean useOptIn, + boolean useConservativeOptIn, + boolean fullySignKeyset, + List NSECIncludeNames) + throws IOException, GeneralSecurityException + { + + // Remove any existing DNSSEC records (NSEC, RRSIG) + SignUtils.removeGeneratedRecords(zonename, records); + // Sort the zone + Collections.sort(records, new RecordComparator()); + + // Remove any duplicate records. + SignUtils.removeDuplicateRecords(records); + + // Generate DS records + SignUtils.generateDSRecords(zonename, records); + + // Generate NXT records + if (useOptIn) + { + SignUtils.generateOptInNSECRecords(zonename, records, + NSECIncludeNames, + useConservativeOptIn); + } + else + { + SignUtils.generateNSECRecords(zonename, records); + } + + // Assemble into RRsets and sign. + RRset rrset = new RRset(); + ArrayList signed_records = new ArrayList(); + Name last_cut = null; + + for (ListIterator i = records.listIterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + Name r_name = r.getName(); + + // First record + if (rrset.getName() == null) + { + rrset.addRR(r); + continue; + } + + // Current record is part of the current RRset. + if (rrset.getName().equals(r.getName()) && + rrset.getDClass() == r.getDClass() && + rrset.getType() == r.getType()) + { + rrset.addRR(r); + continue; + } + + // Otherwise, we have completed the RRset + // Sign the records + + // add the RRset to the list of signed_records, regardless of + // whether or not we actually end up signing the set. + last_cut = addRRset(signed_records, zonename, rrset, keysigningkeypairs, + zonekeypairs, start, expire, fullySignKeyset, + last_cut); + + rrset.clear(); + rrset.addRR(r); + } + + // add the last RR set + addRRset(signed_records, zonename, rrset, keysigningkeypairs, zonekeypairs, + start, expire, fullySignKeyset, last_cut); + + return signed_records; + } +} diff --git a/src/com/verisignlabs/dnssec/security/RecordComparator.java b/src/com/verisignlabs/dnssec/security/RecordComparator.java new file mode 100644 index 0000000..7d398db --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/RecordComparator.java @@ -0,0 +1,91 @@ +// $Id: RecordComparator.java,v 1.2 2004/01/16 17:54:48 davidb Exp $ +// +// Copyright (C) 2000-2003 Network Solutions, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.security; + +import java.util.*; + +import org.xbill.DNS.*; + +/** This class implements a comparison operator for {@link + * org.xbill.DNS.Record} objects. It imposes a canonical order + * consistent with DNSSEC. It does not put records within a RRset + * into canonical order: see {@link ByteArrayComparator}. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.2 $ */ + +public class RecordComparator implements Comparator +{ + public RecordComparator() + {} + + /** In general, types are compared numerically. However, SOA and NS + * are ordered before the rest. */ + private int compareTypes(int a, int b) + { + if (a == b) return 0; + if (a == Type.SOA) return -1; + if (b == Type.SOA) return 1; + + if (a == Type.NS) return -1; + if (b == Type.NS) return 1; + + if (a < b) return -1; + + return 1; + } + + public int compare(Object o1, Object o2) + throws ClassCastException + { + Record a = (Record) o1; + Record b = (Record) o2; + + if (a == null && b == null) return 0; + if (a == null) return 1; + if (b == null) return -1; + + int res = a.getName().compareTo(b.getName()); + if (res != 0) return res; + + int a_type = a.getType(); + int b_type = b.getType(); + int sig_type = 0; + + if (a_type == Type.RRSIG) + { + a_type = ((RRSIGRecord) a).getTypeCovered(); + sig_type = 1; + } + if (b_type == Type.RRSIG) + { + b_type = ((RRSIGRecord) b).getTypeCovered(); + sig_type = -1; + } + + res = compareTypes(a_type, b_type); + if (res != 0) return res; + + if (sig_type != 0) return sig_type; + + return 0; + } +} diff --git a/src/com/verisignlabs/dnssec/security/SignUtils.java b/src/com/verisignlabs/dnssec/security/SignUtils.java new file mode 100644 index 0000000..7e2eba7 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/SignUtils.java @@ -0,0 +1,927 @@ +// $Id: SignUtils.java,v 1.7 2004/03/23 17:53:57 davidb Exp $ +// +// Copyright (C) 2001-2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.security; + +import java.util.*; +import java.io.*; +import java.security.MessageDigest; +import java.security.interfaces.DSAParams; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; + +import org.xbill.DNS.*; +import org.xbill.DNS.utils.base64; // debug only + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** This class contains a bunch of utility methods that are generally + * useful in signing zones. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.7 $ + */ + +public class SignUtils +{ + private static final int DSA_SIGNATURE_LENGTH = 20; + private static final int ASN1_INT = 0x02; + private static final int ASN1_SEQ = 0x30; + + public static final int RR_NORMAL = 0; + public static final int RR_DELEGATION = 1; + public static final int RR_GLUE = 2; + public static final int RR_INVALID = 3; + + private static Log log; + + static { + log = LogFactory.getLog(SignUtils.class); + } + + public static void setLog(Log v) + { + log = v; + } + /** Generate from some basic information a prototype SIG RR + * containing everything but the actual signature itself. + * + * @param rrset the RRset being signed. + * @param key the public KEY RR counterpart to the key being used + * to sign the RRset + * @param start the SIG inception time. + * @param expire the SIG expiration time. + * @param sig_ttl the TTL of the resulting SIG record. + * @return a prototype signature based on the RRset and key + * information. */ + public static RRSIGRecord generatePreRRSIG(RRset rrset, DNSKEYRecord key, + Date start, Date expire, + long sig_ttl) + { + return new RRSIGRecord(rrset.getName(), + rrset.getDClass(), + sig_ttl, + rrset.getType(), + key.getAlgorithm(), + (int) rrset.getTTL(), + expire, + start, + key.getFootprint(), + key.getName(), + null); + } + + /** Generate from some basic information a prototype SIG RR + * containing everything but the actual signature itself. + * + * @param rec the DNS record being signed (forming an entire RRset). + * @param key the public KEY RR counterpart to the key signing the + * record. + * @param start the SIG inception time. + * @param expire the SIG expiration time. + * @param sig_ttl the TTL of the result SIG record. + * @return a prototype signature based on the Record and key + * information. */ + public static RRSIGRecord generatePreRRSIG(Record rec, DNSKEYRecord key, + Date start, Date expire, + long sig_ttl) + { + return new RRSIGRecord(rec.getName(), + rec.getDClass(), + sig_ttl, + rec.getType(), + key.getAlgorithm(), + rec.getTTL(), + expire, + start, + key.getFootprint(), + key.getName(), + null); + } + + + /** Generate the binary image of the prototype SIG RR. + * + * @param presig the SIG RR prototype. + * @return the RDATA portion of the prototype SIG record. This + * forms the first part of the data to be signed. */ + private static byte[] generatePreSigRdata(RRSIGRecord presig) + throws IOException + { + // Generate the binary image; + DNSOutput image = new DNSOutput(); + + // precalc some things + int start_time = (int) (presig.getTimeSigned().getTime() / 1000); + int expire_time = (int) (presig.getExpire().getTime() / 1000); + Name signer = presig.getSigner(); + + // first write out the partial SIG record (this is the SIG RDATA + // minus the actual signature. + image.writeU16(presig.getTypeCovered()); + image.writeU8(presig.getAlgorithm()); + image.writeU8(presig.getLabels()); + image.writeU32((int) presig.getOrigTTL()); + image.writeU32(expire_time); + image.writeU32(start_time); + image.writeU16(presig.getFootprint()); + image.writeByteArray(signer.toWireCanonical()); + + return image.toByteArray(); + } + + /** Calculate the canonical wire line format of the RRset. + * + * @param rrset the RRset to convert. + * @return the canonical wire line format of the rrset. This is + * the second part of data to be signed.*/ + public static byte[] generateCanonicalRRsetData(RRset rrset) + throws IOException + { + DNSOutput image = new DNSOutput(); + + // now convert load the wire format records in the RRset into a + // list of byte arrays. + ArrayList canonical_rrs = new ArrayList(); + for (Iterator i = rrset.rrs(); i.hasNext(); ) + { + Record r = (Record) i.next(); + byte[] wire_fmt = r.toWireCanonical(); + canonical_rrs.add(wire_fmt); + } + + // put the records into the correct ordering. + // Caculate the offset where the RDATA begins (we have to skip + // past the length byte) + + // FIXME: currently, draft-ietf-dnsext-dnssec-records-06 has us + // sorting by length first, then bytes. This can be accomplished + // by not skipping past the RDLENGTH field, I think. + // FIXME update: I pointed this out as an error, and subsequent + // versions should correct this, setting the standard back to + // bytes, then length. + + int offset = rrset.getName().toWireCanonical().length + 10; + ByteArrayComparator bac = new ByteArrayComparator(offset, false); + + Collections.sort(canonical_rrs, bac); + + for (Iterator i = canonical_rrs.iterator(); i.hasNext(); ) + { + byte[] wire_fmt_rec = (byte[]) i.next(); + image.writeByteArray(wire_fmt_rec); + } + + return image.toByteArray(); + } + + /** Given an RRset and the prototype signature, generate the + * canonical data that is to be signed. + * + * @param rrset the RRset to be signed. + * @param presig a prototype SIG RR created using the same RRset. + * @return a block of data ready to be signed. + */ + public static byte[] generateSigData(RRset rrset, RRSIGRecord presig) + throws IOException + { + byte[] rrset_data = generateCanonicalRRsetData(rrset); + + return generateSigData(rrset_data, presig); + } + + /** Given an RRset and the prototype signature, generate the + * canonical data that is to be signed. + * + * @param rrset_data the RRset converted into canonical wire line + * format (as per the canonicalization rules in RFC 2535). + * @param presig the prototype signature based on the same RRset + * represented in rrset_data. + * @return a block of data ready to be signed. + */ + public static byte[] generateSigData(byte[] rrset_data, RRSIGRecord presig) + throws IOException + { + byte[] sig_rdata = generatePreSigRdata(presig); + + ByteArrayOutputStream image + = new ByteArrayOutputStream(sig_rdata.length + rrset_data.length); + + image.write(sig_rdata); + image.write(rrset_data); + + return image.toByteArray(); + } + + /** Given the acutal signature an the prototype signature, combine + * them and return the fully formed SIGRecord. + * + * @param signature the cryptographic signature, in DNSSEC format. + * @param presig the prototype SIG RR to add the signature to. + * @return the fully formed SIG RR. + */ + public static RRSIGRecord generateRRSIG(byte[] signature, RRSIGRecord presig) + { + return new RRSIGRecord(presig.getName(), + presig.getDClass(), + presig.getTTL(), + presig.getTypeCovered(), + presig.getAlgorithm(), + presig.getOrigTTL(), + presig.getExpire(), + presig.getTimeSigned(), + presig.getFootprint(), + presig.getSigner(), + signature); + } + + /** Converts from a RFC 2536 formatted DSA signature to a JCE + * (ASN.1) formatted signature. + * + *

ASN.1 format = ASN1_SEQ . seq_length . ASN1_INT . Rlength . R + * . ANS1_INT . Slength . S

+ * + * The integers R and S may have a leading null byte to force the + * integer positive. + * + * @param signature the RFC 2536 formatted DSA signature. + * @return The ASN.1 formatted DSA signature. + * @throws SignatureException if there was something wrong with the + * RFC 2536 formatted signature. + **/ + public static byte[] convertDSASignature(byte[] signature) + throws SignatureException + { + if (signature.length != 41) + throw new SignatureException("RFC 2536 signature not expected length."); + + byte r_pad = 0; + byte s_pad = 0; + + // handle initial null byte padding. + if (signature[1] < 0) r_pad++; + if (signature[21] < 0) s_pad++; + + // ASN.1 length = R length + S length + (2 + 2 + 2), where each 2 + // is for a ASN.1 type-length byte pair of which there are three + // (SEQ, INT, INT). + byte sig_length = (byte) (40 + r_pad + s_pad + 6); + + byte sig[] = new byte[sig_length]; + byte pos = 0; + + sig[pos++] = ASN1_SEQ; + sig[pos++] = (byte) (sig_length - 2); // all but the SEQ type+length. + sig[pos++] = ASN1_INT; + sig[pos++] = (byte) (20 + r_pad); + + // copy the value of R, leaving a null byte if necessary + if (r_pad == 1) sig[pos++] = 0; + + System.arraycopy(signature, 1, sig, pos, 20); + pos += 20; + + sig[pos++] = ASN1_INT; + sig[pos++] = (byte) (20 + s_pad); + + // copy the value of S, leaving a null byte if necessary + if (s_pad == 1) sig[pos++] = 0; + + System.arraycopy(signature, 21, sig, pos, 20); + + return sig; + } + + + /** Converts from a JCE (ASN.1) formatted DSA signature to a RFC + * 2536 compliant signature. + * + *

rfc2536 format = T . R . S

+ * + * where T is a number between 0 and 8, which is based on the DSA + * key length, and R & S are formatted to be exactly 20 bytes each + * (no leading null bytes). + * + * @param params the DSA parameters associated with the DSA key + * used to generate the signature. + * @param signature the ASN.1 formatted DSA signature. + * @return a RFC 2536 formatted DSA signature. + * @throws SignatureException if something is wrong with the ASN.1 + * format. + */ + public static byte[] convertDSASignature(DSAParams params, byte[] signature) + throws SignatureException + { + if (signature[0] != ASN1_SEQ || signature[2] != ASN1_INT) + { + throw new SignatureException + ("Invalid ASN.1 signature format: expected SEQ, INT"); + } + + byte r_pad = (byte) (signature[3] - 20); + + if (signature[24 + r_pad] != ASN1_INT) { + throw new SignatureException + ("Invalid ASN.1 signature format: expected SEQ, INT, INT"); + } + + log.trace("(start) ASN.1 DSA Sig:\n" + base64.toString(signature)); + + byte s_pad = (byte) (signature[25 + r_pad] - 20); + + byte[] sig = new byte[41]; // all rfc2536 signatures are 41 bytes. + + // Calculate T: + sig[0] = (byte) ((params.getP().bitLength() - 512) / 64); + + // copy R value + if (r_pad >= 0) + { + System.arraycopy(signature, 4 + r_pad, sig, 1, 20); + } + else + { + // R is shorter than 20 bytes, so right justify the number + // (r_pad is negative here, remember?). + Arrays.fill(sig, 1 , 1 - r_pad, (byte) 0); + System.arraycopy(signature, 4, sig, 1 - r_pad, 20 + r_pad); + } + + // copy S value + if (s_pad >= 0) + { + System.arraycopy(signature, 26 + r_pad + s_pad, sig, 21, 20); + } + else + { + // S is shorter than 20 bytes, so right justify the number + // (s_pad is negative here). + Arrays.fill(sig, 21, 21 - s_pad, (byte) 0); + System.arraycopy(signature, 26 + r_pad, sig, 21 - s_pad, 20 + s_pad); + } + + if (r_pad < 0 || s_pad < 0) + { + log.trace("(finish ***) RFC 2536 DSA Sig:\n" + base64.toString(sig)); + + } + else + { + log.trace("(finish) RFC 2536 DSA Sig:\n" + base64.toString(sig)); + } + + return sig; + } + + /** This is a convenience routine to help us classify records/RRsets. + * + * It charaterizes a record/RRset as one of the following classes:
+ *
+ + *
NORMAL
This record/set is properly within the zone + * an subject to all NXT and SIG processing.
+ + *
DELEGATION
This is a zone delegation point (or + * cut). It is used in NXT processing but is not signed.
+ + *
GLUE
This is a glue record and therefore not + * properly within the zone. It is not included in NXT or SIG + * processing. Normally glue records are A records, but this + * routine calls anything that is below a zone delegation + * glue.
+ + *
INVALID
This record doesn't even belong in the + * zone.
+ + *

+ + * This method must be called successively on records in the + * canonical name ordering, and the caller must maintain the + * last_cut parameter. + + * @param zonename the name of the zone that is being processed. + * @param name the name of the record/set under consideration. + * @param type the type of the record/set under consideration. + * @param last_cut the name of the last DELEGATION record/set that + * was encountered while iterating over the zone in canonical + * order. + */ + public static int recordSecType(Name zonename, Name name, int type, + Name last_cut) + { + // records not even in the zone itself are invalid. + if (!name.subdomain(zonename)) return RR_INVALID; + + // records that are at the zonename node are definitely normal. + if (name.equals(zonename)) return RR_NORMAL; + + // since we are not at zone level, any NS records are delegations + if (type == Type.NS) return RR_DELEGATION; + + if (last_cut != null) + { + // if we are at the same level as a delegation point, but not an + // NS record, then we either a DS record or glue. + if (name.equals(last_cut)) + { + if (type == Type.DS || type == Type.NXT || + type == Type.NSEC) return RR_NORMAL; + // actually, this is probably INVALID, but it could be glue. + return RR_GLUE; + } + // below the delegation, we are glue + if (name.subdomain(last_cut)) return RR_GLUE; + } + + return RR_NORMAL; + } + + /** Given a canonical ordered list of records from a single zone, + * order the raw records into a list of RRsets. + * + * @param records a list of {@link org.xbill.DNS.Record} objects, + * in DNSSEC canonical order. + * @return a List of {@link org.xbill.DNS.RRset} objects. + */ + public static List assembleIntoRRsets(List records) + { + RRset rrset = new RRset(); + ArrayList rrsets = new ArrayList(); + + for (Iterator i = records.iterator(); i.hasNext(); ) + { + Object o = i.next(); + + if (! (o instanceof Record)) + { + log.warn("assembleIntoRRsets: a non-record object was " + + "encountered and skipped: " + o + " (" + o.getClass() + ")"); + continue; + } + + Record r = (Record) o; + Name r_name = r.getName(); + + // First record + if (rrset.getName() == null) + { + rrset.addRR(r); + continue; + } + + // Current record is part of the current RRset. + if (rrset.getName().equals(r.getName()) && + rrset.getDClass() == r.getDClass() && + ((r.getType() == Type.RRSIG && + rrset.getType() == ((RRSIGRecord)r).getTypeCovered()) || + rrset.getType() == r.getType())) + { + rrset.addRR(r); + continue; + } + + // otherwise, we have completed the RRset + rrsets.add(rrset); + + // set up for the next set. + rrset = new RRset(); + rrset.addRR(r); + } + + // add the last rrset. + rrsets.add(rrset); + + return rrsets; + } + + + /** A little private class to hold information about a given + * node. */ + private static class NodeInfo + { + public Name name; + public int type; + public long ttl; + public int dclass; + public Set typemap; + public boolean isSecureNode; // opt-in support. + public boolean hasOptInSpan; // opt-in support. + public int nsecIndex; + + public NodeInfo(Record r) + { + this.name = r.getName(); + this.type = r.getType(); + this.ttl = r.getTTL(); + this.dclass = r.getDClass(); + this.typemap = new HashSet(); + this.isSecureNode = false; + this.hasOptInSpan = false; + addType(type); + } + public void addType(int type) + { + this.typemap.add(new Integer(type)); + + // Opt-In support. + if (type != Type.NS && type != Type.NSEC && type != Type.RRSIG) + { + isSecureNode = true; + } + } + public String toString() + { + StringBuffer sb = new StringBuffer(name.toString()); + if (isSecureNode) sb.append("(S)"); + if (hasOptInSpan) sb.append("(O)"); + return sb.toString(); + } + + public int[] getTypes() + { + Object[] a = typemap.toArray(); + int[] res = new int[a.length]; + + for (int i = 0; i < a.length; i++) + { + res[i] = ((Integer) a[i]).intValue(); + } + return res; + } + } + + /** Given a canonical (by name) ordered list of records in a zone, + * generate the NXT records in place. + * + * Note that the list that the records are stored in must support + * the listIterator.add() operation. + * + * @param zonename the name of the zone (used to distinguish + * between zone apex NS RRsets and delegations). + * @param records a list of {@link org.xbill.DNS.Record} objects in + * DNSSEC canonical order. + */ + public static void generateNSECRecords(Name zonename, List records) + { + // This works by iterating over a known sorted list of records. + + NodeInfo last_node = null; + NodeInfo current_node = null; + + Name last_cut = null; + int backup; + + for (ListIterator i = records.listIterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + Name r_name = r.getName(); + int r_type = r.getType(); + int r_sectype = recordSecType(zonename, r_name, r_type, last_cut); + + // skip irrelevant records + if (r_sectype == RR_INVALID || r_sectype == RR_GLUE) continue; + + // note our last delegation point so we can recognize glue. + if (r_sectype == RR_DELEGATION) last_cut = r_name; + + // first node -- initialize + if (current_node == null) + { + current_node = new NodeInfo(r); + current_node.addType(Type.RRSIG); + current_node.addType(Type.NSEC); + continue; + } + + // record name hasn't changed, so we are still on the same node. + if (r_name.equals(current_node.name)) + { + current_node.addType(r_type); + continue; + } + + if (last_node != null) + { + NSECRecord nsec = new NSECRecord(last_node.name, last_node.dclass, + last_node.ttl, current_node.name, + last_node.getTypes()); + // Note: we have to add this through the iterator, otherwise + // the next access via the iterator will generate a + // ConcurrencyModificationException. + backup = i.nextIndex() - last_node.nsecIndex; + for (int j = 0; j < backup; j++) i.previous(); + i.add(nsec); + for (int j = 0; j < backup; j++) i.next(); + + log.trace("Generated: " + nsec); + } + + last_node = current_node; + + current_node.nsecIndex = i.previousIndex(); + current_node = new NodeInfo(r); + current_node.addType(Type.RRSIG); + current_node.addType(Type.NSEC); + } + + // Generate next to last NSEC + if (last_node != null) + { + NSECRecord nsec = new NSECRecord(last_node.name, last_node.dclass, + last_node.ttl, current_node.name, + last_node.getTypes()); + records.add(last_node.nsecIndex - 1, nsec); + log.trace("Generated: " + nsec); + } + + // Generate last NSEC + NSECRecord nsec = new NSECRecord(current_node.name, current_node.dclass, + current_node.ttl, zonename, + current_node.getTypes()); + records.add(nsec); + + log.trace("Generated: " + nsec); + } + + + /** Given a canonical (by name) ordered list of records in a zone, + * generate the NXT records in place. + * + * Note thatthe list that the records are stored in must support + * the listIterator.add operation. + * + * @param zonename the name of the zone apex, used to distinguish + * between authoritative and delegation NS RRsets. + * @param records a list of {@link org.xbill.DNS.Record}s in DNSSEC + * canonical order. + * @param includeNames a list of names that should be in the NXT + * chain regardless. This may be null. + * @param beConservative if true, then Opt-In NXTs will only be + * generated where there is actually a span of insecure + * delegations. + */ + public static void generateOptInNSECRecords(Name zonename, + List records, + List includeNames, + boolean beConservative) + { + // This works by iterating over a known sorted list of records. + + NodeInfo last_node = null; + NodeInfo current_node = null; + + Name last_cut = null; + int backup; + HashSet includeSet = null; + + if (includeNames != null) + { + includeSet = new HashSet(includeNames); + } + + for (ListIterator i = records.listIterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + Name r_name = r.getName(); + int r_type = r.getType(); + int r_sectype = recordSecType(zonename, r_name, r_type, last_cut); + + // skip irrelevant records + if (r_sectype == RR_INVALID || r_sectype == RR_GLUE) continue; + + // note our last delegation point so we can recognize glue. + if (r_sectype == RR_DELEGATION) last_cut = r_name; + + // first node -- initialize + if (current_node == null) + { + current_node = new NodeInfo(r); + current_node.addType(Type.RRSIG); + continue; + } + + // record name hasn't changed, so we are still on the same node. + if (r_name.equals(current_node.name)) + { + current_node.addType(r_type); + continue; + } + + // If the name is in the set of included names, mark it as + // secure. + if (includeSet != null && includeSet.contains(current_node.name)) + { + current_node.isSecureNode = true; + } + + if (last_node != null && current_node.isSecureNode) + { + // generate a NSEC record. + if (beConservative && !last_node.hasOptInSpan) + { + last_node.addType(Type.NSEC); + } + NSECRecord nsec = new NSECRecord(last_node.name, last_node.dclass, + last_node.ttl, current_node.name, + last_node.getTypes()); + // Note: we have to add this through the iterator, otherwise + // the next access via the iterator will generate a + // ConcurrencyModificationException. + backup = i.nextIndex() - last_node.nsecIndex; + for (int j = 0; j < backup; j++) i.previous(); + i.add(nsec); + for (int j = 0; j < backup; j++) i.next(); + + log.trace("Generated: " + nsec); + } + + if (current_node.isSecureNode) + { + last_node = current_node; + } + else if (last_node != null) + { + // last_node does not change -- last_node is essentially the + // last *secure* node, and current_node is not secure. + // However, we need to note the passing of the insecure node. + last_node.hasOptInSpan = true; + } + + current_node.nsecIndex = i.previousIndex(); + current_node = new NodeInfo(r); + current_node.addType(Type.RRSIG); + } + + // Generate next to last NSEC + if (last_node != null && current_node.isSecureNode) + { + // generate a NSEC record. + if (beConservative && !last_node.hasOptInSpan) + { + last_node.addType(Type.NSEC); + } + NSECRecord nsec = new NSECRecord(last_node.name, last_node.dclass, + last_node.ttl, current_node.name, + last_node.getTypes()); + records.add(last_node.nsecIndex - 1, nsec); + log.trace("Generated: " + nsec); + } + + // Generate last NSEC + NSECRecord nsec; + if (current_node.isSecureNode) + { + if (beConservative) + { + current_node.addType(Type.NSEC); + } + nsec = new NSECRecord(current_node.name, current_node.dclass, + current_node.ttl, zonename, + current_node.getTypes()); + // we can just tack this on the end as we are working on the + // last node. + records.add(nsec); + } + else + { + nsec = new NSECRecord(last_node.name, last_node.dclass, last_node.ttl, + zonename, last_node.getTypes()); + // We need to tack this on after the last secure node, not the + // end of the whole list. + records.add(last_node.nsecIndex, nsec); + } + + log.trace("Generated: " + nsec); + } + + + /** Given a zone with DNSKEY records at delegation points, convert + * those KEY records into their corresponding DS records in place. + * + * @param zonename the name of the zone, used to reliably + * distinguish the zone apex from other records. + * @param records a list of {@link org.xbill.DNS.Record} objects. + */ + public static void generateDSRecords(Name zonename, List records) + throws IOException + { + + for (ListIterator i = records.listIterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + if (r == null) continue; // this should never be true. + + Name r_name = r.getName(); + if (r_name == null) continue; // this should never be true. + + // Convert non-zone level KEY records into DS records. + if (r.getType() == Type.DNSKEY && !r_name.equals(zonename)) + { + DSRecord ds = calculateDSRecord((DNSKEYRecord) r, r.getTTL()); + + i.set(ds); + } + } + } + + /** Given a zone, remove all records that are generated. + * + * @param zonename the name of the zone. + * @param records a list of {@link org.xbill.DNS.Record} objects. + */ + public static void removeGeneratedRecords(Name zonename, List records) + { + for (Iterator i = records.iterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + + if (r.getType() == Type.RRSIG || + r.getType() == Type.NSEC) + { + i.remove(); + } + } + } + + /** Remove duplicate records from a list of records. This routine + * presumes the list of records is in a canonical sorted order, at + * least on name and RR type. + * + * @param records a list of {@link org.xbill.DNS.Record} object, in + * sorted order. + */ + public static void removeDuplicateRecords(List records) + { + Record lastrec = null; + for (Iterator i = records.iterator(); i.hasNext(); ) + { + Record r = (Record) i.next(); + if (lastrec == null) + { + lastrec = r; + continue; + } + if (lastrec.equals(r)) + { + i.remove(); + continue; + } + lastrec = r; + } + } + + /** Given a DNSKEY record, generate the DS record from it. + * + * @param keyrec the KEY record in question. + * @param ttl the desired TTL for the generated DS record. If + * zero, or negative, the original KEY RR's TTL will be used. + * @return the corresponding {@link org.xbill.DNS.DSRecord} + */ + public static DSRecord calculateDSRecord(DNSKEYRecord keyrec, long ttl) + throws IOException + { + if (keyrec == null) return null; + + if (ttl <= 0) ttl = keyrec.getTTL(); + + DNSOutput os = new DNSOutput(); + + os.writeByteArray(keyrec.getName().toWireCanonical()); + os.writeByteArray(keyrec.rdataToWireCanonical()); + + try + { + MessageDigest md = MessageDigest.getInstance("SHA"); + + byte[] digest = md.digest(os.toByteArray()); + + return new DSRecord(keyrec.getName(), keyrec.getDClass(), ttl, + keyrec.getFootprint(), keyrec.getAlgorithm(), + DSRecord.SHA1_DIGEST_ID, digest); + + } + catch (NoSuchAlgorithmException e) + { + log.error("", e); + return null; + } + } +} diff --git a/src/com/verisignlabs/dnssec/security/TypeMap.java b/src/com/verisignlabs/dnssec/security/TypeMap.java new file mode 100644 index 0000000..756a66f --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/TypeMap.java @@ -0,0 +1,182 @@ +// $Id: TypeMap.java,v 1.5 2004/03/23 17:53:57 davidb Exp $ +// +// Copyright (C) 2004 Verisign, Inc. + +package com.verisignlabs.dnssec.security; + +import java.util.*; + +import org.xbill.DNS.Type; +import org.xbill.DNS.DNSOutput; + +/** This class represents the multiple type maps of the NSEC + * record. Currently it is just used to convert the wire format type + * map to the int array that org.xbill.DNS.NSECRecord uses. */ + +public class TypeMap +{ + private static final Integer[] integerArray = new Integer[0]; + + private Set typeSet; + + public TypeMap() + { + this.typeSet = new HashSet(); + } + + /** Add the given type to the typemap. */ + public void set(int type) + { + typeSet.add(new Integer(type)); + } + + /** Remove the given type from the type map. */ + public void clear(int type) + { + typeSet.remove(new Integer(type)); + } + + /** @return true if the given type is present in the type map. */ + public boolean get(int type) + { + return typeSet.contains(new Integer(type)); + } + + + public static TypeMap fromTypes(int[] types) + { + TypeMap m = new TypeMap(); + for (int i = 0; i < types.length; i++) + { + m.set(types[i]); + } + + return m; + } + + /** Given an array of bytes representing a wire-format type map, + * construct the TypeMap object. */ + public static TypeMap fromBytes(byte[] map) + { + int m = 0; + TypeMap typemap = new TypeMap(); + + int map_number; + int byte_length; + + while (m < map.length) + { + map_number = map[m++]; + byte_length = map[m++]; + + for (int i = 0; i < byte_length; i++) + { + for (int j = 0; j < 8; j++) + { + if ( (map[m + i] & (1 << (7 - j))) != 0 ) + { + typemap.set(map_number * 8 + j); + } + } + } + m += byte_length; + } + + return typemap; + } + + /** @return the normal string representation of the typemap. */ + public String toString() + { + int[] types = getTypes(); + Arrays.sort(types); + + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < types.length; i++) + { + sb.append(" "); + sb.append(Type.string(types[i])); + } + + return sb.toString(); + } + + protected static void mapToWire(DNSOutput out, int[] types, + int base, int start, int end) + { + // calculate the length of this map by looking at the largest + // typecode in this section. + int max_type = types[end - 1] & 0xFF; + int map_length = (max_type / 8) + 1; + + // write the map "header" -- the base and the length of the map. + out.writeU8(base & 0xFF); + out.writeU8(map_length & 0xFF); + + // allocate a temporary scratch space for caculating the actual + // bitmap. + byte[] map = new byte[map_length]; + + // for each type in our sub-array, set its corresponding bit in the map. + for (int i = start; i < end; i++) + { + map[ (types[i] & 0xFF) / 8 ] |= ( 1 << (7 - types[i] % 8) ); + } + // write out the resulting binary bitmap. + for (int i = 0; i < map.length; i++) + { + out.writeU8(map[i]); + } + } + + public byte[] toWire() + { + int[] types = getTypes(); + + Arrays.sort(types); + + int mapbase = -1; + int mapstart = -1; + + DNSOutput out = new DNSOutput(); + + for (int i = 0; i < types.length; i++) + { + int base = types[i] >> 8; + if (base == mapbase) continue; + if (mapstart >= 0) + { + mapToWire(out, types, mapbase, mapstart, i); + } + mapbase = base; + mapstart = i; + } + mapToWire(out, types, mapbase, mapstart, types.length); + + return out.toByteArray(); + } + + public int[] getTypes() + { + Integer[] a = (Integer[]) typeSet.toArray(integerArray); + + int[] res = new int[a.length]; + for (int i = 0; i < res.length; i++) { + res[i] = a[i].intValue(); + } + + return res; + } + + public static int[] fromWireToTypes(byte[] wire_fmt) + { + return TypeMap.fromBytes(wire_fmt).getTypes(); + } + + public static byte[] fromTypesToWire(int[] types) + { + return TypeMap.fromTypes(types).toWire(); + } + +} diff --git a/src/com/verisignlabs/dnssec/security/ZoneUtils.java b/src/com/verisignlabs/dnssec/security/ZoneUtils.java new file mode 100644 index 0000000..12338a6 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/ZoneUtils.java @@ -0,0 +1,138 @@ +// $Id: ZoneUtils.java,v 1.3 2004/01/15 17:32:18 davidb Exp $ +// +// Copyright (C) 2003 VeriSign, Inc. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA + +package com.verisignlabs.dnssec.security; + +import java.util.*; +import java.io.*; + +import org.xbill.DNS.*; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** This class contains a bunch of utility methods that are generally + * useful in manipulating zones. + * + * @author David Blacka (original) + * @author $Author: davidb $ + * @version $Revision: 1.3 $ + */ + +public class ZoneUtils +{ + + private static Log log; + + static { + log = LogFactory.getLog(ZoneUtils.class); + } + + /** Load a zone file. + * + * @param zonefile the filename/path of the zonefile to read. + * @param origin the origin to use for the zonefile (may be null if + * the origin is specified in the zone file itself). + * @return a {@link java.util.List} of {@link org.xbill.DNS.Record} + * objects. + * @throws IOException if something goes wrong reading the zone + * file. + */ + public static List readZoneFile(String zonefile, Name origin) + throws IOException + { + ArrayList records = new ArrayList(); + Master m = new Master(zonefile, origin); + + Record r = null; + + while ( (r = m.nextRecord()) != null ) + { + records.add(r); + } + + return records; + } + + /** Write the records out into a zone file. + * + * @param records a {@link java.util.List} of {@link + * org.xbill.DNS.Record} objects forming a zone. + * @param zonefile the file to write to. If null or equal to "-", + * System.out is used. + */ + public static void writeZoneFile(List records, String zonefile) + throws IOException + { + PrintWriter out = null; + + if (zonefile == null || zonefile.equals("-")) + { + out = new PrintWriter(System.out); + } + else + { + out = new PrintWriter(new BufferedWriter(new FileWriter(zonefile))); + } + + + for (Iterator i = records.iterator(); i.hasNext(); ) + { + out.println(i.next()); + } + + out.close(); + } + + /** Given just the list of records, determine the zone name + * (origin). + * + * @param records a list of {@link org.xbill.DNS.Record} or {@link + * org.xbill.DNS.RRset} objects. + * @return the zone name, if found. null if one couldn't be found.q + */ + public static Name findZoneName(List records) + { + for (Iterator i = records.iterator(); i.hasNext(); ) + { + int type = 0; + Name n = null; + + Object o = i.next(); + + if (o instanceof Record) + { + Record r = (Record) o; + type = r.getType(); + n = r.getName(); + } + else if (o instanceof RRset) + { + RRset r = (RRset) o; + type = r.getType(); + n = r.getName(); + } + + if (type == Type.SOA) return n; + } + + return null; + } +} diff --git a/src/com/verisignlabs/dnssec/security/package.html b/src/com/verisignlabs/dnssec/security/package.html new file mode 100644 index 0000000..74cf0f4 --- /dev/null +++ b/src/com/verisignlabs/dnssec/security/package.html @@ -0,0 +1,35 @@ + + +This package contains a number of utility classes that can be used to +implement DNSSEC tool (key generation, zone signing, etc.) +functionality. + +

+ +

+ + +
+ +Copyright © 2003 Verisign, Inc. by +David Blacka

+ +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version.

+ +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details.

+ +You should have received a copy of the +GNU Library General Public License +along with this library; if not, write to the +Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +

+

+ + diff --git a/svn-commit.tmp b/svn-commit.tmp new file mode 100644 index 0000000..a37ab7c --- /dev/null +++ b/svn-commit.tmp @@ -0,0 +1,4 @@ +signing tools project +--This line, and those below, will be ignored-- + +A https://svn.verisignlabs.com/main/dnssec/sectools/trunk