diff --git a/build/compile-java b/build/compile-java index b158bfd..e1856ca 100755 --- a/build/compile-java +++ b/build/compile-java @@ -1 +1,2 @@ cd ../java && ./build-java-projects + diff --git a/build/export b/build/export index b8a7335..466b697 100755 --- a/build/export +++ b/build/export @@ -6,3 +6,6 @@ ant -buildfile exportScripts/MailStreamServer.xml rm exported/Tools.jar ant -buildfile exportScripts/Tools.xml + +rm exported/PostFixMailReceiver.jar +ant -buildfile exportScripts/PostFixMailReceiver.xml diff --git a/build/exportScripts/PostfixMailReceiver.xml b/build/exportScripts/PostfixMailReceiver.xml new file mode 100644 index 0000000..fc99c7e --- /dev/null +++ b/build/exportScripts/PostfixMailReceiver.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/deploy-all b/deploy/deploy-all index a6239b2..5a5d2dd 100755 --- a/deploy/deploy-all +++ b/deploy/deploy-all @@ -1,9 +1,10 @@ -./server-shutdown tunnel +#./server-shutdown tunnel ./server-deploy tomcat -./server-deploy james +#./server-deploy james +./server-deploy postfix ./server-deploy mail-user ./server-deploy mail-key ./server-deploy tools ./web-deploy -./server-deploy tunnel +#./server-deploy tunnel diff --git a/deploy/dev-deploy-all b/deploy/dev-deploy-all index 20f637c..0292651 100755 --- a/deploy/dev-deploy-all +++ b/deploy/dev-deploy-all @@ -1,5 +1,6 @@ ./dev-server-deploy tomcat -./dev-server-deploy james +#./dev-server-deploy james +./dev-server-deploy postfix ./dev-server-deploy mail-user ./dev-server-deploy mail-key ./dev-server-deploy tools diff --git a/deploy/mail-user/resources/passwords/postfix b/deploy/mail-user/resources/passwords/postfix new file mode 120000 index 0000000..9307e64 --- /dev/null +++ b/deploy/mail-user/resources/passwords/postfix @@ -0,0 +1 @@ +../../../../passwords/postfix \ No newline at end of file diff --git a/deploy/postfix-user. b/deploy/postfix-user. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/postfix-user/catalog b/deploy/postfix-user/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/postfix-user/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/postfix-user/config/dynamicmaps.cf b/deploy/postfix-user/config/dynamicmaps.cf new file mode 100644 index 0000000..e43df54 --- /dev/null +++ b/deploy/postfix-user/config/dynamicmaps.cf @@ -0,0 +1,8 @@ +# Postfix dynamic maps configuration file. +# +#type location of .so file open function (mkmap func) +#==== ================================ ============= ============ +tcp /usr/lib/postfix/dict_tcp.so dict_tcp_open +sqlite /usr/lib/postfix/dict_sqlite.so dict_sqlite_open +mysql /usr/lib/postfix/dict_mysql.so dict_mysql_open +pcre /usr/lib/postfix/dict_pcre.so dict_pcre_open diff --git a/deploy/postfix-user/config/main.cf b/deploy/postfix-user/config/main.cf new file mode 100644 index 0000000..371bb47 --- /dev/null +++ b/deploy/postfix-user/config/main.cf @@ -0,0 +1,40 @@ +# See /usr/share/postfix/main.cf.dist for a commented, more complete version + + +# Debian specific: Specifying a file name will cause the first +# line of that file to be used as the name. The Debian default +# is /etc/mailname. +#myorigin = /etc/mailname + +smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) +biff = no + +# appending .domain is the MUA's job. +append_dot_mydomain = no + +# Uncomment the next line to generate "delayed mail" warnings +#delay_warning_time = 4h + +readme_directory = no + +# TLS parameters +smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem +smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +smtpd_use_tls=yes +smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache +smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache + +# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for +# information on enabling SSL in the smtp client. + +mailbox_size_limit = 0 +recipient_delimiter = + +inet_interfaces = all +inet_protocols = all + +javapipe_destination_recipient_limit = 1 +virtual_mailbox_domains = hash:/etc/postfix/virtual_domains +virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf +virtual_transport = javapipe + + diff --git a/deploy/postfix-user/config/master.cf b/deploy/postfix-user/config/master.cf new file mode 100644 index 0000000..f41dd6a --- /dev/null +++ b/deploy/postfix-user/config/master.cf @@ -0,0 +1,65 @@ +# +# Postfix master process configuration file. For details on the format +# of the file, see the master(5) manual page (command: "man 5 master"). +# +# Do not forget to execute "postfix reload" after editing this file. +# +# ========================================================================== +# service type private unpriv chroot wakeup maxproc command + args +# (yes) (yes) (yes) (never) (100) +# ========================================================================== +smtp inet n - - - - smtpd +#smtp inet n - - - 1 postscreen +#smtpd pass - - - - - smtpd +#dnsblog unix - - - - 0 dnsblog +#tlsproxy unix - - - - 0 tlsproxy +#submission inet n - - - - smtpd +# -o syslog_name=postfix/submission +# -o smtpd_tls_security_level=encrypt +# -o smtpd_sasl_auth_enable=yes +# -o smtpd_reject_unlisted_recipient=no +# -o smtpd_client_restrictions=$mua_client_restrictions +# -o smtpd_helo_restrictions=$mua_helo_restrictions +# -o smtpd_sender_restrictions=$mua_sender_restrictions +# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject +# -o milter_macro_daemon_name=ORIGINATING +#smtps inet n - - - - smtpd +# -o syslog_name=postfix/smtps +# -o smtpd_tls_wrappermode=yes +# -o smtpd_sasl_auth_enable=yes +# -o smtpd_reject_unlisted_recipient=no +# -o smtpd_client_restrictions=$mua_client_restrictions +# -o smtpd_helo_restrictions=$mua_helo_restrictions +# -o smtpd_sender_restrictions=$mua_sender_restrictions +# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject +# -o milter_macro_daemon_name=ORIGINATING +#628 inet n - - - - qmqpd +pickup unix n - - 60 1 pickup +cleanup unix n - - - 0 cleanup +qmgr unix n - n 300 1 qmgr +#qmgr unix n - n 300 1 oqmgr +tlsmgr unix - - - 1000? 1 tlsmgr +rewrite unix - - - - - trivial-rewrite +bounce unix - - - - 0 bounce +defer unix - - - - 0 bounce +trace unix - - - - 0 bounce +verify unix - - - - 1 verify +flush unix n - - 1000? 0 flush +proxymap unix - - n - - proxymap +proxywrite unix - - n - 1 proxymap +smtp unix - - - - - smtp +#relay unix - - - - - smtp +# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 +showq unix n - - - - showq +error unix - - - - - error +retry unix - - - - - error +discard unix - - - - - discard +local unix - n n - - local +virtual unix - n n - - virtual +lmtp unix - - - - - lmtp +anvil unix - - - - 1 anvil +scache unix - - - - 1 scache + +javapipe unix - n n - - pipe + user=postfix-user flags=DRhuX argv=java -jar /home/postfix-user/PostfixMailReceiver.jar -args $recipient + diff --git a/deploy/postfix-user/config/virtual_domains.pcre b/deploy/postfix-user/config/virtual_domains.pcre new file mode 100644 index 0000000..efad140 --- /dev/null +++ b/deploy/postfix-user/config/virtual_domains.pcre @@ -0,0 +1,2 @@ +/^.*/ OK + diff --git a/deploy/postfix-user/config/virtual_mailbox_maps.cf b/deploy/postfix-user/config/virtual_mailbox_maps.cf new file mode 100644 index 0000000..e3ae4b0 --- /dev/null +++ b/deploy/postfix-user/config/virtual_mailbox_maps.cf @@ -0,0 +1,16 @@ +# +# mysql config file for local(8) aliases(5) lookups +# + +# The user name and password to log into the mysql server. +hosts = 127.0.0.1 +user = postfix +password = postfix + +# The database name on the servers. +dbname = postfix + +# For Postfix 2.2 and later The SQL query template. +# See mysql_table(5) for details. +query = SELECT name FROM user WHERE name='%s' + diff --git a/deploy/postfix-user/resources/hosts b/deploy/postfix-user/resources/hosts new file mode 120000 index 0000000..8f2bc2e --- /dev/null +++ b/deploy/postfix-user/resources/hosts @@ -0,0 +1 @@ +../../../config/hosts \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/BucketCreate-AWS-AccessKey b/deploy/postfix-user/resources/passwords/BucketCreate-AWS-AccessKey new file mode 120000 index 0000000..e90eaf6 --- /dev/null +++ b/deploy/postfix-user/resources/passwords/BucketCreate-AWS-AccessKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-AccessKey \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/BucketCreate-AWS-SecretKey b/deploy/postfix-user/resources/passwords/BucketCreate-AWS-SecretKey new file mode 120000 index 0000000..7276a3b --- /dev/null +++ b/deploy/postfix-user/resources/passwords/BucketCreate-AWS-SecretKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-SecretKey \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/mail b/deploy/postfix-user/resources/passwords/mail new file mode 120000 index 0000000..5dd88cb --- /dev/null +++ b/deploy/postfix-user/resources/passwords/mail @@ -0,0 +1 @@ +../../../../passwords/mail \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/mail-pbe b/deploy/postfix-user/resources/passwords/mail-pbe new file mode 120000 index 0000000..b1e108a --- /dev/null +++ b/deploy/postfix-user/resources/passwords/mail-pbe @@ -0,0 +1 @@ +../../../../passwords/mail-pbe \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/mail_extra b/deploy/postfix-user/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/postfix-user/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/postfix b/deploy/postfix-user/resources/passwords/postfix new file mode 120000 index 0000000..9307e64 --- /dev/null +++ b/deploy/postfix-user/resources/passwords/postfix @@ -0,0 +1 @@ +../../../../passwords/postfix \ No newline at end of file diff --git a/deploy/postfix-user/resources/passwords/push-certificate b/deploy/postfix-user/resources/passwords/push-certificate new file mode 120000 index 0000000..f47d229 --- /dev/null +++ b/deploy/postfix-user/resources/passwords/push-certificate @@ -0,0 +1 @@ +../../../../passwords/push-certificate \ No newline at end of file diff --git a/deploy/postfix-user/run b/deploy/postfix-user/run new file mode 100755 index 0000000..10c0eae --- /dev/null +++ b/deploy/postfix-user/run @@ -0,0 +1,8 @@ +./setup + +echo "----------------------------------------------" >> ../run.log +date >> ../run.log +echo "----------------------------------------------" >> ../run.log + +sudo /etc/init.d/postfix start + diff --git a/deploy/postfix-user/setup b/deploy/postfix-user/setup new file mode 100755 index 0000000..2c41cdd --- /dev/null +++ b/deploy/postfix-user/setup @@ -0,0 +1,6 @@ +cd ~ +ln -fs deploy/PostfixMailReceiver.jar +ln -fs deploy/config +ln -fs deploy/resources + +cp resources/hosts/prod config/virtual_domains diff --git a/deploy/postfix-user/shutdown b/deploy/postfix-user/shutdown new file mode 100755 index 0000000..cf7be77 --- /dev/null +++ b/deploy/postfix-user/shutdown @@ -0,0 +1 @@ +sudo /etc/init.d/postfix stop diff --git a/gwt/src/core/crypt/CryptorPGP.java b/gwt/src/core/crypt/CryptorPGP.java new file mode 100644 index 0000000..4c58464 --- /dev/null +++ b/gwt/src/core/crypt/CryptorPGP.java @@ -0,0 +1,24 @@ +package core.crypt; + +import java.io.IOException; + +public abstract class CryptorPGP extends CryptorJS +{ + byte[] publicKeyBytes, privateKeyBytes; + + public byte[] getPublicKey () + { + return publicKeyBytes; + } + + public byte[] getPrivateKey () + { + return privateKeyBytes; + } + + protected void initialize (byte[] publicKeyBytes, byte[] privateKeyBytes) throws IOException + { + this.privateKeyBytes = privateKeyBytes; + this.publicKeyBytes = publicKeyBytes; + } +} diff --git a/gwt/src/core/crypt/CryptorPGPFactory.java b/gwt/src/core/crypt/CryptorPGPFactory.java new file mode 100644 index 0000000..91646c5 --- /dev/null +++ b/gwt/src/core/crypt/CryptorPGPFactory.java @@ -0,0 +1,58 @@ +package core.crypt; + +import java.io.IOException; +import java.io.InputStream; + +import app.service.JSInvoker; +import core.callback.Callback; +import core.callback.CallbackDefault; +import core.util.Base64; +import core.util.Pair; + +public class CryptorPGPFactory +{ + protected native String jsGenerate(int bits, String userId, String password) /*-{ + var keyPair = $wnd.pgp_genKeyPair(bits, userId, password); + var joined = keyPair.publicKey + "," + keyPair.privateKey; + return joined; + }-*/; + + protected native void jsGenerate(int bits, String userId, String password, Object callback) /*-{ + $wnd.mAsync.pgp_genKeyPair( + { invoke: function(keyPair) { callback.invoke(keyPair.publicKey, keyPair.privateKey); } }, + bits, + userId, password + ); + }-*/; + + public Pair generate (int bits, String userId, String password) + { + String joined = jsGenerate(bits, userId, password); + String[] split = joined.split(","); + + return new Pair(Base64.decode(split[0]), Base64.decode(split[1])); + } + + public void generate (int bits, String userId, String password, Callback callback) + { + Callback synth = new CallbackDefault() { + public void onSuccess(Object... arguments) throws Exception + { + String split[] = { (String)arguments[0], (String)arguments[1] }; + callback.invoke(new Pair(Base64.decode(split[0]), Base64.decode(split[1]))); + } + }.setReturn(callback); + + jsGenerate(bits, userId, password, JSInvoker.wrap(synth)); + } + + public static CryptorPGP fromResources(InputStream publicKey, InputStream privateKey) throws IOException { + return new CryptorPGPJS(publicKey, privateKey); + } + + public static CryptorRSA fromString(String publicKey, Object object) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/gwt/src/core/crypt/CryptorPGPFactoryEnvironment.java b/gwt/src/core/crypt/CryptorPGPFactoryEnvironment.java new file mode 100644 index 0000000..bce0cb0 --- /dev/null +++ b/gwt/src/core/crypt/CryptorPGPFactoryEnvironment.java @@ -0,0 +1,39 @@ +package core.crypt; + +import core.constants.ConstantsEnvironmentKeys; +import core.exceptions.CryptoException; +import core.util.Base64; +import core.util.Environment; + +public class CryptorPGPFactoryEnvironment { + + public static CryptorPGP create(Environment environment) throws CryptoException + { + return createJS(environment); + } + + public static CryptorPGP createJS (Environment env) throws CryptoException + { + try + { + String publicKeyString = env.get(ConstantsEnvironmentKeys.PGP_PUBLIC_KEY); + byte[] publicKeyBytes = null; + if (publicKeyString != null) + publicKeyBytes = Base64.decode(publicKeyString); + + String privateKeyString = env.get(ConstantsEnvironmentKeys.PGP_PRIVATE_KEY); + byte[] privateKeyBytes = null; + if (privateKeyString != null) + privateKeyBytes = Base64.decode(privateKeyString); + + return new CryptorPGPJS ( + publicKeyBytes, + privateKeyBytes + ); + } + catch (Exception e) + { + throw new CryptoException(e); + } + } +} diff --git a/gwt/src/core/crypt/CryptorPGPJS.java b/gwt/src/core/crypt/CryptorPGPJS.java new file mode 100644 index 0000000..1647178 --- /dev/null +++ b/gwt/src/core/crypt/CryptorPGPJS.java @@ -0,0 +1,87 @@ +package core.crypt; + +import java.io.IOException; +import java.io.InputStream; + +import app.service.JSInvoker; + +import com.google.gwt.core.client.JavaScriptObject; + +import core.util.Base64; +import core.util.LogNull; +import core.util.LogOut; +import core.util.Strings; +import core.callback.Callback; +import core.callback.CallbackDefault; +import core.util.Streams; + +public class CryptorPGPJS extends CryptorPGP +{ + static LogNull log = new LogNull(CryptorPGPJS.class); + + JavaScriptObject privateKey, publicKey; + + protected void initialize (byte[] publicKeyBytes, byte[] privateKeyBytes) throws IOException + { + super.initialize(publicKeyBytes, privateKeyBytes); + + if (privateKeyBytes != null) + privateKey = jsGetPrivKey(Base64.encode(privateKeyBytes)); + + if (publicKeyBytes != null) + publicKey = jsGetPubKey(Base64.encode(publicKeyBytes)); + } + + public CryptorPGPJS(InputStream pri, InputStream pub) throws IOException + { + initialize( + pub != null ? Streams.readFullyBytes(pub) : null, + pri != null ? Streams.readFullyBytes(pri) : null + ); + } + + public CryptorPGPJS(byte[] publicKeyBytes, byte[] privateKeyBytes) throws IOException + { + initialize(publicKeyBytes, privateKeyBytes); + } + + //------------------------------------------------------------ + + public Callback jsEncrypt_() + { + return new CallbackDefault() { + public void onSuccess(Object... arguments) throws Exception { + log.debug("jsEncrypt_",arguments[0]); + jsEncrypt(publicKey, (String)(arguments[0]), JSInvoker.wrap(callback)); + } + }; + } + + public Callback jsDecrypt_() + { + return new CallbackDefault() { + public void onSuccess(Object... arguments) throws Exception { + log.debug("jsDecrypt_", arguments[0]); + jsDecrypt(privateKey, (String)(arguments[0]), JSInvoker.wrap(callback)); + } + }; + } + + //------------------------------------------------------------ + + public native JavaScriptObject jsGetPrivKey (String pem64) /*-{ + return $wnd.mSupport.pgp_getPrivateKey(pem64); + }-*/; + + public native JavaScriptObject jsGetPubKey (String pem64) /*-{ + return $wnd.mSupport.pgp_getPublicKey(pem64); + }-*/; + + public native void jsEncrypt(JavaScriptObject key, String bytes64, JavaScriptObject callback) /*-{ + return $wnd.mAsync.pgp_encrypt(callback, key, bytes64); + }-*/; + + public native void jsDecrypt(JavaScriptObject key, String bytes64, JavaScriptObject callback) /*-{ + return $wnd.mAsync.pgp_decrypt(callback, key, bytes64); + }-*/; +} diff --git a/gwt/src/core/util/HttpDelegateFactory.java b/gwt/src/core/util/HttpDelegateFactory.java new file mode 100644 index 0000000..04f2449 --- /dev/null +++ b/gwt/src/core/util/HttpDelegateFactory.java @@ -0,0 +1,12 @@ +package core.util; + +import app.service.JSHttpDelegate; +import app.service.Main; + +public class HttpDelegateFactory +{ + static HttpDelegate create () + { + return new JSHttpDelegate(Main.delegate); + } +} diff --git a/gwt/src/core/util/Zip.java b/gwt/src/core/util/Zip.java index d7b7ead..7235b8b 100644 --- a/gwt/src/core/util/Zip.java +++ b/gwt/src/core/util/Zip.java @@ -125,7 +125,7 @@ public class Zip { try { - return new CallbackSync(inflate_()).export(); + return new CallbackSync(inflate_()).export(); } catch(Exception e) { diff --git a/install/create-server-accounts.remote b/install/create-server-accounts.remote index 56c954f..63f0160 100755 --- a/install/create-server-accounts.remote +++ b/install/create-server-accounts.remote @@ -2,6 +2,7 @@ set -x ./create-server-account-user.remote web ./create-server-account-user.remote james +./create-server-account-user.remote postfix-user ./create-server-account-user.remote mail-user ./create-server-account-user.remote mail-key ./create-server-account-user.remote tomcat diff --git a/install/setup-java b/install/setup-java index a71e4cc..1846a06 100755 --- a/install/setup-java +++ b/install/setup-java @@ -4,5 +4,5 @@ M_ROOT=`cat requirements/server_root_account` M_HOST=$1 scp setup-java.remote $M_ROOT@$M_HOST: -ssh $M_ROOT@$M_HOST ./setup-java.remote +ssh $M_ROOT@$M_HOST sudo ./setup-java.remote diff --git a/install/setup-java.remote b/install/setup-java.remote index a35e423..182ac2d 100755 --- a/install/setup-java.remote +++ b/install/setup-java.remote @@ -2,10 +2,14 @@ # because icetea has errors. After spending near 30 hours trying to negotiate icetea screw ups # I realized: why bother? -sudo add-apt-repository ppa:webupd8team/java --yes -sudo apt-get update -#sudo apt-get install oracle-java7-installer --yes -sudo apt-get install oracle-java6-installer --yes +add-apt-repository ppa:webupd8team/java --yes +apt-get update + +echo "yes +yes" | apt-get install oracle-java7-installer --yes + +#echo "yes +#yes" | apt-get install oracle-java6-installer --yes echo "Check the version after running this script, if it is not sun java then" echo "read this: http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html" diff --git a/install/setup-mysql.remote b/install/setup-mysql.remote index 55b427a..91259f0 100755 --- a/install/setup-mysql.remote +++ b/install/setup-mysql.remote @@ -1,6 +1,8 @@ set -x -sudo apt-get install mysql-server --yes +echo " + +" | sudo apt-get install mysql-server --yes mysql -u root < setup-mysql.sql rm setup-mysql.sql diff --git a/install/setup-mysql.sql.template b/install/setup-mysql.sql.template index 365b91b..a0c47fb 100644 --- a/install/setup-mysql.sql.template +++ b/install/setup-mysql.sql.template @@ -1,14 +1,17 @@ CREATE DATABASE mail DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; CREATE DATABASE mail_extra DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; CREATE DATABASE captcha DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; +CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; CREATE DATABASE james CHARACTER SET utf8; CREATE USER 'mail'@'localhost' IDENTIFIED BY 'MAIL_PASSWORD'; CREATE USER 'mail_extra'@'localhost' IDENTIFIED BY 'MAIL_EXTRA_PASSWORD'; CREATE USER 'captcha'@'localhost' IDENTIFIED BY 'CAPTCHA_PASSWORD'; CREATE USER 'james'@'localhost' IDENTIFIED BY 'JAMES_PASSWORD'; +CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfix'; GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost'; GRANT ALL PRIVILEGES ON mail_extra.* TO 'mail_extra'@'localhost'; GRANT ALL PRIVILEGES ON captcha.* TO 'captcha'@'localhost'; GRANT ALL PRIVILEGES ON james.* TO 'james'@'localhost'; +GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost'; diff --git a/install/setup-postfix b/install/setup-postfix new file mode 100755 index 0000000..2b952ca --- /dev/null +++ b/install/setup-postfix @@ -0,0 +1,9 @@ +set -x + +M_HOST=$1 +M_ROOT=`cat requirements/server_root_account` + +scp sudoers.d-postfix-user $M_ROOT@$M_HOST: +scp setup-postfix.remote $M_ROOT@$M_HOST: +ssh $M_ROOT@$M_HOST sudo ./setup-postfix.remote + diff --git a/install/setup-postfix.remote b/install/setup-postfix.remote new file mode 100755 index 0000000..321bc1e --- /dev/null +++ b/install/setup-postfix.remote @@ -0,0 +1,17 @@ +set -x + +echo "1" | apt-get install postfix postfix-mysql postfix-pcre --yes + +cp sudoers.d-postfix-user /etc/sudoers.d/postfix-user +chmod 0440 /etc/sudoers.d/postfix-user + +cd /etc/postfix +rm main.cf +rm master.cf + +ln -fs /home/postfix-user/config/main.cf +ln -fs /home/postfix-user/config/master.cf +#ln -fs /home/postfix-user/config/virtual_domains.pcre +ln -fs /home/postfix-user/config/virtual_domains +ln -fs /home/postfix-user/config/virtual_mailbox_maps.cf + diff --git a/install/setup-server b/install/setup-server index 50671a3..10146d9 100755 --- a/install/setup-server +++ b/install/setup-server @@ -7,7 +7,8 @@ M_HOST=$1 ./create-server-accounts $M_HOST ./setup-utils $M_HOST -./setup-james $M_HOST +#./setup-james $M_HOST +./setup-postfix $M_HOST ./setup-java $M_HOST ./setup-mysql $M_HOST ./setup-tomcat $M_HOST diff --git a/install/setup-web.remote b/install/setup-web.remote index 9020717..05f57cd 100755 --- a/install/setup-web.remote +++ b/install/setup-web.remote @@ -1,8 +1,8 @@ set -x -sudo ./setup-nginx.remote +./setup-nginx.remote -sudo mkdir -p /var/log/nginx +mkdir -p /var/log/nginx chdown nginx /var/log/nginx cp sudoers.d-web /etc/sudoers.d/web diff --git a/install/sudoers.d-postfix-user b/install/sudoers.d-postfix-user new file mode 100644 index 0000000..3df4256 --- /dev/null +++ b/install/sudoers.d-postfix-user @@ -0,0 +1 @@ +postfix-user ALL = (root) NOPASSWD :/etc/init.d/postfix stop,/etc/init.d/postfix start diff --git a/java/app/service/src/app/service/JSSignUp.java b/java/app/service/src/app/service/JSSignUp.java index a5131af..6bf55ff 100644 --- a/java/app/service/src/app/service/JSSignUp.java +++ b/java/app/service/src/app/service/JSSignUp.java @@ -28,6 +28,7 @@ import core.constants.ConstantsEnvironmentKeys; import core.constants.ConstantsClient; import core.constants.ConstantsStorage; import core.constants.ConstantsVersion; +import core.crypt.CryptorPGPFactory; import core.crypt.CryptorRSAFactory; import core.crypt.KeyPairFromPassword; import core.io.IoChain; @@ -145,8 +146,11 @@ public class JSSignUp implements Exportable, SRPClientListener String awsReadWriteAccessKey, awsReadWriteSecretKey; String smtpPassword; - byte[] publicKey; - byte[] privateKey; + byte[] rsaPublicKey; + byte[] rsaPrivateKey; + + byte[] pgpPublicKey; + byte[] pgpPrivateKey; String stripeCardNumber, stripeCardExpMonth, stripeCardExpYear, stripeCardCVC; String stripeTransactionID; @@ -209,8 +213,25 @@ public class JSSignUp implements Exportable, SRPClientListener public void onSuccess(Object... arguments) throws Exception { Pair pair = (Pair)arguments[0]; - publicKey = pair.first; - privateKey = pair.second; + rsaPublicKey = pair.first; + rsaPrivateKey = pair.second; + + callback.invoke(); + } + }.setReturn(callback) + ); + } + + public void calculatePGP (Callback callback) throws NoSuchAlgorithmException + { + new CryptorPGPFactory().generate(2048, name, password, new CallbackDefault() { + + @Override + public void onSuccess(Object... arguments) throws Exception { + Pair pair = (Pair)arguments[0]; + + pgpPublicKey = pair.first; + pgpPrivateKey = pair.second; callback.invoke(); } @@ -234,7 +255,11 @@ public class JSSignUp implements Exportable, SRPClientListener serverEnvironment.put(prefix + ConstantsDropbox.DropboxTokenSecret, dropboxUserSecret); serverEnvironment.put( ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY, - Base64.encode(publicKey) + Base64.encode(rsaPublicKey) + ); + serverEnvironment.put( + ConstantsEnvironmentKeys.PGP_PUBLIC_KEY, + Base64.encode(pgpPublicKey) ); clientEnvironment = new Environment(); @@ -248,12 +273,20 @@ public class JSSignUp implements Exportable, SRPClientListener clientEnvironment.put(prefix + ConstantsDropbox.DropboxTokenSecret, dropboxUserSecret); clientEnvironment.put( ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY, - Base64.encode(publicKey) + Base64.encode(rsaPublicKey) ); clientEnvironment.put( ConstantsEnvironmentKeys.PRIVATE_DECRYPTION_KEY, - Base64.encode(privateKey) + Base64.encode(rsaPrivateKey) ); + clientEnvironment.put( + ConstantsEnvironmentKeys.PGP_PUBLIC_KEY, + Base64.encode(pgpPublicKey) + ); + clientEnvironment.put( + ConstantsEnvironmentKeys.PGP_PRIVATE_KEY, + Base64.encode(pgpPrivateKey) + ); completeEnvironment = new Environment(); completeEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION); @@ -276,7 +309,11 @@ public class JSSignUp implements Exportable, SRPClientListener serverEnvironment.put(prefix + ConstantsS3.AWSBucketRegion, awsBucketRegion); serverEnvironment.put( ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY, - Base64.encode(publicKey) + Base64.encode(rsaPublicKey) + ); + serverEnvironment.put( + ConstantsEnvironmentKeys.PGP_PUBLIC_KEY, + Base64.encode(pgpPublicKey) ); clientEnvironment = new Environment(); @@ -289,12 +326,20 @@ public class JSSignUp implements Exportable, SRPClientListener clientEnvironment.put(prefix + ConstantsS3.AWSBucketRegion, awsBucketRegion); clientEnvironment.put( ConstantsEnvironmentKeys.PUBLIC_ENCRYPTION_KEY, - Base64.encode(publicKey) + Base64.encode(rsaPublicKey) ); clientEnvironment.put( ConstantsEnvironmentKeys.PRIVATE_DECRYPTION_KEY, - Base64.encode(privateKey) + Base64.encode(rsaPrivateKey) ); + clientEnvironment.put( + ConstantsEnvironmentKeys.PGP_PUBLIC_KEY, + Base64.encode(pgpPublicKey) + ); + clientEnvironment.put( + ConstantsEnvironmentKeys.PGP_PRIVATE_KEY, + Base64.encode(pgpPrivateKey) + ); completeEnvironment = new Environment(); completeEnvironment.put(ConstantsEnvironmentKeys.CONFIGURATION_VERSION, ConstantsVersion.CONFIGURATION); @@ -345,6 +390,16 @@ public class JSSignUp implements Exportable, SRPClientListener } }); + signUpChain.addCallback(new CallbackDefault(info) { + public void onSuccess(Object... arguments) throws Exception { + log.debug("signUp_step_createPGP"); + + SignUpInfo info = (SignUpInfo)V(0); + JSInvoker.invoke(info.callback.getCallback(), "progress", new Object[] { "Creating PGP key pair." }); + info.calculatePGP(callback); + } + }); + signUpChain.addCallback(new CallbackDefault(info) { public void onSuccess(Object... arguments) throws Exception { log.debug("signUp_step_genKeyPair"); diff --git a/java/app/service/src/app/service/Main.java b/java/app/service/src/app/service/Main.java index 97e12a5..97fb1dc 100644 --- a/java/app/service/src/app/service/Main.java +++ b/java/app/service/src/app/service/Main.java @@ -38,7 +38,7 @@ public class Main extends JSApplet implements Exportable, SRPClientListener static String VERSION_STRING = "M"; - Object delegate; + public static Object delegate; JSEventPropagator eventPropagator; public Main () diff --git a/java/core/build.xml b/java/core/build.xml index a2b7082..b77e74f 100644 --- a/java/core/build.xml +++ b/java/core/build.xml @@ -9,7 +9,7 @@ - + diff --git a/java/core/src/core/callback/CallbackSync.java b/java/core/src/core/callback/CallbackSync.java index e42d330..8720c00 100644 --- a/java/core/src/core/callback/CallbackSync.java +++ b/java/core/src/core/callback/CallbackSync.java @@ -6,7 +6,7 @@ package core.callback; -public class CallbackSync +public class CallbackSync { CallbackChain chain; Object[] results; @@ -16,7 +16,7 @@ public class CallbackSync chain = callback.addCallback(setResults_()); } - public CallbackSync invoke (Object...args) + public CallbackSync invoke (Object...args) { chain.invoke(args); return this; @@ -31,7 +31,7 @@ public class CallbackSync }; } - public T exportNoException () + public T exportNoException () { try { @@ -47,7 +47,7 @@ public class CallbackSync } } - public T export() throws Exception + public T export() throws Exception { if (results != null && results.length > 0) { @@ -62,4 +62,21 @@ public class CallbackSync return null; } + + public T export(int i) throws Exception + { + if (results != null && results.length > i) + { + if (results[0] instanceof Exception) + { + Exception e = (Exception)results[0]; + throw e; + } + + return (T)results[i]; + } + + return null; + } + } diff --git a/java/core/src/core/constants/ConstantsEnvironmentKeys.java b/java/core/src/core/constants/ConstantsEnvironmentKeys.java index 375864e..50f4809 100644 --- a/java/core/src/core/constants/ConstantsEnvironmentKeys.java +++ b/java/core/src/core/constants/ConstantsEnvironmentKeys.java @@ -13,4 +13,7 @@ public class ConstantsEnvironmentKeys public static final String VERSION = "version"; public static final String CLIENT_ENVIRONMENT = "client"; public static final String SERVER_ENVIRONMENT = "server"; + + public static final String PGP_PUBLIC_KEY = "PGP-PublicKey"; + public static final String PGP_PRIVATE_KEY = "PGP-PrivateKey"; } diff --git a/java/core/src/core/constants/ConstantsServer.java b/java/core/src/core/constants/ConstantsServer.java index c326df4..96eb0b7 100644 --- a/java/core/src/core/constants/ConstantsServer.java +++ b/java/core/src/core/constants/ConstantsServer.java @@ -9,6 +9,7 @@ public class ConstantsServer public static final String LOCAL_MAIL_SERVER, DBCONNECTION_PREFIX; public static final String KEY_SERVER; public static final String LOCAL_SMTP_HOST; + public static final String AT_HOST; static { @@ -20,6 +21,7 @@ public class ConstantsServer DBCONNECTION_PREFIX = "jdbc:mysql://" + Hosts.getHostFor("local_db_dev") + "/"; KEY_SERVER = Hosts.getHostFor("local_key_dev"); LOCAL_SMTP_HOST = Hosts.getHostFor("local_smtp_dev"); + AT_HOST = "@" + Hosts.getHostFor("dev"); } else { @@ -31,6 +33,7 @@ public class ConstantsServer LOCAL_MAIL_SERVER = Hosts.getHostFor("local_mail_prod"); DBCONNECTION_PREFIX = "jdbc:mysql://" + Hosts.getHostFor("local_db_prod") + "/"; LOCAL_SMTP_HOST = Hosts.getHostFor("local_smtp_prod"); + AT_HOST = "@" + Hosts.getHostFor("prod"); } } diff --git a/java/core/src/core/crypt/CryptorRSAAES.java b/java/core/src/core/crypt/CryptorRSAAES.java index 134b58d..37dac64 100644 --- a/java/core/src/core/crypt/CryptorRSAAES.java +++ b/java/core/src/core/crypt/CryptorRSAAES.java @@ -193,7 +193,7 @@ public class CryptorRSAAES extends Cryptor { try { - return new CallbackSync(encrypt_()).invoke(bytes).export(); + return new CallbackSync(encrypt_()).invoke(bytes).export(); } catch (Exception e) { @@ -206,7 +206,7 @@ public class CryptorRSAAES extends Cryptor { try { - return new CallbackSync(decrypt_()).invoke(bytes).export(); + return new CallbackSync(decrypt_()).invoke(bytes).export(); } catch (Exception e) { diff --git a/java/core/src/core/crypt/CryptorRSABC.java b/java/core/src/core/crypt/CryptorRSABC.java index ebd3baf..e2a51e3 100644 --- a/java/core/src/core/crypt/CryptorRSABC.java +++ b/java/core/src/core/crypt/CryptorRSABC.java @@ -32,8 +32,8 @@ public class CryptorRSABC extends CryptorRSA public final int MAX_RSA_BLOCK_SIZE = 117; - RSAPublicKey publicKey; - RSAPrivateKey privateKey; + public RSAPublicKey publicKey; + public RSAPrivateKey privateKey; public static final byte[] iv = Arrays.generate(16, 0); diff --git a/java/core/src/core/crypt/PgpEncryption.java.no b/java/core/src/core/crypt/PgpEncryption.java.no new file mode 100644 index 0000000..1c439a9 --- /dev/null +++ b/java/core/src/core/crypt/PgpEncryption.java.no @@ -0,0 +1,332 @@ +package core.crypt; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.NoSuchProviderException; +import java.util.Date; +import java.util.Iterator; + +import org.bc.bcpg.ArmoredOutputStream; +import org.bc.crypto.params.AsymmetricKeyParameter; +import org.bc.crypto.util.PrivateKeyFactory; +import org.bc.crypto.util.PublicKeyFactory; +import org.bc.openpgp.PGPCompressedData; +import org.bc.openpgp.PGPCompressedDataGenerator; +import org.bc.openpgp.PGPEncryptedData; +import org.bc.openpgp.PGPEncryptedDataGenerator; +import org.bc.openpgp.PGPEncryptedDataList; +import org.bc.openpgp.PGPException; +import org.bc.openpgp.PGPLiteralData; +import org.bc.openpgp.PGPLiteralDataGenerator; +import org.bc.openpgp.PGPObjectFactory; +import org.bc.openpgp.PGPPrivateKey; +import org.bc.openpgp.PGPPublicKey; +import org.bc.openpgp.PGPPublicKeyEncryptedData; +import org.bc.openpgp.PGPUtil; +import org.bc.openpgp.operator.KeyFingerPrintCalculator; +import org.bc.openpgp.operator.bc.BcPGPDataEncryptorBuilder; +import org.bc.openpgp.operator.bc.BcPGPKeyConverter; +import org.bc.openpgp.operator.bc.BcPublicKeyDataDecryptorFactory; +import org.bc.openpgp.operator.bc.BcPublicKeyKeyEncryptionMethodGenerator; + +import core.util.Pair; + +/** + * Simple routine to encrypt and decrypt using a Public and Private key with passphrase. This service + * routine provides the basic PGP services between byte arrays. + * + */ +public class PgpEncryption { + + + /* + private static PGPPrivateKey findSecretKey( + PGPSecretKeyRingCollection pgpSec, long keyID, char[] pass) + throws PGPException, NoSuchProviderException { + PGPSecretKey pgpSecKey = pgpSec.getSecretKey(keyID); + + if (pgpSecKey == null) { + return null; + } + + return pgpSecKey.extractPrivateKey(pass, "BC"); + } + */ + + private static boolean isCorrectPublicKey ( + PGPPrivateKey sKey, long keyID + ) + { + return sKey.getKeyID() == keyID; + } + + /** + * decrypt the passed in message stream + * + * @param encrypted + * The message to be decrypted. + * @param passPhrase + * Pass phrase (key) + * + * @return Clear text as a byte array. I18N considerations are not handled + * by this routine + * @exception IOException + * @exception PGPException + * @exception NoSuchProviderException + */ + public static byte[] decrypt(byte[] encrypted, PGPPrivateKey sKey) + throws IOException, PGPException, NoSuchProviderException { + + KeyFingerPrintCalculator keyFingerPrintCalculator = null; + + InputStream in = new ByteArrayInputStream(encrypted); + + in = PGPUtil.getDecoderStream(in); + + PGPObjectFactory pgpF = new PGPObjectFactory(in, keyFingerPrintCalculator); + PGPEncryptedDataList enc = null; + Object o = pgpF.nextObject(); + + // + // the first object might be a PGP marker packet. + // + if (o instanceof PGPEncryptedDataList) { + enc = (PGPEncryptedDataList) o; + } else { + enc = (PGPEncryptedDataList) pgpF.nextObject(); + } + + + // + // find the secret key + // + Iterator it = enc.getEncryptedDataObjects(); +// PGPPrivateKey sKey = null; + PGPPublicKeyEncryptedData pbe = null; + // PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection( + // PGPUtil.getDecoderStream(keyIn)); + + while (it.hasNext()) { + pbe = (PGPPublicKeyEncryptedData) it.next(); + + if (isCorrectPublicKey(sKey, pbe.getKeyID())) + break; +// sKey = findSecretKey(pgpSec, pbe.getKeyID(), password); + } + + if (!isCorrectPublicKey(sKey, pbe.getKeyID())) { + throw new IllegalArgumentException( + "secret key for message not found."); + } + + InputStream clear = pbe.getDataStream(new BcPublicKeyDataDecryptorFactory(sKey)); + + PGPObjectFactory pgpFact = new PGPObjectFactory(clear, keyFingerPrintCalculator); + + PGPCompressedData cData = (PGPCompressedData) pgpFact.nextObject(); + + pgpFact = new PGPObjectFactory(cData.getDataStream(), keyFingerPrintCalculator); + + PGPLiteralData ld = (PGPLiteralData) pgpFact.nextObject(); + + InputStream unc = ld.getInputStream(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int ch; + + while ((ch = unc.read()) >= 0) { + out.write(ch); + + } + + byte[] returnBytes = out.toByteArray(); + out.close(); + return returnBytes; + } + + /** + * Simple PGP encryptor between byte[]. + * + * @param clearData + * The test to be encrypted + * @param passPhrase + * The pass phrase (key). This method assumes that the key is a + * simple pass phrase, and does not yet support RSA or more + * sophisiticated keying. + * @param fileName + * File name. This is used in the Literal Data Packet (tag 11) + * which is really inly important if the data is to be related to + * a file to be recovered later. Because this routine does not + * know the source of the information, the caller can set + * something here for file name use that will be carried. If this + * routine is being used to encrypt SOAP MIME bodies, for + * example, use the file name from the MIME type, if applicable. + * Or anything else appropriate. + * + * @param armor + * + * @return encrypted data. + * @exception IOException + * @exception PGPException + * @exception NoSuchProviderException + */ + public static byte[] encrypt(byte[] clearData, PGPPublicKey encKey, + String fileName,boolean withIntegrityCheck, boolean armor) + throws IOException, PGPException, NoSuchProviderException { + if (fileName == null) { + fileName = PGPLiteralData.CONSOLE; + } + + ByteArrayOutputStream encOut = new ByteArrayOutputStream(); + + OutputStream out = encOut; + if (armor) { + out = new ArmoredOutputStream(out); + } + + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + + PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator( + PGPCompressedDataGenerator.ZIP); + OutputStream cos = comData.open(bOut); // open it with the final + // destination + PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator(); + + // we want to generate compressed data. This might be a user option + // later, + // in which case we would pass in bOut. + OutputStream pOut = lData.open(cos, // the compressed output stream + PGPLiteralData.BINARY, fileName, // "filename" to store + clearData.length, // length of clear data + new Date() // current time + ); + pOut.write(clearData); + + lData.close(); + comData.close(); + + PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator( + new BcPGPDataEncryptorBuilder(PGPEncryptedData.CAST5) + ); + + cPk.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(encKey)); + + byte[] bytes = bOut.toByteArray(); + + OutputStream cOut = cPk.open(out, bytes.length); + + cOut.write(bytes); // obtain the actual bytes from the compressed stream + + cOut.close(); + + out.close(); + + return encOut.toByteArray(); + } + + /* + private static PGPPublicKey readPublicKey(InputStream in) + throws IOException, PGPException { + in = PGPUtil.getDecoderStream(in); + + PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in); + + // + // we just loop through the collection till we find a key suitable for + // encryption, in the real + // world you would probably want to be a bit smarter about this. + // + + // + // iterate through the key rings. + // + Iterator rIt = pgpPub.getKeyRings(); + + while (rIt.hasNext()) { + PGPPublicKeyRing kRing = (PGPPublicKeyRing) rIt.next(); + Iterator kIt = kRing.getPublicKeys(); + + while (kIt.hasNext()) { + PGPPublicKey k = (PGPPublicKey) kIt.next(); + + if (k.isEncryptionKey()) { + return k; + } + } + } + + throw new IllegalArgumentException( + "Can't find encryption key in key ring."); + } + */ + private static PGPPublicKey readPublicKey(InputStream in) + throws IOException, PGPException { + + return null; + }; + + public static byte[] getBytesFromFile(File file) throws IOException { + InputStream is = new FileInputStream(file); + + // Get the size of the file + long length = file.length(); + + if (length > Integer.MAX_VALUE) { + // File is too large + } + + // Create the byte array to hold the data + byte[] bytes = new byte[(int)length]; + + // Read in the bytes + int offset = 0; + int numRead = 0; + while (offset < bytes.length + && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { + offset += numRead; + } + + // Ensure all the bytes have been read in + if (offset < bytes.length) { + throw new IOException("Could not completely read file "+file.getName()); + } + + // Close the input stream and return bytes + is.close(); + return bytes; + } + + public static void main(String[] args) throws Exception { + + + byte[] original = "Hello world".getBytes(); + System.out.println("Starting PGP test"); + + CryptorRSAFactory factory= new CryptorRSAFactory(); + Pair result = factory.generate(2048); + Date date = new Date(); + + BcPGPKeyConverter converter = new BcPGPKeyConverter(); + AsymmetricKeyParameter publicKeyParameter = PublicKeyFactory.createKey(result.first); + PGPPublicKey pgpPublicKey = converter.getPGPPublicKey(1, publicKeyParameter, date); + + byte[] encrypted = encrypt(original, pgpPublicKey, null, + true, true); + + System.out.println("\nencrypted data = '" + new String(encrypted) + "'"); + + AsymmetricKeyParameter privateKeyParameter = PrivateKeyFactory.createKey(result.second); + PGPPrivateKey pgpPrivateKey = converter.getPGPPrivateKey(pgpPublicKey, privateKeyParameter); + + byte[] decrypted = decrypt(encrypted, pgpPrivateKey); + + System.out.println("\ndecrypted data = '" + new String(decrypted) + "'"); + + + } +} \ No newline at end of file diff --git a/java/core/src/core/server/srp/db/sql/create_tables b/java/core/src/core/server/srp/db/sql/create_tables index ecd8894..6bc978e 100644 --- a/java/core/src/core/server/srp/db/sql/create_tables +++ b/java/core/src/core/server/srp/db/sql/create_tables @@ -10,7 +10,7 @@ INSERT IGNORE INTO registry (k,v) VALUES ("max_users", "1000"); CREATE TABLE IF NOT EXISTS user ( version VARCHAR(50), id INTEGER AUTO_INCREMENT, - name VARCHAR(255) COLLATE utf8_general_ci NOT NULL DEFAULT '', + name VARCHAR(255) NOT NULL DEFAULT '', v TEXT, s TEXT, mark TIMESTAMP DEFAULT CURRENT_TIMESTAMP, @@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS failure ( CREATE TABLE IF NOT EXISTS deleted_user ( version VARCHAR(50), id INTEGER AUTO_INCREMENT, - name VARCHAR(255) COLLATE utf8_general_ci NOT NULL DEFAULT '', + name VARCHAR(255) NOT NULL DEFAULT '', v TEXT, s TEXT, mark TIMESTAMP NULL DEFAULT NULL, @@ -51,5 +51,4 @@ CREATE TABLE IF NOT EXISTS deleted_user ( CREATE TABLE IF NOT EXISTS deleted_mail_block LIKE mail_block; CREATE TABLE IF NOT EXISTS deleted_key_block LIKE key_block; -DROP TABLE IF EXISTS metadata; \ No newline at end of file diff --git a/java/core/src/core/util/HttpDelegate.java b/java/core/src/core/util/HttpDelegate.java index 08eb046..a4c1e2c 100644 --- a/java/core/src/core/util/HttpDelegate.java +++ b/java/core/src/core/util/HttpDelegate.java @@ -27,7 +27,7 @@ public abstract class HttpDelegate boolean binaryInput = (Boolean)V(3); boolean binaryOutput = (Boolean)V(4); - byte[] content = (byte[])arguments[0]; + byte[] content = (arguments!=null && arguments.length > 0) ? (byte[])arguments[0] : null; execute(action, url, headers, binaryInput, binaryOutput, content, callback); } diff --git a/java/core/src/mail/client/Actions.java b/java/core/src/mail/client/Actions.java index 6a47739..8bc2646 100644 --- a/java/core/src/mail/client/Actions.java +++ b/java/core/src/mail/client/Actions.java @@ -10,6 +10,7 @@ import mail.client.model.Attachments; import mail.client.model.Body; import mail.client.model.Conversation; import mail.client.model.Header; +import mail.client.model.Identity; import mail.client.model.Mail; import mail.client.model.Recipients; import mail.client.model.TransportState; @@ -167,4 +168,9 @@ public class Actions extends Servent return reply; } + + public void lookUpPGPKeyFor (Identity identity) + { + master.getMailer().lookUpPGPFor (identity); + } } diff --git a/java/core/src/mail/client/Mailer.java b/java/core/src/mail/client/Mailer.java index 2353ade..ee78e36 100644 --- a/java/core/src/mail/client/Mailer.java +++ b/java/core/src/mail/client/Mailer.java @@ -151,4 +151,8 @@ public class Mailer extends Servent master.getIndexer().conversationChanged(conversation); master.getEventPropagator().signal(Events.SendFailed, mail); } + + public void lookUpPGPFor(Identity identity) + { + } } diff --git a/java/core/src/mail/server/db/ExternalData.java b/java/core/src/mail/server/db/ExternalData.java new file mode 100644 index 0000000..b62eeb9 --- /dev/null +++ b/java/core/src/mail/server/db/ExternalData.java @@ -0,0 +1,9 @@ +package mail.server.db; + +public interface ExternalData { + + public void addUser (String name, String password) throws Exception; + public void removeUser (String name) throws Exception; + + public void setUserPassword (String name, String password) throws Exception; +} diff --git a/java/core/src/mail/server/db/ExternalDataFactory.java b/java/core/src/mail/server/db/ExternalDataFactory.java new file mode 100644 index 0000000..70eb9b9 --- /dev/null +++ b/java/core/src/mail/server/db/ExternalDataFactory.java @@ -0,0 +1,11 @@ +package mail.server.db; + +import mail.server.postfix.ExternalDataPostfix; + +public class ExternalDataFactory { + + public static ExternalData createInstance () throws Exception + { + return new ExternalDataPostfix(); + } +} diff --git a/java/core/src/mail/server/james/ExternalDataJames.java b/java/core/src/mail/server/james/ExternalDataJames.java new file mode 100644 index 0000000..a1d7612 --- /dev/null +++ b/java/core/src/mail/server/james/ExternalDataJames.java @@ -0,0 +1,34 @@ +package mail.server.james; + +import org.apache.james.cli.probe.impl.JmxServerProbe; + +import mail.server.db.ExternalData; + +public class ExternalDataJames implements ExternalData +{ + JmxServerProbe jamesConnection; + + public ExternalDataJames () throws Exception + { + jamesConnection = new JmxServerProbe("localhost"); + } + + @Override + public void addUser(String name, String password) throws Exception + { + jamesConnection.addUser(name, password); + } + + @Override + public void removeUser(String name) throws Exception + { + jamesConnection.removeUser(name); + } + + @Override + public void setUserPassword(String name, String password) throws Exception + { + jamesConnection.setPassword(name, password); + } + +} diff --git a/java/core/src/mail/server/postfix/ExternalDataPostfix.java b/java/core/src/mail/server/postfix/ExternalDataPostfix.java new file mode 100644 index 0000000..9c25e84 --- /dev/null +++ b/java/core/src/mail/server/postfix/ExternalDataPostfix.java @@ -0,0 +1,123 @@ +package mail.server.postfix; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +import core.util.LogOut; +import core.util.Passwords; +import mail.server.db.ExternalData; +import mail.server.postfix.sql.Catalog; + +public class ExternalDataPostfix implements ExternalData +{ + Catalog catalog = new Catalog(); + LogOut log = new LogOut (ExternalDataPostfix.class); + + public ExternalDataPostfix() throws Exception + { + ensureTables(); + } + + public void ensureTables() throws SQLException, IOException + { + Connection connection = openConnection(); + try + { + for (String sql : catalog.getMulti(catalog.CREATE_TABLES)) + { + PreparedStatement statement = connection.prepareStatement (sql); + log(statement); + statement.executeUpdate(); + } + } + finally + { + closeConnection(connection); + } + } + + @Override + public void addUser(String name, String password) throws Exception + { + Connection connection = openConnection(); + + try + { + PreparedStatement statement = connection.prepareStatement (catalog.getSingle(catalog.ADD_USER)); + statement.setString(1, name); + statement.setString(2, password); + + statement.executeUpdate(); + } + finally + { + closeConnection(connection); + } + } + + @Override + public void removeUser (String name) throws Exception + { + Connection connection = openConnection(); + + try + { + PreparedStatement statement = connection.prepareStatement (catalog.getSingle(catalog.REMOVE_USER)); + statement.setString(1, name); + + statement.executeUpdate(); + } + finally + { + closeConnection(connection); + } + + } + + @Override + public void setUserPassword(String name, String password) throws Exception + { + Connection connection = openConnection(); + + try + { + PreparedStatement statement = connection.prepareStatement (catalog.getSingle(catalog.CHANGE_PASSWORD)); + statement.setString(1, password); + statement.setString(2, name); + + statement.executeUpdate(); + } + finally + { + closeConnection(connection); + } + } + + public Connection openConnection () throws IOException, SQLException + { + log.debug("Connecting to", catalog.CONNECTION_STRING); + return DriverManager.getConnection(catalog.CONNECTION_STRING, catalog.USER, Passwords.getPasswordFor(catalog.USER)); + } + + public void closeConnection (Connection connection) + { + try + { + if (connection != null) + connection.close(); + } + catch (Exception e) + { + e.printStackTrace(); + } + + } + public void log (Statement sql) + { + log.debug (sql); + } +} diff --git a/java/core/src/mail/server/postfix/PostfixMailReceiver.java b/java/core/src/mail/server/postfix/PostfixMailReceiver.java new file mode 100644 index 0000000..a8c15ed --- /dev/null +++ b/java/core/src/mail/server/postfix/PostfixMailReceiver.java @@ -0,0 +1,26 @@ +package mail.server.postfix; + +import java.io.ByteArrayInputStream; + +import mail.server.handler.UserInformation; +import mail.server.handler.UserInformationFactory; + +import core.util.Streams; + + +public class PostfixMailReceiver +{ + /** + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception + { + Class.forName("com.mysql.jdbc.Driver"); + String toAddress = args[1]; + byte[] bytes = Streams.readFullyBytes(System.in); + + UserInformation userInfo = UserInformationFactory.getInstance().getUserInformation(toAddress); + userInfo.handleIn(new ByteArrayInputStream(bytes)); + } +} diff --git a/java/core/src/mail/server/postfix/sql/Catalog.java b/java/core/src/mail/server/postfix/sql/Catalog.java new file mode 100644 index 0000000..0be1b54 --- /dev/null +++ b/java/core/src/mail/server/postfix/sql/Catalog.java @@ -0,0 +1,36 @@ +/** + * Author: Timothy Prepscius + * License: GPLv3 Affero + keep my name in the code! + */ + +package mail.server.postfix.sql; + +import java.io.IOException; +import core.constants.ConstantsServer; +import core.util.Passwords; +import core.util.SqlCatalog; + + +public final class Catalog extends SqlCatalog +{ + public String CONNECTION_STRING = ConstantsServer.DBCONNECTION_PREFIX + "postfix"; + public String USER = "postfix"; + + public int FAILURE_TIMEOUT_SECONDS = 60; + + public final String + CREATE_TABLES = "create_tables.sql", + ADD_USER = "add_user.sql", + REMOVE_USER = "remove_user.sql", + CHANGE_PASSWORD = "change_password.sql"; + + public Catalog () + { + + } + + public String getPassword () throws IOException + { + return Passwords.getPasswordFor(USER); + } +} diff --git a/java/core/src/mail/server/postfix/sql/add_user.sql b/java/core/src/mail/server/postfix/sql/add_user.sql new file mode 100644 index 0000000..522e214 --- /dev/null +++ b/java/core/src/mail/server/postfix/sql/add_user.sql @@ -0,0 +1 @@ +INSERT INTO user (name, password) VALUES (?, ?) \ No newline at end of file diff --git a/java/core/src/mail/server/postfix/sql/change_password.sql b/java/core/src/mail/server/postfix/sql/change_password.sql new file mode 100644 index 0000000..9ece9ed --- /dev/null +++ b/java/core/src/mail/server/postfix/sql/change_password.sql @@ -0,0 +1,5 @@ +UPDATE user +SET + password = ? +WHERE + name = ? \ No newline at end of file diff --git a/java/core/src/mail/server/postfix/sql/create_tables.sql b/java/core/src/mail/server/postfix/sql/create_tables.sql new file mode 100644 index 0000000..4dd2fc0 --- /dev/null +++ b/java/core/src/mail/server/postfix/sql/create_tables.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS user ( + name VARCHAR(255) NOT NULL DEFAULT '', + password VARCHAR(255), + mark TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (name) +); + + \ No newline at end of file diff --git a/java/core/src/mail/server/postfix/sql/remove_user.sql b/java/core/src/mail/server/postfix/sql/remove_user.sql new file mode 100644 index 0000000..ab8ce75 --- /dev/null +++ b/java/core/src/mail/server/postfix/sql/remove_user.sql @@ -0,0 +1 @@ +DELETE FROM user WHERE user.name=? \ No newline at end of file diff --git a/java/core/src/mail/streamserver/MailServerSessionDb.java b/java/core/src/mail/streamserver/MailServerSessionDb.java index 5818c72..eda4b53 100644 --- a/java/core/src/mail/streamserver/MailServerSessionDb.java +++ b/java/core/src/mail/streamserver/MailServerSessionDb.java @@ -9,6 +9,8 @@ import java.math.BigInteger; import java.sql.SQLException; import java.util.Random; +import mail.server.db.ExternalData; +import mail.server.db.ExternalDataFactory; import mail.server.db.MailUserDb; import org.apache.james.cli.probe.impl.JmxServerProbe; @@ -47,15 +49,14 @@ public class MailServerSessionDb implements SRPServerUserSessionDb public void setBlock (String userName, byte[] block) throws Exception { + ExternalData externalData = ExternalDataFactory.createInstance(); + log.debug("setBlock", userName, Strings.toString(block)); Environment e = JSONSerializer.deserialize(block); String newPassword = e.get(ConstantsEnvironmentKeys.SMTP_PASSWORD); - JmxServerProbe jamesConnection = new JmxServerProbe("localhost"); - if (newPassword != null) - jamesConnection.setPassword(userName, newPassword); - + externalData.setUserPassword(userName, newPassword); db.setBlock(userName, block); } @@ -77,7 +78,7 @@ public class MailServerSessionDb implements SRPServerUserSessionDb log.debug("createUser", version, userName); try { - JmxServerProbe jamesConnection = new JmxServerProbe("localhost"); + ExternalData externalData = ExternalDataFactory.createInstance(); if (USE_CAPTCHA) { @@ -93,7 +94,7 @@ public class MailServerSessionDb implements SRPServerUserSessionDb Random random = new Random(); String randomLong = BigInteger.valueOf(Math.abs(random.nextLong())).toString(32); - jamesConnection.addUser(userName, randomLong); + externalData.addUser(userName, randomLong); } catch (PublicMessageException e) { @@ -112,10 +113,10 @@ public class MailServerSessionDb implements SRPServerUserSessionDb log.debug("deleteUser", userName); try { - JmxServerProbe jamesConnection = new JmxServerProbe("localhost"); + ExternalData externalData = ExternalDataFactory.createInstance(); db.deleteUser(userName); - jamesConnection.removeUser(userName); + externalData.removeUser(userName); } catch (PublicMessageException e) { diff --git a/java/ext/.gitignore b/java/ext/.gitignore new file mode 100644 index 0000000..5ec1a41 --- /dev/null +++ b/java/ext/.gitignore @@ -0,0 +1,2 @@ +lcrypto-jdk15on-* +bc-packaged diff --git a/java/ext/lcrypto-jdk15on-148/.classpath b/java/ext/bc-packaged-template/.classpath similarity index 89% rename from java/ext/lcrypto-jdk15on-148/.classpath rename to java/ext/bc-packaged-template/.classpath index e2b1764..9b9144d 100644 --- a/java/ext/lcrypto-jdk15on-148/.classpath +++ b/java/ext/bc-packaged-template/.classpath @@ -1,6 +1,6 @@ - + diff --git a/java/ext/lcrypto-jdk15on-148/.project b/java/ext/bc-packaged-template/.project similarity index 100% rename from java/ext/lcrypto-jdk15on-148/.project rename to java/ext/bc-packaged-template/.project diff --git a/java/ext/lcrypto-jdk15on-148/build.xml b/java/ext/bc-packaged-template/build.xml similarity index 98% rename from java/ext/lcrypto-jdk15on-148/build.xml rename to java/ext/bc-packaged-template/build.xml index 9d042e0..b3b8025 100644 --- a/java/ext/lcrypto-jdk15on-148/build.xml +++ b/java/ext/bc-packaged-template/build.xml @@ -59,6 +59,9 @@ + + + diff --git a/java/ext/bc-project b/java/ext/bc-project new file mode 120000 index 0000000..2d5ed6e --- /dev/null +++ b/java/ext/bc-project @@ -0,0 +1 @@ +lcrypto-jdk15on-149 \ No newline at end of file diff --git a/java/ext/bc-project-using-git/.classpath b/java/ext/bc-project-using-git/.classpath new file mode 100644 index 0000000..fb50116 --- /dev/null +++ b/java/ext/bc-project-using-git/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/java/ext/bc-project-using-git/.project b/java/ext/bc-project-using-git/.project new file mode 100644 index 0000000..0de8905 --- /dev/null +++ b/java/ext/bc-project-using-git/.project @@ -0,0 +1,17 @@ + + + bc-project + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/LICENSE.java b/java/ext/bc-project-using-git/src/org/bouncycastle/LICENSE.java new file mode 120000 index 0000000..2c851d7 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/LICENSE.java @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/LICENSE.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/apache b/java/ext/bc-project-using-git/src/org/bouncycastle/apache new file mode 120000 index 0000000..dee1120 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/apache @@ -0,0 +1 @@ +../../../../bc-java/pg/src/main/java/org/bouncycastle/apache \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/asn1 b/java/ext/bc-project-using-git/src/org/bouncycastle/asn1 new file mode 120000 index 0000000..ea01c13 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/asn1 @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/asn1 \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/bcpg b/java/ext/bc-project-using-git/src/org/bouncycastle/bcpg new file mode 120000 index 0000000..a73532e --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/bcpg @@ -0,0 +1 @@ +../../../../bc-java/pg/src/main/java/org/bouncycastle/bcpg \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/crypto b/java/ext/bc-project-using-git/src/org/bouncycastle/crypto new file mode 120000 index 0000000..e282a92 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/crypto @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/crypto \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/i18n b/java/ext/bc-project-using-git/src/org/bouncycastle/i18n new file mode 120000 index 0000000..8c0753d --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/i18n @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/i18n \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/math b/java/ext/bc-project-using-git/src/org/bouncycastle/math new file mode 120000 index 0000000..3905366 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/math @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/math \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPAlgorithmParameters.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPAlgorithmParameters.java new file mode 120000 index 0000000..09a2bf7 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPAlgorithmParameters.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPAlgorithmParameters.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedData.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedData.java new file mode 120000 index 0000000..ad02c86 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedData.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPCompressedData.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedDataGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedDataGenerator.java new file mode 120000 index 0000000..d2db4b8 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPCompressedDataGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPCompressedDataGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPDataValidationException.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPDataValidationException.java new file mode 120000 index 0000000..c852fa9 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPDataValidationException.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPDataValidationException.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedData.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedData.java new file mode 120000 index 0000000..e2e1e98 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedData.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPEncryptedData.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataGenerator.java new file mode 120000 index 0000000..3203930 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPEncryptedDataGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataList.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataList.java new file mode 120000 index 0000000..e4b7916 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPEncryptedDataList.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPEncryptedDataList.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPException.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPException.java new file mode 120000 index 0000000..6481fed --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPException.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPException.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKdfParameters.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKdfParameters.java new file mode 120000 index 0000000..b96020f --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKdfParameters.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKdfParameters.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyFlags.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyFlags.java new file mode 120000 index 0000000..e49340a --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyFlags.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKeyFlags.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyPair.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyPair.java new file mode 120000 index 0000000..51f52eb --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyPair.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKeyPair.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRing.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRing.java new file mode 120000 index 0000000..17059a0 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRing.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKeyRing.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRingGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRingGenerator.java new file mode 120000 index 0000000..ae44767 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyRingGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKeyRingGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyValidationException.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyValidationException.java new file mode 120000 index 0000000..44405d8 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPKeyValidationException.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPKeyValidationException.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralData.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralData.java new file mode 120000 index 0000000..76bbbcb --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralData.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPLiteralData.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralDataGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralDataGenerator.java new file mode 120000 index 0000000..b9a2131 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPLiteralDataGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPLiteralDataGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPMarker.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPMarker.java new file mode 120000 index 0000000..22d2e0c --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPMarker.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPMarker.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPObjectFactory.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPObjectFactory.java new file mode 120000 index 0000000..c2e5bea --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPObjectFactory.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPObjectFactory.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignature.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignature.java new file mode 120000 index 0000000..6d30d71 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignature.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPOnePassSignature.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignatureList.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignatureList.java new file mode 120000 index 0000000..e38b2d1 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPOnePassSignatureList.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPOnePassSignatureList.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPBEEncryptedData.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPBEEncryptedData.java new file mode 120000 index 0000000..986b716 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPBEEncryptedData.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPBEEncryptedData.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPrivateKey.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPrivateKey.java new file mode 120000 index 0000000..c4a298b --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPrivateKey.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPrivateKey.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKey.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKey.java new file mode 120000 index 0000000..df25a75 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKey.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPublicKey.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyEncryptedData.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyEncryptedData.java new file mode 120000 index 0000000..2d970bf --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyEncryptedData.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPublicKeyEncryptedData.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRing.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRing.java new file mode 120000 index 0000000..f335c2a --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRing.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPublicKeyRing.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRingCollection.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRingCollection.java new file mode 120000 index 0000000..893c7bd --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPPublicKeyRingCollection.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPPublicKeyRingCollection.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKey.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKey.java new file mode 120000 index 0000000..6ecf249 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKey.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSecretKey.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRing.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRing.java new file mode 120000 index 0000000..170c338 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRing.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSecretKeyRing.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRingCollection.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRingCollection.java new file mode 120000 index 0000000..6102351 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSecretKeyRingCollection.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSecretKeyRingCollection.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignature.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignature.java new file mode 120000 index 0000000..a61f9f1 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignature.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSignature.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureGenerator.java new file mode 120000 index 0000000..6b9fc64 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSignatureGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureList.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureList.java new file mode 120000 index 0000000..6010b43 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureList.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSignatureList.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketGenerator.java new file mode 120000 index 0000000..eb45d83 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSignatureSubpacketGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketVector.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketVector.java new file mode 120000 index 0000000..49dc3d1 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPSignatureSubpacketVector.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPSignatureSubpacketVector.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVector.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVector.java new file mode 120000 index 0000000..2adc53e --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVector.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVector.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVectorGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVectorGenerator.java new file mode 120000 index 0000000..513cc46 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVectorGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPUserAttributeSubpacketVectorGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUtil.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUtil.java new file mode 120000 index 0000000..b36913d --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPUtil.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPUtil.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPV3SignatureGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPV3SignatureGenerator.java new file mode 120000 index 0000000..99bad82 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/PGPV3SignatureGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/PGPV3SignatureGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/StreamGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/StreamGenerator.java new file mode 120000 index 0000000..662987e --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/StreamGenerator.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/StreamGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/WrappedGeneratorStream.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/WrappedGeneratorStream.java new file mode 120000 index 0000000..1d65a4b --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/WrappedGeneratorStream.java @@ -0,0 +1 @@ +../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/WrappedGeneratorStream.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/*. b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/*. new file mode 120000 index 0000000..c8b22ff --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/*. @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/*. \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/KeyFingerPrintCalculator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/KeyFingerPrintCalculator.java new file mode 120000 index 0000000..80e0b8f --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/KeyFingerPrintCalculator.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/KeyFingerPrintCalculator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEDataDecryptorFactory.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEDataDecryptorFactory.java new file mode 120000 index 0000000..16089d8 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEDataDecryptorFactory.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PBEDataDecryptorFactory.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEKeyEncryptionMethodGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEKeyEncryptionMethodGenerator.java new file mode 120000 index 0000000..d5216a0 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBEKeyEncryptionMethodGenerator.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PBEKeyEncryptionMethodGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyDecryptor.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyDecryptor.java new file mode 120000 index 0000000..d5ddd59 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyDecryptor.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PBESecretKeyDecryptor.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyEncryptor.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyEncryptor.java new file mode 120000 index 0000000..29cf227 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PBESecretKeyEncryptor.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PBESecretKeyEncryptor.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSigner.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSigner.java new file mode 120000 index 0000000..32cbbb2 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSigner.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPContentSigner.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSignerBuilder.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSignerBuilder.java new file mode 120000 index 0000000..d54f368 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentSignerBuilder.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPContentSignerBuilder.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifier.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifier.java new file mode 120000 index 0000000..1db4d79 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifier.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPContentVerifier.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilder.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilder.java new file mode 120000 index 0000000..fa727ad --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilder.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilder.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilderProvider.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilderProvider.java new file mode 120000 index 0000000..7768669 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilderProvider.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPContentVerifierBuilderProvider.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptor.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptor.java new file mode 120000 index 0000000..b3484b9 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptor.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDataDecryptor.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorFactory.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorFactory.java new file mode 120000 index 0000000..770b896 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorFactory.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDataDecryptorFactory.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorProvider.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorProvider.java new file mode 120000 index 0000000..a4eb1b9 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataDecryptorProvider.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDataDecryptorProvider.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptor.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptor.java new file mode 120000 index 0000000..a3bf954 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptor.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDataEncryptor.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptorBuilder.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptorBuilder.java new file mode 120000 index 0000000..84bf75d --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDataEncryptorBuilder.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDataEncryptorBuilder.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculator.java new file mode 120000 index 0000000..ef40871 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculator.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDigestCalculator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculatorProvider.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculatorProvider.java new file mode 120000 index 0000000..6210daa --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPDigestCalculatorProvider.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPDigestCalculatorProvider.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPKeyEncryptionMethodGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPKeyEncryptionMethodGenerator.java new file mode 120000 index 0000000..fe6814b --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPKeyEncryptionMethodGenerator.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPKeyEncryptionMethodGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPUtil.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPUtil.java new file mode 120000 index 0000000..311343e --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PGPUtil.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PGPUtil.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyDataDecryptorFactory.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyDataDecryptorFactory.java new file mode 120000 index 0000000..a395aa5 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyDataDecryptorFactory.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PublicKeyDataDecryptorFactory.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyKeyEncryptionMethodGenerator.java b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyKeyEncryptionMethodGenerator.java new file mode 120000 index 0000000..f951e29 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/PublicKeyKeyEncryptionMethodGenerator.java @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/PublicKeyKeyEncryptionMethodGenerator.java \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/bc b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/bc new file mode 120000 index 0000000..71024c1 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/openpgp/operator/bc @@ -0,0 +1 @@ +../../../../../../bc-java/pg/src/main/java/org/bouncycastle/openpgp/operator/bc \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/pqc b/java/ext/bc-project-using-git/src/org/bouncycastle/pqc new file mode 120000 index 0000000..1f81fa9 --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/pqc @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/pqc \ No newline at end of file diff --git a/java/ext/bc-project-using-git/src/org/bouncycastle/util b/java/ext/bc-project-using-git/src/org/bouncycastle/util new file mode 120000 index 0000000..7ade6fe --- /dev/null +++ b/java/ext/bc-project-using-git/src/org/bouncycastle/util @@ -0,0 +1 @@ +../../../../bc-java/core/src/main/java/org/bouncycastle/util \ No newline at end of file diff --git a/java/ext/bouncycastle b/java/ext/bouncycastle index 2c2238d..20d32df 120000 --- a/java/ext/bouncycastle +++ b/java/ext/bouncycastle @@ -1 +1 @@ -lcrypto-jdk15on-148 \ No newline at end of file +bc-packaged \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.jdt.core.prefs b/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index c537b63..0000000 --- a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.component b/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.component deleted file mode 100644 index c82f9b8..0000000 --- a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.component +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.project.facet.core.xml b/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.project.facet.core.xml deleted file mode 100644 index 37355cb..0000000 --- a/java/ext/lcrypto-jdk15on-148/.settings/org.eclipse.wst.common.project.facet.core.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/java/ext/lcrypto-jdk15on-148/CONTRIBUTORS.html b/java/ext/lcrypto-jdk15on-148/CONTRIBUTORS.html deleted file mode 100644 index 01541ef..0000000 --- a/java/ext/lcrypto-jdk15on-148/CONTRIBUTORS.html +++ /dev/null @@ -1,324 +0,0 @@ - - -The following organisations and people have contributed to the Bouncy Castle Cryptography Package. -

-Thanks, may your castles never deflate! -

-Organisations -

    -
  • Atlassian Software Systems donation of Confluence and JIRA licences.
  • -
  • TU-Darmstadt, Computer Science Department, RBG, for the initial -lightweight TLS implementation, which is based on MicroTLS. MicroTLS was developed -by Erik Tews at TU-Darmstadt, Computer Science Department, RBG under the supervision of Dipl.-Ing. -Henning Baer and Prof. Max Muehlhaeuser. More information on MicroTLS can be found at: -http://www.rbg.informatik.tu-darmstadt.de/MicroTLS/ -
  • -
  • TU-Darmstadt, Computer Science Department, RBG, for the initial -Post Quantum provider, which was based on the FlexiProvider. The FlexiProvider was developed -by the Theoretical Computer Science Research Group at TU-Darmstadt, Computer Science Department, RBG under the supervision of Prof. Dr. Johannes Buchmann. More information on the history of FlexiProvider can be found at: -http://www.flexiprovider.de/ -
  • -
-People -
    -
  • Tito Pena <Fortunato.Pena@AdNovum.CH> - initial RC5 implementation
  • -
  • Michael Lee <yfl@mira.net> - initial RC6 implementation, MD2 implementation
  • -
  • Nuno Santos <nsantos@student.dei.uc.pt> - finding toString bug in certificate object.
  • -
  • Brett Sealey <bretts@mortbay.com> - fixing the missing return problem in JDKKeyFactory (affected SSLeay private keys).
  • -
  • Victor A. Salaman <salaman@teknos.com> - fixing the bug in Cipher.java which caused it to ignore specified providers, fixing the bug in RSAKeyGenerator which caused keys to be occasionally produced 1 bit too small.
  • -
  • Eran Librach <eranl@valicert.com> - spotting and fixing the classLoader bug that occurs if javax.crypto and the provider aren't sharing the same classpath (occurs in JDK 1.3 and greater).
  • -
  • Jonathan Knudsen <jonathan@LearningPatterns.com> - porting -information and restrictions when using the lightweight library with the -MIDP environment.
  • -
  • Markus Niedermann <markus.niedermann@softwired-inc.com> - porting -information and restrictions when using the lightweight library with the -MIDP environment.
  • -
  • Mike Benham <moxie@thoughtcrime.org> - detection and fixing of an -incorrect weak key in the DES key generation support classes. Suggestions -for simplifying DESedeParameter objects. Optimisations for the Blowfish engine -and BufferedBlockCipher class.
  • -
  • Soren Hilmer <hilmer@mail.tele.dk> - initial implementation of -netscape certificate request classes.
  • -
  • Uwe Guenther <uwe@cscc.de> - detection and fixing of 3 incorrect semi-weak keys in the DES key generation support classes.
  • -
  • Markus Bradtke <mab@informatik.uni-kiel.de> - fixing of a logic -error in the JDKKeyStore class.
  • -
  • Waclaw Sierek <waclaw.sierek@tpg.pl> - fix to setOddParity in -the DESParameter class. Assistance with adding ordering to X509 names for -certificate generation, proper processing of byte strings in the ASN1 -package, further simplifications and additional classes to improve pkcs7 -support, bug fixes in CertPath API.
  • -
  • Ly-Na Phu <lyna.phu@init-consulting.de> - assistance in the -addition of ISO 9796-1 padding.
  • -
  • Stefan Köpsell <sk13@mail.inf.tu-dresden.de> - making the jdk 1.1 -version of the collections API available. For further details see -http://sourceforge.net/projects/jcf/
  • -
  • Carmen Bastiaans <cbastiaa@microbits.com.au> - fixing the improper -null pointer problem in the setting of certificates in the PKCS12 key store.
  • -
  • Tomas Gustavsson <tomasg@primekey.se> - initial implementation of the AuthorityInformationAccess, SubjectKeyIdentifier, AuthorityKeyIdentifier, CRLNumber, CRLReason, CertificatePolicies, V2TBSCertListGenerator, and X509V2CRLGenerator classes in the ASN.1 library. Additions to GeneralName class, other bug fixes in the X.509 package. Initial implementation of the CertificationRequest classes. getRevocationReason() patch for OCSP. Patch to SemanticsInformation to prevent ClassCastException.
  • -
  • Eugen Kuleshov <euxx@hotmail.com> - optimisations for Blowfish, assistance with PKCS12/keytool interoperability. -
  • Megan Woods <meganwoods@sekurafile.com> - initial implementation of -ECIES.
  • -
  • Christian Geuer-Pollmann <geuerp@apache.org> - -adding IV's to the AESWrap implementations. Initial implementation of -DESedeWrap.
  • -
  • Michael Mühle <michael@mouling.de> - contributing the initial CertPath implementation and compatibility classes, fixing provider bug in JDK 1.1 java.security.cert.CertificateFactory compatibilty class.
  • -
  • Michael Mansell <me@michaelmansell.com> - fixing the parsing of the empty DER set in the ASN.1 library.
  • -
  • Eike Recker <eike.recker@gmx.de> - fixing misspelling of provider reference for RSA/1 and RSA/2.
  • -
  • Chris Southern <CSouthern@baltimore.com> - fixing misuse of specified provider in the PKCS10 certification request class.
  • -
  • Sidney Markowitz <sidney@sidney.com> - fixing null pointed exception on unknown OID in X509Name class, initial implementation of the three AES engines.
  • -
  • Chris Kerr <ckerr@filonet.ca> - initial implementation of the cms, -asn1.cms, and the mail/smime packages, -assistance in simplifying the ASN.1 package, miscellaneous other optimisations, -NIST CertPath certification test, PKIXPolicyNode class, CertPath subtree validation and policy tree construction. We also -wish to acknowledge the generosity of Filonet -Corporation for allowing Chris to make the initial cms and mail/smime packages available to us.
  • -
  • Mike Bean <mbean@lucentradius.com> - fixing the fall through bug -in the IV algorithm parameters class.
  • -
  • Martin Petraschek <e9526225@student.tuwien.ac.at> - fixing ASN1 -tagging so tag values up to 30 are now supported.
  • -
  • Jess Garms <jgarms@yahoo.com> - fixing 112/168 key size bug for -DESede key generation.
  • -
  • Mike Bremford <mike@big.faceless.org> - contributing the inital PKCS7 implementation.
  • -
  • Shankar Srinivasan <ssr002@yahoo.com> - S/Mime interoperability testing and debugging.
  • -
  • Stef Hoeben <ilsestef@skynet.be> - adding Montgomery multiplication to the BigInteger class.
  • -
  • Klaudiusz Ciosk <kciosk@max.com.pl> - improving the compatibility of -the SMIME package with the Sun JCE.
  • -
  • Thomas Houtekier <Thomas.Houtekier@tectrade.net> - S/Mime testing and debugging. Interoperability with -Biztalk.
  • -
  • Don Hillsberry <hillsber@dialcorp.com> - S/Mime testing and debugging.
  • -
  • Kazuo Furuya <kfuruya@infoteria.co.jp> - fixing root certificate chaining bug in PKCS12 key store.
  • -
  • Jason Novotny <jdnovotny@lbl.gov> - initial work on the openSSL PEM processing.
  • -
  • Joel Hockey <joel.hockey@qsipayments.com> - initial work on the openSSL PEM processing.
  • -
  • John Steenbruggen <JohnS@geotrust.com> - fixing CertificationRequestInfo to handle cert request info objects without attribute blocks.
  • -
  • Justin Chapweske <justin@chapweske.com> - ordering patch for Tiger message digest.
  • -
  • John Serock <jserock@hotmail.com> - fixing null pointer exception -in constructor for ExtendedKeyUsage. Fixing of base OID bug in KeyPurposeId. -Compliance of KeyUsage extension return value with security API.
  • -
  • Sascha Weinreuter <Sascha.Weinreuter@cit.de> - fixed SMIME saveChanges() bug.
  • -
  • Andre Wehnert <aw5@mail.inf.tu-dresden.de> - fixing key schedule problem in RC5-64, fixing buffer cleaning issue in buffered block cipher.
  • -
  • Luigi Lo Iacono <lo_iacono@nue.et-inf.uni-siegen.de> - adding SIC -mode to the blockciphers in the provider.
  • -
  • Tim Sakach <tsakach@certivo.net> - SMIME v2 compatibility patches.
  • -
  • Marcus Povey <mpovey@brookes.ac.uk> - adding the PGP mode to the lightweight API and the provider.
  • -
  • Sebastian Clauß <sc2@inf.tu-dresden.de> - adding randomness setting -to the certificate and CRL generators.
  • -
  • Nicolas Bielza <nicolas.bielza@alligacom.com> - isolating the tagging bug in the ASN.1 library that was misrepresenting some ASN.1 constructed data types. Contributions to the streaming S/MIME classes.
  • -
  • Casey Marshall <rsdio@metastatic.org> - fixing the clone problem with Macs in the clean room JCE. -
  • Rick Zeldes <rick.zeldes@eds.com> - initial code for CMS/SMIME CompressedData.
  • -
  • Jarek Gawor <gawor@mcs.anl.gov> - fixing ASN.1 sequence unpacking in BasicConstraints constructor.
  • -
  • Brett Neumeier <random@rnd.cx> - patch to OriginatorIdentifierOrKey object, improvements to encoders package, introduction of UrlBase64.
  • -
  • Graham Coles <graham.coles@retail-logic.com> - patch to isParityAdjusted in DESKeySpec.
  • -
  • Jörn von Kattchée <J.Kattchee@seeburger.de> - patch to SMIMEGenerator for preventing class cast exceptions with BodyParts containing Multipart objects.
  • -
  • Matteo Artuso <matartuso@libero.it> - picking up the possible overead in ASN1InputStream.
  • -
  • Julian Morrison <julian@extropy.demon.co.uk> - spotting the slow down -in Diffie-Hellman key generation.
  • -
  • Elmar Sonnenschein <eso@esomail.de> - fix to long conversion in clean room -SecureRandom.
  • -
  • Jörn Schwarze <JSchwarze@ulc.de> - Locale fix for the clean room JCE.
  • -
  • Bryan Lovquist <bkl@cps.com.au> - Other provider compatibility fixes for CMS signing.
  • -
  • Artem Portnoy <Artem_Portnoy@ibi.com> - generalisations for CMSProcessableBodyPart in S/MIME. Header fix for mime messages.
  • -
  • Michael Häusler <haeusler@ponton-consulting.de> - missing OID update for SHA1 with RSA Signature.
  • -
  • Johan Seland <johans@netfonds.no> - general toString for BigInteger class.
  • -
  • Johannes Nicolai <johannes.nicolai@novosec.com> - further enhancements to OCSP response generation, fix to CertificateID issuer.
  • -
  • Marc Doberva <marc.doberva@ilex-si.com> - help in isolating the JSSE/BC RSA key issue.
  • -
  • Jan Dvorak <jan.dvorak@mathan.cz> - initial implementation of the light weight Null block cipher.
  • -
  • Joe Cohen <jcohen@forumsys.com> - converting the ArrayOutOfBoundsException in DERInputStream into what it should have been.
  • -
  • Chris Long<aclong@ece.cmu.edu> - adding public key decoding to PEMReader.
  • -
  • Hes Siemelink<hes@izecom.com> - findIssuer fix for CertPathBuilder, toMimeMessage converter for Mail API, getSize() fix for zero length messages in SMIMEMessage.
  • -
  • Stefan Puiu<stefanpuiuro@yahoo.com> - initial implementation V3 policy mapping, policy qualifier objects in ASN.1 X.509 package.
  • -
  • Kaiser Yang <kaiseryang@yahoo.com> - Finding BigInteger loop problem in prime generation.
  • -
  • Jiri Urbanec <jiri.urbanec@logicacmg.com> - patch to fix defect in DERBMPString.equals().
  • -
  • Justin Kolb <jkolb@pristx.com> - patch to DSA signature generation in OpenPGP. Fix for the unexpected "Unexpected end of ZLIB input stream" exception.
  • -
  • Ralf Hauser <ralfhauser@gmx.ch> - patch to exception handling in PublicKeyRing, PEMReader, 1.4 build script, X509 Certificate Factory, CertPathValidatorUtilities.
  • -
  • Michal Dvorak <M_Dvorak@kb.cz> - getNextUpdate patch for OCSP SingleResp.
  • -
  • Klaus Greve Fiorentini <Klaus@cpqd.com.br> - array fix in PGP PublickKeyEncSessionPacket.
  • -
  • Olivier Refalo <Olivier_Refalo@fpl.com> - null pointer exception fix for JDK 1.3 CMSSignedData objects.
  • -
  • Mariusz Bandola <mariusz.bandola@cryptotech.com.pl> - patch to DERGeneralizedTime. Compliance patch for OCSP TBSRequest class. Patch to X509Name for delaing with general objects in sequences.
  • -
  • Brien Oberstein <brien.oberstein@transacttools.net> - patch to S2K algorithm in OpenPGP, initial PGP version 3 secret key support, initial PGP version 3 signature generation, RIPEMD160 addition to PGPUtil.
  • -
  • Ian Haywood <ian@haywood.bpa.nu> - addition of getSignatureType to PGPSignature.
  • -
  • Jonathan Edwards <s34gull@mac.com> - initial support for reading multiple rings from a PGP key file.
  • -
  • Andrew Thornton <andrew@caret.cam.ac.uk> - patch for RSA PUBLIC KEY in PEMReader.
  • -
  • Gregor Leander <gl@bos-bremen.de> - initial parsing of multiple sequence entries in an X.500 Name.
  • -
  • Antoon Bosselaers <Antoon.Bosselaers@esat.kuleuven.ac.be> - help with RipeMD320 implementation.
  • -
  • Peter Sylvester <Peter.Sylvester@edelweb.fr> - improvements to the ASN.1 BasicConstraints object.
  • -
  • Doug <ummmmm@myrealbox.com> - addition of isEncryptionKey method to OpenPGP public keys.
  • -
  • Francois Staes <fstaes@netconsult.be> - improvements to DEBitString, DERGeneralizedTime and initial implimentation of DERGeneralString, addition of settable signed content info to CMSSignedDataGenerator, patch to DH key agreement.
  • -
  • W.R. Dittmer <wdittmer@cs.vu.nl> - patch to decoding of SignatureCreationTime in BCPG. Patch to PGPKeyPair to fix nullpointer exception.
  • -
  • Perez Paz Luis Alberto <laperez@banxico.org.mx> - patch to use of BitString in X.500 name.
  • -
  • James Wright <James_Wright@harte-hanks.com> - patches for dealing with "odd" ArmoredInputStreams.
  • -
  • Jim Ford <jim@muirford.com> - patch to PGPSecretKey to avoid null pointer exception on encoding secret keys, comments on KeyExpirationTime, getBitStrength for ElGamal keys. Signature creation time patch for newly created v4 signatures.
  • -
  • Michael Hausler <haeusler@ponton-consulting.de> - extra aliases for provider.
  • -
  • Sai Pullabhotla <psai@linoma.com> - fix to PGP compressed data generator to improve compression levels. Performance improvements for KeyBasedLargeFileProcessor.
  • -
  • Joseph Miller <joseph@digiweb.net.nz> - addition of ZeroBytePadding.
  • -
  • Lars <xyz@sagemdenmark.dk> - patch to explicit padded mode for CBC block cipher MAC.
  • -
  • Jeroen van Vianen <jeroen@vanvianen.nl> - the Signed and Encrypted mail example.
  • -
  • Jun Sun <JSun@diversinet.com> - patch to SecureRandom to work around problem in wtk 1.0.4 and wtk 2.1.
  • -
  • Petr Dukem <pdukem@email.cz> - patch to CMSSignedDataGenerator to allow it to work with PKCS11 providers.
  • -
  • Filipe Silva <filipe.silva@wedoconsulting.com> - patch to fix overead issue in BCPGInputStream.
  • -
  • Alpesh Parmar <alps@linuxmail.org> - patch for class cast problem in PGPPublicKey.getSignatures().
  • -
  • Jay Gengelbach <jgengelbach@webmethods.com> - patch to fix isSigningKey in PGPSecretKey class, patch to hashedPackets in PGP signatureGenerator, initial cut for indefinite length output.
  • -
  • Doug <doug@tigerprivacy.com> - public key ring patches for ElGamal Signatures, problem key ring data.
  • -
  • Matthew Mundy <mmundy1@umbc.edu> - infinite loop prevention patch to PKCS5S2ParametersGenerator.
  • -
  • Tom Cargill <cargill@profcon.com> - spelling patch in provider.
  • -
  • Breitenstrom Christian <C.Breitenstrom@t-systems.com> - compatibility patch to SignaturePacket, DetachedSignatureProcessor.
  • -
  • Zanotti Mirko <zanotti@cad.it> - patch to ordered equality test for X509Name.
  • -
  • Nicola Scendoni <nscendoni@babelps.it> - patch to add sorting to CertPath validation.
  • -
  • Ville Skyttä <ville.skytta@iki.fi> - patch to CRLDistPoint for cRLIssuer field. KeyStore compliance on add patches. DiffieHellman patch for provider compliance. Exception handling patch in PEMReader.
  • -
  • Bruce Gordon <bruce.gordon@savvis.net> - patch to secret key creation encoding NullPointerException in OpenPGP, speed up for BCPGInputStream.
  • -
  • Miles Whiteley <Miles.Whiteley@savvis.net> - "223" fix for BCPGInputStream new packets.
  • -
  • Albert Moliner <amoliner@evintia.com> - initial TSP implementation.
  • -
  • Carlos Lozano <carlos@evintia.com> - initial TSP implementation, patch to SignerInformation for supporting repeated signers, initial updates for supporting repeated attributes in CMS.
  • -
  • Javier Delgadillo <javi@javi.codewarp.org> - initial Mozilla PublicKeyAndChallenge classes.
  • -
  • Joni Hahkala <joni.hahkala@cern.ch> - initial implementations of VOMS Attribute Certificate Validation, IetfAttrSyntax, and ObjectDigestInfo. We also wish to thank the EGEE project for making the work available.
  • -
  • Rolf Schillinger<rolf@sir-wum.de> - initial implementation of Attribute Certificate generation.
  • -
  • Sergey Bahtin <Sergey_Bahtin@yahoo.com> - fix for recovering certificate aliases in BKS and UBER key stores. Initial implementations of GOST-28147, GOST-3410, EC GOST-3410, GOST OFB mode (GOFB) and GOST-3411.
  • -
  • Franck Leroy <Franck.Leroy@keynectis.com> - ANS.1 set sorting. Contributions to TSP implementation. Test vectors for Bleichenbacher's forgery attack.
  • -
  • Atsuhiko Yamanaka <ymnk@jcraft.com> - patch for improving use of Montgomery numbers in BigInteger library. Patch to use size of private exponent in DH parameters.
  • -
  • Nickolay Bolshackov <tyrex@reksoft.ru> - patch for class cast exception in AuthorityInformationAccess class.
  • -
  • Soren Hilmer <soren.hilmer@tietoenator.com> - patches for CertID with issuerSerial set in TSP implementation, additional compliance testing.
  • -
  • Steve Mitchell <mitchell@intertrust.com> - patch for stateful path validator fix. Patch to allow BigInteger class to create negative numbers from byte arrays. Additions to allow different providers to be used for asymmetric/symmetric encryption in OpenPGP. -Optimisation to avoid redundant verification in path validator. Suggestion to use PKIXParameters.getSigProvider() correctly.
  • -
  • Dirk Eisner <D.Eisner@seeburger.de> - initial implementation of ISO 78164-4 padding.
  • -
  • Julien Pasquier <julienpasquier@free.fr> - initial implementation of attribute classes from RFC 3126. Fix to KEKIdentifier, OtherKeyAttribute parsing. Initial ContentHints class.
  • -
  • Matteo <matartuso@libero.it> - sequence patch to ASN1Dump.
  • -
  • Andrew Paterson <andrew.paterson@burnsecs.com> - patches to PGP tools, isRevoked method on PGPPublicKey.
  • -
  • Vladimir Molotkov <vladimir.n.molotkov@intel.com> - extensive provider exception handling compliance testing.
  • -
  • Florin Kollan <adlocflo@web.de> - fix to ElGamalKeyParameters equality testing.
  • -
  • Pavel Vassiliev <paulvas@gmail.com> - Initial GOST28147Mac implementation.
  • -
  • Tom Pesman <tom@tnux.net> - addition of DES-EDE encryption for RSAPrivate keys to PEMWriter.
  • -
  • Lukasz Kowalczyk <lukasz.b.kowalczyk@gmail.com> - patch to fix parsing issue with OpenSSL PEM based certificate requests.
  • -
  • Arndt Hasch <Arndt.Hasch@maxence.de> - additional fix for partial reading with new style PGP packets.
  • -
  • Fix Bernd (KCDP 11) <bernd.fix@credit-suisse.com> - fix for 31 byte issue and exception throwing by Whirlpool.
  • -
  • David M. Lee <dmlee@Crossroads.com> - code for add and remove secret key in the PGPSecretKeyRing class. Additions to S/MIME and CMS unit tests.
  • -
  • Mike Dillon <md5@embody.org> - additional checks for PGP secret and public key construction, patches to copyWithNewPassword.
  • -
  • tu-vi cung <t2cung@hotmail.com> - patch for out of bounds problem in getDecoderStream method.
  • -
  • Chris Schultz <cschultz@gmail.com> - fix for InputStream constructor for X509V2AttributeCertificate.
  • -
  • David M. Lee <dmlee@Crossroads.com> - implementation assistance with streaming CMS classes.
  • -
  • Joel Rees <rees@ddcom.co.jp> - fix to correct getOID methods from returning same set on X.509 attribute certificates.
  • -
  • Francesc Sau <francesc.sau@partners.netfocus.es> - micro fix for tsp Accuracy class.
  • -
  • Larry Bugbee <bugbee@mac.com> - initial ECNR implementation.
  • -
  • Remi Blancher <Remi.Blancher@keynectis.com> - Contributions to TSP implementation. Initial implementation of RFC 3739 and ICAO ASN.1 classes.
  • -
  • Brian O'Rourke <brianorourke@gmail.com> - patch for signature creation time override in OpenPGP.
  • -
  • Andreas Schwier <andreas.schwier@cardcontact.de> - initial implementation of ISO9797 MAC Algorithm 3, addition of DES-EDE 64 MAC to the provider, fix to EC point encoding, addition of EC and RSA-PSS OIDs to CMS, addition of AES-CMAC and DESede-CMAC to JCE provider.
  • -
  • David Josse <david.josse@transacttools.net> - Patch for trailer function in version 2 signature packets.
  • -
  • Kishimoto Kazuhiko <kazu-k@hi-ho.ne.jp> - RFC 3280 updates to policy processing in the CertPath validator. Additional test data not covered by NIST.
  • -
  • Lawrence Tan <lwrnctan@gmail.com> - Large field OID sample test data. Missing key types in JDKKeyFactory.
  • -
  • Carlos Valiente <superdupont@gmail.com> - Addition of CRL writing to the PEMWriter class.
  • -
  • Keyon AG, Martin Christinat, http://www.keyon.ch - fixing incorrect -ASN.1 encoding of field elements in X9FieldElement class.
  • -
  • Olaf Keller, <olaf.keller.bc@bluewin.ch> - initial implementation of the elliptic curves over binary fields F2m. Additional tests and modifications to elliptic curve support for both F2m and Fp. Performance improvements to F2m multiplication. Initial implementation of WNAF/WTNAF point multiplication. Improvement to k value generation in ECDSA.
  • -
  • Jörg Eichhorn <eichhorn@ponton-consulting.de> - patch to fix EOF read on SharedFileInputStream, support for F2m compression.
  • -
  • Karsten Ohme <widerstand@t-online.de> - initial check against for out of range data on non byte aligned RSA keys. Addition of equals/hashCode on ECCurve.Fp. Additional curve type support for Fp, contributions to F2m compression. F2m decoding for ECPointUtil. Infinity fix and prime192v2 fix for Fp. Extra validation for RSA key creation. Fix to name typos for some OpenSSL key generators. RFC-1779 table, improved RFC 2253 compliance for X509Name. Additional constructor validation for X.509/ESS ASN.1 classes. Validation for Printable, IA5, and Numeric Strings. -Support for surrogate pairs in DERUTF8String, DER UTF8 test. Additional X.509 name attributes for ISIS-MTT, RFC 3039, addition of indirect CRL support, initial X509 LDAP CertStore implementation, CertificatePair class, and X509CertificatePair class. Contributions to X509Store/Parser infrastructure and design. -CertPath support for implicit DSA parameters and a range of NameConstraints. Addition of support for V1 attribute certificates and attribute certificate path validation. Initial classes for ASN.1 ISIS-MTT support. Enhancements for improving compliance with the NIST CertPath tests.
  • -
  • Carlos Lozano Ruiz <carlos@tradise.com> - patch for <ctrl><m> only handling in CRLFOutputStream.
  • -
  • John Alfred Prufrock <j.a.prufrock@gmail.com> - mods to GOST-3411 and MD2 to support ExtendedDigest.
  • -
  • Stefan Neusatz Guilhen <sneusatz@gmail.com> - initial version of RoleSyntax, improvements to AttributeCertificateHolder and AttributeCertificateIssuer.
  • -
  • Marzio Lo Giudice <marzio.logiudice@gmail.com> - fix to endianess in KDF2BytesGenerator, additional KDF2 tests.
  • -
  • Georg Lippold <georg.lippold@gmx.de> - initial implementation of NaccacheStern cipher.
  • -
  • Chris Viles <chris_viles@yahoo.com> - fix to SignatureSubpacket critical bit setting.
  • -
  • Pasi Eronen <Pasi.Eronen@nokia.com> - extra toString() support for ASN.1 library. Initial patch for large OID components.
  • -
  • Lijun Liao <lijun.liao@rub.de> - performance enhancements for SHA family of digests. Bug report and patch for blank line handling in ArmoredInputStream.
  • -
  • Maria Ivanova <maria.ivanova@gmail.com> - support for tags > 30 in ASN.1 parsing.
  • -
  • Armin Häberling <arminha@student.ethz.ch> - first cut of internationalisation, initial PKIX validation classes.
  • -
  • Marius Schilder <mschilder@google.com> - main set of test vectors for Bleichenbacher's forgery attack.
  • -
  • Xavier Le Vourch <xavier@brittanysoftware.com> - general code clean ups.
  • -
  • Erik Tews <e_tews@cdc.informatik.tu-darmstadt.de> - initial threaded random seed generator.
  • -
  • Thomas Dixon <reikomusha@gmail.com> - initial implementations of TEA/XTEA, Salsa20, ISAAC, and Noekeon. XTEA enhancements.
  • -
  • Frank Cornelis <info@frankcornelis.be>- addition of crlAccessMethod in X509ObjectIdentifiers.
  • -
  • Rui Joaquim <rjoaquim@cc.isel.ipl.pt> - initial implementation of RSA blinding for signatures.
  • -
  • David Stacey <DStacey@allantgroup.com> - addition of trust packet checking on revocation signatures in PGPSecretKeyRing.
  • -
  • Martijn Brinkers <list@mitm.nl> - better exception handling in CMS enveloping, "just in time" modifications for CRL and Sequence evaluation.
  • -
  • Julius Davies <juliusdavies@gmail.com> - additional modes and algorithm support in PEMReader
  • -
  • Matthias <g@rtner.de> - GnuPG compatibility changes for PBEFileProcessor.
  • -
  • Olga Käthler <olga.kaethler@hjp-consulting.com> - initial implementation of TeleTrusT EC curves, additional ISO 9797 MACs, contributions to EAC OIDs, addition of EAC algorithms to CMS Signing.
  • -
  • Germano Rizzo <germano.rizzo@gmail.com> - initial implementation of CMac, EAX, HC-128, and HC-256, optimisations for Salsa20.
  • -
  • Núria Marí <numaa@hotmail.com> - patch for alternate data type recoginition in CMSSignedDataParser.
  • -
  • Janis Schuller <js@tzi.de> - addition of NotationData packets for OpenPGP.
  • -
  • Michael Samblanet <mike@samblanet.com> - patches towards improved Sun/default provider support in CMS.
  • -
  • Mike StJohns <mstjohns@comcast.net> - patches for supporting empty subject in X.509 certificate generation, noneWithECDSA.
  • -
  • Ramon Keller <ramon.keller@gmx.ch> - patch to deal with null revocations return from other CRL in X509V2CRLGenerator.
  • -
  • Mark Nelson <mark@nbr.com> - correction to excluded DN in name constraints processing for PKIX processing.
  • -
  • Eugene Golushkov <eugene_gff@ukr.net> - mask fix to single byte read in TlsInputStream.
  • -
  • Julien Pasquier <julienpasquier@free.fr> - additional classes for supporting signature policy and signer certificates in the ASN.1 esf and ess libraries.
  • -
  • Peter Knopp <pknopp@mtg.de> - fix for named curve recognition in ECGOST key generation.
  • -
  • Jakub Gwozdz <gwozdziu@rpg.pl> - addition of getTsa() to TimeStampTokenInfo.
  • -
  • Bartosz Malkowski <bmalkow@tigase.org> - initial implementation of VMPC cipher, VMPCRandomGenerator, VMPCMac.
  • -
  • Tal Yacobi <tal.yacobi@octavian-tech.com> - fix for issue in OpenPGP examples [#BJA-55].
  • -
  • Massimiliano Ziccardi <massimiliano.ziccardi@gmail.comt> - support for counter signature reading in CMS API, update for multiple counter signature attributes.
  • -
  • Andrey Pavlenko <andrey.a.pavlenko@gmail.com> - security manager patch for PKCS1Encoding property check.
  • -
  • Mike StJohns <mstjohns@comcast.net> - updates to KeyPurposeId
  • -
  • J Ross Nicoll <jrn@jrn.me.uk> - improved exception handling for getInstance() in ASN.1 library.
  • -
  • Matthew Stevenson <mavricknz@yahoo.com> - patch to construtor for CRMF CertSequence.
  • -
  • Gabriele Contini <gcontini@hotpop.com> - identified a bug in ASN.1 library with handling of unterminated NDEF's.
  • -
  • Roelof Naude <roelof.naude@epiuse.com> - patch for TLS client to send empty client certs in response to HP_CERTIFICATE_REQUEST.
  • -
  • Patrick Peck <peck@signaturen.at> - identified problem with DERApplicationSpecific and high tag numbers in ASN.1 library.
  • -
  • Michael LeMay <lemaymd@lemaymd.com> - identified problem with EAX [#BJA-93].
  • -
  • Alex Dupre <ale@FreeBSD.org> - fix to use of Signature rather than SignatureSpi in provider [#BJA-90]. Addition of null provider use to SignedPublicKeyAndChallenge and PKCS10CertificationRequest [#BJA-102]
  • -
  • Michael Schoene <michael@sigrid-und-michael.de> - fix of improper handling of null in ExtendedPKIXParameters.setTrustedACIssuers(), check for V2 signingCertificate attribute in TimeStampResponse.validate().
  • -
  • Ion Larrañaga <ilarra@s21sec.com> fix to default partial packet generation in BCPGOutputStream.
  • -
  • Bob Kerns <bob.kerns@positscience.com> fix to hashCode for X509CertificateObject.
  • -
  • Stefan Meyer <stefan.meyer@ewe.de> backport for PKIXCertPathValidotor and SMIMESignedMailReviewer.
  • -
  • Robert J. Moore <Robert.J.Moore@allanbank.com> speedups for OpenPGPCFB mode, clean room JCE patches.
  • -
  • Rui Hodai <rui@po.ntts.co.jp> speed ups for Camellia implementation, CamelliaLightEngine.
  • -
  • Emir Bucalovic <emir.bucalovic@@mail.com> initial implementation of Grain-v1 and Grain-128.
  • -
  • Torbjorn Svensson <tobbe79@gmail.com> initial implementation of Grain-v1 and Grain-128.
  • -
  • Paul FitzPatrick <bouncycastle_pfitz@fitzpatrick.cc> error message fix to X509LDAPCertStoreSpi, comparison fix to BCStrictStyle.
  • -
  • Henrik Andersson <k.henrik.andersson@gmail.com> addition of UniqueIssuerID to certificate generation.
  • -
  • Cagdas Cirit <cagdascirit@gmail.com> subjectAlternativeName fix for x509CertStoreSelector.
  • -
  • Harakiri <harakiri_23@yahoo.com> datahandler patch for attached parts in SMIME signatures.
  • -
  • Pedro Henriques <pmahenriques@gmail.com> explicit bounds checking for DESKeyGenerator, code simplification for OAEPEncoding.
  • -
  • Lothar Kimmeringer <job@kimmeringer.de> verbose mode for ASN1Dump, support for DERExternal.
  • -
  • Richard Farr <rfarr.se@gmail.com> initial SRP-6a implementation.
  • -
  • Thomas Castiglione <castiglione@au.ibm.com> patch to encoding for CRMF OptionalValidity.
  • -
  • Elisabetta Romani <eromani@sogei.it> patch for recognising multiple counter signatures.
  • -
  • Robin Lundgren <r737lundgren@gmail.com> CMPCertificate constructor from X509CertificateStructure fix.
  • -
  • Petr Kadlec <mormegil@centrum.cz> fix to sign extension key and IV problem in HC-128, HC-256.
  • -
  • Andreas Antener <antener_a@gmx.ch> fix to buffer reset in AsymmetricBufferedBlockCipher.
  • -
  • Harendra Rawat <hsrawat@yahoo.com> fix for BERConstructedOctetString.
  • -
  • Rolf Lindemann <lindemann@trustcenter.de> patch for PKCS12 key store to support more flexible attribute specifications [#BMA-42].
  • -
  • Alex Artamonov <alexart.home@gmail.com> name look up patch for GOST-2001 parameters.
  • -
  • Mike Lyons <mlyons@layer7tech.com> work arounds for EC JDK bug 6738532 and JSSE EC naming conventions.
  • -
  • Chris Cole <chris_h_cole@yahoo.com> identified a problem handling null passwords when loading a BKS keystore.
  • -
  • Tomas Krivanek <tom@atack.cz> added checking of Sender header to SignedMailValidator.
  • -
  • Michael <emfau@t-online.de> correction of field error in getResponse method in CertRepMessage.
  • -
  • Trevor Perrin <trevor@cryptography.com> addition of constant time equals to avoid possible timing attacks.
  • -
  • Markus Kilås <markus@primekey.se> several enhancements to TimeStampResponseGenerator.
  • -
  • Dario Novakovic <darionis@yahoo.com> fix for NPE when checking revocation reason on CRL without extensions.
  • -
  • Michael Smith <msmith@cbnco.com> bug fixes and enhancements to the CMP and CRMF classes, initial Master List classes.
  • -
  • Andrea Zilio <andrea.zilio@gmail.com> fix for PEM password encryption of private keys.
  • -
  • Alex Birkett <alex@birkett.co.uk> added support for EC cipher suites in TLS client (RFC 4492) [#BJA-291].
  • -
  • Wayne Grant <waynedgrant@gmail.com> additional OIDs for PCKS10 and certificate generation support.
  • -
  • Frank Cornelis <info@frankcornelis.be> additional support classes for CAdES, enhancements to OCSP classes.
  • -
  • Jan Dittberner <jan@dittberner.info> addHeader patch for SMIME generator.
  • -
  • Bob McGowan <boab.mcgoo@btinternet.com> patch to support different content and mgf digests in PSS signing.
  • -
  • Ivo Matheis <i.matheis@seeburger.de> fix to padding verification in ISO-9796-1.
  • -
  • Marco Sandrini <nessche@gmail.com> patch to add IV to ISO9797Alg3Mac.
  • -
  • Alf Malf <alfilmalf@hotmail.com> removal of unnecessary limit in CMSContentInfoParser.
  • -
  • Alfonso Massa <alfonso.massa@insiel.it> contributions to CMS time stamp classes.
  • -
  • Giacomo Boccardo <gboccardo@unimaticaspa.it> initial work on CMSTimeStampedDataParser.
  • -
  • Arnis Tartu <arnis@ut.ee> patches for dealing with OIDs with specific key sizes associated in CMS.
  • -
  • Janusz Sikociński <J.Sikocinski@gdzie.pl> addition of Features subpacket support to OpenPGP API.
  • -
  • Juri Hudolejev <jhudolejev@gmail.com> JavaDoc fix to CMSSignedDataParser.
  • -
  • Liane Velten <liane.velten@hjp-consulting.com> fine tuning of code for DHParameters validation.
  • -
  • Shawn Willden <swillden@google.com> additional functionality to PGPKeyRing.
  • -
  • Atanas Krachev <akrachev@gmail.com> added support for revocation signatures in OpenPGP.
  • -
  • Mickael Laiking <mickael.laiking@keynectis.com> initial cut of EAC classes.
  • -
  • Tim Buktu <tbuktu@hotmail.com> Initial implementation of NTRU signing and encryption.
  • -
  • Bernd <rbernd@gmail.com> Fix for open of PGP literal data stream with UTF-8 naming.
  • -
  • Steing Inge Morisbak <stein.inge.morisbak@BEKK.no> Test code for lower case Hex data in PEM headers.
  • -
  • Andreas Schmid <andreas.schmid@tngtech.com> Additional expiry time check in PGPPublicKeys.
  • -
  • Phil Steitz <phil.steitz@gmail.com> Final patch eliminating JCE dependencies in the OpenPGP BC classes.
  • -
  • Ignat Korchagin <ignat.korchagin@gmail.com> Initial implementation of DSTU-4145-2002.
  • -
  • Petar Petrov <p.petrov@bers-soft.com> Testing and debugging of UTF-8 OpenPGP passwords.
  • -
  • Daniel Fitzpatrick <daniel.f.nwr@gmail.com> Initial implementation of ephemeral key support for IES.
  • -
  • Andy Neilson <Andy.Neilson@quest.com>a further patches to deal with multiple providers and PEMReader.
  • -
  • Ted Shaw <xiao.xj@gmail.com> patch to MiscPEMGenerator for handling new PKCS10CeriticationRequests.
  • -
  • Eleriseth <Eleriseth@WPECGLtYbVi8Rl6Y7Vzl2Lvd2EUVW99v3yNV3IWROG8.fms> speed up for SIC/CTR mode. Provider compatibilty generalisations for EC operations.
  • -
  • Kenny Root <kenny@the-b.org> patch for issuerAltName, subjectAltName support in X509CertificateObject
  • -
  • Marteen Bodewes <maarten.bodewes@gmail.com> initial implementation of HKDF.
  • -
  • Philip Clay <pilf_b@gyahoo.com> Initial implementation of J-PAKE.
  • -
  • Brian Carlstrom <bdc@carlstrom.com> compliance patches for some JCA/JCE keystore and cipher classes, miscellaneous code quality improvements.
  • -
- - diff --git a/java/ext/lcrypto-jdk15on-148/LICENSE.html b/java/ext/lcrypto-jdk15on-148/LICENSE.html deleted file mode 100644 index c317e74..0000000 --- a/java/ext/lcrypto-jdk15on-148/LICENSE.html +++ /dev/null @@ -1,22 +0,0 @@ - - - -Copyright (c) 2000-2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) -

-Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: -

-The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. -

-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - diff --git a/java/ext/lcrypto-jdk15on-148/bin/META-INF/MANIFEST.MF b/java/ext/lcrypto-jdk15on-148/bin/META-INF/MANIFEST.MF deleted file mode 100644 index 5e94951..0000000 --- a/java/ext/lcrypto-jdk15on-148/bin/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/java/ext/lcrypto-jdk15on-148/index.html b/java/ext/lcrypto-jdk15on-148/index.html deleted file mode 100644 index 6899828..0000000 --- a/java/ext/lcrypto-jdk15on-148/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - -The Bouncy Castle Crypto Package - - - - -

-

The Bouncy Castle Crypto Package

- -
-
-
-
-The Bouncy Castle Crypto package is a Java implementation of -cryptographic algorithms, it was developed by the Legion of the -Bouncy Castle - with a little help! The Legion, and the latest -goings on with this package, can be found at -http://www.bouncycastle.org. -

-The Legion also gratefully acknowledges the contributions made to this -package by others (see here -for the current list). -

-The package is organised so that it -contains a light-weight API suitable for use in any environment -(including the newly released J2ME) with the additional infrastructure -to conform the algorithms to the JCE framework. -

-Except where otherwise stated, this software is distributed under a license based on the MIT X Consortium license. To view the license, see here. The OpenPGP library also includes a modified BZIP2 library which is licensed under the Apache Software License, Version 2.0. -

-The current release notes for this package are -here. -

-The current specifications for this package are -here. -

-The current api documentation for this package is -here. -

-

-

Examples and Tests

-

-

To view some examples, look at the test programs in the packages: -

    -
  • org.bouncycastle.crypto.test -

  • org.bouncycastle.jce.provider.test -

  • org.bouncycastle.cms.test -

  • org.bouncycastle.mail.smime.test -

  • org.bouncycastle.openpgp.test - -

  • org.bouncycastle.tsp.test - -

-

There are also some specific example programs for dealing with Attribute Certificates, PKCS12, SMIME and OpenPGP. They can be found in: -

    -
  • org.bouncycastle.jce.examples -

  • org.bouncycastle.mail.smime.examples -

  • org.bouncycastle.openpgp.examples - -

  • org.bouncycastle.x509.examples -

- -

Finally there are also code examples from Beginning Cryptography with Java which demonstrate both the use of the JCE/JCA and also some of the Bouncy Castle APIs.

-

-Note 1:The JCE classes are only distributed with the JDK 1.1, JDK 1.2, and JDK 1.3 JCE releases. The -JDK 1.0, J2ME, and the JDK 1.1, JDK 1.2, JDK 1.3, JDK 1.4, and JDK 1.5 lightweight releases only include the -Bouncy Castle lightweight cryptography API.
-Note 2:The regression test for Diffie-Hellman is quite slow. -

Building From CVS

-

-The src and test/src directory are for JDK 1.5. -

-

-Compatibility classes for other VMs are as follows: -

    -
  • JDK 1.4 - jdk1.4, test/jdk1.4 -
  • JDK 1.3 - jdk1.3, test/jdk1.3 -
  • JDK 1.2 - jdk1.2 -
  • JDK 1.1 - jdk1.1 -
  • JDK 1.0 - jdk1.0 -
  • J2ME - j2me -
-

-

-The clean room JCE, which will compile with everything from JDK 1.1 and up is in the jce/src directory. -

-

-The build scripts that come with the full distribution allow creation of the different releases by using the tree under src and test/src, excluding classes that are not appropriate and copying in the required compatibility classes from the directories containing compatibility classes appropriate for the distribution. -

-

-If you want to try create a build for yourself, using your own environment, the best way to do it is to start with the build for the distribution you are interested in, make sure that builds, and then modify your build scripts to do the required exclusions and file copies for your setup, otherwise you are likely to get class not found exceptions. The final caveat to this is that as the j2me distribution includes some compatibility classes starting in the java package, you need to use an obfuscator to change the package names before attempting to import a midlet using the BC API. -

-

Mailing Lists

-

-For those who are interested, there are 2 mailing lists -for participation in this project. To subscribe use the -links below and include the word subscribe in the message body. (To unsubscribe, replace subscribe with -unsubscribe in the message body) -

-NOTE:You need to be subscribed to send mail to the above -mailing list. -

-If you want to provide feedback, offers of jobs (or more importantly -beer) directly to the members of The Legion -then please use -feedback-crypto@bouncycastle.org -

-Enjoy! - - diff --git a/java/ext/lcrypto-jdk15on-148/releasenotes.html b/java/ext/lcrypto-jdk15on-148/releasenotes.html deleted file mode 100644 index 1af7401..0000000 --- a/java/ext/lcrypto-jdk15on-148/releasenotes.html +++ /dev/null @@ -1,1434 +0,0 @@ - - -Bouncy Castle Crypto Package - Release Notes - - - - -

-

Bouncy Castle Crypto Package - Release Notes

- -
-
-
-
-

1.0 Introduction

-The Bouncy Castle Crypto package is a Java implementation of -cryptographic algorithms. The package is organised so that it -contains a light-weight API suitable for use in any environment -(including the newly released J2ME) with the additional infrastructure -to conform the algorithms to the JCE framework. -

-

2.0 Release History

- -

2.1.1 Version

-Release 1.48 -

2.1.2 Defects Fixed

-
    -
  • Occasional key compatibility issues in IES due to variable length keys have been fixed.
  • -
  • PEMWriter now recognises the new PKCS10CertificationRequest object.
  • -
  • The provider implementation for RSA now resets when the init method is called.
  • -
  • SignerInformation has been rewritten to better support signers without any associated signed attributes.
  • -
  • An issue with an incorrect version number of SignedData associated with the use of SubjectKeyIdentifiers has now been fixed.
  • -
  • An issue with the equals() check in BCStrictStyle has been fixed.
  • -
  • The BC SSL implementation has been modified to deal with the "Lucky Thirteen" attack.
  • -
  • A regression in 1.47 which prevented key wrapping with regular symmetric PBE algorihtms has been fixed.
  • -
- -

2.1.3 Additional Features and Functionality

-
    -
  • IES now supports auto generation of ephemeral keys in both the JCE and the lightweight APIs.
  • -
  • A new class PEMParser has been added to return the new CertificateHolder and Request objects introduced recently.
  • -
  • An implementation of Password Authenticated Key Exchange by Juggling (J-PAKE) has now been added to the lightweight API.
  • -
  • Support has now been added for the DSTU-4145-2002 to the lightweight API and the provider.
  • -
  • The BC X509Certificate implementation now provides support for the JCA methods X509Certificate.getSubjectAlternativeNames() and X509Certificate.getIssuerAlternativeNames().
  • -
  • PEMReader can now be configured to support different providers for encyrption and public key decoding.
  • -
  • Some extra DSA OIDs have been added to the supported list for the provider.
  • -
  • The BC provider will now automatically try to interpret other provider software EC private keys. It is no longer necessary to use a KeyFactory for conversion.
  • -
  • A new provider, the BCPQ (for BC Post Quantum) provider has been added with support for the Rainbow signature algorithm and the McEliece family of encryption algorithms.
  • -
  • Support has been added for the SHA3 family of digests to both the provider and the lightweight API.
  • -
- -

2.2.1 Version

-Release 1.47 -

2.2.2 Defects Fixed

-
    -
  • OpenPGP ID based certifications now support UTF-8. Note: this may mean that some old certifications no longer validate - if this happens a retry can be added using by converting the ID using Strings.fromByteArray(Strings.toByteArray(id)) - this will strip out the top byte in each character.
  • -
  • IPv4/IPv6 parsing in CIDR no longer assumes octet boundaries on a mask.
  • -
  • The CRL PKIX routines will now only rebuild the CRL as a last resort when looking for the certificate issuer.
  • -
  • The DEK-Info header in PEM generation was lower case. It is now upper case in accordance with RFC 1421.
  • -
  • An occasional issue causing an OutOfMemoryException for PGP compressed data generation has now been fixed.
  • -
  • An illegal argument exception that could occur with multi-valued RDNs in the X509v3CertificateBuilder has been fixed.
  • -
  • Shared secret calculation in IES could occasionally add a leading zero byte. This has been fixed.
  • -
  • PEMReader would choke on a private key with an empty password. This has been fixed.
  • -
  • The default MAC for a BKS key store was 2 bytes, this has been upgraded to 20 bytes.
  • -
  • BKS key store loading no longer freezes on negative iteration counts.
  • -
  • A regression in 1.46 which prevented parsing of PEM files with extra text at the start has been fixed.
  • -
  • CMS secret key generation now attempts to stop use of invalid lengths with OIDs that predefine a key length.
  • -
  • Check of DH parameter L could reject some valid keys. This is now fixed.
  • -
- -

2.2.3 Additional Features and Functionality

-
    -
  • Support is now provided via the RepeatedKey class to enable IV only re-initialisation in the JCE layer. The same effect can be acheived in the light weight API by using null as the key parameter when creating a ParametersWithIV object.
  • -
  • CRMF now supports empty poposkInput.
  • -
  • The OpenPGP API now supports operator based interfaces for most operations and lightweight implementations have been added for JCE related functionality.
  • -
  • JcaSignerId and JceRecipientId will now match on serial number, issuer, and the subject key identifier if it's available.
  • -
  • CMS Enveloped and AuthenticatedData now support OriginatorInfo.
  • -
  • NTRU encryption and signing is now provided in the lightweight source and the ext version of the provider.
  • -
  • There is now API support for Extended Access Control (EAC).
  • -
  • The performance of CertPath building and validation has been improved.
  • -
  • The TLS Java Client API has been updated to make support for GSI GSSAPI possible.
  • -
  • Support for ECDSA_fixed_ECDH authentication has been added to the TLS client.
  • -
  • Support for the Features signature sub-packet has been added to the PGP API.
  • -
  • The number of lightweight operators for PGP and CMS/SMIME has been increased.
  • -
  • Classes involved in CRL manipulation have been rewritten to reduce memory requirements for handling and parsing extremely large CRLs.
  • -
  • RFC 5751 changed the definition of the micalg parameters defined in RFC 3851. The SMIMESignedGenerator is now up to date with the latest micalg parameter set and a constructor has been added to allow the old micalg parameter set to be used.
  • -
  • An operator based framework has been added for processing PKCS#8 and PKCS#12 files.
  • -
  • The J2ME lcrypto release now includes higher level classes for handling PKCS, CMS, CRMF, CMP, EAC, OpenPGP, and certificate generation.
  • -
- -

2.2.4 Other notes

-

-Okay, so we have had to do another release. The issue we have run into is that we probably didn't go far enough in 1.46, but we are now confident that moving from this release to 2.0 should be largely just getting rid of deprecated methods. While this release does change a lot it is relatively straight forward to do a port and we have a porting guide which explains the important ones. The area there has been the most change in is the ASN.1 library which was in bad need of a rewrite after 10 years of patching. On the bright side the rewrite did allow us to eliminate a few problems and bugs in the ASN.1 library, so we have some hope anyone porting to it will also have similar benefits. As with 1.46 the other point of emphasis has been making sure interface support is available for operations across the major APIs, so the lightweight API or some local role your own methods can be used instead for doing encryption and signing. -

- -

2.3.1 Version

-Release 1.46 -

2.3.2 Defects Fixed

-
    -
  • An edge condition in ECDSA which could result in an invalid signature has been fixed.
  • -
  • Exhaustive testing has been performed on the ASN.1 parser, eliminating another potential OutOfMemoryException and several escaping run time exceptions.
  • -
  • BC generated certificates generated different hashCodes from other equivalent implementations. This has been fixed.
  • -
  • Parsing an ESSCertIDv2 would fail if the object did not include an IssuerSerialNumber. This has been fixed.
  • -
  • DERGeneralizedTime.getDate() would produce incorrect results for fractional seconds. This has been fixed.
  • -
  • PSSSigner would produce incorrect results if the MGF digest and content digest were not the same. This has been fixed.
  • -
-

2.3.3 Additional Features and Functionality

-
    -
  • A null genTime can be passed to TimeStampResponseGenerator.generate() to generate timeNotAvailable error responses.
  • -
  • Support has been added for reading and writing of openssl PKCS#8 encrypted keys.
  • -
  • New streams have been added for supporting general creation of PEM data, and allowing for estimation of output size on generation. Generators have been added for some of the standard OpenSSL objects.
  • -
  • CRL searching for CertPath validation now supports the optional algorithm given in Section 6.3.3 of RFC 5280, allowing the latest CRL to be used for a set time providing the certificate is unexpired.
  • -
  • AES-CMAC and DESede-CMAC have been added to the JCE provider.
  • -
  • Support for CRMF (RFC 4211) and CMP (RFC 4210) has been added.
  • -
  • BufferedBlockCipher will now always reset after a doFinal().
  • -
  • Support for CMS TimeStampedData (RFC 5544) has been added.
  • -
  • JCE EC keypairs are now serialisable.
  • -
  • TLS now supports client-side authentication.
  • -
  • TLS now supports compression.
  • -
  • TLS now supports ECC cipher suites (RFC 4492).
  • -
  • PGP public subkeys can now be separately decoded and encoded.
  • -
  • An IV can now be passed to an ISO9797Alg3Mac.
  • -
-

2.3.4 Other notes

-

-Baring security patches we expect 1.46 will be the last of the 1.* releases. The next release of -BC will be version 2.0. For this reason a lot of things in 1.46 that relate to CMS have been deprecated and -new methods have been added to the CMS and certificate handling APIs which provide greater flexibility -in how digest and signature algorithms get used. It is now possible to use the lightweight API or a simple -custom API with CMS and for certificate generation. In addition a lot of methods and some classes that were -deprecated for reasons of been confusing, or in some cases just plan wrong, have been removed. -

-

-So there are four things useful to know about this release: -

    -
  • It's not a simple drop in like previous releases, if you wish migrate to it you will need to recompile your application.
  • -
  • If you avoid deprecated methods it should be relatively painless to move to version 2.0
  • -
  • The X509Name class will utlimately be replacde with the X500Name class, the getInstance() methods on both these classes allow conversion from one type to another.
  • -
  • The org.bouncycastle.cms.RecipientId class now has a collection of subclasses to allow for more specific recipient matching. If you are creating your own recipient ids you should use the constructors for the subclasses rather than relying on the set methods inherited from X509CertSelector. The dependencies on X509CertSelector and CertStore will be removed from the version 2 CMS API.
  • -
-

-

2.4.1 Version

-Release 1.45 -

2.4.2 Defects Fixed

-
    -
  • OpenPGP now supports UTF-8 in file names for literal data.
  • -
  • The ASN.1 library was losing track of the stream limit in a couple of places, leading to the potential of an OutOfMemoryError on a badly corrupted stream. This has been fixed.
  • -
  • The provider now uses a privileged block for initialisation.
  • -
  • JCE/JCA EC keys are now serialisable.
  • -
-

2.4.3 Additional Features and Functionality

-
    -
  • Support for EC MQV has been added to the light weight API, provider, and the CMS/SMIME library.
  • -
-

2.4.4 Security Advisory

-
    -
  • This version of the provider has been specifically reviewed to eliminate possible timing attacks on algorithms such as GCM and CCM mode.
  • -
- -

2.5.1 Version

-Release 1.44 -

2.5.2 Defects Fixed

-
    -
  • The reset() method in BufferedAsymmetricBlockCipher is now fully clearing the buffer.
  • -
  • Use of ImplicitlyCA with KeyFactory and Sun keyspec no longer causes NullPointerException.
  • -
  • X509DefaultEntryConverter was not recognising telephone number as a PrintableString field. This has been fixed.
  • -
  • The SecureRandom in the J2ME was not using a common seed source, which made cross seeeding of SecureRandom's impossible. This has been fixed.
  • -
  • Occasional uses of "private final" on methods were causing issues with some J2ME platforms. The use of "private final" on methods has been removed.
  • -
  • NONEwithDSA was not resetting correctly on verify() or sign(). This has been fixed.
  • -
  • Fractional seconds in a GeneralisedTime were resulting in incorrect date conversions if more than 3 decimal places were included due to the Java date parser. Fractional seconds are now truncated to 3 decimal places on conversion.
  • -
  • The micAlg in S/MIME signed messages was not always including the hash algorithm for previous signers. This has been fixed.
  • -
  • SignedMailValidator was only including the From header and ignoring the Sender header in validating the email address. This has been fixed.
  • -
  • The PKCS#12 keystore would throw a NullPointerException if a null password was passed in. This has been fixed.
  • -
  • CertRepMessage.getResponse() was attempting to return the wrong underlying field in the structure. This has been fixed.
  • -
  • PKIXCertPathReviewer.getTrustAnchor() could occasionally cause a null pointer exception or an exception due to conflicting trust anchors. This has been fixed.
  • -
  • Handling of explicit CommandMap objects with the generation of S/MIME messages has been improved.
  • -
-

2.5.3 Additional Features and Functionality

-
    -
  • PEMReader/PEMWriter now support encrypted EC keys.
  • -
  • BC generated EC private keys now include optional fields required by OpenSSL.
  • -
  • Support for PSS signatures has been added to CMS and S/MIME.
  • -
  • CMS processing will attempt to recover if there is no AlgorithmParameters object for a provider and use an IvParameterSpec where possible.
  • -
  • CertificateID always required a provider to be explicitly set. A null provider is now interpreted as a request to use the default provider.
  • -
  • SubjectKeyIdentifier now supports both methods specified in RFC 3280, section 4.2.1.2 for generating the identifier.
  • -
  • Performance of GCM mode has been greatly improved (on average 10x).
  • -
  • The BC provider has been updated to support the JSSE in providing ECDH.
  • -
  • Support for mac lengths of 96, 104, 112, and 120 bits has been added to existing support for 128 bits in GCMBlockCipher.
  • -
  • General work has been done on trying to propagate exception causes more effectively.
  • -
  • Support for loading GOST 34.10-2001 keys has been improved in the provider.
  • -
  • Support for raw signatures has been extended to RSA and RSA-PSS in the provider. RSA support can be used in CMSSignedDataStreamGenerator to support signatures without signed attributes.
  • -
- -

2.6.1 Version

-Release 1.43 -

2.6.2 Defects Fixed

-
    -
  • Multiple countersignature attributes are now correctly collected.
  • -
  • Two bugs in HC-128 and HC-256 related to sign extension and byte swapping have been fixed. The implementations now pass the latest ecrypt vector tests.
  • -
  • X509Name.hashCode() is now consistent with equals.
  • -
-

2.6.3 Security Advisory

-
    -
  • The effect of the sign extension bug was to decrease the key space the HC-128 and HC-256 ciphers were operating in and the byte swapping inverted every 32 bits of the generated stream. If you are using either HC-128 or HC-256 you must upgrade to this release.
  • -
- -

2.7.1 Version

-Release 1.42 -

2.7.2 Defects Fixed

-
    -
  • A NullPointer exception which could be result from generating a diffie-hellman key has been fixed.
  • -
  • CertPath validation could occasionally mistakenly identify a delta CRL. This has been fixed.
  • -
  • '=' inside a X509Name/X509Principal was not being properly escaped. This has been fixed.
  • -
  • ApplicationSpecific ASN.1 tags are now recognised in BER data. The getObject() method now handles processing of arbitrary tags.
  • -
  • X509CertStoreSelector.getInstance() was not propagating the subjectAlternativeNames attribute. This has been fixed.
  • -
  • Use of the BC PKCS#12 implementation required the BC provider to be registered explicitly with the JCE. This has been fixed.
  • -
  • OpenPGP now fully supports use of the Provider object.
  • -
  • CMS now fully supports use of the Provider object.
  • -
  • Multiplication by negative powers of two is fixed in BigInteger.
  • -
  • OptionalValidity now encodes correctly.
  • -
-

2.7.3 Additional Features and Functionality

-
    -
  • Support for NONEwithECDSA has been added.
  • -
  • Support for Grainv1 and Grain128 has been added.
  • -
  • Support for EAC algorithms has been added to CMS/SMIME.
  • -
  • Support for basic CMS AuthenticatedData to the CMS package.
  • -
  • Jars are now packaged using pack200 for JDK1.5 and JDK 1.6.
  • -
  • ASN1Dump now supports a verbose mode for displaying the contents of octet and bit strings.
  • -
  • Support for the SRP-6a protocol has been added to the lightweight API.
  • -
- -

2.8.1 Version

-Release 1.41 -

2.8.2 Defects Fixed

-
    -
  • The GeneralName String constructor now supports IPv4 and IPv6 address parsing.
  • -
  • An issue with nested-multiparts with postamble for S/MIME that was causing signatures to fail verification has been fixed.
  • -
  • ESSCertIDv2 encoding now complies with RFC 5035.
  • -
  • ECDSA now computes correct signatures for oversized hashes when the order of the base point is not a multiple of 8 in compliance with X9.62-2005.
  • -
  • J2ME SecureRandom now provides additional protection against predictive and backtracking attacks when high volumes of random data are generated.
  • -
  • Fix to regression from 1.38: PKIXCertPathCheckers were not being called on intermediate certificates.
  • -
  • Standard name "DiffieHellman" is now supported in the provider.
  • -
  • Better support for equality tests for '#' encoded entries has been added to X509Name.
  • -
-

2.8.3 Additional Features and Functionality

-
    -
  • Camellia is now 12.5% faster than previously.
  • -
  • A smaller version (around 8k compiled) of Camellia, CamelliaLightEngine has also been added.
  • -
  • CMSSignedData generation now supports SubjectKeyIdentifier as well as use of issuer/serial.
  • -
  • A CMSPBE key holder for UTF8 keys has been added to the CMS API.
  • -
  • Salt and iteration count can now be recovered from PasswordRecipientInformation.
  • -
  • Methods in the OpenPGP, CMS, and S/MIME APIs which previously could only take provider names can now take providers objects as well (JDK1.4 and greater).
  • -
  • Support for reading and extracting personalised certificates in PGP Secret Key rings has been added.
  • -
- -

2.9.1 Version

-Release 1.40 -

2.9.2 Defects Fixed

-
    -
  • EAX mode ciphers were not resetting correctly after a doFinal/reset. This has been fixed.
  • -
  • The SMIME API was failing to verify doubly nested multipart objects in signatures correctly. This has been fixed.
  • -
  • Some boolean parameters to IssuingDistributionPoint were being reversed. This has been fixed.
  • -
  • A zero length RDN would cause an exception in an X509Name. This has been fixed.
  • -
  • Passing a null to ExtendedPKIXParameters.setTrustedACIssuers() would cause a NullPointerException. This has been fixed.
  • -
  • CertTemplate was incorrectly encoding issuer and subject fields when set.
  • -
  • hashCode() for X509CertificateObject was very poor. This has been fixed.
  • -
  • Specifying a greater than 32bit length for a stream and relying on the default BCPGOutputStream resulted in corrupted data. This has been fixed.
  • -
  • PKCS7Padding validation would not fail if pad length was 0. This has been fixed.
  • -
  • javax.crypto classes no longer appear in the JDK 1.3 provider jar.
  • -
  • Signature creation time was not being properly initialised in new V4 PGP signature objects although the encoding was correct. This has been fixed.
  • -
  • The '+' character can now be escaped or quoted in the constructor for X509Name, X509Prinicipal.
  • -
  • Fix to regression from 1.38: PKIXCertPathValidatorResult.getPublicKey was returning the wrong public key when the BC certificate path validator was used.
  • -
-

2.9.3 Additional Features and Functionality

-
    -
  • Galois/Counter Mode (GCM) has been added to the lightweight API and the JCE provider.
  • -
  • SignedPublicKeyAndChallenge and PKCS10CertificationRequest can now take null providers if you need to fall back to the default provider mechanism.
  • -
  • The TSP package now supports validation of responses with V2 signing certificate entries.
  • -
  • Unnecessary local ID attributes on certificates in PKCS12 files are now automatically removed.
  • -
  • The PKCS12 store types PKCS12-3DES-3DES and PKCS12-DEF-3DES-3DES have been added to support generation of PKCS12 files with both certificates and keys protected by 3DES.
  • -
-

2.9.4 Additional Notes

-
    -
  • Due to problems for some users caused by the presence of the IDEA algorithm, an implementation is no longer included in the default signed jars. Only the providers of the form bcprov-ext-*-*.jar now include IDEA.
  • -
- -

2.10.1 Version

-Release 1.39 -

2.10.2 Defects Fixed

-
    -
  • A bug causing the odd NullPointerException has been removed from the LocalizedMessage class.
  • -
  • IV handling in CMS for the SEED and Camellia was incorrect. This has been fixed.
  • -
  • ASN.1 stream parser now throws exceptions for unterminated sequences.
  • -
  • EAX mode was not handling non-zero offsetted data correctly and failing. This has been fixed.
  • -
  • The BC X509CertificateFactory now handles multiple certificates and CRLs in streams that don't support marking.
  • -
  • The BC CRL implementation could lead to a NullPointer exception being thrown if critical extensions were missing. This has been fixed.
  • -
  • Some ASN.1 structures would cause a class cast exception in AuthorityKeyIdentifier. This has been fixed.
  • -
  • The CertID class used by the TSP library was incomplete. This has been fixed.
  • -
  • A system property check in PKCS1Encoding to cause a AccessControlException under some circumstances. This has been fixed.
  • -
  • A decoding issue with a mis-identified tagged object in CertRepMessage has been fixed.
  • -
  • \# is now properly recognised in the X509Name class.
  • -
-

2.10.3 Additional Features and Functionality

-
    -
  • Certifications associated with user attributes can now be created, verified and removed in OpenPGP.
  • -
  • API support now exists for CMS countersignature reading and production.
  • -
  • The TSP package now supports parsing of responses with V2 signing certificate entries.
  • -
  • Lazy evaluation of DER sequences has been introduced to ASN1InputStream to allow support for larger sequences.
  • -
  • KeyPurposeId class has been updated for RFC 4945.
  • -
  • CertPath processing has been further extended to encompass the NIST CertPath evaluation suite.
  • -
  • Initial support has been added for HP_CERTIFICATE_REQUEST in the TLS API.
  • -
  • Providers for JDK 1.4 and up now use SignatureSpi directly rather than extending Signature. This is more in track with the way dynamic provider selection now works.
  • -
  • PGP example programs now handle blank names in literal data objects.
  • -
  • The ProofOfPossession class now better supports the underlying ASN.1 structure.
  • -
  • Support has been added to the provider for the VMPC MAC.
  • -
-

2.11.1 Version

-Release 1.38 -

2.11.2 Defects Fixed

-
    -
  • SMIME signatures containing non-standard quote-printable data could be altered by SMIME encryption. This has been fixed.
  • -
  • CMS signatures that do not use signed attributes were vulnerable to one of Bleichenbacher's RSA signature forgery attacks. This has been fixed.
  • -
  • The SMIMESignedParser(Part) constructor was not producing a content body part that cleared itself after writeTo() as indicated in the JavaDoc. This has been fixed.
  • -
  • BCPGInputStream now handles data blocks in the 2**31->2**32-1 range.
  • -
  • A bug causing second and later encrypted objects to be ignored in KeyBasedFileProcessor example has been fixed.
  • -
  • Value of the TstInfo.Tsa field is now directly accessible from TimeStampTokenInfo.
  • -
  • Generating an ECGOST-3410 key using an ECGenParameterSpec could cause a ClassCastException in the key generator. This has been fixed.
  • -
  • Use of the parameters J and L in connection with Diffie-Hellman parameters in the light weight API was ambiguous and confusing. This has been dealt with.
  • -
  • Some entities were not fully removed from a PKCS#12 file when deleted due to case issues. This has been fixed.
  • -
  • Overwriting entities in a PKCS#12 file was not fully compliant with the JavaDoc for KeyStore. This has been fixed.
  • -
  • TlsInputStream.read() could appear to return end of file when end of file had not been reached. This has been fixed.
  • -
-

2.11.3 Additional Features and Functionality

-
    -
  • Buffering in the streaming CMS has been reworked. Throughput is now usually higher and the behaviour is more predictable.
  • -
  • It's now possible to pass a table of hashes to a CMS detached signature rather than having to always pass the data.
  • -
  • Classes supporting signature policy and signer attributes have been added to the ASN.1 ESS/ESF packages.
  • -
  • Further work has been done on optimising memory usage in ASN1InputStream. In some cases memory usage has been reduced to 25% of previous.
  • -
  • Pre-existing signers can now be added to the SMIMESignedGenerator.
  • -
  • Support has been added to the provider for the VMPC stream cipher.
  • -
  • CertPathReviewer has better handling for problem trust anchors.
  • -
  • Base64 encoder now does initial size calculations to try to improve resource usage.
  • -
-

2.12.1 Version

-Release 1.37 -

2.12.2 Defects Fixed

-
    -
  • The ClearSignedFileProcessor example for OpenPGP did not take into account trailing white space in -the file to be signed. This has been fixed.
  • -
  • A possible infinite loop in the CertPathBuilder and SignedMailValidator have been removed.
  • -
  • Requesting DES, DESede, or Blowfish keys using regular Diffie-Hellman now returns the same length keys as the regular JCE provider.
  • -
  • Some uncompressed EC certificates were being interpreted as compressed and causing an exception. This has been fixed.
  • -
  • Adding a CRL with no revocations on it to the CRL generator could cause an exception to be thrown. This has been fixed.
  • -
  • Using the default JDK provider with the CMS library would cause exceptions in some circumstances. This has been fixed.
  • -
  • BC provider DSAKeys are now serializable.
  • -
  • Using only a non-sha digest in S/MIME signed data would produce a corrupt MIME header. This has been fixed.
  • -
  • The default private key length in the lightweght API for generated DiffieHellman parameters was absurdly small, this has been fixed.
  • -
  • Cipher.getParameters() for PBEwithSHAAndTwofish-CBC was returning null after intialisation. This has been fixed.
  • -
-

2.12.3 Additional Features and Functionality

-
    -
  • The block cipher mode CCM has been added to the provider and light weight API.
  • -
  • The block cipher mode EAX has been added to the provider and light weight API.
  • -
  • The stream cipher HC-128 and HC-256 has been added to the provider and lightwieght API.
  • -
  • The stream cipher ISAAC has been added to the lightweight API.
  • -
  • Support for producing and parsing notation data signature subpackets has been added to OpenPGP.
  • -
  • Support for implicit tagging has been added to DERApplicationSpecific.
  • -
  • CMS better supports basic Sun provider.
  • -
  • A full set of SEC-2 EC curves is now provided in the SEC lookup table.
  • -
  • Specifying a null provider in CMS now always uses the default provider, rather than causing an exception.
  • -
  • Support has been added to the OpenPGP API for parsing experimental signatures
  • -
  • CertPath validator now handles inherited DSA parameters and a wider range of name constraints.
  • -
  • Further work has been done on improving the performance of ECDSA - it is now about two to six times faster depending on the curve.
  • -
  • The Noekeon block cipher has been added to the provider and the lightweight API.
  • -
  • Certificate generation now supports generation of certificates with an empty Subject if the subjectAlternativeName extension is present.
  • -
  • The JCE provider now supports RIPEMD160withECDSA.
  • -
- -

2.13.1 Version

-Release 1.36 -

2.13.2 Defects Fixed

-
    -
  • DSA key generator now checks range and keysize.
  • -
  • Class loader issues with i18n classes should now be fixed.
  • -
  • X.500 name serial number value now output as unambiguous long form SERIALNUMBER
  • -
  • The fix for multipart messages with mixed content-transfer-encoding in 1.35 caused a -regression for processing some messages with embedded multiparts that contained blank lines of preamble text - this should now be fixed.
  • -
  • Another regression which sometimes affected the SMIMESignedParser has also been fixed.
  • -
  • SharedFileInputStream compatibility issues with JavaMail 1.4 have been addressed.
  • -
  • JDK 1.5 and later KeyFactory now accepts ECPublicKey/ECPrivateKey to translateKey.
  • -
  • JDK 1.5 and later KeyFactory now produces ECPublicKeySpec/ECPrivateKeySpec on getKeySpec.
  • -
  • Some surrogate pairs were not assembled correctly by the UTF8 decoder. This has been fixed.
  • -
  • Alias resolution in PKCS#12 is now case insensitive.
  • -
-

2.13.3 Additional Features and Functionality

-
    -
  • CMS/SMIME now supports basic EC KeyAgreement with X9.63.
  • -
  • CMS/SMIME now supports RFC 3211 password based encryption.
  • -
  • Support has been added for certificate, CRL, and certification request generation for the regular SHA algorithms with RSA-PSS.
  • -
  • Further work has been done in speeding up prime number generation in the lightweight BigInteger class.
  • -
  • Support for the SEED algorithm has been added to the provider and the lightweight API.
  • -
  • Support for the Salsa20 algorithm has been added to the provider and the lightweight API.
  • -
  • CMS/SMIME now support SEED and Camellia
  • -
  • A table of TeleTrusT curves has been added.
  • -
  • CMSSignedData creation and Collection CertStore now preserves the order of certificates/CRls if the backing collection is ordered.
  • -
  • CMS Signed objects now use BER encoding for sets containing certificates and CRLs, allowing specific ordering to be specified for the objects contained.
  • -
  • CMS enveloped now works around providers which throw UnsupportedOperationException if key wrap is attempted.
  • -
  • DSASigner now handles long messages. SHA2 family digest support for DSA has been added to the provider.
  • -
- -

2.14.1 Version

-Release 1.35 -

2.14.2 Defects Fixed

-
    -
  • Test data files are no longer in the provider jars.
  • -
  • SMIMESignedParser now handles indefinite length data in SignerInfos.
  • -
  • Under some circumstances the SMIME library was failing to canonicalize mixed-multipart data correctly. This has been fixed.
  • -
  • The l parameter was being ignored for the DH and ElGamal key generation. This has been fixed.
  • -
  • The ASN1Sequence constructor for OtherRecipientInfo was broken. It has been fixed
  • -
  • Regression - DN fields SerialNumber and Country were changed to encode as UTF8String in 1.34 in the X509DefaultEntryConverter, these now encode as PrintableString.
  • -
  • CMSSignedData.replaceSigners() was not replacing the digest set as well as the signers. This has been fixed.
  • -
  • DERGeneralizedTime produced a time string without a GMT offset if they represented local time. This has been fixed.
  • -
  • Some temp files were still being left on Windows by the SMIME library. All of the known problems have been fixed.
  • -
  • Comparing ASN.1 object for equality would fail in some circumstances. This has been fixed. -
  • The IESEngine could incorrectly encrypt data when used in block cipher mode. This has been fixed. -
  • An error in the encoding of the KEKRecipientInfo has been fixed. Compatability warning: this may mean that versions of BC mail prior to 1.35 will have trouble processing KEK messages produced by 1.35 or later. -
-

2.14.3 Additional Features and Functionality

-
    -
  • Further optimisations to elliptic curve math libraries.
  • -
  • API now incorporates a CertStore which should be suitable for use with LDAP.
  • -
  • The streaming ASN.1 API is now integrated into the base one, the sasn1 package has been deprecated.
  • -
  • The OpenPGP implementation now supports SHA-224 and BZIP2.
  • -
  • The OpenPGP implementation now supports SHA-1 checksumming on secret keys.
  • -
  • The JCE provider now does RSA blinding by default.
  • -
  • CMSSignedDataParser now provides methods for replacing signers and replacing certificates and CRLs.
  • -
  • A generic store API has been added to support CRLs, Certificates and Attribute certificates.
  • -
  • The CMS/SMIME API now supports inclusion and retrieval of version 2 attribute certificates.
  • -
  • Support for generating CertificationRequests and Certificates has been added for GOST-3410-2001 (ECGOST)
  • -
  • CMS/SMIME now support ECGOST
  • -
  • Basic BER Octet Strings now encode in a canonical fashion by default.
  • -
  • DERUTCTime can now return Date objects
  • -
  • Validating constructors have been added to DERPrintableString, DERIA5String, and DERNumericString.
  • -
  • A lightweight API for supporting TLS has been added.
  • -
  • Implementations of the TEA and XTEA ciphers have been added to the light weight API and the provider.
  • -
  • PEMReader now supports OpenSSL ECDSA key pairs.
  • -
  • PGP packet streams can now be closed off using close() on the returned stream as well as closing the generator.
  • -
-

2.15.1 Version

-Release 1.34 -

2.15.2 Defects Fixed

-
    -
  • Endianess of integer conversion in KDF2BytesGenerator was incorrect. This has been fixed. -
  • Generating critical signature subpackets in OpenPGP would result in a zero packet tag. This has been fixed. -
  • Some flags in PKIFailure info were incorrect, and the range of values was incomplete. The range of values has been increased and the flags corrected. -
  • The helper class for AuthorityKeyExtension generation was including the subject rather than the issuer DN of the CA certificate. This has been fixed. -
  • SMIMESignedParser now avoids JavaMail quoted-printable recoding issue. -
  • Verification of RSA signatures done with keys with public exponents of 3 was vunerable to -Bleichenbacher's RSA signature forgery attack. This has been fixed. -
  • PGP Identity strings were only being interpreted as ASCII rather than UTF8. This has been fixed. -
  • CertificateFactory.generateCRLs now returns a Collection rather than null. -
-

2.15.3 Additional Features and Functionality

-
    -
  • An ISO18033KDFParameters class had been added to support ISO18033 KDF generators. -
  • An implemention of the KDF1 bytes generator algorithm has been added. -
  • An implementation of NaccacheStern encryption has been added to the lightweight API. -
  • X509V2CRLGenerator can now be loaded from an existing CRL. -
  • The CMS enveloped data generators will now attempt to use the default provider for encryption if the passed in provider can only handle key exchange. -
  • OpenPGP file processing has been substantially speeded up. -
  • The PKCS1Encoder would accept PKCS1 packets which were one byte oversize. By default this will now cause an error. However, as there are still implementations which still produce such packets the older behaviour can be turned on by setting the VM system property org.bouncycastle.pkcs1.strict to false before creating an RSA cipher using PKCS1 encoding. -
  • A target has been added to the bc-build.xml to zip up the source code rather than leaving it in a directory tree. -The build scripts now run this target by default. -
  • Use of toUpperCase and toLowerCase has been replaced with a locale independent converter where appropriate. -
  • Support for retrieving the issuers of indirect CRLs has been added. -
  • Classes for doing incremental path validation of PKIX cert paths have been added to the X.509 package and S/MIME. -
  • Locale issues with String.toUpperCase() have now been worked around. -
  • Optional limiting has been added to ASN1InputStream to avoid possible OutOfMemoryErrors on corrupted streams. -
  • Support has been added for SHA224withECDSA, SHA256withECDSA, SHA384withECDSA, and SHA512withECDSA for the generation of signatures, certificates, CRLs, and certification requests. -
  • Performance of the prime number generation in the BigInteger library has been further improved. -
  • In line with RFC 3280 section 4.1.2.4 DN's are now encoded using UTF8String by default rather than PrintableString. -
-

2.15.5 Security Advisory

-
    -
  • If you are using public exponents with the value three you *must* upgrade to this release, otherwise it -will be possible for attackers to exploit some of Bleichenbacher's RSA signature forgery attacks on your applications.
  • -
-

2.16.1 Version

-Release 1.33 -

2.16.2 Defects Fixed

-
    -
  • OCSPResponseData was including the default version in its encoding. This has been fixed. -
  • BasicOCSPResp.getVersion() would throw a NullPointer exception if called on a default version response. This has been fixed. -
  • Addition of an EC point under Fp could result in an ArithmeticException. This has been fixed. -
  • The n value for prime192v2 was incorrect. This has been fixed. -
  • ArmoredInputStream was not closing the underlying stream on close. This has been fixed. -
  • Small base64 encoded strings with embedded white space could decode incorrectly using the Base64 class. This has been fixed. -
-

2.16.3 Additional Features and Functionality

-
    -
  • The X509V2CRLGenerator now supports adding general extensions to CRL entries. -
  • A RoleSyntax implementation has been added to the x509 ASN.1 package, and the AttributeCertificateHolder class now support the IssuerSerial option. -
  • The CMS API now correctly recognises the OIW OID for DSA with SHA-1. -
  • DERUTF8String now supports surrogate pairs. -
- -

2.17.1 Version

-Release 1.32 -

2.17.2 Defects Fixed

-
    -
  • Further work has been done on RFC 3280 compliance. -
  • The ASN1Sequence constructor for SemanticsInformation would sometimes throw a ClassCastException on reconstruction an object from a byte stream. This has been fixed. -
  • The SharedInputStream.read(buf, 0, len) method would return 0 at EOF, rather than -1. This has been fixed. -
  • X9FieldElement could fail to encode a Fp field element correctly. This has been fixed. -
  • The streaming S/MIME API was occasionally leaving temporary files around. The SIMEUtil class responsible for creating the files now returns a FileBackedMimeBodyPart object -which has a dispose method on it which should allow removal of the file backing the body part. -
  • An encoding defect in EnvelopedData generation in the CMS streaming, S/MIME API has been fixed. -
  • DER constructed octet strings could cause exceptions in the streaming ASN.1 library. This has been fixed. -
  • Several compatibility issues connected with EnvelopedData decoding between the streaming CMS library and other libraries have been fixed. -
  • JDK 1.4 and earlier would sometimes encode named curve parameters explicitly. This has been fixed. -
  • An incorrect header for SHA-256 OpenPGP clear text signatures has been fixed. -
  • An occasional bug that could result in invalid clear text signatures has been fixed. -
  • OpenPGP clear text signatures containing '\r' as line separators were not being correctly canonicalized. This has been fixed. -
- -

2.17.3 Additional Features and Functionality

-
    -
  • The ASN.1 library now includes classes for the ICAO Electronic Passport. -
  • Support has been added to CMS and S/MIME for ECDSA. -
  • Support has been added for the SEC/NIST elliptic curves. -
  • Support has been added for elliptic curves over F2m. -
  • Support has been added for repeated attributes in CMS and S/MIME messages. -
  • A wider range of RSA-PSS signature types is now supported for CRL and Certificate verification. -
-

2.17.4 Possible compatibility issue

-
    -
  • Previously elliptic curve keys and points were generated with point compression enabled by default. -Owing to patent issues in some jurisdictions, they are now generated with point compression disabled by default. -
- -

2.18.1 Version

-Release 1.31 -

2.18.2 Defects Fixed

-
    -
  • getCriticalExtensionOIDs on an X.509 attribute certificate was returning the non-critical set. This has been fixed. -
  • Encoding uncompressed ECDSA keys could occasionally introduce an extra leading zero byte. This has been fixed. -
  • Expiry times for OpenPGP master keys are now recognised across the range of possible certifications. -
  • PGP 2 keys can now be decrypted by the the OpenPGP library. -
  • PGP 2 signature packets threw an exception on trailer processing. This has been been fixed. -
  • Attempting to retrieve signature subpackets from an OpenPGP version 3 signature would throw a null pointer exception. This has been fixed. -
  • Another occasional defect in EC point encoding has been fixed. -
  • In some cases AttributeCertificateHolder.getIssuer() would return an empty array for attribute certificates using the BaseCertificateID. -This has been fixed. -
  • OIDs with extremely large components would sometimes reencode with unnecessary bytes in their encoding. The optimal DER encoding will now be produced instead. -
-

2.18.3 Additional Features and Functionality

-
    -
  • The SMIME package now supports the large file streaming model as well. -
  • Additional ASN.1 message support has been added for RFC 3739 in the org.bouncycastle.x509.qualified package. -
  • Support has been added for Mac algorithm 3 from ISO 9797 to both the lightweight APIs and the provider. -
  • The provider now supports the DESEDE64 MAC algorithm. -
  • CertPathValidator has been updated to better support path validation as defined in RFC 3280. -
- -

2.19.1 Version

-Release 1.30 -

2.19.2 Defects Fixed

-
    -
  • Whirlpool was calculating the wrong digest for 31 byte data and could throw an exception for some other data lengths. This has been fixed. -
  • AlgorithmParameters for IVs were returning a default of RAW encoding of the parameters when they should have been returning an -ASN.1 encoding. This has been fixed. -
  • Base64 encoded streams without armoring could cause an exception in PGPUtil.getDecoderStream(). This has been fixed. -
  • PGPSecretKey.copyWithNewPassword() would incorrectly tag sub keys. This has been fixed. -
  • PGPSecretKey.copyWithNewPassword() would not handle the NULL algorithm. This has been fixed. -
  • Directly accessing the dates on an X.509 Attribute Certificate constructed from an InputStream would return null, not the date objects. This has been fixed. -
  • KEKIdentifier would not handle OtherKeyAttribute objects correctly. This has been fixed. -
  • GetCertificateChain on a PKCS12 keystore would return a single certificate chain rather than null if the alias passed in represented a certificate not a key. This has been fixed. -
-

2.19.3 Additional Features and Functionality

-
    -
  • RSAEngine no longer assumes keys are byte aligned when checking for out of range input. -
  • PGPSecretKeyRing.removeSecretKey and PGPSecretKeyRing.insertSecretKey have been added. -
  • There is now a getter for the serial number on TimeStampTokenInfo. -
  • Classes for dealing with CMS objects in a streaming fashion have been added to the CMS package. -
  • PGPCompressedDataGenerator now supports partial packets on output. -
  • OpenPGP Signature generation and verification now supports SHA-256, SHA-384, and SHA-512. -
  • Both the lightweight API and the provider now support the Camellia encryption algorithm. -
- -

2.20.1 Version

-Release 1.29 -

2.20.2 Defects Fixed

-
    -
  • HMac-SHA384 and HMac-SHA512 were not IETF compliant. This has been fixed. -
  • The equals() method on ElGamalKeyParameters and DHKeyParameters in the lightweight API would sometimes -return false when it should return true. This has been fixed. -
  • Parse error for OpenSSL style PEM encoded certificate requests in the PEMReader has been fixed. -
  • PGPPublicKey.getValidDays() now checks for the relevant signature for version 4 and later keys as well as using the -version 3 key valid days field. -
  • ISO9796 signatures for full recovered messsages could incorrectly verify for similar messages in some circumstances. This has been fixed. -
  • The occasional problem with decrypting PGP messages containing compressed streams now appears to be fixed. -
-

2.20.3 Additional Features and Functionality

-
    -
  • Support has been added for the OIDs and key generation required for HMac-SHA224, HMac-SHA256, HMac-SHA384, and -HMac-SHA512. -
  • SignerInformation will used default implementation of message digest if signature provider doesn't support it. -
  • The provider and the lightweight API now support the GOST-28147-94 MAC algorithm. -
  • Headers are now settable for PGP armored output streams. -
-

2.20.4 Notes

-
    -
  • The old versions of HMac-SHA384 and HMac-SHA512 can be invoked as OldHMacSHA384 and OldHMacSHA512, or by using the OldHMac class in the -lightweight API. -
-

2.21.1 Version

-Release 1.28 -

2.21.2 Defects Fixed

-
    -
  • Signatures on binary encoded S/MIME messages could fail to validate when correct. This has been fixed. -
  • getExtensionValue() on CRL Entries were returning the encoding of the inner object, rather than the octet string. This has been fixed. -
  • CertPath implementation now returns an immutable list for a certificate path. -
  • Generic sorting now takes place in the CertificateFactory.generateCertPath() rather than CertPathValidator. -
  • DERGeneralizedTime can now handle time strings with milli-seconds. -
  • Stateful CertPathCheckers were not being initialised in all cases, by the CertPathValidator. This has been fixed. -
  • PGPUtil file processing methods were failing to close files after processing. This has been fixed. -
  • A disordered set in a CMS signature could cause a CMS signature to fail to validate when it should. This has been fixed. -
  • PKCS12 files where both the local key id and friendly name were set on a certificate would not parse correctly. This has been fixed. -
  • Filetype for S/MIME compressed messages was incorrect. This has been fixed. -
  • BigInteger class can now create negative numbers from byte arrays. -
-

2.21.3 Additional Features and Functionality

-
    -
  • S/MIME now does canonicalization on non-binary input for signatures. -
  • Micalgs for the new SHA schemes are now supported. -
  • Provided and lightweight API now support ISO 7816-4 padding. -
  • The S/MIME API now directly supports the creation of certificate management messages. -
  • The provider and the light weight API now support the cipher GOST-28147, the signature algorithms GOST-3410 (GOST-3410 94) and EC GOST-3410 (GOST-3410 2001), the message digest GOST-3411 and the GOST OFB mode (use GOFB). -
  • CMSSignedDataGenerator will used default implementation of message digest if signature provider doesn't support it. -
  • Support has been added for the creation of ECDSA certificate requests. -
  • The provider and the light weight API now support the WHIRLPOOL message digest. -
-

2.21.4 Notes

-
    -
  • Patches for S/MIME binary signatures and canonicalization were actually applied in 1.27, but a couple of days after the release - if the class -CMSProcessableBodyPartOutbound is present in the package org.bouncycastle.mail.smime you have the patched 1.27. We would recommend upgrading to 1.28 in any case -as some S/MIME 3.1 recommendations have also been introduced for header creation. -
  • GOST private keys are probably not encoding correctly and can be expected to change. -
-

2.22.1 Version

-Release 1.27 -

2.22.2 Defects Fixed

-
    -
  • Typos in the provider which pointed Signature algorithms SHA256WithRSA, SHA256WithRSAEncryption, SHA384WithRSA, SHA384WithRSAEncryption, SHA512WithRSA, and SHA512WithRSAEncryption at the PSS versions of the algorithms have been fixed. The correct names for the PSS algorithms are SHA256withRSAandMGF1, SHA384withRSAandMGF1, and SHA512withRSAandMGF1. -
  • X509CertificateFactory failed under some circumstances to reset properly if the input stream being passed -to generateCertificate(s)() changed, This has been fixed. -
  • OpenPGP BitStrength for DSA keys was being calculated from the key's generator rather than prime. This has been fixed. -
  • Possible infinite loop in ASN.1 SET sorting has been removed. -
  • SHA512withRSAandMGF1 with a zero length salt would cause an exception if used with a 1024 bit RSA key. This has been fixed. -
  • Adding an Exporter to a PGPSubpacketVector added a Revocable instead. This has been fixed. -
  • AttributeCertificateIssuer.getPrincipal() could throw an ArrayStoreException. This has been fixed. -
  • CertPathValidator now guarantees to call any CertPathCheckers passed in for each certificate. -
  • TSP TimeStampToken was failing to validate time stamp tokens with the issuerSerial field set in the ESSCertID structure. This has been fixed. -
  • Path validation in environments with frequently updated CRLs could occasionally reject a valid path. This has been fixed. -
-

2.22.3 Additional Features and Functionality

-
    -
  • Full support has been added for the OAEPParameterSpec class to the JDK 1.5 povider. -
  • Full support has been added for the PSSParameterSpec class to the JDK 1.4 and JDK 1.5 providers. -
  • Support for PKCS1 signatures for SHA-256, SHA-384, and SHA-512 has been added to CMS. -
  • PGPKeyRingCollection classes now support partial matching of user ID strings. -
  • This release disables the quick check on the IV for a PGP public key encrypted message in order to help -prevent applications being vunerable to oracle attacks. -
  • The CertPath support classes now support PKCS #7 encoding. -
  • Point compression can now be turned off when encoding elliptic curve keys. -
-

2.22.4 Changes that may affect compatibility

-
    -
  • org.bouncycastle.jce.interfaces.ElGamalKey.getParams() has been changed to getParameters() to avoid clashes with -a JCE interface with the same method signature. -
  • org.bouncycastle.jce.interfaces.ECKey.getParams() has been changed in JDK 1.5 to getParameters() to avoid clashes -with a JCE interface with the same method signature. The getParams() method in pre-1.5 has been deprecated. -
  • SHA256WithRSAEncryption, SHA384WithRSAEncryption, SHA512WithRSAEncryption now refer to their PKCS #1 V1.5 implementations. If you -were using these previously you should use SHA256WithRSAAndMGF1, SHA384WithRSAAndMGF1, or SHA512WithRSAAndMGF1. -
-

2.23.1 Version

-Release 1.26 -

2.23.2 Defects Fixed

-
    -
  • The X.509 class UserNotice assumed some of the optional fields were not optional. This has been fixed. -
  • BCPGInputStream would break on input packets of 8274 bytes in length. This has been fixed. -
  • Public key fingerprints for PGP version 3 keys are now correctly calculated. -
  • ISO9796-2 PSS would sometimes throw an exception on a correct signature. This has been fixed. -
  • ASN1Sets now properly sort their contents when created from scratch. -
  • A bug introduced in the CertPath validation in the last release which meant some certificate paths would validate if they were invalid has been fixed. -
-

2.23.3 Additional Features and Functionality

-
    -
  • Support for JDK 1.5 naming conventions for OAEP encryption and PSS signing has been added. -
  • Support for Time Stamp Protocol (RFC 3161) has been added. -
  • Support for Mozilla's PublicKeyAndChallenge key certification message has been added. -
  • OpenPGP now supports key rings containing GNU_DUMMY_S2K. -
  • Support for the new versions (JDK 1.4 and later) of PBEKeySpec has been added to the providers. -
  • PBEWithMD5AndRC2, PBEWithSHA1AndRC2 now generate keys rather than exceptions. -
  • The BigInteger implementation has been further optimised to take more advantage of the Montgomery number capabilities. -
-

2.23.4 JDK 1.5 Changes

-
    -
  • The JDK 1.5 version of the provider now supports the new Elliptic Curve classes found in the java.security packages. Note: while we have tried to preserve some backwards compatibility people using Elliptic curve are likely to find some minor code changes are required when moving code from JDK 1.4 to JDK 1.5 as the java.security APIs have changed. -
- -

2.24.1 Version

-Release 1.25 -

2.24.2 Defects Fixed

-
    -
  • In some situations OpenPGP would overread when a stream had been -broken up into partial blocks. This has been fixed. -
  • Explicitly setting a key size for RC4 in the CMS library would cause -an exception. This has been fixed. -
  • getSignatures() on PGPPublicKey would throw a ClassCastException in some cases. This has been fixed. -
  • Encapsulated signed data was been generated with the wrong mime headers, this has been fixed. -
  • The isSignature method on PGPSecretKey now correctly identifies signing keys. -
  • An interoperability issue with DH key exchange between the Sun JCE provider and the BC provider, concerning sign bit expansion, has been fixed. -
  • The X509CertificateFactory would fail to reset correctly after reading an ASN.1 certificate chain. This has been fixed. -
  • CertPathValidator now handles unsorted lists of certs. -
  • The PGPSignatureGenerator would sometimes throw an exception when adding hashed subpackets. This has been fixed. -
  • Ordered equality in X509Name was not terminating as early as possible. This has been fixed. -
  • getBitStrength for PGPPublicKeys was returning the wrong value for ElGamal keys. This has been fixed. -
  • getKeyExpirationTime/getSignatureExpirationTime was returning a Date rather than a delta. This isn't meaningful as a Date and has been changed to a long. -
  • the crlIssuer field in DistributionPoint name was encoding/decoding incorrectly. This has been fixed. -
  • X509Name now recognises international characters in the input string and -stores them as BMP strings. -
  • Parsing a message with a zero length body with SMIMESigned would cause an exception. This has been fixed. -
  • Some versions of PGP use zeros in the data stream rather than a replication of the last two bytes of the iv as specified in the RFC to determine if the correct decryption key has been found. The decryption classes will now cope with both. -
-

2.24.3 Additional Features and Functionality

-
    -
  • Support for extracting signatures based on PGP user attributes has been -added to PGPPublicKey. -
  • BCPGArmoredInputStream should cope with plain text files better. -
  • The OpenPGP library can now create indefinite length streams and handle packets greater than (2^32 - 1) in length. -
  • Direct support for adding SignerUserID and PrimaryUserID has been added to the PGPSignatureSubpacketGenerator. -
  • Support for ISO-9796-2/PSS has been added to the lightweight API. -
  • API support for extracting recovered messages from signatures that support -message recovery has been added to the lightweight API. -
  • String value conversion in a DN being processed by X509Name is now fully -configurable. -
  • It is now possible to create new versions of CMSSignedData objects without -having to convert the original object down to its base ASN.1 equivalents. -
  • Support for adding PGP revocations and other key signatures has been added. -
  • Support for SHA-224 and SHA224withRSA has been added. -
  • Trailing bit complement (TBC) padding has been added. -
  • OID components of up to 2^63 bits are now supported. -
-

2.25.1 Version

-Release 1.24 -

2.25.2 Defects Fixed

-
    -
  • OpenPGP Secret key rings now parse key rings with user attribute packets in them correctly. -
  • OpenPGP Secret key rings now parse key rings with GPG comment packets in them. -
  • X509Name and X509Principal now correctly handle BitStrings. -
  • OpenPGP now correctly recognises RSA signature only keys. -
  • When re-encoding PGP public keys taken off secret keys getEncoded would -sometimes throw a NullPointerException. This has been fixed. -
  • A basic PKCS12 file with a single key and certificate, but no attributes, would cause a null pointer exception. This has been fixed. -
  • Signature verification now handles signatures where the parameters block is missing rather than NULL. -
  • Lightweight CBCBlockCipherMac was failing to add padding if padding was -being explicitly provided and data length was a multiple of the block size. This has been fixed. -
  • ZIP compression in PGP was failing to compress data in many cases. This has been fixed. -
  • Signatures were occasionally produced with incorrect padding in their associated bit strings, this has been fixed. -
  • An encoding error introduced in 1.23 which affected generation of the -KeyUsage extension has been fixed. -
-

2.25.3 Additional Features and Functionality

-
    -
  • PKCS12 keystore now handles single key/certificate files without any attributes present. -
  • Support for creation of PGPKeyRings incorporating sub keys has been added. -
  • ZeroPadding for encrypting ASCII data has been added. -
-

2.26.1 Version

-Release 1.23 -

2.26.2 Defects Fixed

-
    -
  • Reading a PGP Secret key file would sometimes cause a class cast exception. This has been fixed. -
  • PGP will now read SecretKeys which are encrypted with the null algorithm. -
  • PGP ObjectFactory will recognise Marker packets. -
  • BasicConstraints class now handles default empty sequences correctly. -
  • S2K Secret Key generation now supported in OpenPGP for keys greater than 160 bits, a bug causing -it to occasionally generate the wrong key has been fixed. -
  • OpenPGP implementation can now read PGP 8 keys. -
  • Decoding issues with Secret Sub Keys should now be fixed. -
  • PGP would occasionally unpack ElGamal encrypted data incorrectly, this has been fixed. -
  • OCSP TBSRequest now uses abbreviated encoding if the default version is used. -
  • X509Name class will now print names with nested pairs in component sets correctly. -
  • RC4 now resets correctly on doFinal. -
-

2.26.3 Additional Features and Functionality

-
    -
  • PGP V3 keys and V3 signature generation is now supported. -
  • Collection classes have been added for representing files of PGP public and secret keys. -
  • PEMReader now supports "RSA PUBLIC KEY". -
  • RipeMD256 and RipeMD320 have been added. -
  • Heuristic decoder stream has been added to OpenPGP which "guesses" how the input is -constructed. -
  • ArmoredInputStream now recognises clear text signed files. -
  • ArmoredOutputStream now provides support for generating clear text signed files. -
  • Support has been added to CMS for RipeMD128, RipeMD160, and RipeMD256. -
  • Support for generating certification directly and editing PGP public key -certifications has been added. -
  • Support has been added for modification detection codes to the PGP library. -
  • Examples have been rewritten to take advantage of the above. -
  • SMIMESigned can now covert data straight into a mime message. -
  • DERGeneralizedTime getTime() method now handles a broader range of input strings. -
- -

2.27.1 Version

-Release 1.22 -

2.27.2 Defects Fixed

-
    -
  • Generating DSA signatures with PGP would cause a class cast exception, this has been fixed. -
  • PGP Data in the 192 to 8383 byte length would sometimes be written with the wrong length header. This has been fixed. -
  • The certificate factory would only parse the first certificate in a PKCS7 object. This has been fixed. -
  • getRevocationReason() in RevokedStatus in OCSP would throw an exception for -a non-null reason, rather than a null one. This has been fixed. -
  • PSS signature verification would fail approximately 0.5 % of the time on correct signatures. This has been fixed. -
  • Encoding of CRL Distribution Points now always works. -
-

2.27.3 Additional Features and Functionality

-
    -
  • Additional methods for getting public key information have been added to the PGP package. -
  • Some support for user attributes and the image attribute tag has been added. -
  • Support for the AuthorityInformationAccess extension has been added. -
  • Support for ElGamal encryption/decryption has been added to the PGP package. -
- -

2.28.1 Version

-Release 1.21 -

2.28.2 Defects Fixed

-
    -
  • The CertPath validator would fail for some valid CRLs. This has been fixed. -
  • AES OIDS for S/MIME were still incorrect, this has been fixed. -
  • The CertPathBuilder would sometimes throw a NullPointerException looking for an issuer. This has been fixed. -
  • The J2ME BigInteger class would sometimes go into an infinite loop generating prime numbers. This has been fixed. -
  • DERBMPString.equals() would throw a class cast exception. This has been fixed. -
-

2.28.3 Additional Features and Functionality

-
    -
  • PEMReader now handles public keys. -
  • OpenPGP/BCPG should now handle partial input streams. Additional methods for reading subpackets off signatures. -
  • The ASN.1 library now supports policy qualifiers and policy info objects. -
- -

2.29.1 Version

-Release 1.20 -

2.29.2 Defects Fixed

-
    -
  • BigInteger toString() in J2ME/JDK1.0 now produces same output as the Sun one. -
  • RSA would throw a NullPointer exception with doFinal without arguments. This has been fixed. -
  • OCSP CertificateID would calculate wrong issuer hash if issuer cert was not self signed. This has been fixed. -
  • Most of response generation in OCSP was broken. This has been fixed. -
  • The CertPath builder would sometimes go into an infinite loop on some chains if the trust anchor was missing. This has been fixed. -
  • AES OIDS were incorrect, this has been fixed. -
  • In some cases BC generated private keys would not work with the JSSE. This has been fixed. -
-

2.29.3 Additional Features and Functionality

-
    -
  • Support for reading/writing OpenPGP public/private keys and OpenPGP signatures has been added. -
  • Support for generating OpenPGP PBE messages and public key encrypted messages has been added. -
  • Support for decrypting OpenPGP messages has been added. -
  • Addition of a Null block cipher to the light weight API. -
- -

2.30.1 Version

-Release 1.19 -

2.30.2 Defects Fixed

-
    -
  • The PKCS12 store would throw an exception reading PFX files that had attributes with no values. This has been fixed. -
  • RSA Private Keys would not serialise if they had PKCS12 bag attributes attached to them, this has been fixed. -
  • GeneralName was encoding OtherName as explicitly tagged, rather than implicitly tagged. This has been fixed. -
  • ASN1 parser would sometimes mistake an implicit null for an implicit empty -sequence. This has been fixed. -
-

2.30.3 Additional Features and Functionality

-
    -
  • S/MIME and CMS now support the draft standard for AES encryption. -
  • S/MIME and CMS now support setable key sizes for the standard algorithms. -
  • S/MIME and CMS now handle ARC4/RC4 encrypted messages. -
  • The CertPath validator now passes the NIST test suite. -
  • A basic OCSP implementation has been added which includes request generation -and the processing of responses. Response generation is also provided, but should be treated as alpha quality code. -
  • CMS now attempts to use JCA naming conventions in addition to the OID name -in order to find algorithms. -
- -

2.31.1 Version

-Release 1.18 -

2.31.2 Defects Fixed

-
    -
  • DESKeySpec.isParityAdjusted in the clean room JCE could go into an -infinite loop. This has been fixed. -
  • The SMIME API would end up throwing a class cast exception if a -MimeBodyPart was passed in containing a MimeMultipart. This is now fixed. -
  • ASN1InputStream could go into an infinite loop reading a truncated -input stream. This has been fixed. -
  • Seeding with longs in the SecureRandom for the J2ME and JDK 1.0, -only used 4 bytes of the seed value. This has been fixed. -
-

2.31.3 Additional Features and Functionality

-
    -
  • The X.509 OID for RSA is now recognised by the provider as is the OID for RSA/OAEP. -
  • Default iv's for DES are now handled correctly in CMS. -
  • The ASN.1 classes have been updated to use the generic ASN1* classes where -possible. -
  • A constructor has been added to SMIMESigned to simplify the processing -of "application/pkcs7-mime; smime-type=signed-data;" signatures. -
  • Diffie-Hellman key generation is now faster in environments using the -Sun BigInteger library. -
-

2.32.1 Version

-Release 1.17 -

2.32.2 Defects Fixed

-
    -
  • Reuse of an CMSSignedObject could occasionally result in a class -cast exception. This has been fixed. -
  • The X.509 DistributionPointName occasionally encoded incorrectly. This has -been fixed. -
  • BasicConstraints construction would break if an ASN.1 sequence was used -with only the required parameter. This has been fixed. -
  • The DERObject constructor in OriginatorIdentifierOrKey was leaving -the id field as null. This has been fixed. -
-

2.32.2 Additional Functionality and Features

-
    -
  • RC2 now supports the full range of parameter versions and effective -key sizes. -
  • CompressedData handling has been added to CMS/SMIME. -
  • The 1.4 version now allows X500Principles to be generated directly -from CRLs. -
  • SMIME objects now support binary encoding. The number of signature -types recognised has been increased. -
  • CMS can create signed objects with encapsulated data. Note: while -this was been done we realised we could simplify things, we did and -for the most part people won't notice, other than the occasional -reference to CMSSignable will need to be replaced with CMSProcessable. -
  • X509Name and X509Principal now support forward and reverse X509Name -to string conversion, with changeable lookup tables for converting OIDs -into strings. Both classes also now allow the direction of encoding to -be set when a string is converted as well as changeable lookup tables for -string to OID conversion. -
- -

2.33.1 Version

-Release 1.16 -

2.33.2 Defects Fixed

-
    -
  • CRLS were only working for UTC time constructed Time objects, this has -been fixed. -
  • KeyUsage and ReasonFlags sometimes encoded longer than necessary. This -has been fixed. -
  • BER encoded sets are now recognised and dealt with. -
  • Encoding issues in CMS which were causing problems with backwards -compatibility with older CMS/SMIME clients have been fixed. -
  • KeyFactory now allows for creation of RSAKey*Spec classes. -
  • The X509CertSelector in the clean room CertPath API is now less likely -to throw a NullPointerException at the wrong time. -
  • Macs now clone correctly in the clean room JCE. -
-

2.33.3 Additional Functionality and Features

-
    -
  • PGPCFB support has been added to the provider and the lightweight API. -
  • There are now three versions of the AESEngine, all faster than before, -with the largest footprint one being the fastest. The JCE AES now refers -to the fastest. -
  • The 1.4 version of the library now allows for X500Principals to be -generated directly from certificates. -
  • X509Name has been extended to parse numeric oids, "oid." oids, and to -recognise the LDAP UID. -
  • Immutable sequences and sets have been introduced to the ASN.1 package. -
  • The SMIME/CMS ASN.1 base classes have been rewritten to reduce the -size of the package for use with the lightweight API. -
  • The SMIME/CMS api's have been rewritten to allow them to take advantage -of the Cert Path API, remove code suited to inclusion in the provider, -and to support multiple recipients/signers. -
-

2.34.1 Version

-Release 1.15 -

2.34.2 Defects Fixed

-
    -
  • The base string for the oids in asn1.x509.KeyPurposeId was incorrect. This -has been fixed. -
  • MimeBodyParts in the SMIME Generator did not have their Content-Type -properly set up after decryption. This has been fixed. -
  • If a X.509 certificate did not have all the keyUsage extension bits set, -the provider wasn't padding the return value of the key usage extension to -8 booleans in length. This has been fixed. -
  • In some cases the simple BC keystore allowed overwriting of an alias with -one of the same name. This has been fixed. -
  • The key schedule for RC5-64 was not always being calculated correctly. This -has been fixed. -
  • On reset buffered blockcipher was only partially erasing the previous buffer. This has been fixed. -
  • All lightweight mac classes now do a reset on doFinal. -
  • ASN.1 object identifiers wouldn't encode the first byte correctly if the -OID started with 2 and the second number was greater than 47. This has been -fixed. -
  • If a key had PKCS9 attributes associated with it on storage they took -precedence over the local alias used to add the key to the PKCS12 key store. -The local name now takes precedence. -
  • ReasonFlags now correctly encodes. -
-

2.34.3 Additional Functionality and Features

-
    -
  • The PKCS12 key store now handles key bags in encryptedData bags. -
  • The X509NameTokenizer now handles for '\' and '"' characters. -
  • SMIME v2 compliance has been added. Use setVersion(2) in the generator classes. -
  • The ASN.1 library now supports ENUMERATED, UniversalString and the X.509 library support for CRLs now includes CRLReason, and some elements of CertificatePolicies. -
  • Both the provider and the lightweight library now support a basic SIC mode for block ciphers. -
-

2.35.1 Version

-Release 1.14 -

2.35.2 Defects Fixed

-
    -
  • there was a bug in the BigInteger right shifting for > 31 bit shifts. -This has been fixed. -
  • x509 name had it's equality test based on the order of the directory -elements, this has been fixed. -
  • the mode used with the RSA cipher in KeyTransRecipientInfoParser in -the smime implementation was not compatible with the Sun JCE. -This has been fixed. -
  • PKCS7 SignedData now supports single length signing chains. -
  • When a root certificate had a different issuer id from the subject id, or -had it's own AuthorityKeyExtension the PKCS12 key store would drop the root -certificate from the certificate chain. This has been fixed. -
  • The PKCS10 CertificationRequestInfo class always expected at least one -attribute. This has been fixed. -
  • UTF8 strings are now correctly recognised. -
  • The Tiger implementation was producing results in reverse byte -order for each of the 3 words making up the digest. This has been fixed. -
  • asn1.x509.ExtendedKeyUsage used to through a null pointer exception -on construction. This has been fixed. -
-

2.35.3 Additional Functionality and Features

-
    -
  • The BigInteger library now uses Montgomery numbers for modPow and is -substantially faster. -
  • SMIMECapabilities, and SMIMEEncryptionKeyPreference attributes added to S/MIME. -
  • Increased range of key sizes available in S/MIME. -
  • getInstance(ASN1TaggedObject, boolean) methods have been added to most ASN1 types. -These deal with implicit/explicit tagging ambiguities with constructed types. -
  • Added EncryptedPrivateKeyInfo object to the clean room JCE. -
  • A PEMReader has been added for handling some of the openSSL PEM files. -
  • The X.509 certificate factory supports a wider range of encodings and -object identifiers. -
-

2.36.1 Version

-Release 1.13 -

2.36.2 Defects Fixed

-
    -
  • The TBSCertificate object in the ASN.1 library now properly implements - the Time object, rather returning UTC time. -
  • The DESedeKeyGenerator now supports 112 and 168 bit key generation. -
  • Certificates with the keyId set to null in the AuthorityKeyIdentifier extensions would sometimes cause the PKCS12 store to throw a NullPointer exception. This has been fixed. -
  • toByteArray in the big integer class was not always producing correct - results for negative numbers. This has been Fixed. -
- -

2.36.3 Additional Functionality and Features

-
    -
  • The key to keySpec handling of the secret key factories has been improved. -
  • There is now a SMIME implementation and a more complete CMS - implementation (see CONTRIBUTORS file for additonal details). -
  • A CertPath implementation that runs under jdk1.1 and jdk1.4 has also - being contributed. A work around to allow it to be used with jdk1.2 and - jdk1.3 has also been added. Note: the implementation is not quite complete - because policymapping, name and subtree constraints are not yet - implemented. -
  • The API now supports the generation of PKCS7 signed objects. Note: this - is still beta code - one known issue is that it doesn't support single - length certificate chains for signing keys. -
- -

2.37.1 Version

-Release 1.12 -

2.37.2 Defects Fixed

-
    -
  • The ASN.1 library was unable to read an empty set object. This has been fixed. -
  • Returning sets of critical and non-critical extensions on X.509 certificates could result in a null pointer exception if the certificate had no extensions. This has been fixed. -
  • The BC JKS implementation does not follow the conventional one - it has been renamed BKS, an attempt to create a JKS keystore using the BC provider will now result in an exception. -
  • The PKCS 10 generator verify(provider) method was ignoring the provider when generating the public key. This has been fixed. -
  • The PKCS12 store would throw an OutOfMemoryException if passed a non-PKCS12 file. This has been fixed. -
  • In the case where there was no AuthorityKeyIdentifier the PKCS12 store - would fail to find certificates further up the signing chain. The store now - uses the IssuerDN if no AuthorityKeyIdentifier is specified and the IssuerDN - is different from the SubjectDN, -
  • PKCS10/CertificationRequestInfo objects with only a single attribute wer - not being handled properly. This has been fixed. -
  • getExtensionValue for X.509 CRLs was returning the value of the - DER-Encoded octet string not the DER-Encoded octet string as required. This - has been fixed. -
  • the IV algorithm parameters class would improperly throw an exception - on initialisation. This has been fixed. -
-

2.37.3 Additional Functionality and Features

-
    -
  • The AESWrap ciphers will now take IV's. -
  • The DES-EDEWrap algorithm described in http://www.ietf.org/internet-drafts/draft-ietf-smime-key-wrap-01.txt is now supported. -
  • Support for the ExtendedKeyUsageExtension and the KeyPurposeId has been added. -
  • The OID based alias for DSA has been added to the JCE provider. -
  • BC key stores now implement the BCKeyStore interface so you can provide your own source of randomness to a key store. -
  • The ASN.1 library now supports GeneralizedTime. -
  • HMACSHA256, HMACSHA384, and HMACSHA512 are now added. -
  • PSS has been added to the JCE, PSS and ISO9796 signers in the lightweight api have been rewritten so they can be used incrementally. SHA256withRSA, SHA384withRSA, and SHA512withRSA have been added. -
  • Base support for CMS (RFC 2630) is now provided (see CONTRIBUTORS file - for details). -
-

2.38.1 Version

-Release 1.11 -

2.38.2 Defects Fixed

-
    -
  • X9.23 padding of MACs now works correctly with block size aligned data. -
  • Loading a corrupted "UBER" key store would occasionally cause the -appearance of hanging. This has been fixed. -
  • Loading a PKCS12 store where not all certificates had PKCS9 attributes -assigned to them would cause a NullPointerException. This has been fixed. -
  • The PKCS12 store wasn't correctly recovering certificate chains of -length less than 2 on calling the getCertificateChain method. This has been -fixed. -
  • Lone certificates were not been stored in the PKCS12 store. This has been fixed. -
  • CFB and OFB modes weren't padding iv's more than 1 byte less than the -block size of the cipher if the mode was reused with a shorter IV. This has -been fixed. -
  • IV handling and block size return values for CFB and OFB modes wasn't being handled in the same way as the Sun reference implementation. This has been fixed. -
  • CertificateInfoRequests were not handling null attributes correctly. This -has been fixed. -
  • Tags for the X.509 GeneralName structure were wrongly encoded. This has been -fixed. -
  • getExtensionValue for X.509 certificates was returning the value of the -DER-Encoded octet string not the DER-Encoded octet string as required. This has -been fixed. -
  • reset on the version 3 X.509 certificate generator was not flushing the -extensions. This has been fixed. -
  • The NetscapeCert type bits were reversed! This has been fixed. -
-

2.38.3 Additional Functionality and Features

-
    -
  • The lightweight API and the JCE provider now support ElGamal. -
  • X509Principal, and X509Name now supports the "DC" attribute and the -creation of directory names from vectors. -
  • RSA-PSS signature padding has been added to the lightweight API. -
  • EC Public/Private keys are now encoded in accordance with SEC 1. The library -will still read older keys as well. -
  • Added PKCS12-DEF a pkcs12 based key store which works around a bug in -the Sun keytool - it always uses the default provider for creating certificates. -
  • A cut down version of the Rijndael has been added that provides the functionality required to conform the the AES. It is designed to fully support FIPS-197. A fips AES wrapper (AESWrap in the JCE, AESWrapEngine in the lightweight library has also been added). -
  • Elliptic curve routines now handle uncompressed points as well as the -compressed ones. -
-

2.38.4 Other changes

-
    -
  • As the range of public key types supported has expanded the getPublicKey -method on the SubjectPublicKeyInfo class is not always going to work. The -more generic method getPublicKeyData has been added and getPublicKey now -throws an IOException if there is a problem. -
-

2.39.1 Version

-Release 1.10 -

2.39.2 Defects Fixed

-
    -
  • The PKCS12 Key Store now interoperates with the JDK key tool. Note: this does mean the the key name passed to the setKeyEntry calls has become -significant. -
  • The "int" constructor for DERInteger only supported ints up to 128. This -has been fixed. -
  • The ASN.1 input streams now handle zero-tagged zero length objects correctly. -
-

2.39.3 Additional Functionality and Features

-
    -
  • The JCE Provider and the lightweight API now support Serpent, CAST5, and CAST6. -
  • The JCE provider and the lightweight API now has an implementation of ECIES. -Note: this is based on a draft, don't use it for anything that needs to -be kept long term as it may be adjusted. -
  • Further work has been done on performance - mainly in the symmetric ciphers. -
  • Support for the generation of PKCS10 certification requests has been added. -
-

2.40.1 Version

-Release 1.09 -

2.40.2 Defects Fixed

-
    -
  • failure to pass in an RC5 parameters object now results in an exception -at the upper level of the JCE, rather than falling over in the lightweight -library. -
  • ISO10126Padding now incorporates the correct amount of random data. -
  • The PKCS12 key store wasn't picking up certificate chains properly -when being used to write PKCS12 files. This has been fixed. -
  • The Twofish engine would call System.exit if the key was too large. -This has been fixed. -
  • In some cases the ASN.1 library wouldn't handle implicit tagging properly. -This has been fixed. -
-

2.40.3 Additional Functionality and Features

-
    -
  • Support for RC5-64 has been added to the JCE. -
  • ISO9796-2 signatures have been added to the JCE and lightweight API. -
  • A more general paddings packge for use with MACs and block ciphers had been aded to the lightweight API. MACs now allow you to specify padding. -
  • X9.23 Padding has been added to the JCE and lightwieght API. The old -PaddedBlockCipher class is now deprecated see org.bouncycastle.crypto.paddings for details. -
  • SHA-256, SHA-384, and SHA-512 are now added. Note: while the public review -period has finished, these algorithms have not yet been standardised, in the -event that final standardisation changes the algorithms these implementations -will be changed. -
  • It's now possible to set bag attributes on items to go into a PKCS12 store, -using the org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier interface. -
  • More classses have been added to the ASN.1 package for dealing with -certificate extensions and CRLs including a CRL generator. Note: the -CRL generators should be regarded as under development and subject to change. -
  • There's now an examples package for the JCE (in addition to the examples -in org.bouncycastle.jce.provider.test) - org.bouncycastle.jce.examples. It -currently consists of a class showing how to generate a PKCS12 file. -
  • The X.509 CertificateFactory now includes CRL support. DER or PEM CRLs may be processed. -
  • The BigInteger library has been written with a view to making it less -resource hungry and faster - whether it's fast enough remains to be seen! -
- -

2.41.1 Version

-Release 1.08 - -

2.41.2 Defects Fixed

-
    -
  • It wasn't possible to specify an ordering for distinguished names in -X509 certificates. This is now supported. -
  • In some circumstances stream Ciphers in the JCE would cause null pointer -exceptions on doFinal. This has been fixed. -
  • Unpadded ciphers would sometimes buffer the last block of input, even -if it could be processed. This has been fixed. -
  • The netscape certificate request class wouldn't compile under JDK 1.1. This -has been fixed. -
-

2.41.3 Additional Functionality and Features

-
    -
  • ISO 9796-1 padding is now supported with RSA in the lightweight -API and the JCE. -
  • support classes have been added for reading and writing PKCS 12 files, -including a keystore for the JCA. -
  • The message digests MD4, Tiger, and RIPEMD128 have been added to the -JCE and the lightweight API. Note: MD4 and RIPEMD128 have been added for -compatibility purposes only - we recommend you don't use them for anything new! -
  • The JDK 1.1 certificate classes didn't conform to the JDK 1.2 API as -the collections class was not present. Thanks to a donated collections API -this is fixed. -
-

2.42.1 Version

-Release 1.07 - -

2.42.2 Defects Fixed

-
    -
  • It turned out that the setOddParity method in the DESParameter class -was indeed doing something odd but not what was intended. This is now -fixed. Note:This will affect some PBE encryptions that were carried -out with DES, equivalent PBE ciphers to the old PBE DES cipher can be -accessed by prepending the work "Broken" in front of the original PBE cipher -call. If you want an example of how to deal with this as a migration issue -have a look in org.bouncycastle.jce.provider.JDKKeyStore lines 201-291. -
-

2.43.1 Version

-Release 1.06 - -

2.43.2 Defects Fixed

-
    -
  • Diffie-Hellman keys are now properly serialisable as well as -encodable. -
  • Three of the semi-weak keys in the DESParameters, and the DESKeySpec look -up table, were incorrect. This has been fixed. -
  • DESEDE key generators now accept 112 and 168 as the key sizes, as well -as 128 and 192 (for those people who don't like to count the parity bits). -
  • Providing no strength parameter is passed to the DESede key generator in -the JCE provider, the provider now generates DESede keys in the k1-k2-k1 -format (which is compatible with the Sun reference implementation), otherwise -you get what you ask for (3-DES or 2-DES in the minimum number of bytes). -
  • Base Diffie-Hellman key agreement now works correctly for more than two -parties. -
  • Cipher.getAlgorithmParameters was returing null in cases where a cipher -object had generated it's own IV. This has been fixed. -
  • An error in the key store occasionally caused checks of entry types to -result in a null pointer exception. This has been fixed. -
  • RSA key generator in JCE now recognises RSAKeyGenerationParameterSpec. -
  • Resetting and resusing HMacs in the lightweight and heavyweight libraries -caused a NullPointer exception. This has been fixed. -
- -

2.43.3 Additional Functionality

-
    -
  • ISO10126Padding is now recognised explicitly for block ciphers -as well. -
  • The Blowfish implementation is now somewhat faster. -
- -

2.44.1 Version

-Release 1.05 - -

2.44.2 Defects Fixed

-
    -
  • The DESEDE key generator can now be used to generate 2-Key-DESEDE -keys as well as 3-Key-DESEDE keys. -
  • One of the weak keys in the DESParameters, and the DESKeySpec look -up table, was incorrect. This has been fixed. -
  • The PKCS12 generator was only generating the first 128-160 bits of the -key correctly (depending on the digest used). This has been fixed. -
  • The ASN.1 library was skipping explicitly tagged objects of zero length. -This has been fixed. -
-

2.44.3 Additional Functionality

-
    -
  • There is now an org.bouncycastle.jce.netscape package which has -a class in for dealing with Netscape Certificate Request objects. -
-

2.44.4 Additional Notes

-

-Concerning the PKCS12 fix: in a few cases this may cause some backward -compatibility issues - if this happens to you, drop us a line at -feedback-crypto@bouncycastle.org -and we will help you get it sorted out. - -

2.45.1 Version

-Release 1.04 - -

2.45.2 Defects Fixed

-
    -
  • Signatures generated by other providers that include optional null -parameters in the AlgorithmIdentifier are now handled correctly by the -provider. -
  • The JCE 1.2.1 states that the names of algorithms associated with the JCE -are case insensitive. The class that matches algorithms to names now tries -to match the name given with it's equivalent in upper case, before trying -to match it as given. If you write a provider and include versions of your -algorithm names in uppercase only, this JCE implementation will always -match a getInstance regardless of the case of the algorithm passed into -the getInstance method. -
  • If the JCE API and the Provider were in a different class path, the -class loader being used sometimes failed to find classes for JCE Ciphers, etc. -This has been fixed. -
  • An error in the ASN.1 library was causing problems serialising Diffie-Hellman keys. This has been fixed. -
  • The agreement package was left out of the j2me bat file. This has been fixed. -
  • The BigInteger class for 1.0 and the j2me wasn't able to generate random -integers (prime or otherwise). This has been fixed. -
  • The BigInteger class would sometimes go into a death spiral if the any -32nd bit of an exponent was set when modPow was called. This has been fixed. -
  • Cipher.getInstance would treat "//" in a transformation as a single "/". -This has been fixed. -
  • PBEWithSHAAndIDEA-CBC was throwing an exception on initialisation. This has -been fixed. -
  • The X509Name class in the asn1.x509 package wasn't initialising its local -hash table when the hash table constructor was called. This has been fixed. -
- -

2.45.3 Additional Functionality

-
    -
  • Added Elliptic Curve DSA (X9.62) - ECDSA - to provider and lightweight -library. -
  • Added Elliptic Curve basic Diffie-Hellman to provider and lightweight -library. -
  • Added DSA support to the provider and the lightweight library. -
  • Added super class interfaces for basic Diffie-Hellman agreement classes -to lightweight library. -
  • The certificate generators now support ECDSA and DSA certs as well. -
- -

2.46.1 Version

-Release 1.03 - -

2.46.2 Defects Fixed

-
    -
  • CFB and OFB modes when specified without padding would insist on input -being block aligned. When specified without padding CFB and OFB now behave in a compatible -fashion (a doFinal on a partial block will yield just the data that could -be processed). -In short, it provides another way of generating cipher text the same -length as the plain text. -
- -

2.47.1 Version

-Release 1.02 - -

2.47.2 Defects Fixed

-
    -
  • The RSA key pair generator occasionally produced keys 1 bit under the -requested size. This is now fixed. -
- -

2.48.1 Version

-Release 1.01 - -

2.48.2 Defects Fixed

- -
    -
  • Buffered ciphers in lightweight library were not resetting correctly -on a doFinal. This has been fixed. -
- -

2.49.1 Version

-Release 1.0 - -

2.49.2 Defects Fixed

-

-

    -
  • JDK1.2 version now works with keytool for certificate generation. -
  • Certificate toString method no longer throws a null pointer exception -if a group [3] extension has not been added. -
  • Under some circumstances the NullCipher would throw a NullPointerException, -this has been fixed. -
  • Under some circumstances CipherInputStream would throw a NullPointerException, this has been fixed. -
  • OpenSSL/SSLeay private key encodings would cause an exception to be thrown -by the RSA key factory. This is now fixed. -
  • The Cipher class always used the default provider even when one was specified, this has been fixed. -
  • Some DES PBE algorithms did not set the parity correctly in generated keys, this has been fixed. -
- -

2.49.3 Additional functionality

-

-

    -
  • Argument validation is much improved. -
  • An X509KeyUsage class has been added to the JCE class to make it easier -to specify the KeyUsage extension on X.509 certificates. -
  • The library now allows creation of version 1 certificates as well. -
- -

3.0 Notes

-

-The J2ME is only supported under Windows. -

-If you are trying to use the lightweight provider in a JDK 1.0 applet, you -need to change the package names for java.math.BigInteger, java.lang.IllegalStateException, and java.security.SecureRandom -

-The RSA test under JDK 1.0 and J2ME takes a while to run... - - diff --git a/java/ext/lcrypto-jdk15on-148/specifications.html b/java/ext/lcrypto-jdk15on-148/specifications.html deleted file mode 100644 index a26ad50..0000000 --- a/java/ext/lcrypto-jdk15on-148/specifications.html +++ /dev/null @@ -1,815 +0,0 @@ - - -Bouncy Castle Crypto Package - - - - -

-

Bouncy Castle Crypto Package

- -
-
-
-
-

1.0 Introduction

-The Bouncy Castle Crypto package is a Java implementation of -cryptographic algorithms. The package is organised so that it -contains a light-weight API suitable for use in any environment -(including the newly released J2ME) with the additional infrastructure -to conform the algorithms to the JCE framework. -

-Except where otherwise stated, this software is distributed under a license -based on the MIT X -Consortium license. To view the license, see here. -The OpenPGP library also includes a modified BZIP2 library which -is licensed under the Apache Software License, Version 2.0. - -

-If you have the full package you will have six jar files, bcprov*.jar -which contains the BC provider, jce-*.jar which contains -the JCE provider, clean room API, and bcmail*.jar which contains the -mail API. -

-Note: if you are using JDK 1.0, you will just find a class hierarchy in -the classes directory. -

-To view examples, look at the test programs in the packages: -

    -
  • org.bouncycastle.crypto.test -
  • org.bouncycastle.jce.provider.test -
-

-To verify the packages, run the following Java programs with the -appropriate classpath: -

    -
  • java org.bouncycastle.crypto.test.RegressionTest -
  • java org.bouncycastle.jce.provider.test.RegressionTest -
- - -

2.0 Patents

-

-Some of the algorithms in the Bouncy Castle APIs are patented in some -places. It is upon the user of the library to be aware of what the -legal situation is in their own situation, however we have been asked -to specifically mention the patent below, in the following terms, at -the request of the patent holder. Algorithms that appear here are only -distributed in the -ext- versions of the provider. -

-The IDEA encryption algorithm is patented in the USA, Japan, and Europe -including at least Austria, France, Germany, Italy, Netherlands, Spain, Sweden, -Switzerland and the United Kingdom. Non-commercial use is free, however -any commercial products that make use of IDEA are liable for royalties. -Please see -www.mediacrypt.com for -further details. - -

3.0 Specifications

- -
    -
  • clean room implementation of the JCE API -
  • light-weight cryptographic API consisting of support for -
      -
    • BlockCipher -
    • BufferedBlockCipher -
    • AsymmetricBlockCipher -
    • BufferedAsymmetricBlockCipher -
    • StreamCipher -
    • BufferedStreamCipher -
    • KeyAgreement -
    • IESCipher -
    • Digest -
    • Mac -
    • PBE -
    • Signers -
    -
  • JCE compatible framework for a Bouncy Castle provider -
- -

4.0 Light-weight API

- -

-This API has been specifically developed for those circumstances -where the rich API and integration requirements of the JCE are -not required. -

-However as a result, the light-weight API requires more effort -and understanding on the part of a developer to initialise and -utilise the algorithms. - -

4.1 Example

- -

To utilise the light-weight API in a program, the fundamentals -are as follows; - -

-
-	/*
-	 * This will use a supplied key, and encrypt the data
-	 * This is the equivalent of DES/CBC/PKCS5Padding
-	 */
-	BlockCipher engine = new DESEngine();
-	BufferedBlockCipher cipher = new PaddedBlockCipher(new CBCCipher(engine));
-
-	byte[] key = keyString.getBytes();
-	byte[] input = inputString.getBytes();
-
-	cipher.init(true, new KeyParameter(key));
-
-	byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
-	
-	int outputLen = cipher.processBytes(input, 0, input.length, cipherText, 0);
-	try
-	{
-		cipher.doFinal(cipherText, outputLen);
-	}
-	catch (CryptoException ce)
-	{
-		System.err.println(ce);
-		System.exit(1);
-	}
-
-
- -

4.2 Algorithms

- -

The light-weight API has built in support for the following: - -

Symmetric (Block)

- -

-The base interface is BlockCipher and has the following -implementations which match the modes the block cipher can -be operated in. -

- - - - - - - - - - - -
NameConstructorNotes
BufferedBlockCipherBlockCipher 
CBCBlockCipherBlockCipher 
CFBBlockCipherBlockCipher, block size (in bits) 
CCMBlockCipherBlockCipherPacket mode - requires all data up front.
EAXBlockCipherBlockCipher 
OFBBlockCipherBlockCipher, block size (in bits) 
SICBlockCipherBlockCipher, block size (in bits)Also known as CTR mode
OpenPGPCFBBlockCipherBlockCipher 
GOFBBlockCipherBlockCipherGOST OFB mode
- -

-BufferedBlockCipher has a further sub-classes -

- - - - -
NameConstructorNotes
PaddedBufferedBlockCipherBlockCiphera buffered block cipher that can use padding - default PKCS5/7 padding
CTSBlockCipherBlockCipherCipher Text Stealing
- -

The following paddings can be used with the PaddedBufferedBlockCipher. -

- - - - - - - -
NameDescription
PKCS7PaddingPKCS7/PKCS5 padding
ISO10126d2PaddingISO 10126-2 padding
X932PaddingX9.23 padding
ISO7816d4PaddingISO 7816-4 padding (ISO 9797-1 scheme 2)
ZeroBytePaddingPad with Zeros (not recommended)
- -

The following cipher engines are implemented that can be -used with the above modes. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameKeySizes (in bits) Block SizeNotes
AESEngine0 .. 256 128 bit 
AESWrapEngine0 .. 256 128 bitImplements FIPS AES key wrapping
BlowfishEngine0 .. 448 64 bit 
CamelliaEngine128, 192, 256128 bit 
CamelliaWrapEngine128, 192, 256128 bit 
CAST5Engine0 .. 128 64 bit 
CAST6Engine0 .. 256 128 bit 
DESEngine6464 bit 
DESedeEngine128, 19264 bit 
DESedeWrapEngine128, 19264 bitImplements Draft IETF DESede key wrapping
GOST28147Engine25664 bitHas a range of S-boxes
IDEAEngine12864 bit 
NoekeonEngine128128 bit 
RC2Engine0 .. 1024 64 bit 
RC532Engine0 .. 128 64 bitUses a 32 bit word
RC564Engine0 .. 128 128 bitUses a 64 bit word
RC6Engine0 .. 256 128 bit 
RijndaelEngine0 .. 256 128 bit, 160 bit, 192 bit, 224 bit, 256 bit 
SEEDEngine128128 bit 
SEEDWrapEngine128128 bit 
SerpentEngine128, 192, 256 128 bit 
SkipjackEngine0 .. 128 64 bit 
TEAEngine12864 bit 
TwofishEngine128, 192, 256 128 bit 
XTEAEngine12864 bit 
- -

Symmetric (Stream)

- -

-The base interface is StreamCipher and has the following -implementations which match the modes the stream cipher can -be operated in. - -

- - - -
NameConstructorNotes
BlockStreamCipherBlockCipher 
-

The following cipher engines are implemented that can be -used with the above modes. -

- - - - - - - - - - - -
NameKeySizes (in bits) Notes
RC4Engine40 .. 2048 
HC128Engine128 
HC256Engine256 
Salsa20Engine128/256 
ISAACEngine32 .. 8192 
VMPCEngine8 .. 6144 
Grainv1Engine8064 bit IV
Grain128Engine12896 bit IV
- -

Block Asymmetric

- -

-The base interface is AsymmetricBlockCipher and has the following -implementations which match the modes the cipher can be operated in. - -

- - - - - - -
NameConstructorNotes
BufferedAsymmetricBlockCipherAsymmetricBlockCipher 
OAEPEncodingAsymmetricBlockCipher 
PKCS1EncodingAsymmetricBlockCipher 
ISO9796d1EncodingAsymmetricBlockCipherISO9796-1
- -

The following cipher engines are implemented that can be -used with the above modes. -

- - - - -
NameKeySizes (in bits)Notes
RSAEngineany multiple of 8 large enough for the encoding. 
ElGamalEngineany multiple of 8 large enough for the encoding. 
- -

Digest

- -

-The base interface is Digest and has the following -implementations -

- - - - - - - - - - - - - - - - - - -
NameOutput (in bits)Notes
MD2Digest128 
MD4Digest128 
MD5Digest128 
RipeMD128Digest128basic RipeMD
RipeMD160Digest160enhanced version of RipeMD
RipeMD256Digest256expanded version of RipeMD128
RipeMD320Digest320expanded version of RipeMD160
SHA1Digest160 
SHA224Digest224FIPS 180-2
SHA256Digest256FIPS 180-2
SHA384Digest384FIPS 180-2
SHA512Digest512FIPS 180-2
SHA3Digest224, 256, 288, 384, 512
TigerDigest192The Tiger Digest.
GOST3411Digest256The GOST-3411 Digest.
WhirlpoolDigest512The Whirlpool Digest.
- -

MAC

- -

-The base interface is Mac and has the following -implementations -

- - - - - -
NameOutput (in bits)Notes
CBCBlockCipherMacblocksize/2 unless specified 
CFBBlockCipherMacblocksize/2, in CFB 8 mode, unless specified 
HMacdigest length 
- -

PBE

- -

-The base class is PBEParametersGenerator and has the following -sub-classes -

- - - - - - -
NameConstructorNotes
PKCS5S1ParametersGeneratorDigest 
PKCS5S2ParametersGenerator Uses SHA1/Hmac as defined
PKCS12ParametersGeneratorDigest 
OpenSSLPBEParametersGenerator Uses MD5 as defined
- -

Key Agreement

-

-Two versions of Diffie-Hellman key agreement are supported, the basic -version, and one for use with long term public keys. Two versions of -key agreement using Elliptic Curve cryptography are also supported, -standard Diffie-Hellman key agreement and standard key agreement with -co-factors. -

-The agreement APIs are in the org.bouncycastle.crypto.agreement package. -Classes for generating Diffie-Hellman parameters can be found in the -org.bouncycastle.crypto.params and org.bouncycastle.crypto.generators packages. -

- -

IESCipher

-

-The IES cipher is based on the one described in IEEE P1363a (draft 10), for -use with either traditional Diffie-Hellman or Elliptic Curve Diffie-Hellman. -

-Note: At the moment this is still a draft, don't use it for anything -that may be subject to long term storage, the key values produced may well -change as the draft is finalised. -

-

Signers

-

-DSA, ECDSA, ISO-9796-2, GOST-3410-94, GOST-3410-2001, DSTU-4145-2002, and RSA-PSS are supported by the org.bouncycastle.crypto.signers -package. Note: as these are light weight classes, if you need to use SHA1 or GOST-3411 -(as defined in the relevant standards) you'll also need to make use of the appropriate -digest class in conjunction with these. -Classes for generating DSA and ECDSA parameters can be found in the -org.bouncycastle.crypto.params and org.bouncycastle.crypto.generators packages. -

- -

4.3 ASN.1 package

- -

The light-weight API has direct interfaces into a package capable of -reading and writing DER-encoded ASN.1 objects and for the generation -of X.509 V3 certificate objects and PKCS12 files. BER InputStream and -OutputStream classes are provided as well. - -

5.0 Bouncy Castle Provider

- -

The Bouncy Castle provider is a JCE compliant provider that -is a wrapper built on top of the light-weight API. - -

-The advantage for writing application code that uses the -provider interface to cryptographic algorithms is that the -actual provider used can be selected at run time. This -is extremely valuable for applications that may wish to -make use of a provider that has underlying hardware for -cryptographic computation, or where an application may have -been developed in an environment with cryptographic export -controls. - -

5.1 Example

- -

To utilise the JCE provider in a program, the fundamentals -are as follows; - -

-
-	/*
-	 * This will generate a random key, and encrypt the data
-	 */
-	Key		key;
-	KeyGenerator	keyGen;
-	Cipher		encrypt;
-
-	Security.addProvider(new BouncyCastleProvider());
-
-	try
-	{
-		// "BC" is the name of the BouncyCastle provider
-		keyGen = KeyGenerator.getInstance("DES", "BC");
-		keyGen.init(new SecureRandom());
-
-		key = keyGen.generateKey();
-
-		encrypt = Cipher.getInstance("DES/CBC/PKCS5Padding", "BC");
-	}
-	catch (Exception e)
-	{
-		System.err.println(e);
-		System.exit(1);
-	}
-
-	encrypt.init(Cipher.ENCRYPT_MODE, key);
-
-	bOut = new ByteArrayOutputStream();
-	cOut = new CipherOutputStream(bOut, encrypt);
-
-	cOut.write("plaintext".getBytes());
-	cOut.close();
-
-	// bOut now contains the cipher text
-
-
-

-The provider can also be configured as part of your environment via static registration -by adding an entry to the java.security properties file (found in $JAVA_HOME/jre/lib/security/java.security, where $JAVA_HOME is the location of your JDK/JRE distribution). You'll find detailed -instructions in the file but basically it comes down to adding a line: -

-
-    security.provider.<n>=org.bouncycastle.jce.provider.BouncyCastleProvider
-
-
-

Where <n> is the preference you want the provider at (1 being the most prefered). -

Where you put the jar is up to mostly up to you, although with jdk1.3 and -jdk1.4 the best (and in some cases only) place to have it is in $JAVA_HOME/jre/lib/ext. Note: under Windows there will normally be a JRE and a JDK install of Java if you think you have installed it correctly and it still doesn't work chances are you have added the provider to the installation not being used. -

-Note: with JDK 1.4 and later you will need to have installed the unrestricted policy -files to take full advantage of the provider. If you do not install the policy files you are likely -to get something like the following: - -

-        java.lang.SecurityException: Unsupported keysize or algorithm parameters
-                at javax.crypto.Cipher.init(DashoA6275)
-
- -The policy files can be found at the same place you downloaded the JDK. -

-

5.2 Algorithms

- -

Symmetric (Block)

- -

Modes: -

    -
  • ECB -
  • CBC -
  • OFB(n) -
  • CFB(n) -
  • SIC (also known as CTR) -
  • OpenPGPCFB -
  • CTS (equivalent to CBC/WithCTS) -
  • GOFB -
  • CCM -
  • EAX -
- -

-Where (n) is a multiple of 8 that gives the blocksize in bits, -eg, OFB8. Note that OFB and CFB mode can be used with plain text that -is not an exact multiple of the block size if NoPadding has been specified. -

- -Padding Schemes: -

    -
  • No padding -
  • PKCS5/7 -
  • ISO10126/ISO10126-2 -
  • ISO7816-4/ISO9797-1 -
  • X9.23/X923 -
  • TBC -
  • ZeroByte -
  • withCTS (if used with ECB mode) -
- -

-When placed together this gives a specification for an algorithm -as; -

    -
  • DES/CBC/X9.23Padding -
  • DES/OFB8/NoPadding -
  • IDEA/CBC/ISO10126Padding -
  • IDEA/CBC/ISO7816-4Padding -
  • SKIPJACK/ECB/PKCS7Padding -
  • DES/ECB/WithCTS -
- -

-Note: default key sizes are in bold. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameKeySizes (in bits) Block SizeNotes
AES0 .. 256 (192)128 bit 
AESWrap0 .. 256 (192)128 bitA FIPS AES key wrapper
Blowfish0 .. 448 (448)64 bit 
Camellia128, 192, 256128 bit 
CamelliaWrap128, 192, 256128 bit 
CAST50 .. 128(128)64 bit 
CAST60 .. 256(256)128 bit 
DES6464 bit 
DESede128, 19264 bit 
DESedeWrap128, 192128 bitA Draft IETF DESede key wrapper
GOST2814725664 bit 
IDEA128 (128)64 bitOnly included in extended provider jar.
Noekeon128(128)128 bit 
RC20 .. 1024 (128)64 bit 
RC50 .. 128 (128)64 bitUses a 32 bit word
RC5-640 .. 256 (256)128 bitUses a 64 bit word
RC60 .. 256 (128)128 bit 
Rijndael0 .. 256 (192)128 bit 
SEED128(128)128 bit 
SEEDWrap128(128)128 bit 
Serpent128, 192, 256 (256)128 bit 
Skipjack0 .. 128 (128)64 bit 
TEA128 (128)64 bit 
Twofish128, 192, 256 (256)128 bit 
XTEA128 (128)64 bit 
- -

Symmetric (Stream)

- -

-Note: default key sizes are in bold. -

- - - - - - - - - -
NameKeySizes (in bits)Notes
RC440 .. 2048 bits (128) 
HC128(128) 
HC256(256) 
Salsa20128/256(128) 
VMPC128/6144(128) 
Grainv18064 bit IV
Grain12812896 bit IV
- -

Block Asymmetric

- -

Encoding: -

    -
  • OAEP - Optimal Asymmetric Encryption Padding -
  • PCKS1 - PKCS v1.5 Padding -
  • ISO9796-1 - ISO9796-1 edition 1 Padding -
-

Note: except as indicated in PKCS 1v2 we recommend you use OAEP, as -mandated in X9.44. - -

-When placed together with RSA this gives a specification for an algorithm -as; -

    -
  • RSA/NONE/NoPadding -
  • RSA/NONE/PKCS1Padding -
  • RSA/NONE/OAEPWithMD5AndMGF1Padding -
  • RSA/NONE/OAEPWithSHA1AndMGF1Padding -
  • RSA/NONE/OAEPWithSHA224AndMGF1Padding -
  • RSA/NONE/OAEPWithSHA256AndMGF1Padding -
  • RSA/NONE/OAEPWithSHA384AndMGF1Padding -
  • RSA/NONE/OAEPWithSHA512AndMGF1Padding -
  • RSA/NONE/ISO9796-1Padding -
- - - - - -
NameKeySizes (in bits)Notes
RSAany multiple of 8 bits large enough for the encryption(2048) 
ElGamalany multiple of 8 bits large enough for the encryption(1024) 
- -

Key Agreement

- -

-Diffie-Hellman key agreement is supported using the "DH", "ECDH", and -"ECDHC" (ECDH with cofactors) key agreement instances. -

-Note: with basic "DH" only the basic algorithm fits in with the JCE API, if -you're using long-term public keys you may want to look at the light-weight -API. -

-

ECIES

-

-An implementation of ECIES (stream mode) as described in IEEE P 1363a. -

-Note: At the moment this is still a draft, don't use it for anything -that may be subject to long term storage, the key values produced may well -change as the draft is finalised. -

-

Digest

-

- - - - - - - - - - - - - - - - - - - - - -
NameOutput (in bits)Notes
GOST3411256 
MD2128 
MD4128 
MD5128 
RipeMD128128basic RipeMD
RipeMD160160enhanced version of RipeMD
RipeMD256Digest256expanded version of RipeMD128
RipeMD320Digest320expanded version of RipeMD160
SHA1160 
SHA-224224FIPS 180-2
SHA-256256FIPS 180-2
SHA-384384FIPS 180-2
SHA-512512FIPS 180-2
SHA3-224224 
SHA3-256256 
SHA3-384384 
SHA3-512512 
Tiger192 
Whirlpool512 
- -

MAC

- - - - - - - - - - - - - - - - -
NameOutput (in bits)Notes
Any MAC based on a block cipher, CBC (the default) and CFB modes.half the cipher's block size (usually 32 bits) 
VMPC-MAC128 
HMac-MD2128 
HMac-MD4128 
HMac-MD5128 
HMac-RipeMD128128 
HMac-RipeMD160160 
HMac-SHA1160 
HMac-SHA224224 
HMac-SHA256256 
HMac-SHA384384 
HMac-SHA512512 
HMac-Tiger192 
- -

Examples: -

    -
  • DESMac -
  • DESMac/CFB8 -
  • DESedeMac -
  • DESedeMac/CFB8 -
  • DESedeMac64 -
  • SKIPJACKMac -
  • SKIPJACKMac/CFB8 -
  • IDEAMac -
  • IDEAMac/CFB8 -
  • RC2Mac -
  • RC2Mac/CFB8 -
  • RC5Mac -
  • RC5Mac/CFB8 -
  • ISO9797ALG3Mac -
- - -

Signature Algorithms

- -

Schemes: -

    -
  • DSTU4145
  • -
  • GOST3411withGOST3410 (GOST3411withGOST3410-94) -
  • GOST3411withECGOST3410 (GOST3411withGOST3410-2001) -
  • MD2withRSA -
  • MD5withRSA -
  • SHA1withRSA -
  • RIPEMD128withRSA -
  • RIPEMD160withRSA -
  • RIPEMD160withECDSA -
  • RIPEMD256withRSA -
  • SHA1withDSA -
  • NONEwithDSA -
  • SHA1withECDSA -
  • NONEwithECDSA -
  • SHA224withECDSA -
  • SHA256withECDSA -
  • SHA384withECDSA -
  • SHA512withECDSA -
  • SHA224withRSA -
  • SHA256withRSA -
  • SHA384withRSA -
  • SHA512withRSA -
  • SHA1withRSAandMGF1 -
  • SHA256withRSAandMGF1 -
  • SHA384withRSAandMGF1 -
  • SHA512withRSAandMGF1 -
- -

PBE

- -

Schemes: -

    -
  • PKCS5S1, any Digest, any symmetric Cipher, ASCII -
  • PKCS5S2, SHA1/HMac, any symmetric Cipher, ASCII -
  • PKCS12, any Digest, any symmetric Cipher, Unicode -
- -

-Defined in Bouncy Castle JCE Provider - - - - - - - - - - - - - - - - -
NameKey Generation SchemeKey Length (in bits)
PBEWithMD2AndDESPKCS5 Scheme 164
PBEWithMD2AndRC2PKCS5 Scheme 1128
PBEWithMD5AndDESPKCS5 Scheme 164
PBEWithMD5AndRC2PKCS5 Scheme 1128
PBEWithSHA1AndDESPKCS5 Scheme 164
PBEWithSHA1AndRC2PKCS5 Scheme 1128
PBEWithSHAAnd2-KeyTripleDES-CBCPKCS12128
PBEWithSHAAnd3-KeyTripleDES-CBCPKCS12192
PBEWithSHAAnd128BitRC2-CBCPKCS12128
PBEWithSHAAnd40BitRC2-CBCPKCS1240
PBEWithSHAAnd128BitRC4PKCS12128
PBEWithSHAAnd40BitRC4PKCS1240
PBEWithSHAAndTwofish-CBCPKCS12256
PBEWithSHAAndIDEA-CBCPKCS12128
- -

5.3 Certificates

-

-The Bouncy Castle provider will read X.509 certficates (v2 or v3) as per the examples in -the java.security.cert.CertificateFactory class. They can be provided either -in the normal PEM encoded format, or as DER binaries. -

-The CertificiateFactory will also read X.509 CRLs (v2) from either PEM or DER encodings. -

-In addition to the classes in the org.bouncycastle.asn1.x509 package for certificate -generation a more JCE "friendly" class is provided in the package org.bouncycastle.x509. The JCE "friendly" class supports RSA, DSA, and EC-DSA. -

-

5.4 Keystore

-

-The Bouncy Castle package has three implementation of a keystore. -

-The first "BKS" is a keystore that will work with the keytool in the same -fashion as the Sun "JKS" keystore. The keystore is resistent to tampering -but not inspection. -

-The second, Keystore.BouncyCastle, or Keystore.UBER will only work with the keytool -if the password is provided on the command line, as the entire keystore -is encrypted -with a PBE based on SHA1 and Twofish. PBEWithSHAAndTwofish-CBC. -This makes the entire keystore resistant to tampering and inspection, -and forces verification. -The Sun JDK provided keytool will attempt to load a keystore even if no -password is given, -this is impossible for this version. (One might wonder about going to all -this trouble and then having the password on the command line! New keytool -anyone?). -

-In the first case, the keys are encrypted with 3-Key-TripleDES. -

-The third is a PKCS12 compatible keystore. PKCS12 provides a slightly -different situation from the regular key store, the keystore password is -currently the only password used for storing keys. Otherwise it supports -all the functionality required for it to be used with the keytool. In some -situations other libraries always expect to be dealing with Sun certificates, -if this is the case use PKCS12-DEF, and the certificates produced by the -key store will be made using the default provider. In the default case PKCS12 uses 3DES for key protection and 40 bit RC2 for protecting the certificates. It is also possible to use 3DES for both by using PKCS12-3DES-3DES or PKCS12-DEF-3DES-3DES as the KeyStore type. -

-There is an example program that produces PKCS12 files suitable for -loading into browsers. It is in the package -org.bouncycastle.jce.examples. -

-

-

5.5 Additional support classes for Elliptic Curve.

-

-There are no classes for supporting EC in the JDK prior to JDK 1.5. If you are using -an earlier JDK you can find classes for using EC in the following -packages: -

    -
  • org.bouncycastle.jce.spec
  • -
  • org.bouncycastle.jce.interfaces
  • -
  • org.bouncycastle.jce
  • -
- -

6.0 BouncyCastle S/MIME

- -To be able to fully compile and utilise the BouncyCastle S/MIME -package (including the test classes) you need the jar files for -the following APIs. - - -

6.1 Setting up BouncyCastle S/MIME in JavaMail

- -The BouncyCastle S/MIME handlers may be set in JavaMail two ways. - -
    -
  • STATICALLY
    - - Add the following entries to the mailcap file: -
    -    application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature
    -    application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime
    -    application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature
    -    application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime
    -    multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed
    -    
    - -
  • DYNAMICALLY
    - - The following code will add the BouncyCastle S/MIME handlers dynamically: - -
    -    import javax.activation.MailcapCommandMap;
    -    import javax.activation.CommandMap;
    -
    -    public static void setDefaultMailcap()
    -    {
    -        MailcapCommandMap _mailcap =
    -            (MailcapCommandMap)CommandMap.getDefaultCommandMap();
    -
    -        _mailcap.addMailcap("application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature");
    -        _mailcap.addMailcap("application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime");
    -        _mailcap.addMailcap("application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature");
    -        _mailcap.addMailcap("application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime");
    -        _mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed");
    -
    -        CommandMap.setDefaultCommandMap(_mailcap);
    -    } 
    -    
    - - - diff --git a/java/ext/lcrypto-jdk15on-148/src/META-INF/MANIFEST.MF b/java/ext/lcrypto-jdk15on-148/src/META-INF/MANIFEST.MF deleted file mode 100644 index 5e94951..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/LICENSE.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/LICENSE.java deleted file mode 100644 index 6a77691..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/LICENSE.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bc; - -/** - * The Bouncy Castle License - * - * Copyright (c) 2000-2012 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) - *

    - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software - * and associated documentation files (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - *

    - * The above copyright notice and this permission notice shall be included in all copies or substantial - * portions of the Software. - *

    - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -public class LICENSE -{ - public static String licenseText = - "Copyright (c) 2000-2012 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) " - + System.getProperty("line.separator") - + System.getProperty("line.separator") - + "Permission is hereby granted, free of charge, to any person obtaining a copy of this software " - + System.getProperty("line.separator") - + "and associated documentation files (the \"Software\"), to deal in the Software without restriction, " - + System.getProperty("line.separator") - + "including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, " - + System.getProperty("line.separator") - + "and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so," - + System.getProperty("line.separator") - + "subject to the following conditions:" - + System.getProperty("line.separator") - + System.getProperty("line.separator") - + "The above copyright notice and this permission notice shall be included in all copies or substantial" - + System.getProperty("line.separator") - + "portions of the Software." - + System.getProperty("line.separator") - + System.getProperty("line.separator") - + "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED," - + System.getProperty("line.separator") - + "INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR" - + System.getProperty("line.separator") - + "PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE" - + System.getProperty("line.separator") - + "LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR" - + System.getProperty("line.separator") - + "OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER" - + System.getProperty("line.separator") - + "DEALINGS IN THE SOFTWARE."; - - public static void main( - String[] args) - { - System.out.println(licenseText); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ApplicationSpecificParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ApplicationSpecificParser.java deleted file mode 100644 index 4b82819..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ApplicationSpecificParser.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public interface ASN1ApplicationSpecificParser - extends ASN1Encodable, InMemoryRepresentable -{ - ASN1Encodable readObject() - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Boolean.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Boolean.java deleted file mode 100644 index 5844a74..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Boolean.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.asn1; - -public class ASN1Boolean - extends DERBoolean -{ - public ASN1Boolean(boolean value) - { - super(value); - } - - ASN1Boolean(byte[] value) - { - super(value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Choice.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Choice.java deleted file mode 100644 index 58e6058..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Choice.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.bc.asn1; - -/** - * Marker interface for CHOICE objects - if you implement this in a role your - * own object any attempt to tag the object implicitly will convert the tag to - * an explicit one as the encoding rules require. - *

    - * If you use this interface your class should also implement the getInstance - * pattern which takes a tag object and the tagging mode used. - */ -public interface ASN1Choice -{ - // marker interface -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encodable.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encodable.java deleted file mode 100644 index 4838910..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encodable.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bc.asn1; - -public interface ASN1Encodable -{ - ASN1Primitive toASN1Primitive(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1EncodableVector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1EncodableVector.java deleted file mode 100644 index 21ab9d7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1EncodableVector.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.asn1; - -import java.util.Enumeration; -import java.util.Vector; - -public class ASN1EncodableVector -{ - Vector v = new Vector(); - - public ASN1EncodableVector() - { - } - - public void add(ASN1Encodable obj) - { - v.addElement(obj); - } - - public void addAll(ASN1EncodableVector other) - { - for (Enumeration en = other.v.elements(); en.hasMoreElements();) - { - v.addElement(en.nextElement()); - } - } - - public ASN1Encodable get(int i) - { - return (ASN1Encodable)v.elementAt(i); - } - - public int size() - { - return v.size(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encoding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encoding.java deleted file mode 100644 index c3a4fd6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Encoding.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.asn1; - -public interface ASN1Encoding -{ - static final String DER = "DER"; - static final String DL = "DL"; - static final String BER = "BER"; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Enumerated.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Enumerated.java deleted file mode 100644 index 01b1df2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Enumerated.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1; - -import java.math.BigInteger; - -public class ASN1Enumerated - extends DEREnumerated -{ - ASN1Enumerated(byte[] bytes) - { - super(bytes); - } - - public ASN1Enumerated(BigInteger value) - { - super(value); - } - - public ASN1Enumerated(int value) - { - super(value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Exception.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Exception.java deleted file mode 100644 index 449232b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Exception.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class ASN1Exception - extends IOException -{ - private Throwable cause; - - ASN1Exception(String message) - { - super(message); - } - - ASN1Exception(String message, Throwable cause) - { - super(message); - this.cause = cause; - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1GeneralizedTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1GeneralizedTime.java deleted file mode 100644 index f099ee8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1GeneralizedTime.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1; - -import java.util.Date; - -public class ASN1GeneralizedTime - extends DERGeneralizedTime -{ - ASN1GeneralizedTime(byte[] bytes) - { - super(bytes); - } - - public ASN1GeneralizedTime(Date time) - { - super(time); - } - - public ASN1GeneralizedTime(String time) - { - super(time); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Generator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Generator.java deleted file mode 100644 index d489550..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Generator.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.asn1; - -import java.io.OutputStream; - -public abstract class ASN1Generator -{ - protected OutputStream _out; - - public ASN1Generator(OutputStream out) - { - _out = out; - } - - public abstract OutputStream getRawOutputStream(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1InputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1InputStream.java deleted file mode 100644 index 7296476..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1InputStream.java +++ /dev/null @@ -1,466 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayInputStream; -import java.io.EOFException; -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.util.io.Streams; - -/** - * a general purpose ASN.1 decoder - note: this class differs from the - * others in that it returns null after it has read the last object in - * the stream. If an ASN.1 NULL is encountered a DER/BER Null object is - * returned. - */ -public class ASN1InputStream - extends FilterInputStream - implements BERTags -{ - private final int limit; - private final boolean lazyEvaluate; - - private final byte[][] tmpBuffers; - - public ASN1InputStream( - InputStream is) - { - this(is, StreamUtil.findLimit(is)); - } - - /** - * Create an ASN1InputStream based on the input byte array. The length of DER objects in - * the stream is automatically limited to the length of the input array. - * - * @param input array containing ASN.1 encoded data. - */ - public ASN1InputStream( - byte[] input) - { - this(new ByteArrayInputStream(input), input.length); - } - - /** - * Create an ASN1InputStream based on the input byte array. The length of DER objects in - * the stream is automatically limited to the length of the input array. - * - * @param input array containing ASN.1 encoded data. - * @param lazyEvaluate true if parsing inside constructed objects can be delayed. - */ - public ASN1InputStream( - byte[] input, - boolean lazyEvaluate) - { - this(new ByteArrayInputStream(input), input.length, lazyEvaluate); - } - - /** - * Create an ASN1InputStream where no DER object will be longer than limit. - * - * @param input stream containing ASN.1 encoded data. - * @param limit maximum size of a DER encoded object. - */ - public ASN1InputStream( - InputStream input, - int limit) - { - this(input, limit, false); - } - - /** - * Create an ASN1InputStream where no DER object will be longer than limit, and constructed - * objects such as sequences will be parsed lazily. - * - * @param input stream containing ASN.1 encoded data. - * @param lazyEvaluate true if parsing inside constructed objects can be delayed. - */ - public ASN1InputStream( - InputStream input, - boolean lazyEvaluate) - { - this(input, StreamUtil.findLimit(input), lazyEvaluate); - } - - /** - * Create an ASN1InputStream where no DER object will be longer than limit, and constructed - * objects such as sequences will be parsed lazily. - * - * @param input stream containing ASN.1 encoded data. - * @param limit maximum size of a DER encoded object. - * @param lazyEvaluate true if parsing inside constructed objects can be delayed. - */ - public ASN1InputStream( - InputStream input, - int limit, - boolean lazyEvaluate) - { - super(input); - this.limit = limit; - this.lazyEvaluate = lazyEvaluate; - this.tmpBuffers = new byte[11][]; - } - - int getLimit() - { - return limit; - } - - protected int readLength() - throws IOException - { - return readLength(this, limit); - } - - protected void readFully( - byte[] bytes) - throws IOException - { - if (Streams.readFully(this, bytes) != bytes.length) - { - throw new EOFException("EOF encountered in middle of object"); - } - } - - /** - * build an object given its tag and the number of bytes to construct it from. - */ - protected ASN1Primitive buildObject( - int tag, - int tagNo, - int length) - throws IOException - { - boolean isConstructed = (tag & CONSTRUCTED) != 0; - - DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this, length); - - if ((tag & APPLICATION) != 0) - { - return new DERApplicationSpecific(isConstructed, tagNo, defIn.toByteArray()); - } - - if ((tag & TAGGED) != 0) - { - return new ASN1StreamParser(defIn).readTaggedObject(isConstructed, tagNo); - } - - if (isConstructed) - { - // TODO There are other tags that may be constructed (e.g. BIT_STRING) - switch (tagNo) - { - case OCTET_STRING: - // - // yes, people actually do this... - // - ASN1EncodableVector v = buildDEREncodableVector(defIn); - ASN1OctetString[] strings = new ASN1OctetString[v.size()]; - - for (int i = 0; i != strings.length; i++) - { - strings[i] = (ASN1OctetString)v.get(i); - } - - return new BEROctetString(strings); - case SEQUENCE: - if (lazyEvaluate) - { - return new LazyEncodedSequence(defIn.toByteArray()); - } - else - { - return DERFactory.createSequence(buildDEREncodableVector(defIn)); - } - case SET: - return DERFactory.createSet(buildDEREncodableVector(defIn)); - case EXTERNAL: - return new DERExternal(buildDEREncodableVector(defIn)); - default: - throw new IOException("unknown tag " + tagNo + " encountered"); - } - } - - return createPrimitiveDERObject(tagNo, defIn, tmpBuffers); - } - - ASN1EncodableVector buildEncodableVector() - throws IOException - { - ASN1EncodableVector v = new ASN1EncodableVector(); - ASN1Primitive o; - - while ((o = readObject()) != null) - { - v.add(o); - } - - return v; - } - - ASN1EncodableVector buildDEREncodableVector( - DefiniteLengthInputStream dIn) throws IOException - { - return new ASN1InputStream(dIn).buildEncodableVector(); - } - - public ASN1Primitive readObject() - throws IOException - { - int tag = read(); - if (tag <= 0) - { - if (tag == 0) - { - throw new IOException("unexpected end-of-contents marker"); - } - - return null; - } - - // - // calculate tag number - // - int tagNo = readTagNumber(this, tag); - - boolean isConstructed = (tag & CONSTRUCTED) != 0; - - // - // calculate length - // - int length = readLength(); - - if (length < 0) // indefinite length method - { - if (!isConstructed) - { - throw new IOException("indefinite length primitive encoding encountered"); - } - - IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this, limit); - ASN1StreamParser sp = new ASN1StreamParser(indIn, limit); - - if ((tag & APPLICATION) != 0) - { - return new BERApplicationSpecificParser(tagNo, sp).getLoadedObject(); - } - - if ((tag & TAGGED) != 0) - { - return new BERTaggedObjectParser(true, tagNo, sp).getLoadedObject(); - } - - // TODO There are other tags that may be constructed (e.g. BIT_STRING) - switch (tagNo) - { - case OCTET_STRING: - return new BEROctetStringParser(sp).getLoadedObject(); - case SEQUENCE: - return new BERSequenceParser(sp).getLoadedObject(); - case SET: - return new BERSetParser(sp).getLoadedObject(); - case EXTERNAL: - return new DERExternalParser(sp).getLoadedObject(); - default: - throw new IOException("unknown BER object encountered"); - } - } - else - { - try - { - return buildObject(tag, tagNo, length); - } - catch (IllegalArgumentException e) - { - throw new ASN1Exception("corrupted stream detected", e); - } - } - } - - static int readTagNumber(InputStream s, int tag) - throws IOException - { - int tagNo = tag & 0x1f; - - // - // with tagged object tag number is bottom 5 bits, or stored at the start of the content - // - if (tagNo == 0x1f) - { - tagNo = 0; - - int b = s.read(); - - // X.690-0207 8.1.2.4.2 - // "c) bits 7 to 1 of the first subsequent octet shall not all be zero." - if ((b & 0x7f) == 0) // Note: -1 will pass - { - throw new IOException("corrupted stream - invalid high tag number found"); - } - - while ((b >= 0) && ((b & 0x80) != 0)) - { - tagNo |= (b & 0x7f); - tagNo <<= 7; - b = s.read(); - } - - if (b < 0) - { - throw new EOFException("EOF found inside tag value."); - } - - tagNo |= (b & 0x7f); - } - - return tagNo; - } - - static int readLength(InputStream s, int limit) - throws IOException - { - int length = s.read(); - if (length < 0) - { - throw new EOFException("EOF found when length expected"); - } - - if (length == 0x80) - { - return -1; // indefinite-length encoding - } - - if (length > 127) - { - int size = length & 0x7f; - - // Note: The invalid long form "0xff" (see X.690 8.1.3.5c) will be caught here - if (size > 4) - { - throw new IOException("DER length more than 4 bytes: " + size); - } - - length = 0; - for (int i = 0; i < size; i++) - { - int next = s.read(); - - if (next < 0) - { - throw new EOFException("EOF found reading length"); - } - - length = (length << 8) + next; - } - - if (length < 0) - { - throw new IOException("corrupted stream - negative length found"); - } - - if (length >= limit) // after all we must have read at least 1 byte - { - throw new IOException("corrupted stream - out of bounds length found"); - } - } - - return length; - } - - private static byte[] getBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers) - throws IOException - { - int len = defIn.getRemaining(); - if (defIn.getRemaining() < tmpBuffers.length) - { - byte[] buf = tmpBuffers[len]; - - if (buf == null) - { - buf = tmpBuffers[len] = new byte[len]; - } - - Streams.readFully(defIn, buf); - - return buf; - } - else - { - return defIn.toByteArray(); - } - } - - private static char[] getBMPCharBuffer(DefiniteLengthInputStream defIn) - throws IOException - { - int len = defIn.getRemaining() / 2; - char[] buf = new char[len]; - int totalRead = 0; - while (totalRead < len) - { - int ch1 = defIn.read(); - if (ch1 < 0) - { - break; - } - int ch2 = defIn.read(); - if (ch2 < 0) - { - break; - } - buf[totalRead++] = (char)((ch1 << 8) | (ch2 & 0xff)); - } - - return buf; - } - - static ASN1Primitive createPrimitiveDERObject( - int tagNo, - DefiniteLengthInputStream defIn, - byte[][] tmpBuffers) - throws IOException - { - switch (tagNo) - { - case BIT_STRING: - return DERBitString.fromInputStream(defIn.getRemaining(), defIn); - case BMP_STRING: - return new DERBMPString(getBMPCharBuffer(defIn)); - case BOOLEAN: - return ASN1Boolean.fromOctetString(getBuffer(defIn, tmpBuffers)); - case ENUMERATED: - return ASN1Enumerated.fromOctetString(getBuffer(defIn, tmpBuffers)); - case GENERALIZED_TIME: - return new ASN1GeneralizedTime(defIn.toByteArray()); - case GENERAL_STRING: - return new DERGeneralString(defIn.toByteArray()); - case IA5_STRING: - return new DERIA5String(defIn.toByteArray()); - case INTEGER: - return new ASN1Integer(defIn.toByteArray()); - case NULL: - return DERNull.INSTANCE; // actual content is ignored (enforce 0 length?) - case NUMERIC_STRING: - return new DERNumericString(defIn.toByteArray()); - case OBJECT_IDENTIFIER: - return ASN1ObjectIdentifier.fromOctetString(getBuffer(defIn, tmpBuffers)); - case OCTET_STRING: - return new DEROctetString(defIn.toByteArray()); - case PRINTABLE_STRING: - return new DERPrintableString(defIn.toByteArray()); - case T61_STRING: - return new DERT61String(defIn.toByteArray()); - case UNIVERSAL_STRING: - return new DERUniversalString(defIn.toByteArray()); - case UTC_TIME: - return new ASN1UTCTime(defIn.toByteArray()); - case UTF8_STRING: - return new DERUTF8String(defIn.toByteArray()); - case VISIBLE_STRING: - return new DERVisibleString(defIn.toByteArray()); - default: - throw new IOException("unknown tag " + tagNo + " encountered"); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Integer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Integer.java deleted file mode 100644 index 0dbbecb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Integer.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1; - -import java.math.BigInteger; - -public class ASN1Integer - extends DERInteger -{ - ASN1Integer(byte[] bytes) - { - super(bytes); - } - - public ASN1Integer(BigInteger value) - { - super(value); - } - - public ASN1Integer(long value) - { - super(value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Null.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Null.java deleted file mode 100644 index 3a6e3c1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Null.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -/** - * A NULL object. - */ -public abstract class ASN1Null - extends ASN1Primitive -{ - /** - * @deprecated use DERNull.INSTANCE - */ - public ASN1Null() - { - } - - public static ASN1Null getInstance(Object o) - { - if (o instanceof ASN1Null) - { - return (ASN1Null)o; - } - - if (o != null) - { - try - { - return ASN1Null.getInstance(ASN1Primitive.fromByteArray((byte[])o)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct NULL from byte[]: " + e.getMessage()); - } - catch (ClassCastException e) - { - throw new IllegalArgumentException("unknown object in getInstance(): " + o.getClass().getName()); - } - } - - return null; - } - - public int hashCode() - { - return -1; - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof ASN1Null)) - { - return false; - } - - return true; - } - - abstract void encode(ASN1OutputStream out) - throws IOException; - - public String toString() - { - return "NULL"; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Object.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Object.java deleted file mode 100644 index 00ca164..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Object.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -public abstract class ASN1Object - implements ASN1Encodable -{ - /** - * Return the default BER or DER encoding for this object. - * - * @return BER/DER byte encoded object. - * @throws java.io.IOException on encoding error. - */ - public byte[] getEncoded() - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - ASN1OutputStream aOut = new ASN1OutputStream(bOut); - - aOut.writeObject(this); - - return bOut.toByteArray(); - } - - /** - * Return either the default for "BER" or a DER encoding if "DER" is specified. - * - * @param encoding name of encoding to use. - * @return byte encoded object. - * @throws IOException on encoding error. - */ - public byte[] getEncoded( - String encoding) - throws IOException - { - if (encoding.equals(ASN1Encoding.DER)) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - DEROutputStream dOut = new DEROutputStream(bOut); - - dOut.writeObject(this); - - return bOut.toByteArray(); - } - else if (encoding.equals(ASN1Encoding.DL)) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - DLOutputStream dOut = new DLOutputStream(bOut); - - dOut.writeObject(this); - - return bOut.toByteArray(); - } - - return this.getEncoded(); - } - - public int hashCode() - { - return this.toASN1Primitive().hashCode(); - } - - public boolean equals( - Object o) - { - if (this == o) - { - return true; - } - - if (!(o instanceof ASN1Encodable)) - { - return false; - } - - ASN1Encodable other = (ASN1Encodable)o; - - return this.toASN1Primitive().equals(other.toASN1Primitive()); - } - - /** - * @deprecated use toASN1Primitive() - * @return the underlying primitive type. - */ - public ASN1Primitive toASN1Object() - { - return this.toASN1Primitive(); - } - - protected static boolean hasEncodedTagValue(Object obj, int tagValue) - { - return (obj instanceof byte[]) && ((byte[])obj)[0] == tagValue; - } - - public abstract ASN1Primitive toASN1Primitive(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ObjectIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ObjectIdentifier.java deleted file mode 100644 index 9858577..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ObjectIdentifier.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.bc.asn1; - -public class ASN1ObjectIdentifier - extends DERObjectIdentifier -{ - public ASN1ObjectIdentifier(String identifier) - { - super(identifier); - } - - ASN1ObjectIdentifier(byte[] bytes) - { - super(bytes); - } - - /** - * Return an OID that creates a branch under the current one. - * - * @param branchID node numbers for the new branch. - * @return the OID for the new created branch. - */ - public ASN1ObjectIdentifier branch(String branchID) - { - return new ASN1ObjectIdentifier(getId() + "." + branchID); - } - - /** - * Return true if this oid is an extension of the passed in branch, stem. - * @param stem the arc or branch that is a possible parent. - * @return true if the branch is on the passed in stem, false otherwise. - */ - public boolean on(ASN1ObjectIdentifier stem) - { - String id = getId(), stemId = stem.getId(); - return id.length() > stemId.length() && id.charAt(stemId.length()) == '.' && id.startsWith(stemId); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetString.java deleted file mode 100644 index 6b04c5e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetString.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.util.Arrays; -import org.bc.util.encoders.Hex; - -public abstract class ASN1OctetString - extends ASN1Primitive - implements ASN1OctetStringParser -{ - byte[] string; - - /** - * return an Octet String from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1OctetString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof ASN1OctetString) - { - return getInstance(o); - } - else - { - return BEROctetString.fromSequence(ASN1Sequence.getInstance(o)); - } - } - - /** - * return an Octet String from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1OctetString getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1OctetString) - { - return (ASN1OctetString)obj; - } - else if (obj instanceof byte[]) - { - try - { - return ASN1OctetString.getInstance(ASN1Primitive.fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct OCTET STRING from byte[]: " + e.getMessage()); - } - } - else if (obj instanceof ASN1Encodable) - { - ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); - - if (primitive instanceof ASN1OctetString) - { - return (ASN1OctetString)primitive; - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * @param string the octets making up the octet string. - */ - public ASN1OctetString( - byte[] string) - { - if (string == null) - { - throw new NullPointerException("string cannot be null"); - } - this.string = string; - } - - public InputStream getOctetStream() - { - return new ByteArrayInputStream(string); - } - - public ASN1OctetStringParser parser() - { - return this; - } - - public byte[] getOctets() - { - return string; - } - - public int hashCode() - { - return Arrays.hashCode(this.getOctets()); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof ASN1OctetString)) - { - return false; - } - - ASN1OctetString other = (ASN1OctetString)o; - - return Arrays.areEqual(string, other.string); - } - - public ASN1Primitive getLoadedObject() - { - return this.toASN1Primitive(); - } - - ASN1Primitive toDERObject() - { - return new DEROctetString(string); - } - - ASN1Primitive toDLObject() - { - return new DEROctetString(string); - } - - abstract void encode(ASN1OutputStream out) - throws IOException; - - public String toString() - { - return "#"+new String(Hex.encode(string)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetStringParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetStringParser.java deleted file mode 100644 index a804726..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OctetStringParser.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.asn1; - -import java.io.InputStream; - -public interface ASN1OctetStringParser - extends ASN1Encodable, InMemoryRepresentable -{ - public InputStream getOctetStream(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OutputStream.java deleted file mode 100644 index 957db9f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1OutputStream.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * Stream that produces output based on the default encoding for the passed in objects. - */ -public class ASN1OutputStream -{ - private OutputStream os; - - public ASN1OutputStream( - OutputStream os) - { - this.os = os; - } - - void writeLength( - int length) - throws IOException - { - if (length > 127) - { - int size = 1; - int val = length; - - while ((val >>>= 8) != 0) - { - size++; - } - - write((byte)(size | 0x80)); - - for (int i = (size - 1) * 8; i >= 0; i -= 8) - { - write((byte)(length >> i)); - } - } - else - { - write((byte)length); - } - } - - void write(int b) - throws IOException - { - os.write(b); - } - - void write(byte[] bytes) - throws IOException - { - os.write(bytes); - } - - void write(byte[] bytes, int off, int len) - throws IOException - { - os.write(bytes, off, len); - } - - void writeEncoded( - int tag, - byte[] bytes) - throws IOException - { - write(tag); - writeLength(bytes.length); - write(bytes); - } - - void writeTag(int flags, int tagNo) - throws IOException - { - if (tagNo < 31) - { - write(flags | tagNo); - } - else - { - write(flags | 0x1f); - if (tagNo < 128) - { - write(tagNo); - } - else - { - byte[] stack = new byte[5]; - int pos = stack.length; - - stack[--pos] = (byte)(tagNo & 0x7F); - - do - { - tagNo >>= 7; - stack[--pos] = (byte)(tagNo & 0x7F | 0x80); - } - while (tagNo > 127); - - write(stack, pos, stack.length - pos); - } - } - } - - void writeEncoded(int flags, int tagNo, byte[] bytes) - throws IOException - { - writeTag(flags, tagNo); - writeLength(bytes.length); - write(bytes); - } - - protected void writeNull() - throws IOException - { - os.write(BERTags.NULL); - os.write(0x00); - } - - public void writeObject( - ASN1Encodable obj) - throws IOException - { - if (obj != null) - { - obj.toASN1Primitive().encode(this); - } - else - { - throw new IOException("null object detected"); - } - } - - void writeImplicitObject(ASN1Primitive obj) - throws IOException - { - if (obj != null) - { - obj.encode(new ImplicitOutputStream(os)); - } - else - { - throw new IOException("null object detected"); - } - } - - public void close() - throws IOException - { - os.close(); - } - - public void flush() - throws IOException - { - os.flush(); - } - - ASN1OutputStream getDERSubStream() - { - return new DEROutputStream(os); - } - - ASN1OutputStream getDLSubStream() - { - return new DLOutputStream(os); - } - - private class ImplicitOutputStream - extends ASN1OutputStream - { - private boolean first = true; - - public ImplicitOutputStream(OutputStream os) - { - super(os); - } - - public void write(int b) - throws IOException - { - if (first) - { - first = false; - } - else - { - super.write(b); - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ParsingException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ParsingException.java deleted file mode 100644 index cc40dbd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1ParsingException.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.asn1; - -public class ASN1ParsingException - extends IllegalStateException -{ - private Throwable cause; - - public ASN1ParsingException(String message) - { - super(message); - } - - public ASN1ParsingException(String message, Throwable cause) - { - super(message); - this.cause = cause; - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Primitive.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Primitive.java deleted file mode 100644 index 6a2a1a4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Primitive.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public abstract class ASN1Primitive - extends ASN1Object -{ - ASN1Primitive() - { - - } - - /** - * Create a base ASN.1 object from a byte stream. - * - * @param data the byte stream to parse. - * @return the base ASN.1 object represented by the byte stream. - * @exception IOException if there is a problem parsing the data. - */ - public static ASN1Primitive fromByteArray(byte[] data) - throws IOException - { - ASN1InputStream aIn = new ASN1InputStream(data); - - try - { - return aIn.readObject(); - } - catch (ClassCastException e) - { - throw new IOException("cannot recognise object in stream"); - } - } - - public final boolean equals(Object o) - { - if (this == o) - { - return true; - } - - return (o instanceof ASN1Encodable) && asn1Equals(((ASN1Encodable)o).toASN1Primitive()); - } - - public ASN1Primitive toASN1Primitive() - { - return this; - } - - ASN1Primitive toDERObject() - { - return this; - } - - ASN1Primitive toDLObject() - { - return this; - } - - public abstract int hashCode(); - - abstract boolean isConstructed(); - - abstract int encodedLength() throws IOException; - - abstract void encode(ASN1OutputStream out) throws IOException; - - abstract boolean asn1Equals(ASN1Primitive o); -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Sequence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Sequence.java deleted file mode 100644 index b079ee1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Sequence.java +++ /dev/null @@ -1,323 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; -import java.util.Vector; - -public abstract class ASN1Sequence - extends ASN1Primitive -{ - protected Vector seq = new Vector(); - - /** - * return an ASN1Sequence from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1Sequence getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1Sequence) - { - return (ASN1Sequence)obj; - } - else if (obj instanceof ASN1SequenceParser) - { - return ASN1Sequence.getInstance(((ASN1SequenceParser)obj).toASN1Primitive()); - } - else if (obj instanceof byte[]) - { - try - { - return ASN1Sequence.getInstance(fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct sequence from byte[]: " + e.getMessage()); - } - } - else if (obj instanceof ASN1Encodable) - { - ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); - - if (primitive instanceof ASN1Sequence) - { - return (ASN1Sequence)primitive; - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - /** - * Return an ASN1 sequence from a tagged object. There is a special - * case here, if an object appears to have been explicitly tagged on - * reading but we were expecting it to be implicitly tagged in the - * normal course of events it indicates that we lost the surrounding - * sequence - so we need to add it back (this will happen if the tagged - * object is a sequence that contains other sequences). If you are - * dealing with implicitly tagged sequences you really should - * be using this method. - * - * @param obj the tagged object. - * @param explicit true if the object is meant to be explicitly tagged, - * false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1Sequence getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - if (explicit) - { - if (!obj.isExplicit()) - { - throw new IllegalArgumentException("object implicit - explicit expected."); - } - - return ASN1Sequence.getInstance(obj.getObject().toASN1Primitive()); - } - else - { - // - // constructed object which appears to be explicitly tagged - // when it should be implicit means we have to add the - // surrounding sequence. - // - if (obj.isExplicit()) - { - if (obj instanceof BERTaggedObject) - { - return new BERSequence(obj.getObject()); - } - else - { - return new DLSequence(obj.getObject()); - } - } - else - { - if (obj.getObject() instanceof ASN1Sequence) - { - return (ASN1Sequence)obj.getObject(); - } - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - /** - * create an empty sequence - */ - protected ASN1Sequence() - { - } - - /** - * create a sequence containing one object - */ - protected ASN1Sequence( - ASN1Encodable obj) - { - seq.addElement(obj); - } - - /** - * create a sequence containing a vector of objects. - */ - protected ASN1Sequence( - ASN1EncodableVector v) - { - for (int i = 0; i != v.size(); i++) - { - seq.addElement(v.get(i)); - } - } - - /** - * create a sequence containing a vector of objects. - */ - protected ASN1Sequence( - ASN1Encodable[] array) - { - for (int i = 0; i != array.length; i++) - { - seq.addElement(array[i]); - } - } - - public ASN1Encodable[] toArray() - { - ASN1Encodable[] values = new ASN1Encodable[this.size()]; - - for (int i = 0; i != this.size(); i++) - { - values[i] = this.getObjectAt(i); - } - - return values; - } - - public Enumeration getObjects() - { - return seq.elements(); - } - - public ASN1SequenceParser parser() - { - final ASN1Sequence outer = this; - - return new ASN1SequenceParser() - { - private final int max = size(); - - private int index; - - public ASN1Encodable readObject() throws IOException - { - if (index == max) - { - return null; - } - - ASN1Encodable obj = getObjectAt(index++); - if (obj instanceof ASN1Sequence) - { - return ((ASN1Sequence)obj).parser(); - } - if (obj instanceof ASN1Set) - { - return ((ASN1Set)obj).parser(); - } - - return obj; - } - - public ASN1Primitive getLoadedObject() - { - return outer; - } - - public ASN1Primitive toASN1Primitive() - { - return outer; - } - }; - } - - /** - * return the object at the sequence position indicated by index. - * - * @param index the sequence number (starting at zero) of the object - * @return the object at the sequence position indicated by index. - */ - public ASN1Encodable getObjectAt( - int index) - { - return (ASN1Encodable)seq.elementAt(index); - } - - /** - * return the number of objects in this sequence. - * - * @return the number of objects in this sequence. - */ - public int size() - { - return seq.size(); - } - - public int hashCode() - { - Enumeration e = this.getObjects(); - int hashCode = size(); - - while (e.hasMoreElements()) - { - Object o = getNext(e); - hashCode *= 17; - - hashCode ^= o.hashCode(); - } - - return hashCode; - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof ASN1Sequence)) - { - return false; - } - - ASN1Sequence other = (ASN1Sequence)o; - - if (this.size() != other.size()) - { - return false; - } - - Enumeration s1 = this.getObjects(); - Enumeration s2 = other.getObjects(); - - while (s1.hasMoreElements()) - { - ASN1Encodable obj1 = getNext(s1); - ASN1Encodable obj2 = getNext(s2); - - ASN1Primitive o1 = obj1.toASN1Primitive(); - ASN1Primitive o2 = obj2.toASN1Primitive(); - - if (o1 == o2 || o1.equals(o2)) - { - continue; - } - - return false; - } - - return true; - } - - private ASN1Encodable getNext(Enumeration e) - { - ASN1Encodable encObj = (ASN1Encodable)e.nextElement(); - - return encObj; - } - - ASN1Primitive toDERObject() - { - ASN1Sequence derSeq = new DERSequence(); - - derSeq.seq = this.seq; - - return derSeq; - } - - ASN1Primitive toDLObject() - { - ASN1Sequence dlSeq = new DLSequence(); - - dlSeq.seq = this.seq; - - return dlSeq; - } - - boolean isConstructed() - { - return true; - } - - abstract void encode(ASN1OutputStream out) - throws IOException; - - public String toString() - { - return seq.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SequenceParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SequenceParser.java deleted file mode 100644 index c26dbf9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SequenceParser.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public interface ASN1SequenceParser - extends ASN1Encodable, InMemoryRepresentable -{ - ASN1Encodable readObject() - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Set.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Set.java deleted file mode 100644 index 806b891..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1Set.java +++ /dev/null @@ -1,460 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Vector; - -abstract public class ASN1Set - extends ASN1Primitive -{ - private Vector set = new Vector(); - private boolean isSorted = false; - - /** - * return an ASN1Set from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1Set getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1Set) - { - return (ASN1Set)obj; - } - else if (obj instanceof ASN1SetParser) - { - return ASN1Set.getInstance(((ASN1SetParser)obj).toASN1Primitive()); - } - else if (obj instanceof byte[]) - { - try - { - return ASN1Set.getInstance(ASN1Primitive.fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct set from byte[]: " + e.getMessage()); - } - } - else if (obj instanceof ASN1Encodable) - { - ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); - - if (primitive instanceof ASN1Set) - { - return (ASN1Set)primitive; - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - /** - * Return an ASN1 set from a tagged object. There is a special - * case here, if an object appears to have been explicitly tagged on - * reading but we were expecting it to be implicitly tagged in the - * normal course of events it indicates that we lost the surrounding - * set - so we need to add it back (this will happen if the tagged - * object is a sequence that contains other sequences). If you are - * dealing with implicitly tagged sets you really should - * be using this method. - * - * @param obj the tagged object. - * @param explicit true if the object is meant to be explicitly tagged - * false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1Set getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - if (explicit) - { - if (!obj.isExplicit()) - { - throw new IllegalArgumentException("object implicit - explicit expected."); - } - - return (ASN1Set)obj.getObject(); - } - else - { - // - // constructed object which appears to be explicitly tagged - // and it's really implicit means we have to add the - // surrounding set. - // - if (obj.isExplicit()) - { - if (obj instanceof BERTaggedObject) - { - return new BERSet(obj.getObject()); - } - else - { - return new DLSet(obj.getObject()); - } - } - else - { - if (obj.getObject() instanceof ASN1Set) - { - return (ASN1Set)obj.getObject(); - } - - // - // in this case the parser returns a sequence, convert it - // into a set. - // - if (obj.getObject() instanceof ASN1Sequence) - { - ASN1Sequence s = (ASN1Sequence)obj.getObject(); - - if (obj instanceof BERTaggedObject) - { - return new BERSet(s.toArray()); - } - else - { - return new DLSet(s.toArray()); - } - } - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - protected ASN1Set() - { - } - - /** - * create a sequence containing one object - */ - protected ASN1Set( - ASN1Encodable obj) - { - set.addElement(obj); - } - - /** - * create a sequence containing a vector of objects. - */ - protected ASN1Set( - ASN1EncodableVector v, - boolean doSort) - { - for (int i = 0; i != v.size(); i++) - { - set.addElement(v.get(i)); - } - - if (doSort) - { - this.sort(); - } - } - - /** - * create a sequence containing a vector of objects. - */ - protected ASN1Set( - ASN1Encodable[] array, - boolean doSort) - { - for (int i = 0; i != array.length; i++) - { - set.addElement(array[i]); - } - - if (doSort) - { - this.sort(); - } - } - - public Enumeration getObjects() - { - return set.elements(); - } - - /** - * return the object at the set position indicated by index. - * - * @param index the set number (starting at zero) of the object - * @return the object at the set position indicated by index. - */ - public ASN1Encodable getObjectAt( - int index) - { - return (ASN1Encodable)set.elementAt(index); - } - - /** - * return the number of objects in this set. - * - * @return the number of objects in this set. - */ - public int size() - { - return set.size(); - } - - public ASN1Encodable[] toArray() - { - ASN1Encodable[] values = new ASN1Encodable[this.size()]; - - for (int i = 0; i != this.size(); i++) - { - values[i] = this.getObjectAt(i); - } - - return values; - } - - public ASN1SetParser parser() - { - final ASN1Set outer = this; - - return new ASN1SetParser() - { - private final int max = size(); - - private int index; - - public ASN1Encodable readObject() throws IOException - { - if (index == max) - { - return null; - } - - ASN1Encodable obj = getObjectAt(index++); - if (obj instanceof ASN1Sequence) - { - return ((ASN1Sequence)obj).parser(); - } - if (obj instanceof ASN1Set) - { - return ((ASN1Set)obj).parser(); - } - - return obj; - } - - public ASN1Primitive getLoadedObject() - { - return outer; - } - - public ASN1Primitive toASN1Primitive() - { - return outer; - } - }; - } - - public int hashCode() - { - Enumeration e = this.getObjects(); - int hashCode = size(); - - while (e.hasMoreElements()) - { - Object o = getNext(e); - hashCode *= 17; - - hashCode ^= o.hashCode(); - } - - return hashCode; - } - - ASN1Primitive toDERObject() - { - if (isSorted) - { - ASN1Set derSet = new DERSet(); - - derSet.set = this.set; - - return derSet; - } - else - { - Vector v = new Vector(); - - for (int i = 0; i != set.size(); i++) - { - v.addElement(set.elementAt(i)); - } - - ASN1Set derSet = new DERSet(); - - derSet.set = v; - - derSet.sort(); - - return derSet; - } - } - - ASN1Primitive toDLObject() - { - ASN1Set derSet = new DLSet(); - - derSet.set = this.set; - - return derSet; - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof ASN1Set)) - { - return false; - } - - ASN1Set other = (ASN1Set)o; - - if (this.size() != other.size()) - { - return false; - } - - Enumeration s1 = this.getObjects(); - Enumeration s2 = other.getObjects(); - - while (s1.hasMoreElements()) - { - ASN1Encodable obj1 = getNext(s1); - ASN1Encodable obj2 = getNext(s2); - - ASN1Primitive o1 = obj1.toASN1Primitive(); - ASN1Primitive o2 = obj2.toASN1Primitive(); - - if (o1 == o2 || o1.equals(o2)) - { - continue; - } - - return false; - } - - return true; - } - - private ASN1Encodable getNext(Enumeration e) - { - ASN1Encodable encObj = (ASN1Encodable)e.nextElement(); - - // unfortunately null was allowed as a substitute for DER null - if (encObj == null) - { - return DERNull.INSTANCE; - } - - return encObj; - } - - /** - * return true if a <= b (arrays are assumed padded with zeros). - */ - private boolean lessThanOrEqual( - byte[] a, - byte[] b) - { - int len = Math.min(a.length, b.length); - for (int i = 0; i != len; ++i) - { - if (a[i] != b[i]) - { - return (a[i] & 0xff) < (b[i] & 0xff); - } - } - return len == a.length; - } - - private byte[] getEncoded( - ASN1Encodable obj) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - ASN1OutputStream aOut = new ASN1OutputStream(bOut); - - try - { - aOut.writeObject(obj); - } - catch (IOException e) - { - throw new IllegalArgumentException("cannot encode object added to SET"); - } - - return bOut.toByteArray(); - } - - protected void sort() - { - if (!isSorted) - { - isSorted = true; - if (set.size() > 1) - { - boolean swapped = true; - int lastSwap = set.size() - 1; - - while (swapped) - { - int index = 0; - int swapIndex = 0; - byte[] a = getEncoded((ASN1Encodable)set.elementAt(0)); - - swapped = false; - - while (index != lastSwap) - { - byte[] b = getEncoded((ASN1Encodable)set.elementAt(index + 1)); - - if (lessThanOrEqual(a, b)) - { - a = b; - } - else - { - Object o = set.elementAt(index); - - set.setElementAt(set.elementAt(index + 1), index); - set.setElementAt(o, index + 1); - - swapped = true; - swapIndex = index; - } - - index++; - } - - lastSwap = swapIndex; - } - } - } - } - - boolean isConstructed() - { - return true; - } - - abstract void encode(ASN1OutputStream out) - throws IOException; - - public String toString() - { - return set.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SetParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SetParser.java deleted file mode 100644 index 7a29ee9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1SetParser.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public interface ASN1SetParser - extends ASN1Encodable, InMemoryRepresentable -{ - public ASN1Encodable readObject() - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1StreamParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1StreamParser.java deleted file mode 100644 index 07b589f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1StreamParser.java +++ /dev/null @@ -1,247 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class ASN1StreamParser -{ - private final InputStream _in; - private final int _limit; - private final byte[][] tmpBuffers; - - public ASN1StreamParser( - InputStream in) - { - this(in, StreamUtil.findLimit(in)); - } - - public ASN1StreamParser( - InputStream in, - int limit) - { - this._in = in; - this._limit = limit; - - this.tmpBuffers = new byte[11][]; - } - - public ASN1StreamParser( - byte[] encoding) - { - this(new ByteArrayInputStream(encoding), encoding.length); - } - - ASN1Encodable readIndef(int tagValue) throws IOException - { - // Note: INDEF => CONSTRUCTED - - // TODO There are other tags that may be constructed (e.g. BIT_STRING) - switch (tagValue) - { - case BERTags.EXTERNAL: - return new DERExternalParser(this); - case BERTags.OCTET_STRING: - return new BEROctetStringParser(this); - case BERTags.SEQUENCE: - return new BERSequenceParser(this); - case BERTags.SET: - return new BERSetParser(this); - default: - throw new ASN1Exception("unknown BER object encountered: 0x" + Integer.toHexString(tagValue)); - } - } - - ASN1Encodable readImplicit(boolean constructed, int tag) throws IOException - { - if (_in instanceof IndefiniteLengthInputStream) - { - if (!constructed) - { - throw new IOException("indefinite length primitive encoding encountered"); - } - - return readIndef(tag); - } - - if (constructed) - { - switch (tag) - { - case BERTags.SET: - return new DERSetParser(this); - case BERTags.SEQUENCE: - return new DERSequenceParser(this); - case BERTags.OCTET_STRING: - return new BEROctetStringParser(this); - } - } - else - { - switch (tag) - { - case BERTags.SET: - throw new ASN1Exception("sequences must use constructed encoding (see X.690 8.9.1/8.10.1)"); - case BERTags.SEQUENCE: - throw new ASN1Exception("sets must use constructed encoding (see X.690 8.11.1/8.12.1)"); - case BERTags.OCTET_STRING: - return new DEROctetStringParser((DefiniteLengthInputStream)_in); - } - } - - // TODO ASN1Exception - throw new RuntimeException("implicit tagging not implemented"); - } - - ASN1Primitive readTaggedObject(boolean constructed, int tag) throws IOException - { - if (!constructed) - { - // Note: !CONSTRUCTED => IMPLICIT - DefiniteLengthInputStream defIn = (DefiniteLengthInputStream)_in; - return new DERTaggedObject(false, tag, new DEROctetString(defIn.toByteArray())); - } - - ASN1EncodableVector v = readVector(); - - if (_in instanceof IndefiniteLengthInputStream) - { - return v.size() == 1 - ? new BERTaggedObject(true, tag, v.get(0)) - : new BERTaggedObject(false, tag, BERFactory.createSequence(v)); - } - - return v.size() == 1 - ? new DERTaggedObject(true, tag, v.get(0)) - : new DERTaggedObject(false, tag, DERFactory.createSequence(v)); - } - - public ASN1Encodable readObject() - throws IOException - { - int tag = _in.read(); - if (tag == -1) - { - return null; - } - - // - // turn of looking for "00" while we resolve the tag - // - set00Check(false); - - // - // calculate tag number - // - int tagNo = ASN1InputStream.readTagNumber(_in, tag); - - boolean isConstructed = (tag & BERTags.CONSTRUCTED) != 0; - - // - // calculate length - // - int length = ASN1InputStream.readLength(_in, _limit); - - if (length < 0) // indefinite length method - { - if (!isConstructed) - { - throw new IOException("indefinite length primitive encoding encountered"); - } - - IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit); - ASN1StreamParser sp = new ASN1StreamParser(indIn, _limit); - - if ((tag & BERTags.APPLICATION) != 0) - { - return new BERApplicationSpecificParser(tagNo, sp); - } - - if ((tag & BERTags.TAGGED) != 0) - { - return new BERTaggedObjectParser(true, tagNo, sp); - } - - return sp.readIndef(tagNo); - } - else - { - DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length); - - if ((tag & BERTags.APPLICATION) != 0) - { - return new DERApplicationSpecific(isConstructed, tagNo, defIn.toByteArray()); - } - - if ((tag & BERTags.TAGGED) != 0) - { - return new BERTaggedObjectParser(isConstructed, tagNo, new ASN1StreamParser(defIn)); - } - - if (isConstructed) - { - // TODO There are other tags that may be constructed (e.g. BIT_STRING) - switch (tagNo) - { - case BERTags.OCTET_STRING: - // - // yes, people actually do this... - // - return new BEROctetStringParser(new ASN1StreamParser(defIn)); - case BERTags.SEQUENCE: - return new DERSequenceParser(new ASN1StreamParser(defIn)); - case BERTags.SET: - return new DERSetParser(new ASN1StreamParser(defIn)); - case BERTags.EXTERNAL: - return new DERExternalParser(new ASN1StreamParser(defIn)); - default: - throw new IOException("unknown tag " + tagNo + " encountered"); - } - } - - // Some primitive encodings can be handled by parsers too... - switch (tagNo) - { - case BERTags.OCTET_STRING: - return new DEROctetStringParser(defIn); - } - - try - { - return ASN1InputStream.createPrimitiveDERObject(tagNo, defIn, tmpBuffers); - } - catch (IllegalArgumentException e) - { - throw new ASN1Exception("corrupted stream detected", e); - } - } - } - - private void set00Check(boolean enabled) - { - if (_in instanceof IndefiniteLengthInputStream) - { - ((IndefiniteLengthInputStream)_in).setEofOn00(enabled); - } - } - - ASN1EncodableVector readVector() throws IOException - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - ASN1Encodable obj; - while ((obj = readObject()) != null) - { - if (obj instanceof InMemoryRepresentable) - { - v.add(((InMemoryRepresentable)obj).getLoadedObject()); - } - else - { - v.add(obj.toASN1Primitive()); - } - } - - return v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1String.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1String.java deleted file mode 100644 index 187f364..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1String.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bc.asn1; - -public interface ASN1String -{ - public String getString(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObject.java deleted file mode 100644 index 5fcff1c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObject.java +++ /dev/null @@ -1,236 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -/** - * ASN.1 TaggedObject - in ASN.1 notation this is any object preceded by - * a [n] where n is some number - these are assumed to follow the construction - * rules (as with sequences). - */ -public abstract class ASN1TaggedObject - extends ASN1Primitive - implements ASN1TaggedObjectParser -{ - int tagNo; - boolean empty = false; - boolean explicit = true; - ASN1Encodable obj = null; - - static public ASN1TaggedObject getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - if (explicit) - { - return (ASN1TaggedObject)obj.getObject(); - } - - throw new IllegalArgumentException("implicitly tagged tagged object"); - } - - static public ASN1TaggedObject getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1TaggedObject) - { - return (ASN1TaggedObject)obj; - } - else if (obj instanceof byte[]) - { - try - { - return ASN1TaggedObject.getInstance(fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct tagged object from byte[]: " + e.getMessage()); - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - /** - * Create a tagged object with the style given by the value of explicit. - *

    - * If the object implements ASN1Choice the tag style will always be changed - * to explicit in accordance with the ASN.1 encoding rules. - *

    - * @param explicit true if the object is explicitly tagged. - * @param tagNo the tag number for this object. - * @param obj the tagged object. - */ - public ASN1TaggedObject( - boolean explicit, - int tagNo, - ASN1Encodable obj) - { - if (obj instanceof ASN1Choice) - { - this.explicit = true; - } - else - { - this.explicit = explicit; - } - - this.tagNo = tagNo; - - if (this.explicit) - { - this.obj = obj; - } - else - { - ASN1Primitive prim = obj.toASN1Primitive(); - - if (prim instanceof ASN1Set) - { - ASN1Set s = null; - } - - this.obj = obj; - } - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof ASN1TaggedObject)) - { - return false; - } - - ASN1TaggedObject other = (ASN1TaggedObject)o; - - if (tagNo != other.tagNo || empty != other.empty || explicit != other.explicit) - { - return false; - } - - if(obj == null) - { - if (other.obj != null) - { - return false; - } - } - else - { - if (!(obj.toASN1Primitive().equals(other.obj.toASN1Primitive()))) - { - return false; - } - } - - return true; - } - - public int hashCode() - { - int code = tagNo; - - // TODO: actually this is wrong - the problem is that a re-encoded - // object may end up with a different hashCode due to implicit - // tagging. As implicit tagging is ambiguous if a sequence is involved - // it seems the only correct method for both equals and hashCode is to - // compare the encodings... - if (obj != null) - { - code ^= obj.hashCode(); - } - - return code; - } - - public int getTagNo() - { - return tagNo; - } - - /** - * return whether or not the object may be explicitly tagged. - *

    - * Note: if the object has been read from an input stream, the only - * time you can be sure if isExplicit is returning the true state of - * affairs is if it returns false. An implicitly tagged object may appear - * to be explicitly tagged, so you need to understand the context under - * which the reading was done as well, see getObject below. - */ - public boolean isExplicit() - { - return explicit; - } - - public boolean isEmpty() - { - return empty; - } - - /** - * return whatever was following the tag. - *

    - * Note: tagged objects are generally context dependent if you're - * trying to extract a tagged object you should be going via the - * appropriate getInstance method. - */ - public ASN1Primitive getObject() - { - if (obj != null) - { - return obj.toASN1Primitive(); - } - - return null; - } - - /** - * Return the object held in this tagged object as a parser assuming it has - * the type of the passed in tag. If the object doesn't have a parser - * associated with it, the base object is returned. - */ - public ASN1Encodable getObjectParser( - int tag, - boolean isExplicit) - { - switch (tag) - { - case BERTags.SET: - return ASN1Set.getInstance(this, isExplicit).parser(); - case BERTags.SEQUENCE: - return ASN1Sequence.getInstance(this, isExplicit).parser(); - case BERTags.OCTET_STRING: - return ASN1OctetString.getInstance(this, isExplicit).parser(); - } - - if (isExplicit) - { - return getObject(); - } - - throw new RuntimeException("implicit tagging not implemented for tag: " + tag); - } - - public ASN1Primitive getLoadedObject() - { - return this.toASN1Primitive(); - } - - ASN1Primitive toDERObject() - { - return new DERTaggedObject(explicit, tagNo, obj); - } - - ASN1Primitive toDLObject() - { - return new DLTaggedObject(explicit, tagNo, obj); - } - - abstract void encode(ASN1OutputStream out) - throws IOException; - - public String toString() - { - return "[" + tagNo + "]" + obj; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObjectParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObjectParser.java deleted file mode 100644 index 93d5378..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1TaggedObjectParser.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public interface ASN1TaggedObjectParser - extends ASN1Encodable, InMemoryRepresentable -{ - public int getTagNo(); - - public ASN1Encodable getObjectParser(int tag, boolean isExplicit) - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1UTCTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1UTCTime.java deleted file mode 100644 index c6eff82..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ASN1UTCTime.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1; - -import java.util.Date; - -public class ASN1UTCTime - extends DERUTCTime -{ - ASN1UTCTime(byte[] bytes) - { - super(bytes); - } - - public ASN1UTCTime(Date time) - { - super(time); - } - - public ASN1UTCTime(String time) - { - super(time); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecific.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecific.java deleted file mode 100644 index 5510f2e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecific.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.asn1; - -public class BERApplicationSpecific - extends DERApplicationSpecific -{ - public BERApplicationSpecific(int tagNo, ASN1EncodableVector vec) - { - super(tagNo, vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecificParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecificParser.java deleted file mode 100644 index 293edf1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERApplicationSpecificParser.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class BERApplicationSpecificParser - implements ASN1ApplicationSpecificParser -{ - private final int tag; - private final ASN1StreamParser parser; - - BERApplicationSpecificParser(int tag, ASN1StreamParser parser) - { - this.tag = tag; - this.parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new BERApplicationSpecific(tag, parser.readVector()); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException(e.getMessage(), e); - } - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERConstructedOctetString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERConstructedOctetString.java deleted file mode 100644 index d0ad7ed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERConstructedOctetString.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Vector; - -/** - * @deprecated use BEROctetString - */ -public class BERConstructedOctetString - extends BEROctetString -{ - private static final int MAX_LENGTH = 1000; - - /** - * convert a vector of octet strings into a single byte string - */ - static private byte[] toBytes( - Vector octs) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - for (int i = 0; i != octs.size(); i++) - { - try - { - DEROctetString o = (DEROctetString)octs.elementAt(i); - - bOut.write(o.getOctets()); - } - catch (ClassCastException e) - { - throw new IllegalArgumentException(octs.elementAt(i).getClass().getName() + " found in input should only contain DEROctetString"); - } - catch (IOException e) - { - throw new IllegalArgumentException("exception converting octets " + e.toString()); - } - } - - return bOut.toByteArray(); - } - - private Vector octs; - - /** - * @param string the octets making up the octet string. - */ - public BERConstructedOctetString( - byte[] string) - { - super(string); - } - - public BERConstructedOctetString( - Vector octs) - { - super(toBytes(octs)); - - this.octs = octs; - } - - public BERConstructedOctetString( - ASN1Primitive obj) - { - super(toByteArray(obj)); - } - - private static byte[] toByteArray(ASN1Primitive obj) - { - try - { - return obj.getEncoded(); - } - catch (IOException e) - { - throw new IllegalArgumentException("Unable to encode object"); - } - } - - public BERConstructedOctetString( - ASN1Encodable obj) - { - this(obj.toASN1Primitive()); - } - - public byte[] getOctets() - { - return string; - } - - /** - * return the DER octets that make up this string. - */ - public Enumeration getObjects() - { - if (octs == null) - { - return generateOcts().elements(); - } - - return octs.elements(); - } - - private Vector generateOcts() - { - Vector vec = new Vector(); - for (int i = 0; i < string.length; i += MAX_LENGTH) - { - int end; - - if (i + MAX_LENGTH > string.length) - { - end = string.length; - } - else - { - end = i + MAX_LENGTH; - } - - byte[] nStr = new byte[end - i]; - - System.arraycopy(string, i, nStr, 0, nStr.length); - - vec.addElement(new DEROctetString(nStr)); - } - - return vec; - } - - public static BEROctetString fromSequence(ASN1Sequence seq) - { - Vector v = new Vector(); - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - v.addElement(e.nextElement()); - } - - return new BERConstructedOctetString(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERFactory.java deleted file mode 100644 index 41d4d51..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.asn1; - -class BERFactory -{ - static final BERSequence EMPTY_SEQUENCE = new BERSequence(); - static final BERSet EMPTY_SET = new BERSet(); - - static BERSequence createSequence(ASN1EncodableVector v) - { - return v.size() < 1 ? EMPTY_SEQUENCE : new BERSequence(v); - } - - static BERSet createSet(ASN1EncodableVector v) - { - return v.size() < 1 ? EMPTY_SET : new BERSet(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERGenerator.java deleted file mode 100644 index d143647..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERGenerator.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -public class BERGenerator - extends ASN1Generator -{ - private boolean _tagged = false; - private boolean _isExplicit; - private int _tagNo; - - protected BERGenerator( - OutputStream out) - { - super(out); - } - - public BERGenerator( - OutputStream out, - int tagNo, - boolean isExplicit) - { - super(out); - - _tagged = true; - _isExplicit = isExplicit; - _tagNo = tagNo; - } - - public OutputStream getRawOutputStream() - { - return _out; - } - - private void writeHdr( - int tag) - throws IOException - { - _out.write(tag); - _out.write(0x80); - } - - protected void writeBERHeader( - int tag) - throws IOException - { - if (_tagged) - { - int tagNum = _tagNo | BERTags.TAGGED; - - if (_isExplicit) - { - writeHdr(tagNum | BERTags.CONSTRUCTED); - writeHdr(tag); - } - else - { - if ((tag & BERTags.CONSTRUCTED) != 0) - { - writeHdr(tagNum | BERTags.CONSTRUCTED); - } - else - { - writeHdr(tagNum); - } - } - } - else - { - writeHdr(tag); - } - } - - protected void writeBERBody( - InputStream contentStream) - throws IOException - { - int ch; - - while ((ch = contentStream.read()) >= 0) - { - _out.write(ch); - } - } - - protected void writeBEREnd() - throws IOException - { - _out.write(0x00); - _out.write(0x00); - - if (_tagged && _isExplicit) // write extra end for tag header - { - _out.write(0x00); - _out.write(0x00); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetString.java deleted file mode 100644 index 49f71fe..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetString.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Vector; - -public class BEROctetString - extends ASN1OctetString -{ - private static final int MAX_LENGTH = 1000; - - private ASN1OctetString[] octs; - - /** - * convert a vector of octet strings into a single byte string - */ - static private byte[] toBytes( - ASN1OctetString[] octs) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - for (int i = 0; i != octs.length; i++) - { - try - { - DEROctetString o = (DEROctetString)octs[i]; - - bOut.write(o.getOctets()); - } - catch (ClassCastException e) - { - throw new IllegalArgumentException(octs[i].getClass().getName() + " found in input should only contain DEROctetString"); - } - catch (IOException e) - { - throw new IllegalArgumentException("exception converting octets " + e.toString()); - } - } - - return bOut.toByteArray(); - } - - /** - * @param string the octets making up the octet string. - */ - public BEROctetString( - byte[] string) - { - super(string); - } - - public BEROctetString( - ASN1OctetString[] octs) - { - super(toBytes(octs)); - - this.octs = octs; - } - - public byte[] getOctets() - { - return string; - } - - /** - * return the DER octets that make up this string. - */ - public Enumeration getObjects() - { - if (octs == null) - { - return generateOcts().elements(); - } - - return new Enumeration() - { - int counter = 0; - - public boolean hasMoreElements() - { - return counter < octs.length; - } - - public Object nextElement() - { - return octs[counter++]; - } - }; - } - - private Vector generateOcts() - { - Vector vec = new Vector(); - for (int i = 0; i < string.length; i += MAX_LENGTH) - { - int end; - - if (i + MAX_LENGTH > string.length) - { - end = string.length; - } - else - { - end = i + MAX_LENGTH; - } - - byte[] nStr = new byte[end - i]; - - System.arraycopy(string, i, nStr, 0, nStr.length); - - vec.addElement(new DEROctetString(nStr)); - } - - return vec; - } - - boolean isConstructed() - { - return true; - } - - int encodedLength() - throws IOException - { - int length = 0; - for (Enumeration e = getObjects(); e.hasMoreElements();) - { - length += ((ASN1Encodable)e.nextElement()).toASN1Primitive().encodedLength(); - } - - return 2 + length + 2; - } - - public void encode( - ASN1OutputStream out) - throws IOException - { - out.write(BERTags.CONSTRUCTED | BERTags.OCTET_STRING); - - out.write(0x80); - - // - // write out the octet array - // - for (Enumeration e = getObjects(); e.hasMoreElements();) - { - out.writeObject((ASN1Encodable)e.nextElement()); - } - - out.write(0x00); - out.write(0x00); - } - - static BEROctetString fromSequence(ASN1Sequence seq) - { - ASN1OctetString[] v = new ASN1OctetString[seq.size()]; - Enumeration e = seq.getObjects(); - int index = 0; - - while (e.hasMoreElements()) - { - v[index++] = (ASN1OctetString)e.nextElement(); - } - - return new BEROctetString(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringGenerator.java deleted file mode 100644 index 2c16db5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringGenerator.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -public class BEROctetStringGenerator - extends BERGenerator -{ - public BEROctetStringGenerator(OutputStream out) - throws IOException - { - super(out); - - writeBERHeader(BERTags.CONSTRUCTED | BERTags.OCTET_STRING); - } - - public BEROctetStringGenerator( - OutputStream out, - int tagNo, - boolean isExplicit) - throws IOException - { - super(out, tagNo, isExplicit); - - writeBERHeader(BERTags.CONSTRUCTED | BERTags.OCTET_STRING); - } - - public OutputStream getOctetOutputStream() - { - return getOctetOutputStream(new byte[1000]); // limit for CER encoding. - } - - public OutputStream getOctetOutputStream( - byte[] buf) - { - return new BufferedBEROctetStream(buf); - } - - private class BufferedBEROctetStream - extends OutputStream - { - private byte[] _buf; - private int _off; - private DEROutputStream _derOut; - - BufferedBEROctetStream( - byte[] buf) - { - _buf = buf; - _off = 0; - _derOut = new DEROutputStream(_out); - } - - public void write( - int b) - throws IOException - { - _buf[_off++] = (byte)b; - - if (_off == _buf.length) - { - DEROctetString.encode(_derOut, _buf); - _off = 0; - } - } - - public void write(byte[] b, int off, int len) throws IOException - { - while (len > 0) - { - int numToCopy = Math.min(len, _buf.length - _off); - System.arraycopy(b, off, _buf, _off, numToCopy); - - _off += numToCopy; - if (_off < _buf.length) - { - break; - } - - DEROctetString.encode(_derOut, _buf); - _off = 0; - - off += numToCopy; - len -= numToCopy; - } - } - - public void close() - throws IOException - { - if (_off != 0) - { - byte[] bytes = new byte[_off]; - System.arraycopy(_buf, 0, bytes, 0, _off); - - DEROctetString.encode(_derOut, bytes); - } - - writeBEREnd(); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringParser.java deleted file mode 100644 index 3dde143..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROctetStringParser.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.InputStream; - -import org.bc.util.io.Streams; - -public class BEROctetStringParser - implements ASN1OctetStringParser -{ - private ASN1StreamParser _parser; - - BEROctetStringParser( - ASN1StreamParser parser) - { - _parser = parser; - } - - public InputStream getOctetStream() - { - return new ConstructedOctetStream(_parser); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new BEROctetString(Streams.readAll(getOctetStream())); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException("IOException converting stream to byte array: " + e.getMessage(), e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROutputStream.java deleted file mode 100644 index 787f1bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BEROutputStream.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -public class BEROutputStream - extends DEROutputStream -{ - public BEROutputStream( - OutputStream os) - { - super(os); - } - - public void writeObject( - Object obj) - throws IOException - { - if (obj == null) - { - writeNull(); - } - else if (obj instanceof ASN1Primitive) - { - ((ASN1Primitive)obj).encode(this); - } - else if (obj instanceof ASN1Encodable) - { - ((ASN1Encodable)obj).toASN1Primitive().encode(this); - } - else - { - throw new IOException("object not BEREncodable"); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequence.java deleted file mode 100644 index cdfb4e7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequence.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -public class BERSequence - extends ASN1Sequence -{ - /** - * create an empty sequence - */ - public BERSequence() - { - } - - /** - * create a sequence containing one object - */ - public BERSequence( - ASN1Encodable obj) - { - super(obj); - } - - /** - * create a sequence containing a vector of objects. - */ - public BERSequence( - ASN1EncodableVector v) - { - super(v); - } - - /** - * create a sequence containing an array of objects. - */ - public BERSequence( - ASN1Encodable[] array) - { - super(array); - } - - int encodedLength() - throws IOException - { - int length = 0; - for (Enumeration e = getObjects(); e.hasMoreElements();) - { - length += ((ASN1Encodable)e.nextElement()).toASN1Primitive().encodedLength(); - } - - return 2 + length + 2; - } - - /* - */ - void encode( - ASN1OutputStream out) - throws IOException - { - out.write(BERTags.SEQUENCE | BERTags.CONSTRUCTED); - out.write(0x80); - - Enumeration e = getObjects(); - while (e.hasMoreElements()) - { - out.writeObject((ASN1Encodable)e.nextElement()); - } - - out.write(0x00); - out.write(0x00); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceGenerator.java deleted file mode 100644 index 29cedcf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceGenerator.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -public class BERSequenceGenerator - extends BERGenerator -{ - public BERSequenceGenerator( - OutputStream out) - throws IOException - { - super(out); - - writeBERHeader(BERTags.CONSTRUCTED | BERTags.SEQUENCE); - } - - public BERSequenceGenerator( - OutputStream out, - int tagNo, - boolean isExplicit) - throws IOException - { - super(out, tagNo, isExplicit); - - writeBERHeader(BERTags.CONSTRUCTED | BERTags.SEQUENCE); - } - - public void addObject( - ASN1Encodable object) - throws IOException - { - object.toASN1Primitive().encode(new BEROutputStream(_out)); - } - - public void close() - throws IOException - { - writeBEREnd(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceParser.java deleted file mode 100644 index 37ba30a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSequenceParser.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class BERSequenceParser - implements ASN1SequenceParser -{ - private ASN1StreamParser _parser; - - BERSequenceParser(ASN1StreamParser parser) - { - this._parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return _parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new BERSequence(_parser.readVector()); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new IllegalStateException(e.getMessage()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSet.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSet.java deleted file mode 100644 index a161d60..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSet.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -public class BERSet - extends ASN1Set -{ - /** - * create an empty sequence - */ - public BERSet() - { - } - - /** - * @param obj - a single object that makes up the set. - */ - public BERSet( - ASN1Encodable obj) - { - super(obj); - } - - /** - * @param v - a vector of objects making up the set. - */ - public BERSet( - ASN1EncodableVector v) - { - super(v, false); - } - - /** - * create a set from an array of objects. - */ - public BERSet( - ASN1Encodable[] a) - { - super(a, false); - } - - int encodedLength() - throws IOException - { - int length = 0; - for (Enumeration e = getObjects(); e.hasMoreElements();) - { - length += ((ASN1Encodable)e.nextElement()).toASN1Primitive().encodedLength(); - } - - return 2 + length + 2; - } - - /* - */ - void encode( - ASN1OutputStream out) - throws IOException - { - out.write(BERTags.SET | BERTags.CONSTRUCTED); - out.write(0x80); - - Enumeration e = getObjects(); - while (e.hasMoreElements()) - { - out.writeObject((ASN1Encodable)e.nextElement()); - } - - out.write(0x00); - out.write(0x00); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSetParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSetParser.java deleted file mode 100644 index 49d6638..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERSetParser.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class BERSetParser - implements ASN1SetParser -{ - private ASN1StreamParser _parser; - - BERSetParser(ASN1StreamParser parser) - { - this._parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return _parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new BERSet(_parser.readVector()); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException(e.getMessage(), e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObject.java deleted file mode 100644 index 24a8882..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObject.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -/** - * BER TaggedObject - in ASN.1 notation this is any object preceded by - * a [n] where n is some number - these are assumed to follow the construction - * rules (as with sequences). - */ -public class BERTaggedObject - extends ASN1TaggedObject -{ - /** - * @param tagNo the tag number for this object. - * @param obj the tagged object. - */ - public BERTaggedObject( - int tagNo, - ASN1Encodable obj) - { - super(true, tagNo, obj); - } - - /** - * @param explicit true if an explicitly tagged object. - * @param tagNo the tag number for this object. - * @param obj the tagged object. - */ - public BERTaggedObject( - boolean explicit, - int tagNo, - ASN1Encodable obj) - { - super(explicit, tagNo, obj); - } - - /** - * create an implicitly tagged object that contains a zero - * length sequence. - */ - public BERTaggedObject( - int tagNo) - { - super(false, tagNo, new BERSequence()); - } - - boolean isConstructed() - { - if (!empty) - { - if (explicit) - { - return true; - } - else - { - ASN1Primitive primitive = obj.toASN1Primitive().toDERObject(); - - return primitive.isConstructed(); - } - } - else - { - return true; - } - } - - int encodedLength() - throws IOException - { - if (!empty) - { - ASN1Primitive primitive = obj.toASN1Primitive(); - int length = primitive.encodedLength(); - - if (explicit) - { - return StreamUtil.calculateTagLength(tagNo) + StreamUtil.calculateBodyLength(length) + length; - } - else - { - // header length already in calculation - length = length - 1; - - return StreamUtil.calculateTagLength(tagNo) + length; - } - } - else - { - return StreamUtil.calculateTagLength(tagNo) + 1; - } - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeTag(BERTags.CONSTRUCTED | BERTags.TAGGED, tagNo); - out.write(0x80); - - if (!empty) - { - if (!explicit) - { - Enumeration e; - if (obj instanceof ASN1OctetString) - { - if (obj instanceof BEROctetString) - { - e = ((BEROctetString)obj).getObjects(); - } - else - { - ASN1OctetString octs = (ASN1OctetString)obj; - BEROctetString berO = new BEROctetString(octs.getOctets()); - e = berO.getObjects(); - } - } - else if (obj instanceof ASN1Sequence) - { - e = ((ASN1Sequence)obj).getObjects(); - } - else if (obj instanceof ASN1Set) - { - e = ((ASN1Set)obj).getObjects(); - } - else - { - throw new RuntimeException("not implemented: " + obj.getClass().getName()); - } - - while (e.hasMoreElements()) - { - out.writeObject((ASN1Encodable)e.nextElement()); - } - } - else - { - out.writeObject(obj); - } - } - - out.write(0x00); - out.write(0x00); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObjectParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObjectParser.java deleted file mode 100644 index c2b8ae0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTaggedObjectParser.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class BERTaggedObjectParser - implements ASN1TaggedObjectParser -{ - private boolean _constructed; - private int _tagNumber; - private ASN1StreamParser _parser; - - BERTaggedObjectParser( - boolean constructed, - int tagNumber, - ASN1StreamParser parser) - { - _constructed = constructed; - _tagNumber = tagNumber; - _parser = parser; - } - - public boolean isConstructed() - { - return _constructed; - } - - public int getTagNo() - { - return _tagNumber; - } - - public ASN1Encodable getObjectParser( - int tag, - boolean isExplicit) - throws IOException - { - if (isExplicit) - { - if (!_constructed) - { - throw new IOException("Explicit tags must be constructed (see X.690 8.14.2)"); - } - return _parser.readObject(); - } - - return _parser.readImplicit(_constructed, tag); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return _parser.readTaggedObject(_constructed, _tagNumber); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return this.getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException(e.getMessage()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTags.java deleted file mode 100644 index 9a7e969..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/BERTags.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.asn1; - -public interface BERTags -{ - public static final int BOOLEAN = 0x01; - public static final int INTEGER = 0x02; - public static final int BIT_STRING = 0x03; - public static final int OCTET_STRING = 0x04; - public static final int NULL = 0x05; - public static final int OBJECT_IDENTIFIER = 0x06; - public static final int EXTERNAL = 0x08; - public static final int ENUMERATED = 0x0a; - public static final int SEQUENCE = 0x10; - public static final int SEQUENCE_OF = 0x10; // for completeness - public static final int SET = 0x11; - public static final int SET_OF = 0x11; // for completeness - - - public static final int NUMERIC_STRING = 0x12; - public static final int PRINTABLE_STRING = 0x13; - public static final int T61_STRING = 0x14; - public static final int VIDEOTEX_STRING = 0x15; - public static final int IA5_STRING = 0x16; - public static final int UTC_TIME = 0x17; - public static final int GENERALIZED_TIME = 0x18; - public static final int GRAPHIC_STRING = 0x19; - public static final int VISIBLE_STRING = 0x1a; - public static final int GENERAL_STRING = 0x1b; - public static final int UNIVERSAL_STRING = 0x1c; - public static final int BMP_STRING = 0x1e; - public static final int UTF8_STRING = 0x0c; - - public static final int CONSTRUCTED = 0x20; - public static final int APPLICATION = 0x40; - public static final int TAGGED = 0x80; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ConstructedOctetStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ConstructedOctetStream.java deleted file mode 100644 index b690e69..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ConstructedOctetStream.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.InputStream; - -class ConstructedOctetStream - extends InputStream -{ - private final ASN1StreamParser _parser; - - private boolean _first = true; - private InputStream _currentStream; - - ConstructedOctetStream( - ASN1StreamParser parser) - { - _parser = parser; - } - - public int read(byte[] b, int off, int len) throws IOException - { - if (_currentStream == null) - { - if (!_first) - { - return -1; - } - - ASN1OctetStringParser s = (ASN1OctetStringParser)_parser.readObject(); - - if (s == null) - { - return -1; - } - - _first = false; - _currentStream = s.getOctetStream(); - } - - int totalRead = 0; - - for (;;) - { - int numRead = _currentStream.read(b, off + totalRead, len - totalRead); - - if (numRead >= 0) - { - totalRead += numRead; - - if (totalRead == len) - { - return totalRead; - } - } - else - { - ASN1OctetStringParser aos = (ASN1OctetStringParser)_parser.readObject(); - - if (aos == null) - { - _currentStream = null; - return totalRead < 1 ? -1 : totalRead; - } - - _currentStream = aos.getOctetStream(); - } - } - } - - public int read() - throws IOException - { - if (_currentStream == null) - { - if (!_first) - { - return -1; - } - - ASN1OctetStringParser s = (ASN1OctetStringParser)_parser.readObject(); - - if (s == null) - { - return -1; - } - - _first = false; - _currentStream = s.getOctetStream(); - } - - for (;;) - { - int b = _currentStream.read(); - - if (b >= 0) - { - return b; - } - - ASN1OctetStringParser s = (ASN1OctetStringParser)_parser.readObject(); - - if (s == null) - { - _currentStream = null; - return -1; - } - - _currentStream = s.getOctetStream(); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERApplicationSpecific.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERApplicationSpecific.java deleted file mode 100644 index 1788ce4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERApplicationSpecific.java +++ /dev/null @@ -1,276 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.bc.util.Arrays; - -/** - * Base class for an application specific object - */ -public class DERApplicationSpecific - extends ASN1Primitive -{ - private final boolean isConstructed; - private final int tag; - private final byte[] octets; - - DERApplicationSpecific( - boolean isConstructed, - int tag, - byte[] octets) - { - this.isConstructed = isConstructed; - this.tag = tag; - this.octets = octets; - } - - public DERApplicationSpecific( - int tag, - byte[] octets) - { - this(false, tag, octets); - } - - public DERApplicationSpecific( - int tag, - ASN1Encodable object) - throws IOException - { - this(true, tag, object); - } - - public DERApplicationSpecific( - boolean explicit, - int tag, - ASN1Encodable object) - throws IOException - { - ASN1Primitive primitive = object.toASN1Primitive(); - - byte[] data = primitive.getEncoded(ASN1Encoding.DER); - - this.isConstructed = explicit || (primitive instanceof ASN1Set || primitive instanceof ASN1Sequence); - this.tag = tag; - - if (explicit) - { - this.octets = data; - } - else - { - int lenBytes = getLengthOfHeader(data); - byte[] tmp = new byte[data.length - lenBytes]; - System.arraycopy(data, lenBytes, tmp, 0, tmp.length); - this.octets = tmp; - } - } - - public DERApplicationSpecific(int tagNo, ASN1EncodableVector vec) - { - this.tag = tagNo; - this.isConstructed = true; - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - for (int i = 0; i != vec.size(); i++) - { - try - { - bOut.write(((ASN1Object)vec.get(i)).getEncoded(ASN1Encoding.DER)); - } - catch (IOException e) - { - throw new ASN1ParsingException("malformed object: " + e, e); - } - } - this.octets = bOut.toByteArray(); - } - - public static DERApplicationSpecific getInstance(Object obj) - { - if (obj == null || obj instanceof DERApplicationSpecific) - { - return (DERApplicationSpecific)obj; - } - else if (obj instanceof byte[]) - { - try - { - return DERApplicationSpecific.getInstance(ASN1Primitive.fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("failed to construct object from byte[]: " + e.getMessage()); - } - } - else if (obj instanceof ASN1Encodable) - { - ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); - - if (primitive instanceof ASN1Sequence) - { - return (DERApplicationSpecific)primitive; - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - private int getLengthOfHeader(byte[] data) - { - int length = data[1] & 0xff; // TODO: assumes 1 byte tag - - if (length == 0x80) - { - return 2; // indefinite-length encoding - } - - if (length > 127) - { - int size = length & 0x7f; - - // Note: The invalid long form "0xff" (see X.690 8.1.3.5c) will be caught here - if (size > 4) - { - throw new IllegalStateException("DER length more than 4 bytes: " + size); - } - - return size + 2; - } - - return 2; - } - - public boolean isConstructed() - { - return isConstructed; - } - - public byte[] getContents() - { - return octets; - } - - public int getApplicationTag() - { - return tag; - } - - /** - * Return the enclosed object assuming explicit tagging. - * - * @return the resulting object - * @throws IOException if reconstruction fails. - */ - public ASN1Primitive getObject() - throws IOException - { - return new ASN1InputStream(getContents()).readObject(); - } - - /** - * Return the enclosed object assuming implicit tagging. - * - * @param derTagNo the type tag that should be applied to the object's contents. - * @return the resulting object - * @throws IOException if reconstruction fails. - */ - public ASN1Primitive getObject(int derTagNo) - throws IOException - { - if (derTagNo >= 0x1f) - { - throw new IOException("unsupported tag number"); - } - - byte[] orig = this.getEncoded(); - byte[] tmp = replaceTagNumber(derTagNo, orig); - - if ((orig[0] & BERTags.CONSTRUCTED) != 0) - { - tmp[0] |= BERTags.CONSTRUCTED; - } - - return new ASN1InputStream(tmp).readObject(); - } - - int encodedLength() - throws IOException - { - return StreamUtil.calculateTagLength(tag) + StreamUtil.calculateBodyLength(octets.length) + octets.length; - } - - /* (non-Javadoc) - * @see org.bouncycastle.asn1.ASN1Primitive#encode(org.bouncycastle.asn1.DEROutputStream) - */ - void encode(ASN1OutputStream out) throws IOException - { - int classBits = BERTags.APPLICATION; - if (isConstructed) - { - classBits |= BERTags.CONSTRUCTED; - } - - out.writeEncoded(classBits, tag, octets); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERApplicationSpecific)) - { - return false; - } - - DERApplicationSpecific other = (DERApplicationSpecific)o; - - return isConstructed == other.isConstructed - && tag == other.tag - && Arrays.areEqual(octets, other.octets); - } - - public int hashCode() - { - return (isConstructed ? 1 : 0) ^ tag ^ Arrays.hashCode(octets); - } - - private byte[] replaceTagNumber(int newTag, byte[] input) - throws IOException - { - int tagNo = input[0] & 0x1f; - int index = 1; - // - // with tagged object tag number is bottom 5 bits, or stored at the start of the content - // - if (tagNo == 0x1f) - { - tagNo = 0; - - int b = input[index++] & 0xff; - - // X.690-0207 8.1.2.4.2 - // "c) bits 7 to 1 of the first subsequent octet shall not all be zero." - if ((b & 0x7f) == 0) // Note: -1 will pass - { - throw new ASN1ParsingException("corrupted stream - invalid high tag number found"); - } - - while ((b >= 0) && ((b & 0x80) != 0)) - { - tagNo |= (b & 0x7f); - tagNo <<= 7; - b = input[index++] & 0xff; - } - - tagNo |= (b & 0x7f); - } - - byte[] tmp = new byte[input.length - index + 1]; - - System.arraycopy(input, index, tmp, 1, tmp.length - 1); - - tmp[0] = (byte)newTag; - - return tmp; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBMPString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBMPString.java deleted file mode 100644 index f172150..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBMPString.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; - -/** - * DER BMPString object. - */ -public class DERBMPString - extends ASN1Primitive - implements ASN1String -{ - private char[] string; - - /** - * return a BMP String from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERBMPString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERBMPString) - { - return (DERBMPString)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERBMPString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a BMP String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERBMPString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERBMPString) - { - return getInstance(o); - } - else - { - return new DERBMPString(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - byte encoded string. - */ - DERBMPString( - byte[] string) - { - char[] cs = new char[string.length / 2]; - - for (int i = 0; i != cs.length; i++) - { - cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff)); - } - - this.string = cs; - } - - DERBMPString(char[] string) - { - this.string = string; - } - - /** - * basic constructor - */ - public DERBMPString( - String string) - { - this.string = string.toCharArray(); - } - - public String getString() - { - return new String(string); - } - - public String toString() - { - return getString(); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - protected boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERBMPString)) - { - return false; - } - - DERBMPString s = (DERBMPString)o; - - return Arrays.areEqual(string, s.string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length * 2) + (string.length * 2); - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.write(BERTags.BMP_STRING); - out.writeLength(string.length * 2); - - for (int i = 0; i != string.length; i++) - { - char c = string[i]; - - out.write((byte)(c >> 8)); - out.write((byte)c); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBitString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBitString.java deleted file mode 100644 index a4d431a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBitString.java +++ /dev/null @@ -1,313 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.util.Arrays; -import org.bc.util.io.Streams; - -public class DERBitString - extends ASN1Primitive - implements ASN1String -{ - private static final char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - - protected byte[] data; - protected int padBits; - - /** - * return the correct number of pad bits for a bit string defined in - * a 32 bit constant - */ - static protected int getPadBits( - int bitString) - { - int val = 0; - for (int i = 3; i >= 0; i--) - { - // - // this may look a little odd, but if it isn't done like this pre jdk1.2 - // JVM's break! - // - if (i != 0) - { - if ((bitString >> (i * 8)) != 0) - { - val = (bitString >> (i * 8)) & 0xFF; - break; - } - } - else - { - if (bitString != 0) - { - val = bitString & 0xFF; - break; - } - } - } - - if (val == 0) - { - return 7; - } - - - int bits = 1; - - while (((val <<= 1) & 0xFF) != 0) - { - bits++; - } - - return 8 - bits; - } - - /** - * return the correct number of bytes for a bit string defined in - * a 32 bit constant - */ - static protected byte[] getBytes(int bitString) - { - int bytes = 4; - for (int i = 3; i >= 1; i--) - { - if ((bitString & (0xFF << (i * 8))) != 0) - { - break; - } - bytes--; - } - - byte[] result = new byte[bytes]; - for (int i = 0; i < bytes; i++) - { - result[i] = (byte) ((bitString >> (i * 8)) & 0xFF); - } - - return result; - } - - /** - * return a Bit String from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERBitString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERBitString) - { - return (DERBitString)obj; - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a Bit String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERBitString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERBitString) - { - return getInstance(o); - } - else - { - return fromOctetString(((ASN1OctetString)o).getOctets()); - } - } - - protected DERBitString( - byte data, - int padBits) - { - this.data = new byte[1]; - this.data[0] = data; - this.padBits = padBits; - } - - /** - * @param data the octets making up the bit string. - * @param padBits the number of extra bits at the end of the string. - */ - public DERBitString( - byte[] data, - int padBits) - { - this.data = data; - this.padBits = padBits; - } - - public DERBitString( - byte[] data) - { - this(data, 0); - } - - public DERBitString( - int value) - { - this.data = getBytes(value); - this.padBits = getPadBits(value); - } - - public DERBitString( - ASN1Encodable obj) - throws IOException - { - this.data = obj.toASN1Primitive().getEncoded(ASN1Encoding.DER); - this.padBits = 0; - } - - public byte[] getBytes() - { - return data; - } - - public int getPadBits() - { - return padBits; - } - - - /** - * @return the value of the bit string as an int (truncating if necessary) - */ - public int intValue() - { - int value = 0; - - for (int i = 0; i != data.length && i != 4; i++) - { - value |= (data[i] & 0xff) << (8 * i); - } - - return value; - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(data.length + 1) + data.length + 1; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - byte[] bytes = new byte[getBytes().length + 1]; - - bytes[0] = (byte)getPadBits(); - System.arraycopy(getBytes(), 0, bytes, 1, bytes.length - 1); - - out.writeEncoded(BERTags.BIT_STRING, bytes); - } - - public int hashCode() - { - return padBits ^ Arrays.hashCode(data); - } - - protected boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERBitString)) - { - return false; - } - - DERBitString other = (DERBitString)o; - - return this.padBits == other.padBits - && Arrays.areEqual(this.data, other.data); - } - - public String getString() - { - StringBuffer buf = new StringBuffer("#"); - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - ASN1OutputStream aOut = new ASN1OutputStream(bOut); - - try - { - aOut.writeObject(this); - } - catch (IOException e) - { - throw new RuntimeException("internal error encoding BitString"); - } - - byte[] string = bOut.toByteArray(); - - for (int i = 0; i != string.length; i++) - { - buf.append(table[(string[i] >>> 4) & 0xf]); - buf.append(table[string[i] & 0xf]); - } - - return buf.toString(); - } - - public String toString() - { - return getString(); - } - - static DERBitString fromOctetString(byte[] bytes) - { - if (bytes.length < 1) - { - throw new IllegalArgumentException("truncated BIT STRING detected"); - } - - int padBits = bytes[0]; - byte[] data = new byte[bytes.length - 1]; - - if (data.length != 0) - { - System.arraycopy(bytes, 1, data, 0, bytes.length - 1); - } - - return new DERBitString(data, padBits); - } - - static DERBitString fromInputStream(int length, InputStream stream) - throws IOException - { - if (length < 1) - { - throw new IllegalArgumentException("truncated BIT STRING detected"); - } - - int padBits = stream.read(); - byte[] data = new byte[length - 1]; - - if (data.length != 0) - { - if (Streams.readFully(stream, data) != data.length) - { - throw new EOFException("EOF encountered in middle of BIT STRING"); - } - } - - return new DERBitString(data, padBits); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBoolean.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBoolean.java deleted file mode 100644 index ea87b14..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERBoolean.java +++ /dev/null @@ -1,179 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; - -public class DERBoolean - extends ASN1Primitive -{ - private static final byte[] TRUE_VALUE = new byte[] { (byte)0xff }; - private static final byte[] FALSE_VALUE = new byte[] { 0 }; - - private byte[] value; - - public static final ASN1Boolean FALSE = new ASN1Boolean(false); - public static final ASN1Boolean TRUE = new ASN1Boolean(true); - - - /** - * return a boolean from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1Boolean getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1Boolean) - { - return (ASN1Boolean)obj; - } - - if (obj instanceof DERBoolean) - { - return ((DERBoolean)obj).isTrue() ? DERBoolean.TRUE : DERBoolean.FALSE; - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a ASN1Boolean from the passed in boolean. - */ - public static ASN1Boolean getInstance( - boolean value) - { - return (value ? TRUE : FALSE); - } - - /** - * return a ASN1Boolean from the passed in boolean. - */ - public static ASN1Boolean getInstance( - int value) - { - return (value != 0 ? TRUE : FALSE); - } - - /** - * return a Boolean from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERBoolean getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERBoolean) - { - return getInstance(o); - } - else - { - return ASN1Boolean.fromOctetString(((ASN1OctetString)o).getOctets()); - } - } - - DERBoolean( - byte[] value) - { - if (value.length != 1) - { - throw new IllegalArgumentException("byte value should have 1 byte in it"); - } - - if (value[0] == 0) - { - this.value = FALSE_VALUE; - } - else if (value[0] == 0xff) - { - this.value = TRUE_VALUE; - } - else - { - this.value = Arrays.clone(value); - } - } - - /** - * @deprecated use getInstance(boolean) method. - * @param value - */ - public DERBoolean( - boolean value) - { - this.value = (value) ? TRUE_VALUE : FALSE_VALUE; - } - - public boolean isTrue() - { - return (value[0] != 0); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 3; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.BOOLEAN, value); - } - - protected boolean asn1Equals( - ASN1Primitive o) - { - if ((o == null) || !(o instanceof DERBoolean)) - { - return false; - } - - return (value[0] == ((DERBoolean)o).value[0]); - } - - public int hashCode() - { - return value[0]; - } - - - public String toString() - { - return (value[0] != 0) ? "TRUE" : "FALSE"; - } - - static ASN1Boolean fromOctetString(byte[] value) - { - if (value.length != 1) - { - throw new IllegalArgumentException("byte value should have 1 byte in it"); - } - - if (value[0] == 0) - { - return FALSE; - } - else if (value[0] == 0xff) - { - return TRUE; - } - else - { - return new ASN1Boolean(value); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREncodableVector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREncodableVector.java deleted file mode 100644 index 9d85b8e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREncodableVector.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.asn1; - -/** - * a general class for building up a vector of DER encodable objects - - * this will eventually be superceded by ASN1EncodableVector so you should - * use that class in preference. - */ -public class DEREncodableVector - extends ASN1EncodableVector -{ - /** - * @deprecated use ASN1EncodableVector instead. - */ - public DEREncodableVector() - { - - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREnumerated.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREnumerated.java deleted file mode 100644 index b2b87ed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEREnumerated.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -public class DEREnumerated - extends ASN1Primitive -{ - byte[] bytes; - - /** - * return an integer from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1Enumerated getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1Enumerated) - { - return (ASN1Enumerated)obj; - } - - if (obj instanceof DEREnumerated) - { - return new ASN1Enumerated(((DEREnumerated)obj).getValue()); - } - - if (obj instanceof byte[]) - { - try - { - return (ASN1Enumerated)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an Enumerated from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DEREnumerated getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DEREnumerated) - { - return getInstance(o); - } - else - { - return fromOctetString(((ASN1OctetString)o).getOctets()); - } - } - - public DEREnumerated( - int value) - { - bytes = BigInteger.valueOf(value).toByteArray(); - } - - public DEREnumerated( - BigInteger value) - { - bytes = value.toByteArray(); - } - - public DEREnumerated( - byte[] bytes) - { - this.bytes = bytes; - } - - public BigInteger getValue() - { - return new BigInteger(bytes); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(bytes.length) + bytes.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.ENUMERATED, bytes); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DEREnumerated)) - { - return false; - } - - DEREnumerated other = (DEREnumerated)o; - - return Arrays.areEqual(this.bytes, other.bytes); - } - - public int hashCode() - { - return Arrays.hashCode(bytes); - } - - private static ASN1Enumerated[] cache = new ASN1Enumerated[12]; - - static ASN1Enumerated fromOctetString(byte[] enc) - { - if (enc.length > 1) - { - return new ASN1Enumerated(Arrays.clone(enc)); - } - - if (enc.length == 0) - { - throw new IllegalArgumentException("ENUMERATED has zero length"); - } - int value = enc[0] & 0xff; - - if (value >= cache.length) - { - return new ASN1Enumerated(Arrays.clone(enc)); - } - - ASN1Enumerated possibleMatch = cache[value]; - - if (possibleMatch == null) - { - possibleMatch = cache[value] = new ASN1Enumerated(Arrays.clone(enc)); - } - - return possibleMatch; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternal.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternal.java deleted file mode 100644 index b392ed1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternal.java +++ /dev/null @@ -1,294 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Class representing the DER-type External - */ -public class DERExternal - extends ASN1Primitive -{ - private ASN1ObjectIdentifier directReference; - private ASN1Integer indirectReference; - private ASN1Primitive dataValueDescriptor; - private int encoding; - private ASN1Primitive externalContent; - - public DERExternal(ASN1EncodableVector vector) - { - int offset = 0; - - ASN1Primitive enc = getObjFromVector(vector, offset); - if (enc instanceof ASN1ObjectIdentifier) - { - directReference = (ASN1ObjectIdentifier)enc; - offset++; - enc = getObjFromVector(vector, offset); - } - if (enc instanceof ASN1Integer) - { - indirectReference = (ASN1Integer) enc; - offset++; - enc = getObjFromVector(vector, offset); - } - if (!(enc instanceof DERTaggedObject)) - { - dataValueDescriptor = (ASN1Primitive) enc; - offset++; - enc = getObjFromVector(vector, offset); - } - - if (vector.size() != offset + 1) - { - throw new IllegalArgumentException("input vector too large"); - } - - if (!(enc instanceof DERTaggedObject)) - { - throw new IllegalArgumentException("No tagged object found in vector. Structure doesn't seem to be of type External"); - } - DERTaggedObject obj = (DERTaggedObject)enc; - setEncoding(obj.getTagNo()); - externalContent = obj.getObject(); - } - - private ASN1Primitive getObjFromVector(ASN1EncodableVector v, int index) - { - if (v.size() <= index) - { - throw new IllegalArgumentException("too few objects in input vector"); - } - - return v.get(index).toASN1Primitive(); - } - /** - * Creates a new instance of DERExternal - * See X.690 for more informations about the meaning of these parameters - * @param directReference The direct reference or null if not set. - * @param indirectReference The indirect reference or null if not set. - * @param dataValueDescriptor The data value descriptor or null if not set. - * @param externalData The external data in its encoded form. - */ - public DERExternal(ASN1ObjectIdentifier directReference, ASN1Integer indirectReference, ASN1Primitive dataValueDescriptor, DERTaggedObject externalData) - { - this(directReference, indirectReference, dataValueDescriptor, externalData.getTagNo(), externalData.toASN1Primitive()); - } - - /** - * Creates a new instance of DERExternal. - * See X.690 for more informations about the meaning of these parameters - * @param directReference The direct reference or null if not set. - * @param indirectReference The indirect reference or null if not set. - * @param dataValueDescriptor The data value descriptor or null if not set. - * @param encoding The encoding to be used for the external data - * @param externalData The external data - */ - public DERExternal(ASN1ObjectIdentifier directReference, ASN1Integer indirectReference, ASN1Primitive dataValueDescriptor, int encoding, ASN1Primitive externalData) - { - setDirectReference(directReference); - setIndirectReference(indirectReference); - setDataValueDescriptor(dataValueDescriptor); - setEncoding(encoding); - setExternalContent(externalData.toASN1Primitive()); - } - - /* (non-Javadoc) - * @see java.lang.Object#hashCode() - */ - public int hashCode() - { - int ret = 0; - if (directReference != null) - { - ret = directReference.hashCode(); - } - if (indirectReference != null) - { - ret ^= indirectReference.hashCode(); - } - if (dataValueDescriptor != null) - { - ret ^= dataValueDescriptor.hashCode(); - } - ret ^= externalContent.hashCode(); - return ret; - } - - boolean isConstructed() - { - return true; - } - - int encodedLength() - throws IOException - { - return this.getEncoded().length; - } - - /* (non-Javadoc) - * @see org.bouncycastle.asn1.ASN1Primitive#encode(org.bouncycastle.asn1.DEROutputStream) - */ - void encode(ASN1OutputStream out) - throws IOException - { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - if (directReference != null) - { - baos.write(directReference.getEncoded(ASN1Encoding.DER)); - } - if (indirectReference != null) - { - baos.write(indirectReference.getEncoded(ASN1Encoding.DER)); - } - if (dataValueDescriptor != null) - { - baos.write(dataValueDescriptor.getEncoded(ASN1Encoding.DER)); - } - DERTaggedObject obj = new DERTaggedObject(true, encoding, externalContent); - baos.write(obj.getEncoded(ASN1Encoding.DER)); - out.writeEncoded(BERTags.CONSTRUCTED, BERTags.EXTERNAL, baos.toByteArray()); - } - - /* (non-Javadoc) - * @see org.bouncycastle.asn1.ASN1Primitive#asn1Equals(org.bouncycastle.asn1.ASN1Primitive) - */ - boolean asn1Equals(ASN1Primitive o) - { - if (!(o instanceof DERExternal)) - { - return false; - } - if (this == o) - { - return true; - } - DERExternal other = (DERExternal)o; - if (directReference != null) - { - if (other.directReference == null || !other.directReference.equals(directReference)) - { - return false; - } - } - if (indirectReference != null) - { - if (other.indirectReference == null || !other.indirectReference.equals(indirectReference)) - { - return false; - } - } - if (dataValueDescriptor != null) - { - if (other.dataValueDescriptor == null || !other.dataValueDescriptor.equals(dataValueDescriptor)) - { - return false; - } - } - return externalContent.equals(other.externalContent); - } - - /** - * Returns the data value descriptor - * @return The descriptor - */ - public ASN1Primitive getDataValueDescriptor() - { - return dataValueDescriptor; - } - - /** - * Returns the direct reference of the external element - * @return The reference - */ - public ASN1ObjectIdentifier getDirectReference() - { - return directReference; - } - - /** - * Returns the encoding of the content. Valid values are - *

      - *
    • 0 single-ASN1-type
    • - *
    • 1 OCTET STRING
    • - *
    • 2 BIT STRING
    • - *
    - * @return The encoding - */ - public int getEncoding() - { - return encoding; - } - - /** - * Returns the content of this element - * @return The content - */ - public ASN1Primitive getExternalContent() - { - return externalContent; - } - - /** - * Returns the indirect reference of this element - * @return The reference - */ - public ASN1Integer getIndirectReference() - { - return indirectReference; - } - - /** - * Sets the data value descriptor - * @param dataValueDescriptor The descriptor - */ - private void setDataValueDescriptor(ASN1Primitive dataValueDescriptor) - { - this.dataValueDescriptor = dataValueDescriptor; - } - - /** - * Sets the direct reference of the external element - * @param directReferemce The reference - */ - private void setDirectReference(ASN1ObjectIdentifier directReferemce) - { - this.directReference = directReferemce; - } - - /** - * Sets the encoding of the content. Valid values are - *
      - *
    • 0 single-ASN1-type
    • - *
    • 1 OCTET STRING
    • - *
    • 2 BIT STRING
    • - *
    - * @param encoding The encoding - */ - private void setEncoding(int encoding) - { - if (encoding < 0 || encoding > 2) - { - throw new IllegalArgumentException("invalid encoding value: " + encoding); - } - this.encoding = encoding; - } - - /** - * Sets the content of this element - * @param externalContent The content - */ - private void setExternalContent(ASN1Primitive externalContent) - { - this.externalContent = externalContent; - } - - /** - * Sets the indirect reference of this element - * @param indirectReference The reference - */ - private void setIndirectReference(ASN1Integer indirectReference) - { - this.indirectReference = indirectReference; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternalParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternalParser.java deleted file mode 100644 index 7001af4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERExternalParser.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class DERExternalParser - implements ASN1Encodable, InMemoryRepresentable -{ - private ASN1StreamParser _parser; - - /** - * - */ - public DERExternalParser(ASN1StreamParser parser) - { - this._parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return _parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - try - { - return new DERExternal(_parser.readVector()); - } - catch (IllegalArgumentException e) - { - throw new ASN1Exception(e.getMessage(), e); - } - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException ioe) - { - throw new ASN1ParsingException("unable to get DER object", ioe); - } - catch (IllegalArgumentException ioe) - { - throw new ASN1ParsingException("unable to get DER object", ioe); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERFactory.java deleted file mode 100644 index fdf3f2e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.asn1; - -class DERFactory -{ - static final ASN1Sequence EMPTY_SEQUENCE = new DERSequence(); - static final ASN1Set EMPTY_SET = new DERSet(); - - static ASN1Sequence createSequence(ASN1EncodableVector v) - { - return v.size() < 1 ? EMPTY_SEQUENCE : new DLSequence(v); - } - - static ASN1Set createSet(ASN1EncodableVector v) - { - return v.size() < 1 ? EMPTY_SET : new DLSet(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralString.java deleted file mode 100644 index d4ee872..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralString.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -public class DERGeneralString - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - public static DERGeneralString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERGeneralString) - { - return (DERGeneralString) obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERGeneralString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - public static DERGeneralString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERGeneralString) - { - return getInstance(o); - } - else - { - return new DERGeneralString(((ASN1OctetString)o).getOctets()); - } - } - - DERGeneralString(byte[] string) - { - this.string = string; - } - - public DERGeneralString(String string) - { - this.string = Strings.toByteArray(string); - } - - public String getString() - { - return Strings.fromByteArray(string); - } - - public String toString() - { - return getString(); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode(ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.GENERAL_STRING, string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - boolean asn1Equals(ASN1Primitive o) - { - if (!(o instanceof DERGeneralString)) - { - return false; - } - DERGeneralString s = (DERGeneralString)o; - - return Arrays.areEqual(string, s.string); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralizedTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralizedTime.java deleted file mode 100644 index a63ad86..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGeneralizedTime.java +++ /dev/null @@ -1,350 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.SimpleTimeZone; -import java.util.TimeZone; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * Generalized time object. - */ -public class DERGeneralizedTime - extends ASN1Primitive -{ - private byte[] time; - - /** - * return a generalized time from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1GeneralizedTime getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1GeneralizedTime) - { - return (ASN1GeneralizedTime)obj; - } - - if (obj instanceof DERGeneralizedTime) - { - return new ASN1GeneralizedTime(((DERGeneralizedTime)obj).time); - } - - if (obj instanceof byte[]) - { - try - { - return (ASN1GeneralizedTime)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a Generalized Time object from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1GeneralizedTime getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERGeneralizedTime) - { - return getInstance(o); - } - else - { - return new ASN1GeneralizedTime(((ASN1OctetString)o).getOctets()); - } - } - - /** - * The correct format for this is YYYYMMDDHHMMSS[.f]Z, or without the Z - * for local time, or Z+-HHMM on the end, for difference between local - * time and UTC time. The fractional second amount f must consist of at - * least one number with trailing zeroes removed. - * - * @param time the time string. - * @exception IllegalArgumentException if String is an illegal format. - */ - public DERGeneralizedTime( - String time) - { - this.time = Strings.toByteArray(time); - try - { - this.getDate(); - } - catch (ParseException e) - { - throw new IllegalArgumentException("invalid date string: " + e.getMessage()); - } - } - - /** - * base constructor from a java.util.date object - */ - public DERGeneralizedTime( - Date time) - { - SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); - - dateF.setTimeZone(new SimpleTimeZone(0,"Z")); - - this.time = Strings.toByteArray(dateF.format(time)); - } - - DERGeneralizedTime( - byte[] bytes) - { - this.time = bytes; - } - - /** - * Return the time. - * @return The time string as it appeared in the encoded object. - */ - public String getTimeString() - { - return Strings.fromByteArray(time); - } - - /** - * return the time - always in the form of - * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm). - *

    - * Normally in a certificate we would expect "Z" rather than "GMT", - * however adding the "GMT" means we can just use: - *

    -     *     dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
    -     * 
    - * To read in the time and get a date which is compatible with our local - * time zone. - */ - public String getTime() - { - String stime = Strings.fromByteArray(time); - - // - // standardise the format. - // - if (stime.charAt(stime.length() - 1) == 'Z') - { - return stime.substring(0, stime.length() - 1) + "GMT+00:00"; - } - else - { - int signPos = stime.length() - 5; - char sign = stime.charAt(signPos); - if (sign == '-' || sign == '+') - { - return stime.substring(0, signPos) - + "GMT" - + stime.substring(signPos, signPos + 3) - + ":" - + stime.substring(signPos + 3); - } - else - { - signPos = stime.length() - 3; - sign = stime.charAt(signPos); - if (sign == '-' || sign == '+') - { - return stime.substring(0, signPos) - + "GMT" - + stime.substring(signPos) - + ":00"; - } - } - } - return stime + calculateGMTOffset(); - } - - private String calculateGMTOffset() - { - String sign = "+"; - TimeZone timeZone = TimeZone.getDefault(); - int offset = timeZone.getRawOffset(); - if (offset < 0) - { - sign = "-"; - offset = -offset; - } - int hours = offset / (60 * 60 * 1000); - int minutes = (offset - (hours * 60 * 60 * 1000)) / (60 * 1000); - - try - { - if (timeZone.useDaylightTime() && timeZone.inDaylightTime(this.getDate())) - { - hours += sign.equals("+") ? 1 : -1; - } - } - catch (ParseException e) - { - // we'll do our best and ignore daylight savings - } - - return "GMT" + sign + convert(hours) + ":" + convert(minutes); - } - - private String convert(int time) - { - if (time < 10) - { - return "0" + time; - } - - return Integer.toString(time); - } - - public Date getDate() - throws ParseException - { - SimpleDateFormat dateF; - String stime = Strings.fromByteArray(time); - String d = stime; - - if (stime.endsWith("Z")) - { - if (hasFractionalSeconds()) - { - dateF = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'"); - } - else - { - dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); - } - - dateF.setTimeZone(new SimpleTimeZone(0, "Z")); - } - else if (stime.indexOf('-') > 0 || stime.indexOf('+') > 0) - { - d = this.getTime(); - if (hasFractionalSeconds()) - { - dateF = new SimpleDateFormat("yyyyMMddHHmmss.SSSz"); - } - else - { - dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); - } - - dateF.setTimeZone(new SimpleTimeZone(0, "Z")); - } - else - { - if (hasFractionalSeconds()) - { - dateF = new SimpleDateFormat("yyyyMMddHHmmss.SSS"); - } - else - { - dateF = new SimpleDateFormat("yyyyMMddHHmmss"); - } - - dateF.setTimeZone(new SimpleTimeZone(0, TimeZone.getDefault().getID())); - } - - if (hasFractionalSeconds()) - { - // java misinterprets extra digits as being milliseconds... - String frac = d.substring(14); - int index; - for (index = 1; index < frac.length(); index++) - { - char ch = frac.charAt(index); - if (!('0' <= ch && ch <= '9')) - { - break; - } - } - - if (index - 1 > 3) - { - frac = frac.substring(0, 4) + frac.substring(index); - d = d.substring(0, 14) + frac; - } - else if (index - 1 == 1) - { - frac = frac.substring(0, index) + "00" + frac.substring(index); - d = d.substring(0, 14) + frac; - } - else if (index - 1 == 2) - { - frac = frac.substring(0, index) + "0" + frac.substring(index); - d = d.substring(0, 14) + frac; - } - } - - return dateF.parse(d); - } - - private boolean hasFractionalSeconds() - { - for (int i = 0; i != time.length; i++) - { - if (time[i] == '.') - { - if (i == 14) - { - return true; - } - } - } - return false; - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - int length = time.length; - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.GENERALIZED_TIME, time); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERGeneralizedTime)) - { - return false; - } - - return Arrays.areEqual(time, ((DERGeneralizedTime)o).time); - } - - public int hashCode() - { - return Arrays.hashCode(time); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGenerator.java deleted file mode 100644 index 2da9d90..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERGenerator.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.util.io.Streams; - -public abstract class DERGenerator - extends ASN1Generator -{ - private boolean _tagged = false; - private boolean _isExplicit; - private int _tagNo; - - protected DERGenerator( - OutputStream out) - { - super(out); - } - - public DERGenerator( - OutputStream out, - int tagNo, - boolean isExplicit) - { - super(out); - - _tagged = true; - _isExplicit = isExplicit; - _tagNo = tagNo; - } - - private void writeLength( - OutputStream out, - int length) - throws IOException - { - if (length > 127) - { - int size = 1; - int val = length; - - while ((val >>>= 8) != 0) - { - size++; - } - - out.write((byte)(size | 0x80)); - - for (int i = (size - 1) * 8; i >= 0; i -= 8) - { - out.write((byte)(length >> i)); - } - } - else - { - out.write((byte)length); - } - } - - void writeDEREncoded( - OutputStream out, - int tag, - byte[] bytes) - throws IOException - { - out.write(tag); - writeLength(out, bytes.length); - out.write(bytes); - } - - void writeDEREncoded( - int tag, - byte[] bytes) - throws IOException - { - if (_tagged) - { - int tagNum = _tagNo | BERTags.TAGGED; - - if (_isExplicit) - { - int newTag = _tagNo | BERTags.CONSTRUCTED | BERTags.TAGGED; - - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - writeDEREncoded(bOut, tag, bytes); - - writeDEREncoded(_out, newTag, bOut.toByteArray()); - } - else - { - if ((tag & BERTags.CONSTRUCTED) != 0) - { - writeDEREncoded(_out, tagNum | BERTags.CONSTRUCTED, bytes); - } - else - { - writeDEREncoded(_out, tagNum, bytes); - } - } - } - else - { - writeDEREncoded(_out, tag, bytes); - } - } - - void writeDEREncoded( - OutputStream out, - int tag, - InputStream in) - throws IOException - { - writeDEREncoded(out, tag, Streams.readAll(in)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERIA5String.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERIA5String.java deleted file mode 100644 index 4c1ef6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERIA5String.java +++ /dev/null @@ -1,183 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER IA5String object - this is an ascii string. - */ -public class DERIA5String - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return a IA5 string from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERIA5String getInstance( - Object obj) - { - if (obj == null || obj instanceof DERIA5String) - { - return (DERIA5String)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERIA5String)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an IA5 String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERIA5String getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERIA5String) - { - return getInstance(o); - } - else - { - return new DERIA5String(((ASN1OctetString)o).getOctets()); - } - } - - /** - * basic constructor - with bytes. - */ - DERIA5String( - byte[] string) - { - this.string = string; - } - - /** - * basic constructor - without validation. - */ - public DERIA5String( - String string) - { - this(string, false); - } - - /** - * Constructor with optional validation. - * - * @param string the base string to wrap. - * @param validate whether or not to check the string. - * @throws IllegalArgumentException if validate is true and the string - * contains characters that should not be in an IA5String. - */ - public DERIA5String( - String string, - boolean validate) - { - if (string == null) - { - throw new NullPointerException("string cannot be null"); - } - if (validate && !isIA5String(string)) - { - throw new IllegalArgumentException("string contains illegal characters"); - } - - this.string = Strings.toByteArray(string); - } - - public String getString() - { - return Strings.fromByteArray(string); - } - - public String toString() - { - return getString(); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.IA5_STRING, string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERIA5String)) - { - return false; - } - - DERIA5String s = (DERIA5String)o; - - return Arrays.areEqual(string, s.string); - } - - /** - * return true if the passed in String can be represented without - * loss as an IA5String, false otherwise. - * - * @return true if in printable set, false otherwise. - */ - public static boolean isIA5String( - String str) - { - for (int i = str.length() - 1; i >= 0; i--) - { - char ch = str.charAt(i); - - if (ch > 0x007f) - { - return false; - } - } - - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERInteger.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERInteger.java deleted file mode 100644 index 28c00b1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERInteger.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -public class DERInteger - extends ASN1Primitive -{ - byte[] bytes; - - /** - * return an integer from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1Integer getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1Integer) - { - return (ASN1Integer)obj; - } - if (obj instanceof DERInteger) - { - return new ASN1Integer((((DERInteger)obj).getValue())); - } - - if (obj instanceof byte[]) - { - try - { - return (ASN1Integer)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an Integer from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1Integer getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERInteger) - { - return getInstance(o); - } - else - { - return new ASN1Integer(ASN1OctetString.getInstance(obj.getObject()).getOctets()); - } - } - - public DERInteger( - long value) - { - bytes = BigInteger.valueOf(value).toByteArray(); - } - - public DERInteger( - BigInteger value) - { - bytes = value.toByteArray(); - } - - public DERInteger( - byte[] bytes) - { - this.bytes = bytes; - } - - public BigInteger getValue() - { - return new BigInteger(bytes); - } - - /** - * in some cases positive values get crammed into a space, - * that's not quite big enough... - */ - public BigInteger getPositiveValue() - { - return new BigInteger(1, bytes); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(bytes.length) + bytes.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.INTEGER, bytes); - } - - public int hashCode() - { - int value = 0; - - for (int i = 0; i != bytes.length; i++) - { - value ^= (bytes[i] & 0xff) << (i % 4); - } - - return value; - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERInteger)) - { - return false; - } - - DERInteger other = (DERInteger)o; - - return Arrays.areEqual(bytes, other.bytes); - } - - public String toString() - { - return getValue().toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNull.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNull.java deleted file mode 100644 index c41f3d3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNull.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -/** - * A NULL object. - */ -public class DERNull - extends ASN1Null -{ - public static final DERNull INSTANCE = new DERNull(); - - private static final byte[] zeroBytes = new byte[0]; - - /** - * @deprecated use DERNull.INSTANCE - */ - public DERNull() - { - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 2; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.NULL, zeroBytes); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNumericString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNumericString.java deleted file mode 100644 index 7b597ad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERNumericString.java +++ /dev/null @@ -1,186 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }. - */ -public class DERNumericString - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return a Numeric string from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERNumericString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERNumericString) - { - return (DERNumericString)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERNumericString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an Numeric String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERNumericString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERNumericString) - { - return getInstance(o); - } - else - { - return new DERNumericString(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - with bytes. - */ - DERNumericString( - byte[] string) - { - this.string = string; - } - - /** - * basic constructor - without validation.. - */ - public DERNumericString( - String string) - { - this(string, false); - } - - /** - * Constructor with optional validation. - * - * @param string the base string to wrap. - * @param validate whether or not to check the string. - * @throws IllegalArgumentException if validate is true and the string - * contains characters that should not be in a NumericString. - */ - public DERNumericString( - String string, - boolean validate) - { - if (validate && !isNumericString(string)) - { - throw new IllegalArgumentException("string contains illegal characters"); - } - - this.string = Strings.toByteArray(string); - } - - public String getString() - { - return Strings.fromByteArray(string); - } - - public String toString() - { - return getString(); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.NUMERIC_STRING, string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERNumericString)) - { - return false; - } - - DERNumericString s = (DERNumericString)o; - - return Arrays.areEqual(string, s.string); - } - - /** - * Return true if the string can be represented as a NumericString ('0'..'9', ' ') - * - * @param str string to validate. - * @return true if numeric, fale otherwise. - */ - public static boolean isNumericString( - String str) - { - for (int i = str.length() - 1; i >= 0; i--) - { - char ch = str.charAt(i); - - if (ch > 0x007f) - { - return false; - } - - if (('0' <= ch && ch <= '9') || ch == ' ') - { - continue; - } - - return false; - } - - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERObjectIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERObjectIdentifier.java deleted file mode 100644 index 91b36fa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERObjectIdentifier.java +++ /dev/null @@ -1,404 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -public class DERObjectIdentifier - extends ASN1Primitive -{ - String identifier; - - private byte[] body; - - /** - * return an OID from the passed in object - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1ObjectIdentifier getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1ObjectIdentifier) - { - return (ASN1ObjectIdentifier)obj; - } - - if (obj instanceof DERObjectIdentifier) - { - return new ASN1ObjectIdentifier(((DERObjectIdentifier)obj).getId()); - } - - if (obj instanceof ASN1Encodable && ((ASN1Encodable)obj).toASN1Primitive() instanceof ASN1ObjectIdentifier) - { - return (ASN1ObjectIdentifier)((ASN1Encodable)obj).toASN1Primitive(); - } - - if (obj instanceof byte[]) - { - return ASN1ObjectIdentifier.fromOctetString((byte[])obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an Object Identifier from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1ObjectIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERObjectIdentifier) - { - return getInstance(o); - } - else - { - return ASN1ObjectIdentifier.fromOctetString(ASN1OctetString.getInstance(obj.getObject()).getOctets()); - } - } - - private static final long LONG_LIMIT = (Long.MAX_VALUE >> 7) - 0x7f; - - DERObjectIdentifier( - byte[] bytes) - { - StringBuffer objId = new StringBuffer(); - long value = 0; - BigInteger bigValue = null; - boolean first = true; - - for (int i = 0; i != bytes.length; i++) - { - int b = bytes[i] & 0xff; - - if (value <= LONG_LIMIT) - { - value += (b & 0x7f); - if ((b & 0x80) == 0) // end of number reached - { - if (first) - { - if (value < 40) - { - objId.append('0'); - } - else if (value < 80) - { - objId.append('1'); - value -= 40; - } - else - { - objId.append('2'); - value -= 80; - } - first = false; - } - - objId.append('.'); - objId.append(value); - value = 0; - } - else - { - value <<= 7; - } - } - else - { - if (bigValue == null) - { - bigValue = BigInteger.valueOf(value); - } - bigValue = bigValue.or(BigInteger.valueOf(b & 0x7f)); - if ((b & 0x80) == 0) - { - if (first) - { - objId.append('2'); - bigValue = bigValue.subtract(BigInteger.valueOf(80)); - first = false; - } - - objId.append('.'); - objId.append(bigValue); - bigValue = null; - value = 0; - } - else - { - bigValue = bigValue.shiftLeft(7); - } - } - } - - this.identifier = objId.toString(); - this.body = Arrays.clone(bytes); - } - - public DERObjectIdentifier( - String identifier) - { - if (!isValidIdentifier(identifier)) - { - throw new IllegalArgumentException("string " + identifier + " not an OID"); - } - - this.identifier = identifier; - } - - public String getId() - { - return identifier; - } - - private void writeField( - ByteArrayOutputStream out, - long fieldValue) - { - byte[] result = new byte[9]; - int pos = 8; - result[pos] = (byte)((int)fieldValue & 0x7f); - while (fieldValue >= (1L << 7)) - { - fieldValue >>= 7; - result[--pos] = (byte)((int)fieldValue & 0x7f | 0x80); - } - out.write(result, pos, 9 - pos); - } - - private void writeField( - ByteArrayOutputStream out, - BigInteger fieldValue) - { - int byteCount = (fieldValue.bitLength()+6)/7; - if (byteCount == 0) - { - out.write(0); - } - else - { - BigInteger tmpValue = fieldValue; - byte[] tmp = new byte[byteCount]; - for (int i = byteCount-1; i >= 0; i--) - { - tmp[i] = (byte) ((tmpValue.intValue() & 0x7f) | 0x80); - tmpValue = tmpValue.shiftRight(7); - } - tmp[byteCount-1] &= 0x7f; - out.write(tmp, 0, tmp.length); - } - } - - private void doOutput(ByteArrayOutputStream aOut) - { - OIDTokenizer tok = new OIDTokenizer(identifier); - int first = Integer.parseInt(tok.nextToken()) * 40; - - String secondToken = tok.nextToken(); - if (secondToken.length() <= 18) - { - writeField(aOut, first + Long.parseLong(secondToken)); - } - else - { - writeField(aOut, new BigInteger(secondToken).add(BigInteger.valueOf(first))); - } - - while (tok.hasMoreTokens()) - { - String token = tok.nextToken(); - if (token.length() <= 18) - { - writeField(aOut, Long.parseLong(token)); - } - else - { - writeField(aOut, new BigInteger(token)); - } - } - } - - protected synchronized byte[] getBody() - { - if (body == null) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - doOutput(bOut); - - body = bOut.toByteArray(); - } - - return body; - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - throws IOException - { - int length = getBody().length; - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - byte[] enc = getBody(); - - out.write(BERTags.OBJECT_IDENTIFIER); - out.writeLength(enc.length); - out.write(enc); - } - - public int hashCode() - { - return identifier.hashCode(); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERObjectIdentifier)) - { - return false; - } - - return identifier.equals(((DERObjectIdentifier)o).identifier); - } - - public String toString() - { - return getId(); - } - - private static boolean isValidIdentifier( - String identifier) - { - if (identifier.length() < 3 - || identifier.charAt(1) != '.') - { - return false; - } - - char first = identifier.charAt(0); - if (first < '0' || first > '2') - { - return false; - } - - boolean periodAllowed = false; - for (int i = identifier.length() - 1; i >= 2; i--) - { - char ch = identifier.charAt(i); - - // TODO Leading zeroes? - if ('0' <= ch && ch <= '9') - { - periodAllowed = true; - continue; - } - - if (ch == '.') - { - if (!periodAllowed) - { - return false; - } - - periodAllowed = false; - continue; - } - - return false; - } - - return periodAllowed; - } - - private static ASN1ObjectIdentifier[][] cache = new ASN1ObjectIdentifier[256][]; - - static ASN1ObjectIdentifier fromOctetString(byte[] enc) - { - if (enc.length < 3) - { - return new ASN1ObjectIdentifier(enc); - } - - int idx1 = enc[enc.length - 2] & 0xff; - // in this case top bit is always zero - int idx2 = enc[enc.length - 1] & 0x7f; - - ASN1ObjectIdentifier possibleMatch; - - synchronized (cache) - { - ASN1ObjectIdentifier[] first = cache[idx1]; - if (first == null) - { - first = cache[idx1] = new ASN1ObjectIdentifier[128]; - } - - possibleMatch = first[idx2]; - if (possibleMatch == null) - { - return first[idx2] = new ASN1ObjectIdentifier(enc); - } - - if (Arrays.areEqual(enc, possibleMatch.getBody())) - { - return possibleMatch; - } - - idx1 = (idx1 + 1) & 0xff; - first = cache[idx1]; - if (first == null) - { - first = cache[idx1] = new ASN1ObjectIdentifier[128]; - } - - possibleMatch = first[idx2]; - if (possibleMatch == null) - { - return first[idx2] = new ASN1ObjectIdentifier(enc); - } - - if (Arrays.areEqual(enc, possibleMatch.getBody())) - { - return possibleMatch; - } - - idx2 = (idx2 + 1) & 0x7f; - possibleMatch = first[idx2]; - if (possibleMatch == null) - { - return first[idx2] = new ASN1ObjectIdentifier(enc); - } - } - - if (Arrays.areEqual(enc, possibleMatch.getBody())) - { - return possibleMatch; - } - - return new ASN1ObjectIdentifier(enc); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetString.java deleted file mode 100644 index 61ab68c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetString.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class DEROctetString - extends ASN1OctetString -{ - /** - * @param string the octets making up the octet string. - */ - public DEROctetString( - byte[] string) - { - super(string); - } - - public DEROctetString( - ASN1Encodable obj) - throws IOException - { - super(obj.toASN1Primitive().getEncoded(ASN1Encoding.DER)); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.OCTET_STRING, string); - } - - static void encode( - DEROutputStream derOut, - byte[] bytes) - throws IOException - { - derOut.writeEncoded(BERTags.OCTET_STRING, bytes); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetStringParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetStringParser.java deleted file mode 100644 index 6fd6036..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROctetStringParser.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.InputStream; - -public class DEROctetStringParser - implements ASN1OctetStringParser -{ - private DefiniteLengthInputStream stream; - - DEROctetStringParser( - DefiniteLengthInputStream stream) - { - this.stream = stream; - } - - public InputStream getOctetStream() - { - return stream; - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new DEROctetString(stream.toByteArray()); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException("IOException converting stream to byte array: " + e.getMessage(), e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROutputStream.java deleted file mode 100644 index 81ac19e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DEROutputStream.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * Stream that outputs encoding based on distinguished encoding rules. - */ -public class DEROutputStream - extends ASN1OutputStream -{ - public DEROutputStream( - OutputStream os) - { - super(os); - } - - public void writeObject( - ASN1Encodable obj) - throws IOException - { - if (obj != null) - { - obj.toASN1Primitive().toDERObject().encode(this); - } - else - { - throw new IOException("null object detected"); - } - } - - ASN1OutputStream getDERSubStream() - { - return this; - } - - ASN1OutputStream getDLSubStream() - { - return this; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERPrintableString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERPrintableString.java deleted file mode 100644 index 7d9c14b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERPrintableString.java +++ /dev/null @@ -1,213 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER PrintableString object. - */ -public class DERPrintableString - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return a printable string from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERPrintableString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERPrintableString) - { - return (DERPrintableString)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERPrintableString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a Printable String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERPrintableString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERPrintableString) - { - return getInstance(o); - } - else - { - return new DERPrintableString(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - byte encoded string. - */ - DERPrintableString( - byte[] string) - { - this.string = string; - } - - /** - * basic constructor - this does not validate the string - */ - public DERPrintableString( - String string) - { - this(string, false); - } - - /** - * Constructor with optional validation. - * - * @param string the base string to wrap. - * @param validate whether or not to check the string. - * @throws IllegalArgumentException if validate is true and the string - * contains characters that should not be in a PrintableString. - */ - public DERPrintableString( - String string, - boolean validate) - { - if (validate && !isPrintableString(string)) - { - throw new IllegalArgumentException("string contains illegal characters"); - } - - this.string = Strings.toByteArray(string); - } - - public String getString() - { - return Strings.fromByteArray(string); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.PRINTABLE_STRING, string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERPrintableString)) - { - return false; - } - - DERPrintableString s = (DERPrintableString)o; - - return Arrays.areEqual(string, s.string); - } - - public String toString() - { - return getString(); - } - - /** - * return true if the passed in String can be represented without - * loss as a PrintableString, false otherwise. - * - * @return true if in printable set, false otherwise. - */ - public static boolean isPrintableString( - String str) - { - for (int i = str.length() - 1; i >= 0; i--) - { - char ch = str.charAt(i); - - if (ch > 0x007f) - { - return false; - } - - if ('a' <= ch && ch <= 'z') - { - continue; - } - - if ('A' <= ch && ch <= 'Z') - { - continue; - } - - if ('0' <= ch && ch <= '9') - { - continue; - } - - switch (ch) - { - case ' ': - case '\'': - case '(': - case ')': - case '+': - case '-': - case '.': - case ':': - case '=': - case '?': - case '/': - case ',': - continue; - } - - return false; - } - - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequence.java deleted file mode 100644 index 0d7ff45..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequence.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -public class DERSequence - extends ASN1Sequence -{ - private int bodyLength = -1; - - /** - * create an empty sequence - */ - public DERSequence() - { - } - - /** - * create a sequence containing one object - */ - public DERSequence( - ASN1Encodable obj) - { - super(obj); - } - - /** - * create a sequence containing a vector of objects. - */ - public DERSequence( - ASN1EncodableVector v) - { - super(v); - } - - /** - * create a sequence containing an array of objects. - */ - public DERSequence( - ASN1Encodable[] array) - { - super(array); - } - - private int getBodyLength() - throws IOException - { - if (bodyLength < 0) - { - int length = 0; - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - length += ((ASN1Encodable)obj).toASN1Primitive().toDERObject().encodedLength(); - } - - bodyLength = length; - } - - return bodyLength; - } - - int encodedLength() - throws IOException - { - int length = getBodyLength(); - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - /* - * A note on the implementation: - *

    - * As DER requires the constructed, definite-length model to - * be used for structured types, this varies slightly from the - * ASN.1 descriptions given. Rather than just outputting SEQUENCE, - * we also have to specify CONSTRUCTED, and the objects length. - */ - void encode( - ASN1OutputStream out) - throws IOException - { - ASN1OutputStream dOut = out.getDERSubStream(); - int length = getBodyLength(); - - out.write(BERTags.SEQUENCE | BERTags.CONSTRUCTED); - out.writeLength(length); - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - dOut.writeObject((ASN1Encodable)obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceGenerator.java deleted file mode 100644 index 0a79fcf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceGenerator.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -public class DERSequenceGenerator - extends DERGenerator -{ - private final ByteArrayOutputStream _bOut = new ByteArrayOutputStream(); - - public DERSequenceGenerator( - OutputStream out) - throws IOException - { - super(out); - } - - public DERSequenceGenerator( - OutputStream out, - int tagNo, - boolean isExplicit) - throws IOException - { - super(out, tagNo, isExplicit); - } - - public void addObject( - ASN1Encodable object) - throws IOException - { - object.toASN1Primitive().encode(new DEROutputStream(_bOut)); - } - - public OutputStream getRawOutputStream() - { - return _bOut; - } - - public void close() - throws IOException - { - writeDEREncoded(BERTags.CONSTRUCTED | BERTags.SEQUENCE, _bOut.toByteArray()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceParser.java deleted file mode 100644 index 1337c96..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSequenceParser.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class DERSequenceParser - implements ASN1SequenceParser -{ - private ASN1StreamParser _parser; - - DERSequenceParser(ASN1StreamParser parser) - { - this._parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return _parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new DERSequence(_parser.readVector()); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new IllegalStateException(e.getMessage()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSet.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSet.java deleted file mode 100644 index cfc7fb2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSet.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -/** - * A DER encoded set object - */ -public class DERSet - extends ASN1Set -{ - private int bodyLength = -1; - - /** - * create an empty set - */ - public DERSet() - { - } - - /** - * @param obj - a single object that makes up the set. - */ - public DERSet( - ASN1Encodable obj) - { - super(obj); - } - - /** - * @param v - a vector of objects making up the set. - */ - public DERSet( - ASN1EncodableVector v) - { - super(v, true); - } - - /** - * create a set from an array of objects. - */ - public DERSet( - ASN1Encodable[] a) - { - super(a, true); - } - - DERSet( - ASN1EncodableVector v, - boolean doSort) - { - super(v, doSort); - } - - private int getBodyLength() - throws IOException - { - if (bodyLength < 0) - { - int length = 0; - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - length += ((ASN1Encodable)obj).toASN1Primitive().toDERObject().encodedLength(); - } - - bodyLength = length; - } - - return bodyLength; - } - - int encodedLength() - throws IOException - { - int length = getBodyLength(); - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - /* - * A note on the implementation: - *

    - * As DER requires the constructed, definite-length model to - * be used for structured types, this varies slightly from the - * ASN.1 descriptions given. Rather than just outputting SET, - * we also have to specify CONSTRUCTED, and the objects length. - */ - void encode( - ASN1OutputStream out) - throws IOException - { - ASN1OutputStream dOut = out.getDERSubStream(); - int length = getBodyLength(); - - out.write(BERTags.SET | BERTags.CONSTRUCTED); - out.writeLength(length); - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - dOut.writeObject((ASN1Encodable)obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSetParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSetParser.java deleted file mode 100644 index 44c7fd2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERSetParser.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public class DERSetParser - implements ASN1SetParser -{ - private ASN1StreamParser _parser; - - DERSetParser(ASN1StreamParser parser) - { - this._parser = parser; - } - - public ASN1Encodable readObject() - throws IOException - { - return _parser.readObject(); - } - - public ASN1Primitive getLoadedObject() - throws IOException - { - return new DERSet(_parser.readVector(), false); - } - - public ASN1Primitive toASN1Primitive() - { - try - { - return getLoadedObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException(e.getMessage(), e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERT61String.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERT61String.java deleted file mode 100644 index 47e5465..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERT61String.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER T61String (also the teletex string) - */ -public class DERT61String - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return a T61 string from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERT61String getInstance( - Object obj) - { - if (obj == null || obj instanceof DERT61String) - { - return (DERT61String)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERT61String)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an T61 String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERT61String getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERT61String) - { - return getInstance(o); - } - else - { - return new DERT61String(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - with bytes. - */ - DERT61String( - byte[] string) - { - this.string = string; - } - - /** - * basic constructor - with string. - */ - public DERT61String( - String string) - { - this.string = Strings.toUTF8ByteArray(string); - } - - public String getString() - { - return Strings.fromUTF8ByteArray(string); - } - - public String toString() - { - return getString(); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.T61_STRING, string); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERT61String)) - { - return false; - } - - return Arrays.areEqual(string, ((DERT61String)o).string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTaggedObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTaggedObject.java deleted file mode 100644 index 9d31bdb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTaggedObject.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -/** - * DER TaggedObject - in ASN.1 notation this is any object preceded by - * a [n] where n is some number - these are assumed to follow the construction - * rules (as with sequences). - */ -public class DERTaggedObject - extends ASN1TaggedObject -{ - private static final byte[] ZERO_BYTES = new byte[0]; - - /** - * @param explicit true if an explicitly tagged object. - * @param tagNo the tag number for this object. - * @param obj the tagged object. - */ - public DERTaggedObject( - boolean explicit, - int tagNo, - ASN1Encodable obj) - { - super(explicit, tagNo, obj); - } - - public DERTaggedObject(int tagNo, ASN1Encodable encodable) - { - super(true, tagNo, encodable); - } - - boolean isConstructed() - { - if (!empty) - { - if (explicit) - { - return true; - } - else - { - ASN1Primitive primitive = obj.toASN1Primitive().toDERObject(); - - return primitive.isConstructed(); - } - } - else - { - return true; - } - } - - int encodedLength() - throws IOException - { - if (!empty) - { - ASN1Primitive primitive = obj.toASN1Primitive().toDERObject(); - int length = primitive.encodedLength(); - - if (explicit) - { - return StreamUtil.calculateTagLength(tagNo) + StreamUtil.calculateBodyLength(length) + length; - } - else - { - // header length already in calculation - length = length - 1; - - return StreamUtil.calculateTagLength(tagNo) + length; - } - } - else - { - return StreamUtil.calculateTagLength(tagNo) + 1; - } - } - - void encode( - ASN1OutputStream out) - throws IOException - { - if (!empty) - { - ASN1Primitive primitive = obj.toASN1Primitive().toDERObject(); - - if (explicit) - { - out.writeTag(BERTags.CONSTRUCTED | BERTags.TAGGED, tagNo); - out.writeLength(primitive.encodedLength()); - out.writeObject(primitive); - } - else - { - // - // need to mark constructed types... - // - int flags; - if (primitive.isConstructed()) - { - flags = BERTags.CONSTRUCTED | BERTags.TAGGED; - } - else - { - flags = BERTags.TAGGED; - } - - out.writeTag(flags, tagNo); - out.writeImplicitObject(primitive); - } - } - else - { - out.writeEncoded(BERTags.CONSTRUCTED | BERTags.TAGGED, tagNo, ZERO_BYTES); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTags.java deleted file mode 100644 index 1ecfa54..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERTags.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.asn1; - -/** - * @deprecated use BERTags - */ -public interface DERTags - extends BERTags -{ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTCTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTCTime.java deleted file mode 100644 index 1cbff48..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTCTime.java +++ /dev/null @@ -1,278 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.SimpleTimeZone; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * UTC time object. - */ -public class DERUTCTime - extends ASN1Primitive -{ - private byte[] time; - - /** - * return an UTC Time from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static ASN1UTCTime getInstance( - Object obj) - { - if (obj == null || obj instanceof ASN1UTCTime) - { - return (ASN1UTCTime)obj; - } - - if (obj instanceof DERUTCTime) - { - return new ASN1UTCTime(((DERUTCTime)obj).time); - } - - if (obj instanceof byte[]) - { - try - { - return (ASN1UTCTime)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return an UTC Time from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static ASN1UTCTime getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Object o = obj.getObject(); - - if (explicit || o instanceof ASN1UTCTime) - { - return getInstance(o); - } - else - { - return new ASN1UTCTime(((ASN1OctetString)o).getOctets()); - } - } - - /** - * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were - * never encoded. When you're creating one of these objects from scratch, that's - * what you want to use, otherwise we'll try to deal with whatever gets read from - * the input stream... (this is why the input format is different from the getTime() - * method output). - *

    - * - * @param time the time string. - */ - public DERUTCTime( - String time) - { - this.time = Strings.toByteArray(time); - try - { - this.getDate(); - } - catch (ParseException e) - { - throw new IllegalArgumentException("invalid date string: " + e.getMessage()); - } - } - - /** - * base constructer from a java.util.date object - */ - public DERUTCTime( - Date time) - { - SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmss'Z'"); - - dateF.setTimeZone(new SimpleTimeZone(0,"Z")); - - this.time = Strings.toByteArray(dateF.format(time)); - } - - DERUTCTime( - byte[] time) - { - this.time = time; - } - - /** - * return the time as a date based on whatever a 2 digit year will return. For - * standardised processing use getAdjustedDate(). - * - * @return the resulting date - * @exception ParseException if the date string cannot be parsed. - */ - public Date getDate() - throws ParseException - { - SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmssz"); - - return dateF.parse(getTime()); - } - - /** - * return the time as an adjusted date - * in the range of 1950 - 2049. - * - * @return a date in the range of 1950 to 2049. - * @exception ParseException if the date string cannot be parsed. - */ - public Date getAdjustedDate() - throws ParseException - { - SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); - - dateF.setTimeZone(new SimpleTimeZone(0, "Z")); - - return dateF.parse(getAdjustedTime()); - } - - /** - * return the time - always in the form of - * YYMMDDhhmmssGMT(+hh:mm|-hh:mm). - *

    - * Normally in a certificate we would expect "Z" rather than "GMT", - * however adding the "GMT" means we can just use: - *

    -     *     dateF = new SimpleDateFormat("yyMMddHHmmssz");
    -     * 
    - * To read in the time and get a date which is compatible with our local - * time zone. - *

    - * Note: In some cases, due to the local date processing, this - * may lead to unexpected results. If you want to stick the normal - * convention of 1950 to 2049 use the getAdjustedTime() method. - */ - public String getTime() - { - String stime = Strings.fromByteArray(time); - - // - // standardise the format. - // - if (stime.indexOf('-') < 0 && stime.indexOf('+') < 0) - { - if (stime.length() == 11) - { - return stime.substring(0, 10) + "00GMT+00:00"; - } - else - { - return stime.substring(0, 12) + "GMT+00:00"; - } - } - else - { - int index = stime.indexOf('-'); - if (index < 0) - { - index = stime.indexOf('+'); - } - String d = stime; - - if (index == stime.length() - 3) - { - d += "00"; - } - - if (index == 10) - { - return d.substring(0, 10) + "00GMT" + d.substring(10, 13) + ":" + d.substring(13, 15); - } - else - { - return d.substring(0, 12) + "GMT" + d.substring(12, 15) + ":" + d.substring(15, 17); - } - } - } - - /** - * return a time string as an adjusted date with a 4 digit year. This goes - * in the range of 1950 - 2049. - */ - public String getAdjustedTime() - { - String d = this.getTime(); - - if (d.charAt(0) < '5') - { - return "20" + d; - } - else - { - return "19" + d; - } - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - int length = time.length; - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.write(BERTags.UTC_TIME); - - int length = time.length; - - out.writeLength(length); - - for (int i = 0; i != length; i++) - { - out.write((byte)time[i]); - } - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERUTCTime)) - { - return false; - } - - return Arrays.areEqual(time, ((DERUTCTime)o).time); - } - - public int hashCode() - { - return Arrays.hashCode(time); - } - - public String toString() - { - return Strings.fromByteArray(time); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTF8String.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTF8String.java deleted file mode 100644 index e3a7aa9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUTF8String.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER UTF8String object. - */ -public class DERUTF8String - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return an UTF8 string from the passed in object. - * - * @exception IllegalArgumentException - * if the object cannot be converted. - */ - public static DERUTF8String getInstance(Object obj) - { - if (obj == null || obj instanceof DERUTF8String) - { - return (DERUTF8String)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERUTF8String)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * return an UTF8 String from a tagged object. - * - * @param obj - * the tagged object holding the object we want - * @param explicit - * true if the object is meant to be explicitly tagged false - * otherwise. - * @exception IllegalArgumentException - * if the tagged object cannot be converted. - */ - public static DERUTF8String getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERUTF8String) - { - return getInstance(o); - } - else - { - return new DERUTF8String(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - byte encoded string. - */ - DERUTF8String(byte[] string) - { - this.string = string; - } - - /** - * basic constructor - */ - public DERUTF8String(String string) - { - this.string = Strings.toUTF8ByteArray(string); - } - - public String getString() - { - return Strings.fromUTF8ByteArray(string); - } - - public String toString() - { - return getString(); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } - - boolean asn1Equals(ASN1Primitive o) - { - if (!(o instanceof DERUTF8String)) - { - return false; - } - - DERUTF8String s = (DERUTF8String)o; - - return Arrays.areEqual(string, s.string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - throws IOException - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode(ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.UTF8_STRING, string); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUniversalString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUniversalString.java deleted file mode 100644 index 2e571be..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERUniversalString.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.bc.util.Arrays; - -/** - * DER UniversalString object. - */ -public class DERUniversalString - extends ASN1Primitive - implements ASN1String -{ - private static final char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - private byte[] string; - - /** - * return a Universal String from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERUniversalString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERUniversalString) - { - return (DERUniversalString)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERUniversalString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a Universal String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERUniversalString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERUniversalString) - { - return getInstance(o); - } - else - { - return new DERUniversalString(((ASN1OctetString)o).getOctets()); - } - } - - /** - * basic constructor - byte encoded string. - */ - public DERUniversalString( - byte[] string) - { - this.string = string; - } - - public String getString() - { - StringBuffer buf = new StringBuffer("#"); - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - ASN1OutputStream aOut = new ASN1OutputStream(bOut); - - try - { - aOut.writeObject(this); - } - catch (IOException e) - { - throw new RuntimeException("internal error encoding BitString"); - } - - byte[] string = bOut.toByteArray(); - - for (int i = 0; i != string.length; i++) - { - buf.append(table[(string[i] >>> 4) & 0xf]); - buf.append(table[string[i] & 0xf]); - } - - return buf.toString(); - } - - public String toString() - { - return getString(); - } - - public byte[] getOctets() - { - return string; - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.UNIVERSAL_STRING, this.getOctets()); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERUniversalString)) - { - return false; - } - - return Arrays.areEqual(string, ((DERUniversalString)o).string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERVisibleString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERVisibleString.java deleted file mode 100644 index 54674cd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DERVisibleString.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * DER VisibleString object. - */ -public class DERVisibleString - extends ASN1Primitive - implements ASN1String -{ - private byte[] string; - - /** - * return a Visible String from the passed in object. - * - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DERVisibleString getInstance( - Object obj) - { - if (obj == null || obj instanceof DERVisibleString) - { - return (DERVisibleString)obj; - } - - if (obj instanceof byte[]) - { - try - { - return (DERVisibleString)fromByteArray((byte[])obj); - } - catch (Exception e) - { - throw new IllegalArgumentException("encoding error in getInstance: " + e.toString()); - } - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * return a Visible String from a tagged object. - * - * @param obj the tagged object holding the object we want - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the tagged object cannot - * be converted. - */ - public static DERVisibleString getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - ASN1Primitive o = obj.getObject(); - - if (explicit || o instanceof DERVisibleString) - { - return getInstance(o); - } - else - { - return new DERVisibleString(ASN1OctetString.getInstance(o).getOctets()); - } - } - - /** - * basic constructor - byte encoded string. - */ - DERVisibleString( - byte[] string) - { - this.string = string; - } - - /** - * basic constructor - */ - public DERVisibleString( - String string) - { - this.string = Strings.toByteArray(string); - } - - public String getString() - { - return Strings.fromByteArray(string); - } - - public String toString() - { - return getString(); - } - - public byte[] getOctets() - { - return Arrays.clone(string); - } - - boolean isConstructed() - { - return false; - } - - int encodedLength() - { - return 1 + StreamUtil.calculateBodyLength(string.length) + string.length; - } - - void encode( - ASN1OutputStream out) - throws IOException - { - out.writeEncoded(BERTags.VISIBLE_STRING, this.string); - } - - boolean asn1Equals( - ASN1Primitive o) - { - if (!(o instanceof DERVisibleString)) - { - return false; - } - - return Arrays.areEqual(string, ((DERVisibleString)o).string); - } - - public int hashCode() - { - return Arrays.hashCode(string); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLOutputStream.java deleted file mode 100644 index 930dd3d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLOutputStream.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * Stream that outputs encoding based on definite length. - */ -public class DLOutputStream - extends ASN1OutputStream -{ - public DLOutputStream( - OutputStream os) - { - super(os); - } - - public void writeObject( - ASN1Encodable obj) - throws IOException - { - if (obj != null) - { - obj.toASN1Primitive().toDLObject().encode(this); - } - else - { - throw new IOException("null object detected"); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSequence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSequence.java deleted file mode 100644 index e911829..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSequence.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -public class DLSequence - extends ASN1Sequence -{ - private int bodyLength = -1; - - /** - * create an empty sequence - */ - public DLSequence() - { - } - - /** - * create a sequence containing one object - */ - public DLSequence( - ASN1Encodable obj) - { - super(obj); - } - - /** - * create a sequence containing a vector of objects. - */ - public DLSequence( - ASN1EncodableVector v) - { - super(v); - } - - /** - * create a sequence containing an array of objects. - */ - public DLSequence( - ASN1Encodable[] array) - { - super(array); - } - - private int getBodyLength() - throws IOException - { - if (bodyLength < 0) - { - int length = 0; - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - length += ((ASN1Encodable)obj).toASN1Primitive().toDLObject().encodedLength(); - } - - bodyLength = length; - } - - return bodyLength; - } - - int encodedLength() - throws IOException - { - int length = getBodyLength(); - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - /* - * A note on the implementation: - *

    - * As DL requires the constructed, definite-length model to - * be used for structured types, this varies slightly from the - * ASN.1 descriptions given. Rather than just outputting SEQUENCE, - * we also have to specify CONSTRUCTED, and the objects length. - */ - void encode( - ASN1OutputStream out) - throws IOException - { - ASN1OutputStream dOut = out.getDLSubStream(); - int length = getBodyLength(); - - out.write(BERTags.SEQUENCE | BERTags.CONSTRUCTED); - out.writeLength(length); - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - dOut.writeObject((ASN1Encodable)obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSet.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSet.java deleted file mode 100644 index ec64ed2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLSet.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -/** - * A DER encoded set object - */ -public class DLSet - extends ASN1Set -{ - private int bodyLength = -1; - - /** - * create an empty set - */ - public DLSet() - { - } - - /** - * @param obj - a single object that makes up the set. - */ - public DLSet( - ASN1Encodable obj) - { - super(obj); - } - - /** - * @param v - a vector of objects making up the set. - */ - public DLSet( - ASN1EncodableVector v) - { - super(v, false); - } - - /** - * create a set from an array of objects. - */ - public DLSet( - ASN1Encodable[] a) - { - super(a, false); - } - - private int getBodyLength() - throws IOException - { - if (bodyLength < 0) - { - int length = 0; - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - length += ((ASN1Encodable)obj).toASN1Primitive().toDLObject().encodedLength(); - } - - bodyLength = length; - } - - return bodyLength; - } - - int encodedLength() - throws IOException - { - int length = getBodyLength(); - - return 1 + StreamUtil.calculateBodyLength(length) + length; - } - - /* - * A note on the implementation: - *

    - * As DL requires the constructed, definite-length model to - * be used for structured types, this varies slightly from the - * ASN.1 descriptions given. Rather than just outputting SET, - * we also have to specify CONSTRUCTED, and the objects length. - */ - void encode( - ASN1OutputStream out) - throws IOException - { - ASN1OutputStream dOut = out.getDLSubStream(); - int length = getBodyLength(); - - out.write(BERTags.SET | BERTags.CONSTRUCTED); - out.writeLength(length); - - for (Enumeration e = this.getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - dOut.writeObject((ASN1Encodable)obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLTaggedObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLTaggedObject.java deleted file mode 100644 index ee3caff..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DLTaggedObject.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -/** - * Definite Length TaggedObject - in ASN.1 notation this is any object preceded by - * a [n] where n is some number - these are assumed to follow the construction - * rules (as with sequences). - */ -public class DLTaggedObject - extends ASN1TaggedObject -{ - private static final byte[] ZERO_BYTES = new byte[0]; - - /** - * @param explicit true if an explicitly tagged object. - * @param tagNo the tag number for this object. - * @param obj the tagged object. - */ - public DLTaggedObject( - boolean explicit, - int tagNo, - ASN1Encodable obj) - { - super(explicit, tagNo, obj); - } - - boolean isConstructed() - { - if (!empty) - { - if (explicit) - { - return true; - } - else - { - ASN1Primitive primitive = obj.toASN1Primitive().toDLObject(); - - return primitive.isConstructed(); - } - } - else - { - return true; - } - } - - int encodedLength() - throws IOException - { - if (!empty) - { - int length = obj.toASN1Primitive().toDLObject().encodedLength(); - - if (explicit) - { - return StreamUtil.calculateTagLength(tagNo) + StreamUtil.calculateBodyLength(length) + length; - } - else - { - // header length already in calculation - length = length - 1; - - return StreamUtil.calculateTagLength(tagNo) + length; - } - } - else - { - return StreamUtil.calculateTagLength(tagNo) + 1; - } - } - - void encode( - ASN1OutputStream out) - throws IOException - { - if (!empty) - { - ASN1Primitive primitive = obj.toASN1Primitive().toDLObject(); - - if (explicit) - { - out.writeTag(BERTags.CONSTRUCTED | BERTags.TAGGED, tagNo); - out.writeLength(primitive.encodedLength()); - out.writeObject(primitive); - } - else - { - // - // need to mark constructed types... - // - int flags; - if (primitive.isConstructed()) - { - flags = BERTags.CONSTRUCTED | BERTags.TAGGED; - } - else - { - flags = BERTags.TAGGED; - } - - out.writeTag(flags, tagNo); - out.writeImplicitObject(primitive); - } - } - else - { - out.writeEncoded(BERTags.CONSTRUCTED | BERTags.TAGGED, tagNo, ZERO_BYTES); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DefiniteLengthInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DefiniteLengthInputStream.java deleted file mode 100644 index 8872b12..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/DefiniteLengthInputStream.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.bc.asn1; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.util.io.Streams; - -class DefiniteLengthInputStream - extends LimitedInputStream -{ - private static final byte[] EMPTY_BYTES = new byte[0]; - - private final int _originalLength; - private int _remaining; - - DefiniteLengthInputStream( - InputStream in, - int length) - { - super(in, length); - - if (length < 0) - { - throw new IllegalArgumentException("negative lengths not allowed"); - } - - this._originalLength = length; - this._remaining = length; - - if (length == 0) - { - setParentEofDetect(true); - } - } - - int getRemaining() - { - return _remaining; - } - - public int read() - throws IOException - { - if (_remaining == 0) - { - return -1; - } - - int b = _in.read(); - - if (b < 0) - { - throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining); - } - - if (--_remaining == 0) - { - setParentEofDetect(true); - } - - return b; - } - - public int read(byte[] buf, int off, int len) - throws IOException - { - if (_remaining == 0) - { - return -1; - } - - int toRead = Math.min(len, _remaining); - int numRead = _in.read(buf, off, toRead); - - if (numRead < 0) - { - throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining); - } - - if ((_remaining -= numRead) == 0) - { - setParentEofDetect(true); - } - - return numRead; - } - - byte[] toByteArray() - throws IOException - { - if (_remaining == 0) - { - return EMPTY_BYTES; - } - - byte[] bytes = new byte[_remaining]; - if ((_remaining -= Streams.readFully(_in, bytes)) != 0) - { - throw new EOFException("DEF length " + _originalLength + " object truncated by " + _remaining); - } - setParentEofDetect(true); - return bytes; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/InMemoryRepresentable.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/InMemoryRepresentable.java deleted file mode 100644 index 8bc8521..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/InMemoryRepresentable.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; - -public interface InMemoryRepresentable -{ - ASN1Primitive getLoadedObject() - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/IndefiniteLengthInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/IndefiniteLengthInputStream.java deleted file mode 100644 index ed189c4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/IndefiniteLengthInputStream.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.asn1; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -class IndefiniteLengthInputStream - extends LimitedInputStream -{ - private int _b1; - private int _b2; - private boolean _eofReached = false; - private boolean _eofOn00 = true; - - IndefiniteLengthInputStream( - InputStream in, - int limit) - throws IOException - { - super(in, limit); - - _b1 = in.read(); - _b2 = in.read(); - - if (_b2 < 0) - { - // Corrupted stream - throw new EOFException(); - } - - checkForEof(); - } - - void setEofOn00( - boolean eofOn00) - { - _eofOn00 = eofOn00; - checkForEof(); - } - - private boolean checkForEof() - { - if (!_eofReached && _eofOn00 && (_b1 == 0x00 && _b2 == 0x00)) - { - _eofReached = true; - setParentEofDetect(true); - } - return _eofReached; - } - - public int read(byte[] b, int off, int len) - throws IOException - { - // Only use this optimisation if we aren't checking for 00 - if (_eofOn00 || len < 3) - { - return super.read(b, off, len); - } - - if (_eofReached) - { - return -1; - } - - int numRead = _in.read(b, off + 2, len - 2); - - if (numRead < 0) - { - // Corrupted stream - throw new EOFException(); - } - - b[off] = (byte)_b1; - b[off + 1] = (byte)_b2; - - _b1 = _in.read(); - _b2 = _in.read(); - - if (_b2 < 0) - { - // Corrupted stream - throw new EOFException(); - } - - return numRead + 2; - } - - public int read() - throws IOException - { - if (checkForEof()) - { - return -1; - } - - int b = _in.read(); - - if (b < 0) - { - // Corrupted stream - throw new EOFException(); - } - - int v = _b1; - - _b1 = _b2; - _b2 = b; - - return v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyConstructionEnumeration.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyConstructionEnumeration.java deleted file mode 100644 index 53dc8d3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyConstructionEnumeration.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -class LazyConstructionEnumeration - implements Enumeration -{ - private ASN1InputStream aIn; - private Object nextObj; - - public LazyConstructionEnumeration(byte[] encoded) - { - aIn = new ASN1InputStream(encoded, true); - nextObj = readObject(); - } - - public boolean hasMoreElements() - { - return nextObj != null; - } - - public Object nextElement() - { - Object o = nextObj; - - nextObj = readObject(); - - return o; - } - - private Object readObject() - { - try - { - return aIn.readObject(); - } - catch (IOException e) - { - throw new ASN1ParsingException("malformed DER construction: " + e, e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyEncodedSequence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyEncodedSequence.java deleted file mode 100644 index dfb96be..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LazyEncodedSequence.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.bc.asn1; - -import java.io.IOException; -import java.util.Enumeration; - -/** - * Note: this class is for processing DER/DL encoded sequences only. - */ -class LazyEncodedSequence - extends ASN1Sequence -{ - private byte[] encoded; - - LazyEncodedSequence( - byte[] encoded) - throws IOException - { - this.encoded = encoded; - } - - private void parse() - { - Enumeration en = new LazyConstructionEnumeration(encoded); - - while (en.hasMoreElements()) - { - seq.addElement(en.nextElement()); - } - - encoded = null; - } - - public synchronized ASN1Encodable getObjectAt(int index) - { - if (encoded != null) - { - parse(); - } - - return super.getObjectAt(index); - } - - public synchronized Enumeration getObjects() - { - if (encoded == null) - { - return super.getObjects(); - } - - return new LazyConstructionEnumeration(encoded); - } - - public synchronized int size() - { - if (encoded != null) - { - parse(); - } - - return super.size(); - } - - ASN1Primitive toDERObject() - { - if (encoded != null) - { - parse(); - } - - return super.toDERObject(); - } - - ASN1Primitive toDLObject() - { - if (encoded != null) - { - parse(); - } - - return super.toDLObject(); - } - - int encodedLength() - throws IOException - { - if (encoded != null) - { - return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length; - } - else - { - return super.toDLObject().encodedLength(); - } - } - - void encode( - ASN1OutputStream out) - throws IOException - { - if (encoded != null) - { - out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded); - } - else - { - super.toDLObject().encode(out); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LimitedInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LimitedInputStream.java deleted file mode 100644 index deb8c9d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/LimitedInputStream.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bc.asn1; - -import java.io.InputStream; - -abstract class LimitedInputStream - extends InputStream -{ - protected final InputStream _in; - private int _limit; - - LimitedInputStream( - InputStream in, - int limit) - { - this._in = in; - this._limit = limit; - } - - int getRemaining() - { - // TODO: maybe one day this can become more accurate - return _limit; - } - - protected void setParentEofDetect(boolean on) - { - if (_in instanceof IndefiniteLengthInputStream) - { - ((IndefiniteLengthInputStream)_in).setEofOn00(on); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/OIDTokenizer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/OIDTokenizer.java deleted file mode 100644 index a5c3d48..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/OIDTokenizer.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1; - -/** - * class for breaking up an OID into it's component tokens, ala - * java.util.StringTokenizer. We need this class as some of the - * lightweight Java environment don't support classes like - * StringTokenizer. - */ -public class OIDTokenizer -{ - private String oid; - private int index; - - public OIDTokenizer( - String oid) - { - this.oid = oid; - this.index = 0; - } - - public boolean hasMoreTokens() - { - return (index != -1); - } - - public String nextToken() - { - if (index == -1) - { - return null; - } - - String token; - int end = oid.indexOf('.', index); - - if (end == -1) - { - token = oid.substring(index); - index = -1; - return token; - } - - token = oid.substring(index, end); - - index = end + 1; - return token; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/StreamUtil.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/StreamUtil.java deleted file mode 100644 index d429439..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/StreamUtil.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.asn1; - -import java.io.ByteArrayInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -class StreamUtil -{ - private static final long MAX_MEMORY = Runtime.getRuntime().maxMemory(); - - /** - * Find out possible longest length... - * - * @param in input stream of interest - * @return length calculation or MAX_VALUE. - */ - static int findLimit(InputStream in) - { - if (in instanceof LimitedInputStream) - { - return ((LimitedInputStream)in).getRemaining(); - } - else if (in instanceof ASN1InputStream) - { - return ((ASN1InputStream)in).getLimit(); - } - else if (in instanceof ByteArrayInputStream) - { - return ((ByteArrayInputStream)in).available(); - } - else if (in instanceof FileInputStream) - { - try - { - long size = ((FileInputStream)in).getChannel().size(); - - if (size < Integer.MAX_VALUE) - { - return (int)size; - } - } - catch (IOException e) - { - // ignore - they'll find out soon enough! - } - } - - if (MAX_MEMORY > Integer.MAX_VALUE) - { - return Integer.MAX_VALUE; - } - - return (int)MAX_MEMORY; - } - - static int calculateBodyLength( - int length) - { - int count = 1; - - if (length > 127) - { - int size = 1; - int val = length; - - while ((val >>>= 8) != 0) - { - size++; - } - - for (int i = (size - 1) * 8; i >= 0; i -= 8) - { - count++; - } - } - - return count; - } - - static int calculateTagLength(int tagNo) - throws IOException - { - int length = 1; - - if (tagNo >= 31) - { - if (tagNo < 128) - { - length++; - } - else - { - byte[] stack = new byte[5]; - int pos = stack.length; - - stack[--pos] = (byte)(tagNo & 0x7F); - - do - { - tagNo >>= 7; - stack[--pos] = (byte)(tagNo & 0x7F | 0x80); - } - while (tagNo > 127); - - length += stack.length - pos; - } - } - - return length; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/bc/BCObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/bc/BCObjectIdentifiers.java deleted file mode 100644 index c0c7681..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/bc/BCObjectIdentifiers.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.asn1.bc; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface BCObjectIdentifiers -{ - /** - * iso.org.dod.internet.private.enterprise.legion-of-the-bouncy-castle - * - * 1.3.6.1.4.1.22554 - */ - public static final ASN1ObjectIdentifier bc = new ASN1ObjectIdentifier("1.3.6.1.4.1.22554"); - - /** - * pbe(1) algorithms - */ - public static final ASN1ObjectIdentifier bc_pbe = new ASN1ObjectIdentifier(bc.getId() + ".1"); - - /** - * SHA-1(1) - */ - public static final ASN1ObjectIdentifier bc_pbe_sha1 = new ASN1ObjectIdentifier(bc_pbe.getId() + ".1"); - - /** - * SHA-2(2) . (SHA-256(1)|SHA-384(2)|SHA-512(3)|SHA-224(4)) - */ - public static final ASN1ObjectIdentifier bc_pbe_sha256 = new ASN1ObjectIdentifier(bc_pbe.getId() + ".2.1"); - public static final ASN1ObjectIdentifier bc_pbe_sha384 = new ASN1ObjectIdentifier(bc_pbe.getId() + ".2.2"); - public static final ASN1ObjectIdentifier bc_pbe_sha512 = new ASN1ObjectIdentifier(bc_pbe.getId() + ".2.3"); - public static final ASN1ObjectIdentifier bc_pbe_sha224 = new ASN1ObjectIdentifier(bc_pbe.getId() + ".2.4"); - - /** - * PKCS-5(1)|PKCS-12(2) - */ - public static final ASN1ObjectIdentifier bc_pbe_sha1_pkcs5 = new ASN1ObjectIdentifier(bc_pbe_sha1.getId() + ".1"); - public static final ASN1ObjectIdentifier bc_pbe_sha1_pkcs12 = new ASN1ObjectIdentifier(bc_pbe_sha1.getId() + ".2"); - - public static final ASN1ObjectIdentifier bc_pbe_sha256_pkcs5 = new ASN1ObjectIdentifier(bc_pbe_sha256.getId() + ".1"); - public static final ASN1ObjectIdentifier bc_pbe_sha256_pkcs12 = new ASN1ObjectIdentifier(bc_pbe_sha256.getId() + ".2"); - - /** - * AES(1) . (CBC-128(2)|CBC-192(22)|CBC-256(42)) - */ - public static final ASN1ObjectIdentifier bc_pbe_sha1_pkcs12_aes128_cbc = new ASN1ObjectIdentifier(bc_pbe_sha1_pkcs12.getId() + ".1.2"); - public static final ASN1ObjectIdentifier bc_pbe_sha1_pkcs12_aes192_cbc = new ASN1ObjectIdentifier(bc_pbe_sha1_pkcs12.getId() + ".1.22"); - public static final ASN1ObjectIdentifier bc_pbe_sha1_pkcs12_aes256_cbc = new ASN1ObjectIdentifier(bc_pbe_sha1_pkcs12.getId() + ".1.42"); - - public static final ASN1ObjectIdentifier bc_pbe_sha256_pkcs12_aes128_cbc = new ASN1ObjectIdentifier(bc_pbe_sha256_pkcs12.getId() + ".1.2"); - public static final ASN1ObjectIdentifier bc_pbe_sha256_pkcs12_aes192_cbc = new ASN1ObjectIdentifier(bc_pbe_sha256_pkcs12.getId() + ".1.22"); - public static final ASN1ObjectIdentifier bc_pbe_sha256_pkcs12_aes256_cbc = new ASN1ObjectIdentifier(bc_pbe_sha256_pkcs12.getId() + ".1.42"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CAKeyUpdAnnContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CAKeyUpdAnnContent.java deleted file mode 100644 index 800eed2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CAKeyUpdAnnContent.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class CAKeyUpdAnnContent - extends ASN1Object -{ - private CMPCertificate oldWithNew; - private CMPCertificate newWithOld; - private CMPCertificate newWithNew; - - private CAKeyUpdAnnContent(ASN1Sequence seq) - { - oldWithNew = CMPCertificate.getInstance(seq.getObjectAt(0)); - newWithOld = CMPCertificate.getInstance(seq.getObjectAt(1)); - newWithNew = CMPCertificate.getInstance(seq.getObjectAt(2)); - } - - public static CAKeyUpdAnnContent getInstance(Object o) - { - if (o instanceof CAKeyUpdAnnContent) - { - return (CAKeyUpdAnnContent)o; - } - - if (o != null) - { - return new CAKeyUpdAnnContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CAKeyUpdAnnContent(CMPCertificate oldWithNew, CMPCertificate newWithOld, CMPCertificate newWithNew) - { - this.oldWithNew = oldWithNew; - this.newWithOld = newWithOld; - this.newWithNew = newWithNew; - } - - public CMPCertificate getOldWithNew() - { - return oldWithNew; - } - - public CMPCertificate getNewWithOld() - { - return newWithOld; - } - - public CMPCertificate getNewWithNew() - { - return newWithNew; - } - - /** - *

    -     * CAKeyUpdAnnContent ::= SEQUENCE {
    -     *                             oldWithNew   CMPCertificate, -- old pub signed with new priv
    -     *                             newWithOld   CMPCertificate, -- new pub signed with old priv
    -     *                             newWithNew   CMPCertificate  -- new pub signed with new priv
    -     *  }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oldWithNew); - v.add(newWithOld); - v.add(newWithNew); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPCertificate.java deleted file mode 100644 index d1c9f53..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPCertificate.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AttributeCertificate; -import org.bc.asn1.x509.Certificate; - -public class CMPCertificate - extends ASN1Object - implements ASN1Choice -{ - private Certificate x509v3PKCert; - private AttributeCertificate x509v2AttrCert; - - /** - * Note: the addition of attribute certificates is a BC extension. - */ - public CMPCertificate(AttributeCertificate x509v2AttrCert) - { - this.x509v2AttrCert = x509v2AttrCert; - } - - public CMPCertificate(Certificate x509v3PKCert) - { - if (x509v3PKCert.getVersionNumber() != 3) - { - throw new IllegalArgumentException("only version 3 certificates allowed"); - } - - this.x509v3PKCert = x509v3PKCert; - } - - public static CMPCertificate getInstance(Object o) - { - if (o == null || o instanceof CMPCertificate) - { - return (CMPCertificate)o; - } - - if (o instanceof ASN1Sequence || o instanceof byte[]) - { - return new CMPCertificate(Certificate.getInstance(o)); - } - - if (o instanceof ASN1TaggedObject) - { - return new CMPCertificate(AttributeCertificate.getInstance(((ASN1TaggedObject)o).getObject())); - } - - throw new IllegalArgumentException("Invalid object: " + o.getClass().getName()); - } - - public boolean isX509v3PKCert() - { - return x509v3PKCert != null; - } - - public Certificate getX509v3PKCert() - { - return x509v3PKCert; - } - - public AttributeCertificate getX509v2AttrCert() - { - return x509v2AttrCert; - } - - /** - *
    -     * CMPCertificate ::= CHOICE {
    -     *            x509v3PKCert        Certificate
    -     *            x509v2AttrCert      [1] AttributeCertificate
    -     *  }
    -     * 
    - * Note: the addition of attribute certificates is a BC extension. - * - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - if (x509v2AttrCert != null) - { // explicit following CMP conventions - return new DERTaggedObject(true, 1, x509v2AttrCert); - } - - return x509v3PKCert.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPObjectIdentifiers.java deleted file mode 100644 index 7d026d3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CMPObjectIdentifiers.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface CMPObjectIdentifiers -{ - // RFC 4210 - - // id-PasswordBasedMac OBJECT IDENTIFIER ::= {1 2 840 113533 7 66 13} - static final ASN1ObjectIdentifier passwordBasedMac = new ASN1ObjectIdentifier("1.2.840.113533.7.66.13"); - - // id-DHBasedMac OBJECT IDENTIFIER ::= {1 2 840 113533 7 66 30} - static final ASN1ObjectIdentifier dhBasedMac = new ASN1ObjectIdentifier("1.2.840.113533.7.66.30"); - - // Example InfoTypeAndValue contents include, but are not limited - // to, the following (un-comment in this ASN.1 module and use as - // appropriate for a given environment): - // - // id-it-caProtEncCert OBJECT IDENTIFIER ::= {id-it 1} - // CAProtEncCertValue ::= CMPCertificate - // id-it-signKeyPairTypes OBJECT IDENTIFIER ::= {id-it 2} - // SignKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier - // id-it-encKeyPairTypes OBJECT IDENTIFIER ::= {id-it 3} - // EncKeyPairTypesValue ::= SEQUENCE OF AlgorithmIdentifier - // id-it-preferredSymmAlg OBJECT IDENTIFIER ::= {id-it 4} - // PreferredSymmAlgValue ::= AlgorithmIdentifier - // id-it-caKeyUpdateInfo OBJECT IDENTIFIER ::= {id-it 5} - // CAKeyUpdateInfoValue ::= CAKeyUpdAnnContent - // id-it-currentCRL OBJECT IDENTIFIER ::= {id-it 6} - // CurrentCRLValue ::= CertificateList - // id-it-unsupportedOIDs OBJECT IDENTIFIER ::= {id-it 7} - // UnsupportedOIDsValue ::= SEQUENCE OF OBJECT IDENTIFIER - // id-it-keyPairParamReq OBJECT IDENTIFIER ::= {id-it 10} - // KeyPairParamReqValue ::= OBJECT IDENTIFIER - // id-it-keyPairParamRep OBJECT IDENTIFIER ::= {id-it 11} - // KeyPairParamRepValue ::= AlgorithmIdentifer - // id-it-revPassphrase OBJECT IDENTIFIER ::= {id-it 12} - // RevPassphraseValue ::= EncryptedValue - // id-it-implicitConfirm OBJECT IDENTIFIER ::= {id-it 13} - // ImplicitConfirmValue ::= NULL - // id-it-confirmWaitTime OBJECT IDENTIFIER ::= {id-it 14} - // ConfirmWaitTimeValue ::= GeneralizedTime - // id-it-origPKIMessage OBJECT IDENTIFIER ::= {id-it 15} - // OrigPKIMessageValue ::= PKIMessages - // id-it-suppLangTags OBJECT IDENTIFIER ::= {id-it 16} - // SuppLangTagsValue ::= SEQUENCE OF UTF8String - // - // where - // - // id-pkix OBJECT IDENTIFIER ::= { - // iso(1) identified-organization(3) - // dod(6) internet(1) security(5) mechanisms(5) pkix(7)} - // and - // id-it OBJECT IDENTIFIER ::= {id-pkix 4} - static final ASN1ObjectIdentifier it_caProtEncCert = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.1"); - static final ASN1ObjectIdentifier it_signKeyPairTypes = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.2"); - static final ASN1ObjectIdentifier it_encKeyPairTypes = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.3"); - static final ASN1ObjectIdentifier it_preferredSymAlg = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.4"); - static final ASN1ObjectIdentifier it_caKeyUpdateInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.5"); - static final ASN1ObjectIdentifier it_currentCRL = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.6"); - static final ASN1ObjectIdentifier it_unsupportedOIDs = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.7"); - static final ASN1ObjectIdentifier it_keyPairParamReq = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.10"); - static final ASN1ObjectIdentifier it_keyPairParamRep = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.11"); - static final ASN1ObjectIdentifier it_revPassphrase = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.12"); - static final ASN1ObjectIdentifier it_implicitConfirm = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.13"); - static final ASN1ObjectIdentifier it_confirmWaitTime = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.14"); - static final ASN1ObjectIdentifier it_origPKIMessage = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.15"); - static final ASN1ObjectIdentifier it_suppLangTags = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.4.16"); - - // RFC 4211 - - // id-pkix OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) - // dod(6) internet(1) security(5) mechanisms(5) pkix(7) } - // - // arc for Internet X.509 PKI protocols and their components - // id-pkip OBJECT IDENTIFIER :: { id-pkix pkip(5) } - // - // arc for Registration Controls in CRMF - // id-regCtrl OBJECT IDENTIFIER ::= { id-pkip regCtrl(1) } - // - // arc for Registration Info in CRMF - // id-regInfo OBJECT IDENTIFIER ::= { id-pkip id-regInfo(2) } - - static final ASN1ObjectIdentifier regCtrl_regToken = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.1"); - static final ASN1ObjectIdentifier regCtrl_authenticator = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.2"); - static final ASN1ObjectIdentifier regCtrl_pkiPublicationInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.3"); - static final ASN1ObjectIdentifier regCtrl_pkiArchiveOptions = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.4"); - static final ASN1ObjectIdentifier regCtrl_oldCertID = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.5"); - static final ASN1ObjectIdentifier regCtrl_protocolEncrKey = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.6"); - - // From RFC4210: - // id-regCtrl-altCertTemplate OBJECT IDENTIFIER ::= {id-regCtrl 7} - static final ASN1ObjectIdentifier regCtrl_altCertTemplate = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.1.7"); - - static final ASN1ObjectIdentifier regInfo_utf8Pairs = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.2.1"); - static final ASN1ObjectIdentifier regInfo_certReq = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.5.2.2"); - - // id-smime OBJECT IDENTIFIER ::= { iso(1) member-body(2) - // us(840) rsadsi(113549) pkcs(1) pkcs9(9) 16 } - // - // id-ct OBJECT IDENTIFIER ::= { id-smime 1 } -- content types - // - // id-ct-encKeyWithID OBJECT IDENTIFIER ::= {id-ct 21} - static final ASN1ObjectIdentifier ct_encKeyWithID = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.1.21"); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CRLAnnContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CRLAnnContent.java deleted file mode 100644 index 7834f3b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CRLAnnContent.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.CertificateList; - -public class CRLAnnContent - extends ASN1Object -{ - private ASN1Sequence content; - - private CRLAnnContent(ASN1Sequence seq) - { - content = seq; - } - - public static CRLAnnContent getInstance(Object o) - { - if (o instanceof CRLAnnContent) - { - return (CRLAnnContent)o; - } - - if (o != null) - { - return new CRLAnnContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CRLAnnContent(CertificateList crl) - { - this.content = new DERSequence(crl); - } - - public CertificateList[] getCertificateLists() - { - CertificateList[] result = new CertificateList[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = CertificateList.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * CRLAnnContent ::= SEQUENCE OF CertificateList
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertConfirmContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertConfirmContent.java deleted file mode 100644 index 71dd6d4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertConfirmContent.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; - -public class CertConfirmContent - extends ASN1Object -{ - private ASN1Sequence content; - - private CertConfirmContent(ASN1Sequence seq) - { - content = seq; - } - - public static CertConfirmContent getInstance(Object o) - { - if (o instanceof CertConfirmContent) - { - return (CertConfirmContent)o; - } - - if (o != null) - { - return new CertConfirmContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertStatus[] toCertStatusArray() - { - CertStatus[] result = new CertStatus[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = CertStatus.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * CertConfirmContent ::= SEQUENCE OF CertStatus
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertOrEncCert.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertOrEncCert.java deleted file mode 100644 index 32b0ee3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertOrEncCert.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.EncryptedValue; - -public class CertOrEncCert - extends ASN1Object - implements ASN1Choice -{ - private CMPCertificate certificate; - private EncryptedValue encryptedCert; - - private CertOrEncCert(ASN1TaggedObject tagged) - { - if (tagged.getTagNo() == 0) - { - certificate = CMPCertificate.getInstance(tagged.getObject()); - } - else if (tagged.getTagNo() == 1) - { - encryptedCert = EncryptedValue.getInstance(tagged.getObject()); - } - else - { - throw new IllegalArgumentException("unknown tag: " + tagged.getTagNo()); - } - } - - public static CertOrEncCert getInstance(Object o) - { - if (o instanceof CertOrEncCert) - { - return (CertOrEncCert)o; - } - - if (o instanceof ASN1TaggedObject) - { - return new CertOrEncCert((ASN1TaggedObject)o); - } - - return null; - } - - public CertOrEncCert(CMPCertificate certificate) - { - if (certificate == null) - { - throw new IllegalArgumentException("'certificate' cannot be null"); - } - - this.certificate = certificate; - } - - public CertOrEncCert(EncryptedValue encryptedCert) - { - if (encryptedCert == null) - { - throw new IllegalArgumentException("'encryptedCert' cannot be null"); - } - - this.encryptedCert = encryptedCert; - } - - public CMPCertificate getCertificate() - { - return certificate; - } - - public EncryptedValue getEncryptedCert() - { - return encryptedCert; - } - - /** - *
    -     * CertOrEncCert ::= CHOICE {
    -     *                      certificate     [0] CMPCertificate,
    -     *                      encryptedCert   [1] EncryptedValue
    -     *           }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - if (certificate != null) - { - return new DERTaggedObject(true, 0, certificate); - } - - return new DERTaggedObject(true, 1, encryptedCert); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertRepMessage.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertRepMessage.java deleted file mode 100644 index b02107c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertRepMessage.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class CertRepMessage - extends ASN1Object -{ - private ASN1Sequence caPubs; - private ASN1Sequence response; - - private CertRepMessage(ASN1Sequence seq) - { - int index = 0; - - if (seq.size() > 1) - { - caPubs = ASN1Sequence.getInstance((ASN1TaggedObject)seq.getObjectAt(index++), true); - } - - response = ASN1Sequence.getInstance(seq.getObjectAt(index)); - } - - public static CertRepMessage getInstance(Object o) - { - if (o instanceof CertRepMessage) - { - return (CertRepMessage)o; - } - - if (o != null) - { - return new CertRepMessage(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertRepMessage(CMPCertificate[] caPubs, CertResponse[] response) - { - if (response == null) - { - throw new IllegalArgumentException("'response' cannot be null"); - } - - if (caPubs != null) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < caPubs.length; i++) - { - v.add(caPubs[i]); - } - this.caPubs = new DERSequence(v); - } - - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < response.length; i++) - { - v.add(response[i]); - } - this.response = new DERSequence(v); - } - } - - public CMPCertificate[] getCaPubs() - { - if (caPubs == null) - { - return null; - } - - CMPCertificate[] results = new CMPCertificate[caPubs.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CMPCertificate.getInstance(caPubs.getObjectAt(i)); - } - - return results; - } - - public CertResponse[] getResponse() - { - CertResponse[] results = new CertResponse[response.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CertResponse.getInstance(response.getObjectAt(i)); - } - - return results; - } - - /** - *
    -     * CertRepMessage ::= SEQUENCE {
    -     *                          caPubs       [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate
    -     *                                                                             OPTIONAL,
    -     *                          response         SEQUENCE OF CertResponse
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (caPubs != null) - { - v.add(new DERTaggedObject(true, 1, caPubs)); - } - - v.add(response); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertResponse.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertResponse.java deleted file mode 100644 index 48f7df8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertResponse.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class CertResponse - extends ASN1Object -{ - private ASN1Integer certReqId; - private PKIStatusInfo status; - private CertifiedKeyPair certifiedKeyPair; - private ASN1OctetString rspInfo; - - private CertResponse(ASN1Sequence seq) - { - certReqId = ASN1Integer.getInstance(seq.getObjectAt(0)); - status = PKIStatusInfo.getInstance(seq.getObjectAt(1)); - - if (seq.size() >= 3) - { - if (seq.size() == 3) - { - ASN1Encodable o = seq.getObjectAt(2); - if (o instanceof ASN1OctetString) - { - rspInfo = ASN1OctetString.getInstance(o); - } - else - { - certifiedKeyPair = CertifiedKeyPair.getInstance(o); - } - } - else - { - certifiedKeyPair = CertifiedKeyPair.getInstance(seq.getObjectAt(2)); - rspInfo = ASN1OctetString.getInstance(seq.getObjectAt(3)); - } - } - } - - public static CertResponse getInstance(Object o) - { - if (o instanceof CertResponse) - { - return (CertResponse)o; - } - - if (o != null) - { - return new CertResponse(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertResponse( - ASN1Integer certReqId, - PKIStatusInfo status) - { - this(certReqId, status, null, null); - } - - public CertResponse( - ASN1Integer certReqId, - PKIStatusInfo status, - CertifiedKeyPair certifiedKeyPair, - ASN1OctetString rspInfo) - { - if (certReqId == null) - { - throw new IllegalArgumentException("'certReqId' cannot be null"); - } - if (status == null) - { - throw new IllegalArgumentException("'status' cannot be null"); - } - this.certReqId = certReqId; - this.status = status; - this.certifiedKeyPair = certifiedKeyPair; - this.rspInfo = rspInfo; - } - - public ASN1Integer getCertReqId() - { - return certReqId; - } - - public PKIStatusInfo getStatus() - { - return status; - } - - public CertifiedKeyPair getCertifiedKeyPair() - { - return certifiedKeyPair; - } - - /** - *
    -     * CertResponse ::= SEQUENCE {
    -     *                            certReqId           INTEGER,
    -     *                            -- to match this response with corresponding request (a value
    -     *                            -- of -1 is to be used if certReqId is not specified in the
    -     *                            -- corresponding request)
    -     *                            status              PKIStatusInfo,
    -     *                            certifiedKeyPair    CertifiedKeyPair    OPTIONAL,
    -     *                            rspInfo             OCTET STRING        OPTIONAL
    -     *                            -- analogous to the id-regInfo-utf8Pairs string defined
    -     *                            -- for regInfo in CertReqMsg [CRMF]
    -     *             }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certReqId); - v.add(status); - - if (certifiedKeyPair != null) - { - v.add(certifiedKeyPair); - } - - if (rspInfo != null) - { - v.add(rspInfo); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertStatus.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertStatus.java deleted file mode 100644 index 6c380bf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertStatus.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bc.asn1.cmp; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class CertStatus - extends ASN1Object -{ - private ASN1OctetString certHash; - private ASN1Integer certReqId; - private PKIStatusInfo statusInfo; - - private CertStatus(ASN1Sequence seq) - { - certHash = ASN1OctetString.getInstance(seq.getObjectAt(0)); - certReqId = ASN1Integer.getInstance(seq.getObjectAt(1)); - - if (seq.size() > 2) - { - statusInfo = PKIStatusInfo.getInstance(seq.getObjectAt(2)); - } - } - - public CertStatus(byte[] certHash, BigInteger certReqId) - { - this.certHash = new DEROctetString(certHash); - this.certReqId = new ASN1Integer(certReqId); - } - - public CertStatus(byte[] certHash, BigInteger certReqId, PKIStatusInfo statusInfo) - { - this.certHash = new DEROctetString(certHash); - this.certReqId = new ASN1Integer(certReqId); - this.statusInfo = statusInfo; - } - - public static CertStatus getInstance(Object o) - { - if (o instanceof CertStatus) - { - return (CertStatus)o; - } - - if (o != null) - { - return new CertStatus(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1OctetString getCertHash() - { - return certHash; - } - - public ASN1Integer getCertReqId() - { - return certReqId; - } - - public PKIStatusInfo getStatusInfo() - { - return statusInfo; - } - - /** - *
    -     * CertStatus ::= SEQUENCE {
    -     *                   certHash    OCTET STRING,
    -     *                   -- the hash of the certificate, using the same hash algorithm
    -     *                   -- as is used to create and verify the certificate signature
    -     *                   certReqId   INTEGER,
    -     *                   -- to match this confirmation with the corresponding req/rep
    -     *                   statusInfo  PKIStatusInfo OPTIONAL
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certHash); - v.add(certReqId); - - if (statusInfo != null) - { - v.add(statusInfo); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertifiedKeyPair.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertifiedKeyPair.java deleted file mode 100644 index b59cd42..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/CertifiedKeyPair.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.EncryptedValue; -import org.bc.asn1.crmf.PKIPublicationInfo; - -public class CertifiedKeyPair - extends ASN1Object -{ - private CertOrEncCert certOrEncCert; - private EncryptedValue privateKey; - private PKIPublicationInfo publicationInfo; - - private CertifiedKeyPair(ASN1Sequence seq) - { - certOrEncCert = CertOrEncCert.getInstance(seq.getObjectAt(0)); - - if (seq.size() >= 2) - { - if (seq.size() == 2) - { - ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(seq.getObjectAt(1)); - if (tagged.getTagNo() == 0) - { - privateKey = EncryptedValue.getInstance(tagged.getObject()); - } - else - { - publicationInfo = PKIPublicationInfo.getInstance(tagged.getObject()); - } - } - else - { - privateKey = EncryptedValue.getInstance(ASN1TaggedObject.getInstance(seq.getObjectAt(1))); - publicationInfo = PKIPublicationInfo.getInstance(ASN1TaggedObject.getInstance(seq.getObjectAt(2))); - } - } - } - - public static CertifiedKeyPair getInstance(Object o) - { - if (o instanceof CertifiedKeyPair) - { - return (CertifiedKeyPair)o; - } - - if (o != null) - { - return new CertifiedKeyPair(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertifiedKeyPair( - CertOrEncCert certOrEncCert) - { - this(certOrEncCert, null, null); - } - - public CertifiedKeyPair( - CertOrEncCert certOrEncCert, - EncryptedValue privateKey, - PKIPublicationInfo publicationInfo - ) - { - if (certOrEncCert == null) - { - throw new IllegalArgumentException("'certOrEncCert' cannot be null"); - } - - this.certOrEncCert = certOrEncCert; - this.privateKey = privateKey; - this.publicationInfo = publicationInfo; - } - - public CertOrEncCert getCertOrEncCert() - { - return certOrEncCert; - } - - public EncryptedValue getPrivateKey() - { - return privateKey; - } - - public PKIPublicationInfo getPublicationInfo() - { - return publicationInfo; - } - - /** - *
    -     * CertifiedKeyPair ::= SEQUENCE {
    -     *                                  certOrEncCert       CertOrEncCert,
    -     *                                  privateKey      [0] EncryptedValue      OPTIONAL,
    -     *                                  -- see [CRMF] for comment on encoding
    -     *                                  publicationInfo [1] PKIPublicationInfo  OPTIONAL
    -     *       }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certOrEncCert); - - if (privateKey != null) - { - v.add(new DERTaggedObject(true, 0, privateKey)); - } - - if (publicationInfo != null) - { - v.add(new DERTaggedObject(true, 1, publicationInfo)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/Challenge.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/Challenge.java deleted file mode 100644 index f20b3ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/Challenge.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class Challenge - extends ASN1Object -{ - private AlgorithmIdentifier owf; - private ASN1OctetString witness; - private ASN1OctetString challenge; - - private Challenge(ASN1Sequence seq) - { - int index = 0; - - if (seq.size() == 3) - { - owf = AlgorithmIdentifier.getInstance(seq.getObjectAt(index++)); - } - - witness = ASN1OctetString.getInstance(seq.getObjectAt(index++)); - challenge = ASN1OctetString.getInstance(seq.getObjectAt(index)); - } - - public static Challenge getInstance(Object o) - { - if (o instanceof Challenge) - { - return (Challenge)o; - } - - if (o != null) - { - return new Challenge(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public Challenge(byte[] witness, byte[] challenge) - { - this(null, witness, challenge); - } - - public Challenge(AlgorithmIdentifier owf, byte[] witness, byte[] challenge) - { - this.owf = owf; - this.witness = new DEROctetString(witness); - this.challenge = new DEROctetString(challenge); - } - - public AlgorithmIdentifier getOwf() - { - return owf; - } - - public byte[] getWitness() - { - return witness.getOctets(); - } - - public byte[] getChallenge() - { - return challenge.getOctets(); - } - - /** - *
    -     * Challenge ::= SEQUENCE {
    -     *                 owf                 AlgorithmIdentifier  OPTIONAL,
    -     *
    -     *                 -- MUST be present in the first Challenge; MAY be omitted in
    -     *                 -- any subsequent Challenge in POPODecKeyChallContent (if
    -     *                 -- omitted, then the owf used in the immediately preceding
    -     *                 -- Challenge is to be used).
    -     *
    -     *                 witness             OCTET STRING,
    -     *                 -- the result of applying the one-way function (owf) to a
    -     *                 -- randomly-generated INTEGER, A.  [Note that a different
    -     *                 -- INTEGER MUST be used for each Challenge.]
    -     *                 challenge           OCTET STRING
    -     *                 -- the encryption (under the public key for which the cert.
    -     *                 -- request is being made) of Rand, where Rand is specified as
    -     *                 --   Rand ::= SEQUENCE {
    -     *                 --      int      INTEGER,
    -     *                 --       - the randomly-generated INTEGER A (above)
    -     *                 --      sender   GeneralName
    -     *                 --       - the sender's name (as included in PKIHeader)
    -     *                 --   }
    -     *      }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - addOptional(v, owf); - v.add(witness); - v.add(challenge); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, ASN1Encodable obj) - { - if (obj != null) - { - v.add(obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ErrorMsgContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ErrorMsgContent.java deleted file mode 100644 index de659ce..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ErrorMsgContent.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class ErrorMsgContent - extends ASN1Object -{ - private PKIStatusInfo pkiStatusInfo; - private ASN1Integer errorCode; - private PKIFreeText errorDetails; - - private ErrorMsgContent(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - pkiStatusInfo = PKIStatusInfo.getInstance(en.nextElement()); - - while (en.hasMoreElements()) - { - Object o = en.nextElement(); - - if (o instanceof ASN1Integer) - { - errorCode = ASN1Integer.getInstance(o); - } - else - { - errorDetails = PKIFreeText.getInstance(o); - } - } - } - - public static ErrorMsgContent getInstance(Object o) - { - if (o instanceof ErrorMsgContent) - { - return (ErrorMsgContent)o; - } - - if (o != null) - { - return new ErrorMsgContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ErrorMsgContent(PKIStatusInfo pkiStatusInfo) - { - this(pkiStatusInfo, null, null); - } - - public ErrorMsgContent( - PKIStatusInfo pkiStatusInfo, - ASN1Integer errorCode, - PKIFreeText errorDetails) - { - if (pkiStatusInfo == null) - { - throw new IllegalArgumentException("'pkiStatusInfo' cannot be null"); - } - - this.pkiStatusInfo = pkiStatusInfo; - this.errorCode = errorCode; - this.errorDetails = errorDetails; - } - - public PKIStatusInfo getPKIStatusInfo() - { - return pkiStatusInfo; - } - - public ASN1Integer getErrorCode() - { - return errorCode; - } - - public PKIFreeText getErrorDetails() - { - return errorDetails; - } - - /** - *
    -     * ErrorMsgContent ::= SEQUENCE {
    -     *                        pKIStatusInfo          PKIStatusInfo,
    -     *                        errorCode              INTEGER           OPTIONAL,
    -     *                        -- implementation-specific error codes
    -     *                        errorDetails           PKIFreeText       OPTIONAL
    -     *                        -- implementation-specific error details
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(pkiStatusInfo); - addOptional(v, errorCode); - addOptional(v, errorDetails); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, ASN1Encodable obj) - { - if (obj != null) - { - v.add(obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenMsgContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenMsgContent.java deleted file mode 100644 index 405138c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenMsgContent.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class GenMsgContent - extends ASN1Object -{ - private ASN1Sequence content; - - private GenMsgContent(ASN1Sequence seq) - { - content = seq; - } - - public static GenMsgContent getInstance(Object o) - { - if (o instanceof GenMsgContent) - { - return (GenMsgContent)o; - } - - if (o != null) - { - return new GenMsgContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public GenMsgContent(InfoTypeAndValue itv) - { - content = new DERSequence(itv); - } - - public GenMsgContent(InfoTypeAndValue[] itv) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < itv.length; i++) - { - v.add(itv[i]); - } - content = new DERSequence(v); - } - - public InfoTypeAndValue[] toInfoTypeAndValueArray() - { - InfoTypeAndValue[] result = new InfoTypeAndValue[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = InfoTypeAndValue.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * GenMsgContent ::= SEQUENCE OF InfoTypeAndValue
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenRepContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenRepContent.java deleted file mode 100644 index 9597a9f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/GenRepContent.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class GenRepContent - extends ASN1Object -{ - private ASN1Sequence content; - - private GenRepContent(ASN1Sequence seq) - { - content = seq; - } - - public static GenRepContent getInstance(Object o) - { - if (o instanceof GenRepContent) - { - return (GenRepContent)o; - } - - if (o != null) - { - return new GenRepContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public GenRepContent(InfoTypeAndValue itv) - { - content = new DERSequence(itv); - } - - public GenRepContent(InfoTypeAndValue[] itv) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < itv.length; i++) - { - v.add(itv[i]); - } - content = new DERSequence(v); - } - - public InfoTypeAndValue[] toInfoTypeAndValueArray() - { - InfoTypeAndValue[] result = new InfoTypeAndValue[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = InfoTypeAndValue.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * GenRepContent ::= SEQUENCE OF InfoTypeAndValue
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/InfoTypeAndValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/InfoTypeAndValue.java deleted file mode 100644 index 167e6f4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/InfoTypeAndValue.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * Example InfoTypeAndValue contents include, but are not limited - * to, the following (un-comment in this ASN.1 module and use as - * appropriate for a given environment): - *
    - *   id-it-caProtEncCert    OBJECT IDENTIFIER ::= {id-it 1}
    - *      CAProtEncCertValue      ::= CMPCertificate
    - *   id-it-signKeyPairTypes OBJECT IDENTIFIER ::= {id-it 2}
    - *     SignKeyPairTypesValue   ::= SEQUENCE OF AlgorithmIdentifier
    - *   id-it-encKeyPairTypes  OBJECT IDENTIFIER ::= {id-it 3}
    - *     EncKeyPairTypesValue    ::= SEQUENCE OF AlgorithmIdentifier
    - *   id-it-preferredSymmAlg OBJECT IDENTIFIER ::= {id-it 4}
    - *      PreferredSymmAlgValue   ::= AlgorithmIdentifier
    - *   id-it-caKeyUpdateInfo  OBJECT IDENTIFIER ::= {id-it 5}
    - *      CAKeyUpdateInfoValue    ::= CAKeyUpdAnnContent
    - *   id-it-currentCRL       OBJECT IDENTIFIER ::= {id-it 6}
    - *      CurrentCRLValue         ::= CertificateList
    - *   id-it-unsupportedOIDs  OBJECT IDENTIFIER ::= {id-it 7}
    - *      UnsupportedOIDsValue    ::= SEQUENCE OF OBJECT IDENTIFIER
    - *   id-it-keyPairParamReq  OBJECT IDENTIFIER ::= {id-it 10}
    - *      KeyPairParamReqValue    ::= OBJECT IDENTIFIER
    - *   id-it-keyPairParamRep  OBJECT IDENTIFIER ::= {id-it 11}
    - *      KeyPairParamRepValue    ::= AlgorithmIdentifer
    - *   id-it-revPassphrase    OBJECT IDENTIFIER ::= {id-it 12}
    - *      RevPassphraseValue      ::= EncryptedValue
    - *   id-it-implicitConfirm  OBJECT IDENTIFIER ::= {id-it 13}
    - *      ImplicitConfirmValue    ::= NULL
    - *   id-it-confirmWaitTime  OBJECT IDENTIFIER ::= {id-it 14}
    - *      ConfirmWaitTimeValue    ::= GeneralizedTime
    - *   id-it-origPKIMessage   OBJECT IDENTIFIER ::= {id-it 15}
    - *      OrigPKIMessageValue     ::= PKIMessages
    - *   id-it-suppLangTags     OBJECT IDENTIFIER ::= {id-it 16}
    - *      SuppLangTagsValue       ::= SEQUENCE OF UTF8String
    - *
    - * where
    - *
    - *   id-pkix OBJECT IDENTIFIER ::= {
    - *      iso(1) identified-organization(3)
    - *      dod(6) internet(1) security(5) mechanisms(5) pkix(7)}
    - * and
    - *      id-it   OBJECT IDENTIFIER ::= {id-pkix 4}
    - * 
    - */ -public class InfoTypeAndValue - extends ASN1Object -{ - private ASN1ObjectIdentifier infoType; - private ASN1Encodable infoValue; - - private InfoTypeAndValue(ASN1Sequence seq) - { - infoType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - infoValue = (ASN1Encodable)seq.getObjectAt(1); - } - } - - public static InfoTypeAndValue getInstance(Object o) - { - if (o instanceof InfoTypeAndValue) - { - return (InfoTypeAndValue)o; - } - - if (o != null) - { - return new InfoTypeAndValue(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public InfoTypeAndValue( - ASN1ObjectIdentifier infoType) - { - this.infoType = infoType; - this.infoValue = null; - } - - public InfoTypeAndValue( - ASN1ObjectIdentifier infoType, - ASN1Encodable optionalValue) - { - this.infoType = infoType; - this.infoValue = optionalValue; - } - - public ASN1ObjectIdentifier getInfoType() - { - return infoType; - } - - public ASN1Encodable getInfoValue() - { - return infoValue; - } - - /** - *
    -     * InfoTypeAndValue ::= SEQUENCE {
    -     *                         infoType               OBJECT IDENTIFIER,
    -     *                         infoValue              ANY DEFINED BY infoType  OPTIONAL
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(infoType); - - if (infoValue != null) - { - v.add(infoValue); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/KeyRecRepContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/KeyRecRepContent.java deleted file mode 100644 index bf96e4c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/KeyRecRepContent.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class KeyRecRepContent - extends ASN1Object -{ - private PKIStatusInfo status; - private CMPCertificate newSigCert; - private ASN1Sequence caCerts; - private ASN1Sequence keyPairHist; - - private KeyRecRepContent(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - status = PKIStatusInfo.getInstance(en.nextElement()); - - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = ASN1TaggedObject.getInstance(en.nextElement()); - - switch (tObj.getTagNo()) - { - case 0: - newSigCert = CMPCertificate.getInstance(tObj.getObject()); - break; - case 1: - caCerts = ASN1Sequence.getInstance(tObj.getObject()); - break; - case 2: - keyPairHist = ASN1Sequence.getInstance(tObj.getObject()); - break; - default: - throw new IllegalArgumentException("unknown tag number: " + tObj.getTagNo()); - } - } - } - - public static KeyRecRepContent getInstance(Object o) - { - if (o instanceof KeyRecRepContent) - { - return (KeyRecRepContent)o; - } - - if (o != null) - { - return new KeyRecRepContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - - public PKIStatusInfo getStatus() - { - return status; - } - - public CMPCertificate getNewSigCert() - { - return newSigCert; - } - - public CMPCertificate[] getCaCerts() - { - if (caCerts == null) - { - return null; - } - - CMPCertificate[] results = new CMPCertificate[caCerts.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CMPCertificate.getInstance(caCerts.getObjectAt(i)); - } - - return results; - } - - public CertifiedKeyPair[] getKeyPairHist() - { - if (keyPairHist == null) - { - return null; - } - - CertifiedKeyPair[] results = new CertifiedKeyPair[keyPairHist.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CertifiedKeyPair.getInstance(keyPairHist.getObjectAt(i)); - } - - return results; - } - - /** - *
    -     * KeyRecRepContent ::= SEQUENCE {
    -     *                         status                  PKIStatusInfo,
    -     *                         newSigCert          [0] CMPCertificate OPTIONAL,
    -     *                         caCerts             [1] SEQUENCE SIZE (1..MAX) OF
    -     *                                                           CMPCertificate OPTIONAL,
    -     *                         keyPairHist         [2] SEQUENCE SIZE (1..MAX) OF
    -     *                                                           CertifiedKeyPair OPTIONAL
    -     *              }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(status); - - addOptional(v, 0, newSigCert); - addOptional(v, 1, caCerts); - addOptional(v, 2, keyPairHist); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/OOBCertHash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/OOBCertHash.java deleted file mode 100644 index 25ee23f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/OOBCertHash.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.CertId; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class OOBCertHash - extends ASN1Object -{ - private AlgorithmIdentifier hashAlg; - private CertId certId; - private DERBitString hashVal; - - private OOBCertHash(ASN1Sequence seq) - { - int index = seq.size() - 1; - - hashVal = DERBitString.getInstance(seq.getObjectAt(index--)); - - for (int i = index; i >= 0; i--) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)seq.getObjectAt(i); - - if (tObj.getTagNo() == 0) - { - hashAlg = AlgorithmIdentifier.getInstance(tObj, true); - } - else - { - certId = CertId.getInstance(tObj, true); - } - } - - } - - public static OOBCertHash getInstance(Object o) - { - if (o instanceof OOBCertHash) - { - return (OOBCertHash)o; - } - - if (o != null) - { - return new OOBCertHash(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public OOBCertHash(AlgorithmIdentifier hashAlg, CertId certId, byte[] hashVal) - { - this(hashAlg, certId, new DERBitString(hashVal)); - } - - public OOBCertHash(AlgorithmIdentifier hashAlg, CertId certId, DERBitString hashVal) - { - this.hashAlg = hashAlg; - this.certId = certId; - this.hashVal = hashVal; - } - - public AlgorithmIdentifier getHashAlg() - { - return hashAlg; - } - - public CertId getCertId() - { - return certId; - } - - public DERBitString getHashVal() - { - return hashVal; - } - - /** - *
    -     * OOBCertHash ::= SEQUENCE {
    -     *                      hashAlg     [0] AlgorithmIdentifier     OPTIONAL,
    -     *                      certId      [1] CertId                  OPTIONAL,
    -     *                      hashVal         BIT STRING
    -     *                      -- hashVal is calculated over the DER encoding of the
    -     *                      -- self-signed certificate with the identifier certID.
    -     *       }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - addOptional(v, 0, hashAlg); - addOptional(v, 1, certId); - - v.add(hashVal); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PBMParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PBMParameter.java deleted file mode 100644 index d37681f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PBMParameter.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class PBMParameter - extends ASN1Object -{ - private ASN1OctetString salt; - private AlgorithmIdentifier owf; - private ASN1Integer iterationCount; - private AlgorithmIdentifier mac; - - private PBMParameter(ASN1Sequence seq) - { - salt = ASN1OctetString.getInstance(seq.getObjectAt(0)); - owf = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - iterationCount = ASN1Integer.getInstance(seq.getObjectAt(2)); - mac = AlgorithmIdentifier.getInstance(seq.getObjectAt(3)); - } - - public static PBMParameter getInstance(Object o) - { - if (o instanceof PBMParameter) - { - return (PBMParameter)o; - } - - if (o != null) - { - return new PBMParameter(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PBMParameter( - byte[] salt, - AlgorithmIdentifier owf, - int iterationCount, - AlgorithmIdentifier mac) - { - this(new DEROctetString(salt), owf, - new ASN1Integer(iterationCount), mac); - } - - public PBMParameter( - ASN1OctetString salt, - AlgorithmIdentifier owf, - ASN1Integer iterationCount, - AlgorithmIdentifier mac) - { - this.salt = salt; - this.owf = owf; - this.iterationCount = iterationCount; - this.mac = mac; - } - - public ASN1OctetString getSalt() - { - return salt; - } - - public AlgorithmIdentifier getOwf() - { - return owf; - } - - public ASN1Integer getIterationCount() - { - return iterationCount; - } - - public AlgorithmIdentifier getMac() - { - return mac; - } - - /** - *
    -     *  PBMParameter ::= SEQUENCE {
    -     *                        salt                OCTET STRING,
    -     *                        -- note:  implementations MAY wish to limit acceptable sizes
    -     *                        -- of this string to values appropriate for their environment
    -     *                        -- in order to reduce the risk of denial-of-service attacks
    -     *                        owf                 AlgorithmIdentifier,
    -     *                        -- AlgId for a One-Way Function (SHA-1 recommended)
    -     *                        iterationCount      INTEGER,
    -     *                        -- number of times the OWF is applied
    -     *                        -- note:  implementations MAY wish to limit acceptable sizes
    -     *                        -- of this integer to values appropriate for their environment
    -     *                        -- in order to reduce the risk of denial-of-service attacks
    -     *                        mac                 AlgorithmIdentifier
    -     *                        -- the MAC AlgId (e.g., DES-MAC, Triple-DES-MAC [PKCS11],
    -     *    }   -- or HMAC [RFC2104, RFC2202])
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(salt); - v.add(owf); - v.add(iterationCount); - v.add(mac); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIBody.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIBody.java deleted file mode 100644 index d0e53b6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIBody.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.CertReqMessages; -import org.bc.asn1.pkcs.CertificationRequest; - -public class PKIBody - extends ASN1Object - implements ASN1Choice -{ - public static final int TYPE_INIT_REQ = 0; - public static final int TYPE_INIT_REP = 1; - public static final int TYPE_CERT_REQ = 2; - public static final int TYPE_CERT_REP = 3; - public static final int TYPE_P10_CERT_REQ = 4; - public static final int TYPE_POPO_CHALL = 5; - public static final int TYPE_POPO_REP = 6; - public static final int TYPE_KEY_UPDATE_REQ = 7; - public static final int TYPE_KEY_UPDATE_REP = 8; - public static final int TYPE_KEY_RECOVERY_REQ = 9; - public static final int TYPE_KEY_RECOVERY_REP = 10; - public static final int TYPE_REVOCATION_REQ = 11; - public static final int TYPE_REVOCATION_REP = 12; - public static final int TYPE_CROSS_CERT_REQ = 13; - public static final int TYPE_CROSS_CERT_REP = 14; - public static final int TYPE_CA_KEY_UPDATE_ANN = 15; - public static final int TYPE_CERT_ANN = 16; - public static final int TYPE_REVOCATION_ANN = 17; - public static final int TYPE_CRL_ANN = 18; - public static final int TYPE_CONFIRM = 19; - public static final int TYPE_NESTED = 20; - public static final int TYPE_GEN_MSG = 21; - public static final int TYPE_GEN_REP = 22; - public static final int TYPE_ERROR = 23; - public static final int TYPE_CERT_CONFIRM = 24; - public static final int TYPE_POLL_REQ = 25; - public static final int TYPE_POLL_REP = 26; - - private int tagNo; - private ASN1Encodable body; - - public static PKIBody getInstance(Object o) - { - if (o == null || o instanceof PKIBody) - { - return (PKIBody)o; - } - - if (o instanceof ASN1TaggedObject) - { - return new PKIBody((ASN1TaggedObject)o); - } - - throw new IllegalArgumentException("Invalid object: " + o.getClass().getName()); - } - - private PKIBody(ASN1TaggedObject tagged) - { - tagNo = tagged.getTagNo(); - body = getBodyForType(tagNo, tagged.getObject()); - } - - /** - * Creates a new PKIBody. - * @param type one of the TYPE_* constants - * @param content message content - */ - public PKIBody( - int type, - ASN1Encodable content) - { - tagNo = type; - body = getBodyForType(type, content); - } - - private static ASN1Encodable getBodyForType( - int type, - ASN1Encodable o) - { - switch (type) - { - case TYPE_INIT_REQ: - return CertReqMessages.getInstance(o); - case TYPE_INIT_REP: - return CertRepMessage.getInstance(o); - case TYPE_CERT_REQ: - return CertReqMessages.getInstance(o); - case TYPE_CERT_REP: - return CertRepMessage.getInstance(o); - case TYPE_P10_CERT_REQ: - return CertificationRequest.getInstance(o); - case TYPE_POPO_CHALL: - return POPODecKeyChallContent.getInstance(o); - case TYPE_POPO_REP: - return POPODecKeyRespContent.getInstance(o); - case TYPE_KEY_UPDATE_REQ: - return CertReqMessages.getInstance(o); - case TYPE_KEY_UPDATE_REP: - return CertRepMessage.getInstance(o); - case TYPE_KEY_RECOVERY_REQ: - return CertReqMessages.getInstance(o); - case TYPE_KEY_RECOVERY_REP: - return KeyRecRepContent.getInstance(o); - case TYPE_REVOCATION_REQ: - return RevReqContent.getInstance(o); - case TYPE_REVOCATION_REP: - return RevRepContent.getInstance(o); - case TYPE_CROSS_CERT_REQ: - return CertReqMessages.getInstance(o); - case TYPE_CROSS_CERT_REP: - return CertRepMessage.getInstance(o); - case TYPE_CA_KEY_UPDATE_ANN: - return CAKeyUpdAnnContent.getInstance(o); - case TYPE_CERT_ANN: - return CMPCertificate.getInstance(o); - case TYPE_REVOCATION_ANN: - return RevAnnContent.getInstance(o); - case TYPE_CRL_ANN: - return CRLAnnContent.getInstance(o); - case TYPE_CONFIRM: - return PKIConfirmContent.getInstance(o); - case TYPE_NESTED: - return PKIMessages.getInstance(o); - case TYPE_GEN_MSG: - return GenMsgContent.getInstance(o); - case TYPE_GEN_REP: - return GenRepContent.getInstance(o); - case TYPE_ERROR: - return ErrorMsgContent.getInstance(o); - case TYPE_CERT_CONFIRM: - return CertConfirmContent.getInstance(o); - case TYPE_POLL_REQ: - return PollReqContent.getInstance(o); - case TYPE_POLL_REP: - return PollRepContent.getInstance(o); - default: - throw new IllegalArgumentException("unknown tag number: " + type); - } - } - - public int getType() - { - return tagNo; - } - - public ASN1Encodable getContent() - { - return body; - } - - /** - *
    -     * PKIBody ::= CHOICE {       -- message-specific body elements
    -     *        ir       [0]  CertReqMessages,        --Initialization Request
    -     *        ip       [1]  CertRepMessage,         --Initialization Response
    -     *        cr       [2]  CertReqMessages,        --Certification Request
    -     *        cp       [3]  CertRepMessage,         --Certification Response
    -     *        p10cr    [4]  CertificationRequest,   --imported from [PKCS10]
    -     *        popdecc  [5]  POPODecKeyChallContent, --pop Challenge
    -     *        popdecr  [6]  POPODecKeyRespContent,  --pop Response
    -     *        kur      [7]  CertReqMessages,        --Key Update Request
    -     *        kup      [8]  CertRepMessage,         --Key Update Response
    -     *        krr      [9]  CertReqMessages,        --Key Recovery Request
    -     *        krp      [10] KeyRecRepContent,       --Key Recovery Response
    -     *        rr       [11] RevReqContent,          --Revocation Request
    -     *        rp       [12] RevRepContent,          --Revocation Response
    -     *        ccr      [13] CertReqMessages,        --Cross-Cert. Request
    -     *        ccp      [14] CertRepMessage,         --Cross-Cert. Response
    -     *        ckuann   [15] CAKeyUpdAnnContent,     --CA Key Update Ann.
    -     *        cann     [16] CertAnnContent,         --Certificate Ann.
    -     *        rann     [17] RevAnnContent,          --Revocation Ann.
    -     *        crlann   [18] CRLAnnContent,          --CRL Announcement
    -     *        pkiconf  [19] PKIConfirmContent,      --Confirmation
    -     *        nested   [20] NestedMessageContent,   --Nested Message
    -     *        genm     [21] GenMsgContent,          --General Message
    -     *        genp     [22] GenRepContent,          --General Response
    -     *        error    [23] ErrorMsgContent,        --Error Message
    -     *        certConf [24] CertConfirmContent,     --Certificate confirm
    -     *        pollReq  [25] PollReqContent,         --Polling request
    -     *        pollRep  [26] PollRepContent          --Polling response
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(true, tagNo, body); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIConfirmContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIConfirmContent.java deleted file mode 100644 index 498cc93..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIConfirmContent.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Null; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERNull; - -public class PKIConfirmContent - extends ASN1Object -{ - private ASN1Null val; - - private PKIConfirmContent(ASN1Null val) - { - this.val = val; - } - - public static PKIConfirmContent getInstance(Object o) - { - if (o == null || o instanceof PKIConfirmContent) - { - return (PKIConfirmContent)o; - } - - if (o instanceof ASN1Null) - { - return new PKIConfirmContent((ASN1Null)o); - } - - throw new IllegalArgumentException("Invalid object: " + o.getClass().getName()); - } - - public PKIConfirmContent() - { - val = DERNull.INSTANCE; - } - - /** - *
    -     * PKIConfirmContent ::= NULL
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return val; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFailureInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFailureInfo.java deleted file mode 100644 index 16fc2a4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFailureInfo.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.DERBitString; - -/** - *
    - * PKIFailureInfo ::= BIT STRING {
    - * badAlg               (0),
    - *   -- unrecognized or unsupported Algorithm Identifier
    - * badMessageCheck      (1), -- integrity check failed (e.g., signature did not verify)
    - * badRequest           (2),
    - *   -- transaction not permitted or supported
    - * badTime              (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
    - * badCertId            (4), -- no certificate could be found matching the provided criteria
    - * badDataFormat        (5),
    - *   -- the data submitted has the wrong format
    - * wrongAuthority       (6), -- the authority indicated in the request is different from the one creating the response token
    - * incorrectData        (7), -- the requester's data is incorrect (for notary services)
    - * missingTimeStamp     (8), -- when the timestamp is missing but should be there (by policy)
    - * badPOP               (9)  -- the proof-of-possession failed
    - * certRevoked         (10),
    - * certConfirmed       (11),
    - * wrongIntegrity      (12),
    - * badRecipientNonce   (13), 
    - * timeNotAvailable    (14),
    - *   -- the TSA's time source is not available
    - * unacceptedPolicy    (15),
    - *   -- the requested TSA policy is not supported by the TSA
    - * unacceptedExtension (16),
    - *   -- the requested extension is not supported by the TSA
    - * addInfoNotAvailable (17)
    - *   -- the additional information requested could not be understood
    - *   -- or is not available
    - * badSenderNonce      (18),
    - * badCertTemplate     (19),
    - * signerNotTrusted    (20),
    - * transactionIdInUse  (21),
    - * unsupportedVersion  (22),
    - * notAuthorized       (23),
    - * systemUnavail       (24),    
    - * systemFailure       (25),
    - *   -- the request cannot be handled due to system failure
    - * duplicateCertReq    (26) 
    - * 
    - */ -public class PKIFailureInfo - extends DERBitString -{ - public static final int badAlg = (1 << 7); // unrecognized or unsupported Algorithm Identifier - public static final int badMessageCheck = (1 << 6); // integrity check failed (e.g., signature did not verify) - public static final int badRequest = (1 << 5); - public static final int badTime = (1 << 4); // -- messageTime was not sufficiently close to the system time, as defined by local policy - public static final int badCertId = (1 << 3); // no certificate could be found matching the provided criteria - public static final int badDataFormat = (1 << 2); - public static final int wrongAuthority = (1 << 1); // the authority indicated in the request is different from the one creating the response token - public static final int incorrectData = 1; // the requester's data is incorrect (for notary services) - public static final int missingTimeStamp = (1 << 15); // when the timestamp is missing but should be there (by policy) - public static final int badPOP = (1 << 14); // the proof-of-possession failed - public static final int certRevoked = (1 << 13); - public static final int certConfirmed = (1 << 12); - public static final int wrongIntegrity = (1 << 11); - public static final int badRecipientNonce = (1 << 10); - public static final int timeNotAvailable = (1 << 9); // the TSA's time source is not available - public static final int unacceptedPolicy = (1 << 8); // the requested TSA policy is not supported by the TSA - public static final int unacceptedExtension = (1 << 23); //the requested extension is not supported by the TSA - public static final int addInfoNotAvailable = (1 << 22); //the additional information requested could not be understood or is not available - public static final int badSenderNonce = (1 << 21); - public static final int badCertTemplate = (1 << 20); - public static final int signerNotTrusted = (1 << 19); - public static final int transactionIdInUse = (1 << 18); - public static final int unsupportedVersion = (1 << 17); - public static final int notAuthorized = (1 << 16); - public static final int systemUnavail = (1 << 31); - public static final int systemFailure = (1 << 30); //the request cannot be handled due to system failure - public static final int duplicateCertReq = (1 << 29); - - /** @deprecated use lower case version */ - public static final int BAD_ALG = badAlg; // unrecognized or unsupported Algorithm Identifier - /** @deprecated use lower case version */ - public static final int BAD_MESSAGE_CHECK = badMessageCheck; - /** @deprecated use lower case version */ - public static final int BAD_REQUEST = badRequest; // transaction not permitted or supported - /** @deprecated use lower case version */ - public static final int BAD_TIME = badTime; - /** @deprecated use lower case version */ - public static final int BAD_CERT_ID = badCertId; - /** @deprecated use lower case version */ - public static final int BAD_DATA_FORMAT = badDataFormat; // the data submitted has the wrong format - /** @deprecated use lower case version */ - public static final int WRONG_AUTHORITY = wrongAuthority; - /** @deprecated use lower case version */ - public static final int INCORRECT_DATA = incorrectData; - /** @deprecated use lower case version */ - public static final int MISSING_TIME_STAMP = missingTimeStamp; - /** @deprecated use lower case version */ - public static final int BAD_POP = badPOP; - /** @deprecated use lower case version */ - public static final int TIME_NOT_AVAILABLE = timeNotAvailable; - /** @deprecated use lower case version */ - public static final int UNACCEPTED_POLICY = unacceptedPolicy; - /** @deprecated use lower case version */ - public static final int UNACCEPTED_EXTENSION = unacceptedExtension; - /** @deprecated use lower case version */ - public static final int ADD_INFO_NOT_AVAILABLE = addInfoNotAvailable; - /** @deprecated use lower case version */ - public static final int SYSTEM_FAILURE = systemFailure; - /** - * Basic constructor. - */ - public PKIFailureInfo( - int info) - { - super(getBytes(info), getPadBits(info)); - } - - public PKIFailureInfo( - DERBitString info) - { - super(info.getBytes(), info.getPadBits()); - } - - public String toString() - { - return "PKIFailureInfo: 0x" + Integer.toHexString(this.intValue()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFreeText.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFreeText.java deleted file mode 100644 index c6c5ab5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIFreeText.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERUTF8String; - -public class PKIFreeText - extends ASN1Object -{ - ASN1Sequence strings; - - public static PKIFreeText getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static PKIFreeText getInstance( - Object obj) - { - if (obj instanceof PKIFreeText) - { - return (PKIFreeText)obj; - } - else if (obj != null) - { - return new PKIFreeText(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private PKIFreeText( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - while (e.hasMoreElements()) - { - if (!(e.nextElement() instanceof DERUTF8String)) - { - throw new IllegalArgumentException("attempt to insert non UTF8 STRING into PKIFreeText"); - } - } - - strings = seq; - } - - public PKIFreeText( - DERUTF8String p) - { - strings = new DERSequence(p); - } - - public PKIFreeText( - String p) - { - this(new DERUTF8String(p)); - } - - public PKIFreeText( - DERUTF8String[] strs) - { - strings = new DERSequence(strs); - } - - public PKIFreeText( - String[] strs) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < strs.length; i++) { - v.add(new DERUTF8String(strs[i])); - } - strings = new DERSequence(v); - } - - /** - * Return the number of string elements present. - * - * @return number of elements present. - */ - public int size() - { - return strings.size(); - } - - /** - * Return the UTF8STRING at index i. - * - * @param i index of the string of interest - * @return the string at index i. - */ - public DERUTF8String getStringAt( - int i) - { - return (DERUTF8String)strings.getObjectAt(i); - } - - /** - *
    -     * PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return strings; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeader.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeader.java deleted file mode 100644 index e5286dc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeader.java +++ /dev/null @@ -1,257 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.GeneralName; - -public class PKIHeader - extends ASN1Object -{ - /** - * Value for a "null" recipient or sender. - */ - public static final GeneralName NULL_NAME = new GeneralName(X500Name.getInstance(new DERSequence())); - - public static final int CMP_1999 = 1; - public static final int CMP_2000 = 2; - - private ASN1Integer pvno; - private GeneralName sender; - private GeneralName recipient; - private DERGeneralizedTime messageTime; - private AlgorithmIdentifier protectionAlg; - private ASN1OctetString senderKID; // KeyIdentifier - private ASN1OctetString recipKID; // KeyIdentifier - private ASN1OctetString transactionID; - private ASN1OctetString senderNonce; - private ASN1OctetString recipNonce; - private PKIFreeText freeText; - private ASN1Sequence generalInfo; - - private PKIHeader(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - pvno = ASN1Integer.getInstance(en.nextElement()); - sender = GeneralName.getInstance(en.nextElement()); - recipient = GeneralName.getInstance(en.nextElement()); - - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement(); - - switch (tObj.getTagNo()) - { - case 0: - messageTime = DERGeneralizedTime.getInstance(tObj, true); - break; - case 1: - protectionAlg = AlgorithmIdentifier.getInstance(tObj, true); - break; - case 2: - senderKID = ASN1OctetString.getInstance(tObj, true); - break; - case 3: - recipKID = ASN1OctetString.getInstance(tObj, true); - break; - case 4: - transactionID = ASN1OctetString.getInstance(tObj, true); - break; - case 5: - senderNonce = ASN1OctetString.getInstance(tObj, true); - break; - case 6: - recipNonce = ASN1OctetString.getInstance(tObj, true); - break; - case 7: - freeText = PKIFreeText.getInstance(tObj, true); - break; - case 8: - generalInfo = ASN1Sequence.getInstance(tObj, true); - break; - default: - throw new IllegalArgumentException("unknown tag number: " + tObj.getTagNo()); - } - } - } - - public static PKIHeader getInstance(Object o) - { - if (o instanceof PKIHeader) - { - return (PKIHeader)o; - } - - if (o != null) - { - return new PKIHeader(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PKIHeader( - int pvno, - GeneralName sender, - GeneralName recipient) - { - this(new ASN1Integer(pvno), sender, recipient); - } - - private PKIHeader( - ASN1Integer pvno, - GeneralName sender, - GeneralName recipient) - { - this.pvno = pvno; - this.sender = sender; - this.recipient = recipient; - } - - public ASN1Integer getPvno() - { - return pvno; - } - - public GeneralName getSender() - { - return sender; - } - - public GeneralName getRecipient() - { - return recipient; - } - - public DERGeneralizedTime getMessageTime() - { - return messageTime; - } - - public AlgorithmIdentifier getProtectionAlg() - { - return protectionAlg; - } - - public ASN1OctetString getSenderKID() - { - return senderKID; - } - - public ASN1OctetString getRecipKID() - { - return recipKID; - } - - public ASN1OctetString getTransactionID() - { - return transactionID; - } - - public ASN1OctetString getSenderNonce() - { - return senderNonce; - } - - public ASN1OctetString getRecipNonce() - { - return recipNonce; - } - - public PKIFreeText getFreeText() - { - return freeText; - } - - public InfoTypeAndValue[] getGeneralInfo() - { - if (generalInfo == null) { - return null; - } - InfoTypeAndValue[] results = new InfoTypeAndValue[generalInfo.size()]; - for (int i = 0; i < results.length; i++) { - results[i] - = InfoTypeAndValue.getInstance(generalInfo.getObjectAt(i)); - } - return results; - } - - /** - *
    -     *  PKIHeader ::= SEQUENCE {
    -     *            pvno                INTEGER     { cmp1999(1), cmp2000(2) },
    -     *            sender              GeneralName,
    -     *            -- identifies the sender
    -     *            recipient           GeneralName,
    -     *            -- identifies the intended recipient
    -     *            messageTime     [0] GeneralizedTime         OPTIONAL,
    -     *            -- time of production of this message (used when sender
    -     *            -- believes that the transport will be "suitable"; i.e.,
    -     *            -- that the time will still be meaningful upon receipt)
    -     *            protectionAlg   [1] AlgorithmIdentifier     OPTIONAL,
    -     *            -- algorithm used for calculation of protection bits
    -     *            senderKID       [2] KeyIdentifier           OPTIONAL,
    -     *            recipKID        [3] KeyIdentifier           OPTIONAL,
    -     *            -- to identify specific keys used for protection
    -     *            transactionID   [4] OCTET STRING            OPTIONAL,
    -     *            -- identifies the transaction; i.e., this will be the same in
    -     *            -- corresponding request, response, certConf, and PKIConf
    -     *            -- messages
    -     *            senderNonce     [5] OCTET STRING            OPTIONAL,
    -     *            recipNonce      [6] OCTET STRING            OPTIONAL,
    -     *            -- nonces used to provide replay protection, senderNonce
    -     *            -- is inserted by the creator of this message; recipNonce
    -     *            -- is a nonce previously inserted in a related message by
    -     *            -- the intended recipient of this message
    -     *            freeText        [7] PKIFreeText             OPTIONAL,
    -     *            -- this may be used to indicate context-specific instructions
    -     *            -- (this field is intended for human consumption)
    -     *            generalInfo     [8] SEQUENCE SIZE (1..MAX) OF
    -     *                                 InfoTypeAndValue     OPTIONAL
    -     *            -- this may be used to convey context-specific information
    -     *            -- (this field not primarily intended for human consumption)
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(pvno); - v.add(sender); - v.add(recipient); - addOptional(v, 0, messageTime); - addOptional(v, 1, protectionAlg); - addOptional(v, 2, senderKID); - addOptional(v, 3, recipKID); - addOptional(v, 4, transactionID); - addOptional(v, 5, senderNonce); - addOptional(v, 6, recipNonce); - addOptional(v, 7, freeText); - addOptional(v, 8, generalInfo); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeaderBuilder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeaderBuilder.java deleted file mode 100644 index bfdb5e5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIHeaderBuilder.java +++ /dev/null @@ -1,254 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.GeneralName; - -public class PKIHeaderBuilder -{ - private ASN1Integer pvno; - private GeneralName sender; - private GeneralName recipient; - private ASN1GeneralizedTime messageTime; - private AlgorithmIdentifier protectionAlg; - private ASN1OctetString senderKID; // KeyIdentifier - private ASN1OctetString recipKID; // KeyIdentifier - private ASN1OctetString transactionID; - private ASN1OctetString senderNonce; - private ASN1OctetString recipNonce; - private PKIFreeText freeText; - private ASN1Sequence generalInfo; - - public PKIHeaderBuilder( - int pvno, - GeneralName sender, - GeneralName recipient) - { - this(new ASN1Integer(pvno), sender, recipient); - } - - private PKIHeaderBuilder( - ASN1Integer pvno, - GeneralName sender, - GeneralName recipient) - { - this.pvno = pvno; - this.sender = sender; - this.recipient = recipient; - } - - /** - * @deprecated use ASN1GeneralizedTime - */ - public PKIHeaderBuilder setMessageTime(DERGeneralizedTime time) - { - messageTime = ASN1GeneralizedTime.getInstance(time); - - return this; - } - - public PKIHeaderBuilder setMessageTime(ASN1GeneralizedTime time) - { - messageTime = time; - - return this; - } - - public PKIHeaderBuilder setProtectionAlg(AlgorithmIdentifier aid) - { - protectionAlg = aid; - - return this; - } - - public PKIHeaderBuilder setSenderKID(byte[] kid) - { - return setSenderKID(kid == null ? null : new DEROctetString(kid)); - } - - public PKIHeaderBuilder setSenderKID(ASN1OctetString kid) - { - senderKID = kid; - - return this; - } - - public PKIHeaderBuilder setRecipKID(byte[] kid) - { - return setRecipKID(kid == null ? null : new DEROctetString(kid)); - } - - public PKIHeaderBuilder setRecipKID(DEROctetString kid) - { - recipKID = kid; - - return this; - } - - public PKIHeaderBuilder setTransactionID(byte[] tid) - { - return setTransactionID(tid == null ? null : new DEROctetString(tid)); - } - - public PKIHeaderBuilder setTransactionID(ASN1OctetString tid) - { - transactionID = tid; - - return this; - } - - public PKIHeaderBuilder setSenderNonce(byte[] nonce) - { - return setSenderNonce(nonce == null ? null : new DEROctetString(nonce)); - } - - public PKIHeaderBuilder setSenderNonce(ASN1OctetString nonce) - { - senderNonce = nonce; - - return this; - } - - public PKIHeaderBuilder setRecipNonce(byte[] nonce) - { - return setRecipNonce(nonce == null ? null : new DEROctetString(nonce)); - } - - public PKIHeaderBuilder setRecipNonce(ASN1OctetString nonce) - { - recipNonce = nonce; - - return this; - } - - public PKIHeaderBuilder setFreeText(PKIFreeText text) - { - freeText = text; - - return this; - } - - public PKIHeaderBuilder setGeneralInfo(InfoTypeAndValue genInfo) - { - return setGeneralInfo(makeGeneralInfoSeq(genInfo)); - } - - public PKIHeaderBuilder setGeneralInfo(InfoTypeAndValue[] genInfos) - { - return setGeneralInfo(makeGeneralInfoSeq(genInfos)); - } - - public PKIHeaderBuilder setGeneralInfo(ASN1Sequence seqOfInfoTypeAndValue) - { - generalInfo = seqOfInfoTypeAndValue; - - return this; - } - - private static ASN1Sequence makeGeneralInfoSeq( - InfoTypeAndValue generalInfo) - { - return new DERSequence(generalInfo); - } - - private static ASN1Sequence makeGeneralInfoSeq( - InfoTypeAndValue[] generalInfos) - { - ASN1Sequence genInfoSeq = null; - if (generalInfos != null) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < generalInfos.length; i++) - { - v.add(generalInfos[i]); - } - genInfoSeq = new DERSequence(v); - } - return genInfoSeq; - } - - /** - *
    -     *  PKIHeader ::= SEQUENCE {
    -     *            pvno                INTEGER     { cmp1999(1), cmp2000(2) },
    -     *            sender              GeneralName,
    -     *            -- identifies the sender
    -     *            recipient           GeneralName,
    -     *            -- identifies the intended recipient
    -     *            messageTime     [0] GeneralizedTime         OPTIONAL,
    -     *            -- time of production of this message (used when sender
    -     *            -- believes that the transport will be "suitable"; i.e.,
    -     *            -- that the time will still be meaningful upon receipt)
    -     *            protectionAlg   [1] AlgorithmIdentifier     OPTIONAL,
    -     *            -- algorithm used for calculation of protection bits
    -     *            senderKID       [2] KeyIdentifier           OPTIONAL,
    -     *            recipKID        [3] KeyIdentifier           OPTIONAL,
    -     *            -- to identify specific keys used for protection
    -     *            transactionID   [4] OCTET STRING            OPTIONAL,
    -     *            -- identifies the transaction; i.e., this will be the same in
    -     *            -- corresponding request, response, certConf, and PKIConf
    -     *            -- messages
    -     *            senderNonce     [5] OCTET STRING            OPTIONAL,
    -     *            recipNonce      [6] OCTET STRING            OPTIONAL,
    -     *            -- nonces used to provide replay protection, senderNonce
    -     *            -- is inserted by the creator of this message; recipNonce
    -     *            -- is a nonce previously inserted in a related message by
    -     *            -- the intended recipient of this message
    -     *            freeText        [7] PKIFreeText             OPTIONAL,
    -     *            -- this may be used to indicate context-specific instructions
    -     *            -- (this field is intended for human consumption)
    -     *            generalInfo     [8] SEQUENCE SIZE (1..MAX) OF
    -     *                                 InfoTypeAndValue     OPTIONAL
    -     *            -- this may be used to convey context-specific information
    -     *            -- (this field not primarily intended for human consumption)
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public PKIHeader build() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(pvno); - v.add(sender); - v.add(recipient); - addOptional(v, 0, messageTime); - addOptional(v, 1, protectionAlg); - addOptional(v, 2, senderKID); - addOptional(v, 3, recipKID); - addOptional(v, 4, transactionID); - addOptional(v, 5, senderNonce); - addOptional(v, 6, recipNonce); - addOptional(v, 7, freeText); - addOptional(v, 8, generalInfo); - - messageTime = null; - protectionAlg = null; - senderKID = null; - recipKID = null; - transactionID = null; - senderNonce = null; - recipNonce = null; - freeText = null; - generalInfo = null; - - return PKIHeader.getInstance(new DERSequence(v)); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessage.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessage.java deleted file mode 100644 index 061bcca..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessage.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class PKIMessage - extends ASN1Object -{ - private PKIHeader header; - private PKIBody body; - private DERBitString protection; - private ASN1Sequence extraCerts; - - private PKIMessage(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - header = PKIHeader.getInstance(en.nextElement()); - body = PKIBody.getInstance(en.nextElement()); - - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement(); - - if (tObj.getTagNo() == 0) - { - protection = DERBitString.getInstance(tObj, true); - } - else - { - extraCerts = ASN1Sequence.getInstance(tObj, true); - } - } - } - - public static PKIMessage getInstance(Object o) - { - if (o instanceof PKIMessage) - { - return (PKIMessage)o; - } - else if (o != null) - { - return new PKIMessage(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * Creates a new PKIMessage. - * - * @param header message header - * @param body message body - * @param protection message protection (may be null) - * @param extraCerts extra certificates (may be null) - */ - public PKIMessage( - PKIHeader header, - PKIBody body, - DERBitString protection, - CMPCertificate[] extraCerts) - { - this.header = header; - this.body = body; - this.protection = protection; - if (extraCerts != null) { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < extraCerts.length; i++) { - v.add(extraCerts[i]); - } - this.extraCerts = new DERSequence(v); - } - } - - public PKIMessage( - PKIHeader header, - PKIBody body, - DERBitString protection) - { - this(header, body, protection, null); - } - - public PKIMessage( - PKIHeader header, - PKIBody body) - { - this(header, body, null, null); - } - - public PKIHeader getHeader() - { - return header; - } - - public PKIBody getBody() - { - return body; - } - - public DERBitString getProtection() - { - return protection; - } - - public CMPCertificate[] getExtraCerts() - { - if (extraCerts == null) - { - return null; - } - - CMPCertificate[] results = new CMPCertificate[extraCerts.size()]; - - for (int i = 0; i < results.length; i++) - { - results[i] = CMPCertificate.getInstance(extraCerts.getObjectAt(i)); - } - return results; - } - - /** - *
    -     * PKIMessage ::= SEQUENCE {
    -     *                  header           PKIHeader,
    -     *                  body             PKIBody,
    -     *                  protection   [0] PKIProtection OPTIONAL,
    -     *                  extraCerts   [1] SEQUENCE SIZE (1..MAX) OF CMPCertificate
    -     *                                                                     OPTIONAL
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(header); - v.add(body); - - addOptional(v, 0, protection); - addOptional(v, 1, extraCerts); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessages.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessages.java deleted file mode 100644 index 2734911..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIMessages.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PKIMessages - extends ASN1Object -{ - private ASN1Sequence content; - - private PKIMessages(ASN1Sequence seq) - { - content = seq; - } - - public static PKIMessages getInstance(Object o) - { - if (o instanceof PKIMessages) - { - return (PKIMessages)o; - } - - if (o != null) - { - return new PKIMessages(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PKIMessages(PKIMessage msg) - { - content = new DERSequence(msg); - } - - public PKIMessages(PKIMessage[] msgs) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < msgs.length; i++) - { - v.add(msgs[i]); - } - content = new DERSequence(v); - } - - public PKIMessage[] toPKIMessageArray() - { - PKIMessage[] result = new PKIMessage[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = PKIMessage.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * PKIMessages ::= SEQUENCE SIZE (1..MAX) OF PKIMessage
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatus.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatus.java deleted file mode 100644 index 5ebdaa8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatus.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bc.asn1.cmp; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; - -public class PKIStatus - extends ASN1Object -{ - public static final int GRANTED = 0; - public static final int GRANTED_WITH_MODS = 1; - public static final int REJECTION = 2; - public static final int WAITING = 3; - public static final int REVOCATION_WARNING = 4; - public static final int REVOCATION_NOTIFICATION = 5; - public static final int KEY_UPDATE_WARNING = 6; - - public static final PKIStatus granted = new PKIStatus(GRANTED); - public static final PKIStatus grantedWithMods = new PKIStatus(GRANTED_WITH_MODS); - public static final PKIStatus rejection = new PKIStatus(REJECTION); - public static final PKIStatus waiting = new PKIStatus(WAITING); - public static final PKIStatus revocationWarning = new PKIStatus(REVOCATION_WARNING); - public static final PKIStatus revocationNotification = new PKIStatus(REVOCATION_NOTIFICATION); - public static final PKIStatus keyUpdateWaiting = new PKIStatus(KEY_UPDATE_WARNING); - - private ASN1Integer value; - - private PKIStatus(int value) - { - this(new ASN1Integer(value)); - } - - private PKIStatus(ASN1Integer value) - { - this.value = value; - } - - public static PKIStatus getInstance(Object o) - { - if (o instanceof PKIStatus) - { - return (PKIStatus)o; - } - - if (o != null) - { - return new PKIStatus(ASN1Integer.getInstance(o)); - } - - return null; - } - - public BigInteger getValue() - { - return value.getValue(); - } - - public ASN1Primitive toASN1Primitive() - { - return value; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatusInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatusInfo.java deleted file mode 100644 index 1d0c0cb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PKIStatusInfo.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.bc.asn1.cmp; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -public class PKIStatusInfo - extends ASN1Object -{ - ASN1Integer status; - PKIFreeText statusString; - DERBitString failInfo; - - public static PKIStatusInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static PKIStatusInfo getInstance( - Object obj) - { - if (obj instanceof PKIStatusInfo) - { - return (PKIStatusInfo)obj; - } - else if (obj != null) - { - return new PKIStatusInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private PKIStatusInfo( - ASN1Sequence seq) - { - this.status = ASN1Integer.getInstance(seq.getObjectAt(0)); - - this.statusString = null; - this.failInfo = null; - - if (seq.size() > 2) - { - this.statusString = PKIFreeText.getInstance(seq.getObjectAt(1)); - this.failInfo = DERBitString.getInstance(seq.getObjectAt(2)); - } - else if (seq.size() > 1) - { - Object obj = seq.getObjectAt(1); - if (obj instanceof DERBitString) - { - this.failInfo = DERBitString.getInstance(obj); - } - else - { - this.statusString = PKIFreeText.getInstance(obj); - } - } - } - - /** - * @param status - */ - public PKIStatusInfo(PKIStatus status) - { - this.status = ASN1Integer.getInstance(status.toASN1Primitive()); - } - - /** - * - * @param status - * @param statusString - */ - public PKIStatusInfo( - PKIStatus status, - PKIFreeText statusString) - { - this.status = ASN1Integer.getInstance(status.toASN1Primitive()); - this.statusString = statusString; - } - - public PKIStatusInfo( - PKIStatus status, - PKIFreeText statusString, - PKIFailureInfo failInfo) - { - this.status = ASN1Integer.getInstance(status.toASN1Primitive());; - this.statusString = statusString; - this.failInfo = failInfo; - } - - public BigInteger getStatus() - { - return status.getValue(); - } - - public PKIFreeText getStatusString() - { - return statusString; - } - - public DERBitString getFailInfo() - { - return failInfo; - } - - /** - *
    -     * PKIStatusInfo ::= SEQUENCE {
    -     *     status        PKIStatus,                (INTEGER)
    -     *     statusString  PKIFreeText     OPTIONAL,
    -     *     failInfo      PKIFailureInfo  OPTIONAL  (BIT STRING)
    -     * }
    -     *
    -     * PKIStatus:
    -     *   granted                (0), -- you got exactly what you asked for
    -     *   grantedWithMods        (1), -- you got something like what you asked for
    -     *   rejection              (2), -- you don't get it, more information elsewhere in the message
    -     *   waiting                (3), -- the request body part has not yet been processed, expect to hear more later
    -     *   revocationWarning      (4), -- this message contains a warning that a revocation is imminent
    -     *   revocationNotification (5), -- notification that a revocation has occurred
    -     *   keyUpdateWarning       (6)  -- update already done for the oldCertId specified in CertReqMsg
    -     *
    -     * PKIFailureInfo:
    -     *   badAlg           (0), -- unrecognized or unsupported Algorithm Identifier
    -     *   badMessageCheck  (1), -- integrity check failed (e.g., signature did not verify)
    -     *   badRequest       (2), -- transaction not permitted or supported
    -     *   badTime          (3), -- messageTime was not sufficiently close to the system time, as defined by local policy
    -     *   badCertId        (4), -- no certificate could be found matching the provided criteria
    -     *   badDataFormat    (5), -- the data submitted has the wrong format
    -     *   wrongAuthority   (6), -- the authority indicated in the request is different from the one creating the response token
    -     *   incorrectData    (7), -- the requester's data is incorrect (for notary services)
    -     *   missingTimeStamp (8), -- when the timestamp is missing but should be there (by policy)
    -     *   badPOP           (9)  -- the proof-of-possession failed
    -     *
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(status); - - if (statusString != null) - { - v.add(statusString); - } - - if (failInfo!= null) - { - v.add(failInfo); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyChallContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyChallContent.java deleted file mode 100644 index c3bd57b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyChallContent.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; - -public class POPODecKeyChallContent - extends ASN1Object -{ - private ASN1Sequence content; - - private POPODecKeyChallContent(ASN1Sequence seq) - { - content = seq; - } - - public static POPODecKeyChallContent getInstance(Object o) - { - if (o instanceof POPODecKeyChallContent) - { - return (POPODecKeyChallContent)o; - } - - if (o != null) - { - return new POPODecKeyChallContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public Challenge[] toChallengeArray() - { - Challenge[] result = new Challenge[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = Challenge.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * POPODecKeyChallContent ::= SEQUENCE OF Challenge
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyRespContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyRespContent.java deleted file mode 100644 index 37a5ec7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/POPODecKeyRespContent.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; - -public class POPODecKeyRespContent - extends ASN1Object -{ - private ASN1Sequence content; - - private POPODecKeyRespContent(ASN1Sequence seq) - { - content = seq; - } - - public static POPODecKeyRespContent getInstance(Object o) - { - if (o instanceof POPODecKeyRespContent) - { - return (POPODecKeyRespContent)o; - } - - if (o != null) - { - return new POPODecKeyRespContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer[] toASN1IntegerArray() - { - ASN1Integer[] result = new ASN1Integer[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = ASN1Integer.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * POPODecKeyRespContent ::= SEQUENCE OF INTEGER
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollRepContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollRepContent.java deleted file mode 100644 index a6bf435..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollRepContent.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PollRepContent - extends ASN1Object -{ - private ASN1Integer[] certReqId; - private ASN1Integer[] checkAfter; - private PKIFreeText[] reason; - - private PollRepContent(ASN1Sequence seq) - { - certReqId = new ASN1Integer[seq.size()]; - checkAfter = new ASN1Integer[seq.size()]; - reason = new PKIFreeText[seq.size()]; - - for (int i = 0; i != seq.size(); i++) - { - ASN1Sequence s = ASN1Sequence.getInstance(seq.getObjectAt(i)); - - certReqId[i] = ASN1Integer.getInstance(s.getObjectAt(0)); - checkAfter[i] = ASN1Integer.getInstance(s.getObjectAt(1)); - - if (s.size() > 2) - { - reason[i] = PKIFreeText.getInstance(s.getObjectAt(2)); - } - } - } - - public static PollRepContent getInstance(Object o) - { - if (o instanceof PollRepContent) - { - return (PollRepContent)o; - } - - if (o != null) - { - return new PollRepContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PollRepContent(ASN1Integer certReqId, ASN1Integer checkAfter) - { - this(certReqId, checkAfter, null); - } - - public PollRepContent(ASN1Integer certReqId, ASN1Integer checkAfter, PKIFreeText reason) - { - this.certReqId = new ASN1Integer[1]; - this.checkAfter = new ASN1Integer[1]; - this.reason = new PKIFreeText[1]; - - this.certReqId[0] = certReqId; - this.checkAfter[0] = checkAfter; - this.reason[0] = reason; - } - - public int size() - { - return certReqId.length; - } - - public ASN1Integer getCertReqId(int index) - { - return certReqId[index]; - } - - public ASN1Integer getCheckAfter(int index) - { - return checkAfter[index]; - } - - public PKIFreeText getReason(int index) - { - return reason[index]; - } - - /** - *
    -     * PollRepContent ::= SEQUENCE OF SEQUENCE {
    -     *         certReqId              INTEGER,
    -     *         checkAfter             INTEGER,  -- time in seconds
    -     *         reason                 PKIFreeText OPTIONAL
    -     *     }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector outer = new ASN1EncodableVector(); - - for (int i = 0; i != certReqId.length; i++) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certReqId[i]); - v.add(checkAfter[i]); - - if (reason[i] != null) - { - v.add(reason[i]); - } - - outer.add(new DERSequence(v)); - } - - return new DERSequence(outer); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollReqContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollReqContent.java deleted file mode 100644 index baa1575..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/PollReqContent.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PollReqContent - extends ASN1Object -{ - private ASN1Sequence content; - - private PollReqContent(ASN1Sequence seq) - { - content = seq; - } - - public static PollReqContent getInstance(Object o) - { - if (o instanceof PollReqContent) - { - return (PollReqContent)o; - } - - if (o != null) - { - return new PollReqContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * Create a pollReqContent for a single certReqId. - * - * @param certReqId the certificate request ID. - */ - public PollReqContent(ASN1Integer certReqId) - { - this(new DERSequence(new DERSequence(certReqId))); - } - - public ASN1Integer[][] getCertReqIds() - { - ASN1Integer[][] result = new ASN1Integer[content.size()][]; - - for (int i = 0; i != result.length; i++) - { - result[i] = sequenceToASN1IntegerArray((ASN1Sequence)content.getObjectAt(i)); - } - - return result; - } - - private static ASN1Integer[] sequenceToASN1IntegerArray(ASN1Sequence seq) - { - ASN1Integer[] result = new ASN1Integer[seq.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = ASN1Integer.getInstance(seq.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * PollReqContent ::= SEQUENCE OF SEQUENCE {
    -     *                        certReqId              INTEGER
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ProtectedPart.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ProtectedPart.java deleted file mode 100644 index 8ac5a0b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/ProtectedPart.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class ProtectedPart - extends ASN1Object -{ - private PKIHeader header; - private PKIBody body; - - private ProtectedPart(ASN1Sequence seq) - { - header = PKIHeader.getInstance(seq.getObjectAt(0)); - body = PKIBody.getInstance(seq.getObjectAt(1)); - } - - public static ProtectedPart getInstance(Object o) - { - if (o instanceof ProtectedPart) - { - return (ProtectedPart)o; - } - - if (o != null) - { - return new ProtectedPart(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ProtectedPart(PKIHeader header, PKIBody body) - { - this.header = header; - this.body = body; - } - - public PKIHeader getHeader() - { - return header; - } - - public PKIBody getBody() - { - return body; - } - - /** - *
    -     * ProtectedPart ::= SEQUENCE {
    -     *                    header    PKIHeader,
    -     *                    body      PKIBody
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(header); - v.add(body); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevAnnContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevAnnContent.java deleted file mode 100644 index becc2b0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevAnnContent.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.crmf.CertId; -import org.bc.asn1.x509.Extensions; - -public class RevAnnContent - extends ASN1Object -{ - private PKIStatus status; - private CertId certId; - private ASN1GeneralizedTime willBeRevokedAt; - private ASN1GeneralizedTime badSinceDate; - private Extensions crlDetails; - - private RevAnnContent(ASN1Sequence seq) - { - status = PKIStatus.getInstance(seq.getObjectAt(0)); - certId = CertId.getInstance(seq.getObjectAt(1)); - willBeRevokedAt = ASN1GeneralizedTime.getInstance(seq.getObjectAt(2)); - badSinceDate = ASN1GeneralizedTime.getInstance(seq.getObjectAt(3)); - - if (seq.size() > 4) - { - crlDetails = Extensions.getInstance(seq.getObjectAt(4)); - } - } - - public static RevAnnContent getInstance(Object o) - { - if (o instanceof RevAnnContent) - { - return (RevAnnContent)o; - } - - if (o != null) - { - return new RevAnnContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PKIStatus getStatus() - { - return status; - } - - public CertId getCertId() - { - return certId; - } - - public ASN1GeneralizedTime getWillBeRevokedAt() - { - return willBeRevokedAt; - } - - public ASN1GeneralizedTime getBadSinceDate() - { - return badSinceDate; - } - - public Extensions getCrlDetails() - { - return crlDetails; - } - - /** - *
    -     * RevAnnContent ::= SEQUENCE {
    -     *       status              PKIStatus,
    -     *       certId              CertId,
    -     *       willBeRevokedAt     GeneralizedTime,
    -     *       badSinceDate        GeneralizedTime,
    -     *       crlDetails          Extensions  OPTIONAL
    -     *        -- extra CRL details (e.g., crl number, reason, location, etc.)
    -     * }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(status); - v.add(certId); - v.add(willBeRevokedAt); - v.add(badSinceDate); - - if (crlDetails != null) - { - v.add(crlDetails); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevDetails.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevDetails.java deleted file mode 100644 index 88b597f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevDetails.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.crmf.CertTemplate; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.X509Extensions; - -public class RevDetails - extends ASN1Object -{ - private CertTemplate certDetails; - private Extensions crlEntryDetails; - - private RevDetails(ASN1Sequence seq) - { - certDetails = CertTemplate.getInstance(seq.getObjectAt(0)); - if (seq.size() > 1) - { - crlEntryDetails = Extensions.getInstance(seq.getObjectAt(1)); - } - } - - public static RevDetails getInstance(Object o) - { - if (o instanceof RevDetails) - { - return (RevDetails)o; - } - - if (o != null) - { - return new RevDetails(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public RevDetails(CertTemplate certDetails) - { - this.certDetails = certDetails; - } - - /** - * @deprecated use method taking Extensions - * @param certDetails - * @param crlEntryDetails - */ - public RevDetails(CertTemplate certDetails, X509Extensions crlEntryDetails) - { - this.certDetails = certDetails; - this.crlEntryDetails = Extensions.getInstance(crlEntryDetails.toASN1Primitive()); - } - - public RevDetails(CertTemplate certDetails, Extensions crlEntryDetails) - { - this.certDetails = certDetails; - this.crlEntryDetails = crlEntryDetails; - } - - public CertTemplate getCertDetails() - { - return certDetails; - } - - public Extensions getCrlEntryDetails() - { - return crlEntryDetails; - } - - /** - *
    -     * RevDetails ::= SEQUENCE {
    -     *                  certDetails         CertTemplate,
    -     *                   -- allows requester to specify as much as they can about
    -     *                   -- the cert. for which revocation is requested
    -     *                   -- (e.g., for cases in which serialNumber is not available)
    -     *                   crlEntryDetails     Extensions       OPTIONAL
    -     *                   -- requested crlEntryExtensions
    -     *             }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certDetails); - - if (crlEntryDetails != null) - { - v.add(crlEntryDetails); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContent.java deleted file mode 100644 index 47a41d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContent.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.bc.asn1.cmp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.CertId; -import org.bc.asn1.x509.CertificateList; - -public class RevRepContent - extends ASN1Object -{ - private ASN1Sequence status; - private ASN1Sequence revCerts; - private ASN1Sequence crls; - - private RevRepContent(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - status = ASN1Sequence.getInstance(en.nextElement()); - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = ASN1TaggedObject.getInstance(en.nextElement()); - - if (tObj.getTagNo() == 0) - { - revCerts = ASN1Sequence.getInstance(tObj, true); - } - else - { - crls = ASN1Sequence.getInstance(tObj, true); - } - } - } - - public static RevRepContent getInstance(Object o) - { - if (o instanceof RevRepContent) - { - return (RevRepContent)o; - } - - if (o != null) - { - return new RevRepContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public PKIStatusInfo[] getStatus() - { - PKIStatusInfo[] results = new PKIStatusInfo[status.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = PKIStatusInfo.getInstance(status.getObjectAt(i)); - } - - return results; - } - - public CertId[] getRevCerts() - { - if (revCerts == null) - { - return null; - } - - CertId[] results = new CertId[revCerts.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CertId.getInstance(revCerts.getObjectAt(i)); - } - - return results; - } - - public CertificateList[] getCrls() - { - if (crls == null) - { - return null; - } - - CertificateList[] results = new CertificateList[crls.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = CertificateList.getInstance(crls.getObjectAt(i)); - } - - return results; - } - - /** - *
    -     * RevRepContent ::= SEQUENCE {
    -     *        status       SEQUENCE SIZE (1..MAX) OF PKIStatusInfo,
    -     *        -- in same order as was sent in RevReqContent
    -     *        revCerts [0] SEQUENCE SIZE (1..MAX) OF CertId OPTIONAL,
    -     *        -- IDs for which revocation was requested
    -     *        -- (same order as status)
    -     *        crls     [1] SEQUENCE SIZE (1..MAX) OF CertificateList OPTIONAL
    -     *        -- the resulting CRLs (there may be more than one)
    -     *   }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(status); - - addOptional(v, 0, revCerts); - addOptional(v, 1, crls); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(true, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContentBuilder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContentBuilder.java deleted file mode 100644 index 70f1dca..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevRepContentBuilder.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.crmf.CertId; -import org.bc.asn1.x509.CertificateList; - -public class RevRepContentBuilder -{ - private ASN1EncodableVector status = new ASN1EncodableVector(); - private ASN1EncodableVector revCerts = new ASN1EncodableVector(); - private ASN1EncodableVector crls = new ASN1EncodableVector(); - - public RevRepContentBuilder add(PKIStatusInfo status) - { - this.status.add(status); - - return this; - } - - public RevRepContentBuilder add(PKIStatusInfo status, CertId certId) - { - if (this.status.size() != this.revCerts.size()) - { - throw new IllegalStateException("status and revCerts sequence must be in common order"); - } - this.status.add(status); - this.revCerts.add(certId); - - return this; - } - - public RevRepContentBuilder addCrl(CertificateList crl) - { - this.crls.add(crl); - - return this; - } - - public RevRepContent build() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new DERSequence(status)); - - if (revCerts.size() != 0) - { - v.add(new DERTaggedObject(true, 0, new DERSequence(revCerts))); - } - - if (crls.size() != 0) - { - v.add(new DERTaggedObject(true, 1, new DERSequence(crls))); - } - - return RevRepContent.getInstance(new DERSequence(v)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevReqContent.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevReqContent.java deleted file mode 100644 index 141089e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cmp/RevReqContent.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.asn1.cmp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class RevReqContent - extends ASN1Object -{ - private ASN1Sequence content; - - private RevReqContent(ASN1Sequence seq) - { - content = seq; - } - - public static RevReqContent getInstance(Object o) - { - if (o instanceof RevReqContent) - { - return (RevReqContent)o; - } - - if (o != null) - { - return new RevReqContent(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public RevReqContent(RevDetails revDetails) - { - this.content = new DERSequence(revDetails); - } - - public RevReqContent(RevDetails[] revDetailsArray) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != revDetailsArray.length; i++) - { - v.add(revDetailsArray[i]); - } - - this.content = new DERSequence(v); - } - - public RevDetails[] toRevDetailsArray() - { - RevDetails[] result = new RevDetails[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = RevDetails.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * RevReqContent ::= SEQUENCE OF RevDetails
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attribute.java deleted file mode 100644 index f167a19..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attribute.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSequence; - -public class Attribute - extends ASN1Object -{ - private ASN1ObjectIdentifier attrType; - private ASN1Set attrValues; - - /** - * return an Attribute object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static Attribute getInstance( - Object o) - { - if (o instanceof Attribute) - { - return (Attribute)o; - } - - if (o != null) - { - return new Attribute(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private Attribute( - ASN1Sequence seq) - { - attrType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - attrValues = (ASN1Set)seq.getObjectAt(1); - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public Attribute( - DERObjectIdentifier attrType, - ASN1Set attrValues) - { - this.attrType = new ASN1ObjectIdentifier(attrType.getId()); - this.attrValues = attrValues; - } - - public Attribute( - ASN1ObjectIdentifier attrType, - ASN1Set attrValues) - { - this.attrType = attrType; - this.attrValues = attrValues; - } - - public ASN1ObjectIdentifier getAttrType() - { - return attrType; - } - - public ASN1Set getAttrValues() - { - return attrValues; - } - - public ASN1Encodable[] getAttributeValues() - { - return attrValues.toArray(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Attribute ::= SEQUENCE {
    -     *     attrType OBJECT IDENTIFIER,
    -     *     attrValues SET OF AttributeValue
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(attrType); - v.add(attrValues); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AttributeTable.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AttributeTable.java deleted file mode 100644 index 0dc89bf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AttributeTable.java +++ /dev/null @@ -1,254 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSet; - -public class AttributeTable -{ - private Hashtable attributes = new Hashtable(); - - public AttributeTable( - Hashtable attrs) - { - attributes = copyTable(attrs); - } - - public AttributeTable( - ASN1EncodableVector v) - { - for (int i = 0; i != v.size(); i++) - { - Attribute a = Attribute.getInstance(v.get(i)); - - addAttribute(a.getAttrType(), a); - } - } - - public AttributeTable( - ASN1Set s) - { - for (int i = 0; i != s.size(); i++) - { - Attribute a = Attribute.getInstance(s.getObjectAt(i)); - - addAttribute(a.getAttrType(), a); - } - } - - public AttributeTable( - Attribute attr) - { - addAttribute(attr.getAttrType(), attr); - } - - public AttributeTable( - Attributes attrs) - { - this(ASN1Set.getInstance(attrs.toASN1Primitive())); - } - - private void addAttribute( - ASN1ObjectIdentifier oid, - Attribute a) - { - Object value = attributes.get(oid); - - if (value == null) - { - attributes.put(oid, a); - } - else - { - Vector v; - - if (value instanceof Attribute) - { - v = new Vector(); - - v.addElement(value); - v.addElement(a); - } - else - { - v = (Vector)value; - - v.addElement(a); - } - - attributes.put(oid, v); - } - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public Attribute get(DERObjectIdentifier oid) - { - return get(new ASN1ObjectIdentifier(oid.getId())); - } - - /** - * Return the first attribute matching the OBJECT IDENTIFIER oid. - * - * @param oid type of attribute required. - * @return first attribute found of type oid. - */ - public Attribute get( - ASN1ObjectIdentifier oid) - { - Object value = attributes.get(oid); - - if (value instanceof Vector) - { - return (Attribute)((Vector)value).elementAt(0); - } - - return (Attribute)value; - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public ASN1EncodableVector getAll(DERObjectIdentifier oid) - { - return getAll(new ASN1ObjectIdentifier(oid.getId())); - } - - /** - * Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be - * empty if there are no attributes of the required type present. - * - * @param oid type of attribute required. - * @return a vector of all the attributes found of type oid. - */ - public ASN1EncodableVector getAll( - ASN1ObjectIdentifier oid) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - Object value = attributes.get(oid); - - if (value instanceof Vector) - { - Enumeration e = ((Vector)value).elements(); - - while (e.hasMoreElements()) - { - v.add((Attribute)e.nextElement()); - } - } - else if (value != null) - { - v.add((Attribute)value); - } - - return v; - } - - public int size() - { - int size = 0; - - for (Enumeration en = attributes.elements(); en.hasMoreElements();) - { - Object o = en.nextElement(); - - if (o instanceof Vector) - { - size += ((Vector)o).size(); - } - else - { - size++; - } - } - - return size; - } - - public Hashtable toHashtable() - { - return copyTable(attributes); - } - - public ASN1EncodableVector toASN1EncodableVector() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - Enumeration e = attributes.elements(); - - while (e.hasMoreElements()) - { - Object value = e.nextElement(); - - if (value instanceof Vector) - { - Enumeration en = ((Vector)value).elements(); - - while (en.hasMoreElements()) - { - v.add(Attribute.getInstance(en.nextElement())); - } - } - else - { - v.add(Attribute.getInstance(value)); - } - } - - return v; - } - - public Attributes toASN1Structure() - { - return new Attributes(this.toASN1EncodableVector()); - } - - private Hashtable copyTable( - Hashtable in) - { - Hashtable out = new Hashtable(); - Enumeration e = in.keys(); - - while (e.hasMoreElements()) - { - Object key = e.nextElement(); - - out.put(key, in.get(key)); - } - - return out; - } - - /** - * Return a new table with the passed in attribute added. - * - * @param attrType - * @param attrValue - * @return - */ - public AttributeTable add(ASN1ObjectIdentifier attrType, ASN1Encodable attrValue) - { - AttributeTable newTable = new AttributeTable(attributes); - - newTable.addAttribute(attrType, new Attribute(attrType, new DERSet(attrValue))); - - return newTable; - } - - public AttributeTable remove(ASN1ObjectIdentifier attrType) - { - AttributeTable newTable = new AttributeTable(attributes); - - newTable.attributes.remove(attrType); - - return newTable; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attributes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attributes.java deleted file mode 100644 index ea11765..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Attributes.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.BERSet; - -public class Attributes - extends ASN1Object -{ - private ASN1Set attributes; - - private Attributes(ASN1Set set) - { - attributes = set; - } - - public Attributes(ASN1EncodableVector v) - { - attributes = new BERSet(v); - } - - public static Attributes getInstance(Object obj) - { - if (obj instanceof Attributes) - { - return (Attributes)obj; - } - else if (obj != null) - { - return new Attributes(ASN1Set.getInstance(obj)); - } - - return null; - } - - /** - *
    -     * Attributes ::=
    -     *   SET SIZE(1..MAX) OF Attribute -- according to RFC 5652
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - return attributes; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedData.java deleted file mode 100644 index bb5f012..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedData.java +++ /dev/null @@ -1,218 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERTaggedObject; - -public class AuthEnvelopedData - extends ASN1Object -{ - private ASN1Integer version; - private OriginatorInfo originatorInfo; - private ASN1Set recipientInfos; - private EncryptedContentInfo authEncryptedContentInfo; - private ASN1Set authAttrs; - private ASN1OctetString mac; - private ASN1Set unauthAttrs; - - public AuthEnvelopedData( - OriginatorInfo originatorInfo, - ASN1Set recipientInfos, - EncryptedContentInfo authEncryptedContentInfo, - ASN1Set authAttrs, - ASN1OctetString mac, - ASN1Set unauthAttrs) - { - // "It MUST be set to 0." - this.version = new ASN1Integer(0); - - this.originatorInfo = originatorInfo; - - // TODO - // "There MUST be at least one element in the collection." - this.recipientInfos = recipientInfos; - - this.authEncryptedContentInfo = authEncryptedContentInfo; - - // TODO - // "The authAttrs MUST be present if the content type carried in - // EncryptedContentInfo is not id-data." - this.authAttrs = authAttrs; - - this.mac = mac; - - this.unauthAttrs = unauthAttrs; - } - - public AuthEnvelopedData( - ASN1Sequence seq) - { - int index = 0; - - // TODO - // "It MUST be set to 0." - ASN1Primitive tmp = seq.getObjectAt(index++).toASN1Primitive(); - version = (ASN1Integer)tmp; - - tmp = seq.getObjectAt(index++).toASN1Primitive(); - if (tmp instanceof ASN1TaggedObject) - { - originatorInfo = OriginatorInfo.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++).toASN1Primitive(); - } - - // TODO - // "There MUST be at least one element in the collection." - recipientInfos = ASN1Set.getInstance(tmp); - - tmp = seq.getObjectAt(index++).toASN1Primitive(); - authEncryptedContentInfo = EncryptedContentInfo.getInstance(tmp); - - tmp = seq.getObjectAt(index++).toASN1Primitive(); - if (tmp instanceof ASN1TaggedObject) - { - authAttrs = ASN1Set.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++).toASN1Primitive(); - } - else - { - // TODO - // "The authAttrs MUST be present if the content type carried in - // EncryptedContentInfo is not id-data." - } - - mac = ASN1OctetString.getInstance(tmp); - - if (seq.size() > index) - { - tmp = seq.getObjectAt(index++).toASN1Primitive(); - unauthAttrs = ASN1Set.getInstance((ASN1TaggedObject)tmp, false); - } - } - - /** - * return an AuthEnvelopedData object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @throws IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static AuthEnvelopedData getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an AuthEnvelopedData object from the given object. - * - * @param obj the object we want converted. - * @throws IllegalArgumentException if the object cannot be converted. - */ - public static AuthEnvelopedData getInstance( - Object obj) - { - if (obj == null || obj instanceof AuthEnvelopedData) - { - return (AuthEnvelopedData)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new AuthEnvelopedData((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid AuthEnvelopedData: " + obj.getClass().getName()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorInfo getOriginatorInfo() - { - return originatorInfo; - } - - public ASN1Set getRecipientInfos() - { - return recipientInfos; - } - - public EncryptedContentInfo getAuthEncryptedContentInfo() - { - return authEncryptedContentInfo; - } - - public ASN1Set getAuthAttrs() - { - return authAttrs; - } - - public ASN1OctetString getMac() - { - return mac; - } - - public ASN1Set getUnauthAttrs() - { - return unauthAttrs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * AuthEnvelopedData ::= SEQUENCE {
    -     *   version CMSVersion,
    -     *   originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    -     *   recipientInfos RecipientInfos,
    -     *   authEncryptedContentInfo EncryptedContentInfo,
    -     *   authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,
    -     *   mac MessageAuthenticationCode,
    -     *   unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (originatorInfo != null) - { - v.add(new DERTaggedObject(false, 0, originatorInfo)); - } - - v.add(recipientInfos); - v.add(authEncryptedContentInfo); - - // "authAttrs optionally contains the authenticated attributes." - if (authAttrs != null) - { - // "AuthAttributes MUST be DER encoded, even if the rest of the - // AuthEnvelopedData structure is BER encoded." - v.add(new DERTaggedObject(false, 1, authAttrs)); - } - - v.add(mac); - - // "unauthAttrs optionally contains the unauthenticated attributes." - if (unauthAttrs != null) - { - v.add(new DERTaggedObject(false, 2, unauthAttrs)); - } - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedDataParser.java deleted file mode 100644 index 5d4a723..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthEnvelopedDataParser.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1SetParser; -import org.bc.asn1.ASN1TaggedObjectParser; -import org.bc.asn1.BERTags; - -/** - * Produce an object suitable for an ASN1OutputStream. - * - *
    - * AuthEnvelopedData ::= SEQUENCE {
    - *   version CMSVersion,
    - *   originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    - *   recipientInfos RecipientInfos,
    - *   authEncryptedContentInfo EncryptedContentInfo,
    - *   authAttrs [1] IMPLICIT AuthAttributes OPTIONAL,
    - *   mac MessageAuthenticationCode,
    - *   unauthAttrs [2] IMPLICIT UnauthAttributes OPTIONAL }
    - * 
    - */ -public class AuthEnvelopedDataParser -{ - private ASN1SequenceParser seq; - private ASN1Integer version; - private ASN1Encodable nextObject; - private boolean originatorInfoCalled; - - public AuthEnvelopedDataParser(ASN1SequenceParser seq) throws IOException - { - this.seq = seq; - - // TODO - // "It MUST be set to 0." - this.version = ASN1Integer.getInstance(seq.readObject()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorInfo getOriginatorInfo() - throws IOException - { - originatorInfoCalled = true; - - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)nextObject).getTagNo() == 0) - { - ASN1SequenceParser originatorInfo = (ASN1SequenceParser) ((ASN1TaggedObjectParser)nextObject).getObjectParser(BERTags.SEQUENCE, false); - nextObject = null; - return OriginatorInfo.getInstance(originatorInfo.toASN1Primitive()); - } - - return null; - } - - public ASN1SetParser getRecipientInfos() - throws IOException - { - if (!originatorInfoCalled) - { - getOriginatorInfo(); - } - - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - ASN1SetParser recipientInfos = (ASN1SetParser)nextObject; - nextObject = null; - return recipientInfos; - } - - public EncryptedContentInfoParser getAuthEncryptedContentInfo() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject != null) - { - ASN1SequenceParser o = (ASN1SequenceParser) nextObject; - nextObject = null; - return new EncryptedContentInfoParser(o); - } - - return null; - } - - public ASN1SetParser getAuthAttrs() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject instanceof ASN1TaggedObjectParser) - { - ASN1Encodable o = nextObject; - nextObject = null; - return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false); - } - - // TODO - // "The authAttrs MUST be present if the content type carried in - // EncryptedContentInfo is not id-data." - - return null; - } - - public ASN1OctetString getMac() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - ASN1Encodable o = nextObject; - nextObject = null; - - return ASN1OctetString.getInstance(o.toASN1Primitive()); - } - - public ASN1SetParser getUnauthAttrs() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject != null) - { - ASN1Encodable o = nextObject; - nextObject = null; - return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedData.java deleted file mode 100644 index 19b0786..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedData.java +++ /dev/null @@ -1,296 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class AuthenticatedData - extends ASN1Object -{ - private ASN1Integer version; - private OriginatorInfo originatorInfo; - private ASN1Set recipientInfos; - private AlgorithmIdentifier macAlgorithm; - private AlgorithmIdentifier digestAlgorithm; - private ContentInfo encapsulatedContentInfo; - private ASN1Set authAttrs; - private ASN1OctetString mac; - private ASN1Set unauthAttrs; - - public AuthenticatedData( - OriginatorInfo originatorInfo, - ASN1Set recipientInfos, - AlgorithmIdentifier macAlgorithm, - AlgorithmIdentifier digestAlgorithm, - ContentInfo encapsulatedContent, - ASN1Set authAttrs, - ASN1OctetString mac, - ASN1Set unauthAttrs) - { - if (digestAlgorithm != null || authAttrs != null) - { - if (digestAlgorithm == null || authAttrs == null) - { - throw new IllegalArgumentException("digestAlgorithm and authAttrs must be set together"); - } - } - - version = new ASN1Integer(calculateVersion(originatorInfo)); - - this.originatorInfo = originatorInfo; - this.macAlgorithm = macAlgorithm; - this.digestAlgorithm = digestAlgorithm; - this.recipientInfos = recipientInfos; - this.encapsulatedContentInfo = encapsulatedContent; - this.authAttrs = authAttrs; - this.mac = mac; - this.unauthAttrs = unauthAttrs; - } - - public AuthenticatedData( - ASN1Sequence seq) - { - int index = 0; - - version = (ASN1Integer)seq.getObjectAt(index++); - - Object tmp = seq.getObjectAt(index++); - - if (tmp instanceof ASN1TaggedObject) - { - originatorInfo = OriginatorInfo.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++); - } - - recipientInfos = ASN1Set.getInstance(tmp); - macAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(index++)); - - tmp = seq.getObjectAt(index++); - - if (tmp instanceof ASN1TaggedObject) - { - digestAlgorithm = AlgorithmIdentifier.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++); - } - - encapsulatedContentInfo = ContentInfo.getInstance(tmp); - - tmp = seq.getObjectAt(index++); - - if (tmp instanceof ASN1TaggedObject) - { - authAttrs = ASN1Set.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++); - } - - mac = ASN1OctetString.getInstance(tmp); - - if (seq.size() > index) - { - unauthAttrs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(index), false); - } - } - - /** - * return an AuthenticatedData object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @throws IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static AuthenticatedData getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an AuthenticatedData object from the given object. - * - * @param obj the object we want converted. - * @throws IllegalArgumentException if the object cannot be converted. - */ - public static AuthenticatedData getInstance( - Object obj) - { - if (obj == null || obj instanceof AuthenticatedData) - { - return (AuthenticatedData)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new AuthenticatedData((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid AuthenticatedData: " + obj.getClass().getName()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorInfo getOriginatorInfo() - { - return originatorInfo; - } - - public ASN1Set getRecipientInfos() - { - return recipientInfos; - } - - public AlgorithmIdentifier getMacAlgorithm() - { - return macAlgorithm; - } - - public AlgorithmIdentifier getDigestAlgorithm() - { - return digestAlgorithm; - } - - public ContentInfo getEncapsulatedContentInfo() - { - return encapsulatedContentInfo; - } - - public ASN1Set getAuthAttrs() - { - return authAttrs; - } - - public ASN1OctetString getMac() - { - return mac; - } - - public ASN1Set getUnauthAttrs() - { - return unauthAttrs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * AuthenticatedData ::= SEQUENCE {
    -     *       version CMSVersion,
    -     *       originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    -     *       recipientInfos RecipientInfos,
    -     *       macAlgorithm MessageAuthenticationCodeAlgorithm,
    -     *       digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
    -     *       encapContentInfo EncapsulatedContentInfo,
    -     *       authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
    -     *       mac MessageAuthenticationCode,
    -     *       unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
    -     *
    -     * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
    -     *
    -     * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
    -     *
    -     * MessageAuthenticationCode ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (originatorInfo != null) - { - v.add(new DERTaggedObject(false, 0, originatorInfo)); - } - - v.add(recipientInfos); - v.add(macAlgorithm); - - if (digestAlgorithm != null) - { - v.add(new DERTaggedObject(false, 1, digestAlgorithm)); - } - - v.add(encapsulatedContentInfo); - - if (authAttrs != null) - { - v.add(new DERTaggedObject(false, 2, authAttrs)); - } - - v.add(mac); - - if (unauthAttrs != null) - { - v.add(new DERTaggedObject(false, 3, unauthAttrs)); - } - - return new BERSequence(v); - } - - public static int calculateVersion(OriginatorInfo origInfo) - { - if (origInfo == null) - { - return 0; - } - else - { - int ver = 0; - - for (Enumeration e = origInfo.getCertificates().getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tag = (ASN1TaggedObject)obj; - - if (tag.getTagNo() == 2) - { - ver = 1; - } - else if (tag.getTagNo() == 3) - { - ver = 3; - break; - } - } - } - - if (origInfo.getCRLs() != null) - { - for (Enumeration e = origInfo.getCRLs().getObjects(); e.hasMoreElements();) - { - Object obj = e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tag = (ASN1TaggedObject)obj; - - if (tag.getTagNo() == 1) - { - ver = 3; - break; - } - } - } - } - - return ver; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedDataParser.java deleted file mode 100644 index c007104..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/AuthenticatedDataParser.java +++ /dev/null @@ -1,197 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1SetParser; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.ASN1TaggedObjectParser; -import org.bc.asn1.BERTags; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * Produce an object suitable for an ASN1OutputStream. - *
    - * AuthenticatedData ::= SEQUENCE {
    - *       version CMSVersion,
    - *       originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    - *       recipientInfos RecipientInfos,
    - *       macAlgorithm MessageAuthenticationCodeAlgorithm,
    - *       digestAlgorithm [1] DigestAlgorithmIdentifier OPTIONAL,
    - *       encapContentInfo EncapsulatedContentInfo,
    - *       authAttrs [2] IMPLICIT AuthAttributes OPTIONAL,
    - *       mac MessageAuthenticationCode,
    - *       unauthAttrs [3] IMPLICIT UnauthAttributes OPTIONAL }
    - *
    - * AuthAttributes ::= SET SIZE (1..MAX) OF Attribute
    - *
    - * UnauthAttributes ::= SET SIZE (1..MAX) OF Attribute
    - *
    - * MessageAuthenticationCode ::= OCTET STRING
    - * 
    - */ -public class AuthenticatedDataParser -{ - private ASN1SequenceParser seq; - private ASN1Integer version; - private ASN1Encodable nextObject; - private boolean originatorInfoCalled; - - public AuthenticatedDataParser( - ASN1SequenceParser seq) - throws IOException - { - this.seq = seq; - this.version = ASN1Integer.getInstance(seq.readObject()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorInfo getOriginatorInfo() - throws IOException - { - originatorInfoCalled = true; - - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)nextObject).getTagNo() == 0) - { - ASN1SequenceParser originatorInfo = (ASN1SequenceParser) ((ASN1TaggedObjectParser)nextObject).getObjectParser(BERTags.SEQUENCE, false); - nextObject = null; - return OriginatorInfo.getInstance(originatorInfo.toASN1Primitive()); - } - - return null; - } - - public ASN1SetParser getRecipientInfos() - throws IOException - { - if (!originatorInfoCalled) - { - getOriginatorInfo(); - } - - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - ASN1SetParser recipientInfos = (ASN1SetParser)nextObject; - nextObject = null; - return recipientInfos; - } - - public AlgorithmIdentifier getMacAlgorithm() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject != null) - { - ASN1SequenceParser o = (ASN1SequenceParser)nextObject; - nextObject = null; - return AlgorithmIdentifier.getInstance(o.toASN1Primitive()); - } - - return null; - } - - public AlgorithmIdentifier getDigestAlgorithm() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject instanceof ASN1TaggedObjectParser) - { - AlgorithmIdentifier obj = AlgorithmIdentifier.getInstance((ASN1TaggedObject)nextObject.toASN1Primitive(), false); - nextObject = null; - return obj; - } - - return null; - } - - public ContentInfoParser getEnapsulatedContentInfo() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject != null) - { - ASN1SequenceParser o = (ASN1SequenceParser)nextObject; - nextObject = null; - return new ContentInfoParser(o); - } - - return null; - } - - public ASN1SetParser getAuthAttrs() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject instanceof ASN1TaggedObjectParser) - { - ASN1Encodable o = nextObject; - nextObject = null; - return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false); - } - - return null; - } - - public ASN1OctetString getMac() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - ASN1Encodable o = nextObject; - nextObject = null; - - return ASN1OctetString.getInstance(o.toASN1Primitive()); - } - - public ASN1SetParser getUnauthAttrs() - throws IOException - { - if (nextObject == null) - { - nextObject = seq.readObject(); - } - - if (nextObject != null) - { - ASN1Encodable o = nextObject; - nextObject = null; - return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSAttributes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSAttributes.java deleted file mode 100644 index ebf769a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSAttributes.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface CMSAttributes -{ - public static final ASN1ObjectIdentifier contentType = PKCSObjectIdentifiers.pkcs_9_at_contentType; - public static final ASN1ObjectIdentifier messageDigest = PKCSObjectIdentifiers.pkcs_9_at_messageDigest; - public static final ASN1ObjectIdentifier signingTime = PKCSObjectIdentifiers.pkcs_9_at_signingTime; - public static final ASN1ObjectIdentifier counterSignature = PKCSObjectIdentifiers.pkcs_9_at_counterSignature; - public static final ASN1ObjectIdentifier contentHint = PKCSObjectIdentifiers.id_aa_contentHint; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSObjectIdentifiers.java deleted file mode 100644 index a918366..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CMSObjectIdentifiers.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface CMSObjectIdentifiers -{ - static final ASN1ObjectIdentifier data = PKCSObjectIdentifiers.data; - static final ASN1ObjectIdentifier signedData = PKCSObjectIdentifiers.signedData; - static final ASN1ObjectIdentifier envelopedData = PKCSObjectIdentifiers.envelopedData; - static final ASN1ObjectIdentifier signedAndEnvelopedData = PKCSObjectIdentifiers.signedAndEnvelopedData; - static final ASN1ObjectIdentifier digestedData = PKCSObjectIdentifiers.digestedData; - static final ASN1ObjectIdentifier encryptedData = PKCSObjectIdentifiers.encryptedData; - static final ASN1ObjectIdentifier authenticatedData = PKCSObjectIdentifiers.id_ct_authData; - static final ASN1ObjectIdentifier compressedData = PKCSObjectIdentifiers.id_ct_compressedData; - static final ASN1ObjectIdentifier authEnvelopedData = PKCSObjectIdentifiers.id_ct_authEnvelopedData; - static final ASN1ObjectIdentifier timestampedData = PKCSObjectIdentifiers.id_ct_timestampedData; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedData.java deleted file mode 100644 index a5b2962..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedData.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * RFC 3274 - CMS Compressed Data. - *
    - * CompressedData ::= SEQUENCE {
    - *  version CMSVersion,
    - *  compressionAlgorithm CompressionAlgorithmIdentifier,
    - *  encapContentInfo EncapsulatedContentInfo
    - * }
    - * 
    - */ -public class CompressedData - extends ASN1Object -{ - private ASN1Integer version; - private AlgorithmIdentifier compressionAlgorithm; - private ContentInfo encapContentInfo; - - public CompressedData( - AlgorithmIdentifier compressionAlgorithm, - ContentInfo encapContentInfo) - { - this.version = new ASN1Integer(0); - this.compressionAlgorithm = compressionAlgorithm; - this.encapContentInfo = encapContentInfo; - } - - private CompressedData( - ASN1Sequence seq) - { - this.version = (ASN1Integer)seq.getObjectAt(0); - this.compressionAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - this.encapContentInfo = ContentInfo.getInstance(seq.getObjectAt(2)); - - } - - /** - * return a CompressedData object from a tagged object. - * - * @param _ato the tagged object holding the object we want. - * @param _explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static CompressedData getInstance( - ASN1TaggedObject _ato, - boolean _explicit) - { - return getInstance(ASN1Sequence.getInstance(_ato, _explicit)); - } - - /** - * return a CompressedData object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static CompressedData getInstance( - Object obj) - { - if (obj instanceof CompressedData) - { - return (CompressedData)obj; - } - - if (obj != null) - { - return new CompressedData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - public AlgorithmIdentifier getCompressionAlgorithmIdentifier() - { - return compressionAlgorithm; - } - - public ContentInfo getEncapContentInfo() - { - return encapContentInfo; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(compressionAlgorithm); - v.add(encapContentInfo); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedDataParser.java deleted file mode 100644 index 2c805e9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/CompressedDataParser.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * RFC 3274 - CMS Compressed Data. - *
    - * CompressedData ::= SEQUENCE {
    - *  version CMSVersion,
    - *  compressionAlgorithm CompressionAlgorithmIdentifier,
    - *  encapContentInfo EncapsulatedContentInfo
    - * }
    - * 
    - */ -public class CompressedDataParser -{ - private ASN1Integer _version; - private AlgorithmIdentifier _compressionAlgorithm; - private ContentInfoParser _encapContentInfo; - - public CompressedDataParser( - ASN1SequenceParser seq) - throws IOException - { - this._version = (ASN1Integer)seq.readObject(); - this._compressionAlgorithm = AlgorithmIdentifier.getInstance(seq.readObject().toASN1Primitive()); - this._encapContentInfo = new ContentInfoParser((ASN1SequenceParser)seq.readObject()); - } - - public ASN1Integer getVersion() - { - return _version; - } - - public AlgorithmIdentifier getCompressionAlgorithmIdentifier() - { - return _compressionAlgorithm; - } - - public ContentInfoParser getEncapContentInfo() - { - return _encapContentInfo; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfo.java deleted file mode 100644 index a443e46..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfo.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERTaggedObject; - -public class ContentInfo - extends ASN1Object - implements CMSObjectIdentifiers -{ - private ASN1ObjectIdentifier contentType; - private ASN1Encodable content; - - public static ContentInfo getInstance( - Object obj) - { - if (obj instanceof ContentInfo) - { - return (ContentInfo)obj; - } - else if (obj != null) - { - return new ContentInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ContentInfo( - ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - - if (seq.size() > 1) - { - ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(1); - if (!tagged.isExplicit() || tagged.getTagNo() != 0) - { - throw new IllegalArgumentException("Bad tag for 'content'"); - } - - content = tagged.getObject(); - } - } - - public ContentInfo( - ASN1ObjectIdentifier contentType, - ASN1Encodable content) - { - this.contentType = contentType; - this.content = content; - } - - public ASN1ObjectIdentifier getContentType() - { - return contentType; - } - - public ASN1Encodable getContent() - { - return content; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ContentInfo ::= SEQUENCE {
    -     *          contentType ContentType,
    -     *          content
    -     *          [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(contentType); - - if (content != null) - { - v.add(new BERTaggedObject(0, content)); - } - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfoParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfoParser.java deleted file mode 100644 index 175c08f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ContentInfoParser.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1TaggedObjectParser; - -/** - * Produce an object suitable for an ASN1OutputStream. - *
    - * ContentInfo ::= SEQUENCE {
    - *          contentType ContentType,
    - *          content
    - *          [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
    - * 
    - */ -public class ContentInfoParser -{ - private ASN1ObjectIdentifier contentType; - private ASN1TaggedObjectParser content; - - public ContentInfoParser( - ASN1SequenceParser seq) - throws IOException - { - contentType = (ASN1ObjectIdentifier)seq.readObject(); - content = (ASN1TaggedObjectParser)seq.readObject(); - } - - public ASN1ObjectIdentifier getContentType() - { - return contentType; - } - - public ASN1Encodable getContent( - int tag) - throws IOException - { - if (content != null) - { - return content.getObjectParser(tag, true); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/DigestedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/DigestedData.java deleted file mode 100644 index 8d6f821..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/DigestedData.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * RFC 3274 - CMS Digest Data. - *
    - * DigestedData ::= SEQUENCE {
    - *               version CMSVersion,
    - *               digestAlgorithm DigestAlgorithmIdentifier,
    - *               encapContentInfo EncapsulatedContentInfo,
    - *               digest Digest }
    - * 
    - */ -public class DigestedData - extends ASN1Object -{ - private ASN1Integer version; - private AlgorithmIdentifier digestAlgorithm; - private ContentInfo encapContentInfo; - private ASN1OctetString digest; - - public DigestedData( - AlgorithmIdentifier digestAlgorithm, - ContentInfo encapContentInfo, - byte[] digest) - { - this.version = new ASN1Integer(0); - this.digestAlgorithm = digestAlgorithm; - this.encapContentInfo = encapContentInfo; - this.digest = new DEROctetString(digest); - } - - private DigestedData( - ASN1Sequence seq) - { - this.version = (ASN1Integer)seq.getObjectAt(0); - this.digestAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - this.encapContentInfo = ContentInfo.getInstance(seq.getObjectAt(2)); - this.digest = ASN1OctetString.getInstance(seq.getObjectAt(3)); - } - - /** - * return a CompressedData object from a tagged object. - * - * @param _ato the tagged object holding the object we want. - * @param _explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static DigestedData getInstance( - ASN1TaggedObject _ato, - boolean _explicit) - { - return getInstance(ASN1Sequence.getInstance(_ato, _explicit)); - } - - /** - * return a CompressedData object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static DigestedData getInstance( - Object obj) - { - if (obj instanceof DigestedData) - { - return (DigestedData)obj; - } - - if (obj != null) - { - return new DigestedData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - public AlgorithmIdentifier getDigestAlgorithm() - { - return digestAlgorithm; - } - - public ContentInfo getEncapContentInfo() - { - return encapContentInfo; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(digestAlgorithm); - v.add(encapContentInfo); - v.add(digest); - - return new BERSequence(v); - } - - public byte[] getDigest() - { - return digest.getOctets(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfo.java deleted file mode 100644 index 0da71c3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfo.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class EncryptedContentInfo - extends ASN1Object -{ - private ASN1ObjectIdentifier contentType; - private AlgorithmIdentifier contentEncryptionAlgorithm; - private ASN1OctetString encryptedContent; - - public EncryptedContentInfo( - ASN1ObjectIdentifier contentType, - AlgorithmIdentifier contentEncryptionAlgorithm, - ASN1OctetString encryptedContent) - { - this.contentType = contentType; - this.contentEncryptionAlgorithm = contentEncryptionAlgorithm; - this.encryptedContent = encryptedContent; - } - - private EncryptedContentInfo( - ASN1Sequence seq) - { - if (seq.size() < 2) - { - throw new IllegalArgumentException("Truncated Sequence Found"); - } - - contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - contentEncryptionAlgorithm = AlgorithmIdentifier.getInstance( - seq.getObjectAt(1)); - if (seq.size() > 2) - { - encryptedContent = ASN1OctetString.getInstance( - (ASN1TaggedObject)seq.getObjectAt(2), false); - } - } - - /** - * return an EncryptedContentInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static EncryptedContentInfo getInstance( - Object obj) - { - if (obj instanceof EncryptedContentInfo) - { - return (EncryptedContentInfo)obj; - } - if (obj != null) - { - return new EncryptedContentInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1ObjectIdentifier getContentType() - { - return contentType; - } - - public AlgorithmIdentifier getContentEncryptionAlgorithm() - { - return contentEncryptionAlgorithm; - } - - public ASN1OctetString getEncryptedContent() - { - return encryptedContent; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * EncryptedContentInfo ::= SEQUENCE {
    -     *     contentType ContentType,
    -     *     contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
    -     *     encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(contentType); - v.add(contentEncryptionAlgorithm); - - if (encryptedContent != null) - { - v.add(new BERTaggedObject(false, 0, encryptedContent)); - } - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfoParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfoParser.java deleted file mode 100644 index 364f1d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedContentInfoParser.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1TaggedObjectParser; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - *
    - * EncryptedContentInfo ::= SEQUENCE {
    - *     contentType ContentType,
    - *     contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
    - *     encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL 
    - * }
    - * 
    - */ -public class EncryptedContentInfoParser -{ - private ASN1ObjectIdentifier _contentType; - private AlgorithmIdentifier _contentEncryptionAlgorithm; - private ASN1TaggedObjectParser _encryptedContent; - - public EncryptedContentInfoParser( - ASN1SequenceParser seq) - throws IOException - { - _contentType = (ASN1ObjectIdentifier)seq.readObject(); - _contentEncryptionAlgorithm = AlgorithmIdentifier.getInstance(seq.readObject().toASN1Primitive()); - _encryptedContent = (ASN1TaggedObjectParser)seq.readObject(); - } - - public ASN1ObjectIdentifier getContentType() - { - return _contentType; - } - - public AlgorithmIdentifier getContentEncryptionAlgorithm() - { - return _contentEncryptionAlgorithm; - } - - public ASN1Encodable getEncryptedContent( - int tag) - throws IOException - { - return _encryptedContent.getObjectParser(tag, false); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedData.java deleted file mode 100644 index 9b8c617..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EncryptedData.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERTaggedObject; - -public class EncryptedData - extends ASN1Object -{ - private ASN1Integer version; - private EncryptedContentInfo encryptedContentInfo; - private ASN1Set unprotectedAttrs; - - public static EncryptedData getInstance(Object o) - { - if (o instanceof EncryptedData) - { - return (EncryptedData)o; - } - - if (o != null) - { - return new EncryptedData(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public EncryptedData(EncryptedContentInfo encInfo) - { - this(encInfo, null); - } - - public EncryptedData(EncryptedContentInfo encInfo, ASN1Set unprotectedAttrs) - { - this.version = new ASN1Integer((unprotectedAttrs == null) ? 0 : 2); - this.encryptedContentInfo = encInfo; - this.unprotectedAttrs = unprotectedAttrs; - } - - private EncryptedData(ASN1Sequence seq) - { - this.version = ASN1Integer.getInstance(seq.getObjectAt(0)); - this.encryptedContentInfo = EncryptedContentInfo.getInstance(seq.getObjectAt(1)); - - if (seq.size() == 3) - { - this.unprotectedAttrs = ASN1Set.getInstance(seq.getObjectAt(2)); - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public EncryptedContentInfo getEncryptedContentInfo() - { - return encryptedContentInfo; - } - - public ASN1Set getUnprotectedAttrs() - { - return unprotectedAttrs; - } - - /** - *
    -     *       EncryptedData ::= SEQUENCE {
    -     *                     version CMSVersion,
    -     *                     encryptedContentInfo EncryptedContentInfo,
    -     *                     unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(encryptedContentInfo); - if (unprotectedAttrs != null) - { - v.add(new BERTaggedObject(false, 1, unprotectedAttrs)); - } - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedData.java deleted file mode 100644 index 1db3888..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedData.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERTaggedObject; - -public class EnvelopedData - extends ASN1Object -{ - private ASN1Integer version; - private OriginatorInfo originatorInfo; - private ASN1Set recipientInfos; - private EncryptedContentInfo encryptedContentInfo; - private ASN1Set unprotectedAttrs; - - public EnvelopedData( - OriginatorInfo originatorInfo, - ASN1Set recipientInfos, - EncryptedContentInfo encryptedContentInfo, - ASN1Set unprotectedAttrs) - { - version = new ASN1Integer(calculateVersion(originatorInfo, recipientInfos, unprotectedAttrs)); - - this.originatorInfo = originatorInfo; - this.recipientInfos = recipientInfos; - this.encryptedContentInfo = encryptedContentInfo; - this.unprotectedAttrs = unprotectedAttrs; - } - - public EnvelopedData( - ASN1Sequence seq) - { - int index = 0; - - version = (ASN1Integer)seq.getObjectAt(index++); - - Object tmp = seq.getObjectAt(index++); - - if (tmp instanceof ASN1TaggedObject) - { - originatorInfo = OriginatorInfo.getInstance((ASN1TaggedObject)tmp, false); - tmp = seq.getObjectAt(index++); - } - - recipientInfos = ASN1Set.getInstance(tmp); - - encryptedContentInfo = EncryptedContentInfo.getInstance(seq.getObjectAt(index++)); - - if(seq.size() > index) - { - unprotectedAttrs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(index), false); - } - } - - /** - * return an EnvelopedData object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static EnvelopedData getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an EnvelopedData object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static EnvelopedData getInstance( - Object obj) - { - if (obj instanceof EnvelopedData) - { - return (EnvelopedData)obj; - } - - if (obj != null) - { - return new EnvelopedData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorInfo getOriginatorInfo() - { - return originatorInfo; - } - - public ASN1Set getRecipientInfos() - { - return recipientInfos; - } - - public EncryptedContentInfo getEncryptedContentInfo() - { - return encryptedContentInfo; - } - - public ASN1Set getUnprotectedAttrs() - { - return unprotectedAttrs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * EnvelopedData ::= SEQUENCE {
    -     *     version CMSVersion,
    -     *     originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    -     *     recipientInfos RecipientInfos,
    -     *     encryptedContentInfo EncryptedContentInfo,
    -     *     unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (originatorInfo != null) - { - v.add(new DERTaggedObject(false, 0, originatorInfo)); - } - - v.add(recipientInfos); - v.add(encryptedContentInfo); - - if (unprotectedAttrs != null) - { - v.add(new DERTaggedObject(false, 1, unprotectedAttrs)); - } - - return new BERSequence(v); - } - - public static int calculateVersion(OriginatorInfo originatorInfo, ASN1Set recipientInfos, ASN1Set unprotectedAttrs) - { - int version; - - if (originatorInfo != null || unprotectedAttrs != null) - { - version = 2; - } - else - { - version = 0; - - Enumeration e = recipientInfos.getObjects(); - - while (e.hasMoreElements()) - { - RecipientInfo ri = RecipientInfo.getInstance(e.nextElement()); - - if (ri.getVersion().getValue().intValue() != version) - { - version = 2; - break; - } - } - } - - return version; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedDataParser.java deleted file mode 100644 index e03344f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/EnvelopedDataParser.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1SetParser; -import org.bc.asn1.ASN1TaggedObjectParser; -import org.bc.asn1.BERTags; - -/** - *
    - * EnvelopedData ::= SEQUENCE {
    - *     version CMSVersion,
    - *     originatorInfo [0] IMPLICIT OriginatorInfo OPTIONAL,
    - *     recipientInfos RecipientInfos,
    - *     encryptedContentInfo EncryptedContentInfo,
    - *     unprotectedAttrs [1] IMPLICIT UnprotectedAttributes OPTIONAL 
    - * }
    - * 
    - */ -public class EnvelopedDataParser -{ - private ASN1SequenceParser _seq; - private ASN1Integer _version; - private ASN1Encodable _nextObject; - private boolean _originatorInfoCalled; - - public EnvelopedDataParser( - ASN1SequenceParser seq) - throws IOException - { - this._seq = seq; - this._version = ASN1Integer.getInstance(seq.readObject()); - } - - public ASN1Integer getVersion() - { - return _version; - } - - public OriginatorInfo getOriginatorInfo() - throws IOException - { - _originatorInfoCalled = true; - - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - if (_nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)_nextObject).getTagNo() == 0) - { - ASN1SequenceParser originatorInfo = (ASN1SequenceParser) ((ASN1TaggedObjectParser)_nextObject).getObjectParser(BERTags.SEQUENCE, false); - _nextObject = null; - return OriginatorInfo.getInstance(originatorInfo.toASN1Primitive()); - } - - return null; - } - - public ASN1SetParser getRecipientInfos() - throws IOException - { - if (!_originatorInfoCalled) - { - getOriginatorInfo(); - } - - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - ASN1SetParser recipientInfos = (ASN1SetParser)_nextObject; - _nextObject = null; - return recipientInfos; - } - - public EncryptedContentInfoParser getEncryptedContentInfo() - throws IOException - { - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - - if (_nextObject != null) - { - ASN1SequenceParser o = (ASN1SequenceParser) _nextObject; - _nextObject = null; - return new EncryptedContentInfoParser(o); - } - - return null; - } - - public ASN1SetParser getUnprotectedAttrs() - throws IOException - { - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - - if (_nextObject != null) - { - ASN1Encodable o = _nextObject; - _nextObject = null; - return (ASN1SetParser)((ASN1TaggedObjectParser)o).getObjectParser(BERTags.SET, false); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Evidence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Evidence.java deleted file mode 100644 index ceb1879..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Evidence.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class Evidence - extends ASN1Object - implements ASN1Choice -{ - private TimeStampTokenEvidence tstEvidence; - - public Evidence(TimeStampTokenEvidence tstEvidence) - { - this.tstEvidence = tstEvidence; - } - - private Evidence(ASN1TaggedObject tagged) - { - if (tagged.getTagNo() == 0) - { - this.tstEvidence = TimeStampTokenEvidence.getInstance(tagged, false); - } - } - - public static Evidence getInstance(Object obj) - { - if (obj == null || obj instanceof Evidence) - { - return (Evidence)obj; - } - else if (obj instanceof ASN1TaggedObject) - { - return new Evidence(ASN1TaggedObject.getInstance(obj)); - } - - throw new IllegalArgumentException("unknown object in getInstance"); - } - - public TimeStampTokenEvidence getTstEvidence() - { - return tstEvidence; - } - - public ASN1Primitive toASN1Primitive() - { - if (tstEvidence != null) - { - return new DERTaggedObject(false, 0, tstEvidence); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/IssuerAndSerialNumber.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/IssuerAndSerialNumber.java deleted file mode 100644 index 1c58fb4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/IssuerAndSerialNumber.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.bc.asn1.cms; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.Certificate; -import org.bc.asn1.x509.X509CertificateStructure; -import org.bc.asn1.x509.X509Name; - -public class IssuerAndSerialNumber - extends ASN1Object -{ - private X500Name name; - private ASN1Integer serialNumber; - - public static IssuerAndSerialNumber getInstance( - Object obj) - { - if (obj instanceof IssuerAndSerialNumber) - { - return (IssuerAndSerialNumber)obj; - } - else if (obj != null) - { - return new IssuerAndSerialNumber(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public IssuerAndSerialNumber( - ASN1Sequence seq) - { - this.name = X500Name.getInstance(seq.getObjectAt(0)); - this.serialNumber = (ASN1Integer)seq.getObjectAt(1); - } - - public IssuerAndSerialNumber( - Certificate certificate) - { - this.name = certificate.getIssuer(); - this.serialNumber = certificate.getSerialNumber(); - } - - public IssuerAndSerialNumber( - X509CertificateStructure certificate) - { - this.name = certificate.getIssuer(); - this.serialNumber = certificate.getSerialNumber(); - } - - public IssuerAndSerialNumber( - X500Name name, - BigInteger serialNumber) - { - this.name = name; - this.serialNumber = new ASN1Integer(serialNumber); - } - - /** - * @deprecated use X500Name constructor - */ - public IssuerAndSerialNumber( - X509Name name, - BigInteger serialNumber) - { - this.name = X500Name.getInstance(name); - this.serialNumber = new ASN1Integer(serialNumber); - } - - /** - * @deprecated use X500Name constructor - */ - public IssuerAndSerialNumber( - X509Name name, - ASN1Integer serialNumber) - { - this.name = X500Name.getInstance(name); - this.serialNumber = serialNumber; - } - - public X500Name getName() - { - return name; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(name); - v.add(serialNumber); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKIdentifier.java deleted file mode 100644 index 3d36696..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKIdentifier.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class KEKIdentifier - extends ASN1Object -{ - private ASN1OctetString keyIdentifier; - private ASN1GeneralizedTime date; - private OtherKeyAttribute other; - - public KEKIdentifier( - byte[] keyIdentifier, - ASN1GeneralizedTime date, - OtherKeyAttribute other) - { - this.keyIdentifier = new DEROctetString(keyIdentifier); - this.date = date; - this.other = other; - } - - private KEKIdentifier( - ASN1Sequence seq) - { - keyIdentifier = (ASN1OctetString)seq.getObjectAt(0); - - switch (seq.size()) - { - case 1: - break; - case 2: - if (seq.getObjectAt(1) instanceof ASN1GeneralizedTime) - { - date = (ASN1GeneralizedTime)seq.getObjectAt(1); - } - else - { - other = OtherKeyAttribute.getInstance(seq.getObjectAt(1)); - } - break; - case 3: - date = (ASN1GeneralizedTime)seq.getObjectAt(1); - other = OtherKeyAttribute.getInstance(seq.getObjectAt(2)); - break; - default: - throw new IllegalArgumentException("Invalid KEKIdentifier"); - } - } - - /** - * return a KEKIdentifier object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static KEKIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a KEKIdentifier object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static KEKIdentifier getInstance( - Object obj) - { - if (obj == null || obj instanceof KEKIdentifier) - { - return (KEKIdentifier)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new KEKIdentifier((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid KEKIdentifier: " + obj.getClass().getName()); - } - - public ASN1OctetString getKeyIdentifier() - { - return keyIdentifier; - } - - public ASN1GeneralizedTime getDate() - { - return date; - } - - public OtherKeyAttribute getOther() - { - return other; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * KEKIdentifier ::= SEQUENCE {
    -     *     keyIdentifier OCTET STRING,
    -     *     date GeneralizedTime OPTIONAL,
    -     *     other OtherKeyAttribute OPTIONAL 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(keyIdentifier); - - if (date != null) - { - v.add(date); - } - - if (other != null) - { - v.add(other); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKRecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKRecipientInfo.java deleted file mode 100644 index 6112e9f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KEKRecipientInfo.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class KEKRecipientInfo - extends ASN1Object -{ - private ASN1Integer version; - private KEKIdentifier kekid; - private AlgorithmIdentifier keyEncryptionAlgorithm; - private ASN1OctetString encryptedKey; - - public KEKRecipientInfo( - KEKIdentifier kekid, - AlgorithmIdentifier keyEncryptionAlgorithm, - ASN1OctetString encryptedKey) - { - this.version = new ASN1Integer(4); - this.kekid = kekid; - this.keyEncryptionAlgorithm = keyEncryptionAlgorithm; - this.encryptedKey = encryptedKey; - } - - public KEKRecipientInfo( - ASN1Sequence seq) - { - version = (ASN1Integer)seq.getObjectAt(0); - kekid = KEKIdentifier.getInstance(seq.getObjectAt(1)); - keyEncryptionAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(2)); - encryptedKey = (ASN1OctetString)seq.getObjectAt(3); - } - - /** - * return a KEKRecipientInfo object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static KEKRecipientInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a KEKRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static KEKRecipientInfo getInstance( - Object obj) - { - if (obj == null || obj instanceof KEKRecipientInfo) - { - return (KEKRecipientInfo)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new KEKRecipientInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid KEKRecipientInfo: " + obj.getClass().getName()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public KEKIdentifier getKekid() - { - return kekid; - } - - public AlgorithmIdentifier getKeyEncryptionAlgorithm() - { - return keyEncryptionAlgorithm; - } - - public ASN1OctetString getEncryptedKey() - { - return encryptedKey; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * KEKRecipientInfo ::= SEQUENCE {
    -     *     version CMSVersion,  -- always set to 4
    -     *     kekid KEKIdentifier,
    -     *     keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
    -     *     encryptedKey EncryptedKey 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(kekid); - v.add(keyEncryptionAlgorithm); - v.add(encryptedKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientIdentifier.java deleted file mode 100644 index 2ad95ae..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientIdentifier.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class KeyAgreeRecipientIdentifier - extends ASN1Object - implements ASN1Choice -{ - private IssuerAndSerialNumber issuerSerial; - private RecipientKeyIdentifier rKeyID; - - /** - * return an KeyAgreeRecipientIdentifier object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static KeyAgreeRecipientIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an KeyAgreeRecipientIdentifier object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static KeyAgreeRecipientIdentifier getInstance( - Object obj) - { - if (obj == null || obj instanceof KeyAgreeRecipientIdentifier) - { - return (KeyAgreeRecipientIdentifier)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new KeyAgreeRecipientIdentifier(IssuerAndSerialNumber.getInstance(obj)); - } - - if (obj instanceof ASN1TaggedObject && ((ASN1TaggedObject)obj).getTagNo() == 0) - { - return new KeyAgreeRecipientIdentifier(RecipientKeyIdentifier.getInstance( - (ASN1TaggedObject)obj, false)); - } - - throw new IllegalArgumentException("Invalid KeyAgreeRecipientIdentifier: " + obj.getClass().getName()); - } - - public KeyAgreeRecipientIdentifier( - IssuerAndSerialNumber issuerSerial) - { - this.issuerSerial = issuerSerial; - this.rKeyID = null; - } - - public KeyAgreeRecipientIdentifier( - RecipientKeyIdentifier rKeyID) - { - this.issuerSerial = null; - this.rKeyID = rKeyID; - } - - public IssuerAndSerialNumber getIssuerAndSerialNumber() - { - return issuerSerial; - } - - public RecipientKeyIdentifier getRKeyID() - { - return rKeyID; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * KeyAgreeRecipientIdentifier ::= CHOICE {
    -     *     issuerAndSerialNumber IssuerAndSerialNumber,
    -     *     rKeyId [0] IMPLICIT RecipientKeyIdentifier
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - if (issuerSerial != null) - { - return issuerSerial.toASN1Primitive(); - } - - return new DERTaggedObject(false, 0, rKeyID); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientInfo.java deleted file mode 100644 index 1724b29..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyAgreeRecipientInfo.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class KeyAgreeRecipientInfo - extends ASN1Object -{ - private ASN1Integer version; - private OriginatorIdentifierOrKey originator; - private ASN1OctetString ukm; - private AlgorithmIdentifier keyEncryptionAlgorithm; - private ASN1Sequence recipientEncryptedKeys; - - public KeyAgreeRecipientInfo( - OriginatorIdentifierOrKey originator, - ASN1OctetString ukm, - AlgorithmIdentifier keyEncryptionAlgorithm, - ASN1Sequence recipientEncryptedKeys) - { - this.version = new ASN1Integer(3); - this.originator = originator; - this.ukm = ukm; - this.keyEncryptionAlgorithm = keyEncryptionAlgorithm; - this.recipientEncryptedKeys = recipientEncryptedKeys; - } - - public KeyAgreeRecipientInfo( - ASN1Sequence seq) - { - int index = 0; - - version = (ASN1Integer)seq.getObjectAt(index++); - originator = OriginatorIdentifierOrKey.getInstance( - (ASN1TaggedObject)seq.getObjectAt(index++), true); - - if (seq.getObjectAt(index) instanceof ASN1TaggedObject) - { - ukm = ASN1OctetString.getInstance( - (ASN1TaggedObject)seq.getObjectAt(index++), true); - } - - keyEncryptionAlgorithm = AlgorithmIdentifier.getInstance( - seq.getObjectAt(index++)); - - recipientEncryptedKeys = (ASN1Sequence)seq.getObjectAt(index++); - } - - /** - * return a KeyAgreeRecipientInfo object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static KeyAgreeRecipientInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a KeyAgreeRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static KeyAgreeRecipientInfo getInstance( - Object obj) - { - if (obj == null || obj instanceof KeyAgreeRecipientInfo) - { - return (KeyAgreeRecipientInfo)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new KeyAgreeRecipientInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException( - "Illegal object in KeyAgreeRecipientInfo: " + obj.getClass().getName()); - - } - - public ASN1Integer getVersion() - { - return version; - } - - public OriginatorIdentifierOrKey getOriginator() - { - return originator; - } - - public ASN1OctetString getUserKeyingMaterial() - { - return ukm; - } - - public AlgorithmIdentifier getKeyEncryptionAlgorithm() - { - return keyEncryptionAlgorithm; - } - - public ASN1Sequence getRecipientEncryptedKeys() - { - return recipientEncryptedKeys; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * KeyAgreeRecipientInfo ::= SEQUENCE {
    -     *     version CMSVersion,  -- always set to 3
    -     *     originator [0] EXPLICIT OriginatorIdentifierOrKey,
    -     *     ukm [1] EXPLICIT UserKeyingMaterial OPTIONAL,
    -     *     keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
    -     *     recipientEncryptedKeys RecipientEncryptedKeys 
    -     * }
    -     *
    -     * UserKeyingMaterial ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(new DERTaggedObject(true, 0, originator)); - - if (ukm != null) - { - v.add(new DERTaggedObject(true, 1, ukm)); - } - - v.add(keyEncryptionAlgorithm); - v.add(recipientEncryptedKeys); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyTransRecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyTransRecipientInfo.java deleted file mode 100644 index 717f38f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/KeyTransRecipientInfo.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class KeyTransRecipientInfo - extends ASN1Object -{ - private ASN1Integer version; - private RecipientIdentifier rid; - private AlgorithmIdentifier keyEncryptionAlgorithm; - private ASN1OctetString encryptedKey; - - public KeyTransRecipientInfo( - RecipientIdentifier rid, - AlgorithmIdentifier keyEncryptionAlgorithm, - ASN1OctetString encryptedKey) - { - if (rid.toASN1Primitive() instanceof ASN1TaggedObject) - { - this.version = new ASN1Integer(2); - } - else - { - this.version = new ASN1Integer(0); - } - - this.rid = rid; - this.keyEncryptionAlgorithm = keyEncryptionAlgorithm; - this.encryptedKey = encryptedKey; - } - - public KeyTransRecipientInfo( - ASN1Sequence seq) - { - this.version = (ASN1Integer)seq.getObjectAt(0); - this.rid = RecipientIdentifier.getInstance(seq.getObjectAt(1)); - this.keyEncryptionAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(2)); - this.encryptedKey = (ASN1OctetString)seq.getObjectAt(3); - } - - /** - * return a KeyTransRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static KeyTransRecipientInfo getInstance( - Object obj) - { - if (obj == null || obj instanceof KeyTransRecipientInfo) - { - return (KeyTransRecipientInfo)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new KeyTransRecipientInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException( - "Illegal object in KeyTransRecipientInfo: " + obj.getClass().getName()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public RecipientIdentifier getRecipientIdentifier() - { - return rid; - } - - public AlgorithmIdentifier getKeyEncryptionAlgorithm() - { - return keyEncryptionAlgorithm; - } - - public ASN1OctetString getEncryptedKey() - { - return encryptedKey; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * KeyTransRecipientInfo ::= SEQUENCE {
    -     *     version CMSVersion,  -- always set to 0 or 2
    -     *     rid RecipientIdentifier,
    -     *     keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
    -     *     encryptedKey EncryptedKey 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(rid); - v.add(keyEncryptionAlgorithm); - v.add(encryptedKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/MetaData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/MetaData.java deleted file mode 100644 index 9620ea2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/MetaData.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERUTF8String; - -public class MetaData - extends ASN1Object -{ - private ASN1Boolean hashProtected; - private DERUTF8String fileName; - private DERIA5String mediaType; - private Attributes otherMetaData; - - public MetaData( - ASN1Boolean hashProtected, - DERUTF8String fileName, - DERIA5String mediaType, - Attributes otherMetaData) - { - this.hashProtected = hashProtected; - this.fileName = fileName; - this.mediaType = mediaType; - this.otherMetaData = otherMetaData; - } - - private MetaData(ASN1Sequence seq) - { - this.hashProtected = ASN1Boolean.getInstance(seq.getObjectAt(0)); - - int index = 1; - - if (index < seq.size() && seq.getObjectAt(index) instanceof DERUTF8String) - { - this.fileName = DERUTF8String.getInstance(seq.getObjectAt(index++)); - } - if (index < seq.size() && seq.getObjectAt(index) instanceof DERIA5String) - { - this.mediaType = DERIA5String.getInstance(seq.getObjectAt(index++)); - } - if (index < seq.size()) - { - this.otherMetaData = Attributes.getInstance(seq.getObjectAt(index++)); - } - } - - public static MetaData getInstance(Object obj) - { - if (obj instanceof MetaData) - { - return (MetaData)obj; - } - else if (obj != null) - { - return new MetaData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - *
    -     * MetaData ::= SEQUENCE {
    -     *   hashProtected        BOOLEAN,
    -     *   fileName             UTF8String OPTIONAL,
    -     *   mediaType            IA5String OPTIONAL,
    -     *   otherMetaData        Attributes OPTIONAL
    -     * }
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(hashProtected); - - if (fileName != null) - { - v.add(fileName); - } - - if (mediaType != null) - { - v.add(mediaType); - } - - if (otherMetaData != null) - { - v.add(otherMetaData); - } - - return new DERSequence(v); - } - - public boolean isHashProtected() - { - return hashProtected.isTrue(); - } - - public DERUTF8String getFileName() - { - return this.fileName; - } - - public DERIA5String getMediaType() - { - return this.mediaType; - } - - public Attributes getOtherMetaData() - { - return otherMetaData; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorIdentifierOrKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorIdentifierOrKey.java deleted file mode 100644 index 7c8ee42..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorIdentifierOrKey.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.SubjectKeyIdentifier; - -public class OriginatorIdentifierOrKey - extends ASN1Object - implements ASN1Choice -{ - private ASN1Encodable id; - - public OriginatorIdentifierOrKey( - IssuerAndSerialNumber id) - { - this.id = id; - } - - /** - * @deprecated use version taking a SubjectKeyIdentifier - */ - public OriginatorIdentifierOrKey( - ASN1OctetString id) - { - this(new SubjectKeyIdentifier(id.getOctets())); - } - - public OriginatorIdentifierOrKey( - SubjectKeyIdentifier id) - { - this.id = new DERTaggedObject(false, 0, id); - } - - public OriginatorIdentifierOrKey( - OriginatorPublicKey id) - { - this.id = new DERTaggedObject(false, 1, id); - } - - /** - * @deprecated use more specific version - */ - public OriginatorIdentifierOrKey( - ASN1Primitive id) - { - this.id = id; - } - - /** - * return an OriginatorIdentifierOrKey object from a tagged object. - * - * @param o the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static OriginatorIdentifierOrKey getInstance( - ASN1TaggedObject o, - boolean explicit) - { - if (!explicit) - { - throw new IllegalArgumentException( - "Can't implicitly tag OriginatorIdentifierOrKey"); - } - - return getInstance(o.getObject()); - } - - /** - * return an OriginatorIdentifierOrKey object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static OriginatorIdentifierOrKey getInstance( - Object o) - { - if (o == null || o instanceof OriginatorIdentifierOrKey) - { - return (OriginatorIdentifierOrKey)o; - } - - if (o instanceof IssuerAndSerialNumber) - { - return new OriginatorIdentifierOrKey((IssuerAndSerialNumber)o); - } - - if (o instanceof SubjectKeyIdentifier) - { - return new OriginatorIdentifierOrKey((SubjectKeyIdentifier)o); - } - - if (o instanceof OriginatorPublicKey) - { - return new OriginatorIdentifierOrKey((OriginatorPublicKey)o); - } - - if (o instanceof ASN1TaggedObject) - { - // TODO Add validation - return new OriginatorIdentifierOrKey((ASN1TaggedObject)o); - } - - throw new IllegalArgumentException("Invalid OriginatorIdentifierOrKey: " + o.getClass().getName()); - } - - public ASN1Encodable getId() - { - return id; - } - - public IssuerAndSerialNumber getIssuerAndSerialNumber() - { - if (id instanceof IssuerAndSerialNumber) - { - return (IssuerAndSerialNumber)id; - } - - return null; - } - - public SubjectKeyIdentifier getSubjectKeyIdentifier() - { - if (id instanceof ASN1TaggedObject && ((ASN1TaggedObject)id).getTagNo() == 0) - { - return SubjectKeyIdentifier.getInstance((ASN1TaggedObject)id, false); - } - - return null; - } - - public OriginatorPublicKey getOriginatorKey() - { - if (id instanceof ASN1TaggedObject && ((ASN1TaggedObject)id).getTagNo() == 1) - { - return OriginatorPublicKey.getInstance((ASN1TaggedObject)id, false); - } - - return null; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OriginatorIdentifierOrKey ::= CHOICE {
    -     *     issuerAndSerialNumber IssuerAndSerialNumber,
    -     *     subjectKeyIdentifier [0] SubjectKeyIdentifier,
    -     *     originatorKey [1] OriginatorPublicKey 
    -     * }
    -     *
    -     * SubjectKeyIdentifier ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return id.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorInfo.java deleted file mode 100644 index 45f05e8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorInfo.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class OriginatorInfo - extends ASN1Object -{ - private ASN1Set certs; - private ASN1Set crls; - - public OriginatorInfo( - ASN1Set certs, - ASN1Set crls) - { - this.certs = certs; - this.crls = crls; - } - - private OriginatorInfo( - ASN1Sequence seq) - { - switch (seq.size()) - { - case 0: // empty - break; - case 1: - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0); - switch (o.getTagNo()) - { - case 0 : - certs = ASN1Set.getInstance(o, false); - break; - case 1 : - crls = ASN1Set.getInstance(o, false); - break; - default: - throw new IllegalArgumentException("Bad tag in OriginatorInfo: " + o.getTagNo()); - } - break; - case 2: - certs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(0), false); - crls = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(1), false); - break; - default: - throw new IllegalArgumentException("OriginatorInfo too big"); - } - } - - /** - * return an OriginatorInfo object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static OriginatorInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an OriginatorInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static OriginatorInfo getInstance( - Object obj) - { - if (obj instanceof OriginatorInfo) - { - return (OriginatorInfo)obj; - } - else if (obj != null) - { - return new OriginatorInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Set getCertificates() - { - return certs; - } - - public ASN1Set getCRLs() - { - return crls; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OriginatorInfo ::= SEQUENCE {
    -     *     certs [0] IMPLICIT CertificateSet OPTIONAL,
    -     *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (certs != null) - { - v.add(new DERTaggedObject(false, 0, certs)); - } - - if (crls != null) - { - v.add(new DERTaggedObject(false, 1, crls)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorPublicKey.java deleted file mode 100644 index 48b33a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OriginatorPublicKey.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - - -public class OriginatorPublicKey - extends ASN1Object -{ - private AlgorithmIdentifier algorithm; - private DERBitString publicKey; - - public OriginatorPublicKey( - AlgorithmIdentifier algorithm, - byte[] publicKey) - { - this.algorithm = algorithm; - this.publicKey = new DERBitString(publicKey); - } - - public OriginatorPublicKey( - ASN1Sequence seq) - { - algorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - publicKey = (DERBitString)seq.getObjectAt(1); - } - - /** - * return an OriginatorPublicKey object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static OriginatorPublicKey getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an OriginatorPublicKey object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static OriginatorPublicKey getInstance( - Object obj) - { - if (obj == null || obj instanceof OriginatorPublicKey) - { - return (OriginatorPublicKey)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new OriginatorPublicKey((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid OriginatorPublicKey: " + obj.getClass().getName()); - } - - public AlgorithmIdentifier getAlgorithm() - { - return algorithm; - } - - public DERBitString getPublicKey() - { - return publicKey; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OriginatorPublicKey ::= SEQUENCE {
    -     *     algorithm AlgorithmIdentifier,
    -     *     publicKey BIT STRING 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algorithm); - v.add(publicKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherKeyAttribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherKeyAttribute.java deleted file mode 100644 index 6e64bc6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherKeyAttribute.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class OtherKeyAttribute - extends ASN1Object -{ - private ASN1ObjectIdentifier keyAttrId; - private ASN1Encodable keyAttr; - - /** - * return an OtherKeyAttribute object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static OtherKeyAttribute getInstance( - Object o) - { - if (o == null || o instanceof OtherKeyAttribute) - { - return (OtherKeyAttribute)o; - } - - if (o instanceof ASN1Sequence) - { - return new OtherKeyAttribute((ASN1Sequence)o); - } - - throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); - } - - public OtherKeyAttribute( - ASN1Sequence seq) - { - keyAttrId = (ASN1ObjectIdentifier)seq.getObjectAt(0); - keyAttr = seq.getObjectAt(1); - } - - public OtherKeyAttribute( - ASN1ObjectIdentifier keyAttrId, - ASN1Encodable keyAttr) - { - this.keyAttrId = keyAttrId; - this.keyAttr = keyAttr; - } - - public ASN1ObjectIdentifier getKeyAttrId() - { - return keyAttrId; - } - - public ASN1Encodable getKeyAttr() - { - return keyAttr; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OtherKeyAttribute ::= SEQUENCE {
    -     *     keyAttrId OBJECT IDENTIFIER,
    -     *     keyAttr ANY DEFINED BY keyAttrId OPTIONAL
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(keyAttrId); - v.add(keyAttr); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherRecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherRecipientInfo.java deleted file mode 100644 index f253bad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/OtherRecipientInfo.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class OtherRecipientInfo - extends ASN1Object -{ - private ASN1ObjectIdentifier oriType; - private ASN1Encodable oriValue; - - public OtherRecipientInfo( - ASN1ObjectIdentifier oriType, - ASN1Encodable oriValue) - { - this.oriType = oriType; - this.oriValue = oriValue; - } - - public OtherRecipientInfo( - ASN1Sequence seq) - { - oriType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - oriValue = seq.getObjectAt(1); - } - - /** - * return a OtherRecipientInfo object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static OtherRecipientInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a OtherRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static OtherRecipientInfo getInstance( - Object obj) - { - if (obj == null || obj instanceof OtherRecipientInfo) - { - return (OtherRecipientInfo)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new OtherRecipientInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid OtherRecipientInfo: " + obj.getClass().getName()); - } - - public ASN1ObjectIdentifier getType() - { - return oriType; - } - - public ASN1Encodable getValue() - { - return oriValue; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OtherRecipientInfo ::= SEQUENCE {
    -     *    oriType OBJECT IDENTIFIER,
    -     *    oriValue ANY DEFINED BY oriType }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oriType); - v.add(oriValue); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/PasswordRecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/PasswordRecipientInfo.java deleted file mode 100644 index 1bc3da3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/PasswordRecipientInfo.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class PasswordRecipientInfo - extends ASN1Object -{ - private ASN1Integer version; - private AlgorithmIdentifier keyDerivationAlgorithm; - private AlgorithmIdentifier keyEncryptionAlgorithm; - private ASN1OctetString encryptedKey; - - public PasswordRecipientInfo( - AlgorithmIdentifier keyEncryptionAlgorithm, - ASN1OctetString encryptedKey) - { - this.version = new ASN1Integer(0); - this.keyEncryptionAlgorithm = keyEncryptionAlgorithm; - this.encryptedKey = encryptedKey; - } - - public PasswordRecipientInfo( - AlgorithmIdentifier keyDerivationAlgorithm, - AlgorithmIdentifier keyEncryptionAlgorithm, - ASN1OctetString encryptedKey) - { - this.version = new ASN1Integer(0); - this.keyDerivationAlgorithm = keyDerivationAlgorithm; - this.keyEncryptionAlgorithm = keyEncryptionAlgorithm; - this.encryptedKey = encryptedKey; - } - - public PasswordRecipientInfo( - ASN1Sequence seq) - { - version = (ASN1Integer)seq.getObjectAt(0); - if (seq.getObjectAt(1) instanceof ASN1TaggedObject) - { - keyDerivationAlgorithm = AlgorithmIdentifier.getInstance((ASN1TaggedObject)seq.getObjectAt(1), false); - keyEncryptionAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(2)); - encryptedKey = (ASN1OctetString)seq.getObjectAt(3); - } - else - { - keyEncryptionAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - encryptedKey = (ASN1OctetString)seq.getObjectAt(2); - } - } - - /** - * return a PasswordRecipientInfo object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static PasswordRecipientInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a PasswordRecipientInfo object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static PasswordRecipientInfo getInstance( - Object obj) - { - if (obj == null || obj instanceof PasswordRecipientInfo) - { - return (PasswordRecipientInfo)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new PasswordRecipientInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid PasswordRecipientInfo: " + obj.getClass().getName()); - } - - public ASN1Integer getVersion() - { - return version; - } - - public AlgorithmIdentifier getKeyDerivationAlgorithm() - { - return keyDerivationAlgorithm; - } - - public AlgorithmIdentifier getKeyEncryptionAlgorithm() - { - return keyEncryptionAlgorithm; - } - - public ASN1OctetString getEncryptedKey() - { - return encryptedKey; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * PasswordRecipientInfo ::= SEQUENCE {
    -     *   version CMSVersion,   -- Always set to 0
    -     *   keyDerivationAlgorithm [0] KeyDerivationAlgorithmIdentifier
    -     *                             OPTIONAL,
    -     *  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
    -     *  encryptedKey EncryptedKey }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (keyDerivationAlgorithm != null) - { - v.add(new DERTaggedObject(false, 0, keyDerivationAlgorithm)); - } - v.add(keyEncryptionAlgorithm); - v.add(encryptedKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientEncryptedKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientEncryptedKey.java deleted file mode 100644 index b888a69..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientEncryptedKey.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - - -public class RecipientEncryptedKey - extends ASN1Object -{ - private KeyAgreeRecipientIdentifier identifier; - private ASN1OctetString encryptedKey; - - private RecipientEncryptedKey( - ASN1Sequence seq) - { - identifier = KeyAgreeRecipientIdentifier.getInstance(seq.getObjectAt(0)); - encryptedKey = (ASN1OctetString)seq.getObjectAt(1); - } - - /** - * return an RecipientEncryptedKey object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static RecipientEncryptedKey getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return a RecipientEncryptedKey object from the given object. - * - * @param obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static RecipientEncryptedKey getInstance( - Object obj) - { - if (obj == null || obj instanceof RecipientEncryptedKey) - { - return (RecipientEncryptedKey)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new RecipientEncryptedKey((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid RecipientEncryptedKey: " + obj.getClass().getName()); - } - - public RecipientEncryptedKey( - KeyAgreeRecipientIdentifier id, - ASN1OctetString encryptedKey) - { - this.identifier = id; - this.encryptedKey = encryptedKey; - } - - public KeyAgreeRecipientIdentifier getIdentifier() - { - return identifier; - } - - public ASN1OctetString getEncryptedKey() - { - return encryptedKey; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * RecipientEncryptedKey ::= SEQUENCE {
    -     *     rid KeyAgreeRecipientIdentifier,
    -     *     encryptedKey EncryptedKey
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(identifier); - v.add(encryptedKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientIdentifier.java deleted file mode 100644 index e2a51ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientIdentifier.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class RecipientIdentifier - extends ASN1Object - implements ASN1Choice -{ - private ASN1Encodable id; - - public RecipientIdentifier( - IssuerAndSerialNumber id) - { - this.id = id; - } - - public RecipientIdentifier( - ASN1OctetString id) - { - this.id = new DERTaggedObject(false, 0, id); - } - - public RecipientIdentifier( - ASN1Primitive id) - { - this.id = id; - } - - /** - * return a RecipientIdentifier object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static RecipientIdentifier getInstance( - Object o) - { - if (o == null || o instanceof RecipientIdentifier) - { - return (RecipientIdentifier)o; - } - - if (o instanceof IssuerAndSerialNumber) - { - return new RecipientIdentifier((IssuerAndSerialNumber)o); - } - - if (o instanceof ASN1OctetString) - { - return new RecipientIdentifier((ASN1OctetString)o); - } - - if (o instanceof ASN1Primitive) - { - return new RecipientIdentifier((ASN1Primitive)o); - } - - throw new IllegalArgumentException( - "Illegal object in RecipientIdentifier: " + o.getClass().getName()); - } - - public boolean isTagged() - { - return (id instanceof ASN1TaggedObject); - } - - public ASN1Encodable getId() - { - if (id instanceof ASN1TaggedObject) - { - return ASN1OctetString.getInstance((ASN1TaggedObject)id, false); - } - - return IssuerAndSerialNumber.getInstance(id); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * RecipientIdentifier ::= CHOICE {
    -     *     issuerAndSerialNumber IssuerAndSerialNumber,
    -     *     subjectKeyIdentifier [0] SubjectKeyIdentifier 
    -     * }
    -     *
    -     * SubjectKeyIdentifier ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return id.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientInfo.java deleted file mode 100644 index 11aba6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientInfo.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class RecipientInfo - extends ASN1Object - implements ASN1Choice -{ - ASN1Encodable info; - - public RecipientInfo( - KeyTransRecipientInfo info) - { - this.info = info; - } - - public RecipientInfo( - KeyAgreeRecipientInfo info) - { - this.info = new DERTaggedObject(false, 1, info); - } - - public RecipientInfo( - KEKRecipientInfo info) - { - this.info = new DERTaggedObject(false, 2, info); - } - - public RecipientInfo( - PasswordRecipientInfo info) - { - this.info = new DERTaggedObject(false, 3, info); - } - - public RecipientInfo( - OtherRecipientInfo info) - { - this.info = new DERTaggedObject(false, 4, info); - } - - public RecipientInfo( - ASN1Primitive info) - { - this.info = info; - } - - public static RecipientInfo getInstance( - Object o) - { - if (o == null || o instanceof RecipientInfo) - { - return (RecipientInfo)o; - } - else if (o instanceof ASN1Sequence) - { - return new RecipientInfo((ASN1Sequence)o); - } - else if (o instanceof ASN1TaggedObject) - { - return new RecipientInfo((ASN1TaggedObject)o); - } - - throw new IllegalArgumentException("unknown object in factory: " - + o.getClass().getName()); - } - - public ASN1Integer getVersion() - { - if (info instanceof ASN1TaggedObject) - { - ASN1TaggedObject o = (ASN1TaggedObject)info; - - switch (o.getTagNo()) - { - case 1: - return KeyAgreeRecipientInfo.getInstance(o, false).getVersion(); - case 2: - return getKEKInfo(o).getVersion(); - case 3: - return PasswordRecipientInfo.getInstance(o, false).getVersion(); - case 4: - return new ASN1Integer(0); // no syntax version for OtherRecipientInfo - default: - throw new IllegalStateException("unknown tag"); - } - } - - return KeyTransRecipientInfo.getInstance(info).getVersion(); - } - - public boolean isTagged() - { - return (info instanceof ASN1TaggedObject); - } - - public ASN1Encodable getInfo() - { - if (info instanceof ASN1TaggedObject) - { - ASN1TaggedObject o = (ASN1TaggedObject)info; - - switch (o.getTagNo()) - { - case 1: - return KeyAgreeRecipientInfo.getInstance(o, false); - case 2: - return getKEKInfo(o); - case 3: - return PasswordRecipientInfo.getInstance(o, false); - case 4: - return OtherRecipientInfo.getInstance(o, false); - default: - throw new IllegalStateException("unknown tag"); - } - } - - return KeyTransRecipientInfo.getInstance(info); - } - - private KEKRecipientInfo getKEKInfo(ASN1TaggedObject o) - { - if (o.isExplicit()) - { // compatibilty with erroneous version - return KEKRecipientInfo.getInstance(o, true); - } - else - { - return KEKRecipientInfo.getInstance(o, false); - } - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * RecipientInfo ::= CHOICE {
    -     *     ktri KeyTransRecipientInfo,
    -     *     kari [1] KeyAgreeRecipientInfo,
    -     *     kekri [2] KEKRecipientInfo,
    -     *     pwri [3] PasswordRecipientInfo,
    -     *     ori [4] OtherRecipientInfo }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return info.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientKeyIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientKeyIdentifier.java deleted file mode 100644 index a76c099..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/RecipientKeyIdentifier.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class RecipientKeyIdentifier - extends ASN1Object -{ - private ASN1OctetString subjectKeyIdentifier; - private DERGeneralizedTime date; - private OtherKeyAttribute other; - - public RecipientKeyIdentifier( - ASN1OctetString subjectKeyIdentifier, - DERGeneralizedTime date, - OtherKeyAttribute other) - { - this.subjectKeyIdentifier = subjectKeyIdentifier; - this.date = date; - this.other = other; - } - - public RecipientKeyIdentifier( - byte[] subjectKeyIdentifier, - DERGeneralizedTime date, - OtherKeyAttribute other) - { - this.subjectKeyIdentifier = new DEROctetString(subjectKeyIdentifier); - this.date = date; - this.other = other; - } - - public RecipientKeyIdentifier( - byte[] subjectKeyIdentifier) - { - this(subjectKeyIdentifier, null, null); - } - - public RecipientKeyIdentifier( - ASN1Sequence seq) - { - subjectKeyIdentifier = ASN1OctetString.getInstance( - seq.getObjectAt(0)); - - switch(seq.size()) - { - case 1: - break; - case 2: - if (seq.getObjectAt(1) instanceof DERGeneralizedTime) - { - date = (DERGeneralizedTime)seq.getObjectAt(1); - } - else - { - other = OtherKeyAttribute.getInstance(seq.getObjectAt(2)); - } - break; - case 3: - date = (DERGeneralizedTime)seq.getObjectAt(1); - other = OtherKeyAttribute.getInstance(seq.getObjectAt(2)); - break; - default: - throw new IllegalArgumentException("Invalid RecipientKeyIdentifier"); - } - } - - /** - * return a RecipientKeyIdentifier object from a tagged object. - * - * @param _ato the tagged object holding the object we want. - * @param _explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @exception IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static RecipientKeyIdentifier getInstance(ASN1TaggedObject _ato, boolean _explicit) - { - return getInstance(ASN1Sequence.getInstance(_ato, _explicit)); - } - - /** - * return a RecipientKeyIdentifier object from the given object. - * - * @param _obj the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static RecipientKeyIdentifier getInstance(Object _obj) - { - if(_obj == null || _obj instanceof RecipientKeyIdentifier) - { - return (RecipientKeyIdentifier)_obj; - } - - if(_obj instanceof ASN1Sequence) - { - return new RecipientKeyIdentifier((ASN1Sequence)_obj); - } - - throw new IllegalArgumentException("Invalid RecipientKeyIdentifier: " + _obj.getClass().getName()); - } - - public ASN1OctetString getSubjectKeyIdentifier() - { - return subjectKeyIdentifier; - } - - public DERGeneralizedTime getDate() - { - return date; - } - - public OtherKeyAttribute getOtherKeyAttribute() - { - return other; - } - - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * RecipientKeyIdentifier ::= SEQUENCE {
    -     *     subjectKeyIdentifier SubjectKeyIdentifier,
    -     *     date GeneralizedTime OPTIONAL,
    -     *     other OtherKeyAttribute OPTIONAL 
    -     * }
    -     *
    -     * SubjectKeyIdentifier ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(subjectKeyIdentifier); - - if (date != null) - { - v.add(date); - } - - if (other != null) - { - v.add(other); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedData.java deleted file mode 100644 index beec6b3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedData.java +++ /dev/null @@ -1,302 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERSet; -import org.bc.asn1.BERTaggedObject; -import org.bc.asn1.DERTaggedObject; - -/** - * a signed data object. - */ -public class SignedData - extends ASN1Object -{ - private ASN1Integer version; - private ASN1Set digestAlgorithms; - private ContentInfo contentInfo; - private ASN1Set certificates; - private ASN1Set crls; - private ASN1Set signerInfos; - private boolean certsBer; - private boolean crlsBer; - - public static SignedData getInstance( - Object o) - { - if (o instanceof SignedData) - { - return (SignedData)o; - } - else if (o != null) - { - return new SignedData(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public SignedData( - ASN1Set digestAlgorithms, - ContentInfo contentInfo, - ASN1Set certificates, - ASN1Set crls, - ASN1Set signerInfos) - { - this.version = calculateVersion(contentInfo.getContentType(), certificates, crls, signerInfos); - this.digestAlgorithms = digestAlgorithms; - this.contentInfo = contentInfo; - this.certificates = certificates; - this.crls = crls; - this.signerInfos = signerInfos; - this.crlsBer = crls instanceof BERSet; - this.certsBer = certificates instanceof BERSet; - } - - - // RFC3852, section 5.1: - // IF ((certificates is present) AND - // (any certificates with a type of other are present)) OR - // ((crls is present) AND - // (any crls with a type of other are present)) - // THEN version MUST be 5 - // ELSE - // IF (certificates is present) AND - // (any version 2 attribute certificates are present) - // THEN version MUST be 4 - // ELSE - // IF ((certificates is present) AND - // (any version 1 attribute certificates are present)) OR - // (any SignerInfo structures are version 3) OR - // (encapContentInfo eContentType is other than id-data) - // THEN version MUST be 3 - // ELSE version MUST be 1 - // - private ASN1Integer calculateVersion( - ASN1ObjectIdentifier contentOid, - ASN1Set certs, - ASN1Set crls, - ASN1Set signerInfs) - { - boolean otherCert = false; - boolean otherCrl = false; - boolean attrCertV1Found = false; - boolean attrCertV2Found = false; - - if (certs != null) - { - for (Enumeration en = certs.getObjects(); en.hasMoreElements();) - { - Object obj = en.nextElement(); - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(obj); - - if (tagged.getTagNo() == 1) - { - attrCertV1Found = true; - } - else if (tagged.getTagNo() == 2) - { - attrCertV2Found = true; - } - else if (tagged.getTagNo() == 3) - { - otherCert = true; - } - } - } - } - - if (otherCert) - { - return new ASN1Integer(5); - } - - if (crls != null) // no need to check if otherCert is true - { - for (Enumeration en = crls.getObjects(); en.hasMoreElements();) - { - Object obj = en.nextElement(); - if (obj instanceof ASN1TaggedObject) - { - otherCrl = true; - } - } - } - - if (otherCrl) - { - return new ASN1Integer(5); - } - - if (attrCertV2Found) - { - return new ASN1Integer(4); - } - - if (attrCertV1Found) - { - return new ASN1Integer(3); - } - - if (checkForVersion3(signerInfs)) - { - return new ASN1Integer(3); - } - - if (!CMSObjectIdentifiers.data.equals(contentOid)) - { - return new ASN1Integer(3); - } - - return new ASN1Integer(1); - } - - private boolean checkForVersion3(ASN1Set signerInfs) - { - for (Enumeration e = signerInfs.getObjects(); e.hasMoreElements();) - { - SignerInfo s = SignerInfo.getInstance(e.nextElement()); - - if (s.getVersion().getValue().intValue() == 3) - { - return true; - } - } - - return false; - } - - private SignedData( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - version = ASN1Integer.getInstance(e.nextElement()); - digestAlgorithms = ((ASN1Set)e.nextElement()); - contentInfo = ContentInfo.getInstance(e.nextElement()); - - while (e.hasMoreElements()) - { - ASN1Primitive o = (ASN1Primitive)e.nextElement(); - - // - // an interesting feature of SignedData is that there appear - // to be varying implementations... - // for the moment we ignore anything which doesn't fit. - // - if (o instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagged = (ASN1TaggedObject)o; - - switch (tagged.getTagNo()) - { - case 0: - certsBer = tagged instanceof BERTaggedObject; - certificates = ASN1Set.getInstance(tagged, false); - break; - case 1: - crlsBer = tagged instanceof BERTaggedObject; - crls = ASN1Set.getInstance(tagged, false); - break; - default: - throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo()); - } - } - else - { - signerInfos = (ASN1Set)o; - } - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public ASN1Set getDigestAlgorithms() - { - return digestAlgorithms; - } - - public ContentInfo getEncapContentInfo() - { - return contentInfo; - } - - public ASN1Set getCertificates() - { - return certificates; - } - - public ASN1Set getCRLs() - { - return crls; - } - - public ASN1Set getSignerInfos() - { - return signerInfos; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * SignedData ::= SEQUENCE {
    -     *     version CMSVersion,
    -     *     digestAlgorithms DigestAlgorithmIdentifiers,
    -     *     encapContentInfo EncapsulatedContentInfo,
    -     *     certificates [0] IMPLICIT CertificateSet OPTIONAL,
    -     *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
    -     *     signerInfos SignerInfos
    -     *   }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(digestAlgorithms); - v.add(contentInfo); - - if (certificates != null) - { - if (certsBer) - { - v.add(new BERTaggedObject(false, 0, certificates)); - } - else - { - v.add(new DERTaggedObject(false, 0, certificates)); - } - } - - if (crls != null) - { - if (crlsBer) - { - v.add(new BERTaggedObject(false, 1, crls)); - } - else - { - v.add(new DERTaggedObject(false, 1, crls)); - } - } - - v.add(signerInfos); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedDataParser.java deleted file mode 100644 index 426a6d0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignedDataParser.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1SetParser; -import org.bc.asn1.ASN1TaggedObjectParser; -import org.bc.asn1.BERTags; - -/** - *
    - * SignedData ::= SEQUENCE {
    - *     version CMSVersion,
    - *     digestAlgorithms DigestAlgorithmIdentifiers,
    - *     encapContentInfo EncapsulatedContentInfo,
    - *     certificates [0] IMPLICIT CertificateSet OPTIONAL,
    - *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
    - *     signerInfos SignerInfos
    - *   }
    - * 
    - */ -public class SignedDataParser -{ - private ASN1SequenceParser _seq; - private ASN1Integer _version; - private Object _nextObject; - private boolean _certsCalled; - private boolean _crlsCalled; - - public static SignedDataParser getInstance( - Object o) - throws IOException - { - if (o instanceof ASN1Sequence) - { - return new SignedDataParser(((ASN1Sequence)o).parser()); - } - if (o instanceof ASN1SequenceParser) - { - return new SignedDataParser((ASN1SequenceParser)o); - } - - throw new IOException("unknown object encountered: " + o.getClass().getName()); - } - - private SignedDataParser( - ASN1SequenceParser seq) - throws IOException - { - this._seq = seq; - this._version = (ASN1Integer)seq.readObject(); - } - - public ASN1Integer getVersion() - { - return _version; - } - - public ASN1SetParser getDigestAlgorithms() - throws IOException - { - Object o = _seq.readObject(); - - if (o instanceof ASN1Set) - { - return ((ASN1Set)o).parser(); - } - - return (ASN1SetParser)o; - } - - public ContentInfoParser getEncapContentInfo() - throws IOException - { - return new ContentInfoParser((ASN1SequenceParser)_seq.readObject()); - } - - public ASN1SetParser getCertificates() - throws IOException - { - _certsCalled = true; - _nextObject = _seq.readObject(); - - if (_nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)_nextObject).getTagNo() == 0) - { - ASN1SetParser certs = (ASN1SetParser)((ASN1TaggedObjectParser)_nextObject).getObjectParser(BERTags.SET, false); - _nextObject = null; - - return certs; - } - - return null; - } - - public ASN1SetParser getCrls() - throws IOException - { - if (!_certsCalled) - { - throw new IOException("getCerts() has not been called."); - } - - _crlsCalled = true; - - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - if (_nextObject instanceof ASN1TaggedObjectParser && ((ASN1TaggedObjectParser)_nextObject).getTagNo() == 1) - { - ASN1SetParser crls = (ASN1SetParser)((ASN1TaggedObjectParser)_nextObject).getObjectParser(BERTags.SET, false); - _nextObject = null; - - return crls; - } - - return null; - } - - public ASN1SetParser getSignerInfos() - throws IOException - { - if (!_certsCalled || !_crlsCalled) - { - throw new IOException("getCerts() and/or getCrls() has not been called."); - } - - if (_nextObject == null) - { - _nextObject = _seq.readObject(); - } - - return (ASN1SetParser)_nextObject; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerIdentifier.java deleted file mode 100644 index 6ef574d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerIdentifier.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class SignerIdentifier - extends ASN1Object - implements ASN1Choice -{ - private ASN1Encodable id; - - public SignerIdentifier( - IssuerAndSerialNumber id) - { - this.id = id; - } - - public SignerIdentifier( - ASN1OctetString id) - { - this.id = new DERTaggedObject(false, 0, id); - } - - public SignerIdentifier( - ASN1Primitive id) - { - this.id = id; - } - - /** - * return a SignerIdentifier object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static SignerIdentifier getInstance( - Object o) - { - if (o == null || o instanceof SignerIdentifier) - { - return (SignerIdentifier)o; - } - - if (o instanceof IssuerAndSerialNumber) - { - return new SignerIdentifier((IssuerAndSerialNumber)o); - } - - if (o instanceof ASN1OctetString) - { - return new SignerIdentifier((ASN1OctetString)o); - } - - if (o instanceof ASN1Primitive) - { - return new SignerIdentifier((ASN1Primitive)o); - } - - throw new IllegalArgumentException( - "Illegal object in SignerIdentifier: " + o.getClass().getName()); - } - - public boolean isTagged() - { - return (id instanceof ASN1TaggedObject); - } - - public ASN1Encodable getId() - { - if (id instanceof ASN1TaggedObject) - { - return ASN1OctetString.getInstance((ASN1TaggedObject)id, false); - } - - return id; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * SignerIdentifier ::= CHOICE {
    -     *     issuerAndSerialNumber IssuerAndSerialNumber,
    -     *     subjectKeyIdentifier [0] SubjectKeyIdentifier 
    -     * }
    -     *
    -     * SubjectKeyIdentifier ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return id.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerInfo.java deleted file mode 100644 index 5a874a8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/SignerInfo.java +++ /dev/null @@ -1,183 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class SignerInfo - extends ASN1Object -{ - private ASN1Integer version; - private SignerIdentifier sid; - private AlgorithmIdentifier digAlgorithm; - private ASN1Set authenticatedAttributes; - private AlgorithmIdentifier digEncryptionAlgorithm; - private ASN1OctetString encryptedDigest; - private ASN1Set unauthenticatedAttributes; - - public static SignerInfo getInstance( - Object o) - throws IllegalArgumentException - { - if (o == null || o instanceof SignerInfo) - { - return (SignerInfo)o; - } - else if (o instanceof ASN1Sequence) - { - return new SignerInfo((ASN1Sequence)o); - } - - throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); - } - - public SignerInfo( - SignerIdentifier sid, - AlgorithmIdentifier digAlgorithm, - ASN1Set authenticatedAttributes, - AlgorithmIdentifier digEncryptionAlgorithm, - ASN1OctetString encryptedDigest, - ASN1Set unauthenticatedAttributes) - { - if (sid.isTagged()) - { - this.version = new ASN1Integer(3); - } - else - { - this.version = new ASN1Integer(1); - } - - this.sid = sid; - this.digAlgorithm = digAlgorithm; - this.authenticatedAttributes = authenticatedAttributes; - this.digEncryptionAlgorithm = digEncryptionAlgorithm; - this.encryptedDigest = encryptedDigest; - this.unauthenticatedAttributes = unauthenticatedAttributes; - } - - public SignerInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - version = (ASN1Integer)e.nextElement(); - sid = SignerIdentifier.getInstance(e.nextElement()); - digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); - - Object obj = e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false); - - digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); - } - else - { - authenticatedAttributes = null; - digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj); - } - - encryptedDigest = DEROctetString.getInstance(e.nextElement()); - - if (e.hasMoreElements()) - { - unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false); - } - else - { - unauthenticatedAttributes = null; - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public SignerIdentifier getSID() - { - return sid; - } - - public ASN1Set getAuthenticatedAttributes() - { - return authenticatedAttributes; - } - - public AlgorithmIdentifier getDigestAlgorithm() - { - return digAlgorithm; - } - - public ASN1OctetString getEncryptedDigest() - { - return encryptedDigest; - } - - public AlgorithmIdentifier getDigestEncryptionAlgorithm() - { - return digEncryptionAlgorithm; - } - - public ASN1Set getUnauthenticatedAttributes() - { - return unauthenticatedAttributes; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  SignerInfo ::= SEQUENCE {
    -     *      version Version,
    -     *      SignerIdentifier sid,
    -     *      digestAlgorithm DigestAlgorithmIdentifier,
    -     *      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
    -     *      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
    -     *      encryptedDigest EncryptedDigest,
    -     *      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
    -     *  }
    -     *
    -     *  EncryptedDigest ::= OCTET STRING
    -     *
    -     *  DigestAlgorithmIdentifier ::= AlgorithmIdentifier
    -     *
    -     *  DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(sid); - v.add(digAlgorithm); - - if (authenticatedAttributes != null) - { - v.add(new DERTaggedObject(false, 0, authenticatedAttributes)); - } - - v.add(digEncryptionAlgorithm); - v.add(encryptedDigest); - - if (unauthenticatedAttributes != null) - { - v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Time.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Time.java deleted file mode 100644 index bff2b51..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/Time.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.asn1.cms; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.SimpleTimeZone; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERUTCTime; - -public class Time - extends ASN1Object - implements ASN1Choice -{ - ASN1Primitive time; - - public static Time getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); - } - - public Time( - ASN1Primitive time) - { - if (!(time instanceof DERUTCTime) - && !(time instanceof DERGeneralizedTime)) - { - throw new IllegalArgumentException("unknown object passed to Time"); - } - - this.time = time; - } - - /** - * creates a time object from a given date - if the date is between 1950 - * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime - * is used. - */ - public Time( - Date date) - { - SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); - SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); - - dateF.setTimeZone(tz); - - String d = dateF.format(date) + "Z"; - int year = Integer.parseInt(d.substring(0, 4)); - - if (year < 1950 || year > 2049) - { - time = new DERGeneralizedTime(d); - } - else - { - time = new DERUTCTime(d.substring(2)); - } - } - - public static Time getInstance( - Object obj) - { - if (obj == null || obj instanceof Time) - { - return (Time)obj; - } - else if (obj instanceof DERUTCTime) - { - return new Time((DERUTCTime)obj); - } - else if (obj instanceof DERGeneralizedTime) - { - return new Time((DERGeneralizedTime)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public String getTime() - { - if (time instanceof DERUTCTime) - { - return ((DERUTCTime)time).getAdjustedTime(); - } - else - { - return ((DERGeneralizedTime)time).getTime(); - } - } - - public Date getDate() - { - try - { - if (time instanceof DERUTCTime) - { - return ((DERUTCTime)time).getAdjustedDate(); - } - else - { - return ((DERGeneralizedTime)time).getDate(); - } - } - catch (ParseException e) - { // this should never happen - throw new IllegalStateException("invalid date string: " + e.getMessage()); - } - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Time ::= CHOICE {
    -     *             utcTime        UTCTime,
    -     *             generalTime    GeneralizedTime }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return time; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampAndCRL.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampAndCRL.java deleted file mode 100644 index c4beb63..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampAndCRL.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.CertificateList; - -public class TimeStampAndCRL - extends ASN1Object -{ - private ContentInfo timeStamp; - private CertificateList crl; - - public TimeStampAndCRL(ContentInfo timeStamp) - { - this.timeStamp = timeStamp; - } - - private TimeStampAndCRL(ASN1Sequence seq) - { - this.timeStamp = ContentInfo.getInstance(seq.getObjectAt(0)); - if (seq.size() == 2) - { - this.crl = CertificateList.getInstance(seq.getObjectAt(1)); - } - } - - public static TimeStampAndCRL getInstance(Object obj) - { - if (obj instanceof TimeStampAndCRL) - { - return (TimeStampAndCRL)obj; - } - else if (obj != null) - { - return new TimeStampAndCRL(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ContentInfo getTimeStampToken() - { - return this.timeStamp; - } - - /** @deprecated use getCRL() */ - public CertificateList getCertificateList() - { - return this.crl; - } - - public CertificateList getCRL() - { - return this.crl; - } - - /** - *
    -     * TimeStampAndCRL ::= SEQUENCE {
    -     *     timeStamp   TimeStampToken,          -- according to RFC 3161
    -     *     crl         CertificateList OPTIONAL -- according to RFC 5280
    -     *  }
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(timeStamp); - - if (crl != null) - { - v.add(crl); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampTokenEvidence.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampTokenEvidence.java deleted file mode 100644 index 9e6eb6b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampTokenEvidence.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.asn1.cms; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class TimeStampTokenEvidence - extends ASN1Object -{ - private TimeStampAndCRL[] timeStampAndCRLs; - - public TimeStampTokenEvidence(TimeStampAndCRL[] timeStampAndCRLs) - { - this.timeStampAndCRLs = timeStampAndCRLs; - } - - public TimeStampTokenEvidence(TimeStampAndCRL timeStampAndCRL) - { - this.timeStampAndCRLs = new TimeStampAndCRL[1]; - - timeStampAndCRLs[0] = timeStampAndCRL; - } - - private TimeStampTokenEvidence(ASN1Sequence seq) - { - this.timeStampAndCRLs = new TimeStampAndCRL[seq.size()]; - - int count = 0; - - for (Enumeration en = seq.getObjects(); en.hasMoreElements();) - { - timeStampAndCRLs[count++] = TimeStampAndCRL.getInstance(en.nextElement()); - } - } - - public static TimeStampTokenEvidence getInstance(ASN1TaggedObject tagged, boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(tagged, explicit)); - } - - public static TimeStampTokenEvidence getInstance(Object obj) - { - if (obj instanceof TimeStampTokenEvidence) - { - return (TimeStampTokenEvidence)obj; - } - else if (obj != null) - { - return new TimeStampTokenEvidence(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public TimeStampAndCRL[] toTimeStampAndCRLArray() - { - return timeStampAndCRLs; - } - - /** - *
    -     * TimeStampTokenEvidence ::=
    -     *    SEQUENCE SIZE(1..MAX) OF TimeStampAndCRL
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != timeStampAndCRLs.length; i++) - { - v.add(timeStampAndCRLs[i]); - } - - return new DERSequence(v); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedData.java deleted file mode 100644 index a2daa1b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedData.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.cms; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERIA5String; - -public class TimeStampedData - extends ASN1Object -{ - private ASN1Integer version; - private DERIA5String dataUri; - private MetaData metaData; - private ASN1OctetString content; - private Evidence temporalEvidence; - - public TimeStampedData(DERIA5String dataUri, MetaData metaData, ASN1OctetString content, Evidence temporalEvidence) - { - this.version = new ASN1Integer(1); - this.dataUri = dataUri; - this.metaData = metaData; - this.content = content; - this.temporalEvidence = temporalEvidence; - } - - private TimeStampedData(ASN1Sequence seq) - { - this.version = ASN1Integer.getInstance(seq.getObjectAt(0)); - - int index = 1; - if (seq.getObjectAt(index) instanceof DERIA5String) - { - this.dataUri = DERIA5String.getInstance(seq.getObjectAt(index++)); - } - if (seq.getObjectAt(index) instanceof MetaData || seq.getObjectAt(index) instanceof ASN1Sequence) - { - this.metaData = MetaData.getInstance(seq.getObjectAt(index++)); - } - if (seq.getObjectAt(index) instanceof ASN1OctetString) - { - this.content = ASN1OctetString.getInstance(seq.getObjectAt(index++)); - } - this.temporalEvidence = Evidence.getInstance(seq.getObjectAt(index)); - } - - public static TimeStampedData getInstance(Object obj) - { - if (obj instanceof TimeStampedData) - { - return (TimeStampedData)obj; - } - else if (obj != null) - { - return new TimeStampedData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DERIA5String getDataUri() - { - return dataUri; - } - - public MetaData getMetaData() - { - return metaData; - } - - public ASN1OctetString getContent() - { - return content; - } - - public Evidence getTemporalEvidence() - { - return temporalEvidence; - } - - /** - *
    -     * TimeStampedData ::= SEQUENCE {
    -     *   version              INTEGER { v1(1) },
    -     *   dataUri              IA5String OPTIONAL,
    -     *   metaData             MetaData OPTIONAL,
    -     *   content              OCTET STRING OPTIONAL,
    -     *   temporalEvidence     Evidence
    -     * }
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (dataUri != null) - { - v.add(dataUri); - } - - if (metaData != null) - { - v.add(metaData); - } - - if (content != null) - { - v.add(content); - } - - v.add(temporalEvidence); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedDataParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedDataParser.java deleted file mode 100644 index dfffc9c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/TimeStampedDataParser.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bc.asn1.cms; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1OctetStringParser; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERIA5String; - -public class TimeStampedDataParser -{ - private ASN1Integer version; - private DERIA5String dataUri; - private MetaData metaData; - private ASN1OctetStringParser content; - private Evidence temporalEvidence; - private ASN1SequenceParser parser; - - private TimeStampedDataParser(ASN1SequenceParser parser) - throws IOException - { - this.parser = parser; - this.version = ASN1Integer.getInstance(parser.readObject()); - - ASN1Encodable obj = parser.readObject(); - - if (obj instanceof DERIA5String) - { - this.dataUri = DERIA5String.getInstance(obj); - obj = parser.readObject(); - } - if (obj instanceof MetaData || obj instanceof ASN1SequenceParser) - { - this.metaData = MetaData.getInstance(obj.toASN1Primitive()); - obj = parser.readObject(); - } - if (obj instanceof ASN1OctetStringParser) - { - this.content = (ASN1OctetStringParser)obj; - } - } - - public static TimeStampedDataParser getInstance(Object obj) - throws IOException - { - if (obj instanceof ASN1Sequence) - { - return new TimeStampedDataParser(((ASN1Sequence)obj).parser()); - } - if (obj instanceof ASN1SequenceParser) - { - return new TimeStampedDataParser((ASN1SequenceParser)obj); - } - - return null; - } - - public DERIA5String getDataUri() - { - return dataUri; - } - - public MetaData getMetaData() - { - return metaData; - } - - public ASN1OctetStringParser getContent() - { - return content; - } - - public Evidence getTemporalEvidence() - throws IOException - { - if (temporalEvidence == null) - { - temporalEvidence = Evidence.getInstance(parser.readObject().toASN1Primitive()); - } - - return temporalEvidence; - } - - /** - *
    -     * TimeStampedData ::= SEQUENCE {
    -     *   version              INTEGER { v1(1) },
    -     *   dataUri              IA5String OPTIONAL,
    -     *   metaData             MetaData OPTIONAL,
    -     *   content              OCTET STRING OPTIONAL,
    -     *   temporalEvidence     Evidence
    -     * }
    -     * 
    - * @return - * @deprecated will be removed - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - - if (dataUri != null) - { - v.add(dataUri); - } - - if (metaData != null) - { - v.add(metaData); - } - - if (content != null) - { - v.add(content); - } - - v.add(temporalEvidence); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ecc/MQVuserKeyingMaterial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ecc/MQVuserKeyingMaterial.java deleted file mode 100644 index 6df4d41..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cms/ecc/MQVuserKeyingMaterial.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.asn1.cms.ecc; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.cms.OriginatorPublicKey; - -public class MQVuserKeyingMaterial - extends ASN1Object -{ - private OriginatorPublicKey ephemeralPublicKey; - private ASN1OctetString addedukm; - - public MQVuserKeyingMaterial( - OriginatorPublicKey ephemeralPublicKey, - ASN1OctetString addedukm) - { - // TODO Check ephemeralPublicKey not null - - this.ephemeralPublicKey = ephemeralPublicKey; - this.addedukm = addedukm; - } - - private MQVuserKeyingMaterial( - ASN1Sequence seq) - { - // TODO Check seq has either 1 or 2 elements - - this.ephemeralPublicKey = OriginatorPublicKey.getInstance( - seq.getObjectAt(0)); - - if (seq.size() > 1) - { - this.addedukm = ASN1OctetString.getInstance( - (ASN1TaggedObject)seq.getObjectAt(1), true); - } - } - - /** - * return an MQVuserKeyingMaterial object from a tagged object. - * - * @param obj the tagged object holding the object we want. - * @param explicit true if the object is meant to be explicitly - * tagged false otherwise. - * @throws IllegalArgumentException if the object held by the - * tagged object cannot be converted. - */ - public static MQVuserKeyingMaterial getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * return an MQVuserKeyingMaterial object from the given object. - * - * @param obj the object we want converted. - * @throws IllegalArgumentException if the object cannot be converted. - */ - public static MQVuserKeyingMaterial getInstance( - Object obj) - { - if (obj == null || obj instanceof MQVuserKeyingMaterial) - { - return (MQVuserKeyingMaterial)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new MQVuserKeyingMaterial((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid MQVuserKeyingMaterial: " + obj.getClass().getName()); - } - - public OriginatorPublicKey getEphemeralPublicKey() - { - return ephemeralPublicKey; - } - - public ASN1OctetString getAddedukm() - { - return addedukm; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * MQVuserKeyingMaterial ::= SEQUENCE {
    -     *   ephemeralPublicKey OriginatorPublicKey,
    -     *   addedukm [0] EXPLICIT UserKeyingMaterial OPTIONAL  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(ephemeralPublicKey); - - if (addedukm != null) - { - v.add(new DERTaggedObject(true, 0, addedukm)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/AttributeTypeAndValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/AttributeTypeAndValue.java deleted file mode 100644 index a69e6c4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/AttributeTypeAndValue.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class AttributeTypeAndValue - extends ASN1Object -{ - private ASN1ObjectIdentifier type; - private ASN1Encodable value; - - private AttributeTypeAndValue(ASN1Sequence seq) - { - type = (ASN1ObjectIdentifier)seq.getObjectAt(0); - value = (ASN1Encodable)seq.getObjectAt(1); - } - - public static AttributeTypeAndValue getInstance(Object o) - { - if (o instanceof AttributeTypeAndValue) - { - return (AttributeTypeAndValue)o; - } - - if (o != null) - { - return new AttributeTypeAndValue(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public AttributeTypeAndValue( - String oid, - ASN1Encodable value) - { - this(new ASN1ObjectIdentifier(oid), value); - } - - public AttributeTypeAndValue( - ASN1ObjectIdentifier type, - ASN1Encodable value) - { - this.type = type; - this.value = value; - } - - public ASN1ObjectIdentifier getType() - { - return type; - } - - public ASN1Encodable getValue() - { - return value; - } - - /** - *
    -     * AttributeTypeAndValue ::= SEQUENCE {
    -     *           type         OBJECT IDENTIFIER,
    -     *           value        ANY DEFINED BY type }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(type); - v.add(value); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CRMFObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CRMFObjectIdentifiers.java deleted file mode 100644 index 38231ea..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CRMFObjectIdentifiers.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface CRMFObjectIdentifiers -{ - static final ASN1ObjectIdentifier id_pkix = new ASN1ObjectIdentifier("1.3.6.1.5.5.7"); - - // arc for Internet X.509 PKI protocols and their components - - static final ASN1ObjectIdentifier id_pkip = id_pkix.branch("5"); - - static final ASN1ObjectIdentifier id_regCtrl = id_pkip.branch("1"); - static final ASN1ObjectIdentifier id_regCtrl_regToken = id_regCtrl.branch("1"); - static final ASN1ObjectIdentifier id_regCtrl_authenticator = id_regCtrl.branch("2"); - static final ASN1ObjectIdentifier id_regCtrl_pkiPublicationInfo = id_regCtrl.branch("3"); - static final ASN1ObjectIdentifier id_regCtrl_pkiArchiveOptions = id_regCtrl.branch("4"); - - static final ASN1ObjectIdentifier id_ct_encKeyWithID = new ASN1ObjectIdentifier(PKCSObjectIdentifiers.id_ct + ".21"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertId.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertId.java deleted file mode 100644 index 7de065c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertId.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.asn1.crmf; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.GeneralName; - -public class CertId - extends ASN1Object -{ - private GeneralName issuer; - private ASN1Integer serialNumber; - - private CertId(ASN1Sequence seq) - { - issuer = GeneralName.getInstance(seq.getObjectAt(0)); - serialNumber = ASN1Integer.getInstance(seq.getObjectAt(1)); - } - - public static CertId getInstance(Object o) - { - if (o instanceof CertId) - { - return (CertId)o; - } - - if (o != null) - { - return new CertId(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public static CertId getInstance(ASN1TaggedObject obj, boolean isExplicit) - { - return getInstance(ASN1Sequence.getInstance(obj, isExplicit)); - } - - public CertId(GeneralName issuer, BigInteger serialNumber) - { - this(issuer, new ASN1Integer(serialNumber)); - } - - public CertId(GeneralName issuer, ASN1Integer serialNumber) - { - this.issuer = issuer; - this.serialNumber = serialNumber; - } - - public GeneralName getIssuer() - { - return issuer; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - /** - *
    -     * CertId ::= SEQUENCE {
    -     *                 issuer           GeneralName,
    -     *                 serialNumber     INTEGER }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(issuer); - v.add(serialNumber); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMessages.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMessages.java deleted file mode 100644 index 5bb19c0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMessages.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class CertReqMessages - extends ASN1Object -{ - private ASN1Sequence content; - - private CertReqMessages(ASN1Sequence seq) - { - content = seq; - } - - public static CertReqMessages getInstance(Object o) - { - if (o instanceof CertReqMessages) - { - return (CertReqMessages)o; - } - - if (o != null) - { - return new CertReqMessages(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertReqMessages( - CertReqMsg msg) - { - content = new DERSequence(msg); - } - - public CertReqMessages( - CertReqMsg[] msgs) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < msgs.length; i++) { - v.add(msgs[i]); - } - content = new DERSequence(v); - } - - public CertReqMsg[] toCertReqMsgArray() - { - CertReqMsg[] result = new CertReqMsg[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = CertReqMsg.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * CertReqMessages ::= SEQUENCE SIZE (1..MAX) OF CertReqMsg
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMsg.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMsg.java deleted file mode 100644 index 5a34a76..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertReqMsg.java +++ /dev/null @@ -1,145 +0,0 @@ -package org.bc.asn1.crmf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class CertReqMsg - extends ASN1Object -{ - private CertRequest certReq; - private ProofOfPossession pop; - private ASN1Sequence regInfo; - - private CertReqMsg(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - certReq = CertRequest.getInstance(en.nextElement()); - while (en.hasMoreElements()) - { - Object o = en.nextElement(); - - if (o instanceof ASN1TaggedObject || o instanceof ProofOfPossession) - { - pop = ProofOfPossession.getInstance(o); - } - else - { - regInfo = ASN1Sequence.getInstance(o); - } - } - } - - public static CertReqMsg getInstance(Object o) - { - if (o instanceof CertReqMsg) - { - return (CertReqMsg)o; - } - else if (o != null) - { - return new CertReqMsg(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * Creates a new CertReqMsg. - * @param certReq CertRequest - * @param pop may be null - * @param regInfo may be null - */ - public CertReqMsg( - CertRequest certReq, - ProofOfPossession pop, - AttributeTypeAndValue[] regInfo) - { - if (certReq == null) - { - throw new IllegalArgumentException("'certReq' cannot be null"); - } - - this.certReq = certReq; - this.pop = pop; - - if (regInfo != null) - { - this.regInfo = new DERSequence(regInfo); - } - } - - public CertRequest getCertReq() - { - return certReq; - } - - - /** - * @deprecated use getPopo - */ - public ProofOfPossession getPop() - { - return pop; - } - - - public ProofOfPossession getPopo() - { - return pop; - } - - public AttributeTypeAndValue[] getRegInfo() - { - if (regInfo == null) - { - return null; - } - - AttributeTypeAndValue[] results = new AttributeTypeAndValue[regInfo.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = AttributeTypeAndValue.getInstance(regInfo.getObjectAt(i)); - } - - return results; - } - - /** - *
    -     * CertReqMsg ::= SEQUENCE {
    -     *                    certReq   CertRequest,
    -     *                    popo       ProofOfPossession  OPTIONAL,
    -     *                    -- content depends upon key type
    -     *                    regInfo   SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue OPTIONAL }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certReq); - - addOptional(v, pop); - addOptional(v, regInfo); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, ASN1Encodable obj) - { - if (obj != null) - { - v.add(obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertRequest.java deleted file mode 100644 index dfc7087..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertRequest.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class CertRequest - extends ASN1Object -{ - private ASN1Integer certReqId; - private CertTemplate certTemplate; - private Controls controls; - - private CertRequest(ASN1Sequence seq) - { - certReqId = new ASN1Integer(ASN1Integer.getInstance(seq.getObjectAt(0)).getValue()); - certTemplate = CertTemplate.getInstance(seq.getObjectAt(1)); - if (seq.size() > 2) - { - controls = Controls.getInstance(seq.getObjectAt(2)); - } - } - - public static CertRequest getInstance(Object o) - { - if (o instanceof CertRequest) - { - return (CertRequest)o; - } - else if (o != null) - { - return new CertRequest(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertRequest( - int certReqId, - CertTemplate certTemplate, - Controls controls) - { - this(new ASN1Integer(certReqId), certTemplate, controls); - } - - public CertRequest( - ASN1Integer certReqId, - CertTemplate certTemplate, - Controls controls) - { - this.certReqId = certReqId; - this.certTemplate = certTemplate; - this.controls = controls; - } - - public ASN1Integer getCertReqId() - { - return certReqId; - } - - public CertTemplate getCertTemplate() - { - return certTemplate; - } - - public Controls getControls() - { - return controls; - } - - /** - *
    -     * CertRequest ::= SEQUENCE {
    -     *                      certReqId     INTEGER,          -- ID for matching request and reply
    -     *                      certTemplate  CertTemplate,  -- Selected fields of cert to be issued
    -     *                      controls      Controls OPTIONAL }   -- Attributes affecting issuance
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certReqId); - v.add(certTemplate); - - if (controls != null) - { - v.add(controls); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplate.java deleted file mode 100644 index 0341c14..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplate.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.bc.asn1.crmf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.SubjectPublicKeyInfo; - -public class CertTemplate - extends ASN1Object -{ - private ASN1Sequence seq; - - private ASN1Integer version; - private ASN1Integer serialNumber; - private AlgorithmIdentifier signingAlg; - private X500Name issuer; - private OptionalValidity validity; - private X500Name subject; - private SubjectPublicKeyInfo publicKey; - private DERBitString issuerUID; - private DERBitString subjectUID; - private Extensions extensions; - - private CertTemplate(ASN1Sequence seq) - { - this.seq = seq; - - Enumeration en = seq.getObjects(); - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement(); - - switch (tObj.getTagNo()) - { - case 0: - version = ASN1Integer.getInstance(tObj, false); - break; - case 1: - serialNumber = ASN1Integer.getInstance(tObj, false); - break; - case 2: - signingAlg = AlgorithmIdentifier.getInstance(tObj, false); - break; - case 3: - issuer = X500Name.getInstance(tObj, true); // CHOICE - break; - case 4: - validity = OptionalValidity.getInstance(ASN1Sequence.getInstance(tObj, false)); - break; - case 5: - subject = X500Name.getInstance(tObj, true); // CHOICE - break; - case 6: - publicKey = SubjectPublicKeyInfo.getInstance(tObj, false); - break; - case 7: - issuerUID = DERBitString.getInstance(tObj, false); - break; - case 8: - subjectUID = DERBitString.getInstance(tObj, false); - break; - case 9: - extensions = Extensions.getInstance(tObj, false); - break; - default: - throw new IllegalArgumentException("unknown tag: " + tObj.getTagNo()); - } - } - } - - public static CertTemplate getInstance(Object o) - { - if (o instanceof CertTemplate) - { - return (CertTemplate)o; - } - else if (o != null) - { - return new CertTemplate(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public int getVersion() - { - return version.getValue().intValue(); - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public AlgorithmIdentifier getSigningAlg() - { - return signingAlg; - } - - public X500Name getIssuer() - { - return issuer; - } - - public OptionalValidity getValidity() - { - return validity; - } - - public X500Name getSubject() - { - return subject; - } - - public SubjectPublicKeyInfo getPublicKey() - { - return publicKey; - } - - public DERBitString getIssuerUID() - { - return issuerUID; - } - - public DERBitString getSubjectUID() - { - return subjectUID; - } - - public Extensions getExtensions() - { - return extensions; - } - - /** - *
    -     *  CertTemplate ::= SEQUENCE {
    -     *      version      [0] Version               OPTIONAL,
    -     *      serialNumber [1] INTEGER               OPTIONAL,
    -     *      signingAlg   [2] AlgorithmIdentifier   OPTIONAL,
    -     *      issuer       [3] Name                  OPTIONAL,
    -     *      validity     [4] OptionalValidity      OPTIONAL,
    -     *      subject      [5] Name                  OPTIONAL,
    -     *      publicKey    [6] SubjectPublicKeyInfo  OPTIONAL,
    -     *      issuerUID    [7] UniqueIdentifier      OPTIONAL,
    -     *      subjectUID   [8] UniqueIdentifier      OPTIONAL,
    -     *      extensions   [9] Extensions            OPTIONAL }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplateBuilder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplateBuilder.java deleted file mode 100644 index cb22e94..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/CertTemplateBuilder.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.asn1.x509.X509Extensions; - -public class CertTemplateBuilder -{ - private ASN1Integer version; - private ASN1Integer serialNumber; - private AlgorithmIdentifier signingAlg; - private X500Name issuer; - private OptionalValidity validity; - private X500Name subject; - private SubjectPublicKeyInfo publicKey; - private DERBitString issuerUID; - private DERBitString subjectUID; - private Extensions extensions; - - /** Sets the X.509 version. Note: for X509v3, use 2 here. */ - public CertTemplateBuilder setVersion(int ver) - { - version = new ASN1Integer(ver); - - return this; - } - - public CertTemplateBuilder setSerialNumber(ASN1Integer ser) - { - serialNumber = ser; - - return this; - } - - public CertTemplateBuilder setSigningAlg(AlgorithmIdentifier aid) - { - signingAlg = aid; - - return this; - } - - public CertTemplateBuilder setIssuer(X500Name name) - { - issuer = name; - - return this; - } - - public CertTemplateBuilder setValidity(OptionalValidity v) - { - validity = v; - - return this; - } - - public CertTemplateBuilder setSubject(X500Name name) - { - subject = name; - - return this; - } - - public CertTemplateBuilder setPublicKey(SubjectPublicKeyInfo spki) - { - publicKey = spki; - - return this; - } - - /** Sets the issuer unique ID (deprecated in X.509v3) */ - public CertTemplateBuilder setIssuerUID(DERBitString uid) - { - issuerUID = uid; - - return this; - } - - /** Sets the subject unique ID (deprecated in X.509v3) */ - public CertTemplateBuilder setSubjectUID(DERBitString uid) - { - subjectUID = uid; - - return this; - } - - /** - * @deprecated use method taking Extensions - * @param extens - * @return - */ - public CertTemplateBuilder setExtensions(X509Extensions extens) - { - return setExtensions(Extensions.getInstance(extens)); - } - - public CertTemplateBuilder setExtensions(Extensions extens) - { - extensions = extens; - - return this; - } - - /** - *
    -     *  CertTemplate ::= SEQUENCE {
    -     *      version      [0] Version               OPTIONAL,
    -     *      serialNumber [1] INTEGER               OPTIONAL,
    -     *      signingAlg   [2] AlgorithmIdentifier   OPTIONAL,
    -     *      issuer       [3] Name                  OPTIONAL,
    -     *      validity     [4] OptionalValidity      OPTIONAL,
    -     *      subject      [5] Name                  OPTIONAL,
    -     *      publicKey    [6] SubjectPublicKeyInfo  OPTIONAL,
    -     *      issuerUID    [7] UniqueIdentifier      OPTIONAL,
    -     *      subjectUID   [8] UniqueIdentifier      OPTIONAL,
    -     *      extensions   [9] Extensions            OPTIONAL }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public CertTemplate build() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - addOptional(v, 0, false, version); - addOptional(v, 1, false, serialNumber); - addOptional(v, 2, false, signingAlg); - addOptional(v, 3, true, issuer); // CHOICE - addOptional(v, 4, false, validity); - addOptional(v, 5, true, subject); // CHOICE - addOptional(v, 6, false, publicKey); - addOptional(v, 7, false, issuerUID); - addOptional(v, 8, false, subjectUID); - addOptional(v, 9, false, extensions); - - return CertTemplate.getInstance(new DERSequence(v)); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, boolean isExplicit, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(isExplicit, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/Controls.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/Controls.java deleted file mode 100644 index f34bc47..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/Controls.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class Controls - extends ASN1Object -{ - private ASN1Sequence content; - - private Controls(ASN1Sequence seq) - { - content = seq; - } - - public static Controls getInstance(Object o) - { - if (o instanceof Controls) - { - return (Controls)o; - } - - if (o != null) - { - return new Controls(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public Controls(AttributeTypeAndValue atv) - { - content = new DERSequence(atv); - } - - public Controls(AttributeTypeAndValue[] atvs) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i < atvs.length; i++) { - v.add(atvs[i]); - } - content = new DERSequence(v); - } - - public AttributeTypeAndValue[] toAttributeTypeAndValueArray() - { - AttributeTypeAndValue[] result = new AttributeTypeAndValue[content.size()]; - - for (int i = 0; i != result.length; i++) - { - result[i] = AttributeTypeAndValue.getInstance(content.getObjectAt(i)); - } - - return result; - } - - /** - *
    -     * Controls  ::= SEQUENCE SIZE(1..MAX) OF AttributeTypeAndValue
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return content; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncKeyWithID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncKeyWithID.java deleted file mode 100644 index 5b75dc8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncKeyWithID.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.pkcs.PrivateKeyInfo; -import org.bc.asn1.x509.GeneralName; - -public class EncKeyWithID - extends ASN1Object -{ - private final PrivateKeyInfo privKeyInfo; - private final ASN1Encodable identifier; - - public static EncKeyWithID getInstance(Object o) - { - if (o instanceof EncKeyWithID) - { - return (EncKeyWithID)o; - } - else if (o != null) - { - return new EncKeyWithID(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private EncKeyWithID(ASN1Sequence seq) - { - this.privKeyInfo = PrivateKeyInfo.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - if (!(seq.getObjectAt(1) instanceof DERUTF8String)) - { - this.identifier = GeneralName.getInstance(seq.getObjectAt(1)); - } - else - { - this.identifier = (ASN1Encodable)seq.getObjectAt(1); - } - } - else - { - this.identifier = null; - } - } - - public EncKeyWithID(PrivateKeyInfo privKeyInfo) - { - this.privKeyInfo = privKeyInfo; - this.identifier = null; - } - - public EncKeyWithID(PrivateKeyInfo privKeyInfo, DERUTF8String str) - { - this.privKeyInfo = privKeyInfo; - this.identifier = str; - } - - public EncKeyWithID(PrivateKeyInfo privKeyInfo, GeneralName generalName) - { - this.privKeyInfo = privKeyInfo; - this.identifier = generalName; - } - - public PrivateKeyInfo getPrivateKey() - { - return privKeyInfo; - } - - public boolean hasIdentifier() - { - return identifier != null; - } - - public boolean isIdentifierUTF8String() - { - return identifier instanceof DERUTF8String; - } - - public ASN1Encodable getIdentifier() - { - return identifier; - } - - /** - *
    -     * EncKeyWithID ::= SEQUENCE {
    -     *      privateKey           PrivateKeyInfo,
    -     *      identifier CHOICE {
    -     *         string               UTF8String,
    -     *         generalName          GeneralName
    -     *     } OPTIONAL
    -     * }
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(privKeyInfo); - - if (identifier != null) - { - v.add(identifier); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedKey.java deleted file mode 100644 index 9bb715b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedKey.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.cms.EnvelopedData; - -public class EncryptedKey - extends ASN1Object - implements ASN1Choice -{ - private EnvelopedData envelopedData; - private EncryptedValue encryptedValue; - - public static EncryptedKey getInstance(Object o) - { - if (o instanceof EncryptedKey) - { - return (EncryptedKey)o; - } - else if (o instanceof ASN1TaggedObject) - { - return new EncryptedKey(EnvelopedData.getInstance((ASN1TaggedObject)o, false)); - } - else if (o instanceof EncryptedValue) - { - return new EncryptedKey((EncryptedValue)o); - } - else - { - return new EncryptedKey(EncryptedValue.getInstance(o)); - } - } - - public EncryptedKey(EnvelopedData envelopedData) - { - this.envelopedData = envelopedData; - } - - public EncryptedKey(EncryptedValue encryptedValue) - { - this.encryptedValue = encryptedValue; - } - - public boolean isEncryptedValue() - { - return encryptedValue != null; - } - - public ASN1Encodable getValue() - { - if (encryptedValue != null) - { - return encryptedValue; - } - - return envelopedData; - } - - /** - *
    -     *    EncryptedKey ::= CHOICE {
    -     *        encryptedValue        EncryptedValue, -- deprecated
    -     *        envelopedData     [0] EnvelopedData }
    -     *        -- The encrypted private key MUST be placed in the envelopedData
    -     *        -- encryptedContentInfo encryptedContent OCTET STRING.
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - if (encryptedValue != null) - { - return encryptedValue.toASN1Primitive(); - } - - return new DERTaggedObject(false, 0, envelopedData); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedValue.java deleted file mode 100644 index 0aaa198..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/EncryptedValue.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class EncryptedValue - extends ASN1Object -{ - private AlgorithmIdentifier intendedAlg; - private AlgorithmIdentifier symmAlg; - private DERBitString encSymmKey; - private AlgorithmIdentifier keyAlg; - private ASN1OctetString valueHint; - private DERBitString encValue; - - private EncryptedValue(ASN1Sequence seq) - { - int index = 0; - while (seq.getObjectAt(index) instanceof ASN1TaggedObject) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)seq.getObjectAt(index); - - switch (tObj.getTagNo()) - { - case 0: - intendedAlg = AlgorithmIdentifier.getInstance(tObj, false); - break; - case 1: - symmAlg = AlgorithmIdentifier.getInstance(tObj, false); - break; - case 2: - encSymmKey = DERBitString.getInstance(tObj, false); - break; - case 3: - keyAlg = AlgorithmIdentifier.getInstance(tObj, false); - break; - case 4: - valueHint = ASN1OctetString.getInstance(tObj, false); - break; - } - index++; - } - - encValue = DERBitString.getInstance(seq.getObjectAt(index)); - } - - public static EncryptedValue getInstance(Object o) - { - if (o instanceof EncryptedValue) - { - return (EncryptedValue)o; - } - else if (o != null) - { - return new EncryptedValue(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public EncryptedValue( - AlgorithmIdentifier intendedAlg, - AlgorithmIdentifier symmAlg, - DERBitString encSymmKey, - AlgorithmIdentifier keyAlg, - ASN1OctetString valueHint, - DERBitString encValue) - { - if (encValue == null) - { - throw new IllegalArgumentException("'encValue' cannot be null"); - } - - this.intendedAlg = intendedAlg; - this.symmAlg = symmAlg; - this.encSymmKey = encSymmKey; - this.keyAlg = keyAlg; - this.valueHint = valueHint; - this.encValue = encValue; - } - - public AlgorithmIdentifier getIntendedAlg() - { - return intendedAlg; - } - - public AlgorithmIdentifier getSymmAlg() - { - return symmAlg; - } - - public DERBitString getEncSymmKey() - { - return encSymmKey; - } - - public AlgorithmIdentifier getKeyAlg() - { - return keyAlg; - } - - public ASN1OctetString getValueHint() - { - return valueHint; - } - - public DERBitString getEncValue() - { - return encValue; - } - - /** - *
    -     * EncryptedValue ::= SEQUENCE {
    -     *                     intendedAlg   [0] AlgorithmIdentifier  OPTIONAL,
    -     *                     -- the intended algorithm for which the value will be used
    -     *                     symmAlg       [1] AlgorithmIdentifier  OPTIONAL,
    -     *                     -- the symmetric algorithm used to encrypt the value
    -     *                     encSymmKey    [2] BIT STRING           OPTIONAL,
    -     *                     -- the (encrypted) symmetric key used to encrypt the value
    -     *                     keyAlg        [3] AlgorithmIdentifier  OPTIONAL,
    -     *                     -- algorithm used to encrypt the symmetric key
    -     *                     valueHint     [4] OCTET STRING         OPTIONAL,
    -     *                     -- a brief description or identifier of the encValue content
    -     *                     -- (may be meaningful only to the sending entity, and used only
    -     *                     -- if EncryptedValue might be re-examined by the sending entity
    -     *                     -- in the future)
    -     *                     encValue       BIT STRING }
    -     *                     -- the encrypted value itself
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - addOptional(v, 0, intendedAlg); - addOptional(v, 1, symmAlg); - addOptional(v, 2, encSymmKey); - addOptional(v, 3, keyAlg); - addOptional(v, 4, valueHint); - - v.add(encValue); - - return new DERSequence(v); - } - - private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) - { - if (obj != null) - { - v.add(new DERTaggedObject(false, tagNo, obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/OptionalValidity.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/OptionalValidity.java deleted file mode 100644 index c8d7b84..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/OptionalValidity.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.crmf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Time; - -public class OptionalValidity - extends ASN1Object -{ - private Time notBefore; - private Time notAfter; - - private OptionalValidity(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement(); - - if (tObj.getTagNo() == 0) - { - notBefore = Time.getInstance(tObj, true); - } - else - { - notAfter = Time.getInstance(tObj, true); - } - } - } - - public static OptionalValidity getInstance(Object o) - { - if (o instanceof OptionalValidity) - { - return (OptionalValidity)o; - } - - if (o != null) - { - return new OptionalValidity(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public OptionalValidity(Time notBefore, Time notAfter) - { - if (notBefore == null && notAfter == null) - { - throw new IllegalArgumentException("at least one of notBefore/notAfter must not be null."); - } - - this.notBefore = notBefore; - this.notAfter = notAfter; - } - - public Time getNotBefore() - { - return notBefore; - } - - public Time getNotAfter() - { - return notAfter; - } - - /** - *
    -     * OptionalValidity ::= SEQUENCE {
    -     *                        notBefore  [0] Time OPTIONAL,
    -     *                        notAfter   [1] Time OPTIONAL } --at least one MUST be present
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (notBefore != null) - { - v.add(new DERTaggedObject(true, 0, notBefore)); - } - - if (notAfter != null) - { - v.add(new DERTaggedObject(true, 1, notAfter)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIArchiveOptions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIArchiveOptions.java deleted file mode 100644 index ff06fe9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIArchiveOptions.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class PKIArchiveOptions - extends ASN1Object - implements ASN1Choice -{ - public static final int encryptedPrivKey = 0; - public static final int keyGenParameters = 1; - public static final int archiveRemGenPrivKey = 2; - - private ASN1Encodable value; - - public static PKIArchiveOptions getInstance(Object o) - { - if (o == null || o instanceof PKIArchiveOptions) - { - return (PKIArchiveOptions)o; - } - else if (o instanceof ASN1TaggedObject) - { - return new PKIArchiveOptions((ASN1TaggedObject)o); - } - - throw new IllegalArgumentException("unknown object: " + o); - } - - private PKIArchiveOptions(ASN1TaggedObject tagged) - { - switch (tagged.getTagNo()) - { - case encryptedPrivKey: - value = EncryptedKey.getInstance(tagged.getObject()); - break; - case keyGenParameters: - value = ASN1OctetString.getInstance(tagged, false); - break; - case archiveRemGenPrivKey: - value = ASN1Boolean.getInstance(tagged, false); - break; - default: - throw new IllegalArgumentException("unknown tag number: " + tagged.getTagNo()); - } - } - - public PKIArchiveOptions(EncryptedKey encKey) - { - this.value = encKey; - } - - public PKIArchiveOptions(ASN1OctetString keyGenParameters) - { - this.value = keyGenParameters; - } - - public PKIArchiveOptions(boolean archiveRemGenPrivKey) - { - this.value = ASN1Boolean.getInstance(archiveRemGenPrivKey); - } - - public int getType() - { - if (value instanceof EncryptedKey) - { - return encryptedPrivKey; - } - - if (value instanceof ASN1OctetString) - { - return keyGenParameters; - } - - return archiveRemGenPrivKey; - } - - public ASN1Encodable getValue() - { - return value; - } - - /** - *
    -     *  PKIArchiveOptions ::= CHOICE {
    -     *      encryptedPrivKey     [0] EncryptedKey,
    -     *      -- the actual value of the private key
    -     *      keyGenParameters     [1] KeyGenParameters,
    -     *      -- parameters which allow the private key to be re-generated
    -     *      archiveRemGenPrivKey [2] BOOLEAN }
    -     *      -- set to TRUE if sender wishes receiver to archive the private
    -     *      -- key of a key pair that the receiver generates in response to
    -     *      -- this request; set to FALSE if no archival is desired.
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - if (value instanceof EncryptedKey) - { - return new DERTaggedObject(true, encryptedPrivKey, value); // choice - } - - if (value instanceof ASN1OctetString) - { - return new DERTaggedObject(false, keyGenParameters, value); - } - - return new DERTaggedObject(false, archiveRemGenPrivKey, value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIPublicationInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIPublicationInfo.java deleted file mode 100644 index b6901f4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKIPublicationInfo.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PKIPublicationInfo - extends ASN1Object -{ - private ASN1Integer action; - private ASN1Sequence pubInfos; - - private PKIPublicationInfo(ASN1Sequence seq) - { - action = ASN1Integer.getInstance(seq.getObjectAt(0)); - pubInfos = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - - public static PKIPublicationInfo getInstance(Object o) - { - if (o instanceof PKIPublicationInfo) - { - return (PKIPublicationInfo)o; - } - - if (o != null) - { - return new PKIPublicationInfo(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer getAction() - { - return action; - } - - public SinglePubInfo[] getPubInfos() - { - if (pubInfos == null) - { - return null; - } - - SinglePubInfo[] results = new SinglePubInfo[pubInfos.size()]; - - for (int i = 0; i != results.length; i++) - { - results[i] = SinglePubInfo.getInstance(pubInfos.getObjectAt(i)); - } - - return results; - } - - /** - *
    -     * PKIPublicationInfo ::= SEQUENCE {
    -     *                  action     INTEGER {
    -     *                                 dontPublish (0),
    -     *                                 pleasePublish (1) },
    -     *                  pubInfos  SEQUENCE SIZE (1..MAX) OF SinglePubInfo OPTIONAL }
    -     * -- pubInfos MUST NOT be present if action is "dontPublish"
    -     * -- (if action is "pleasePublish" and pubInfos is omitted,
    -     * -- "dontCare" is assumed)
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(action); - v.add(pubInfos); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKMACValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKMACValue.java deleted file mode 100644 index 90cabc3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/PKMACValue.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.cmp.CMPObjectIdentifiers; -import org.bc.asn1.cmp.PBMParameter; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * Password-based MAC value for use with POPOSigningKeyInput. - */ -public class PKMACValue - extends ASN1Object -{ - private AlgorithmIdentifier algId; - private DERBitString value; - - private PKMACValue(ASN1Sequence seq) - { - algId = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - value = DERBitString.getInstance(seq.getObjectAt(1)); - } - - public static PKMACValue getInstance(Object o) - { - if (o instanceof PKMACValue) - { - return (PKMACValue)o; - } - - if (o != null) - { - return new PKMACValue(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public static PKMACValue getInstance(ASN1TaggedObject obj, boolean isExplicit) - { - return getInstance(ASN1Sequence.getInstance(obj, isExplicit)); - } - - /** - * Creates a new PKMACValue. - * @param params parameters for password-based MAC - * @param value MAC of the DER-encoded SubjectPublicKeyInfo - */ - public PKMACValue( - PBMParameter params, - DERBitString value) - { - this(new AlgorithmIdentifier( - CMPObjectIdentifiers.passwordBasedMac, params), value); - } - - /** - * Creates a new PKMACValue. - * @param aid CMPObjectIdentifiers.passwordBasedMAC, with PBMParameter - * @param value MAC of the DER-encoded SubjectPublicKeyInfo - */ - public PKMACValue( - AlgorithmIdentifier aid, - DERBitString value) - { - this.algId = aid; - this.value = value; - } - - public AlgorithmIdentifier getAlgId() - { - return algId; - } - - public DERBitString getValue() - { - return value; - } - - /** - *
    -     * PKMACValue ::= SEQUENCE {
    -     *      algId  AlgorithmIdentifier,
    -     *      -- algorithm value shall be PasswordBasedMac 1.2.840.113533.7.66.13
    -     *      -- parameter value is PBMParameter
    -     *      value  BIT STRING }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algId); - v.add(value); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOPrivKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOPrivKey.java deleted file mode 100644 index 2566f0e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOPrivKey.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.cms.EnvelopedData; - -public class POPOPrivKey - extends ASN1Object - implements ASN1Choice -{ - public static final int thisMessage = 0; - public static final int subsequentMessage = 1; - public static final int dhMAC = 2; - public static final int agreeMAC = 3; - public static final int encryptedKey = 4; - - private int tagNo; - private ASN1Encodable obj; - - private POPOPrivKey(ASN1TaggedObject obj) - { - this.tagNo = obj.getTagNo(); - - switch (tagNo) - { - case thisMessage: - this.obj = DERBitString.getInstance(obj, false); - break; - case subsequentMessage: - this.obj = SubsequentMessage.valueOf(ASN1Integer.getInstance(obj, false).getValue().intValue()); - break; - case dhMAC: - this.obj = DERBitString.getInstance(obj, false); - break; - case agreeMAC: - this.obj = PKMACValue.getInstance(obj, false); - break; - case encryptedKey: - this.obj = EnvelopedData.getInstance(obj, false); - break; - default: - throw new IllegalArgumentException("unknown tag in POPOPrivKey"); - } - } - - public static POPOPrivKey getInstance(Object obj) - { - if (obj instanceof POPOPrivKey) - { - return (POPOPrivKey)obj; - } - if (obj != null) - { - return new POPOPrivKey(ASN1TaggedObject.getInstance(obj)); - } - - return null; - } - - public static POPOPrivKey getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1TaggedObject.getInstance(obj, explicit)); - } - - public POPOPrivKey(SubsequentMessage msg) - { - this.tagNo = subsequentMessage; - this.obj = msg; - } - - public int getType() - { - return tagNo; - } - - public ASN1Encodable getValue() - { - return obj; - } - - /** - *
    -     * POPOPrivKey ::= CHOICE {
    -     *        thisMessage       [0] BIT STRING,         -- Deprecated
    -     *         -- possession is proven in this message (which contains the private
    -     *         -- key itself (encrypted for the CA))
    -     *        subsequentMessage [1] SubsequentMessage,
    -     *         -- possession will be proven in a subsequent message
    -     *        dhMAC             [2] BIT STRING,         -- Deprecated
    -     *        agreeMAC          [3] PKMACValue,
    -     *        encryptedKey      [4] EnvelopedData }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(false, tagNo, obj); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKey.java deleted file mode 100644 index 8a896a4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKey.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class POPOSigningKey - extends ASN1Object -{ - private POPOSigningKeyInput poposkInput; - private AlgorithmIdentifier algorithmIdentifier; - private DERBitString signature; - - private POPOSigningKey(ASN1Sequence seq) - { - int index = 0; - - if (seq.getObjectAt(index) instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagObj - = (ASN1TaggedObject) seq.getObjectAt(index++); - if (tagObj.getTagNo() != 0) - { - throw new IllegalArgumentException( - "Unknown POPOSigningKeyInput tag: " + tagObj.getTagNo()); - } - poposkInput = POPOSigningKeyInput.getInstance(tagObj.getObject()); - } - algorithmIdentifier = AlgorithmIdentifier.getInstance(seq.getObjectAt(index++)); - signature = DERBitString.getInstance(seq.getObjectAt(index)); - } - - public static POPOSigningKey getInstance(Object o) - { - if (o instanceof POPOSigningKey) - { - return (POPOSigningKey)o; - } - - if (o != null) - { - return new POPOSigningKey(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public static POPOSigningKey getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * Creates a new Proof of Possession object for a signing key. - * @param poposkIn the POPOSigningKeyInput structure, or null if the - * CertTemplate includes both subject and publicKey values. - * @param aid the AlgorithmIdentifier used to sign the proof of possession. - * @param signature a signature over the DER-encoded value of poposkIn, - * or the DER-encoded value of certReq if poposkIn is null. - */ - public POPOSigningKey( - POPOSigningKeyInput poposkIn, - AlgorithmIdentifier aid, - DERBitString signature) - { - this.poposkInput = poposkIn; - this.algorithmIdentifier = aid; - this.signature = signature; - } - - public POPOSigningKeyInput getPoposkInput() { - return poposkInput; - } - - public AlgorithmIdentifier getAlgorithmIdentifier() { - return algorithmIdentifier; - } - - public DERBitString getSignature() { - return signature; - } - - /** - *
    -     * POPOSigningKey ::= SEQUENCE {
    -     *                      poposkInput           [0] POPOSigningKeyInput OPTIONAL,
    -     *                      algorithmIdentifier   AlgorithmIdentifier,
    -     *                      signature             BIT STRING }
    -     *  -- The signature (using "algorithmIdentifier") is on the
    -     *  -- DER-encoded value of poposkInput.  NOTE: If the CertReqMsg
    -     *  -- certReq CertTemplate contains the subject and publicKey values,
    -     *  -- then poposkInput MUST be omitted and the signature MUST be
    -     *  -- computed on the DER-encoded value of CertReqMsg certReq.  If
    -     *  -- the CertReqMsg certReq CertTemplate does not contain the public
    -     *  -- key and subject values, then poposkInput MUST be present and
    -     *  -- MUST be signed.  This strategy ensures that the public key is
    -     *  -- not present in both the poposkInput and CertReqMsg certReq
    -     *  -- CertTemplate fields.
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (poposkInput != null) - { - v.add(new DERTaggedObject(false, 0, poposkInput)); - } - - v.add(algorithmIdentifier); - v.add(signature); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKeyInput.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKeyInput.java deleted file mode 100644 index 38550d1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/POPOSigningKeyInput.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.GeneralName; -import org.bc.asn1.x509.SubjectPublicKeyInfo; - -public class POPOSigningKeyInput - extends ASN1Object -{ - private GeneralName sender; - private PKMACValue publicKeyMAC; - private SubjectPublicKeyInfo publicKey; - - private POPOSigningKeyInput(ASN1Sequence seq) - { - ASN1Encodable authInfo = (ASN1Encodable)seq.getObjectAt(0); - - if (authInfo instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagObj = (ASN1TaggedObject)authInfo; - if (tagObj.getTagNo() != 0) - { - throw new IllegalArgumentException( - "Unknown authInfo tag: " + tagObj.getTagNo()); - } - sender = GeneralName.getInstance(tagObj.getObject()); - } - else - { - publicKeyMAC = PKMACValue.getInstance(authInfo); - } - - publicKey = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(1)); - } - - public static POPOSigningKeyInput getInstance(Object o) - { - if (o instanceof POPOSigningKeyInput) - { - return (POPOSigningKeyInput)o; - } - - if (o != null) - { - return new POPOSigningKeyInput(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * Creates a new POPOSigningKeyInput with sender name as authInfo. - */ - public POPOSigningKeyInput( - GeneralName sender, - SubjectPublicKeyInfo spki) - { - this.sender = sender; - this.publicKey = spki; - } - - /** - * Creates a new POPOSigningKeyInput using password-based MAC. - */ - public POPOSigningKeyInput( - PKMACValue pkmac, - SubjectPublicKeyInfo spki) - { - this.publicKeyMAC = pkmac; - this.publicKey = spki; - } - - /** - * Returns the sender field, or null if authInfo is publicKeyMAC - */ - public GeneralName getSender() - { - return sender; - } - - /** - * Returns the publicKeyMAC field, or null if authInfo is sender - */ - public PKMACValue getPublicKeyMAC() - { - return publicKeyMAC; - } - - public SubjectPublicKeyInfo getPublicKey() - { - return publicKey; - } - - /** - *
    -     * POPOSigningKeyInput ::= SEQUENCE {
    -     *        authInfo             CHOICE {
    -     *                                 sender              [0] GeneralName,
    -     *                                 -- used only if an authenticated identity has been
    -     *                                 -- established for the sender (e.g., a DN from a
    -     *                                 -- previously-issued and currently-valid certificate
    -     *                                 publicKeyMAC        PKMACValue },
    -     *                                 -- used if no authenticated GeneralName currently exists for
    -     *                                 -- the sender; publicKeyMAC contains a password-based MAC
    -     *                                 -- on the DER-encoded value of publicKey
    -     *        publicKey           SubjectPublicKeyInfo }  -- from CertTemplate
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (sender != null) - { - v.add(new DERTaggedObject(false, 0, sender)); - } - else - { - v.add(publicKeyMAC); - } - - v.add(publicKey); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/ProofOfPossession.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/ProofOfPossession.java deleted file mode 100644 index 0290a2f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/ProofOfPossession.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERNull; -import org.bc.asn1.DERTaggedObject; - -public class ProofOfPossession - extends ASN1Object - implements ASN1Choice -{ - public static final int TYPE_RA_VERIFIED = 0; - public static final int TYPE_SIGNING_KEY = 1; - public static final int TYPE_KEY_ENCIPHERMENT = 2; - public static final int TYPE_KEY_AGREEMENT = 3; - - private int tagNo; - private ASN1Encodable obj; - - private ProofOfPossession(ASN1TaggedObject tagged) - { - tagNo = tagged.getTagNo(); - switch (tagNo) - { - case 0: - obj = DERNull.INSTANCE; - break; - case 1: - obj = POPOSigningKey.getInstance(tagged, false); - break; - case 2: - case 3: - obj = POPOPrivKey.getInstance(tagged, true); - break; - default: - throw new IllegalArgumentException("unknown tag: " + tagNo); - } - } - - public static ProofOfPossession getInstance(Object o) - { - if (o == null || o instanceof ProofOfPossession) - { - return (ProofOfPossession)o; - } - - if (o instanceof ASN1TaggedObject) - { - return new ProofOfPossession((ASN1TaggedObject)o); - } - - throw new IllegalArgumentException("Invalid object: " + o.getClass().getName()); - } - - /** Creates a ProofOfPossession with type raVerified. */ - public ProofOfPossession() - { - tagNo = TYPE_RA_VERIFIED; - obj = DERNull.INSTANCE; - } - - /** Creates a ProofOfPossession for a signing key. */ - public ProofOfPossession(POPOSigningKey poposk) - { - tagNo = TYPE_SIGNING_KEY; - obj = poposk; - } - - /** - * Creates a ProofOfPossession for key encipherment or agreement. - * @param type one of TYPE_KEY_ENCIPHERMENT or TYPE_KEY_AGREEMENT - */ - public ProofOfPossession(int type, POPOPrivKey privkey) - { - tagNo = type; - obj = privkey; - } - - public int getType() - { - return tagNo; - } - - public ASN1Encodable getObject() - { - return obj; - } - - /** - *
    -     * ProofOfPossession ::= CHOICE {
    -     *                           raVerified        [0] NULL,
    -     *                           -- used if the RA has already verified that the requester is in
    -     *                           -- possession of the private key
    -     *                           signature         [1] POPOSigningKey,
    -     *                           keyEncipherment   [2] POPOPrivKey,
    -     *                           keyAgreement      [3] POPOPrivKey }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(false, tagNo, obj); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SinglePubInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SinglePubInfo.java deleted file mode 100644 index ff398e2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SinglePubInfo.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.GeneralName; - -public class SinglePubInfo - extends ASN1Object -{ - private ASN1Integer pubMethod; - private GeneralName pubLocation; - - private SinglePubInfo(ASN1Sequence seq) - { - pubMethod = ASN1Integer.getInstance(seq.getObjectAt(0)); - - if (seq.size() == 2) - { - pubLocation = GeneralName.getInstance(seq.getObjectAt(1)); - } - } - - public static SinglePubInfo getInstance(Object o) - { - if (o instanceof SinglePubInfo) - { - return (SinglePubInfo)o; - } - - if (o != null) - { - return new SinglePubInfo(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public GeneralName getPubLocation() - { - return pubLocation; - } - - /** - *
    -     * SinglePubInfo ::= SEQUENCE {
    -     *        pubMethod    INTEGER {
    -     *           dontCare    (0),
    -     *           x500        (1),
    -     *           web         (2),
    -     *           ldap        (3) },
    -     *       pubLocation  GeneralName OPTIONAL }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(pubMethod); - - if (pubLocation != null) - { - v.add(pubLocation); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SubsequentMessage.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SubsequentMessage.java deleted file mode 100644 index b8baf4f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/crmf/SubsequentMessage.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.asn1.crmf; - -import org.bc.asn1.ASN1Integer; - -public class SubsequentMessage - extends ASN1Integer -{ - public static final SubsequentMessage encrCert = new SubsequentMessage(0); - public static final SubsequentMessage challengeResp = new SubsequentMessage(1); - - private SubsequentMessage(int value) - { - super(value); - } - - public static SubsequentMessage valueOf(int value) - { - if (value == 0) - { - return encrCert; - } - if (value == 1) - { - return challengeResp; - } - - throw new IllegalArgumentException("unknown value: " + value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/CryptoProObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/CryptoProObjectIdentifiers.java deleted file mode 100644 index 6cdde6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/CryptoProObjectIdentifiers.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.cryptopro; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface CryptoProObjectIdentifiers -{ - // GOST Algorithms OBJECT IDENTIFIERS : - // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2)} - static final ASN1ObjectIdentifier GOST_id = new ASN1ObjectIdentifier("1.2.643.2.2"); - - static final ASN1ObjectIdentifier gostR3411 = GOST_id.branch("9"); - static final ASN1ObjectIdentifier gostR3411Hmac = GOST_id.branch("10"); - - static final ASN1ObjectIdentifier gostR28147_cbc = new ASN1ObjectIdentifier(GOST_id+".21"); - - static final ASN1ObjectIdentifier id_Gost28147_89_CryptoPro_A_ParamSet = GOST_id.branch("31.1"); - - static final ASN1ObjectIdentifier gostR3410_94 = new ASN1ObjectIdentifier(GOST_id+".20"); - static final ASN1ObjectIdentifier gostR3410_2001 = new ASN1ObjectIdentifier(GOST_id+".19"); - static final ASN1ObjectIdentifier gostR3411_94_with_gostR3410_94 = new ASN1ObjectIdentifier(GOST_id+".4"); - static final ASN1ObjectIdentifier gostR3411_94_with_gostR3410_2001 = new ASN1ObjectIdentifier(GOST_id+".3"); - - // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) hashes(30) } - static final ASN1ObjectIdentifier gostR3411_94_CryptoProParamSet = new ASN1ObjectIdentifier(GOST_id+".30.1"); - - // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) signs(32) } - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_A = new ASN1ObjectIdentifier(GOST_id+".32.2"); - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_B = new ASN1ObjectIdentifier(GOST_id+".32.3"); - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_C = new ASN1ObjectIdentifier(GOST_id+".32.4"); - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_D = new ASN1ObjectIdentifier(GOST_id+".32.5"); - - // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) exchanges(33) } - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_XchA = new ASN1ObjectIdentifier(GOST_id+".33.1"); - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_XchB = new ASN1ObjectIdentifier(GOST_id+".33.2"); - static final ASN1ObjectIdentifier gostR3410_94_CryptoPro_XchC = new ASN1ObjectIdentifier(GOST_id+".33.3"); - - //{ iso(1) member-body(2)ru(643) rans(2) cryptopro(2) ecc-signs(35) } - static final ASN1ObjectIdentifier gostR3410_2001_CryptoPro_A = new ASN1ObjectIdentifier(GOST_id+".35.1"); - static final ASN1ObjectIdentifier gostR3410_2001_CryptoPro_B = new ASN1ObjectIdentifier(GOST_id+".35.2"); - static final ASN1ObjectIdentifier gostR3410_2001_CryptoPro_C = new ASN1ObjectIdentifier(GOST_id+".35.3"); - - // { iso(1) member-body(2) ru(643) rans(2) cryptopro(2) ecc-exchanges(36) } - static final ASN1ObjectIdentifier gostR3410_2001_CryptoPro_XchA = new ASN1ObjectIdentifier(GOST_id+".36.0"); - static final ASN1ObjectIdentifier gostR3410_2001_CryptoPro_XchB = new ASN1ObjectIdentifier(GOST_id+".36.1"); - - static final ASN1ObjectIdentifier gost_ElSgDH3410_default = new ASN1ObjectIdentifier(GOST_id+".36.0"); - static final ASN1ObjectIdentifier gost_ElSgDH3410_1 = new ASN1ObjectIdentifier(GOST_id+".36.1"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410NamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410NamedCurves.java deleted file mode 100644 index c1f264e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410NamedCurves.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.bc.asn1.cryptopro; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECFieldElement; -import org.bc.math.ec.ECPoint; - -/** - * table of the available named parameters for GOST 3410-2001. - */ -public class ECGOST3410NamedCurves -{ - static final Hashtable objIds = new Hashtable(); - static final Hashtable params = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static - { - BigInteger mod_p = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639319"); - BigInteger mod_q = new BigInteger("115792089237316195423570985008687907853073762908499243225378155805079068850323"); - - ECCurve.Fp curve = new ECCurve.Fp( - mod_p, // p - new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639316"), // a - new BigInteger("166")); // b - - ECDomainParameters ecParams = new ECDomainParameters( - curve, - new ECPoint.Fp(curve, - new ECFieldElement.Fp(curve.getQ(),new BigInteger("1")), // x - new ECFieldElement.Fp(curve.getQ(),new BigInteger("64033881142927202683649881450433473985931760268884941288852745803908878638612"))), // y - mod_q); - - params.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_A, ecParams); - - mod_p = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639319"); - mod_q = new BigInteger("115792089237316195423570985008687907853073762908499243225378155805079068850323"); - - curve = new ECCurve.Fp( - mod_p, // p - new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639316"), - new BigInteger("166")); - - ecParams = new ECDomainParameters( - curve, - new ECPoint.Fp(curve, - new ECFieldElement.Fp(curve.getQ(),new BigInteger("1")), // x - new ECFieldElement.Fp(curve.getQ(),new BigInteger("64033881142927202683649881450433473985931760268884941288852745803908878638612"))), // y - mod_q); - - params.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchA, ecParams); - - mod_p = new BigInteger("57896044618658097711785492504343953926634992332820282019728792003956564823193"); //p - mod_q = new BigInteger("57896044618658097711785492504343953927102133160255826820068844496087732066703"); //q - - curve = new ECCurve.Fp( - mod_p, // p - new BigInteger("57896044618658097711785492504343953926634992332820282019728792003956564823190"), // a - new BigInteger("28091019353058090096996979000309560759124368558014865957655842872397301267595")); // b - - ecParams = new ECDomainParameters( - curve, - new ECPoint.Fp(curve, - new ECFieldElement.Fp(mod_p,new BigInteger("1")), // x - new ECFieldElement.Fp(mod_p,new BigInteger("28792665814854611296992347458380284135028636778229113005756334730996303888124"))), // y - mod_q); // q - - params.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_B, ecParams); - - mod_p = new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502619"); - mod_q = new BigInteger("70390085352083305199547718019018437840920882647164081035322601458352298396601"); - - curve = new ECCurve.Fp( - mod_p, // p - new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502616"), - new BigInteger("32858")); - - ecParams = new ECDomainParameters( - curve, - new ECPoint.Fp(curve, - new ECFieldElement.Fp(mod_p,new BigInteger("0")), - new ECFieldElement.Fp(mod_p,new BigInteger("29818893917731240733471273240314769927240550812383695689146495261604565990247"))), - mod_q); - - params.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchB, ecParams); - - mod_p = new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502619"); //p - mod_q = new BigInteger("70390085352083305199547718019018437840920882647164081035322601458352298396601"); //q - curve = new ECCurve.Fp( - mod_p, // p - new BigInteger("70390085352083305199547718019018437841079516630045180471284346843705633502616"), // a - new BigInteger("32858")); // b - - ecParams = new ECDomainParameters( - curve, - new ECPoint.Fp(curve, - new ECFieldElement.Fp(mod_p,new BigInteger("0")), // x - new ECFieldElement.Fp(mod_p,new BigInteger("29818893917731240733471273240314769927240550812383695689146495261604565990247"))), // y - mod_q); // q - - params.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_C, ecParams); - - objIds.put("GostR3410-2001-CryptoPro-A", CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_A); - objIds.put("GostR3410-2001-CryptoPro-B", CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_B); - objIds.put("GostR3410-2001-CryptoPro-C", CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_C); - objIds.put("GostR3410-2001-CryptoPro-XchA", CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchA); - objIds.put("GostR3410-2001-CryptoPro-XchB", CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchB); - - names.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_A, "GostR3410-2001-CryptoPro-A"); - names.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_B, "GostR3410-2001-CryptoPro-B"); - names.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_C, "GostR3410-2001-CryptoPro-C"); - names.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchA, "GostR3410-2001-CryptoPro-XchA"); - names.put(CryptoProObjectIdentifiers.gostR3410_2001_CryptoPro_XchB, "GostR3410-2001-CryptoPro-XchB"); - } - - /** - * return the ECDomainParameters object for the given OID, null if it - * isn't present. - * - * @param oid an object identifier representing a named parameters, if present. - */ - public static ECDomainParameters getByOID( - ASN1ObjectIdentifier oid) - { - return (ECDomainParameters)params.get(oid); - } - - /** - * returns an enumeration containing the name strings for parameters - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } - - public static ECDomainParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(name); - - if (oid != null) - { - return (ECDomainParameters)params.get(oid); - } - - return null; - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName( - ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - public static ASN1ObjectIdentifier getOID(String name) - { - return (ASN1ObjectIdentifier)objIds.get(name); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410ParamSetParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410ParamSetParameters.java deleted file mode 100644 index f389512..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/ECGOST3410ParamSetParameters.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.bc.asn1.cryptopro; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class ECGOST3410ParamSetParameters - extends ASN1Object -{ - ASN1Integer p, q, a, b, x, y; - - public static ECGOST3410ParamSetParameters getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static ECGOST3410ParamSetParameters getInstance( - Object obj) - { - if(obj == null || obj instanceof ECGOST3410ParamSetParameters) - { - return (ECGOST3410ParamSetParameters)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new ECGOST3410ParamSetParameters((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid GOST3410Parameter: " + obj.getClass().getName()); - } - - public ECGOST3410ParamSetParameters( - BigInteger a, - BigInteger b, - BigInteger p, - BigInteger q, - int x, - BigInteger y) - { - this.a = new ASN1Integer(a); - this.b = new ASN1Integer(b); - this.p = new ASN1Integer(p); - this.q = new ASN1Integer(q); - this.x = new ASN1Integer(x); - this.y = new ASN1Integer(y); - } - - public ECGOST3410ParamSetParameters( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - a = (ASN1Integer)e.nextElement(); - b = (ASN1Integer)e.nextElement(); - p = (ASN1Integer)e.nextElement(); - q = (ASN1Integer)e.nextElement(); - x = (ASN1Integer)e.nextElement(); - y = (ASN1Integer)e.nextElement(); - } - - public BigInteger getP() - { - return p.getPositiveValue(); - } - - public BigInteger getQ() - { - return q.getPositiveValue(); - } - - public BigInteger getA() - { - return a.getPositiveValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(a); - v.add(b); - v.add(p); - v.add(q); - v.add(x); - v.add(y); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST28147Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST28147Parameters.java deleted file mode 100644 index 6584ce0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST28147Parameters.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.cryptopro; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class GOST28147Parameters - extends ASN1Object -{ - ASN1OctetString iv; - ASN1ObjectIdentifier paramSet; - - public static GOST28147Parameters getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static GOST28147Parameters getInstance( - Object obj) - { - if(obj == null || obj instanceof GOST28147Parameters) - { - return (GOST28147Parameters)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new GOST28147Parameters((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid GOST3410Parameter: " + obj.getClass().getName()); - } - - public GOST28147Parameters( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - iv = (ASN1OctetString)e.nextElement(); - paramSet = (ASN1ObjectIdentifier)e.nextElement(); - } - - /** - *
    -     * Gost28147-89-Parameters ::=
    -     *               SEQUENCE {
    -     *                       iv                   Gost28147-89-IV,
    -     *                       encryptionParamSet   OBJECT IDENTIFIER
    -     *                }
    -     *
    -     *   Gost28147-89-IV ::= OCTET STRING (SIZE (8))
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(iv); - v.add(paramSet); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410NamedParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410NamedParameters.java deleted file mode 100644 index aa348c8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410NamedParameters.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.bc.asn1.cryptopro; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; - -/** - * table of the available named parameters for GOST 3410-94. - */ -public class GOST3410NamedParameters -{ - static final Hashtable objIds = new Hashtable(); - static final Hashtable params = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static private GOST3410ParamSetParameters cryptoProA = new GOST3410ParamSetParameters( - 1024, - new BigInteger("127021248288932417465907042777176443525787653508916535812817507265705031260985098497423188333483401180925999995120988934130659205614996724254121049274349357074920312769561451689224110579311248812610229678534638401693520013288995000362260684222750813532307004517341633685004541062586971416883686778842537820383"), - new BigInteger("68363196144955700784444165611827252895102170888761442055095051287550314083023"), - new BigInteger("100997906755055304772081815535925224869841082572053457874823515875577147990529272777244152852699298796483356699682842027972896052747173175480590485607134746852141928680912561502802222185647539190902656116367847270145019066794290930185446216399730872221732889830323194097355403213400972588322876850946740663962") -// validationAlgorithm { -// algorithm -// id-GostR3410-94-bBis, -// parameters -// GostR3410-94-ValidationBisParameters: { -// x0 1376285941, -// c 3996757427 -// } -// } - - ); - - static private GOST3410ParamSetParameters cryptoProB = new GOST3410ParamSetParameters( - 1024, - new BigInteger("139454871199115825601409655107690713107041707059928031797758001454375765357722984094124368522288239833039114681648076688236921220737322672160740747771700911134550432053804647694904686120113087816240740184800477047157336662926249423571248823968542221753660143391485680840520336859458494803187341288580489525163"), - new BigInteger("79885141663410976897627118935756323747307951916507639758300472692338873533959"), - new BigInteger("42941826148615804143873447737955502392672345968607143066798112994089471231420027060385216699563848719957657284814898909770759462613437669456364882730370838934791080835932647976778601915343474400961034231316672578686920482194932878633360203384797092684342247621055760235016132614780652761028509445403338652341") -// validationAlgorithm { -// algorithm -// id-GostR3410-94-bBis, -// parameters -// GostR3410-94-ValidationBisParameters: { -// x0 1536654555, -// c 1855361757, -// d 14408629386140014567655 -//4902939282056547857802241461782996702017713059974755104394739915140 -//6115284791024439062735788342744854120601660303926203867703556828005 -//8957203818114895398976594425537561271800850306 -// } -// } -//} - ); - - static private GOST3410ParamSetParameters cryptoProXchA = new GOST3410ParamSetParameters( - 1024, - new BigInteger("142011741597563481196368286022318089743276138395243738762872573441927459393512718973631166078467600360848946623567625795282774719212241929071046134208380636394084512691828894000571524625445295769349356752728956831541775441763139384457191755096847107846595662547942312293338483924514339614727760681880609734239"), - new BigInteger("91771529896554605945588149018382750217296858393520724172743325725474374979801"), - new BigInteger("133531813272720673433859519948319001217942375967847486899482359599369642528734712461590403327731821410328012529253871914788598993103310567744136196364803064721377826656898686468463277710150809401182608770201615324990468332931294920912776241137878030224355746606283971659376426832674269780880061631528163475887") - ); - - static - { - params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A, cryptoProA); - params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_B, cryptoProB); -// params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_C, cryptoProC); -// params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_D, cryptoProD); - params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_XchA, cryptoProXchA); -// params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_XchB, cryptoProXchA); -// params.put(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_XchC, cryptoProXchA); - - objIds.put("GostR3410-94-CryptoPro-A", CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A); - objIds.put("GostR3410-94-CryptoPro-B", CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_B); - objIds.put("GostR3410-94-CryptoPro-XchA", CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_XchA); - } - - /** - * return the GOST3410ParamSetParameters object for the given OID, null if it - * isn't present. - * - * @param oid an object identifier representing a named parameters, if present. - */ - public static GOST3410ParamSetParameters getByOID( - ASN1ObjectIdentifier oid) - { - return (GOST3410ParamSetParameters)params.get(oid); - } - - /** - * returns an enumeration containing the name strings for parameters - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } - - public static GOST3410ParamSetParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(name); - - if (oid != null) - { - return (GOST3410ParamSetParameters)params.get(oid); - } - - return null; - } - - public static ASN1ObjectIdentifier getOID(String name) - { - return (ASN1ObjectIdentifier)objIds.get(name); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410ParamSetParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410ParamSetParameters.java deleted file mode 100644 index 54e6a14..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410ParamSetParameters.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.bc.asn1.cryptopro; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class GOST3410ParamSetParameters - extends ASN1Object -{ - int keySize; - ASN1Integer p, q, a; - - public static GOST3410ParamSetParameters getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static GOST3410ParamSetParameters getInstance( - Object obj) - { - if(obj == null || obj instanceof GOST3410ParamSetParameters) - { - return (GOST3410ParamSetParameters)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new GOST3410ParamSetParameters((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid GOST3410Parameter: " + obj.getClass().getName()); - } - - public GOST3410ParamSetParameters( - int keySize, - BigInteger p, - BigInteger q, - BigInteger a) - { - this.keySize = keySize; - this.p = new ASN1Integer(p); - this.q = new ASN1Integer(q); - this.a = new ASN1Integer(a); - } - - public GOST3410ParamSetParameters( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - keySize = ((ASN1Integer)e.nextElement()).getValue().intValue(); - p = (ASN1Integer)e.nextElement(); - q = (ASN1Integer)e.nextElement(); - a = (ASN1Integer)e.nextElement(); - } - - /** - * @deprecated use getKeySize - */ - public int getLKeySize() - { - return keySize; - } - - public int getKeySize() - { - return keySize; - } - - public BigInteger getP() - { - return p.getPositiveValue(); - } - - public BigInteger getQ() - { - return q.getPositiveValue(); - } - - public BigInteger getA() - { - return a.getPositiveValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(keySize)); - v.add(p); - v.add(q); - v.add(a); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410PublicKeyAlgParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410PublicKeyAlgParameters.java deleted file mode 100644 index d7bf09a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/cryptopro/GOST3410PublicKeyAlgParameters.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.bc.asn1.cryptopro; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class GOST3410PublicKeyAlgParameters - extends ASN1Object -{ - private ASN1ObjectIdentifier publicKeyParamSet; - private ASN1ObjectIdentifier digestParamSet; - private ASN1ObjectIdentifier encryptionParamSet; - - public static GOST3410PublicKeyAlgParameters getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static GOST3410PublicKeyAlgParameters getInstance( - Object obj) - { - if (obj instanceof GOST3410PublicKeyAlgParameters) - { - return (GOST3410PublicKeyAlgParameters)obj; - } - - if(obj != null) - { - return new GOST3410PublicKeyAlgParameters(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public GOST3410PublicKeyAlgParameters( - ASN1ObjectIdentifier publicKeyParamSet, - ASN1ObjectIdentifier digestParamSet) - { - this.publicKeyParamSet = publicKeyParamSet; - this.digestParamSet = digestParamSet; - this.encryptionParamSet = null; - } - - public GOST3410PublicKeyAlgParameters( - ASN1ObjectIdentifier publicKeyParamSet, - ASN1ObjectIdentifier digestParamSet, - ASN1ObjectIdentifier encryptionParamSet) - { - this.publicKeyParamSet = publicKeyParamSet; - this.digestParamSet = digestParamSet; - this.encryptionParamSet = encryptionParamSet; - } - - public GOST3410PublicKeyAlgParameters( - ASN1Sequence seq) - { - this.publicKeyParamSet = (ASN1ObjectIdentifier)seq.getObjectAt(0); - this.digestParamSet = (ASN1ObjectIdentifier)seq.getObjectAt(1); - - if (seq.size() > 2) - { - this.encryptionParamSet = (ASN1ObjectIdentifier)seq.getObjectAt(2); - } - } - - public ASN1ObjectIdentifier getPublicKeyParamSet() - { - return publicKeyParamSet; - } - - public ASN1ObjectIdentifier getDigestParamSet() - { - return digestParamSet; - } - - public ASN1ObjectIdentifier getEncryptionParamSet() - { - return encryptionParamSet; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(publicKeyParamSet); - v.add(digestParamSet); - - if (encryptionParamSet != null) - { - v.add(encryptionParamSet); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/BidirectionalMap.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/BidirectionalMap.java deleted file mode 100644 index 03e43a9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/BidirectionalMap.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.asn1.eac; - -import java.util.Hashtable; - -public class BidirectionalMap extends Hashtable{ - private static final long serialVersionUID = -7457289971962812909L; - - Hashtable reverseMap = new Hashtable(); - - public Object getReverse(Object o) - { - return reverseMap.get(o); - } - - public Object put(Object key, Object o) - { - reverseMap.put(o, key); - return super.put(key, o); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificate.java deleted file mode 100644 index 863573d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificate.java +++ /dev/null @@ -1,317 +0,0 @@ -package org.bc.asn1.eac; - - -import java.io.IOException; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1ParsingException; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERApplicationSpecific; -import org.bc.asn1.DEROctetString; - - -/** - * an iso7816Certificate structure. - *

    - *

    - *  Certificate ::= SEQUENCE {
    - *      CertificateBody 		Iso7816CertificateBody,
    - *      signature               DER Application specific
    - *  }
    - * 
    - */ -public class CVCertificate - extends ASN1Object -{ - private CertificateBody certificateBody; - private byte[] signature; - private int valid; - private static int bodyValid = 0x01; - private static int signValid = 0x02; - public static final byte version_1 = 0x0; - - public static String ReferenceEncoding = "ISO-8859-1"; - - /** - * Sets the values of the certificate (body and signature). - * - * @param appSpe is a DERApplicationSpecific object containing body and signature. - * @throws IOException if tags or value are incorrect. - */ - private void setPrivateData(DERApplicationSpecific appSpe) - throws IOException - { - valid = 0; - if (appSpe.getApplicationTag() == EACTags.CARDHOLDER_CERTIFICATE) - { - ASN1InputStream content = new ASN1InputStream(appSpe.getContents()); - ASN1Primitive tmpObj; - while ((tmpObj = content.readObject()) != null) - { - DERApplicationSpecific aSpe; - if (tmpObj instanceof DERApplicationSpecific) - { - aSpe = (DERApplicationSpecific)tmpObj; - switch (aSpe.getApplicationTag()) - { - case EACTags.CERTIFICATE_CONTENT_TEMPLATE: - certificateBody = CertificateBody.getInstance(aSpe); - valid |= bodyValid; - break; - case EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP: - signature = aSpe.getContents(); - valid |= signValid; - break; - default: - throw new IOException("Invalid tag, not an Iso7816CertificateStructure :" + aSpe.getApplicationTag()); - } - } - else - { - throw new IOException("Invalid Object, not an Iso7816CertificateStructure"); - } - } - } - else - { - throw new IOException("not a CARDHOLDER_CERTIFICATE :" + appSpe.getApplicationTag()); - } - } - - /** - * Create an iso7816Certificate structure from an ASN1InputStream. - * - * @param aIS the byte stream to parse. - * @return the Iso7816CertificateStructure represented by the byte stream. - * @throws IOException if there is a problem parsing the data. - */ - public CVCertificate(ASN1InputStream aIS) - throws IOException - { - initFrom(aIS); - } - - private void initFrom(ASN1InputStream aIS) - throws IOException - { - ASN1Primitive obj; - while ((obj = aIS.readObject()) != null) - { - if (obj instanceof DERApplicationSpecific) - { - setPrivateData((DERApplicationSpecific)obj); - } - else - { - throw new IOException("Invalid Input Stream for creating an Iso7816CertificateStructure"); - } - } - } - - /** - * Create an iso7816Certificate structure from a DERApplicationSpecific. - * - * @param appSpe the DERApplicationSpecific object. - * @return the Iso7816CertificateStructure represented by the DERApplicationSpecific object. - * @throws IOException if there is a problem parsing the data. - */ - private CVCertificate(DERApplicationSpecific appSpe) - throws IOException - { - setPrivateData(appSpe); - } - - /** - * Create an iso7816Certificate structure from a body and its signature. - * - * @param body the Iso7816CertificateBody object containing the body. - * @param signature the byte array containing the signature - * @return the Iso7816CertificateStructure - * @throws IOException if there is a problem parsing the data. - */ - public CVCertificate(CertificateBody body, byte[] signature) - throws IOException - { - certificateBody = body; - this.signature = signature; - // patch remi - valid |= bodyValid; - valid |= signValid; - } - - /** - * Create an iso7816Certificate structure from an object. - * - * @param obj the Object to extract the certificate from. - * @return the Iso7816CertificateStructure represented by the byte stream. - * @throws IOException if there is a problem parsing the data. - */ - public static CVCertificate getInstance(Object obj) - { - if (obj instanceof CVCertificate) - { - return (CVCertificate)obj; - } - else if (obj != null) - { - try - { - return new CVCertificate(DERApplicationSpecific.getInstance(obj)); - } - catch (IOException e) - { - throw new ASN1ParsingException("unable to parse data: " + e.getMessage(), e); - } - } - - return null; - } - - /** - * Gives the signature of the whole body. Type of signature is given in - * the Iso7816CertificateBody.Iso7816PublicKey.ASN1ObjectIdentifier - * - * @return the signature of the body. - */ - public byte[] getSignature() - { - return signature; - } - - /** - * Gives the body of the certificate. - * - * @return the body. - */ - public CertificateBody getBody() - { - return certificateBody; - } - - /** - * @see org.bc.asn1.ASN1Object#toASN1Primitive() - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (valid != (signValid | bodyValid)) - { - return null; - } - v.add(certificateBody); - - try - { - v.add(new DERApplicationSpecific(false, EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP, new DEROctetString(signature))); - } - catch (IOException e) - { - throw new IllegalStateException("unable to convert signature!"); - } - - return new DERApplicationSpecific(EACTags.CARDHOLDER_CERTIFICATE, v); - } - - /** - * @return the Holder authorization and role (CVCA, DV, IS). - */ - public ASN1ObjectIdentifier getHolderAuthorization() - throws IOException - { - CertificateHolderAuthorization cha = certificateBody.getCertificateHolderAuthorization(); - return cha.getOid(); - } - - /** - * @return the date of the certificate generation - */ - public PackedDate getEffectiveDate() - throws IOException - { - return certificateBody.getCertificateEffectiveDate(); - } - - - /** - * @return the type of certificate (request or profile) - * value is either Iso7816CertificateBody.profileType - * or Iso7816CertificateBody.requestType. Any other value - * is not valid. - */ - public int getCertificateType() - { - return this.certificateBody.getCertificateType(); - } - - /** - * @return the date of the certificate generation - */ - public PackedDate getExpirationDate() - throws IOException - { - return certificateBody.getCertificateExpirationDate(); - } - - - /** - * return a bits field coded on one byte. For signification of the - * several bit see Iso7816CertificateHolderAuthorization - * - * @return role and access rigth - * @throws IOException - * @see CertificateHolderAuthorization - */ - public int getRole() - throws IOException - { - CertificateHolderAuthorization cha = certificateBody.getCertificateHolderAuthorization(); - return cha.getAccessRights(); - } - - /** - * @return the Authority Reference field of the certificate - * @throws IOException - */ - public CertificationAuthorityReference getAuthorityReference() - throws IOException - { - return certificateBody.getCertificationAuthorityReference(); - } - - /** - * @return the Holder Reference Field of the certificate - * @throws IOException - */ - public CertificateHolderReference getHolderReference() - throws IOException - { - return certificateBody.getCertificateHolderReference(); - } - - /** - * @return the bits corresponding to the role intented for the certificate - * See Iso7816CertificateHolderAuthorization static int for values - * @throws IOException - */ - public int getHolderAuthorizationRole() - throws IOException - { - int rights = certificateBody.getCertificateHolderAuthorization().getAccessRights(); - return rights & 0xC0; - } - - /** - * @return the bits corresponding the authorizations contained in the certificate - * See Iso7816CertificateHolderAuthorization static int for values - * @throws IOException - */ - public Flags getHolderAuthorizationRights() - throws IOException - { - return new Flags(certificateBody.getCertificateHolderAuthorization().getAccessRights() & 0x1F); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificateRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificateRequest.java deleted file mode 100644 index 785fa4f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CVCertificateRequest.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.bc.asn1.eac; - -import java.io.IOException; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1ParsingException; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.BERTags; -import org.bc.asn1.DERApplicationSpecific; -import org.bc.asn1.DEROctetString; - -//import java.math.BigInteger; - - -public class CVCertificateRequest - extends ASN1Object -{ - private CertificateBody certificateBody; - - private byte[] innerSignature = null; - private byte[] outerSignature = null; - - private int valid; - - private static int bodyValid = 0x01; - private static int signValid = 0x02; - - private CVCertificateRequest(DERApplicationSpecific request) - throws IOException - { - if (request.getApplicationTag() == EACTags.AUTHENTIFICATION_DATA) - { - ASN1Sequence seq = ASN1Sequence.getInstance(request.getObject(BERTags.SEQUENCE)); - - initCertBody(DERApplicationSpecific.getInstance(seq.getObjectAt(0))); - - outerSignature = DERApplicationSpecific.getInstance(seq.getObjectAt(seq.size() - 1)).getContents(); - } - else - { - initCertBody(request); - } - } - - private void initCertBody(DERApplicationSpecific request) - throws IOException - { - if (request.getApplicationTag() == EACTags.CARDHOLDER_CERTIFICATE) - { - ASN1Sequence seq = ASN1Sequence.getInstance(request.getObject(BERTags.SEQUENCE)); - for (Enumeration en = seq.getObjects(); en.hasMoreElements();) - { - DERApplicationSpecific obj = DERApplicationSpecific.getInstance(en.nextElement()); - switch (obj.getApplicationTag()) - { - case EACTags.CERTIFICATE_CONTENT_TEMPLATE: - certificateBody = CertificateBody.getInstance(obj); - valid |= bodyValid; - break; - case EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP: - innerSignature = obj.getContents(); - valid |= signValid; - break; - default: - throw new IOException("Invalid tag, not an CV Certificate Request element:" + obj.getApplicationTag()); - } - } - } - else - { - throw new IOException("not a CARDHOLDER_CERTIFICATE in request:" + request.getApplicationTag()); - } - } - - public static CVCertificateRequest getInstance(Object obj) - { - if (obj instanceof CVCertificateRequest) - { - return (CVCertificateRequest)obj; - } - else if (obj != null) - { - try - { - return new CVCertificateRequest(DERApplicationSpecific.getInstance(obj)); - } - catch (IOException e) - { - throw new ASN1ParsingException("unable to parse data: " + e.getMessage(), e); - } - } - - return null; - } - - ASN1ObjectIdentifier signOid = null; - ASN1ObjectIdentifier keyOid = null; - - public static byte[] ZeroArray = new byte[]{0}; - - - String strCertificateHolderReference; - - byte[] encodedAuthorityReference; - - int ProfileId; - - /** - * Returns the body of the certificate template - * - * @return the body. - */ - public CertificateBody getCertificateBody() - { - return certificateBody; - } - - /** - * Return the public key data object carried in the request - * @return the public key - */ - public PublicKeyDataObject getPublicKey() - { - return certificateBody.getPublicKey(); - } - - public byte[] getInnerSignature() - { - return innerSignature; - } - - public byte[] getOuterSignature() - { - return outerSignature; - } - - byte[] certificate = null; - protected String overSignerReference = null; - - public boolean hasOuterSignature() - { - return outerSignature != null; - } - - byte[] encoded; - - PublicKeyDataObject iso7816PubKey = null; - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certificateBody); - - try - { - v.add(new DERApplicationSpecific(false, EACTags.STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP, new DEROctetString(innerSignature))); - } - catch (IOException e) - { - throw new IllegalStateException("unable to convert signature!"); - } - - return new DERApplicationSpecific(EACTags.CARDHOLDER_CERTIFICATE, v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateBody.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateBody.java deleted file mode 100644 index 5e902c8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateBody.java +++ /dev/null @@ -1,460 +0,0 @@ -package org.bc.asn1.eac; - -import java.io.IOException; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.BERTags; -import org.bc.asn1.DERApplicationSpecific; -import org.bc.asn1.DEROctetString; - - -/** - * an Iso7816CertificateBody structure. - *

    - *

    - *  CertificateBody ::= SEQUENCE {
    - *  	// version of the certificate format. Must be 0 (version 1)
    - *      CertificateProfileIdentifer 		DERApplicationSpecific,
    - *      //uniquely identifies the issuinng CA's signature key pair
    - *      // contains the iso3166-1 alpha2 encoded country code, the
    - *      // name of issuer and the sequence number of the key pair.
    - *      CertificationAuthorityReference		DERApplicationSpecific,
    - *      // stores the encoded public key
    - *      PublicKey							Iso7816PublicKey,
    - *      //associates the public key contained in the certificate with a unique name
    - *      // contains the iso3166-1 alpha2 encoded country code, the
    - *      // name of the holder and the sequence number of the key pair.
    - *      certificateHolderReference			DERApplicationSpecific,
    - *      // Encodes the role of the holder (i.e. CVCA, DV, IS) and assigns read/write
    - *      // access rights to data groups storing sensitive data
    - *      certificateHolderAuthorization		Iso7816CertificateHolderAuthorization,
    - *      // the date of the certificate generation
    - *      CertificateEffectiveDate			DERApplicationSpecific,
    - *      // the date after wich the certificate expires
    - *      certificateExpirationDate			DERApplicationSpecific
    - *  }
    - * 
    - */ -public class CertificateBody - extends ASN1Object -{ - ASN1InputStream seq; - private DERApplicationSpecific certificateProfileIdentifier;// version of the certificate format. Must be 0 (version 1) - private DERApplicationSpecific certificationAuthorityReference;//uniquely identifies the issuinng CA's signature key pair - private PublicKeyDataObject publicKey;// stores the encoded public key - private DERApplicationSpecific certificateHolderReference;//associates the public key contained in the certificate with a unique name - private CertificateHolderAuthorization certificateHolderAuthorization;// Encodes the role of the holder (i.e. CVCA, DV, IS) and assigns read/write access rights to data groups storing sensitive data - private DERApplicationSpecific certificateEffectiveDate;// the date of the certificate generation - private DERApplicationSpecific certificateExpirationDate;// the date after wich the certificate expires - private int certificateType = 0;// bit field of initialized data. This will tell us if the data are valid. - private static final int CPI = 0x01;//certificate Profile Identifier - private static final int CAR = 0x02;//certification Authority Reference - private static final int PK = 0x04;//public Key - private static final int CHR = 0x08;//certificate Holder Reference - private static final int CHA = 0x10;//certificate Holder Authorization - private static final int CEfD = 0x20;//certificate Effective Date - private static final int CExD = 0x40;//certificate Expiration Date - - public static final int profileType = 0x7f;//Profile type Certificate - public static final int requestType = 0x0D;// Request type Certificate - - private void setIso7816CertificateBody(DERApplicationSpecific appSpe) - throws IOException - { - byte[] content; - if (appSpe.getApplicationTag() == EACTags.CERTIFICATE_CONTENT_TEMPLATE) - { - content = appSpe.getContents(); - } - else - { - throw new IOException("Bad tag : not an iso7816 CERTIFICATE_CONTENT_TEMPLATE"); - } - ASN1InputStream aIS = new ASN1InputStream(content); - ASN1Primitive obj; - while ((obj = aIS.readObject()) != null) - { - DERApplicationSpecific aSpe; - - if (obj instanceof DERApplicationSpecific) - { - aSpe = (DERApplicationSpecific)obj; - } - else - { - throw new IOException("Not a valid iso7816 content : not a DERApplicationSpecific Object :" + EACTags.encodeTag(appSpe) + obj.getClass()); - } - switch (aSpe.getApplicationTag()) - { - case EACTags.INTERCHANGE_PROFILE: - setCertificateProfileIdentifier(aSpe); - break; - case EACTags.ISSUER_IDENTIFICATION_NUMBER: - setCertificationAuthorityReference(aSpe); - break; - case EACTags.CARDHOLDER_PUBLIC_KEY_TEMPLATE: - setPublicKey(PublicKeyDataObject.getInstance(aSpe.getObject(BERTags.SEQUENCE))); - break; - case EACTags.CARDHOLDER_NAME: - setCertificateHolderReference(aSpe); - break; - case EACTags.CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE: - setCertificateHolderAuthorization(new CertificateHolderAuthorization(aSpe)); - break; - case EACTags.APPLICATION_EFFECTIVE_DATE: - setCertificateEffectiveDate(aSpe); - break; - case EACTags.APPLICATION_EXPIRATION_DATE: - setCertificateExpirationDate(aSpe); - break; - default: - certificateType = 0; - throw new IOException("Not a valid iso7816 DERApplicationSpecific tag " + aSpe.getApplicationTag()); - } - } - } - - /** - * builds an Iso7816CertificateBody by settings each parameters. - * - * @param certificateProfileIdentifier - * @param certificationAuthorityReference - * - * @param publicKey - * @param certificateHolderReference - * @param certificateHolderAuthorization - * @param certificateEffectiveDate - * @param certificateExpirationDate - * @throws IOException - */ - public CertificateBody( - DERApplicationSpecific certificateProfileIdentifier, - CertificationAuthorityReference certificationAuthorityReference, - PublicKeyDataObject publicKey, - CertificateHolderReference certificateHolderReference, - CertificateHolderAuthorization certificateHolderAuthorization, - PackedDate certificateEffectiveDate, - PackedDate certificateExpirationDate - ) - { - setCertificateProfileIdentifier(certificateProfileIdentifier); - setCertificationAuthorityReference(new DERApplicationSpecific( - EACTags.ISSUER_IDENTIFICATION_NUMBER, certificationAuthorityReference.getEncoded())); - setPublicKey(publicKey); - setCertificateHolderReference(new DERApplicationSpecific( - EACTags.CARDHOLDER_NAME, certificateHolderReference.getEncoded())); - setCertificateHolderAuthorization(certificateHolderAuthorization); - try - { - setCertificateEffectiveDate(new DERApplicationSpecific( - false, EACTags.APPLICATION_EFFECTIVE_DATE, new DEROctetString(certificateEffectiveDate.getEncoding()))); - setCertificateExpirationDate(new DERApplicationSpecific( - false, EACTags.APPLICATION_EXPIRATION_DATE, new DEROctetString(certificateExpirationDate.getEncoding()))); - } - catch (IOException e) - { - throw new IllegalArgumentException("unable to encode dates: " + e.getMessage()); - } - } - - /** - * builds an Iso7816CertificateBody with an ASN1InputStream. - * - * @param obj DERApplicationSpecific containing the whole body. - * @throws IOException if the body is not valid. - */ - private CertificateBody(DERApplicationSpecific obj) - throws IOException - { - setIso7816CertificateBody(obj); - } - - /** - * create a profile type Iso7816CertificateBody. - * - * @return return the "profile" type certificate body. - * @throws IOException if the DERApplicationSpecific cannot be created. - */ - private ASN1Primitive profileToASN1Object() - throws IOException - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certificateProfileIdentifier); - v.add(certificationAuthorityReference); - v.add(new DERApplicationSpecific(false, EACTags.CARDHOLDER_PUBLIC_KEY_TEMPLATE, publicKey)); - v.add(certificateHolderReference); - v.add(certificateHolderAuthorization); - v.add(certificateEffectiveDate); - v.add(certificateExpirationDate); - return new DERApplicationSpecific(EACTags.CERTIFICATE_CONTENT_TEMPLATE, v); - } - - private void setCertificateProfileIdentifier(DERApplicationSpecific certificateProfileIdentifier) - throws IllegalArgumentException { - if (certificateProfileIdentifier.getApplicationTag() == EACTags.INTERCHANGE_PROFILE) { - this.certificateProfileIdentifier = certificateProfileIdentifier; - certificateType |= CPI; - } - else - throw new IllegalArgumentException("Not an Iso7816Tags.INTERCHANGE_PROFILE tag :"+ EACTags.encodeTag(certificateProfileIdentifier)); - } - - private void setCertificateHolderReference(DERApplicationSpecific certificateHolderReference) - throws IllegalArgumentException { - if (certificateHolderReference.getApplicationTag() == EACTags.CARDHOLDER_NAME) { - this.certificateHolderReference = certificateHolderReference; - certificateType |= CHR; - } - else - throw new IllegalArgumentException("Not an Iso7816Tags.CARDHOLDER_NAME tag"); - } - - /** - * set the CertificationAuthorityReference. - * @param certificationAuthorityReference the DERApplicationSpecific containing the CertificationAuthorityReference. - * @throws IllegalArgumentException if the DERApplicationSpecific is not valid. - */ - private void setCertificationAuthorityReference( - DERApplicationSpecific certificationAuthorityReference) - throws IllegalArgumentException { - if (certificationAuthorityReference.getApplicationTag() == EACTags.ISSUER_IDENTIFICATION_NUMBER) { - this.certificationAuthorityReference = certificationAuthorityReference; - certificateType |= CAR; - } - else - throw new IllegalArgumentException("Not an Iso7816Tags.ISSUER_IDENTIFICATION_NUMBER tag"); - } - - /** - * set the public Key - * @param publicKey : the DERApplicationSpecific containing the public key - * @throws java.io.IOException - */ - private void setPublicKey(PublicKeyDataObject publicKey) - { - this.publicKey = PublicKeyDataObject.getInstance(publicKey); - this.certificateType |= PK; - } - - /** - * create a request type Iso7816CertificateBody. - * - * @return return the "request" type certificate body. - * @throws IOException if the DERApplicationSpecific cannot be created. - */ - private ASN1Primitive requestToASN1Object() - throws IOException - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certificateProfileIdentifier); - v.add(new DERApplicationSpecific(false, EACTags.CARDHOLDER_PUBLIC_KEY_TEMPLATE, publicKey)); - v.add(certificateHolderReference); - return new DERApplicationSpecific(EACTags.CERTIFICATE_CONTENT_TEMPLATE, v); - } - - /** - * create a "request" or "profile" type Iso7816CertificateBody according to the variables sets. - * - * @return return the ASN1Primitive representing the "request" or "profile" type certificate body. - * @throws IOException if the DERApplicationSpecific cannot be created or if data are missings to create a valid certificate. - */ - public ASN1Primitive toASN1Primitive() - { - try - { - if (certificateType == profileType) - { - return profileToASN1Object(); - } - if (certificateType == requestType) - { - return requestToASN1Object(); - } - } - catch (IOException e) - { - return null; - } - return null; - } - - /** - * gives the type of the certificate (value should be profileType or requestType if all data are set). - * - * @return the int representing the data already set. - */ - public int getCertificateType() - { - return certificateType; - } - - /** - * Gives an instance of Iso7816CertificateBody taken from Object obj - * - * @param obj is the Object to extract the certificate body from. - * @return the Iso7816CertificateBody taken from Object obj. - * @throws IOException if object is not valid. - */ - public static CertificateBody getInstance(Object obj) - throws IOException - { - if (obj instanceof CertificateBody) - { - return (CertificateBody)obj; - } - else if (obj != null) - { - return new CertificateBody(DERApplicationSpecific.getInstance(obj)); - } - - return null; - } - - /** - * @return the date of the certificate generation - */ - public PackedDate getCertificateEffectiveDate() - { - if ((this.certificateType & CertificateBody.CEfD) == - CertificateBody.CEfD) - { - return new PackedDate(certificateEffectiveDate.getContents()); - } - return null; - } - - /** - * set the date of the certificate generation - * - * @param ced DERApplicationSpecific containing the date of the certificate generation - * @throws IllegalArgumentException if the tag is not Iso7816Tags.APPLICATION_EFFECTIVE_DATE - */ - private void setCertificateEffectiveDate(DERApplicationSpecific ced) - throws IllegalArgumentException - { - if (ced.getApplicationTag() == EACTags.APPLICATION_EFFECTIVE_DATE) - { - this.certificateEffectiveDate = ced; - certificateType |= CEfD; - } - else - { - throw new IllegalArgumentException("Not an Iso7816Tags.APPLICATION_EFFECTIVE_DATE tag :" + EACTags.encodeTag(ced)); - } - } - - /** - * @return the date after wich the certificate expires - */ - public PackedDate getCertificateExpirationDate() - throws IOException - { - if ((this.certificateType & CertificateBody.CExD) == - CertificateBody.CExD) - { - return new PackedDate(certificateExpirationDate.getContents()); - } - throw new IOException("certificate Expiration Date not set"); - } - - /** - * set the date after wich the certificate expires - * - * @param ced DERApplicationSpecific containing the date after wich the certificate expires - * @throws IllegalArgumentException if the tag is not Iso7816Tags.APPLICATION_EXPIRATION_DATE - */ - private void setCertificateExpirationDate(DERApplicationSpecific ced) - throws IllegalArgumentException - { - if (ced.getApplicationTag() == EACTags.APPLICATION_EXPIRATION_DATE) - { - this.certificateExpirationDate = ced; - certificateType |= CExD; - } - else - { - throw new IllegalArgumentException("Not an Iso7816Tags.APPLICATION_EXPIRATION_DATE tag"); - } - } - - /** - * the Iso7816CertificateHolderAuthorization encodes the role of the holder - * (i.e. CVCA, DV, IS) and assigns read/write access rights to data groups - * storing sensitive data. This functions returns the Certificate Holder - * Authorization - * - * @return the Iso7816CertificateHolderAuthorization - */ - public CertificateHolderAuthorization getCertificateHolderAuthorization() - throws IOException - { - if ((this.certificateType & CertificateBody.CHA) == - CertificateBody.CHA) - { - return certificateHolderAuthorization; - } - throw new IOException("Certificate Holder Authorisation not set"); - } - - /** - * set the CertificateHolderAuthorization - * - * @param cha the Certificate Holder Authorization - */ - private void setCertificateHolderAuthorization( - CertificateHolderAuthorization cha) - { - this.certificateHolderAuthorization = cha; - certificateType |= CHA; - } - - /** - * certificateHolderReference : associates the public key contained in the certificate with a unique name - * - * @return the certificateHolderReference. - */ - public CertificateHolderReference getCertificateHolderReference() - { - return new CertificateHolderReference(certificateHolderReference.getContents()); - } - - /** - * CertificateProfileIdentifier : version of the certificate format. Must be 0 (version 1) - * - * @return the CertificateProfileIdentifier - */ - public DERApplicationSpecific getCertificateProfileIdentifier() - { - return certificateProfileIdentifier; - } - - /** - * get the certificationAuthorityReference - * certificationAuthorityReference : uniquely identifies the issuinng CA's signature key pair - * - * @return the certificationAuthorityReference - */ - public CertificationAuthorityReference getCertificationAuthorityReference() - throws IOException - { - if ((this.certificateType & CertificateBody.CAR) == - CertificateBody.CAR) - { - return new CertificationAuthorityReference(certificationAuthorityReference.getContents()); - } - throw new IOException("Certification authority reference not set"); - } - - /** - * @return the PublicKey - */ - public PublicKeyDataObject getPublicKey() - { - return publicKey; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderAuthorization.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderAuthorization.java deleted file mode 100644 index bd0d7af..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderAuthorization.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.bc.asn1.eac; - -import java.io.IOException; -import java.util.Hashtable; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERApplicationSpecific; -import org.bc.util.Integers; - -/** - * an Iso7816CertificateHolderAuthorization structure. - *

    - *

    - *  Certificate Holder Authorization ::= SEQUENCE {
    - *  	// specifies the format and the rules for the evaluation of the authorization
    - *  	// level
    - *  	ASN1ObjectIdentifier		oid,
    - *  	// access rights
    - *  	DERApplicationSpecific	accessRights,
    - *  }
    - * 
    - */ -public class CertificateHolderAuthorization - extends ASN1Object -{ - ASN1ObjectIdentifier oid; - DERApplicationSpecific accessRights; - public static final ASN1ObjectIdentifier id_role_EAC = EACObjectIdentifiers.bsi_de.branch("3.1.2.1"); - public static final int CVCA = 0xC0; - public static final int DV_DOMESTIC = 0x80; - public static final int DV_FOREIGN = 0x40; - public static final int IS = 0; - public static final int RADG4 = 0x02;//Read Access to DG4 (Iris) - public static final int RADG3 = 0x01;//Read Access to DG3 (fingerprint) - - static Hashtable RightsDecodeMap = new Hashtable(); - static BidirectionalMap AuthorizationRole = new BidirectionalMap(); - static Hashtable ReverseMap = new Hashtable(); - - static - { - RightsDecodeMap.put(Integers.valueOf(RADG4), "RADG4"); - RightsDecodeMap.put(Integers.valueOf(RADG3), "RADG3"); - - AuthorizationRole.put(Integers.valueOf(CVCA), "CVCA"); - AuthorizationRole.put(Integers.valueOf(DV_DOMESTIC), "DV_DOMESTIC"); - AuthorizationRole.put(Integers.valueOf(DV_FOREIGN), "DV_FOREIGN"); - AuthorizationRole.put(Integers.valueOf(IS), "IS"); - - /* - for (int i : RightsDecodeMap.keySet()) - ReverseMap.put(RightsDecodeMap.get(i), i); - - for (int i : AuthorizationRole.keySet()) - ReverseMap.put(AuthorizationRole.get(i), i); - */ - } - - public static String GetRoleDescription(int i) - { - return (String)AuthorizationRole.get(Integers.valueOf(i)); - } - - public static int GetFlag(String description) - { - Integer i = (Integer)AuthorizationRole.getReverse(description); - if (i == null) - { - throw new IllegalArgumentException("Unknown value " + description); - } - - return i.intValue(); - } - - private void setPrivateData(ASN1InputStream cha) - throws IOException - { - ASN1Primitive obj; - obj = cha.readObject(); - if (obj instanceof ASN1ObjectIdentifier) - { - this.oid = (ASN1ObjectIdentifier)obj; - } - else - { - throw new IllegalArgumentException("no Oid in CerticateHolderAuthorization"); - } - obj = cha.readObject(); - if (obj instanceof DERApplicationSpecific) - { - this.accessRights = (DERApplicationSpecific)obj; - } - else - { - throw new IllegalArgumentException("No access rights in CerticateHolderAuthorization"); - } - } - - - /** - * create an Iso7816CertificateHolderAuthorization according to the parameters - * - * @param oid Object Identifier : specifies the format and the rules for the - * evaluatioin of the authorization level. - * @param rights specifies the access rights - * @throws IOException - */ - public CertificateHolderAuthorization(ASN1ObjectIdentifier oid, int rights) - throws IOException - { - setOid(oid); - setAccessRights((byte)rights); - } - - /** - * create an Iso7816CertificateHolderAuthorization according to the {@link DERApplicationSpecific} - * - * @param aSpe the DERApplicationSpecific containing the data - * @throws IOException - */ - public CertificateHolderAuthorization(DERApplicationSpecific aSpe) - throws IOException - { - if (aSpe.getApplicationTag() == EACTags.CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE) - { - setPrivateData(new ASN1InputStream(aSpe.getContents())); - } - } - - /** - * @return containing the access rights - */ - public int getAccessRights() - { - return accessRights.getContents()[0] & 0xff; - } - - /** - * create a DERApplicationSpecific and set the access rights to "rights" - * - * @param rights byte containing the rights. - */ - private void setAccessRights(byte rights) - { - byte[] accessRights = new byte[1]; - accessRights[0] = rights; - this.accessRights = new DERApplicationSpecific( - EACTags.getTag(EACTags.DISCRETIONARY_DATA), accessRights); - } - - /** - * @return the Object identifier - */ - public ASN1ObjectIdentifier getOid() - { - return oid; - } - - /** - * set the Object Identifier - * - * @param oid {@link ASN1ObjectIdentifier} containing the Object Identifier - */ - private void setOid(ASN1ObjectIdentifier oid) - { - this.oid = oid; - } - - /** - * return the Certificate Holder Authorization as a DERApplicationSpecific Object - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oid); - v.add(accessRights); - - return new DERApplicationSpecific(EACTags.CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE, v); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderReference.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderReference.java deleted file mode 100644 index a7e4d20..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificateHolderReference.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bc.asn1.eac; - -import java.io.UnsupportedEncodingException; - -public class CertificateHolderReference -{ - private static final String ReferenceEncoding = "ISO-8859-1"; - - private String countryCode; - private String holderMnemonic; - private String sequenceNumber; - - public CertificateHolderReference(String countryCode, String holderMnemonic, String sequenceNumber) - { - this.countryCode = countryCode; - this.holderMnemonic = holderMnemonic; - this.sequenceNumber = sequenceNumber; - } - - CertificateHolderReference(byte[] contents) - { - try - { - String concat = new String(contents, ReferenceEncoding); - - this.countryCode = concat.substring(0, 2); - this.holderMnemonic = concat.substring(2, concat.length() - 5); - - this.sequenceNumber = concat.substring(concat.length() - 5); - } - catch (UnsupportedEncodingException e) - { - throw new IllegalStateException(e.toString()); - } - } - - public String getCountryCode() - { - return countryCode; - } - - public String getHolderMnemonic() - { - return holderMnemonic; - } - - public String getSequenceNumber() - { - return sequenceNumber; - } - - - public byte[] getEncoded() - { - String ref = countryCode + holderMnemonic + sequenceNumber; - - try - { - return ref.getBytes(ReferenceEncoding); - } - catch (UnsupportedEncodingException e) - { - throw new IllegalStateException(e.toString()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificationAuthorityReference.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificationAuthorityReference.java deleted file mode 100644 index 52fe45a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/CertificationAuthorityReference.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.asn1.eac; - -public class CertificationAuthorityReference - extends CertificateHolderReference -{ - public CertificationAuthorityReference(String countryCode, String holderMnemonic, String sequenceNumber) - { - super(countryCode, holderMnemonic, sequenceNumber); - } - - CertificationAuthorityReference(byte[] contents) - { - super(contents); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACObjectIdentifiers.java deleted file mode 100644 index 68f5962..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACObjectIdentifiers.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bc.asn1.eac; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface EACObjectIdentifiers -{ - // bsi-de OBJECT IDENTIFIER ::= { - // itu-t(0) identified-organization(4) etsi(0) - // reserved(127) etsi-identified-organization(0) 7 - // } - static final ASN1ObjectIdentifier bsi_de = new ASN1ObjectIdentifier("0.4.0.127.0.7"); - - // id-PK OBJECT IDENTIFIER ::= { - // bsi-de protocols(2) smartcard(2) 1 - // } - static final ASN1ObjectIdentifier id_PK = bsi_de.branch("2.2.1"); - - static final ASN1ObjectIdentifier id_PK_DH = id_PK.branch("1"); - static final ASN1ObjectIdentifier id_PK_ECDH = id_PK.branch("2"); - - // id-CA OBJECT IDENTIFIER ::= { - // bsi-de protocols(2) smartcard(2) 3 - // } - static final ASN1ObjectIdentifier id_CA = bsi_de.branch("2.2.3"); - static final ASN1ObjectIdentifier id_CA_DH = id_CA.branch("1"); - static final ASN1ObjectIdentifier id_CA_DH_3DES_CBC_CBC = id_CA_DH.branch("1"); - static final ASN1ObjectIdentifier id_CA_ECDH = id_CA.branch("2"); - static final ASN1ObjectIdentifier id_CA_ECDH_3DES_CBC_CBC = id_CA_ECDH.branch("1"); - - // - // id-TA OBJECT IDENTIFIER ::= { - // bsi-de protocols(2) smartcard(2) 2 - // } - static final ASN1ObjectIdentifier id_TA = bsi_de.branch("2.2.2"); - - static final ASN1ObjectIdentifier id_TA_RSA = id_TA.branch("1"); - static final ASN1ObjectIdentifier id_TA_RSA_v1_5_SHA_1 = id_TA_RSA .branch("1"); - static final ASN1ObjectIdentifier id_TA_RSA_v1_5_SHA_256 = id_TA_RSA.branch("2"); - static final ASN1ObjectIdentifier id_TA_RSA_PSS_SHA_1 = id_TA_RSA.branch("3"); - static final ASN1ObjectIdentifier id_TA_RSA_PSS_SHA_256 = id_TA_RSA.branch("4"); - static final ASN1ObjectIdentifier id_TA_RSA_v1_5_SHA_512 = id_TA_RSA.branch("5"); - static final ASN1ObjectIdentifier id_TA_RSA_PSS_SHA_512 = id_TA_RSA.branch("6"); - static final ASN1ObjectIdentifier id_TA_ECDSA = id_TA.branch("2"); - static final ASN1ObjectIdentifier id_TA_ECDSA_SHA_1 = id_TA_ECDSA.branch("1"); - static final ASN1ObjectIdentifier id_TA_ECDSA_SHA_224 = id_TA_ECDSA.branch("2"); - static final ASN1ObjectIdentifier id_TA_ECDSA_SHA_256 = id_TA_ECDSA.branch("3"); - static final ASN1ObjectIdentifier id_TA_ECDSA_SHA_384 = id_TA_ECDSA.branch("4"); - static final ASN1ObjectIdentifier id_TA_ECDSA_SHA_512 = id_TA_ECDSA.branch("5"); - - /** - * id-EAC-ePassport OBJECT IDENTIFIER ::= { - * bsi-de applications(3) mrtd(1) roles(2) 1} - */ - static final ASN1ObjectIdentifier id_EAC_ePassport = bsi_de.branch("3.1.2.1"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACTags.java deleted file mode 100644 index 8e1e128..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/EACTags.java +++ /dev/null @@ -1,195 +0,0 @@ -package org.bc.asn1.eac; - -import org.bc.asn1.BERTags; -import org.bc.asn1.DERApplicationSpecific; - -public class EACTags -{ - public static final int OBJECT_IDENTIFIER = 0x06; - public static final int COUNTRY_CODE_NATIONAL_DATA = 0x41; - public static final int ISSUER_IDENTIFICATION_NUMBER = 0x02; //0x42; - public static final int CARD_SERVICE_DATA = 0x43; - public static final int INITIAL_ACCESS_DATA = 0x44; - public static final int CARD_ISSUER_DATA = 0x45; - public static final int PRE_ISSUING_DATA = 0x46; - public static final int CARD_CAPABILITIES = 0x47; - public static final int STATUS_INFORMATION = 0x48; - public static final int EXTENDED_HEADER_LIST = 0x4D; - public static final int APPLICATION_IDENTIFIER = 0x4F; - public static final int APPLICATION_LABEL = 0x50; - public static final int FILE_REFERENCE = 0x51; - public static final int COMMAND_TO_PERFORM = 0x52; - public static final int DISCRETIONARY_DATA = 0x53; - public static final int OFFSET_DATA_OBJECT = 0x54; - public static final int TRACK1_APPLICATION = 0x56; - public static final int TRACK2_APPLICATION = 0x57; - public static final int TRACK3_APPLICATION = 0x58; - public static final int CARD_EXPIRATION_DATA = 0x59; - public static final int PRIMARY_ACCOUNT_NUMBER = 0x5A;// PAN - public static final int NAME = 0x5B; - public static final int TAG_LIST = 0x5C; - public static final int HEADER_LIST = 0x5D; - public static final int LOGIN_DATA = 0x5E; - public static final int CARDHOLDER_NAME = 0x20; // 0x5F20; - public static final int TRACK1_CARD = 0x5F21; - public static final int TRACK2_CARD = 0x5F22; - public static final int TRACK3_CARD = 0x5F23; - public static final int APPLICATION_EXPIRATION_DATE = 0x24; // 0x5F24; - public static final int APPLICATION_EFFECTIVE_DATE = 0x25; // 0x5F25; - public static final int CARD_EFFECTIVE_DATE = 0x5F26; - public static final int INTERCHANGE_CONTROL = 0x5F27; - public static final int COUNTRY_CODE = 0x5F28; - public static final int INTERCHANGE_PROFILE = 0x29; // 0x5F29; - public static final int CURRENCY_CODE = 0x5F2A; - public static final int DATE_OF_BIRTH = 0x5F2B; - public static final int CARDHOLDER_NATIONALITY = 0x5F2C; - public static final int LANGUAGE_PREFERENCES = 0x5F2D; - public static final int CARDHOLDER_BIOMETRIC_DATA = 0x5F2E; - public static final int PIN_USAGE_POLICY = 0x5F2F; - public static final int SERVICE_CODE = 0x5F30; - public static final int TRANSACTION_COUNTER = 0x5F32; - public static final int TRANSACTION_DATE = 0x5F33; - public static final int CARD_SEQUENCE_NUMBER = 0x5F34; - public static final int SEX = 0x5F35; - public static final int CURRENCY_EXPONENT = 0x5F36; - public static final int STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP = 0x37; // 0x5F37; - public static final int SIGNATURE = 0x5F37; - public static final int STATIC_INTERNAL_AUTHENTIFICATION_FIRST_DATA = 0x5F38; - public static final int STATIC_INTERNAL_AUTHENTIFICATION_SECOND_DATA = 0x5F39; - public static final int DYNAMIC_INTERNAL_AUTHENTIFICATION = 0x5F3A; - public static final int DYNAMIC_EXTERNAL_AUTHENTIFICATION = 0x5F3B; - public static final int DYNAMIC_MUTUAL_AUTHENTIFICATION = 0x5F3C; - public static final int CARDHOLDER_PORTRAIT_IMAGE = 0x5F40; - public static final int ELEMENT_LIST = 0x5F41; - public static final int ADDRESS = 0x5F42; - public static final int CARDHOLDER_HANDWRITTEN_SIGNATURE = 0x5F43; - public static final int APPLICATION_IMAGE = 0x5F44; - public static final int DISPLAY_IMAGE = 0x5F45; - public static final int TIMER = 0x5F46; - public static final int MESSAGE_REFERENCE = 0x5F47; - public static final int CARDHOLDER_PRIVATE_KEY = 0x5F48; - public static final int CARDHOLDER_PUBLIC_KEY = 0x5F49; - public static final int CERTIFICATION_AUTHORITY_PUBLIC_KEY = 0x5F4A; - public static final int DEPRECATED = 0x5F4B; - public static final int CERTIFICATE_HOLDER_AUTHORIZATION = 0x5F4C;// Not yet defined in iso7816. The allocation is requested - public static final int INTEGRATED_CIRCUIT_MANUFACTURER_ID = 0x5F4D; - public static final int CERTIFICATE_CONTENT = 0x5F4E; - public static final int UNIFORM_RESOURCE_LOCATOR = 0x5F50; - public static final int ANSWER_TO_RESET = 0x5F51; - public static final int HISTORICAL_BYTES = 0x5F52; - public static final int DIGITAL_SIGNATURE = 0x5F3D; - public static final int APPLICATION_TEMPLATE = 0x61; - public static final int FCP_TEMPLATE = 0x62; - public static final int WRAPPER = 0x63; - public static final int FMD_TEMPLATE = 0x64; - public static final int CARDHOLDER_RELATIVE_DATA = 0x65; - public static final int CARD_DATA = 0x66; - public static final int AUTHENTIFICATION_DATA = 0x67; - public static final int SPECIAL_USER_REQUIREMENTS = 0x68; - public static final int LOGIN_TEMPLATE = 0x6A; - public static final int QUALIFIED_NAME = 0x6B; - public static final int CARDHOLDER_IMAGE_TEMPLATE = 0x6C; - public static final int APPLICATION_IMAGE_TEMPLATE = 0x6D; - public static final int APPLICATION_RELATED_DATA = 0x6E; - public static final int FCI_TEMPLATE = 0x6F; - public static final int DISCRETIONARY_DATA_OBJECTS = 0x73; - public static final int COMPATIBLE_TAG_ALLOCATION_AUTHORITY = 0x78; - public static final int COEXISTANT_TAG_ALLOCATION_AUTHORITY = 0x79; - public static final int SECURITY_SUPPORT_TEMPLATE = 0x7A; - public static final int SECURITY_ENVIRONMENT_TEMPLATE = 0x7B; - public static final int DYNAMIC_AUTHENTIFICATION_TEMPLATE = 0x7C; - public static final int SECURE_MESSAGING_TEMPLATE = 0x7D; - public static final int NON_INTERINDUSTRY_DATA_OBJECT_NESTING_TEMPLATE = 0x7E; - public static final int DISPLAY_CONTROL = 0x7F20; - public static final int CARDHOLDER_CERTIFICATE = 0x21; // 0x7F21; - public static final int CV_CERTIFICATE = 0x7F21; - public static final int CARDHOLER_REQUIREMENTS_INCLUDED_FEATURES = 0x7F22; - public static final int CARDHOLER_REQUIREMENTS_EXCLUDED_FEATURES = 0x7F23; - public static final int BIOMETRIC_DATA_TEMPLATE = 0x7F2E; - public static final int DIGITAL_SIGNATURE_BLOCK = 0x7F3D; - public static final int CARDHOLDER_PRIVATE_KEY_TEMPLATE = 0x7F48; - public static final int CARDHOLDER_PUBLIC_KEY_TEMPLATE = 0x49; // 0x7F49; - public static final int CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE = 0x4C; // 0x7F4C; - public static final int CERTIFICATE_CONTENT_TEMPLATE = 0x4E; // 0x7F4E; - public static final int CERTIFICATE_BODY = 0x4E; // 0x7F4E; - public static final int BIOMETRIC_INFORMATION_TEMPLATE = 0x7F60; - public static final int BIOMETRIC_INFORMATION_GROUP_TEMPLATE = 0x7F61; - - public static int getTag(int encodedTag) { - /* - int i; - for (i = 24; i>=0; i-=8) { - if (((0xFF<> i); - } - return 0; - */ - return decodeTag(encodedTag); - } - - public static int getTagNo(int tag) { - int i; - for (i = 24; i>=0; i -=8) { - if (((0xFF< 31) - { - retValue |= 0x1F; - retValue <<= 8; - - int currentByte = tag & 0x7F; - retValue |= currentByte; - tag >>= 7; - - while (tag > 0) - { - retValue |= 0x80; - retValue <<= 8; - - currentByte = tag & 0x7F; - tag >>= 7; - } - } - else - retValue |= tag; - - return retValue; - } - - public static int decodeTag(int tag) - { - int retValue = 0; - boolean multiBytes = false; - for (int i = 24; i>=0; i -=8) { - int currentByte = tag >> i & 0xFF; - if (currentByte == 0) - continue; - - if (multiBytes) - { - retValue <<= 7; - retValue |= currentByte & 0x7F; - } - else if ((currentByte & 0x1F) == 0x1F) - { - multiBytes = true; - } - else - return currentByte & 0x1F; // higher order bit are for DER.Constructed and type - } - return retValue; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/ECDSAPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/ECDSAPublicKey.java deleted file mode 100644 index 70a34bc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/ECDSAPublicKey.java +++ /dev/null @@ -1,341 +0,0 @@ -package org.bc.asn1.eac; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * an Iso7816ECDSAPublicKeyStructure structure. - *

    - *

    - *  Certificate Holder Authorization ::= SEQUENCE {
    - *  	ASN1TaggedObject primeModulusP;		// OPTIONAL
    - *  	ASN1TaggedObject firstCoefA;			// OPTIONAL
    - *  	ASN1TaggedObject secondCoefB;		// OPTIONAL
    - *  	ASN1TaggedObject basePointG;			// OPTIONAL
    - *  	ASN1TaggedObject orderOfBasePointR;	// OPTIONAL
    - *  	ASN1TaggedObject publicPointY;		//REQUIRED
    - *  	ASN1TaggedObject	cofactorF;			// OPTIONAL
    - *  }
    - * 
    - */ -public class ECDSAPublicKey - extends PublicKeyDataObject -{ - private ASN1ObjectIdentifier usage; - private BigInteger primeModulusP; // OPTIONAL - private BigInteger firstCoefA; // OPTIONAL - private BigInteger secondCoefB; // OPTIONAL - private byte[] basePointG; // OPTIONAL - private BigInteger orderOfBasePointR; // OPTIONAL - private byte[] publicPointY; //REQUIRED - private BigInteger cofactorF; // OPTIONAL - private int options; - private static final int P = 0x01; - private static final int A = 0x02; - private static final int B = 0x04; - private static final int G = 0x08; - private static final int R = 0x10; - private static final int Y = 0x20; - private static final int F = 0x40; - - ECDSAPublicKey(ASN1Sequence seq) - throws IllegalArgumentException - { - Enumeration en = seq.getObjects(); - - this.usage = ASN1ObjectIdentifier.getInstance(en.nextElement()); - - options = 0; - while (en.hasMoreElements()) - { - Object obj = en.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject to = (ASN1TaggedObject)obj; - switch (to.getTagNo()) - { - case 0x1: - setPrimeModulusP(UnsignedInteger.getInstance(to).getValue()); - break; - case 0x2: - setFirstCoefA(UnsignedInteger.getInstance(to).getValue()); - break; - case 0x3: - setSecondCoefB(UnsignedInteger.getInstance(to).getValue()); - break; - case 0x4: - setBasePointG(ASN1OctetString.getInstance(to, false)); - break; - case 0x5: - setOrderOfBasePointR(UnsignedInteger.getInstance(to).getValue()); - break; - case 0x6: - setPublicPointY(ASN1OctetString.getInstance(to, false)); - break; - case 0x7: - setCofactorF(UnsignedInteger.getInstance(to).getValue()); - break; - default: - options = 0; - throw new IllegalArgumentException("Unknown Object Identifier!"); - } - } - else - { - throw new IllegalArgumentException("Unknown Object Identifier!"); - } - } - if (options != 0x20 && options != 0x7F) - { - throw new IllegalArgumentException("All options must be either present or absent!"); - } - } - - public ECDSAPublicKey(ASN1ObjectIdentifier usage, byte[] ppY) - throws IllegalArgumentException - { - this.usage = usage; - setPublicPointY(new DEROctetString(ppY)); - } - - public ECDSAPublicKey(ASN1ObjectIdentifier usage, BigInteger p, BigInteger a, BigInteger b, byte[] basePoint, BigInteger order, byte[] publicPoint, int cofactor) - { - this.usage = usage; - setPrimeModulusP(p); - setFirstCoefA(a); - setSecondCoefB(b); - setBasePointG(new DEROctetString(basePoint)); - setOrderOfBasePointR(order); - setPublicPointY(new DEROctetString(publicPoint)); - setCofactorF(BigInteger.valueOf(cofactor)); - } - - public ASN1ObjectIdentifier getUsage() - { - return usage; - } - - public byte[] getBasePointG() - { - if ((options & G) != 0) - { - return basePointG; - } - else - { - return null; - } - } - - private void setBasePointG(ASN1OctetString basePointG) - throws IllegalArgumentException - { - if ((options & G) == 0) - { - options |= G; - this.basePointG = basePointG.getOctets(); - } - else - { - throw new IllegalArgumentException("Base Point G already set"); - } - } - - public BigInteger getCofactorF() - { - if ((options & F) != 0) - { - return cofactorF; - } - else - { - return null; - } - } - - private void setCofactorF(BigInteger cofactorF) - throws IllegalArgumentException - { - if ((options & F) == 0) - { - options |= F; - this.cofactorF = cofactorF; - } - else - { - throw new IllegalArgumentException("Cofactor F already set"); - } - } - - public BigInteger getFirstCoefA() - { - if ((options & A) != 0) - { - return firstCoefA; - } - else - { - return null; - } - } - - private void setFirstCoefA(BigInteger firstCoefA) - throws IllegalArgumentException - { - if ((options & A) == 0) - { - options |= A; - this.firstCoefA = firstCoefA; - } - else - { - throw new IllegalArgumentException("First Coef A already set"); - } - } - - public BigInteger getOrderOfBasePointR() - { - if ((options & R) != 0) - { - return orderOfBasePointR; - } - else - { - return null; - } - } - - private void setOrderOfBasePointR(BigInteger orderOfBasePointR) - throws IllegalArgumentException - { - if ((options & R) == 0) - { - options |= R; - this.orderOfBasePointR = orderOfBasePointR; - } - else - { - throw new IllegalArgumentException("Order of base point R already set"); - } - } - - public BigInteger getPrimeModulusP() - { - if ((options & P) != 0) - { - return primeModulusP; - } - else - { - return null; - } - } - - private void setPrimeModulusP(BigInteger primeModulusP) - { - if ((options & P) == 0) - { - options |= P; - this.primeModulusP = primeModulusP; - } - else - { - throw new IllegalArgumentException("Prime Modulus P already set"); - } - } - - public byte[] getPublicPointY() - { - if ((options & Y) != 0) - { - return publicPointY; - } - else - { - return null; - } - } - - private void setPublicPointY(ASN1OctetString publicPointY) - throws IllegalArgumentException - { - if ((options & Y) == 0) - { - options |= Y; - this.publicPointY = publicPointY.getOctets(); - } - else - { - throw new IllegalArgumentException("Public Point Y already set"); - } - } - - public BigInteger getSecondCoefB() - { - if ((options & B) != 0) - { - return secondCoefB; - } - else - { - return null; - } - } - - private void setSecondCoefB(BigInteger secondCoefB) - throws IllegalArgumentException - { - if ((options & B) == 0) - { - options |= B; - this.secondCoefB = secondCoefB; - } - else - { - throw new IllegalArgumentException("Second Coef B already set"); - } - } - - public boolean hasParameters() - { - return primeModulusP != null; - } - - public ASN1EncodableVector getASN1EncodableVector(ASN1ObjectIdentifier oid, boolean publicPointOnly) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(oid); - - if (!publicPointOnly) - { - v.add(new UnsignedInteger(0x01, getPrimeModulusP())); - v.add(new UnsignedInteger(0x02, getFirstCoefA())); - v.add(new UnsignedInteger(0x03, getSecondCoefB())); - v.add(new DERTaggedObject(false, 0x04, new DEROctetString(getBasePointG()))); - v.add(new UnsignedInteger(0x05, getOrderOfBasePointR())); - } - v.add(new DERTaggedObject(false, 0x06, new DEROctetString(getPublicPointY()))); - if (!publicPointOnly) - { - v.add(new UnsignedInteger(0x07, getCofactorF())); - } - - return v; - } - - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(getASN1EncodableVector(usage, false)); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/Flags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/Flags.java deleted file mode 100644 index a5cc64c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/Flags.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.asn1.eac; - -import java.util.Enumeration; -import java.util.Hashtable; - - -public class Flags -{ - - int value = 0; - - public Flags() - { - - } - - public Flags(int v) - { - value = v; - } - - public void set(int flag) - { - value |= flag; - } - - public boolean isSet(int flag) - { - return (value & flag) != 0; - } - - public int getFlags() - { - return value; - } - - /* Java 1.5 - String decode(Map decodeMap) - { - StringJoiner joiner = new StringJoiner(" "); - for (int i : decodeMap.keySet()) - { - if (isSet(i)) - joiner.add(decodeMap.get(i)); - } - return joiner.toString(); - } - */ - - String decode(Hashtable decodeMap) - { - StringJoiner joiner = new StringJoiner(" "); - Enumeration e = decodeMap.keys(); - while (e.hasMoreElements()) - { - Integer i = (Integer)e.nextElement(); - if (isSet(i.intValue())) - { - joiner.add((String)decodeMap.get(i)); - } - } - return joiner.toString(); - } - - private class StringJoiner - { - - String mSeparator; - boolean First = true; - StringBuffer b = new StringBuffer(); - - public StringJoiner(String separator) - { - mSeparator = separator; - } - - public void add(String str) - { - if (First) - { - First = false; - } - else - { - b.append(mSeparator); - } - - b.append(str); - } - - public String toString() - { - return b.toString(); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PackedDate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PackedDate.java deleted file mode 100644 index 069931c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PackedDate.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.bc.asn1.eac; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.SimpleTimeZone; - -import org.bc.util.Arrays; - -/** - * EAC encoding date object - */ -public class PackedDate -{ - private byte[] time; - - public PackedDate( - String time) - { - this.time = convert(time); - } - - /** - * base constructer from a java.util.date object - */ - public PackedDate( - Date time) - { - SimpleDateFormat dateF = new SimpleDateFormat("yyMMdd'Z'"); - - dateF.setTimeZone(new SimpleTimeZone(0,"Z")); - - this.time = convert(dateF.format(time)); - } - - private byte[] convert(String sTime) - { - char[] digs = sTime.toCharArray(); - byte[] date = new byte[6]; - - for (int i = 0; i != 6; i++) - { - date[i] = (byte)(digs[i] - '0'); - } - - return date; - } - - PackedDate( - byte[] bytes) - { - this.time = bytes; - } - - /** - * return the time as a date based on whatever a 2 digit year will return. For - * standardised processing use getAdjustedDate(). - * - * @return the resulting date - * @exception java.text.ParseException if the date string cannot be parsed. - */ - public Date getDate() - throws ParseException - { - SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMdd"); - - return dateF.parse("20" + toString()); - } - - public int hashCode() - { - return Arrays.hashCode(time); - } - - public boolean equals(Object o) - { - if (!(o instanceof PackedDate)) - { - return false; - } - - PackedDate other = (PackedDate)o; - - return Arrays.areEqual(time, other.time); - } - - public String toString() - { - char[] dateC = new char[time.length]; - - for (int i = 0; i != dateC.length; i++) - { - dateC[i] = (char)((time[i] & 0xff) + '0'); - } - - return new String(dateC); - } - - public byte[] getEncoding() - { - return time; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PublicKeyDataObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PublicKeyDataObject.java deleted file mode 100644 index 264abcc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/PublicKeyDataObject.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.bc.asn1.eac; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Sequence; - -public abstract class PublicKeyDataObject - extends ASN1Object -{ - public static PublicKeyDataObject getInstance(Object obj) - { - if (obj instanceof PublicKeyDataObject) - { - return (PublicKeyDataObject)obj; - } - if (obj != null) - { - ASN1Sequence seq = ASN1Sequence.getInstance(obj); - ASN1ObjectIdentifier usage = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - - if (usage.on(EACObjectIdentifiers.id_TA_ECDSA)) - { - return new ECDSAPublicKey(seq); - } - else - { - return new RSAPublicKey(seq); - } - } - - return null; - } - - public abstract ASN1ObjectIdentifier getUsage(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/RSAPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/RSAPublicKey.java deleted file mode 100644 index 1f01da8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/RSAPublicKey.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.eac; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - - -/** - * an Iso7816RSAPublicKeyStructure structure. - *

    - *

    - *  Certificate Holder Authorization ::= SEQUENCE {
    - *  	// modulus should be at least 1024bit and a multiple of 512.
    - *  	DERTaggedObject		modulus,
    - *  	// access rights	exponent
    - *  	DERTaggedObject	accessRights,
    - *  }
    - * 
    - */ -public class RSAPublicKey - extends PublicKeyDataObject -{ - private ASN1ObjectIdentifier usage; - private BigInteger modulus; - private BigInteger exponent; - private int valid = 0; - private static int modulusValid = 0x01; - private static int exponentValid = 0x02; - - RSAPublicKey(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - - this.usage = ASN1ObjectIdentifier.getInstance(en.nextElement()); - - while (en.hasMoreElements()) - { - UnsignedInteger val = UnsignedInteger.getInstance(en.nextElement()); - - switch (val.getTagNo()) - { - case 0x1: - setModulus(val); - break; - case 0x2: - setExponent(val); - break; - default: - throw new IllegalArgumentException("Unknown DERTaggedObject :" + val.getTagNo() + "-> not an Iso7816RSAPublicKeyStructure"); - } - } - if (valid != 0x3) - { - throw new IllegalArgumentException("missing argument -> not an Iso7816RSAPublicKeyStructure"); - } - } - - public RSAPublicKey(ASN1ObjectIdentifier usage, BigInteger modulus, BigInteger exponent) - { - this.usage = usage; - this.modulus = modulus; - this.exponent = exponent; - } - - public ASN1ObjectIdentifier getUsage() - { - return usage; - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getPublicExponent() - { - return exponent; - } - - private void setModulus(UnsignedInteger modulus) - { - if ((valid & modulusValid) == 0) - { - valid |= modulusValid; - this.modulus = modulus.getValue(); - } - else - { - throw new IllegalArgumentException("Modulus already set"); - } - } - - private void setExponent(UnsignedInteger exponent) - { - if ((valid & exponentValid) == 0) - { - valid |= exponentValid; - this.exponent = exponent.getValue(); - } - else - { - throw new IllegalArgumentException("Exponent already set"); - } - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(usage); - v.add(new UnsignedInteger(0x01, getModulus())); - v.add(new UnsignedInteger(0x02, getPublicExponent())); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/UnsignedInteger.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/UnsignedInteger.java deleted file mode 100644 index 5ef307a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/eac/UnsignedInteger.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bc.asn1.eac; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERTaggedObject; - -public class UnsignedInteger - extends ASN1Object -{ - private int tagNo; - private BigInteger value; - - public UnsignedInteger(int tagNo, BigInteger value) - { - this.tagNo = tagNo; - this.value = value; - } - - private UnsignedInteger(ASN1TaggedObject obj) - { - this.tagNo = obj.getTagNo(); - this.value = new BigInteger(1, ASN1OctetString.getInstance(obj, false).getOctets()); - } - - public static UnsignedInteger getInstance(Object obj) - { - if (obj instanceof UnsignedInteger) - { - return (UnsignedInteger)obj; - } - if (obj != null) - { - return new UnsignedInteger(ASN1TaggedObject.getInstance(obj)); - } - - return null; - } - - private byte[] convertValue() - { - byte[] v = value.toByteArray(); - - if (v[0] == 0) - { - byte[] tmp = new byte[v.length - 1]; - - System.arraycopy(v, 1, tmp, 0, tmp.length); - - return tmp; - } - - return v; - } - - public int getTagNo() - { - return tagNo; - } - - public BigInteger getValue() - { - return value; - } - - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(false, tagNo, new DEROctetString(convertValue())); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIdentifier.java deleted file mode 100644 index 5704a6e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIdentifier.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface CommitmentTypeIdentifier -{ - public static final ASN1ObjectIdentifier proofOfOrigin = PKCSObjectIdentifiers.id_cti_ets_proofOfOrigin; - public static final ASN1ObjectIdentifier proofOfReceipt = PKCSObjectIdentifiers.id_cti_ets_proofOfReceipt; - public static final ASN1ObjectIdentifier proofOfDelivery = PKCSObjectIdentifiers.id_cti_ets_proofOfDelivery; - public static final ASN1ObjectIdentifier proofOfSender = PKCSObjectIdentifiers.id_cti_ets_proofOfSender; - public static final ASN1ObjectIdentifier proofOfApproval = PKCSObjectIdentifiers.id_cti_ets_proofOfApproval; - public static final ASN1ObjectIdentifier proofOfCreation = PKCSObjectIdentifiers.id_cti_ets_proofOfCreation; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIndication.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIndication.java deleted file mode 100644 index bf0e694..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeIndication.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class CommitmentTypeIndication - extends ASN1Object -{ - private ASN1ObjectIdentifier commitmentTypeId; - private ASN1Sequence commitmentTypeQualifier; - - private CommitmentTypeIndication( - ASN1Sequence seq) - { - commitmentTypeId = (ASN1ObjectIdentifier)seq.getObjectAt(0); - - if (seq.size() > 1) - { - commitmentTypeQualifier = (ASN1Sequence)seq.getObjectAt(1); - } - } - - public CommitmentTypeIndication( - ASN1ObjectIdentifier commitmentTypeId) - { - this.commitmentTypeId = commitmentTypeId; - } - - public CommitmentTypeIndication( - ASN1ObjectIdentifier commitmentTypeId, - ASN1Sequence commitmentTypeQualifier) - { - this.commitmentTypeId = commitmentTypeId; - this.commitmentTypeQualifier = commitmentTypeQualifier; - } - - public static CommitmentTypeIndication getInstance( - Object obj) - { - if (obj == null || obj instanceof CommitmentTypeIndication) - { - return (CommitmentTypeIndication)obj; - } - - return new CommitmentTypeIndication(ASN1Sequence.getInstance(obj)); - } - - public ASN1ObjectIdentifier getCommitmentTypeId() - { - return commitmentTypeId; - } - - public ASN1Sequence getCommitmentTypeQualifier() - { - return commitmentTypeQualifier; - } - - /** - *
    -     * CommitmentTypeIndication ::= SEQUENCE {
    -     *      commitmentTypeId   CommitmentTypeIdentifier,
    -     *      commitmentTypeQualifier   SEQUENCE SIZE (1..MAX) OF
    -     *              CommitmentTypeQualifier OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(commitmentTypeId); - - if (commitmentTypeQualifier != null) - { - v.add(commitmentTypeQualifier); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeQualifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeQualifier.java deleted file mode 100644 index aae8980..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CommitmentTypeQualifier.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * Commitment type qualifiers, used in the Commitment-Type-Indication attribute (RFC3126). - * - *
    - *   CommitmentTypeQualifier ::= SEQUENCE {
    - *       commitmentTypeIdentifier  CommitmentTypeIdentifier,
    - *       qualifier          ANY DEFINED BY commitmentTypeIdentifier OPTIONAL }
    - * 
    - */ -public class CommitmentTypeQualifier - extends ASN1Object -{ - private ASN1ObjectIdentifier commitmentTypeIdentifier; - private ASN1Encodable qualifier; - - /** - * Creates a new CommitmentTypeQualifier instance. - * - * @param commitmentTypeIdentifier a CommitmentTypeIdentifier value - */ - public CommitmentTypeQualifier( - ASN1ObjectIdentifier commitmentTypeIdentifier) - { - this(commitmentTypeIdentifier, null); - } - - /** - * Creates a new CommitmentTypeQualifier instance. - * - * @param commitmentTypeIdentifier a CommitmentTypeIdentifier value - * @param qualifier the qualifier, defined by the above field. - */ - public CommitmentTypeQualifier( - ASN1ObjectIdentifier commitmentTypeIdentifier, - ASN1Encodable qualifier) - { - this.commitmentTypeIdentifier = commitmentTypeIdentifier; - this.qualifier = qualifier; - } - - /** - * Creates a new CommitmentTypeQualifier instance. - * - * @param as CommitmentTypeQualifier structure - * encoded as an ASN1Sequence. - */ - private CommitmentTypeQualifier( - ASN1Sequence as) - { - commitmentTypeIdentifier = (ASN1ObjectIdentifier)as.getObjectAt(0); - - if (as.size() > 1) - { - qualifier = as.getObjectAt(1); - } - } - - public static CommitmentTypeQualifier getInstance(Object as) - { - if (as instanceof CommitmentTypeQualifier) - { - return (CommitmentTypeQualifier)as; - } - else if (as != null) - { - return new CommitmentTypeQualifier(ASN1Sequence.getInstance(as)); - } - - return null; - } - - public ASN1ObjectIdentifier getCommitmentTypeIdentifier() - { - return commitmentTypeIdentifier; - } - - public ASN1Encodable getQualifier() - { - return qualifier; - } - - /** - * Returns a DER-encodable representation of this instance. - * - * @return a ASN1Primitive value - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector dev = new ASN1EncodableVector(); - dev.add(commitmentTypeIdentifier); - if (qualifier != null) - { - dev.add(qualifier); - } - - return new DERSequence(dev); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CompleteRevocationRefs.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CompleteRevocationRefs.java deleted file mode 100644 index d28935f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CompleteRevocationRefs.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * CompleteRevocationRefs ::= SEQUENCE OF CrlOcspRef
    - * 
    - */ -public class CompleteRevocationRefs - extends ASN1Object -{ - - private ASN1Sequence crlOcspRefs; - - public static CompleteRevocationRefs getInstance(Object obj) - { - if (obj instanceof CompleteRevocationRefs) - { - return (CompleteRevocationRefs)obj; - } - else if (obj != null) - { - return new CompleteRevocationRefs(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CompleteRevocationRefs(ASN1Sequence seq) - { - Enumeration seqEnum = seq.getObjects(); - while (seqEnum.hasMoreElements()) - { - CrlOcspRef.getInstance(seqEnum.nextElement()); - } - this.crlOcspRefs = seq; - } - - public CompleteRevocationRefs(CrlOcspRef[] crlOcspRefs) - { - this.crlOcspRefs = new DERSequence(crlOcspRefs); - } - - public CrlOcspRef[] getCrlOcspRefs() - { - CrlOcspRef[] result = new CrlOcspRef[this.crlOcspRefs.size()]; - for (int idx = 0; idx < result.length; idx++) - { - result[idx] = CrlOcspRef.getInstance(this.crlOcspRefs - .getObjectAt(idx)); - } - return result; - } - - public ASN1Primitive toASN1Primitive() - { - return this.crlOcspRefs; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlIdentifier.java deleted file mode 100644 index 21d070f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlIdentifier.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.bc.asn1.esf; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1UTCTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.X500Name; - -/** - *
    - *  CrlIdentifier ::= SEQUENCE 
    - * {
    - *   crlissuer    Name,
    - *   crlIssuedTime  UTCTime,
    - *   crlNumber    INTEGER OPTIONAL
    - * }
    - * 
    - */ -public class CrlIdentifier - extends ASN1Object -{ - private X500Name crlIssuer; - private ASN1UTCTime crlIssuedTime; - private ASN1Integer crlNumber; - - public static CrlIdentifier getInstance(Object obj) - { - if (obj instanceof CrlIdentifier) - { - return (CrlIdentifier)obj; - } - else if (obj != null) - { - return new CrlIdentifier(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CrlIdentifier(ASN1Sequence seq) - { - if (seq.size() < 2 || seq.size() > 3) - { - throw new IllegalArgumentException(); - } - this.crlIssuer = X500Name.getInstance(seq.getObjectAt(0)); - this.crlIssuedTime = ASN1UTCTime.getInstance(seq.getObjectAt(1)); - if (seq.size() > 2) - { - this.crlNumber = ASN1Integer.getInstance(seq.getObjectAt(2)); - } - } - - public CrlIdentifier(X500Name crlIssuer, ASN1UTCTime crlIssuedTime) - { - this(crlIssuer, crlIssuedTime, null); - } - - public CrlIdentifier(X500Name crlIssuer, ASN1UTCTime crlIssuedTime, - BigInteger crlNumber) - { - this.crlIssuer = crlIssuer; - this.crlIssuedTime = crlIssuedTime; - if (null != crlNumber) - { - this.crlNumber = new ASN1Integer(crlNumber); - } - } - - public X500Name getCrlIssuer() - { - return this.crlIssuer; - } - - public ASN1UTCTime getCrlIssuedTime() - { - return this.crlIssuedTime; - } - - public BigInteger getCrlNumber() - { - if (null == this.crlNumber) - { - return null; - } - return this.crlNumber.getValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.crlIssuer.toASN1Primitive()); - v.add(this.crlIssuedTime); - if (null != this.crlNumber) - { - v.add(this.crlNumber); - } - return new DERSequence(v); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlListID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlListID.java deleted file mode 100644 index 9e162e5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlListID.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * CRLListID ::= SEQUENCE {
    - *     crls SEQUENCE OF CrlValidatedID }
    - * 
    - */ -public class CrlListID - extends ASN1Object -{ - - private ASN1Sequence crls; - - public static CrlListID getInstance(Object obj) - { - if (obj instanceof CrlListID) - { - return (CrlListID)obj; - } - else if (obj != null) - { - return new CrlListID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CrlListID(ASN1Sequence seq) - { - this.crls = (ASN1Sequence)seq.getObjectAt(0); - Enumeration e = this.crls.getObjects(); - while (e.hasMoreElements()) - { - CrlValidatedID.getInstance(e.nextElement()); - } - } - - public CrlListID(CrlValidatedID[] crls) - { - this.crls = new DERSequence(crls); - } - - public CrlValidatedID[] getCrls() - { - CrlValidatedID[] result = new CrlValidatedID[this.crls.size()]; - for (int idx = 0; idx < result.length; idx++) - { - result[idx] = CrlValidatedID - .getInstance(this.crls.getObjectAt(idx)); - } - return result; - } - - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(this.crls); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlOcspRef.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlOcspRef.java deleted file mode 100644 index 37b1036..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlOcspRef.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - *
    - * CrlOcspRef ::= SEQUENCE {
    - *     crlids [0] CRLListID OPTIONAL,
    - *     ocspids [1] OcspListID OPTIONAL,
    - *     otherRev [2] OtherRevRefs OPTIONAL
    - * }
    - * 
    - */ -public class CrlOcspRef - extends ASN1Object -{ - - private CrlListID crlids; - private OcspListID ocspids; - private OtherRevRefs otherRev; - - public static CrlOcspRef getInstance(Object obj) - { - if (obj instanceof CrlOcspRef) - { - return (CrlOcspRef)obj; - } - else if (obj != null) - { - return new CrlOcspRef(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CrlOcspRef(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - while (e.hasMoreElements()) - { - DERTaggedObject o = (DERTaggedObject)e.nextElement(); - switch (o.getTagNo()) - { - case 0: - this.crlids = CrlListID.getInstance(o.getObject()); - break; - case 1: - this.ocspids = OcspListID.getInstance(o.getObject()); - break; - case 2: - this.otherRev = OtherRevRefs.getInstance(o.getObject()); - break; - default: - throw new IllegalArgumentException("illegal tag"); - } - } - } - - public CrlOcspRef(CrlListID crlids, OcspListID ocspids, - OtherRevRefs otherRev) - { - this.crlids = crlids; - this.ocspids = ocspids; - this.otherRev = otherRev; - } - - public CrlListID getCrlids() - { - return this.crlids; - } - - public OcspListID getOcspids() - { - return this.ocspids; - } - - public OtherRevRefs getOtherRev() - { - return this.otherRev; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - if (null != this.crlids) - { - v.add(new DERTaggedObject(true, 0, this.crlids.toASN1Primitive())); - } - if (null != this.ocspids) - { - v.add(new DERTaggedObject(true, 1, this.ocspids.toASN1Primitive())); - } - if (null != this.otherRev) - { - v.add(new DERTaggedObject(true, 2, this.otherRev.toASN1Primitive())); - } - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlValidatedID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlValidatedID.java deleted file mode 100644 index ba3091f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/CrlValidatedID.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * CrlValidatedID ::= SEQUENCE {
    - *   crlHash OtherHash,
    - *   crlIdentifier CrlIdentifier OPTIONAL }
    - * 
    - */ -public class CrlValidatedID - extends ASN1Object -{ - - private OtherHash crlHash; - private CrlIdentifier crlIdentifier; - - public static CrlValidatedID getInstance(Object obj) - { - if (obj instanceof CrlValidatedID) - { - return (CrlValidatedID)obj; - } - else if (obj != null) - { - return new CrlValidatedID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CrlValidatedID(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.crlHash = OtherHash.getInstance(seq.getObjectAt(0)); - if (seq.size() > 1) - { - this.crlIdentifier = CrlIdentifier.getInstance(seq.getObjectAt(1)); - } - } - - public CrlValidatedID(OtherHash crlHash) - { - this(crlHash, null); - } - - public CrlValidatedID(OtherHash crlHash, CrlIdentifier crlIdentifier) - { - this.crlHash = crlHash; - this.crlIdentifier = crlIdentifier; - } - - public OtherHash getCrlHash() - { - return this.crlHash; - } - - public CrlIdentifier getCrlIdentifier() - { - return this.crlIdentifier; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.crlHash.toASN1Primitive()); - if (null != this.crlIdentifier) - { - v.add(this.crlIdentifier.toASN1Primitive()); - } - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/ESFAttributes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/ESFAttributes.java deleted file mode 100644 index b78adc2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/ESFAttributes.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface ESFAttributes -{ - public static final ASN1ObjectIdentifier sigPolicyId = PKCSObjectIdentifiers.id_aa_ets_sigPolicyId; - public static final ASN1ObjectIdentifier commitmentType = PKCSObjectIdentifiers.id_aa_ets_commitmentType; - public static final ASN1ObjectIdentifier signerLocation = PKCSObjectIdentifiers.id_aa_ets_signerLocation; - public static final ASN1ObjectIdentifier signerAttr = PKCSObjectIdentifiers.id_aa_ets_signerAttr; - public static final ASN1ObjectIdentifier otherSigCert = PKCSObjectIdentifiers.id_aa_ets_otherSigCert; - public static final ASN1ObjectIdentifier contentTimestamp = PKCSObjectIdentifiers.id_aa_ets_contentTimestamp; - public static final ASN1ObjectIdentifier certificateRefs = PKCSObjectIdentifiers.id_aa_ets_certificateRefs; - public static final ASN1ObjectIdentifier revocationRefs = PKCSObjectIdentifiers.id_aa_ets_revocationRefs; - public static final ASN1ObjectIdentifier certValues = PKCSObjectIdentifiers.id_aa_ets_certValues; - public static final ASN1ObjectIdentifier revocationValues = PKCSObjectIdentifiers.id_aa_ets_revocationValues; - public static final ASN1ObjectIdentifier escTimeStamp = PKCSObjectIdentifiers.id_aa_ets_escTimeStamp; - public static final ASN1ObjectIdentifier certCRLTimestamp = PKCSObjectIdentifiers.id_aa_ets_certCRLTimestamp; - public static final ASN1ObjectIdentifier archiveTimestamp = PKCSObjectIdentifiers.id_aa_ets_archiveTimestamp; - public static final ASN1ObjectIdentifier archiveTimestampV2 = PKCSObjectIdentifiers.id_aa.branch("48"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspIdentifier.java deleted file mode 100644 index 7228685..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspIdentifier.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.ocsp.ResponderID; - -/** - *
    - * OcspIdentifier ::= SEQUENCE {
    - *     ocspResponderID ResponderID, -- As in OCSP response data
    - *     producedAt GeneralizedTime -- As in OCSP response data
    - * }
    - * 
    - */ -public class OcspIdentifier - extends ASN1Object -{ - private ResponderID ocspResponderID; - private ASN1GeneralizedTime producedAt; - - public static OcspIdentifier getInstance(Object obj) - { - if (obj instanceof OcspIdentifier) - { - return (OcspIdentifier)obj; - } - else if (obj != null) - { - return new OcspIdentifier(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OcspIdentifier(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.ocspResponderID = ResponderID.getInstance(seq.getObjectAt(0)); - this.producedAt = (ASN1GeneralizedTime)seq.getObjectAt(1); - } - - public OcspIdentifier(ResponderID ocspResponderID, ASN1GeneralizedTime producedAt) - { - this.ocspResponderID = ocspResponderID; - this.producedAt = producedAt; - } - - public ResponderID getOcspResponderID() - { - return this.ocspResponderID; - } - - public ASN1GeneralizedTime getProducedAt() - { - return this.producedAt; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.ocspResponderID); - v.add(this.producedAt); - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspListID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspListID.java deleted file mode 100644 index 9b82583..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspListID.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * OcspListID ::=  SEQUENCE {
    - *    ocspResponses  SEQUENCE OF OcspResponsesID
    - * }
    - * 
    - */ -public class OcspListID - extends ASN1Object -{ - private ASN1Sequence ocspResponses; - - public static OcspListID getInstance(Object obj) - { - if (obj instanceof OcspListID) - { - return (OcspListID)obj; - } - else if (obj != null) - { - return new OcspListID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OcspListID(ASN1Sequence seq) - { - if (seq.size() != 1) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.ocspResponses = (ASN1Sequence)seq.getObjectAt(0); - Enumeration e = this.ocspResponses.getObjects(); - while (e.hasMoreElements()) - { - OcspResponsesID.getInstance(e.nextElement()); - } - } - - public OcspListID(OcspResponsesID[] ocspResponses) - { - this.ocspResponses = new DERSequence(ocspResponses); - } - - public OcspResponsesID[] getOcspResponses() - { - OcspResponsesID[] result = new OcspResponsesID[this.ocspResponses - .size()]; - for (int idx = 0; idx < result.length; idx++) - { - result[idx] = OcspResponsesID.getInstance(this.ocspResponses - .getObjectAt(idx)); - } - return result; - } - - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(this.ocspResponses); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspResponsesID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspResponsesID.java deleted file mode 100644 index 2677f38..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OcspResponsesID.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * OcspResponsesID ::= SEQUENCE {
    - *    ocspIdentifier OcspIdentifier,
    - *    ocspRepHash OtherHash OPTIONAL
    - * }
    - * 
    - */ -public class OcspResponsesID - extends ASN1Object -{ - - private OcspIdentifier ocspIdentifier; - private OtherHash ocspRepHash; - - public static OcspResponsesID getInstance(Object obj) - { - if (obj instanceof OcspResponsesID) - { - return (OcspResponsesID)obj; - } - else if (obj != null) - { - return new OcspResponsesID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OcspResponsesID(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.ocspIdentifier = OcspIdentifier.getInstance(seq.getObjectAt(0)); - if (seq.size() > 1) - { - this.ocspRepHash = OtherHash.getInstance(seq.getObjectAt(1)); - } - } - - public OcspResponsesID(OcspIdentifier ocspIdentifier) - { - this(ocspIdentifier, null); - } - - public OcspResponsesID(OcspIdentifier ocspIdentifier, OtherHash ocspRepHash) - { - this.ocspIdentifier = ocspIdentifier; - this.ocspRepHash = ocspRepHash; - } - - public OcspIdentifier getOcspIdentifier() - { - return this.ocspIdentifier; - } - - public OtherHash getOcspRepHash() - { - return this.ocspRepHash; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.ocspIdentifier); - if (null != this.ocspRepHash) - { - v.add(this.ocspRepHash); - } - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHash.java deleted file mode 100644 index 6e7969f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHash.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.oiw.OIWObjectIdentifiers; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - *
    - * OtherHash ::= CHOICE {
    - *    sha1Hash  OtherHashValue, -- This contains a SHA-1 hash
    - *   otherHash  OtherHashAlgAndValue
    - *  }
    - * 
    - */ -public class OtherHash - extends ASN1Object - implements ASN1Choice -{ - - private ASN1OctetString sha1Hash; - private OtherHashAlgAndValue otherHash; - - public static OtherHash getInstance(Object obj) - { - if (obj instanceof OtherHash) - { - return (OtherHash)obj; - } - if (obj instanceof ASN1OctetString) - { - return new OtherHash((ASN1OctetString)obj); - } - return new OtherHash(OtherHashAlgAndValue.getInstance(obj)); - } - - private OtherHash(ASN1OctetString sha1Hash) - { - this.sha1Hash = sha1Hash; - } - - public OtherHash(OtherHashAlgAndValue otherHash) - { - this.otherHash = otherHash; - } - - public OtherHash(byte[] sha1Hash) - { - this.sha1Hash = new DEROctetString(sha1Hash); - } - - public AlgorithmIdentifier getHashAlgorithm() - { - if (null == this.otherHash) - { - return new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1); - } - return this.otherHash.getHashAlgorithm(); - } - - public byte[] getHashValue() - { - if (null == this.otherHash) - { - return this.sha1Hash.getOctets(); - } - return this.otherHash.getHashValue().getOctets(); - } - - public ASN1Primitive toASN1Primitive() - { - if (null == this.otherHash) - { - return this.sha1Hash; - } - return this.otherHash.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHashAlgAndValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHashAlgAndValue.java deleted file mode 100644 index 39a050c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherHashAlgAndValue.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class OtherHashAlgAndValue - extends ASN1Object -{ - private AlgorithmIdentifier hashAlgorithm; - private ASN1OctetString hashValue; - - - public static OtherHashAlgAndValue getInstance( - Object obj) - { - if (obj instanceof OtherHashAlgAndValue) - { - return (OtherHashAlgAndValue) obj; - } - else if (obj != null) - { - return new OtherHashAlgAndValue(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OtherHashAlgAndValue( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - hashValue = ASN1OctetString.getInstance(seq.getObjectAt(1)); - } - - public OtherHashAlgAndValue( - AlgorithmIdentifier hashAlgorithm, - ASN1OctetString hashValue) - { - this.hashAlgorithm = hashAlgorithm; - this.hashValue = hashValue; - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public ASN1OctetString getHashValue() - { - return hashValue; - } - - /** - *
    -     * OtherHashAlgAndValue ::= SEQUENCE {
    -     *     hashAlgorithm AlgorithmIdentifier,
    -     *     hashValue OtherHashValue }
    -     *
    -     * OtherHashValue ::= OCTET STRING
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(hashAlgorithm); - v.add(hashValue); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevRefs.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevRefs.java deleted file mode 100644 index 5bf1f0a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevRefs.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.asn1.esf; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * OtherRevRefs ::= SEQUENCE {
    - *   otherRevRefType OtherRevRefType,
    - *   otherRevRefs ANY DEFINED BY otherRevRefType
    - * }
    - *
    - * OtherRevRefType ::= OBJECT IDENTIFIER
    - * 
    - */ -public class OtherRevRefs - extends ASN1Object -{ - - private ASN1ObjectIdentifier otherRevRefType; - private ASN1Encodable otherRevRefs; - - public static OtherRevRefs getInstance(Object obj) - { - if (obj instanceof OtherRevRefs) - { - return (OtherRevRefs)obj; - } - else if (obj != null) - { - return new OtherRevRefs(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OtherRevRefs(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.otherRevRefType = new ASN1ObjectIdentifier(((ASN1ObjectIdentifier)seq.getObjectAt(0)).getId()); - try - { - this.otherRevRefs = ASN1Primitive.fromByteArray(seq.getObjectAt(1) - .toASN1Primitive().getEncoded(ASN1Encoding.DER)); - } - catch (IOException e) - { - throw new IllegalStateException(); - } - } - - public OtherRevRefs(ASN1ObjectIdentifier otherRevRefType, ASN1Encodable otherRevRefs) - { - this.otherRevRefType = otherRevRefType; - this.otherRevRefs = otherRevRefs; - } - - public ASN1ObjectIdentifier getOtherRevRefType() - { - return this.otherRevRefType; - } - - public ASN1Encodable getOtherRevRefs() - { - return this.otherRevRefs; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.otherRevRefType); - v.add(this.otherRevRefs); - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevVals.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevVals.java deleted file mode 100644 index 05049cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/OtherRevVals.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.bc.asn1.esf; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - *
    - * OtherRevVals ::= SEQUENCE {
    - *    otherRevValType OtherRevValType,
    - *    otherRevVals ANY DEFINED BY OtherRevValType
    - * }
    - *
    - * OtherRevValType ::= OBJECT IDENTIFIER
    - * 
    - */ -public class OtherRevVals - extends ASN1Object -{ - - private ASN1ObjectIdentifier otherRevValType; - - private ASN1Encodable otherRevVals; - - public static OtherRevVals getInstance(Object obj) - { - if (obj instanceof OtherRevVals) - { - return (OtherRevVals)obj; - } - if (obj != null) - { - return new OtherRevVals(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private OtherRevVals(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.otherRevValType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - try - { - this.otherRevVals = ASN1Primitive.fromByteArray(seq.getObjectAt(1) - .toASN1Primitive().getEncoded(ASN1Encoding.DER)); - } - catch (IOException e) - { - throw new IllegalStateException(); - } - } - - public OtherRevVals(ASN1ObjectIdentifier otherRevValType, - ASN1Encodable otherRevVals) - { - this.otherRevValType = otherRevValType; - this.otherRevVals = otherRevVals; - } - - public ASN1ObjectIdentifier getOtherRevValType() - { - return this.otherRevValType; - } - - public ASN1Encodable getOtherRevVals() - { - return this.otherRevVals; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.otherRevValType); - v.add(this.otherRevVals); - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/RevocationValues.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/RevocationValues.java deleted file mode 100644 index bebc602..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/RevocationValues.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.ocsp.BasicOCSPResponse; -import org.bc.asn1.x509.CertificateList; - -/** - *
    - * RevocationValues ::= SEQUENCE {
    - *    crlVals [0] SEQUENCE OF CertificateList OPTIONAL,
    - *    ocspVals [1] SEQUENCE OF BasicOCSPResponse OPTIONAL,
    - *    otherRevVals [2] OtherRevVals OPTIONAL}
    - * 
    - */ -public class RevocationValues - extends ASN1Object -{ - - private ASN1Sequence crlVals; - private ASN1Sequence ocspVals; - private OtherRevVals otherRevVals; - - public static RevocationValues getInstance(Object obj) - { - if (obj instanceof RevocationValues) - { - return (RevocationValues)obj; - } - else if (obj != null) - { - return new RevocationValues(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private RevocationValues(ASN1Sequence seq) - { - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - Enumeration e = seq.getObjects(); - while (e.hasMoreElements()) - { - DERTaggedObject o = (DERTaggedObject)e.nextElement(); - switch (o.getTagNo()) - { - case 0: - ASN1Sequence crlValsSeq = (ASN1Sequence)o.getObject(); - Enumeration crlValsEnum = crlValsSeq.getObjects(); - while (crlValsEnum.hasMoreElements()) - { - CertificateList.getInstance(crlValsEnum.nextElement()); - } - this.crlVals = crlValsSeq; - break; - case 1: - ASN1Sequence ocspValsSeq = (ASN1Sequence)o.getObject(); - Enumeration ocspValsEnum = ocspValsSeq.getObjects(); - while (ocspValsEnum.hasMoreElements()) - { - BasicOCSPResponse.getInstance(ocspValsEnum.nextElement()); - } - this.ocspVals = ocspValsSeq; - break; - case 2: - this.otherRevVals = OtherRevVals.getInstance(o.getObject()); - break; - default: - throw new IllegalArgumentException("invalid tag: " - + o.getTagNo()); - } - } - } - - public RevocationValues(CertificateList[] crlVals, - BasicOCSPResponse[] ocspVals, OtherRevVals otherRevVals) - { - if (null != crlVals) - { - this.crlVals = new DERSequence(crlVals); - } - if (null != ocspVals) - { - this.ocspVals = new DERSequence(ocspVals); - } - this.otherRevVals = otherRevVals; - } - - public CertificateList[] getCrlVals() - { - if (null == this.crlVals) - { - return new CertificateList[0]; - } - CertificateList[] result = new CertificateList[this.crlVals.size()]; - for (int idx = 0; idx < result.length; idx++) - { - result[idx] = CertificateList.getInstance(this.crlVals - .getObjectAt(idx)); - } - return result; - } - - public BasicOCSPResponse[] getOcspVals() - { - if (null == this.ocspVals) - { - return new BasicOCSPResponse[0]; - } - BasicOCSPResponse[] result = new BasicOCSPResponse[this.ocspVals.size()]; - for (int idx = 0; idx < result.length; idx++) - { - result[idx] = BasicOCSPResponse.getInstance(this.ocspVals - .getObjectAt(idx)); - } - return result; - } - - public OtherRevVals getOtherRevVals() - { - return this.otherRevVals; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - if (null != this.crlVals) - { - v.add(new DERTaggedObject(true, 0, this.crlVals)); - } - if (null != this.ocspVals) - { - v.add(new DERTaggedObject(true, 1, this.ocspVals)); - } - if (null != this.otherRevVals) - { - v.add(new DERTaggedObject(true, 2, this.otherRevVals.toASN1Primitive())); - } - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPUserNotice.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPUserNotice.java deleted file mode 100644 index fe7086b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPUserNotice.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1String; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.DisplayText; -import org.bc.asn1.x509.NoticeReference; - -public class SPUserNotice - extends ASN1Object -{ - private NoticeReference noticeRef; - private DisplayText explicitText; - - public static SPUserNotice getInstance( - Object obj) - { - if (obj instanceof SPUserNotice) - { - return (SPUserNotice)obj; - } - else if (obj != null) - { - return new SPUserNotice(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private SPUserNotice( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - while (e.hasMoreElements()) - { - ASN1Encodable object = (ASN1Encodable)e.nextElement(); - if (object instanceof DisplayText || object instanceof ASN1String) - { - explicitText = DisplayText.getInstance(object); - } - else if (object instanceof NoticeReference || object instanceof ASN1Sequence) - { - noticeRef = NoticeReference.getInstance(object); - } - else - { - throw new IllegalArgumentException("Invalid element in 'SPUserNotice': " + object.getClass().getName()); - } - } - } - - public SPUserNotice( - NoticeReference noticeRef, - DisplayText explicitText) - { - this.noticeRef = noticeRef; - this.explicitText = explicitText; - } - - public NoticeReference getNoticeRef() - { - return noticeRef; - } - - public DisplayText getExplicitText() - { - return explicitText; - } - - /** - *
    -     * SPUserNotice ::= SEQUENCE {
    -     *     noticeRef NoticeReference OPTIONAL,
    -     *     explicitText DisplayText OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (noticeRef != null) - { - v.add(noticeRef); - } - - if (explicitText != null) - { - v.add(explicitText); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPuri.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPuri.java deleted file mode 100644 index 0aa95ba..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SPuri.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERIA5String; - -public class SPuri -{ - private DERIA5String uri; - - public static SPuri getInstance( - Object obj) - { - if (obj instanceof SPuri) - { - return (SPuri) obj; - } - else if (obj instanceof DERIA5String) - { - return new SPuri(DERIA5String.getInstance(obj)); - } - - return null; - } - - public SPuri( - DERIA5String uri) - { - this.uri = uri; - } - - public DERIA5String getUri() - { - return uri; - } - - /** - *
    -     * SPuri ::= IA5String
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return uri.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifierInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifierInfo.java deleted file mode 100644 index 2fa7033..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifierInfo.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class SigPolicyQualifierInfo - extends ASN1Object -{ - private ASN1ObjectIdentifier sigPolicyQualifierId; - private ASN1Encodable sigQualifier; - - public SigPolicyQualifierInfo( - ASN1ObjectIdentifier sigPolicyQualifierId, - ASN1Encodable sigQualifier) - { - this.sigPolicyQualifierId = sigPolicyQualifierId; - this.sigQualifier = sigQualifier; - } - - private SigPolicyQualifierInfo( - ASN1Sequence seq) - { - sigPolicyQualifierId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - sigQualifier = seq.getObjectAt(1); - } - - public static SigPolicyQualifierInfo getInstance( - Object obj) - { - if (obj instanceof SigPolicyQualifierInfo) - { - return (SigPolicyQualifierInfo) obj; - } - else if (obj != null) - { - return new SigPolicyQualifierInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1ObjectIdentifier getSigPolicyQualifierId() - { - return new ASN1ObjectIdentifier(sigPolicyQualifierId.getId()); - } - - public ASN1Encodable getSigQualifier() - { - return sigQualifier; - } - - /** - *
    -     * SigPolicyQualifierInfo ::= SEQUENCE {
    -     *    sigPolicyQualifierId SigPolicyQualifierId,
    -     *    sigQualifier ANY DEFINED BY sigPolicyQualifierId }
    -     *
    -     * SigPolicyQualifierId ::= OBJECT IDENTIFIER
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(sigPolicyQualifierId); - v.add(sigQualifier); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifiers.java deleted file mode 100644 index c8d2b40..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SigPolicyQualifiers.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class SigPolicyQualifiers - extends ASN1Object -{ - ASN1Sequence qualifiers; - - public static SigPolicyQualifiers getInstance( - Object obj) - { - if (obj instanceof SigPolicyQualifiers) - { - return (SigPolicyQualifiers) obj; - } - else if (obj instanceof ASN1Sequence) - { - return new SigPolicyQualifiers(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private SigPolicyQualifiers( - ASN1Sequence seq) - { - qualifiers = seq; - } - - public SigPolicyQualifiers( - SigPolicyQualifierInfo[] qualifierInfos) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i=0; i < qualifierInfos.length; i++) - { - v.add(qualifierInfos[i]); - } - qualifiers = new DERSequence(v); - } - - /** - * Return the number of qualifier info elements present. - * - * @return number of elements present. - */ - public int size() - { - return qualifiers.size(); - } - - /** - * Return the SigPolicyQualifierInfo at index i. - * - * @param i index of the info of interest - * @return the info at index i. - */ - public SigPolicyQualifierInfo getInfoAt( - int i) - { - return SigPolicyQualifierInfo.getInstance(qualifiers.getObjectAt(i)); - } - - /** - *
    -     * SigPolicyQualifiers ::= SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return qualifiers; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyId.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyId.java deleted file mode 100644 index 3aa4c3f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyId.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class SignaturePolicyId - extends ASN1Object -{ - private ASN1ObjectIdentifier sigPolicyId; - private OtherHashAlgAndValue sigPolicyHash; - private SigPolicyQualifiers sigPolicyQualifiers; - - - public static SignaturePolicyId getInstance( - Object obj) - { - if (obj instanceof SignaturePolicyId) - { - return (SignaturePolicyId)obj; - } - else if (obj != null) - { - return new SignaturePolicyId(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private SignaturePolicyId( - ASN1Sequence seq) - { - if (seq.size() != 2 && seq.size() != 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - sigPolicyId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - sigPolicyHash = OtherHashAlgAndValue.getInstance(seq.getObjectAt(1)); - - if (seq.size() == 3) - { - sigPolicyQualifiers = SigPolicyQualifiers.getInstance(seq.getObjectAt(2)); - } - } - - public SignaturePolicyId( - ASN1ObjectIdentifier sigPolicyIdentifier, - OtherHashAlgAndValue sigPolicyHash) - { - this(sigPolicyIdentifier, sigPolicyHash, null); - } - - public SignaturePolicyId( - ASN1ObjectIdentifier sigPolicyId, - OtherHashAlgAndValue sigPolicyHash, - SigPolicyQualifiers sigPolicyQualifiers) - { - this.sigPolicyId = sigPolicyId; - this.sigPolicyHash = sigPolicyHash; - this.sigPolicyQualifiers = sigPolicyQualifiers; - } - - public ASN1ObjectIdentifier getSigPolicyId() - { - return new ASN1ObjectIdentifier(sigPolicyId.getId()); - } - - public OtherHashAlgAndValue getSigPolicyHash() - { - return sigPolicyHash; - } - - public SigPolicyQualifiers getSigPolicyQualifiers() - { - return sigPolicyQualifiers; - } - - /** - *
    -     * SignaturePolicyId ::= SEQUENCE {
    -     *     sigPolicyId SigPolicyId,
    -     *     sigPolicyHash SigPolicyHash,
    -     *     sigPolicyQualifiers SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL}
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(sigPolicyId); - v.add(sigPolicyHash); - if (sigPolicyQualifiers != null) - { - v.add(sigPolicyQualifiers); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyIdentifier.java deleted file mode 100644 index 72005f1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignaturePolicyIdentifier.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.bc.asn1.esf; - -import org.bc.asn1.ASN1Null; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.BERTags; -import org.bc.asn1.DERNull; - -public class SignaturePolicyIdentifier - extends ASN1Object -{ - private SignaturePolicyId signaturePolicyId; - private boolean isSignaturePolicyImplied; - - public static SignaturePolicyIdentifier getInstance( - Object obj) - { - if (obj instanceof SignaturePolicyIdentifier) - { - return (SignaturePolicyIdentifier)obj; - } - else if (obj instanceof ASN1Null || hasEncodedTagValue(obj, BERTags.NULL)) - { - return new SignaturePolicyIdentifier(); - } - else if (obj != null) - { - return new SignaturePolicyIdentifier(SignaturePolicyId.getInstance(obj)); - } - - return null; - } - - public SignaturePolicyIdentifier() - { - this.isSignaturePolicyImplied = true; - } - - public SignaturePolicyIdentifier( - SignaturePolicyId signaturePolicyId) - { - this.signaturePolicyId = signaturePolicyId; - this.isSignaturePolicyImplied = false; - } - - public SignaturePolicyId getSignaturePolicyId() - { - return signaturePolicyId; - } - - public boolean isSignaturePolicyImplied() - { - return isSignaturePolicyImplied; - } - - /** - *
    -     * SignaturePolicyIdentifier ::= CHOICE{
    -     *     SignaturePolicyId         SignaturePolicyId,
    -     *     SignaturePolicyImplied    SignaturePolicyImplied }
    -     *
    -     * SignaturePolicyImplied ::= NULL
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - if (isSignaturePolicyImplied) - { - return DERNull.INSTANCE; - } - else - { - return signaturePolicyId.toASN1Primitive(); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerAttribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerAttribute.java deleted file mode 100644 index d6cb21e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerAttribute.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Attribute; -import org.bc.asn1.x509.AttributeCertificate; - - -public class SignerAttribute - extends ASN1Object -{ - private Object[] values; - - public static SignerAttribute getInstance( - Object o) - { - if (o instanceof SignerAttribute) - { - return (SignerAttribute) o; - } - else if (o != null) - { - return new SignerAttribute(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private SignerAttribute( - ASN1Sequence seq) - { - int index = 0; - values = new Object[seq.size()]; - - for (Enumeration e = seq.getObjects(); e.hasMoreElements();) - { - ASN1TaggedObject taggedObject = ASN1TaggedObject.getInstance(e.nextElement()); - - if (taggedObject.getTagNo() == 0) - { - ASN1Sequence attrs = ASN1Sequence.getInstance(taggedObject, true); - Attribute[] attributes = new Attribute[attrs.size()]; - - for (int i = 0; i != attributes.length; i++) - { - attributes[i] = Attribute.getInstance(attrs.getObjectAt(i)); - } - values[index] = attributes; - } - else if (taggedObject.getTagNo() == 1) - { - values[index] = AttributeCertificate.getInstance(ASN1Sequence.getInstance(taggedObject, true)); - } - else - { - throw new IllegalArgumentException("illegal tag: " + taggedObject.getTagNo()); - } - index++; - } - } - - public SignerAttribute( - Attribute[] claimedAttributes) - { - this.values = new Object[1]; - this.values[0] = claimedAttributes; - } - - public SignerAttribute( - AttributeCertificate certifiedAttributes) - { - this.values = new Object[1]; - this.values[0] = certifiedAttributes; - } - - /** - * Return the sequence of choices - the array elements will either be of - * type Attribute[] or AttributeCertificate depending on what tag was used. - * - * @return array of choices. - */ - public Object[] getValues() - { - return values; - } - - /** - * - *
    -     *  SignerAttribute ::= SEQUENCE OF CHOICE {
    -     *      claimedAttributes   [0] ClaimedAttributes,
    -     *      certifiedAttributes [1] CertifiedAttributes }
    -     *
    -     *  ClaimedAttributes ::= SEQUENCE OF Attribute
    -     *  CertifiedAttributes ::= AttributeCertificate -- as defined in RFC 3281: see clause 4.1.
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != values.length; i++) - { - if (values[i] instanceof Attribute[]) - { - v.add(new DERTaggedObject(0, new DERSequence((Attribute[])values[i]))); - } - else - { - v.add(new DERTaggedObject(1, (AttributeCertificate)values[i])); - } - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerLocation.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerLocation.java deleted file mode 100644 index 37ffbd5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/esf/SignerLocation.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.bc.asn1.esf; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.x500.DirectoryString; - -/** - * Signer-Location attribute (RFC3126). - * - *
    - *   SignerLocation ::= SEQUENCE {
    - *       countryName        [0] DirectoryString OPTIONAL,
    - *       localityName       [1] DirectoryString OPTIONAL,
    - *       postalAddress      [2] PostalAddress OPTIONAL }
    - *
    - *   PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
    - * 
    - */ -public class SignerLocation - extends ASN1Object -{ - private DERUTF8String countryName; - private DERUTF8String localityName; - private ASN1Sequence postalAddress; - - private SignerLocation( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - DERTaggedObject o = (DERTaggedObject)e.nextElement(); - - switch (o.getTagNo()) - { - case 0: - DirectoryString countryNameDirectoryString = DirectoryString.getInstance(o, true); - this.countryName = new DERUTF8String(countryNameDirectoryString.getString()); - break; - case 1: - DirectoryString localityNameDirectoryString = DirectoryString.getInstance(o, true); - this.localityName = new DERUTF8String(localityNameDirectoryString.getString()); - break; - case 2: - if (o.isExplicit()) - { - this.postalAddress = ASN1Sequence.getInstance(o, true); - } - else // handle erroneous implicitly tagged sequences - { - this.postalAddress = ASN1Sequence.getInstance(o, false); - } - if (postalAddress != null && postalAddress.size() > 6) - { - throw new IllegalArgumentException("postal address must contain less than 6 strings"); - } - break; - default: - throw new IllegalArgumentException("illegal tag"); - } - } - } - - public SignerLocation( - DERUTF8String countryName, - DERUTF8String localityName, - ASN1Sequence postalAddress) - { - if (postalAddress != null && postalAddress.size() > 6) - { - throw new IllegalArgumentException("postal address must contain less than 6 strings"); - } - - if (countryName != null) - { - this.countryName = DERUTF8String.getInstance(countryName.toASN1Primitive()); - } - - if (localityName != null) - { - this.localityName = DERUTF8String.getInstance(localityName.toASN1Primitive()); - } - - if (postalAddress != null) - { - this.postalAddress = ASN1Sequence.getInstance(postalAddress.toASN1Primitive()); - } - } - - public static SignerLocation getInstance( - Object obj) - { - if (obj == null || obj instanceof SignerLocation) - { - return (SignerLocation)obj; - } - - return new SignerLocation(ASN1Sequence.getInstance(obj)); - } - - public DERUTF8String getCountryName() - { - return countryName; - } - - public DERUTF8String getLocalityName() - { - return localityName; - } - - public ASN1Sequence getPostalAddress() - { - return postalAddress; - } - - /** - *
    -     *   SignerLocation ::= SEQUENCE {
    -     *       countryName        [0] DirectoryString OPTIONAL,
    -     *       localityName       [1] DirectoryString OPTIONAL,
    -     *       postalAddress      [2] PostalAddress OPTIONAL }
    -     *
    -     *   PostalAddress ::= SEQUENCE SIZE(1..6) OF DirectoryString
    -     *   
    -     *   DirectoryString ::= CHOICE {
    -     *         teletexString           TeletexString (SIZE (1..MAX)),
    -     *         printableString         PrintableString (SIZE (1..MAX)),
    -     *         universalString         UniversalString (SIZE (1..MAX)),
    -     *         utf8String              UTF8String (SIZE (1.. MAX)),
    -     *         bmpString               BMPString (SIZE (1..MAX)) }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (countryName != null) - { - v.add(new DERTaggedObject(true, 0, countryName)); - } - - if (localityName != null) - { - v.add(new DERTaggedObject(true, 1, localityName)); - } - - if (postalAddress != null) - { - v.add(new DERTaggedObject(true, 2, postalAddress)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentHints.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentHints.java deleted file mode 100644 index 5c5a0c5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentHints.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERUTF8String; - -public class ContentHints - extends ASN1Object -{ - private DERUTF8String contentDescription; - private ASN1ObjectIdentifier contentType; - - public static ContentHints getInstance(Object o) - { - if (o instanceof ContentHints) - { - return (ContentHints)o; - } - else if (o != null) - { - return new ContentHints(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * constructor - */ - private ContentHints(ASN1Sequence seq) - { - ASN1Encodable field = seq.getObjectAt(0); - if (field.toASN1Primitive() instanceof DERUTF8String) - { - contentDescription = DERUTF8String.getInstance(field); - contentType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(1)); - } - else - { - contentType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - } - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public ContentHints( - DERObjectIdentifier contentType) - { - this(new ASN1ObjectIdentifier(contentType.getId())); - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public ContentHints( - DERObjectIdentifier contentType, - DERUTF8String contentDescription) - { - this(new ASN1ObjectIdentifier(contentType.getId()), contentDescription); - } - - public ContentHints( - ASN1ObjectIdentifier contentType) - { - this.contentType = contentType; - this.contentDescription = null; - } - - public ContentHints( - ASN1ObjectIdentifier contentType, - DERUTF8String contentDescription) - { - this.contentType = contentType; - this.contentDescription = contentDescription; - } - - public ASN1ObjectIdentifier getContentType() - { - return contentType; - } - - public DERUTF8String getContentDescription() - { - return contentDescription; - } - - /** - *
    -     * ContentHints ::= SEQUENCE {
    -     *   contentDescription UTF8String (SIZE (1..MAX)) OPTIONAL,
    -     *   contentType ContentType }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (contentDescription != null) - { - v.add(contentDescription); - } - - v.add(contentType); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentIdentifier.java deleted file mode 100644 index 57dbd9b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ContentIdentifier.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; - -public class ContentIdentifier - extends ASN1Object -{ - ASN1OctetString value; - - public static ContentIdentifier getInstance(Object o) - { - if (o instanceof ContentIdentifier) - { - return (ContentIdentifier) o; - } - else if (o != null) - { - return new ContentIdentifier(ASN1OctetString.getInstance(o)); - } - - return null; - } - - /** - * Create from OCTET STRING whose octets represent the identifier. - */ - private ContentIdentifier( - ASN1OctetString value) - { - this.value = value; - } - - /** - * Create from byte array representing the identifier. - */ - public ContentIdentifier( - byte[] value) - { - this(new DEROctetString(value)); - } - - public ASN1OctetString getValue() - { - return value; - } - - /** - * The definition of ContentIdentifier is - *
    -     * ContentIdentifier ::=  OCTET STRING
    -     * 
    - * id-aa-contentIdentifier OBJECT IDENTIFIER ::= { iso(1) - * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) - * smime(16) id-aa(2) 7 } - */ - public ASN1Primitive toASN1Primitive() - { - return value; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertID.java deleted file mode 100644 index db5210a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertID.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.IssuerSerial; - -public class ESSCertID - extends ASN1Object -{ - private ASN1OctetString certHash; - - private IssuerSerial issuerSerial; - - public static ESSCertID getInstance(Object o) - { - if (o instanceof ESSCertID) - { - return (ESSCertID)o; - } - else if (o != null) - { - return new ESSCertID(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * constructor - */ - private ESSCertID(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - certHash = ASN1OctetString.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - issuerSerial = IssuerSerial.getInstance(seq.getObjectAt(1)); - } - } - - public ESSCertID( - byte[] hash) - { - certHash = new DEROctetString(hash); - } - - public ESSCertID( - byte[] hash, - IssuerSerial issuerSerial) - { - this.certHash = new DEROctetString(hash); - this.issuerSerial = issuerSerial; - } - - public byte[] getCertHash() - { - return certHash.getOctets(); - } - - public IssuerSerial getIssuerSerial() - { - return issuerSerial; - } - - /** - *
    -     * ESSCertID ::= SEQUENCE {
    -     *     certHash Hash, 
    -     *     issuerSerial IssuerSerial OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certHash); - - if (issuerSerial != null) - { - v.add(issuerSerial); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertIDv2.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertIDv2.java deleted file mode 100644 index 5715920..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/ESSCertIDv2.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.nist.NISTObjectIdentifiers; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.IssuerSerial; - -public class ESSCertIDv2 - extends ASN1Object -{ - private AlgorithmIdentifier hashAlgorithm; - private byte[] certHash; - private IssuerSerial issuerSerial; - private static final AlgorithmIdentifier DEFAULT_ALG_ID = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256); - - public static ESSCertIDv2 getInstance( - Object o) - { - if (o instanceof ESSCertIDv2) - { - return (ESSCertIDv2) o; - } - else if (o != null) - { - return new ESSCertIDv2(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private ESSCertIDv2( - ASN1Sequence seq) - { - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - int count = 0; - - if (seq.getObjectAt(0) instanceof ASN1OctetString) - { - // Default value - this.hashAlgorithm = DEFAULT_ALG_ID; - } - else - { - this.hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(count++).toASN1Primitive()); - } - - this.certHash = ASN1OctetString.getInstance(seq.getObjectAt(count++).toASN1Primitive()).getOctets(); - - if (seq.size() > count) - { - this.issuerSerial = IssuerSerial.getInstance(seq.getObjectAt(count)); - } - } - - public ESSCertIDv2( - AlgorithmIdentifier algId, - byte[] certHash) - { - this(algId, certHash, null); - } - - public ESSCertIDv2( - AlgorithmIdentifier algId, - byte[] certHash, - IssuerSerial issuerSerial) - { - if (algId == null) - { - // Default value - this.hashAlgorithm = DEFAULT_ALG_ID; - } - else - { - this.hashAlgorithm = algId; - } - - this.certHash = certHash; - this.issuerSerial = issuerSerial; - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return this.hashAlgorithm; - } - - public byte[] getCertHash() - { - return certHash; - } - - public IssuerSerial getIssuerSerial() - { - return issuerSerial; - } - - /** - *
    -     * ESSCertIDv2 ::=  SEQUENCE {
    -     *     hashAlgorithm     AlgorithmIdentifier
    -     *              DEFAULT {algorithm id-sha256},
    -     *     certHash          Hash,
    -     *     issuerSerial      IssuerSerial OPTIONAL
    -     * }
    -     *
    -     * Hash ::= OCTET STRING
    -     *
    -     * IssuerSerial ::= SEQUENCE {
    -     *     issuer         GeneralNames,
    -     *     serialNumber   CertificateSerialNumber
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (!hashAlgorithm.equals(DEFAULT_ALG_ID)) - { - v.add(hashAlgorithm); - } - - v.add(new DEROctetString(certHash).toASN1Primitive()); - - if (issuerSerial != null) - { - v.add(issuerSerial); - } - - return new DERSequence(v); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherCertID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherCertID.java deleted file mode 100644 index b9d3429..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherCertID.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.DigestInfo; -import org.bc.asn1.x509.IssuerSerial; - -public class OtherCertID - extends ASN1Object -{ - private ASN1Encodable otherCertHash; - private IssuerSerial issuerSerial; - - public static OtherCertID getInstance(Object o) - { - if (o instanceof OtherCertID) - { - return (OtherCertID) o; - } - else if (o != null) - { - return new OtherCertID(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * constructor - */ - private OtherCertID(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - if (seq.getObjectAt(0).toASN1Primitive() instanceof ASN1OctetString) - { - otherCertHash = ASN1OctetString.getInstance(seq.getObjectAt(0)); - } - else - { - otherCertHash = DigestInfo.getInstance(seq.getObjectAt(0)); - - } - - if (seq.size() > 1) - { - issuerSerial = IssuerSerial.getInstance(seq.getObjectAt(1)); - } - } - - public OtherCertID( - AlgorithmIdentifier algId, - byte[] digest) - { - this.otherCertHash = new DigestInfo(algId, digest); - } - - public OtherCertID( - AlgorithmIdentifier algId, - byte[] digest, - IssuerSerial issuerSerial) - { - this.otherCertHash = new DigestInfo(algId, digest); - this.issuerSerial = issuerSerial; - } - - public AlgorithmIdentifier getAlgorithmHash() - { - if (otherCertHash.toASN1Primitive() instanceof ASN1OctetString) - { - // SHA-1 - return new AlgorithmIdentifier("1.3.14.3.2.26"); - } - else - { - return DigestInfo.getInstance(otherCertHash).getAlgorithmId(); - } - } - - public byte[] getCertHash() - { - if (otherCertHash.toASN1Primitive() instanceof ASN1OctetString) - { - // SHA-1 - return ((ASN1OctetString)otherCertHash.toASN1Primitive()).getOctets(); - } - else - { - return DigestInfo.getInstance(otherCertHash).getDigest(); - } - } - - public IssuerSerial getIssuerSerial() - { - return issuerSerial; - } - - /** - *
    -     * OtherCertID ::= SEQUENCE {
    -     *     otherCertHash    OtherHash,
    -     *     issuerSerial     IssuerSerial OPTIONAL }
    -     *
    -     * OtherHash ::= CHOICE {
    -     *     sha1Hash     OCTET STRING,
    -     *     otherHash    OtherHashAlgAndValue }
    -     *
    -     * OtherHashAlgAndValue ::= SEQUENCE {
    -     *     hashAlgorithm    AlgorithmIdentifier,
    -     *     hashValue        OCTET STRING }
    -     *
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(otherCertHash); - - if (issuerSerial != null) - { - v.add(issuerSerial); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherSigningCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherSigningCertificate.java deleted file mode 100644 index 9ccc82f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/OtherSigningCertificate.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.PolicyInformation; - -public class OtherSigningCertificate - extends ASN1Object -{ - ASN1Sequence certs; - ASN1Sequence policies; - - public static OtherSigningCertificate getInstance(Object o) - { - if (o instanceof OtherSigningCertificate) - { - return (OtherSigningCertificate) o; - } - else if (o != null) - { - return new OtherSigningCertificate(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * constructeurs - */ - private OtherSigningCertificate(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - this.certs = ASN1Sequence.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - this.policies = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - } - - public OtherSigningCertificate( - OtherCertID otherCertID) - { - certs = new DERSequence(otherCertID); - } - - public OtherCertID[] getCerts() - { - OtherCertID[] cs = new OtherCertID[certs.size()]; - - for (int i = 0; i != certs.size(); i++) - { - cs[i] = OtherCertID.getInstance(certs.getObjectAt(i)); - } - - return cs; - } - - public PolicyInformation[] getPolicies() - { - if (policies == null) - { - return null; - } - - PolicyInformation[] ps = new PolicyInformation[policies.size()]; - - for (int i = 0; i != policies.size(); i++) - { - ps[i] = PolicyInformation.getInstance(policies.getObjectAt(i)); - } - - return ps; - } - - /** - * The definition of OtherSigningCertificate is - *
    -     * OtherSigningCertificate ::=  SEQUENCE {
    -     *      certs        SEQUENCE OF OtherCertID,
    -     *      policies     SEQUENCE OF PolicyInformation OPTIONAL
    -     * }
    -     * 
    - * id-aa-ets-otherSigCert OBJECT IDENTIFIER ::= { iso(1) - * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) - * smime(16) id-aa(2) 19 } - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certs); - - if (policies != null) - { - v.add(policies); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificate.java deleted file mode 100644 index 03834ae..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificate.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.PolicyInformation; - - -public class SigningCertificate - extends ASN1Object -{ - ASN1Sequence certs; - ASN1Sequence policies; - - public static SigningCertificate getInstance(Object o) - { - if (o instanceof SigningCertificate) - { - return (SigningCertificate) o; - } - else if (o != null) - { - return new SigningCertificate(ASN1Sequence.getInstance(o)); - } - - return null; - } - - /** - * constructeurs - */ - private SigningCertificate(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - this.certs = ASN1Sequence.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - this.policies = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - } - - public SigningCertificate( - ESSCertID essCertID) - { - certs = new DERSequence(essCertID); - } - - public ESSCertID[] getCerts() - { - ESSCertID[] cs = new ESSCertID[certs.size()]; - - for (int i = 0; i != certs.size(); i++) - { - cs[i] = ESSCertID.getInstance(certs.getObjectAt(i)); - } - - return cs; - } - - public PolicyInformation[] getPolicies() - { - if (policies == null) - { - return null; - } - - PolicyInformation[] ps = new PolicyInformation[policies.size()]; - - for (int i = 0; i != policies.size(); i++) - { - ps[i] = PolicyInformation.getInstance(policies.getObjectAt(i)); - } - - return ps; - } - - /** - * The definition of SigningCertificate is - *
    -     * SigningCertificate ::=  SEQUENCE {
    -     *      certs        SEQUENCE OF ESSCertID,
    -     *      policies     SEQUENCE OF PolicyInformation OPTIONAL
    -     * }
    -     * 
    - * id-aa-signingCertificate OBJECT IDENTIFIER ::= { iso(1) - * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) - * smime(16) id-aa(2) 12 } - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certs); - - if (policies != null) - { - v.add(policies); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificateV2.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificateV2.java deleted file mode 100644 index 7ea68ee..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ess/SigningCertificateV2.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.bc.asn1.ess; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.PolicyInformation; - -public class SigningCertificateV2 - extends ASN1Object -{ - ASN1Sequence certs; - ASN1Sequence policies; - - public static SigningCertificateV2 getInstance( - Object o) - { - if (o == null || o instanceof SigningCertificateV2) - { - return (SigningCertificateV2) o; - } - else if (o instanceof ASN1Sequence) - { - return new SigningCertificateV2((ASN1Sequence) o); - } - - return null; - } - - private SigningCertificateV2( - ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - this.certs = ASN1Sequence.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - this.policies = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - } - - public SigningCertificateV2( - ESSCertIDv2[] certs) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i=0; i < certs.length; i++) - { - v.add(certs[i]); - } - this.certs = new DERSequence(v); - } - - public SigningCertificateV2( - ESSCertIDv2[] certs, - PolicyInformation[] policies) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i=0; i < certs.length; i++) - { - v.add(certs[i]); - } - this.certs = new DERSequence(v); - - if (policies != null) - { - v = new ASN1EncodableVector(); - for (int i=0; i < policies.length; i++) - { - v.add(policies[i]); - } - this.policies = new DERSequence(v); - } - } - - public ESSCertIDv2[] getCerts() - { - ESSCertIDv2[] certIds = new ESSCertIDv2[certs.size()]; - for (int i = 0; i != certs.size(); i++) - { - certIds[i] = ESSCertIDv2.getInstance(certs.getObjectAt(i)); - } - return certIds; - } - - public PolicyInformation[] getPolicies() - { - if (policies == null) - { - return null; - } - - PolicyInformation[] policyInformations = new PolicyInformation[policies.size()]; - for (int i = 0; i != policies.size(); i++) - { - policyInformations[i] = PolicyInformation.getInstance(policies.getObjectAt(i)); - } - return policyInformations; - } - - /** - * The definition of SigningCertificateV2 is - *
    -     * SigningCertificateV2 ::=  SEQUENCE {
    -     *      certs        SEQUENCE OF ESSCertIDv2,
    -     *      policies     SEQUENCE OF PolicyInformation OPTIONAL
    -     * }
    -     * 
    - * id-aa-signingCertificateV2 OBJECT IDENTIFIER ::= { iso(1) - * member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs9(9) - * smime(16) id-aa(2) 47 } - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certs); - - if (policies != null) - { - v.add(policies); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/gnu/GNUObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/gnu/GNUObjectIdentifiers.java deleted file mode 100644 index 71b94be..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/gnu/GNUObjectIdentifiers.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.asn1.gnu; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface GNUObjectIdentifiers -{ - public static final ASN1ObjectIdentifier GNU = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.1"); // GNU Radius - public static final ASN1ObjectIdentifier GnuPG = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.2"); // GnuPG (Ägypten) - public static final ASN1ObjectIdentifier notation = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.2.1"); // notation - public static final ASN1ObjectIdentifier pkaAddress = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.2.1.1"); // pkaAddress - public static final ASN1ObjectIdentifier GnuRadar = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.3"); // GNU Radar - public static final ASN1ObjectIdentifier digestAlgorithm = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.12"); // digestAlgorithm - public static final ASN1ObjectIdentifier Tiger_192 = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.12.2"); // TIGER/192 - public static final ASN1ObjectIdentifier encryptionAlgorithm = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13"); // encryptionAlgorithm - public static final ASN1ObjectIdentifier Serpent = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2"); // Serpent - public static final ASN1ObjectIdentifier Serpent_128_ECB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.1"); // Serpent-128-ECB - public static final ASN1ObjectIdentifier Serpent_128_CBC = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.2"); // Serpent-128-CBC - public static final ASN1ObjectIdentifier Serpent_128_OFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.3"); // Serpent-128-OFB - public static final ASN1ObjectIdentifier Serpent_128_CFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.4"); // Serpent-128-CFB - public static final ASN1ObjectIdentifier Serpent_192_ECB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.21"); // Serpent-192-ECB - public static final ASN1ObjectIdentifier Serpent_192_CBC = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.22"); // Serpent-192-CBC - public static final ASN1ObjectIdentifier Serpent_192_OFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.23"); // Serpent-192-OFB - public static final ASN1ObjectIdentifier Serpent_192_CFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.24"); // Serpent-192-CFB - public static final ASN1ObjectIdentifier Serpent_256_ECB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.41"); // Serpent-256-ECB - public static final ASN1ObjectIdentifier Serpent_256_CBC = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.42"); // Serpent-256-CBC - public static final ASN1ObjectIdentifier Serpent_256_OFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.43"); // Serpent-256-OFB - public static final ASN1ObjectIdentifier Serpent_256_CFB = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.13.2.44"); // Serpent-256-CFB - public static final ASN1ObjectIdentifier CRC = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.14"); // CRC algorithms - public static final ASN1ObjectIdentifier CRC32 = new ASN1ObjectIdentifier("1.3.6.1.4.1.11591.14.1"); // CRC 32 -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/iana/IANAObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/iana/IANAObjectIdentifiers.java deleted file mode 100644 index b279381..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/iana/IANAObjectIdentifiers.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.bc.asn1.iana; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface IANAObjectIdentifiers -{ - // id-SHA1 OBJECT IDENTIFIER ::= - // {iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) ipsec(8) isakmpOakley(1)} - // - - static final ASN1ObjectIdentifier isakmpOakley = new ASN1ObjectIdentifier("1.3.6.1.5.5.8.1"); - - static final ASN1ObjectIdentifier hmacMD5 = new ASN1ObjectIdentifier(isakmpOakley + ".1"); - static final ASN1ObjectIdentifier hmacSHA1 = new ASN1ObjectIdentifier(isakmpOakley + ".2"); - - static final ASN1ObjectIdentifier hmacTIGER = new ASN1ObjectIdentifier(isakmpOakley + ".3"); - - static final ASN1ObjectIdentifier hmacRIPEMD160 = new ASN1ObjectIdentifier(isakmpOakley + ".4"); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/CscaMasterList.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/CscaMasterList.java deleted file mode 100644 index 5a00ef4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/CscaMasterList.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.asn1.icao; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERSet; -import org.bc.asn1.x509.Certificate; - -/** - * The CscaMasterList object. This object can be wrapped in a - * CMSSignedData to be published in LDAP. - * - *
    - * CscaMasterList ::= SEQUENCE {
    - *   version                CscaMasterListVersion,
    - *   certList               SET OF Certificate }
    - *   
    - * CscaMasterListVersion :: INTEGER {v0(0)}
    - * 
    - */ - -public class CscaMasterList - extends ASN1Object -{ - private ASN1Integer version = new ASN1Integer(0); - private Certificate[] certList; - - public static CscaMasterList getInstance( - Object obj) - { - if (obj instanceof CscaMasterList) - { - return (CscaMasterList)obj; - } - else if (obj != null) - { - return new CscaMasterList(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CscaMasterList( - ASN1Sequence seq) - { - if (seq == null || seq.size() == 0) - { - throw new IllegalArgumentException( - "null or empty sequence passed."); - } - if (seq.size() != 2) { - throw new IllegalArgumentException( - "Incorrect sequence size: " + seq.size()); - } - - version = ASN1Integer.getInstance(seq.getObjectAt(0)); - ASN1Set certSet = ASN1Set.getInstance(seq.getObjectAt(1)); - certList = new Certificate[certSet.size()]; - for (int i = 0; i < certList.length; i++) { - certList[i] - = Certificate.getInstance(certSet.getObjectAt(i)); - } - } - - public CscaMasterList( - Certificate[] certStructs) - { - certList = copyCertList(certStructs); - } - - public int getVersion() - { - return version.getValue().intValue(); - } - - public Certificate[] getCertStructs() - { - return copyCertList(certList); - } - - private Certificate[] copyCertList(Certificate[] orig) - { - Certificate[] certs = new Certificate[orig.length]; - - for (int i = 0; i != certs.length; i++) - { - certs[i] = orig[i]; - } - - return certs; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - - seq.add(version); - - ASN1EncodableVector certSet = new ASN1EncodableVector(); - for (int i = 0; i < certList.length; i++) - { - certSet.add(certList[i]); - } - seq.add(new DERSet(certSet)); - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/DataGroupHash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/DataGroupHash.java deleted file mode 100644 index 4876e4c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/DataGroupHash.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.asn1.icao; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * The DataGroupHash object. - *
    - * DataGroupHash  ::=  SEQUENCE {
    - *      dataGroupNumber         DataGroupNumber,
    - *      dataGroupHashValue     OCTET STRING }
    - * 
    - * DataGroupNumber ::= INTEGER {
    - *         dataGroup1    (1),
    - *         dataGroup1    (2),
    - *         dataGroup1    (3),
    - *         dataGroup1    (4),
    - *         dataGroup1    (5),
    - *         dataGroup1    (6),
    - *         dataGroup1    (7),
    - *         dataGroup1    (8),
    - *         dataGroup1    (9),
    - *         dataGroup1    (10),
    - *         dataGroup1    (11),
    - *         dataGroup1    (12),
    - *         dataGroup1    (13),
    - *         dataGroup1    (14),
    - *         dataGroup1    (15),
    - *         dataGroup1    (16) }
    - * 
    - * 
    - */ -public class DataGroupHash - extends ASN1Object -{ - ASN1Integer dataGroupNumber; - ASN1OctetString dataGroupHashValue; - - public static DataGroupHash getInstance( - Object obj) - { - if (obj instanceof DataGroupHash) - { - return (DataGroupHash)obj; - } - else if (obj != null) - { - return new DataGroupHash(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private DataGroupHash(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - // dataGroupNumber - dataGroupNumber = ASN1Integer.getInstance(e.nextElement()); - // dataGroupHashValue - dataGroupHashValue = ASN1OctetString.getInstance(e.nextElement()); - } - - public DataGroupHash( - int dataGroupNumber, - ASN1OctetString dataGroupHashValue) - { - this.dataGroupNumber = new ASN1Integer(dataGroupNumber); - this.dataGroupHashValue = dataGroupHashValue; - } - - public int getDataGroupNumber() - { - return dataGroupNumber.getValue().intValue(); - } - - public ASN1OctetString getDataGroupHashValue() - { - return dataGroupHashValue; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(dataGroupNumber); - seq.add(dataGroupHashValue); - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/ICAOObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/ICAOObjectIdentifiers.java deleted file mode 100644 index aed81a4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/ICAOObjectIdentifiers.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.bc.asn1.icao; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface ICAOObjectIdentifiers -{ - // - // base id - // - static final ASN1ObjectIdentifier id_icao = new ASN1ObjectIdentifier("2.23.136"); - - static final ASN1ObjectIdentifier id_icao_mrtd = id_icao.branch("1"); - static final ASN1ObjectIdentifier id_icao_mrtd_security = id_icao_mrtd.branch("1"); - - // LDS security object, see ICAO Doc 9303-Volume 2-Section IV-A3.2 - static final ASN1ObjectIdentifier id_icao_ldsSecurityObject = id_icao_mrtd_security.branch("1"); - - // CSCA master list, see TR CSCA Countersigning and Master List issuance - static final ASN1ObjectIdentifier id_icao_cscaMasterList = id_icao_mrtd_security.branch("2"); - static final ASN1ObjectIdentifier id_icao_cscaMasterListSigningKey = id_icao_mrtd_security.branch("3"); - - // document type list, see draft TR LDS and PKI Maintenance, par. 3.2.1 - static final ASN1ObjectIdentifier id_icao_documentTypeList = id_icao_mrtd_security.branch("4"); - - // Active Authentication protocol, see draft TR LDS and PKI Maintenance, - // par. 5.2.2 - static final ASN1ObjectIdentifier id_icao_aaProtocolObject = id_icao_mrtd_security.branch("5"); - - // CSCA name change and key reoll-over, see draft TR LDS and PKI - // Maintenance, par. 3.2.1 - static final ASN1ObjectIdentifier id_icao_extensions = id_icao_mrtd_security.branch("6"); - static final ASN1ObjectIdentifier id_icao_extensions_namechangekeyrollover = id_icao_extensions.branch("1"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSSecurityObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSSecurityObject.java deleted file mode 100644 index e7bad61..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSSecurityObject.java +++ /dev/null @@ -1,159 +0,0 @@ -package org.bc.asn1.icao; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * The LDSSecurityObject object (V1.8). - *
    - * LDSSecurityObject ::= SEQUENCE {
    - *   version                LDSSecurityObjectVersion,
    - *   hashAlgorithm          DigestAlgorithmIdentifier,
    - *   dataGroupHashValues    SEQUENCE SIZE (2..ub-DataGroups) OF DataHashGroup,
    - *   ldsVersionInfo         LDSVersionInfo OPTIONAL
    - *   -- if present, version MUST be v1 }
    - *   
    - * DigestAlgorithmIdentifier ::= AlgorithmIdentifier,
    - * 
    - * LDSSecurityObjectVersion :: INTEGER {V0(0)}
    - * 
    - */ - -public class LDSSecurityObject - extends ASN1Object - implements ICAOObjectIdentifiers -{ - public static final int ub_DataGroups = 16; - - private ASN1Integer version = new ASN1Integer(0); - private AlgorithmIdentifier digestAlgorithmIdentifier; - private DataGroupHash[] datagroupHash; - private LDSVersionInfo versionInfo; - - public static LDSSecurityObject getInstance( - Object obj) - { - if (obj instanceof LDSSecurityObject) - { - return (LDSSecurityObject)obj; - } - else if (obj != null) - { - return new LDSSecurityObject(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private LDSSecurityObject( - ASN1Sequence seq) - { - if (seq == null || seq.size() == 0) - { - throw new IllegalArgumentException("null or empty sequence passed."); - } - - Enumeration e = seq.getObjects(); - - // version - version = ASN1Integer.getInstance(e.nextElement()); - // digestAlgorithmIdentifier - digestAlgorithmIdentifier = AlgorithmIdentifier.getInstance(e.nextElement()); - - ASN1Sequence datagroupHashSeq = ASN1Sequence.getInstance(e.nextElement()); - - if (version.getValue().intValue() == 1) - { - versionInfo = LDSVersionInfo.getInstance(e.nextElement()); - } - - checkDatagroupHashSeqSize(datagroupHashSeq.size()); - - datagroupHash = new DataGroupHash[datagroupHashSeq.size()]; - for (int i= 0; i< datagroupHashSeq.size();i++) - { - datagroupHash[i] = DataGroupHash.getInstance(datagroupHashSeq.getObjectAt(i)); - } - } - - public LDSSecurityObject( - AlgorithmIdentifier digestAlgorithmIdentifier, - DataGroupHash[] datagroupHash) - { - this.version = new ASN1Integer(0); - this.digestAlgorithmIdentifier = digestAlgorithmIdentifier; - this.datagroupHash = datagroupHash; - - checkDatagroupHashSeqSize(datagroupHash.length); - } - - public LDSSecurityObject( - AlgorithmIdentifier digestAlgorithmIdentifier, - DataGroupHash[] datagroupHash, - LDSVersionInfo versionInfo) - { - this.version = new ASN1Integer(1); - this.digestAlgorithmIdentifier = digestAlgorithmIdentifier; - this.datagroupHash = datagroupHash; - this.versionInfo = versionInfo; - - checkDatagroupHashSeqSize(datagroupHash.length); - } - - private void checkDatagroupHashSeqSize(int size) - { - if ((size < 2) || (size > ub_DataGroups)) - { - throw new IllegalArgumentException("wrong size in DataGroupHashValues : not in (2.."+ ub_DataGroups +")"); - } - } - - public int getVersion() - { - return version.getValue().intValue(); - } - - public AlgorithmIdentifier getDigestAlgorithmIdentifier() - { - return digestAlgorithmIdentifier; - } - - public DataGroupHash[] getDatagroupHash() - { - return datagroupHash; - } - - public LDSVersionInfo getVersionInfo() - { - return versionInfo; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - - seq.add(version); - seq.add(digestAlgorithmIdentifier); - - ASN1EncodableVector seqname = new ASN1EncodableVector(); - for (int i = 0; i < datagroupHash.length; i++) - { - seqname.add(datagroupHash[i]); - } - seq.add(new DERSequence(seqname)); - - if (versionInfo != null) - { - seq.add(versionInfo); - } - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSVersionInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSVersionInfo.java deleted file mode 100644 index 2840bdf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/icao/LDSVersionInfo.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.bc.asn1.icao; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; - -public class LDSVersionInfo - extends ASN1Object -{ - private DERPrintableString ldsVersion; - private DERPrintableString unicodeVersion; - - public LDSVersionInfo(String ldsVersion, String unicodeVersion) - { - this.ldsVersion = new DERPrintableString(ldsVersion); - this.unicodeVersion = new DERPrintableString(unicodeVersion); - } - - private LDSVersionInfo(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("sequence wrong size for LDSVersionInfo"); - } - - this.ldsVersion = DERPrintableString.getInstance(seq.getObjectAt(0)); - this.unicodeVersion = DERPrintableString.getInstance(seq.getObjectAt(1)); - } - - public static LDSVersionInfo getInstance(Object obj) - { - if (obj instanceof LDSVersionInfo) - { - return (LDSVersionInfo)obj; - } - else if (obj != null) - { - return new LDSVersionInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public String getLdsVersion() - { - return ldsVersion.getString(); - } - - public String getUnicodeVersion() - { - return unicodeVersion.getString(); - } - - /** - *
    -     * LDSVersionInfo ::= SEQUENCE {
    -	 *    ldsVersion PRINTABLE STRING
    -	 *    unicodeVersion PRINTABLE STRING
    -     *  }
    -     * 
    - * @return - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(ldsVersion); - v.add(unicodeVersion); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ISISMTTObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ISISMTTObjectIdentifiers.java deleted file mode 100644 index 4ef723f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ISISMTTObjectIdentifiers.java +++ /dev/null @@ -1,180 +0,0 @@ -package org.bc.asn1.isismtt; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface ISISMTTObjectIdentifiers -{ - - static final ASN1ObjectIdentifier id_isismtt = new ASN1ObjectIdentifier("1.3.36.8"); - - static final ASN1ObjectIdentifier id_isismtt_cp = id_isismtt.branch("1"); - - /** - * The id-isismtt-cp-accredited OID indicates that the certificate is a - * qualified certificate according to Directive 1999/93/EC of the European - * Parliament and of the Council of 13 December 1999 on a Community - * Framework for Electronic Signatures, which additionally conforms the - * special requirements of the SigG and has been issued by an accredited CA. - */ - static final ASN1ObjectIdentifier id_isismtt_cp_accredited = id_isismtt_cp.branch("1"); - - static final ASN1ObjectIdentifier id_isismtt_at = id_isismtt.branch("3"); - - /** - * Certificate extensionDate of certificate generation - * - *
    -     *                DateOfCertGenSyntax ::= GeneralizedTime
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_dateOfCertGen = id_isismtt_at.branch("1"); - - /** - * Attribute to indicate that the certificate holder may sign in the name of - * a third person. May also be used as extension in a certificate. - */ - static final ASN1ObjectIdentifier id_isismtt_at_procuration = id_isismtt_at.branch("2"); - - /** - * Attribute to indicate admissions to certain professions. May be used as - * attribute in attribute certificate or as extension in a certificate - */ - static final ASN1ObjectIdentifier id_isismtt_at_admission = id_isismtt_at.branch("3"); - - /** - * Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST - * be used in new certificates in place of the extension/attribute - * MonetaryLimit since January 1, 2004. For the sake of backward - * compatibility with certificates already in use, SigG conforming - * components MUST support MonetaryLimit (as well as QcEuLimitValue). - */ - static final ASN1ObjectIdentifier id_isismtt_at_monetaryLimit = id_isismtt_at.branch("4"); - - /** - * A declaration of majority. May be used as attribute in attribute - * certificate or as extension in a certificate - */ - static final ASN1ObjectIdentifier id_isismtt_at_declarationOfMajority = id_isismtt_at.branch("5"); - - /** - * - * Serial number of the smart card containing the corresponding private key - * - *
    -     *                 ICCSNSyntax ::= OCTET STRING (SIZE(8..20))
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_iCCSN = id_isismtt_at.branch("6"); - - /** - * - * Reference for a file of a smartcard that stores the public key of this - * certificate and that is used as �security anchor�. - * - *
    -     *      PKReferenceSyntax ::= OCTET STRING (SIZE(20))
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_PKReference = id_isismtt_at.branch("7"); - - /** - * Some other restriction regarding the usage of this certificate. May be - * used as attribute in attribute certificate or as extension in a - * certificate. - * - *
    -     *             RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
    -     * 
    - * - * @see org.bc.asn1.isismtt.x509.Restriction - */ - static final ASN1ObjectIdentifier id_isismtt_at_restriction = id_isismtt_at.branch("8"); - - /** - * - * (Single)Request extension: Clients may include this extension in a - * (single) Request to request the responder to send the certificate in the - * response message along with the status information. Besides the LDAP - * service, this extension provides another mechanism for the distribution - * of certificates, which MAY optionally be provided by certificate - * repositories. - * - *
    -     *        RetrieveIfAllowed ::= BOOLEAN
    -     *       
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_retrieveIfAllowed = id_isismtt_at.branch("9"); - - /** - * SingleOCSPResponse extension: The certificate requested by the client by - * inserting the RetrieveIfAllowed extension in the request, will be - * returned in this extension. - * - * @see org.bc.asn1.isismtt.ocsp.RequestedCertificate - */ - static final ASN1ObjectIdentifier id_isismtt_at_requestedCertificate = id_isismtt_at.branch("10"); - - /** - * Base ObjectIdentifier for naming authorities - */ - static final ASN1ObjectIdentifier id_isismtt_at_namingAuthorities = id_isismtt_at.branch("11"); - - /** - * SingleOCSPResponse extension: Date, when certificate has been published - * in the directory and status information has become available. Currently, - * accrediting authorities enforce that SigG-conforming OCSP servers include - * this extension in the responses. - * - *
    -     *      CertInDirSince ::= GeneralizedTime
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_certInDirSince = id_isismtt_at.branch("12"); - - /** - * Hash of a certificate in OCSP. - * - * @see org.bc.asn1.isismtt.ocsp.CertHash - */ - static final ASN1ObjectIdentifier id_isismtt_at_certHash = id_isismtt_at.branch("13"); - - /** - *
    -     *          NameAtBirth ::= DirectoryString(SIZE(1..64)
    -     * 
    - * - * Used in - * {@link org.bc.asn1.x509.SubjectDirectoryAttributes SubjectDirectoryAttributes} - */ - static final ASN1ObjectIdentifier id_isismtt_at_nameAtBirth = id_isismtt_at.branch("14"); - - /** - * Some other information of non-restrictive nature regarding the usage of - * this certificate. May be used as attribute in atribute certificate or as - * extension in a certificate. - * - *
    -     *               AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
    -     * 
    - * - * @see org.bc.asn1.isismtt.x509.AdditionalInformationSyntax - */ - static final ASN1ObjectIdentifier id_isismtt_at_additionalInformation = id_isismtt_at.branch("15"); - - /** - * Indicates that an attribute certificate exists, which limits the - * usability of this public key certificate. Whenever verifying a signature - * with the help of this certificate, the content of the corresponding - * attribute certificate should be concerned. This extension MUST be - * included in a PKC, if a corresponding attribute certificate (having the - * PKC as base certificate) contains some attribute that restricts the - * usability of the PKC too. Attribute certificates with restricting content - * MUST always be included in the signed document. - * - *
    -     *                   LiabilityLimitationFlagSyntax ::= BOOLEAN
    -     * 
    - */ - static final ASN1ObjectIdentifier id_isismtt_at_liabilityLimitationFlag = new ASN1ObjectIdentifier("0.2.262.1.10.12.0"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/CertHash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/CertHash.java deleted file mode 100644 index cd78d04..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/CertHash.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.bc.asn1.isismtt.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * ISIS-MTT PROFILE: The responder may include this extension in a response to - * send the hash of the requested certificate to the responder. This hash is - * cryptographically bound to the certificate and serves as evidence that the - * certificate is known to the responder (i.e. it has been issued and is present - * in the directory). Hence, this extension is a means to provide a positive - * statement of availability as described in T8.[8]. As explained in T13.[1], - * clients may rely on this information to be able to validate signatures after - * the expiry of the corresponding certificate. Hence, clients MUST support this - * extension. If a positive statement of availability is to be delivered, this - * extension syntax and OID MUST be used. - *

    - *

    - *

    - *     CertHash ::= SEQUENCE {
    - *       hashAlgorithm AlgorithmIdentifier,
    - *       certificateHash OCTET STRING
    - *     }
    - * 
    - */ -public class CertHash - extends ASN1Object -{ - - private AlgorithmIdentifier hashAlgorithm; - private byte[] certificateHash; - - public static CertHash getInstance(Object obj) - { - if (obj == null || obj instanceof CertHash) - { - return (CertHash)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new CertHash((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type CertHash: - *

    - *

    -     *     CertHash ::= SEQUENCE {
    -     *       hashAlgorithm AlgorithmIdentifier,
    -     *       certificateHash OCTET STRING
    -     *     }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private CertHash(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - certificateHash = DEROctetString.getInstance(seq.getObjectAt(1)).getOctets(); - } - - /** - * Constructor from a given details. - * - * @param hashAlgorithm The hash algorithm identifier. - * @param certificateHash The hash of the whole DER encoding of the certificate. - */ - public CertHash(AlgorithmIdentifier hashAlgorithm, byte[] certificateHash) - { - this.hashAlgorithm = hashAlgorithm; - this.certificateHash = new byte[certificateHash.length]; - System.arraycopy(certificateHash, 0, this.certificateHash, 0, - certificateHash.length); - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public byte[] getCertificateHash() - { - return certificateHash; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *     CertHash ::= SEQUENCE {
    -     *       hashAlgorithm AlgorithmIdentifier,
    -     *       certificateHash OCTET STRING
    -     *     }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - vec.add(hashAlgorithm); - vec.add(new DEROctetString(certificateHash)); - return new DERSequence(vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/RequestedCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/RequestedCertificate.java deleted file mode 100644 index 20234eb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/ocsp/RequestedCertificate.java +++ /dev/null @@ -1,183 +0,0 @@ -package org.bc.asn1.isismtt.ocsp; - -import java.io.IOException; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Certificate; - -/** - * ISIS-MTT-Optional: The certificate requested by the client by inserting the - * RetrieveIfAllowed extension in the request, will be returned in this - * extension. - *

    - * ISIS-MTT-SigG: The signature act allows publishing certificates only then, - * when the certificate owner gives his explicit permission. Accordingly, there - * may be �nondownloadable� certificates, about which the responder must provide - * status information, but MUST NOT include them in the response. Clients may - * get therefore the following three kind of answers on a single request - * including the RetrieveIfAllowed extension: - *

      - *
    • a) the responder supports the extension and is allowed to publish the - * certificate: RequestedCertificate returned including the requested - * certificate - *
    • b) the responder supports the extension but is NOT allowed to publish - * the certificate: RequestedCertificate returned including an empty OCTET - * STRING - *
    • c) the responder does not support the extension: RequestedCertificate is - * not included in the response - *
    - * Clients requesting RetrieveIfAllowed MUST be able to handle these cases. If - * any of the OCTET STRING options is used, it MUST contain the DER encoding of - * the requested certificate. - *

    - *

    - *            RequestedCertificate ::= CHOICE {
    - *              Certificate Certificate,
    - *              publicKeyCertificate [0] EXPLICIT OCTET STRING,
    - *              attributeCertificate [1] EXPLICIT OCTET STRING
    - *            }
    - * 
    - */ -public class RequestedCertificate - extends ASN1Object - implements ASN1Choice -{ - public static final int certificate = -1; - public static final int publicKeyCertificate = 0; - public static final int attributeCertificate = 1; - - private Certificate cert; - private byte[] publicKeyCert; - private byte[] attributeCert; - - public static RequestedCertificate getInstance(Object obj) - { - if (obj == null || obj instanceof RequestedCertificate) - { - return (RequestedCertificate)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new RequestedCertificate(Certificate.getInstance(obj)); - } - if (obj instanceof ASN1TaggedObject) - { - return new RequestedCertificate((ASN1TaggedObject)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - public static RequestedCertificate getInstance(ASN1TaggedObject obj, boolean explicit) - { - if (!explicit) - { - throw new IllegalArgumentException("choice item must be explicitly tagged"); - } - - return getInstance(obj.getObject()); - } - - private RequestedCertificate(ASN1TaggedObject tagged) - { - if (tagged.getTagNo() == publicKeyCertificate) - { - publicKeyCert = ASN1OctetString.getInstance(tagged, true).getOctets(); - } - else if (tagged.getTagNo() == attributeCertificate) - { - attributeCert = ASN1OctetString.getInstance(tagged, true).getOctets(); - } - else - { - throw new IllegalArgumentException("unknown tag number: " + tagged.getTagNo()); - } - } - - /** - * Constructor from a given details. - *

    - * Only one parameter can be given. All other must be null. - * - * @param certificate Given as Certificate - */ - public RequestedCertificate(Certificate certificate) - { - this.cert = certificate; - } - - public RequestedCertificate(int type, byte[] certificateOctets) - { - this(new DERTaggedObject(type, new DEROctetString(certificateOctets))); - } - - public int getType() - { - if (cert != null) - { - return certificate; - } - if (publicKeyCert != null) - { - return publicKeyCertificate; - } - return attributeCertificate; - } - - public byte[] getCertificateBytes() - { - if (cert != null) - { - try - { - return cert.getEncoded(); - } - catch (IOException e) - { - throw new IllegalStateException("can't decode certificate: " + e); - } - } - if (publicKeyCert != null) - { - return publicKeyCert; - } - return attributeCert; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *            RequestedCertificate ::= CHOICE {
    -     *              Certificate Certificate,
    -     *              publicKeyCertificate [0] EXPLICIT OCTET STRING,
    -     *              attributeCertificate [1] EXPLICIT OCTET STRING
    -     *            }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - if (publicKeyCert != null) - { - return new DERTaggedObject(0, new DEROctetString(publicKeyCert)); - } - if (attributeCert != null) - { - return new DERTaggedObject(1, new DEROctetString(attributeCert)); - } - return cert.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdditionalInformationSyntax.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdditionalInformationSyntax.java deleted file mode 100644 index a7a8d82..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdditionalInformationSyntax.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.x500.DirectoryString; - -/** - * Some other information of non-restrictive nature regarding the usage of this - * certificate. - * - *
    - *    AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
    - * 
    - */ -public class AdditionalInformationSyntax - extends ASN1Object -{ - private DirectoryString information; - - public static AdditionalInformationSyntax getInstance(Object obj) - { - if (obj instanceof AdditionalInformationSyntax) - { - return (AdditionalInformationSyntax)obj; - } - - if (obj != null) - { - return new AdditionalInformationSyntax(DirectoryString.getInstance(obj)); - } - - return null; - } - - private AdditionalInformationSyntax(DirectoryString information) - { - this.information = information; - } - - /** - * Constructor from a given details. - * - * @param information The describtion of the information. - */ - public AdditionalInformationSyntax(String information) - { - this(new DirectoryString(information)); - } - - public DirectoryString getInformation() - { - return information; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *   AdditionalInformationSyntax ::= DirectoryString (SIZE(1..2048))
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - return information.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdmissionSyntax.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdmissionSyntax.java deleted file mode 100644 index 6364644..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/AdmissionSyntax.java +++ /dev/null @@ -1,280 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.GeneralName; - -/** - * Attribute to indicate admissions to certain professions. - *

    - *

    - *     AdmissionSyntax ::= SEQUENCE
    - *     {
    - *       admissionAuthority GeneralName OPTIONAL,
    - *       contentsOfAdmissions SEQUENCE OF Admissions
    - *     }
    - * 

    - * Admissions ::= SEQUENCE - * { - * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL - * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL - * professionInfos SEQUENCE OF ProfessionInfo - * } - *

    - * NamingAuthority ::= SEQUENCE - * { - * namingAuthorityId OBJECT IDENTIFIER OPTIONAL, - * namingAuthorityUrl IA5String OPTIONAL, - * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL - * } - *

    - * ProfessionInfo ::= SEQUENCE - * { - * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, - * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), - * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, - * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, - * addProfessionInfo OCTET STRING OPTIONAL - * } - *

    - *

    - *

    - * ISIS-MTT PROFILE: The relatively complex structure of AdmissionSyntax - * supports the following concepts and requirements: - *

      - *
    • External institutions (e.g. professional associations, chambers, unions, - * administrative bodies, companies, etc.), which are responsible for granting - * and verifying professional admissions, are indicated by means of the data - * field admissionAuthority. An admission authority is indicated by a - * GeneralName object. Here an X.501 directory name (distinguished name) can be - * indicated in the field directoryName, a URL address can be indicated in the - * field uniformResourceIdentifier, and an object identifier can be indicated in - * the field registeredId. - *
    • The names of authorities which are responsible for the administration of - * title registers are indicated in the data field namingAuthority. The name of - * the authority can be identified by an object identifier in the field - * namingAuthorityId, by means of a text string in the field - * namingAuthorityText, by means of a URL address in the field - * namingAuthorityUrl, or by a combination of them. For example, the text string - * can contain the name of the authority, the country and the name of the title - * register. The URL-option refers to a web page which contains lists with - * �officially� registered professions (text and possibly OID) as well as - * further information on these professions. Object identifiers for the - * component namingAuthorityId are grouped under the OID-branch - * id-isis-at-namingAuthorities and must be applied for. - *
    • See - * http://www.teletrust.de/anwend.asp?Id=30200&Sprache=E_&HomePG=0 for - * an application form and http://www.teletrust.de/links.asp?id=30220,11 - * for an overview of registered naming authorities. - *
    • By means of the data type ProfessionInfo certain professions, - * specializations, disciplines, fields of activity, etc. are identified. A - * profession is represented by one or more text strings, resp. profession OIDs - * in the fields professionItems and professionOIDs and by a registration number - * in the field registrationNumber. An indication in text form must always be - * present, whereas the other indications are optional. The component - * addProfessionInfo may contain additional applicationspecific information in - * DER-encoded form. - *
    - *

    - * By means of different namingAuthority-OIDs or profession OIDs hierarchies of - * professions, specializations, disciplines, fields of activity, etc. can be - * expressed. The issuing admission authority should always be indicated (field - * admissionAuthority), whenever a registration number is presented. Still, - * information on admissions can be given without indicating an admission or a - * naming authority by the exclusive use of the component professionItems. In - * this case the certification authority is responsible for the verification of - * the admission information. - *

    - *

    - *

    - * This attribute is single-valued. Still, several admissions can be captured in - * the sequence structure of the component contentsOfAdmissions of - * AdmissionSyntax or in the component professionInfos of Admissions. The - * component admissionAuthority of AdmissionSyntax serves as default value for - * the component admissionAuthority of Admissions. Within the latter component - * the default value can be overwritten, in case that another authority is - * responsible. The component namingAuthority of Admissions serves as a default - * value for the component namingAuthority of ProfessionInfo. Within the latter - * component the default value can be overwritten, in case that another naming - * authority needs to be recorded. - *

    - * The length of the string objects is limited to 128 characters. It is - * recommended to indicate a namingAuthorityURL in all issued attribute - * certificates. If a namingAuthorityURL is indicated, the field professionItems - * of ProfessionInfo should contain only registered titles. If the field - * professionOIDs exists, it has to contain the OIDs of the professions listed - * in professionItems in the same order. In general, the field professionInfos - * should contain only one entry, unless the admissions that are to be listed - * are logically connected (e.g. they have been issued under the same admission - * number). - * - * @see org.bc.asn1.isismtt.x509.Admissions - * @see org.bc.asn1.isismtt.x509.ProfessionInfo - * @see org.bc.asn1.isismtt.x509.NamingAuthority - */ -public class AdmissionSyntax - extends ASN1Object -{ - - private GeneralName admissionAuthority; - - private ASN1Sequence contentsOfAdmissions; - - public static AdmissionSyntax getInstance(Object obj) - { - if (obj == null || obj instanceof AdmissionSyntax) - { - return (AdmissionSyntax)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new AdmissionSyntax((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type ProcurationSyntax: - *

    - *

    -     *     AdmissionSyntax ::= SEQUENCE
    -     *     {
    -     *       admissionAuthority GeneralName OPTIONAL,
    -     *       contentsOfAdmissions SEQUENCE OF Admissions
    -     *     }
    -     * 

    - * Admissions ::= SEQUENCE - * { - * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL - * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL - * professionInfos SEQUENCE OF ProfessionInfo - * } - *

    - * NamingAuthority ::= SEQUENCE - * { - * namingAuthorityId OBJECT IDENTIFIER OPTIONAL, - * namingAuthorityUrl IA5String OPTIONAL, - * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL - * } - *

    - * ProfessionInfo ::= SEQUENCE - * { - * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, - * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), - * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, - * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, - * addProfessionInfo OCTET STRING OPTIONAL - * } - *

    - * - * @param seq The ASN.1 sequence. - */ - private AdmissionSyntax(ASN1Sequence seq) - { - switch (seq.size()) - { - case 1: - contentsOfAdmissions = DERSequence.getInstance(seq.getObjectAt(0)); - break; - case 2: - admissionAuthority = GeneralName.getInstance(seq.getObjectAt(0)); - contentsOfAdmissions = DERSequence.getInstance(seq.getObjectAt(1)); - break; - default: - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - } - - /** - * Constructor from given details. - * - * @param admissionAuthority The admission authority. - * @param contentsOfAdmissions The admissions. - */ - public AdmissionSyntax(GeneralName admissionAuthority, ASN1Sequence contentsOfAdmissions) - { - this.admissionAuthority = admissionAuthority; - this.contentsOfAdmissions = contentsOfAdmissions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *     AdmissionSyntax ::= SEQUENCE
    -     *     {
    -     *       admissionAuthority GeneralName OPTIONAL,
    -     *       contentsOfAdmissions SEQUENCE OF Admissions
    -     *     }
    -     * 

    - * Admissions ::= SEQUENCE - * { - * admissionAuthority [0] EXPLICIT GeneralName OPTIONAL - * namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL - * professionInfos SEQUENCE OF ProfessionInfo - * } - *

    - * NamingAuthority ::= SEQUENCE - * { - * namingAuthorityId OBJECT IDENTIFIER OPTIONAL, - * namingAuthorityUrl IA5String OPTIONAL, - * namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL - * } - *

    - * ProfessionInfo ::= SEQUENCE - * { - * namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL, - * professionItems SEQUENCE OF DirectoryString (SIZE(1..128)), - * professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL, - * registrationNumber PrintableString(SIZE(1..128)) OPTIONAL, - * addProfessionInfo OCTET STRING OPTIONAL - * } - *

    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - if (admissionAuthority != null) - { - vec.add(admissionAuthority); - } - vec.add(contentsOfAdmissions); - return new DERSequence(vec); - } - - /** - * @return Returns the admissionAuthority if present, null otherwise. - */ - public GeneralName getAdmissionAuthority() - { - return admissionAuthority; - } - - /** - * @return Returns the contentsOfAdmissions. - */ - public Admissions[] getContentsOfAdmissions() - { - Admissions[] admissions = new Admissions[contentsOfAdmissions.size()]; - int count = 0; - for (Enumeration e = contentsOfAdmissions.getObjects(); e.hasMoreElements();) - { - admissions[count++] = Admissions.getInstance(e.nextElement()); - } - return admissions; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Admissions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Admissions.java deleted file mode 100644 index 9f40db6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Admissions.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.GeneralName; - -/** - * An Admissions structure. - *

    - *

    - *            Admissions ::= SEQUENCE
    - *            {
    - *              admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
    - *              namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
    - *              professionInfos SEQUENCE OF ProfessionInfo
    - *            }
    - * 

    - *

    - * - * @see org.bc.asn1.isismtt.x509.AdmissionSyntax - * @see org.bc.asn1.isismtt.x509.ProfessionInfo - * @see org.bc.asn1.isismtt.x509.NamingAuthority - */ -public class Admissions - extends ASN1Object -{ - - private GeneralName admissionAuthority; - - private NamingAuthority namingAuthority; - - private ASN1Sequence professionInfos; - - public static Admissions getInstance(Object obj) - { - if (obj == null || obj instanceof Admissions) - { - return (Admissions)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new Admissions((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type ProcurationSyntax: - *

    - *

    -     *            Admissions ::= SEQUENCE
    -     *            {
    -     *              admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
    -     *              namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
    -     *              professionInfos SEQUENCE OF ProfessionInfo
    -     *            }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private Admissions(ASN1Sequence seq) - { - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - Enumeration e = seq.getObjects(); - - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - if (o instanceof ASN1TaggedObject) - { - switch (((ASN1TaggedObject)o).getTagNo()) - { - case 0: - admissionAuthority = GeneralName.getInstance((ASN1TaggedObject)o, true); - break; - case 1: - namingAuthority = NamingAuthority.getInstance((ASN1TaggedObject)o, true); - break; - default: - throw new IllegalArgumentException("Bad tag number: " + ((ASN1TaggedObject)o).getTagNo()); - } - o = (ASN1Encodable)e.nextElement(); - } - if (o instanceof ASN1TaggedObject) - { - switch (((ASN1TaggedObject)o).getTagNo()) - { - case 1: - namingAuthority = NamingAuthority.getInstance((ASN1TaggedObject)o, true); - break; - default: - throw new IllegalArgumentException("Bad tag number: " + ((ASN1TaggedObject)o).getTagNo()); - } - o = (ASN1Encodable)e.nextElement(); - } - professionInfos = ASN1Sequence.getInstance(o); - if (e.hasMoreElements()) - { - throw new IllegalArgumentException("Bad object encountered: " - + e.nextElement().getClass()); - } - } - - /** - * Constructor from a given details. - *

    - * Parameter professionInfos is mandatory. - * - * @param admissionAuthority The admission authority. - * @param namingAuthority The naming authority. - * @param professionInfos The profession infos. - */ - public Admissions(GeneralName admissionAuthority, - NamingAuthority namingAuthority, ProfessionInfo[] professionInfos) - { - this.admissionAuthority = admissionAuthority; - this.namingAuthority = namingAuthority; - this.professionInfos = new DERSequence(professionInfos); - } - - public GeneralName getAdmissionAuthority() - { - return admissionAuthority; - } - - public NamingAuthority getNamingAuthority() - { - return namingAuthority; - } - - public ProfessionInfo[] getProfessionInfos() - { - ProfessionInfo[] infos = new ProfessionInfo[professionInfos.size()]; - int count = 0; - for (Enumeration e = professionInfos.getObjects(); e.hasMoreElements();) - { - infos[count++] = ProfessionInfo.getInstance(e.nextElement()); - } - return infos; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *       Admissions ::= SEQUENCE
    -     *       {
    -     *         admissionAuthority [0] EXPLICIT GeneralName OPTIONAL
    -     *         namingAuthority [1] EXPLICIT NamingAuthority OPTIONAL
    -     *         professionInfos SEQUENCE OF ProfessionInfo
    -     *       }
    -     * 

    - *

    - * - * @return an ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - - if (admissionAuthority != null) - { - vec.add(new DERTaggedObject(true, 0, admissionAuthority)); - } - if (namingAuthority != null) - { - vec.add(new DERTaggedObject(true, 1, namingAuthority)); - } - vec.add(professionInfos); - - return new DERSequence(vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/DeclarationOfMajority.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/DeclarationOfMajority.java deleted file mode 100644 index ccd3bf7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/DeclarationOfMajority.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * A declaration of majority. - *

    - *

    - *           DeclarationOfMajoritySyntax ::= CHOICE
    - *           {
    - *             notYoungerThan [0] IMPLICIT INTEGER,
    - *             fullAgeAtCountry [1] IMPLICIT SEQUENCE
    - *             {
    - *               fullAge BOOLEAN DEFAULT TRUE,
    - *               country PrintableString (SIZE(2))
    - *             }
    - *             dateOfBirth [2] IMPLICIT GeneralizedTime
    - *           }
    - * 
    - *

    - * fullAgeAtCountry indicates the majority of the owner with respect to the laws - * of a specific country. - */ -public class DeclarationOfMajority - extends ASN1Object - implements ASN1Choice -{ - public static final int notYoungerThan = 0; - public static final int fullAgeAtCountry = 1; - public static final int dateOfBirth = 2; - - private ASN1TaggedObject declaration; - - public DeclarationOfMajority(int notYoungerThan) - { - declaration = new DERTaggedObject(false, 0, new ASN1Integer(notYoungerThan)); - } - - public DeclarationOfMajority(boolean fullAge, String country) - { - if (country.length() > 2) - { - throw new IllegalArgumentException("country can only be 2 characters"); - } - - if (fullAge) - { - declaration = new DERTaggedObject(false, 1, new DERSequence(new DERPrintableString(country, true))); - } - else - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(ASN1Boolean.FALSE); - v.add(new DERPrintableString(country, true)); - - declaration = new DERTaggedObject(false, 1, new DERSequence(v)); - } - } - - public DeclarationOfMajority(ASN1GeneralizedTime dateOfBirth) - { - declaration = new DERTaggedObject(false, 2, dateOfBirth); - } - - public static DeclarationOfMajority getInstance(Object obj) - { - if (obj == null || obj instanceof DeclarationOfMajority) - { - return (DeclarationOfMajority)obj; - } - - if (obj instanceof ASN1TaggedObject) - { - return new DeclarationOfMajority((ASN1TaggedObject)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - private DeclarationOfMajority(ASN1TaggedObject o) - { - if (o.getTagNo() > 2) - { - throw new IllegalArgumentException("Bad tag number: " + o.getTagNo()); - } - declaration = o; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *           DeclarationOfMajoritySyntax ::= CHOICE
    -     *           {
    -     *             notYoungerThan [0] IMPLICIT INTEGER,
    -     *             fullAgeAtCountry [1] IMPLICIT SEQUENCE
    -     *             {
    -     *               fullAge BOOLEAN DEFAULT TRUE,
    -     *               country PrintableString (SIZE(2))
    -     *             }
    -     *             dateOfBirth [2] IMPLICIT GeneralizedTime
    -     *           }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - return declaration; - } - - public int getType() - { - return declaration.getTagNo(); - } - - /** - * @return notYoungerThan if that's what we are, -1 otherwise - */ - public int notYoungerThan() - { - if (declaration.getTagNo() != 0) - { - return -1; - } - - return ASN1Integer.getInstance(declaration, false).getValue().intValue(); - } - - public ASN1Sequence fullAgeAtCountry() - { - if (declaration.getTagNo() != 1) - { - return null; - } - - return ASN1Sequence.getInstance(declaration, false); - } - - public ASN1GeneralizedTime getDateOfBirth() - { - if (declaration.getTagNo() != 2) - { - return null; - } - - return ASN1GeneralizedTime.getInstance(declaration, false); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/MonetaryLimit.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/MonetaryLimit.java deleted file mode 100644 index 8b84d2b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/MonetaryLimit.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; - -/** - * Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be - * used in new certificates in place of the extension/attribute MonetaryLimit - * since January 1, 2004. For the sake of backward compatibility with - * certificates already in use, components SHOULD support MonetaryLimit (as well - * as QcEuLimitValue). - *

    - * Indicates a monetary limit within which the certificate holder is authorized - * to act. (This value DOES NOT express a limit on the liability of the - * certification authority). - *

    - *

    - *    MonetaryLimitSyntax ::= SEQUENCE
    - *    {
    - *      currency PrintableString (SIZE(3)),
    - *      amount INTEGER,
    - *      exponent INTEGER
    - *    }
    - * 
    - *

    - * currency must be the ISO code. - *

    - * value = amount�10*exponent - */ -public class MonetaryLimit - extends ASN1Object -{ - DERPrintableString currency; - ASN1Integer amount; - ASN1Integer exponent; - - public static MonetaryLimit getInstance(Object obj) - { - if (obj == null || obj instanceof MonetaryLimit) - { - return (MonetaryLimit)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new MonetaryLimit(ASN1Sequence.getInstance(obj)); - } - - throw new IllegalArgumentException("unknown object in getInstance"); - } - - private MonetaryLimit(ASN1Sequence seq) - { - if (seq.size() != 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - Enumeration e = seq.getObjects(); - currency = DERPrintableString.getInstance(e.nextElement()); - amount = ASN1Integer.getInstance(e.nextElement()); - exponent = ASN1Integer.getInstance(e.nextElement()); - } - - /** - * Constructor from a given details. - *

    - *

    - * value = amount�10^exponent - * - * @param currency The currency. Must be the ISO code. - * @param amount The amount - * @param exponent The exponent - */ - public MonetaryLimit(String currency, int amount, int exponent) - { - this.currency = new DERPrintableString(currency, true); - this.amount = new ASN1Integer(amount); - this.exponent = new ASN1Integer(exponent); - } - - public String getCurrency() - { - return currency.getString(); - } - - public BigInteger getAmount() - { - return amount.getValue(); - } - - public BigInteger getExponent() - { - return exponent.getValue(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *    MonetaryLimitSyntax ::= SEQUENCE
    -     *    {
    -     *      currency PrintableString (SIZE(3)),
    -     *      amount INTEGER,
    -     *      exponent INTEGER
    -     *    }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(currency); - seq.add(amount); - seq.add(exponent); - - return new DERSequence(seq); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/NamingAuthority.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/NamingAuthority.java deleted file mode 100644 index 61c73f5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/NamingAuthority.java +++ /dev/null @@ -1,244 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1String; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSequence; -import org.bc.asn1.isismtt.ISISMTTObjectIdentifiers; -import org.bc.asn1.x500.DirectoryString; - -/** - * Names of authorities which are responsible for the administration of title - * registers. - * - *
    - *             NamingAuthority ::= SEQUENCE 
    - *             {
    - *               namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
    - *               namingAuthorityUrl IA5String OPTIONAL,
    - *               namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
    - *             }
    - * 
    - * @see org.bc.asn1.isismtt.x509.AdmissionSyntax - * - */ -public class NamingAuthority - extends ASN1Object -{ - - /** - * Profession OIDs should always be defined under the OID branch of the - * responsible naming authority. At the time of this writing, the work group - * �Recht, Wirtschaft, Steuern� (�Law, Economy, Taxes�) is registered as the - * first naming authority under the OID id-isismtt-at-namingAuthorities. - */ - public static final ASN1ObjectIdentifier id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern = - new ASN1ObjectIdentifier(ISISMTTObjectIdentifiers.id_isismtt_at_namingAuthorities + ".1"); - - private ASN1ObjectIdentifier namingAuthorityId; - private String namingAuthorityUrl; - private DirectoryString namingAuthorityText; - - public static NamingAuthority getInstance(Object obj) - { - if (obj == null || obj instanceof NamingAuthority) - { - return (NamingAuthority)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new NamingAuthority((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - public static NamingAuthority getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * Constructor from ASN1Sequence. - *

    - *

    - *

    -     *             NamingAuthority ::= SEQUENCE
    -     *             {
    -     *               namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
    -     *               namingAuthorityUrl IA5String OPTIONAL,
    -     *               namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
    -     *             }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private NamingAuthority(ASN1Sequence seq) - { - - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - if (e.hasMoreElements()) - { - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - if (o instanceof ASN1ObjectIdentifier) - { - namingAuthorityId = (ASN1ObjectIdentifier)o; - } - else if (o instanceof DERIA5String) - { - namingAuthorityUrl = DERIA5String.getInstance(o).getString(); - } - else if (o instanceof ASN1String) - { - namingAuthorityText = DirectoryString.getInstance(o); - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - } - if (e.hasMoreElements()) - { - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - if (o instanceof DERIA5String) - { - namingAuthorityUrl = DERIA5String.getInstance(o).getString(); - } - else if (o instanceof ASN1String) - { - namingAuthorityText = DirectoryString.getInstance(o); - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - } - if (e.hasMoreElements()) - { - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - if (o instanceof ASN1String) - { - namingAuthorityText = DirectoryString.getInstance(o); - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - - } - } - - /** - * @return Returns the namingAuthorityId. - */ - public ASN1ObjectIdentifier getNamingAuthorityId() - { - return namingAuthorityId; - } - - /** - * @return Returns the namingAuthorityText. - */ - public DirectoryString getNamingAuthorityText() - { - return namingAuthorityText; - } - - /** - * @return Returns the namingAuthorityUrl. - */ - public String getNamingAuthorityUrl() - { - return namingAuthorityUrl; - } - - /** - * Constructor from given details. - *

    - * All parameters can be combined. - * - * @param namingAuthorityId ObjectIdentifier for naming authority. - * @param namingAuthorityUrl URL for naming authority. - * @param namingAuthorityText Textual representation of naming authority. - * @deprecated use ASN1ObjectIdentifier method - */ - public NamingAuthority(DERObjectIdentifier namingAuthorityId, - String namingAuthorityUrl, DirectoryString namingAuthorityText) - { - this.namingAuthorityId = new ASN1ObjectIdentifier(namingAuthorityId.getId()); - this.namingAuthorityUrl = namingAuthorityUrl; - this.namingAuthorityText = namingAuthorityText; - } - - /** - * Constructor from given details. - *

    - * All parameters can be combined. - * - * @param namingAuthorityId ObjectIdentifier for naming authority. - * @param namingAuthorityUrl URL for naming authority. - * @param namingAuthorityText Textual representation of naming authority. - */ - public NamingAuthority(ASN1ObjectIdentifier namingAuthorityId, - String namingAuthorityUrl, DirectoryString namingAuthorityText) - { - this.namingAuthorityId = namingAuthorityId; - this.namingAuthorityUrl = namingAuthorityUrl; - this.namingAuthorityText = namingAuthorityText; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *             NamingAuthority ::= SEQUENCE
    -     *             {
    -     *               namingAuthorityId OBJECT IDENTIFIER OPTIONAL,
    -     *               namingAuthorityUrl IA5String OPTIONAL,
    -     *               namingAuthorityText DirectoryString(SIZE(1..128)) OPTIONAL
    -     *             }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - if (namingAuthorityId != null) - { - vec.add(namingAuthorityId); - } - if (namingAuthorityUrl != null) - { - vec.add(new DERIA5String(namingAuthorityUrl, true)); - } - if (namingAuthorityText != null) - { - vec.add(namingAuthorityText); - } - return new DERSequence(vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProcurationSyntax.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProcurationSyntax.java deleted file mode 100644 index 16303cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProcurationSyntax.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.DirectoryString; -import org.bc.asn1.x509.GeneralName; -import org.bc.asn1.x509.IssuerSerial; - -/** - * Attribute to indicate that the certificate holder may sign in the name of a - * third person. - *

    - * ISIS-MTT PROFILE: The corresponding ProcurationSyntax contains either the - * name of the person who is represented (subcomponent thirdPerson) or a - * reference to his/her base certificate (in the component signingFor, - * subcomponent certRef), furthermore the optional components country and - * typeSubstitution to indicate the country whose laws apply, and respectively - * the type of procuration (e.g. manager, procuration, custody). - *

    - * ISIS-MTT PROFILE: The GeneralName MUST be of type directoryName and MAY only - * contain: - RFC3039 attributes, except pseudonym (countryName, commonName, - * surname, givenName, serialNumber, organizationName, organizationalUnitName, - * stateOrProvincename, localityName, postalAddress) and - SubjectDirectoryName - * attributes (title, dateOfBirth, placeOfBirth, gender, countryOfCitizenship, - * countryOfResidence and NameAtBirth). - * - *

    - *               ProcurationSyntax ::= SEQUENCE {
    - *                 country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
    - *                 typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
    - *                 signingFor [3] EXPLICIT SigningFor 
    - *               }
    - *               
    - *               SigningFor ::= CHOICE 
    - *               { 
    - *                 thirdPerson GeneralName,
    - *                 certRef IssuerSerial 
    - *               }
    - * 
    - * - */ -public class ProcurationSyntax - extends ASN1Object -{ - private String country; - private DirectoryString typeOfSubstitution; - - private GeneralName thirdPerson; - private IssuerSerial certRef; - - public static ProcurationSyntax getInstance(Object obj) - { - if (obj == null || obj instanceof ProcurationSyntax) - { - return (ProcurationSyntax)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new ProcurationSyntax((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type ProcurationSyntax: - *

    - *

    -     *               ProcurationSyntax ::= SEQUENCE {
    -     *                 country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
    -     *                 typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
    -     *                 signingFor [3] EXPLICIT SigningFor
    -     *               }
    -     * 

    - * SigningFor ::= CHOICE - * { - * thirdPerson GeneralName, - * certRef IssuerSerial - * } - *

    - * - * @param seq The ASN.1 sequence. - */ - private ProcurationSyntax(ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement()); - switch (o.getTagNo()) - { - case 1: - country = DERPrintableString.getInstance(o, true).getString(); - break; - case 2: - typeOfSubstitution = DirectoryString.getInstance(o, true); - break; - case 3: - ASN1Encodable signingFor = o.getObject(); - if (signingFor instanceof ASN1TaggedObject) - { - thirdPerson = GeneralName.getInstance(signingFor); - } - else - { - certRef = IssuerSerial.getInstance(signingFor); - } - break; - default: - throw new IllegalArgumentException("Bad tag number: " + o.getTagNo()); - } - } - } - - /** - * Constructor from a given details. - *

    - *

    - * Either generalName or certRef MUST be - * null. - * - * @param country The country code whose laws apply. - * @param typeOfSubstitution The type of procuration. - * @param certRef Reference to certificate of the person who is represented. - */ - public ProcurationSyntax( - String country, - DirectoryString typeOfSubstitution, - IssuerSerial certRef) - { - this.country = country; - this.typeOfSubstitution = typeOfSubstitution; - this.thirdPerson = null; - this.certRef = certRef; - } - - /** - * Constructor from a given details. - *

    - *

    - * Either generalName or certRef MUST be - * null. - * - * @param country The country code whose laws apply. - * @param typeOfSubstitution The type of procuration. - * @param thirdPerson The GeneralName of the person who is represented. - */ - public ProcurationSyntax( - String country, - DirectoryString typeOfSubstitution, - GeneralName thirdPerson) - { - this.country = country; - this.typeOfSubstitution = typeOfSubstitution; - this.thirdPerson = thirdPerson; - this.certRef = null; - } - - public String getCountry() - { - return country; - } - - public DirectoryString getTypeOfSubstitution() - { - return typeOfSubstitution; - } - - public GeneralName getThirdPerson() - { - return thirdPerson; - } - - public IssuerSerial getCertRef() - { - return certRef; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *               ProcurationSyntax ::= SEQUENCE {
    -     *                 country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
    -     *                 typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
    -     *                 signingFor [3] EXPLICIT SigningFor
    -     *               }
    -     * 

    - * SigningFor ::= CHOICE - * { - * thirdPerson GeneralName, - * certRef IssuerSerial - * } - *

    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - if (country != null) - { - vec.add(new DERTaggedObject(true, 1, new DERPrintableString(country, true))); - } - if (typeOfSubstitution != null) - { - vec.add(new DERTaggedObject(true, 2, typeOfSubstitution)); - } - if (thirdPerson != null) - { - vec.add(new DERTaggedObject(true, 3, thirdPerson)); - } - else - { - vec.add(new DERTaggedObject(true, 3, certRef)); - } - - return new DERSequence(vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProfessionInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProfessionInfo.java deleted file mode 100644 index b72e35f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/ProfessionInfo.java +++ /dev/null @@ -1,408 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.DirectoryString; - -/** - * Professions, specializations, disciplines, fields of activity, etc. - * - *
    - *               ProfessionInfo ::= SEQUENCE 
    - *               {
    - *                 namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
    - *                 professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
    - *                 professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
    - *                 registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
    - *                 addProfessionInfo OCTET STRING OPTIONAL 
    - *               }
    - * 
    - * - * @see org.bc.asn1.isismtt.x509.AdmissionSyntax - */ -public class ProfessionInfo - extends ASN1Object -{ - - /** - * Rechtsanw�ltin - */ - public static final ASN1ObjectIdentifier Rechtsanwltin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".1"); - - /** - * Rechtsanwalt - */ - public static final ASN1ObjectIdentifier Rechtsanwalt = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".2"); - - /** - * Rechtsbeistand - */ - public static final ASN1ObjectIdentifier Rechtsbeistand = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".3"); - - /** - * Steuerberaterin - */ - public static final ASN1ObjectIdentifier Steuerberaterin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".4"); - - /** - * Steuerberater - */ - public static final ASN1ObjectIdentifier Steuerberater = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".5"); - - /** - * Steuerbevollm�chtigte - */ - public static final ASN1ObjectIdentifier Steuerbevollmchtigte = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".6"); - - /** - * Steuerbevollm�chtigter - */ - public static final ASN1ObjectIdentifier Steuerbevollmchtigter = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".7"); - - /** - * Notarin - */ - public static final ASN1ObjectIdentifier Notarin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".8"); - - /** - * Notar - */ - public static final ASN1ObjectIdentifier Notar = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".9"); - - /** - * Notarvertreterin - */ - public static final ASN1ObjectIdentifier Notarvertreterin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".10"); - - /** - * Notarvertreter - */ - public static final ASN1ObjectIdentifier Notarvertreter = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".11"); - - /** - * Notariatsverwalterin - */ - public static final ASN1ObjectIdentifier Notariatsverwalterin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".12"); - - /** - * Notariatsverwalter - */ - public static final ASN1ObjectIdentifier Notariatsverwalter = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".13"); - - /** - * Wirtschaftspr�ferin - */ - public static final ASN1ObjectIdentifier Wirtschaftsprferin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".14"); - - /** - * Wirtschaftspr�fer - */ - public static final ASN1ObjectIdentifier Wirtschaftsprfer = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".15"); - - /** - * Vereidigte Buchpr�ferin - */ - public static final ASN1ObjectIdentifier VereidigteBuchprferin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".16"); - - /** - * Vereidigter Buchpr�fer - */ - public static final ASN1ObjectIdentifier VereidigterBuchprfer = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".17"); - - /** - * Patentanw�ltin - */ - public static final ASN1ObjectIdentifier Patentanwltin = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".18"); - - /** - * Patentanwalt - */ - public static final ASN1ObjectIdentifier Patentanwalt = new ASN1ObjectIdentifier( - NamingAuthority.id_isismtt_at_namingAuthorities_RechtWirtschaftSteuern + ".19"); - - private NamingAuthority namingAuthority; - - private ASN1Sequence professionItems; - - private ASN1Sequence professionOIDs; - - private String registrationNumber; - - private ASN1OctetString addProfessionInfo; - - public static ProfessionInfo getInstance(Object obj) - { - if (obj == null || obj instanceof ProfessionInfo) - { - return (ProfessionInfo)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new ProfessionInfo((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - *

    - *

    -     *               ProfessionInfo ::= SEQUENCE
    -     *               {
    -     *                 namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
    -     *                 professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
    -     *                 professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
    -     *                 registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
    -     *                 addProfessionInfo OCTET STRING OPTIONAL
    -     *               }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private ProfessionInfo(ASN1Sequence seq) - { - if (seq.size() > 5) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - - if (o instanceof ASN1TaggedObject) - { - if (((ASN1TaggedObject)o).getTagNo() != 0) - { - throw new IllegalArgumentException("Bad tag number: " - + ((ASN1TaggedObject)o).getTagNo()); - } - namingAuthority = NamingAuthority.getInstance((ASN1TaggedObject)o, true); - o = (ASN1Encodable)e.nextElement(); - } - - professionItems = ASN1Sequence.getInstance(o); - - if (e.hasMoreElements()) - { - o = (ASN1Encodable)e.nextElement(); - if (o instanceof ASN1Sequence) - { - professionOIDs = ASN1Sequence.getInstance(o); - } - else if (o instanceof DERPrintableString) - { - registrationNumber = DERPrintableString.getInstance(o).getString(); - } - else if (o instanceof ASN1OctetString) - { - addProfessionInfo = ASN1OctetString.getInstance(o); - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - } - if (e.hasMoreElements()) - { - o = (ASN1Encodable)e.nextElement(); - if (o instanceof DERPrintableString) - { - registrationNumber = DERPrintableString.getInstance(o).getString(); - } - else if (o instanceof DEROctetString) - { - addProfessionInfo = (DEROctetString)o; - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - } - if (e.hasMoreElements()) - { - o = (ASN1Encodable)e.nextElement(); - if (o instanceof DEROctetString) - { - addProfessionInfo = (DEROctetString)o; - } - else - { - throw new IllegalArgumentException("Bad object encountered: " - + o.getClass()); - } - } - - } - - /** - * Constructor from given details. - *

    - * professionItems is mandatory, all other parameters are - * optional. - * - * @param namingAuthority The naming authority. - * @param professionItems Directory strings of the profession. - * @param professionOIDs DERObjectIdentfier objects for the - * profession. - * @param registrationNumber Registration number. - * @param addProfessionInfo Additional infos in encoded form. - */ - public ProfessionInfo(NamingAuthority namingAuthority, - DirectoryString[] professionItems, ASN1ObjectIdentifier[] professionOIDs, - String registrationNumber, ASN1OctetString addProfessionInfo) - { - this.namingAuthority = namingAuthority; - ASN1EncodableVector v = new ASN1EncodableVector(); - for (int i = 0; i != professionItems.length; i++) - { - v.add(professionItems[i]); - } - this.professionItems = new DERSequence(v); - if (professionOIDs != null) - { - v = new ASN1EncodableVector(); - for (int i = 0; i != professionOIDs.length; i++) - { - v.add(professionOIDs[i]); - } - this.professionOIDs = new DERSequence(v); - } - this.registrationNumber = registrationNumber; - this.addProfessionInfo = addProfessionInfo; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *               ProfessionInfo ::= SEQUENCE
    -     *               {
    -     *                 namingAuthority [0] EXPLICIT NamingAuthority OPTIONAL,
    -     *                 professionItems SEQUENCE OF DirectoryString (SIZE(1..128)),
    -     *                 professionOIDs SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
    -     *                 registrationNumber PrintableString(SIZE(1..128)) OPTIONAL,
    -     *                 addProfessionInfo OCTET STRING OPTIONAL
    -     *               }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - if (namingAuthority != null) - { - vec.add(new DERTaggedObject(true, 0, namingAuthority)); - } - vec.add(professionItems); - if (professionOIDs != null) - { - vec.add(professionOIDs); - } - if (registrationNumber != null) - { - vec.add(new DERPrintableString(registrationNumber, true)); - } - if (addProfessionInfo != null) - { - vec.add(addProfessionInfo); - } - return new DERSequence(vec); - } - - /** - * @return Returns the addProfessionInfo. - */ - public ASN1OctetString getAddProfessionInfo() - { - return addProfessionInfo; - } - - /** - * @return Returns the namingAuthority. - */ - public NamingAuthority getNamingAuthority() - { - return namingAuthority; - } - - /** - * @return Returns the professionItems. - */ - public DirectoryString[] getProfessionItems() - { - DirectoryString[] items = new DirectoryString[professionItems.size()]; - int count = 0; - for (Enumeration e = professionItems.getObjects(); e.hasMoreElements();) - { - items[count++] = DirectoryString.getInstance(e.nextElement()); - } - return items; - } - - /** - * @return Returns the professionOIDs. - */ - public ASN1ObjectIdentifier[] getProfessionOIDs() - { - if (professionOIDs == null) - { - return new ASN1ObjectIdentifier[0]; - } - ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[professionOIDs.size()]; - int count = 0; - for (Enumeration e = professionOIDs.getObjects(); e.hasMoreElements();) - { - oids[count++] = ASN1ObjectIdentifier.getInstance(e.nextElement()); - } - return oids; - } - - /** - * @return Returns the registrationNumber. - */ - public String getRegistrationNumber() - { - return registrationNumber; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Restriction.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Restriction.java deleted file mode 100644 index 1fc1fe1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/isismtt/x509/Restriction.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.isismtt.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.x500.DirectoryString; - -/** - * Some other restriction regarding the usage of this certificate. - *

    - *

    - *  RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
    - * 
    - */ -public class Restriction - extends ASN1Object -{ - private DirectoryString restriction; - - public static Restriction getInstance(Object obj) - { - if (obj instanceof Restriction) - { - return (Restriction)obj; - } - - if (obj != null) - { - return new Restriction(DirectoryString.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from DirectoryString. - *

    - * The DirectoryString is of type RestrictionSyntax: - *

    - *

    -     *      RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
    -     * 
    - * - * @param restriction A DirectoryString. - */ - private Restriction(DirectoryString restriction) - { - this.restriction = restriction; - } - - /** - * Constructor from a given details. - * - * @param restriction The describtion of the restriction. - */ - public Restriction(String restriction) - { - this.restriction = new DirectoryString(restriction); - } - - public DirectoryString getRestriction() - { - return restriction; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *      RestrictionSyntax ::= DirectoryString (SIZE(1..1024))
    -     * 

    - *

    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - return restriction.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/kisa/KISAObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/kisa/KISAObjectIdentifiers.java deleted file mode 100644 index 9dca72d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/kisa/KISAObjectIdentifiers.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.asn1.kisa; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface KISAObjectIdentifiers -{ - public static final ASN1ObjectIdentifier id_seedCBC = new ASN1ObjectIdentifier("1.2.410.200004.1.4"); - public static final ASN1ObjectIdentifier id_npki_app_cmsSeed_wrap = new ASN1ObjectIdentifier("1.2.410.200004.7.1.1.1"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/microsoft/MicrosoftObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/microsoft/MicrosoftObjectIdentifiers.java deleted file mode 100644 index b1fc25b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/microsoft/MicrosoftObjectIdentifiers.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.asn1.microsoft; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface MicrosoftObjectIdentifiers -{ - // - // Microsoft - // iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) microsoft(311) - // - static final ASN1ObjectIdentifier microsoft = new ASN1ObjectIdentifier("1.3.6.1.4.1.311"); - static final ASN1ObjectIdentifier microsoftCertTemplateV1 = microsoft.branch("20.2"); - static final ASN1ObjectIdentifier microsoftCaVersion = microsoft.branch("21.1"); - static final ASN1ObjectIdentifier microsoftPrevCaCertHash = microsoft.branch("21.2"); - static final ASN1ObjectIdentifier microsoftCertTemplateV2 = microsoft.branch("21.7"); - static final ASN1ObjectIdentifier microsoftAppPolicies = microsoft.branch("21.10"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/CAST5CBCParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/CAST5CBCParameters.java deleted file mode 100644 index ebaaadd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/CAST5CBCParameters.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class CAST5CBCParameters - extends ASN1Object -{ - ASN1Integer keyLength; - ASN1OctetString iv; - - public static CAST5CBCParameters getInstance( - Object o) - { - if (o instanceof CAST5CBCParameters) - { - return (CAST5CBCParameters)o; - } - else if (o != null) - { - return new CAST5CBCParameters(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CAST5CBCParameters( - byte[] iv, - int keyLength) - { - this.iv = new DEROctetString(iv); - this.keyLength = new ASN1Integer(keyLength); - } - - public CAST5CBCParameters( - ASN1Sequence seq) - { - iv = (ASN1OctetString)seq.getObjectAt(0); - keyLength = (ASN1Integer)seq.getObjectAt(1); - } - - public byte[] getIV() - { - return iv.getOctets(); - } - - public int getKeyLength() - { - return keyLength.getValue().intValue(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * cast5CBCParameters ::= SEQUENCE {
    -     *                           iv         OCTET STRING DEFAULT 0,
    -     *                                  -- Initialization vector
    -     *                           keyLength  INTEGER
    -     *                                  -- Key length, in bits
    -     *                      }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(iv); - v.add(keyLength); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/IDEACBCPar.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/IDEACBCPar.java deleted file mode 100644 index 4dceee3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/IDEACBCPar.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class IDEACBCPar - extends ASN1Object -{ - ASN1OctetString iv; - - public static IDEACBCPar getInstance( - Object o) - { - if (o instanceof IDEACBCPar) - { - return (IDEACBCPar)o; - } - else if (o != null) - { - return new IDEACBCPar(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public IDEACBCPar( - byte[] iv) - { - this.iv = new DEROctetString(iv); - } - - public IDEACBCPar( - ASN1Sequence seq) - { - if (seq.size() == 1) - { - iv = (ASN1OctetString)seq.getObjectAt(0); - } - else - { - iv = null; - } - } - - public byte[] getIV() - { - if (iv != null) - { - return iv.getOctets(); - } - else - { - return null; - } - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * IDEA-CBCPar ::= SEQUENCE {
    -     *                      iv    OCTET STRING OPTIONAL -- exactly 8 octets
    -     *                  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (iv != null) - { - v.add(iv); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/MiscObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/MiscObjectIdentifiers.java deleted file mode 100644 index 8454186..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/MiscObjectIdentifiers.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface MiscObjectIdentifiers -{ - // - // Netscape - // iso/itu(2) joint-assign(16) us(840) uscompany(1) netscape(113730) cert-extensions(1) } - // - static final ASN1ObjectIdentifier netscape = new ASN1ObjectIdentifier("2.16.840.1.113730.1"); - static final ASN1ObjectIdentifier netscapeCertType = netscape.branch("1"); - static final ASN1ObjectIdentifier netscapeBaseURL = netscape.branch("2"); - static final ASN1ObjectIdentifier netscapeRevocationURL = netscape.branch("3"); - static final ASN1ObjectIdentifier netscapeCARevocationURL = netscape.branch("4"); - static final ASN1ObjectIdentifier netscapeRenewalURL = netscape.branch("7"); - static final ASN1ObjectIdentifier netscapeCApolicyURL = netscape.branch("8"); - static final ASN1ObjectIdentifier netscapeSSLServerName = netscape.branch("12"); - static final ASN1ObjectIdentifier netscapeCertComment = netscape.branch("13"); - - // - // Verisign - // iso/itu(2) joint-assign(16) us(840) uscompany(1) verisign(113733) cert-extensions(1) } - // - static final ASN1ObjectIdentifier verisign = new ASN1ObjectIdentifier("2.16.840.1.113733.1"); - - // - // CZAG - country, zip, age, and gender - // - static final ASN1ObjectIdentifier verisignCzagExtension = verisign.branch("6.3"); - // D&B D-U-N-S number - static final ASN1ObjectIdentifier verisignDnbDunsNumber = verisign.branch("6.15"); - - // - // Novell - // iso/itu(2) country(16) us(840) organization(1) novell(113719) - // - static final ASN1ObjectIdentifier novell = new ASN1ObjectIdentifier("2.16.840.1.113719"); - static final ASN1ObjectIdentifier novellSecurityAttribs = novell.branch("1.9.4.1"); - - // - // Entrust - // iso(1) member-body(16) us(840) nortelnetworks(113533) entrust(7) - // - static final ASN1ObjectIdentifier entrust = new ASN1ObjectIdentifier("1.2.840.113533.7"); - static final ASN1ObjectIdentifier entrustVersionExtension = entrust.branch("65.0"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeCertType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeCertType.java deleted file mode 100644 index 63b53bc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeCertType.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.DERBitString; - -/** - * The NetscapeCertType object. - *
    - *    NetscapeCertType ::= BIT STRING {
    - *         SSLClient               (0),
    - *         SSLServer               (1),
    - *         S/MIME                  (2),
    - *         Object Signing          (3),
    - *         Reserved                (4),
    - *         SSL CA                  (5),
    - *         S/MIME CA               (6),
    - *         Object Signing CA       (7) }
    - * 
    - */ -public class NetscapeCertType - extends DERBitString -{ - public static final int sslClient = (1 << 7); - public static final int sslServer = (1 << 6); - public static final int smime = (1 << 5); - public static final int objectSigning = (1 << 4); - public static final int reserved = (1 << 3); - public static final int sslCA = (1 << 2); - public static final int smimeCA = (1 << 1); - public static final int objectSigningCA = (1 << 0); - - /** - * Basic constructor. - * - * @param usage - the bitwise OR of the Key Usage flags giving the - * allowed uses for the key. - * e.g. (X509NetscapeCertType.sslCA | X509NetscapeCertType.smimeCA) - */ - public NetscapeCertType( - int usage) - { - super(getBytes(usage), getPadBits(usage)); - } - - public NetscapeCertType( - DERBitString usage) - { - super(usage.getBytes(), usage.getPadBits()); - } - - public String toString() - { - return "NetscapeCertType: 0x" + Integer.toHexString(data[0] & 0xff); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeRevocationURL.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeRevocationURL.java deleted file mode 100644 index d0cf0ba..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/NetscapeRevocationURL.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.DERIA5String; - -public class NetscapeRevocationURL - extends DERIA5String -{ - public NetscapeRevocationURL( - DERIA5String str) - { - super(str.getString()); - } - - public String toString() - { - return "NetscapeRevocationURL: " + this.getString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/VerisignCzagExtension.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/VerisignCzagExtension.java deleted file mode 100644 index 2005898..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/misc/VerisignCzagExtension.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.asn1.misc; - -import org.bc.asn1.DERIA5String; - -public class VerisignCzagExtension - extends DERIA5String -{ - public VerisignCzagExtension( - DERIA5String str) - { - super(str.getString()); - } - - public String toString() - { - return "VerisignCzagExtension: " + this.getString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/mozilla/PublicKeyAndChallenge.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/mozilla/PublicKeyAndChallenge.java deleted file mode 100644 index 94e9f41..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/mozilla/PublicKeyAndChallenge.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bc.asn1.mozilla; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.x509.SubjectPublicKeyInfo; - -/** - * This is designed to parse - * the PublicKeyAndChallenge created by the KEYGEN tag included by - * Mozilla based browsers. - *
    - *  PublicKeyAndChallenge ::= SEQUENCE {
    - *    spki SubjectPublicKeyInfo,
    - *    challenge IA5STRING
    - *  }
    - *
    - *  
    - */ -public class PublicKeyAndChallenge - extends ASN1Object -{ - private ASN1Sequence pkacSeq; - private SubjectPublicKeyInfo spki; - private DERIA5String challenge; - - public static PublicKeyAndChallenge getInstance(Object obj) - { - if (obj instanceof PublicKeyAndChallenge) - { - return (PublicKeyAndChallenge)obj; - } - else if (obj != null) - { - return new PublicKeyAndChallenge(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private PublicKeyAndChallenge(ASN1Sequence seq) - { - pkacSeq = seq; - spki = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(0)); - challenge = DERIA5String.getInstance(seq.getObjectAt(1)); - } - - public ASN1Primitive toASN1Primitive() - { - return pkacSeq; - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return spki; - } - - public DERIA5String getChallenge() - { - return challenge; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTNamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTNamedCurves.java deleted file mode 100644 index 225589d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTNamedCurves.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.asn1.nist; - -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.sec.SECNamedCurves; -import org.bc.asn1.sec.SECObjectIdentifiers; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.util.Strings; - -/** - * Utility class for fetching curves using their NIST names as published in FIPS-PUB 186-2 - */ -public class NISTNamedCurves -{ - static final Hashtable objIds = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static void defineCurve(String name, ASN1ObjectIdentifier oid) - { - objIds.put(name, oid); - names.put(oid, name); - } - - static - { - // TODO Missing the "K-" curves - - defineCurve("B-571", SECObjectIdentifiers.sect571r1); - defineCurve("B-409", SECObjectIdentifiers.sect409r1); - defineCurve("B-283", SECObjectIdentifiers.sect283r1); - defineCurve("B-233", SECObjectIdentifiers.sect233r1); - defineCurve("B-163", SECObjectIdentifiers.sect163r2); - defineCurve("P-521", SECObjectIdentifiers.secp521r1); - defineCurve("P-384", SECObjectIdentifiers.secp384r1); - defineCurve("P-256", SECObjectIdentifiers.secp256r1); - defineCurve("P-224", SECObjectIdentifiers.secp224r1); - defineCurve("P-192", SECObjectIdentifiers.secp192r1); - } - - public static X9ECParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(Strings.toUpperCase(name)); - - if (oid != null) - { - return getByOID(oid); - } - - return null; - } - - /** - * return the X9ECParameters object for the named curve represented by - * the passed in object identifier. Null if the curve isn't present. - * - * @param oid an object identifier representing a named curve, if present. - */ - public static X9ECParameters getByOID( - ASN1ObjectIdentifier oid) - { - return SECNamedCurves.getByOID(oid); - } - - /** - * return the object identifier signified by the passed in name. Null - * if there is no object identifier associated with name. - * - * @return the object identifier associated with name, if present. - */ - public static ASN1ObjectIdentifier getOID( - String name) - { - return (ASN1ObjectIdentifier)objIds.get(Strings.toUpperCase(name)); - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName( - ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - /** - * returns an enumeration containing the name strings for curves - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTObjectIdentifiers.java deleted file mode 100644 index 32f7784..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/nist/NISTObjectIdentifiers.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bc.asn1.nist; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface NISTObjectIdentifiers -{ - // - // NIST - // iso/itu(2) joint-assign(16) us(840) organization(1) gov(101) csor(3) - - // - // nistalgorithms(4) - // - static final ASN1ObjectIdentifier nistAlgorithm = new ASN1ObjectIdentifier("2.16.840.1.101.3.4"); - - static final ASN1ObjectIdentifier id_sha256 = nistAlgorithm.branch("2.1"); - static final ASN1ObjectIdentifier id_sha384 = nistAlgorithm.branch("2.2"); - static final ASN1ObjectIdentifier id_sha512 = nistAlgorithm.branch("2.3"); - static final ASN1ObjectIdentifier id_sha224 = nistAlgorithm.branch("2.4"); - - static final ASN1ObjectIdentifier aes = nistAlgorithm.branch("1"); - - static final ASN1ObjectIdentifier id_aes128_ECB = aes.branch("1"); - static final ASN1ObjectIdentifier id_aes128_CBC = aes.branch("2"); - static final ASN1ObjectIdentifier id_aes128_OFB = aes.branch("3"); - static final ASN1ObjectIdentifier id_aes128_CFB = aes.branch("4"); - static final ASN1ObjectIdentifier id_aes128_wrap = aes.branch("5"); - static final ASN1ObjectIdentifier id_aes128_GCM = aes.branch("6"); - static final ASN1ObjectIdentifier id_aes128_CCM = aes.branch("7"); - - static final ASN1ObjectIdentifier id_aes192_ECB = aes.branch("21"); - static final ASN1ObjectIdentifier id_aes192_CBC = aes.branch("22"); - static final ASN1ObjectIdentifier id_aes192_OFB = aes.branch("23"); - static final ASN1ObjectIdentifier id_aes192_CFB = aes.branch("24"); - static final ASN1ObjectIdentifier id_aes192_wrap = aes.branch("25"); - static final ASN1ObjectIdentifier id_aes192_GCM = aes.branch("26"); - static final ASN1ObjectIdentifier id_aes192_CCM = aes.branch("27"); - - static final ASN1ObjectIdentifier id_aes256_ECB = aes.branch("41"); - static final ASN1ObjectIdentifier id_aes256_CBC = aes.branch("42"); - static final ASN1ObjectIdentifier id_aes256_OFB = aes.branch("43"); - static final ASN1ObjectIdentifier id_aes256_CFB = aes.branch("44"); - static final ASN1ObjectIdentifier id_aes256_wrap = aes.branch("45"); - static final ASN1ObjectIdentifier id_aes256_GCM = aes.branch("46"); - static final ASN1ObjectIdentifier id_aes256_CCM = aes.branch("47"); - - // - // signatures - // - static final ASN1ObjectIdentifier id_dsa_with_sha2 = nistAlgorithm.branch("3"); - - static final ASN1ObjectIdentifier dsa_with_sha224 = id_dsa_with_sha2.branch("1"); - static final ASN1ObjectIdentifier dsa_with_sha256 = id_dsa_with_sha2.branch("2"); - static final ASN1ObjectIdentifier dsa_with_sha384 = id_dsa_with_sha2.branch("3"); - static final ASN1ObjectIdentifier dsa_with_sha512 = id_dsa_with_sha2.branch("4"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ntt/NTTObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ntt/NTTObjectIdentifiers.java deleted file mode 100644 index 89f1e2d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ntt/NTTObjectIdentifiers.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.asn1.ntt; - -import org.bc.asn1.ASN1ObjectIdentifier; - -/** - * From RFC 3657 - */ -public interface NTTObjectIdentifiers -{ - public static final ASN1ObjectIdentifier id_camellia128_cbc = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.1.2"); - public static final ASN1ObjectIdentifier id_camellia192_cbc = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.1.3"); - public static final ASN1ObjectIdentifier id_camellia256_cbc = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.1.4"); - - public static final ASN1ObjectIdentifier id_camellia128_wrap = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.3.2"); - public static final ASN1ObjectIdentifier id_camellia192_wrap = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.3.3"); - public static final ASN1ObjectIdentifier id_camellia256_wrap = new ASN1ObjectIdentifier("1.2.392.200011.61.1.1.3.4"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/BasicOCSPResponse.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/BasicOCSPResponse.java deleted file mode 100644 index cd8e0a8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/BasicOCSPResponse.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class BasicOCSPResponse - extends ASN1Object -{ - private ResponseData tbsResponseData; - private AlgorithmIdentifier signatureAlgorithm; - private DERBitString signature; - private ASN1Sequence certs; - - public BasicOCSPResponse( - ResponseData tbsResponseData, - AlgorithmIdentifier signatureAlgorithm, - DERBitString signature, - ASN1Sequence certs) - { - this.tbsResponseData = tbsResponseData; - this.signatureAlgorithm = signatureAlgorithm; - this.signature = signature; - this.certs = certs; - } - - private BasicOCSPResponse( - ASN1Sequence seq) - { - this.tbsResponseData = ResponseData.getInstance(seq.getObjectAt(0)); - this.signatureAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - this.signature = (DERBitString)seq.getObjectAt(2); - - if (seq.size() > 3) - { - this.certs = ASN1Sequence.getInstance((ASN1TaggedObject)seq.getObjectAt(3), true); - } - } - - public static BasicOCSPResponse getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static BasicOCSPResponse getInstance( - Object obj) - { - if (obj instanceof BasicOCSPResponse) - { - return (BasicOCSPResponse)obj; - } - else if (obj != null) - { - return new BasicOCSPResponse(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ResponseData getTbsResponseData() - { - return tbsResponseData; - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return signatureAlgorithm; - } - - public DERBitString getSignature() - { - return signature; - } - - public ASN1Sequence getCerts() - { - return certs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * BasicOCSPResponse       ::= SEQUENCE {
    -     *      tbsResponseData      ResponseData,
    -     *      signatureAlgorithm   AlgorithmIdentifier,
    -     *      signature            BIT STRING,
    -     *      certs                [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(tbsResponseData); - v.add(signatureAlgorithm); - v.add(signature); - if (certs != null) - { - v.add(new DERTaggedObject(true, 0, certs)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertID.java deleted file mode 100644 index 69597cf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertID.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class CertID - extends ASN1Object -{ - AlgorithmIdentifier hashAlgorithm; - ASN1OctetString issuerNameHash; - ASN1OctetString issuerKeyHash; - ASN1Integer serialNumber; - - public CertID( - AlgorithmIdentifier hashAlgorithm, - ASN1OctetString issuerNameHash, - ASN1OctetString issuerKeyHash, - ASN1Integer serialNumber) - { - this.hashAlgorithm = hashAlgorithm; - this.issuerNameHash = issuerNameHash; - this.issuerKeyHash = issuerKeyHash; - this.serialNumber = serialNumber; - } - - private CertID( - ASN1Sequence seq) - { - hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - issuerNameHash = (ASN1OctetString)seq.getObjectAt(1); - issuerKeyHash = (ASN1OctetString)seq.getObjectAt(2); - serialNumber = (ASN1Integer)seq.getObjectAt(3); - } - - public static CertID getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static CertID getInstance( - Object obj) - { - if (obj instanceof CertID) - { - return (CertID)obj; - } - else if (obj != null) - { - return new CertID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public ASN1OctetString getIssuerNameHash() - { - return issuerNameHash; - } - - public ASN1OctetString getIssuerKeyHash() - { - return issuerKeyHash; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * CertID          ::=     SEQUENCE {
    -     *     hashAlgorithm       AlgorithmIdentifier,
    -     *     issuerNameHash      OCTET STRING, -- Hash of Issuer's DN
    -     *     issuerKeyHash       OCTET STRING, -- Hash of Issuers public key
    -     *     serialNumber        CertificateSerialNumber }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(hashAlgorithm); - v.add(issuerNameHash); - v.add(issuerKeyHash); - v.add(serialNumber); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertStatus.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertStatus.java deleted file mode 100644 index 2a86e6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CertStatus.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERNull; -import org.bc.asn1.DERTaggedObject; - -public class CertStatus - extends ASN1Object - implements ASN1Choice -{ - private int tagNo; - private ASN1Encodable value; - - /** - * create a CertStatus object with a tag of zero. - */ - public CertStatus() - { - tagNo = 0; - value = DERNull.INSTANCE; - } - - public CertStatus( - RevokedInfo info) - { - tagNo = 1; - value = info; - } - - public CertStatus( - int tagNo, - ASN1Encodable value) - { - this.tagNo = tagNo; - this.value = value; - } - - public CertStatus( - ASN1TaggedObject choice) - { - this.tagNo = choice.getTagNo(); - - switch (choice.getTagNo()) - { - case 0: - value = DERNull.INSTANCE; - break; - case 1: - value = RevokedInfo.getInstance(choice, false); - break; - case 2: - value = DERNull.INSTANCE; - } - } - - public static CertStatus getInstance( - Object obj) - { - if (obj == null || obj instanceof CertStatus) - { - return (CertStatus)obj; - } - else if (obj instanceof ASN1TaggedObject) - { - return new CertStatus((ASN1TaggedObject)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public static CertStatus getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - public int getTagNo() - { - return tagNo; - } - - public ASN1Encodable getStatus() - { - return value; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  CertStatus ::= CHOICE {
    -     *                  good        [0]     IMPLICIT NULL,
    -     *                  revoked     [1]     IMPLICIT RevokedInfo,
    -     *                  unknown     [2]     IMPLICIT UnknownInfo }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(false, tagNo, value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CrlID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CrlID.java deleted file mode 100644 index e506539..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/CrlID.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.asn1.ocsp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class CrlID - extends ASN1Object -{ - private DERIA5String crlUrl; - private ASN1Integer crlNum; - private ASN1GeneralizedTime crlTime; - - private CrlID( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1TaggedObject o = (ASN1TaggedObject)e.nextElement(); - - switch (o.getTagNo()) - { - case 0: - crlUrl = DERIA5String.getInstance(o, true); - break; - case 1: - crlNum = ASN1Integer.getInstance(o, true); - break; - case 2: - crlTime = DERGeneralizedTime.getInstance(o, true); - break; - default: - throw new IllegalArgumentException( - "unknown tag number: " + o.getTagNo()); - } - } - } - - public static CrlID getInstance( - Object obj) - { - if (obj instanceof CrlID) - { - return (CrlID)obj; - } - else if (obj != null) - { - return new CrlID(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DERIA5String getCrlUrl() - { - return crlUrl; - } - - public ASN1Integer getCrlNum() - { - return crlNum; - } - - public ASN1GeneralizedTime getCrlTime() - { - return crlTime; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * CrlID ::= SEQUENCE {
    -     *     crlUrl               [0]     EXPLICIT IA5String OPTIONAL,
    -     *     crlNum               [1]     EXPLICIT INTEGER OPTIONAL,
    -     *     crlTime              [2]     EXPLICIT GeneralizedTime OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (crlUrl != null) - { - v.add(new DERTaggedObject(true, 0, crlUrl)); - } - - if (crlNum != null) - { - v.add(new DERTaggedObject(true, 1, crlNum)); - } - - if (crlTime != null) - { - v.add(new DERTaggedObject(true, 2, crlTime)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPObjectIdentifiers.java deleted file mode 100644 index 88c1bfe..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPObjectIdentifiers.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface OCSPObjectIdentifiers -{ - public static final String pkix_ocsp = "1.3.6.1.5.5.7.48.1"; - - public static final ASN1ObjectIdentifier id_pkix_ocsp = new ASN1ObjectIdentifier(pkix_ocsp); - public static final ASN1ObjectIdentifier id_pkix_ocsp_basic = new ASN1ObjectIdentifier(pkix_ocsp + ".1"); - - // - // extensions - // - public static final ASN1ObjectIdentifier id_pkix_ocsp_nonce = new ASN1ObjectIdentifier(pkix_ocsp + ".2"); - public static final ASN1ObjectIdentifier id_pkix_ocsp_crl = new ASN1ObjectIdentifier(pkix_ocsp + ".3"); - - public static final ASN1ObjectIdentifier id_pkix_ocsp_response = new ASN1ObjectIdentifier(pkix_ocsp + ".4"); - public static final ASN1ObjectIdentifier id_pkix_ocsp_nocheck = new ASN1ObjectIdentifier(pkix_ocsp + ".5"); - public static final ASN1ObjectIdentifier id_pkix_ocsp_archive_cutoff = new ASN1ObjectIdentifier(pkix_ocsp + ".6"); - public static final ASN1ObjectIdentifier id_pkix_ocsp_service_locator = new ASN1ObjectIdentifier(pkix_ocsp + ".7"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPRequest.java deleted file mode 100644 index 29db1d6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPRequest.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class OCSPRequest - extends ASN1Object -{ - TBSRequest tbsRequest; - Signature optionalSignature; - - public OCSPRequest( - TBSRequest tbsRequest, - Signature optionalSignature) - { - this.tbsRequest = tbsRequest; - this.optionalSignature = optionalSignature; - } - - private OCSPRequest( - ASN1Sequence seq) - { - tbsRequest = TBSRequest.getInstance(seq.getObjectAt(0)); - - if (seq.size() == 2) - { - optionalSignature = Signature.getInstance( - (ASN1TaggedObject)seq.getObjectAt(1), true); - } - } - - public static OCSPRequest getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static OCSPRequest getInstance( - Object obj) - { - if (obj instanceof OCSPRequest) - { - return (OCSPRequest)obj; - } - else if (obj != null) - { - return new OCSPRequest(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public TBSRequest getTbsRequest() - { - return tbsRequest; - } - - public Signature getOptionalSignature() - { - return optionalSignature; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OCSPRequest     ::=     SEQUENCE {
    -     *     tbsRequest                  TBSRequest,
    -     *     optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(tbsRequest); - - if (optionalSignature != null) - { - v.add(new DERTaggedObject(true, 0, optionalSignature)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponse.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponse.java deleted file mode 100644 index 65e1297..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponse.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class OCSPResponse - extends ASN1Object -{ - OCSPResponseStatus responseStatus; - ResponseBytes responseBytes; - - public OCSPResponse( - OCSPResponseStatus responseStatus, - ResponseBytes responseBytes) - { - this.responseStatus = responseStatus; - this.responseBytes = responseBytes; - } - - private OCSPResponse( - ASN1Sequence seq) - { - responseStatus = OCSPResponseStatus.getInstance(seq.getObjectAt(0)); - - if (seq.size() == 2) - { - responseBytes = ResponseBytes.getInstance( - (ASN1TaggedObject)seq.getObjectAt(1), true); - } - } - - public static OCSPResponse getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static OCSPResponse getInstance( - Object obj) - { - if (obj instanceof OCSPResponse) - { - return (OCSPResponse)obj; - } - else if (obj != null) - { - return new OCSPResponse(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public OCSPResponseStatus getResponseStatus() - { - return responseStatus; - } - - public ResponseBytes getResponseBytes() - { - return responseBytes; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * OCSPResponse ::= SEQUENCE {
    -     *     responseStatus         OCSPResponseStatus,
    -     *     responseBytes          [0] EXPLICIT ResponseBytes OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(responseStatus); - - if (responseBytes != null) - { - v.add(new DERTaggedObject(true, 0, responseBytes)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponseStatus.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponseStatus.java deleted file mode 100644 index 30147b5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/OCSPResponseStatus.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.asn1.ocsp; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Enumerated; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; - -public class OCSPResponseStatus - extends ASN1Object -{ - public static final int SUCCESSFUL = 0; - public static final int MALFORMED_REQUEST = 1; - public static final int INTERNAL_ERROR = 2; - public static final int TRY_LATER = 3; - public static final int SIG_REQUIRED = 5; - public static final int UNAUTHORIZED = 6; - - private ASN1Enumerated value; - - /** - * The OCSPResponseStatus enumeration. - *
    -     * OCSPResponseStatus ::= ENUMERATED {
    -     *     successful            (0),  --Response has valid confirmations
    -     *     malformedRequest      (1),  --Illegal confirmation request
    -     *     internalError         (2),  --Internal error in issuer
    -     *     tryLater              (3),  --Try again later
    -     *                                 --(4) is not used
    -     *     sigRequired           (5),  --Must sign the request
    -     *     unauthorized          (6)   --Request unauthorized
    -     * }
    -     * 
    - */ - public OCSPResponseStatus( - int value) - { - this(new ASN1Enumerated(value)); - } - - private OCSPResponseStatus( - ASN1Enumerated value) - { - this.value = value; - } - - public static OCSPResponseStatus getInstance( - Object obj) - { - if (obj instanceof OCSPResponseStatus) - { - return (OCSPResponseStatus)obj; - } - else if (obj != null) - { - return new OCSPResponseStatus(ASN1Enumerated.getInstance(obj)); - } - - return null; - } - - public BigInteger getValue() - { - return value.getValue(); - } - - public ASN1Primitive toASN1Primitive() - { - return value; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Request.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Request.java deleted file mode 100644 index af50458..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Request.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; - -public class Request - extends ASN1Object -{ - CertID reqCert; - Extensions singleRequestExtensions; - - public Request( - CertID reqCert, - Extensions singleRequestExtensions) - { - this.reqCert = reqCert; - this.singleRequestExtensions = singleRequestExtensions; - } - - private Request( - ASN1Sequence seq) - { - reqCert = CertID.getInstance(seq.getObjectAt(0)); - - if (seq.size() == 2) - { - singleRequestExtensions = Extensions.getInstance( - (ASN1TaggedObject)seq.getObjectAt(1), true); - } - } - - public static Request getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static Request getInstance( - Object obj) - { - if (obj instanceof Request) - { - return (Request)obj; - } - else if (obj != null) - { - return new Request(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public CertID getReqCert() - { - return reqCert; - } - - public Extensions getSingleRequestExtensions() - { - return singleRequestExtensions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Request         ::=     SEQUENCE {
    -     *     reqCert                     CertID,
    -     *     singleRequestExtensions     [0] EXPLICIT Extensions OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(reqCert); - - if (singleRequestExtensions != null) - { - v.add(new DERTaggedObject(true, 0, singleRequestExtensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponderID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponderID.java deleted file mode 100644 index 65adcab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponderID.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; - -public class ResponderID - extends ASN1Object - implements ASN1Choice -{ - private ASN1Encodable value; - - public ResponderID( - ASN1OctetString value) - { - this.value = value; - } - - public ResponderID( - X500Name value) - { - this.value = value; - } - - public static ResponderID getInstance( - Object obj) - { - if (obj instanceof ResponderID) - { - return (ResponderID)obj; - } - else if (obj instanceof DEROctetString) - { - return new ResponderID((DEROctetString)obj); - } - else if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject o = (ASN1TaggedObject)obj; - - if (o.getTagNo() == 1) - { - return new ResponderID(X500Name.getInstance(o, true)); - } - else - { - return new ResponderID(ASN1OctetString.getInstance(o, true)); - } - } - - return new ResponderID(X500Name.getInstance(obj)); - } - - public static ResponderID getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - public byte[] getKeyHash() - { - if (this.value instanceof ASN1OctetString) - { - ASN1OctetString octetString = (ASN1OctetString)this.value; - return octetString.getOctets(); - } - - return null; - } - - public X500Name getName() - { - if (this.value instanceof ASN1OctetString) - { - return null; - } - - return X500Name.getInstance(value); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ResponderID ::= CHOICE {
    -     *      byName          [1] Name,
    -     *      byKey           [2] KeyHash }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - if (value instanceof ASN1OctetString) - { - return new DERTaggedObject(true, 2, value); - } - - return new DERTaggedObject(true, 1, value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseBytes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseBytes.java deleted file mode 100644 index 3433929..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseBytes.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class ResponseBytes - extends ASN1Object -{ - ASN1ObjectIdentifier responseType; - ASN1OctetString response; - - public ResponseBytes( - ASN1ObjectIdentifier responseType, - ASN1OctetString response) - { - this.responseType = responseType; - this.response = response; - } - - public ResponseBytes( - ASN1Sequence seq) - { - responseType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - response = (ASN1OctetString)seq.getObjectAt(1); - } - - public static ResponseBytes getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static ResponseBytes getInstance( - Object obj) - { - if (obj == null || obj instanceof ResponseBytes) - { - return (ResponseBytes)obj; - } - else if (obj instanceof ASN1Sequence) - { - return new ResponseBytes((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public ASN1ObjectIdentifier getResponseType() - { - return responseType; - } - - public ASN1OctetString getResponse() - { - return response; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ResponseBytes ::=       SEQUENCE {
    -     *     responseType   OBJECT IDENTIFIER,
    -     *     response       OCTET STRING }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(responseType); - v.add(response); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseData.java deleted file mode 100644 index 115382b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ResponseData.java +++ /dev/null @@ -1,182 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.X509Extensions; - -public class ResponseData - extends ASN1Object -{ - private static final ASN1Integer V1 = new ASN1Integer(0); - - private boolean versionPresent; - - private ASN1Integer version; - private ResponderID responderID; - private ASN1GeneralizedTime producedAt; - private ASN1Sequence responses; - private Extensions responseExtensions; - - public ResponseData( - ASN1Integer version, - ResponderID responderID, - ASN1GeneralizedTime producedAt, - ASN1Sequence responses, - Extensions responseExtensions) - { - this.version = version; - this.responderID = responderID; - this.producedAt = producedAt; - this.responses = responses; - this.responseExtensions = responseExtensions; - } - - /** - * @deprecated use method taking Extensions - * @param responderID - * @param producedAt - * @param responses - * @param responseExtensions - */ - public ResponseData( - ResponderID responderID, - DERGeneralizedTime producedAt, - ASN1Sequence responses, - X509Extensions responseExtensions) - { - this(V1, responderID, ASN1GeneralizedTime.getInstance(producedAt), responses, Extensions.getInstance(responseExtensions)); - } - - public ResponseData( - ResponderID responderID, - ASN1GeneralizedTime producedAt, - ASN1Sequence responses, - Extensions responseExtensions) - { - this(V1, responderID, producedAt, responses, responseExtensions); - } - - private ResponseData( - ASN1Sequence seq) - { - int index = 0; - - if (seq.getObjectAt(0) instanceof ASN1TaggedObject) - { - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0); - - if (o.getTagNo() == 0) - { - this.versionPresent = true; - this.version = ASN1Integer.getInstance( - (ASN1TaggedObject)seq.getObjectAt(0), true); - index++; - } - else - { - this.version = V1; - } - } - else - { - this.version = V1; - } - - this.responderID = ResponderID.getInstance(seq.getObjectAt(index++)); - this.producedAt = ASN1GeneralizedTime.getInstance(seq.getObjectAt(index++)); - this.responses = (ASN1Sequence)seq.getObjectAt(index++); - - if (seq.size() > index) - { - this.responseExtensions = Extensions.getInstance( - (ASN1TaggedObject)seq.getObjectAt(index), true); - } - } - - public static ResponseData getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static ResponseData getInstance( - Object obj) - { - if (obj instanceof ResponseData) - { - return (ResponseData)obj; - } - else if (obj != null) - { - return new ResponseData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - public ResponderID getResponderID() - { - return responderID; - } - - public ASN1GeneralizedTime getProducedAt() - { - return producedAt; - } - - public ASN1Sequence getResponses() - { - return responses; - } - - public Extensions getResponseExtensions() - { - return responseExtensions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ResponseData ::= SEQUENCE {
    -     *     version              [0] EXPLICIT Version DEFAULT v1,
    -     *     responderID              ResponderID,
    -     *     producedAt               GeneralizedTime,
    -     *     responses                SEQUENCE OF SingleResponse,
    -     *     responseExtensions   [1] EXPLICIT Extensions OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (versionPresent || !version.equals(V1)) - { - v.add(new DERTaggedObject(true, 0, version)); - } - - v.add(responderID); - v.add(producedAt); - v.add(responses); - if (responseExtensions != null) - { - v.add(new DERTaggedObject(true, 1, responseExtensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/RevokedInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/RevokedInfo.java deleted file mode 100644 index 4cbed3a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/RevokedInfo.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEREnumerated; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.CRLReason; - -public class RevokedInfo - extends ASN1Object -{ - private ASN1GeneralizedTime revocationTime; - private CRLReason revocationReason; - - public RevokedInfo( - ASN1GeneralizedTime revocationTime, - CRLReason revocationReason) - { - this.revocationTime = revocationTime; - this.revocationReason = revocationReason; - } - - private RevokedInfo( - ASN1Sequence seq) - { - this.revocationTime = ASN1GeneralizedTime.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - this.revocationReason = CRLReason.getInstance(DEREnumerated.getInstance( - (ASN1TaggedObject)seq.getObjectAt(1), true)); - } - } - - public static RevokedInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static RevokedInfo getInstance( - Object obj) - { - if (obj instanceof RevokedInfo) - { - return (RevokedInfo)obj; - } - else if (obj != null) - { - return new RevokedInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1GeneralizedTime getRevocationTime() - { - return revocationTime; - } - - public CRLReason getRevocationReason() - { - return revocationReason; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * RevokedInfo ::= SEQUENCE {
    -     *      revocationTime              GeneralizedTime,
    -     *      revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(revocationTime); - if (revocationReason != null) - { - v.add(new DERTaggedObject(true, 0, revocationReason)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ServiceLocator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ServiceLocator.java deleted file mode 100644 index f7f3694..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/ServiceLocator.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.X500Name; - -public class ServiceLocator - extends ASN1Object -{ - X500Name issuer; - ASN1Primitive locator; - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ServiceLocator ::= SEQUENCE {
    -     *     issuer    Name,
    -     *     locator   AuthorityInfoAccessSyntax OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(issuer); - - if (locator != null) - { - v.add(locator); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Signature.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Signature.java deleted file mode 100644 index a35101c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/Signature.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class Signature - extends ASN1Object -{ - AlgorithmIdentifier signatureAlgorithm; - DERBitString signature; - ASN1Sequence certs; - - public Signature( - AlgorithmIdentifier signatureAlgorithm, - DERBitString signature) - { - this.signatureAlgorithm = signatureAlgorithm; - this.signature = signature; - } - - public Signature( - AlgorithmIdentifier signatureAlgorithm, - DERBitString signature, - ASN1Sequence certs) - { - this.signatureAlgorithm = signatureAlgorithm; - this.signature = signature; - this.certs = certs; - } - - private Signature( - ASN1Sequence seq) - { - signatureAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - signature = (DERBitString)seq.getObjectAt(1); - - if (seq.size() == 3) - { - certs = ASN1Sequence.getInstance( - (ASN1TaggedObject)seq.getObjectAt(2), true); - } - } - - public static Signature getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static Signature getInstance( - Object obj) - { - if (obj instanceof Signature) - { - return (Signature)obj; - } - else if (obj != null) - { - return new Signature(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return signatureAlgorithm; - } - - public DERBitString getSignature() - { - return signature; - } - - public ASN1Sequence getCerts() - { - return certs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Signature       ::=     SEQUENCE {
    -     *     signatureAlgorithm      AlgorithmIdentifier,
    -     *     signature               BIT STRING,
    -     *     certs               [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL}
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(signatureAlgorithm); - v.add(signature); - - if (certs != null) - { - v.add(new DERTaggedObject(true, 0, certs)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/SingleResponse.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/SingleResponse.java deleted file mode 100644 index 9c9e53d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/SingleResponse.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.X509Extensions; - -public class SingleResponse - extends ASN1Object -{ - private CertID certID; - private CertStatus certStatus; - private ASN1GeneralizedTime thisUpdate; - private ASN1GeneralizedTime nextUpdate; - private Extensions singleExtensions; - - /** - * @deprecated use method taking ASN1GeneralizedTime and Extensions - * @param certID - * @param certStatus - * @param thisUpdate - * @param nextUpdate - * @param singleExtensions - */ - public SingleResponse( - CertID certID, - CertStatus certStatus, - DERGeneralizedTime thisUpdate, - DERGeneralizedTime nextUpdate, - X509Extensions singleExtensions) - { - this(certID, certStatus, thisUpdate, nextUpdate, Extensions.getInstance(singleExtensions)); - } - - /** - * @deprecated use method taking ASN1GeneralizedTime and Extensions - * @param certID - * @param certStatus - * @param thisUpdate - * @param nextUpdate - * @param singleExtensions - */ - public SingleResponse( - CertID certID, - CertStatus certStatus, - DERGeneralizedTime thisUpdate, - DERGeneralizedTime nextUpdate, - Extensions singleExtensions) - { - this(certID, certStatus, ASN1GeneralizedTime.getInstance(thisUpdate), ASN1GeneralizedTime.getInstance(nextUpdate), Extensions.getInstance(singleExtensions)); - } - - public SingleResponse( - CertID certID, - CertStatus certStatus, - ASN1GeneralizedTime thisUpdate, - ASN1GeneralizedTime nextUpdate, - Extensions singleExtensions) - { - this.certID = certID; - this.certStatus = certStatus; - this.thisUpdate = thisUpdate; - this.nextUpdate = nextUpdate; - this.singleExtensions = singleExtensions; - } - - private SingleResponse( - ASN1Sequence seq) - { - this.certID = CertID.getInstance(seq.getObjectAt(0)); - this.certStatus = CertStatus.getInstance(seq.getObjectAt(1)); - this.thisUpdate = ASN1GeneralizedTime.getInstance(seq.getObjectAt(2)); - - if (seq.size() > 4) - { - this.nextUpdate = ASN1GeneralizedTime.getInstance( - (ASN1TaggedObject)seq.getObjectAt(3), true); - this.singleExtensions = Extensions.getInstance( - (ASN1TaggedObject)seq.getObjectAt(4), true); - } - else if (seq.size() > 3) - { - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(3); - - if (o.getTagNo() == 0) - { - this.nextUpdate = ASN1GeneralizedTime.getInstance(o, true); - } - else - { - this.singleExtensions = Extensions.getInstance(o, true); - } - } - } - - public static SingleResponse getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static SingleResponse getInstance( - Object obj) - { - if (obj instanceof SingleResponse) - { - return (SingleResponse)obj; - } - else if (obj != null) - { - return new SingleResponse(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public CertID getCertID() - { - return certID; - } - - public CertStatus getCertStatus() - { - return certStatus; - } - - public ASN1GeneralizedTime getThisUpdate() - { - return thisUpdate; - } - - public ASN1GeneralizedTime getNextUpdate() - { - return nextUpdate; - } - - public Extensions getSingleExtensions() - { - return singleExtensions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  SingleResponse ::= SEQUENCE {
    -     *          certID                       CertID,
    -     *          certStatus                   CertStatus,
    -     *          thisUpdate                   GeneralizedTime,
    -     *          nextUpdate         [0]       EXPLICIT GeneralizedTime OPTIONAL,
    -     *          singleExtensions   [1]       EXPLICIT Extensions OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certID); - v.add(certStatus); - v.add(thisUpdate); - - if (nextUpdate != null) - { - v.add(new DERTaggedObject(true, 0, nextUpdate)); - } - - if (singleExtensions != null) - { - v.add(new DERTaggedObject(true, 1, singleExtensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/TBSRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/TBSRequest.java deleted file mode 100644 index 1e5cd38..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ocsp/TBSRequest.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.bc.asn1.ocsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.GeneralName; -import org.bc.asn1.x509.X509Extensions; - -public class TBSRequest - extends ASN1Object -{ - private static final ASN1Integer V1 = new ASN1Integer(0); - - ASN1Integer version; - GeneralName requestorName; - ASN1Sequence requestList; - Extensions requestExtensions; - - boolean versionSet; - - /** - * @deprecated use method taking Extensions - * @param requestorName - * @param requestList - * @param requestExtensions - */ - public TBSRequest( - GeneralName requestorName, - ASN1Sequence requestList, - X509Extensions requestExtensions) - { - this.version = V1; - this.requestorName = requestorName; - this.requestList = requestList; - this.requestExtensions = Extensions.getInstance(requestExtensions); - } - - public TBSRequest( - GeneralName requestorName, - ASN1Sequence requestList, - Extensions requestExtensions) - { - this.version = V1; - this.requestorName = requestorName; - this.requestList = requestList; - this.requestExtensions = requestExtensions; - } - - private TBSRequest( - ASN1Sequence seq) - { - int index = 0; - - if (seq.getObjectAt(0) instanceof ASN1TaggedObject) - { - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0); - - if (o.getTagNo() == 0) - { - versionSet = true; - version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true); - index++; - } - else - { - version = V1; - } - } - else - { - version = V1; - } - - if (seq.getObjectAt(index) instanceof ASN1TaggedObject) - { - requestorName = GeneralName.getInstance((ASN1TaggedObject)seq.getObjectAt(index++), true); - } - - requestList = (ASN1Sequence)seq.getObjectAt(index++); - - if (seq.size() == (index + 1)) - { - requestExtensions = Extensions.getInstance((ASN1TaggedObject)seq.getObjectAt(index), true); - } - } - - public static TBSRequest getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static TBSRequest getInstance( - Object obj) - { - if (obj instanceof TBSRequest) - { - return (TBSRequest)obj; - } - else if (obj != null) - { - return new TBSRequest(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - public GeneralName getRequestorName() - { - return requestorName; - } - - public ASN1Sequence getRequestList() - { - return requestList; - } - - public Extensions getRequestExtensions() - { - return requestExtensions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * TBSRequest      ::=     SEQUENCE {
    -     *     version             [0]     EXPLICIT Version DEFAULT v1,
    -     *     requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
    -     *     requestList                 SEQUENCE OF Request,
    -     *     requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - // - // if default don't include - unless explicitly provided. Not strictly correct - // but required for some requests - // - if (!version.equals(V1) || versionSet) - { - v.add(new DERTaggedObject(true, 0, version)); - } - - if (requestorName != null) - { - v.add(new DERTaggedObject(true, 1, requestorName)); - } - - v.add(requestList); - - if (requestExtensions != null) - { - v.add(new DERTaggedObject(true, 2, requestExtensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/ElGamalParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/ElGamalParameter.java deleted file mode 100644 index 2237092..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/ElGamalParameter.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.asn1.oiw; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class ElGamalParameter - extends ASN1Object -{ - ASN1Integer p, g; - - public ElGamalParameter( - BigInteger p, - BigInteger g) - { - this.p = new ASN1Integer(p); - this.g = new ASN1Integer(g); - } - - public ElGamalParameter( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - p = (ASN1Integer)e.nextElement(); - g = (ASN1Integer)e.nextElement(); - } - - public BigInteger getP() - { - return p.getPositiveValue(); - } - - public BigInteger getG() - { - return g.getPositiveValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(p); - v.add(g); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/OIWObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/OIWObjectIdentifiers.java deleted file mode 100644 index da7a754..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/oiw/OIWObjectIdentifiers.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.asn1.oiw; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface OIWObjectIdentifiers -{ - // id-SHA1 OBJECT IDENTIFIER ::= - // {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } // - static final ASN1ObjectIdentifier md4WithRSA = new ASN1ObjectIdentifier("1.3.14.3.2.2"); - static final ASN1ObjectIdentifier md5WithRSA = new ASN1ObjectIdentifier("1.3.14.3.2.3"); - static final ASN1ObjectIdentifier md4WithRSAEncryption = new ASN1ObjectIdentifier("1.3.14.3.2.4"); - - static final ASN1ObjectIdentifier desECB = new ASN1ObjectIdentifier("1.3.14.3.2.6"); - static final ASN1ObjectIdentifier desCBC = new ASN1ObjectIdentifier("1.3.14.3.2.7"); - static final ASN1ObjectIdentifier desOFB = new ASN1ObjectIdentifier("1.3.14.3.2.8"); - static final ASN1ObjectIdentifier desCFB = new ASN1ObjectIdentifier("1.3.14.3.2.9"); - - static final ASN1ObjectIdentifier desEDE = new ASN1ObjectIdentifier("1.3.14.3.2.17"); - - static final ASN1ObjectIdentifier idSHA1 = new ASN1ObjectIdentifier("1.3.14.3.2.26"); - - static final ASN1ObjectIdentifier dsaWithSHA1 = new ASN1ObjectIdentifier("1.3.14.3.2.27"); - - static final ASN1ObjectIdentifier sha1WithRSA = new ASN1ObjectIdentifier("1.3.14.3.2.29"); - - // ElGamal Algorithm OBJECT IDENTIFIER ::= - // {iso(1) identified-organization(3) oiw(14) dirservsig(7) algorithm(2) encryption(1) 1 } - // - static final ASN1ObjectIdentifier elGamalAlgorithm = new ASN1ObjectIdentifier("1.3.14.7.2.1.1"); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Attribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Attribute.java deleted file mode 100644 index 88841fb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Attribute.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERSequence; - -public class Attribute - extends ASN1Object -{ - private ASN1ObjectIdentifier attrType; - private ASN1Set attrValues; - - /** - * return an Attribute object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static Attribute getInstance( - Object o) - { - if (o == null || o instanceof Attribute) - { - return (Attribute)o; - } - - if (o instanceof ASN1Sequence) - { - return new Attribute((ASN1Sequence)o); - } - - throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); - } - - public Attribute( - ASN1Sequence seq) - { - attrType = (ASN1ObjectIdentifier)seq.getObjectAt(0); - attrValues = (ASN1Set)seq.getObjectAt(1); - } - - public Attribute( - ASN1ObjectIdentifier attrType, - ASN1Set attrValues) - { - this.attrType = attrType; - this.attrValues = attrValues; - } - - public ASN1ObjectIdentifier getAttrType() - { - return attrType; - } - - public ASN1Set getAttrValues() - { - return attrValues; - } - - public ASN1Encodable[] getAttributeValues() - { - return attrValues.toArray(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Attribute ::= SEQUENCE {
    -     *     attrType OBJECT IDENTIFIER,
    -     *     attrValues SET OF AttributeValue
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(attrType); - v.add(attrValues); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/AuthenticatedSafe.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/AuthenticatedSafe.java deleted file mode 100644 index 3ebdc60..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/AuthenticatedSafe.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DLSequence; - -public class AuthenticatedSafe - extends ASN1Object -{ - private ContentInfo[] info; - private boolean isBer = true; - - private AuthenticatedSafe( - ASN1Sequence seq) - { - info = new ContentInfo[seq.size()]; - - for (int i = 0; i != info.length; i++) - { - info[i] = ContentInfo.getInstance(seq.getObjectAt(i)); - } - - isBer = seq instanceof BERSequence; - } - - public static AuthenticatedSafe getInstance( - Object o) - { - if (o instanceof AuthenticatedSafe) - { - return (AuthenticatedSafe)o; - } - - if (o != null) - { - return new AuthenticatedSafe(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public AuthenticatedSafe( - ContentInfo[] info) - { - this.info = info; - } - - public ContentInfo[] getContentInfo() - { - return info; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != info.length; i++) - { - v.add(info[i]); - } - - if (isBer) - { - return new BERSequence(v); - } - else - { - return new DLSequence(v); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CRLBag.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CRLBag.java deleted file mode 100644 index 6f43aa4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CRLBag.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class CRLBag - extends ASN1Object -{ - private ASN1ObjectIdentifier crlId; - private ASN1Encodable crlValue; - - private CRLBag( - ASN1Sequence seq) - { - this.crlId = (ASN1ObjectIdentifier)seq.getObjectAt(0); - this.crlValue = ((DERTaggedObject)seq.getObjectAt(1)).getObject(); - } - - public static CRLBag getInstance(Object o) - { - if (o instanceof CRLBag) - { - return (CRLBag)o; - } - else if (o != null) - { - return new CRLBag(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CRLBag( - ASN1ObjectIdentifier crlId, - ASN1Encodable crlValue) - { - this.crlId = crlId; - this.crlValue = crlValue; - } - - public ASN1ObjectIdentifier getcrlId() - { - return crlId; - } - - public ASN1Encodable getCRLValue() - { - return crlValue; - } - - /** - *
    -     CRLBag ::= SEQUENCE {
    -     crlId  BAG-TYPE.&id ({CRLTypes}),
    -     crlValue  [0] EXPLICIT BAG-TYPE.&Type ({CRLTypes}{@crlId})
    -     }
    -
    -     x509CRL BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {certTypes 1}
    -     -- DER-encoded X.509 CRL stored in OCTET STRING
    -
    -     CRLTypes BAG-TYPE ::= {
    -     x509CRL,
    -     ... -- For future extensions
    -     }
    -       
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(crlId); - v.add(new DERTaggedObject(0, crlValue)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertBag.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertBag.java deleted file mode 100644 index df269c3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertBag.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class CertBag - extends ASN1Object -{ - private ASN1ObjectIdentifier certId; - private ASN1Encodable certValue; - - private CertBag( - ASN1Sequence seq) - { - this.certId = (ASN1ObjectIdentifier)seq.getObjectAt(0); - this.certValue = ((DERTaggedObject)seq.getObjectAt(1)).getObject(); - } - - public static CertBag getInstance(Object o) - { - if (o instanceof CertBag) - { - return (CertBag)o; - } - else if (o != null) - { - return new CertBag(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public CertBag( - ASN1ObjectIdentifier certId, - ASN1Encodable certValue) - { - this.certId = certId; - this.certValue = certValue; - } - - public ASN1ObjectIdentifier getCertId() - { - return certId; - } - - public ASN1Encodable getCertValue() - { - return certValue; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(certId); - v.add(new DERTaggedObject(0, certValue)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequest.java deleted file mode 100644 index 58288d5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequest.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * PKCS10 Certification request object. - *
    - * CertificationRequest ::= SEQUENCE {
    - *   certificationRequestInfo  CertificationRequestInfo,
    - *   signatureAlgorithm        AlgorithmIdentifier{{ SignatureAlgorithms }},
    - *   signature                 BIT STRING
    - * }
    - * 
    - */ -public class CertificationRequest - extends ASN1Object -{ - protected CertificationRequestInfo reqInfo = null; - protected AlgorithmIdentifier sigAlgId = null; - protected DERBitString sigBits = null; - - public static CertificationRequest getInstance(Object o) - { - if (o instanceof CertificationRequest) - { - return (CertificationRequest)o; - } - - if (o != null) - { - return new CertificationRequest(ASN1Sequence.getInstance(o)); - } - - return null; - } - - protected CertificationRequest() - { - } - - public CertificationRequest( - CertificationRequestInfo requestInfo, - AlgorithmIdentifier algorithm, - DERBitString signature) - { - this.reqInfo = requestInfo; - this.sigAlgId = algorithm; - this.sigBits = signature; - } - - public CertificationRequest( - ASN1Sequence seq) - { - reqInfo = CertificationRequestInfo.getInstance(seq.getObjectAt(0)); - sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - sigBits = (DERBitString)seq.getObjectAt(2); - } - - public CertificationRequestInfo getCertificationRequestInfo() - { - return reqInfo; - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return sigAlgId; - } - - public DERBitString getSignature() - { - return sigBits; - } - - public ASN1Primitive toASN1Primitive() - { - // Construct the CertificateRequest - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(reqInfo); - v.add(sigAlgId); - v.add(sigBits); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequestInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequestInfo.java deleted file mode 100644 index 9c85de3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/CertificationRequestInfo.java +++ /dev/null @@ -1,148 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.asn1.x509.X509Name; - -/** - * PKCS10 CertificationRequestInfo object. - *
    - *  CertificationRequestInfo ::= SEQUENCE {
    - *   version             INTEGER { v1(0) } (v1,...),
    - *   subject             Name,
    - *   subjectPKInfo   SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
    - *   attributes          [0] Attributes{{ CRIAttributes }}
    - *  }
    - *
    - *  Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}
    - *
    - *  Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {
    - *    type    ATTRIBUTE.&id({IOSet}),
    - *    values  SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{\@type})
    - *  }
    - * 
    - */ -public class CertificationRequestInfo - extends ASN1Object -{ - ASN1Integer version = new ASN1Integer(0); - X500Name subject; - SubjectPublicKeyInfo subjectPKInfo; - ASN1Set attributes = null; - - public static CertificationRequestInfo getInstance( - Object obj) - { - if (obj instanceof CertificationRequestInfo) - { - return (CertificationRequestInfo)obj; - } - else if (obj != null) - { - return new CertificationRequestInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public CertificationRequestInfo( - X500Name subject, - SubjectPublicKeyInfo pkInfo, - ASN1Set attributes) - { - this.subject = subject; - this.subjectPKInfo = pkInfo; - this.attributes = attributes; - - if ((subject == null) || (version == null) || (subjectPKInfo == null)) - { - throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator."); - } - } - - /** - * @deprecated use X500Name method. - */ - public CertificationRequestInfo( - X509Name subject, - SubjectPublicKeyInfo pkInfo, - ASN1Set attributes) - { - this.subject = X500Name.getInstance(subject.toASN1Primitive()); - this.subjectPKInfo = pkInfo; - this.attributes = attributes; - - if ((subject == null) || (version == null) || (subjectPKInfo == null)) - { - throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator."); - } - } - - public CertificationRequestInfo( - ASN1Sequence seq) - { - version = (ASN1Integer)seq.getObjectAt(0); - - subject = X500Name.getInstance(seq.getObjectAt(1)); - subjectPKInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(2)); - - // - // some CertificationRequestInfo objects seem to treat this field - // as optional. - // - if (seq.size() > 3) - { - DERTaggedObject tagobj = (DERTaggedObject)seq.getObjectAt(3); - attributes = ASN1Set.getInstance(tagobj, false); - } - - if ((subject == null) || (version == null) || (subjectPKInfo == null)) - { - throw new IllegalArgumentException("Not all mandatory fields set in CertificationRequestInfo generator."); - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public X500Name getSubject() - { - return subject; - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return subjectPKInfo; - } - - public ASN1Set getAttributes() - { - return attributes; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(subject); - v.add(subjectPKInfo); - - if (attributes != null) - { - v.add(new DERTaggedObject(false, 0, attributes)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/ContentInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/ContentInfo.java deleted file mode 100644 index 699c89d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/ContentInfo.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERTaggedObject; -import org.bc.asn1.DLSequence; - -public class ContentInfo - extends ASN1Object - implements PKCSObjectIdentifiers -{ - private ASN1ObjectIdentifier contentType; - private ASN1Encodable content; - private boolean isBer = true; - - public static ContentInfo getInstance( - Object obj) - { - if (obj instanceof ContentInfo) - { - return (ContentInfo)obj; - } - - if (obj != null) - { - return new ContentInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private ContentInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - contentType = (ASN1ObjectIdentifier)e.nextElement(); - - if (e.hasMoreElements()) - { - content = ((ASN1TaggedObject)e.nextElement()).getObject(); - } - - isBer = seq instanceof BERSequence; - } - - public ContentInfo( - ASN1ObjectIdentifier contentType, - ASN1Encodable content) - { - this.contentType = contentType; - this.content = content; - } - - public ASN1ObjectIdentifier getContentType() - { - return contentType; - } - - public ASN1Encodable getContent() - { - return content; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * ContentInfo ::= SEQUENCE {
    -     *          contentType ContentType,
    -     *          content
    -     *          [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(contentType); - - if (content != null) - { - v.add(new BERTaggedObject(true, 0, content)); - } - - if (isBer) - { - return new BERSequence(v); - } - else - { - return new DLSequence(v); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/DHParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/DHParameter.java deleted file mode 100644 index d026762..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/DHParameter.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class DHParameter - extends ASN1Object -{ - ASN1Integer p, g, l; - - public DHParameter( - BigInteger p, - BigInteger g, - int l) - { - this.p = new ASN1Integer(p); - this.g = new ASN1Integer(g); - - if (l != 0) - { - this.l = new ASN1Integer(l); - } - else - { - this.l = null; - } - } - - public static DHParameter getInstance( - Object obj) - { - if (obj instanceof DHParameter) - { - return (DHParameter)obj; - } - - if (obj != null) - { - return new DHParameter(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private DHParameter( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - p = ASN1Integer.getInstance(e.nextElement()); - g = ASN1Integer.getInstance(e.nextElement()); - - if (e.hasMoreElements()) - { - l = (ASN1Integer)e.nextElement(); - } - else - { - l = null; - } - } - - public BigInteger getP() - { - return p.getPositiveValue(); - } - - public BigInteger getG() - { - return g.getPositiveValue(); - } - - public BigInteger getL() - { - if (l == null) - { - return null; - } - - return l.getPositiveValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(p); - v.add(g); - - if (this.getL() != null) - { - v.add(l); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedData.java deleted file mode 100644 index 3da0bd7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedData.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * The EncryptedData object. - *
    - *      EncryptedData ::= SEQUENCE {
    - *           version Version,
    - *           encryptedContentInfo EncryptedContentInfo
    - *      }
    - *
    - *
    - *      EncryptedContentInfo ::= SEQUENCE {
    - *          contentType ContentType,
    - *          contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,
    - *          encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
    - *    }
    - *
    - *    EncryptedContent ::= OCTET STRING
    - * 
    - */ -public class EncryptedData - extends ASN1Object -{ - ASN1Sequence data; - ASN1ObjectIdentifier bagId; - ASN1Primitive bagValue; - - public static EncryptedData getInstance( - Object obj) - { - if (obj instanceof EncryptedData) - { - return (EncryptedData)obj; - } - - if (obj != null) - { - return new EncryptedData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private EncryptedData( - ASN1Sequence seq) - { - int version = ((ASN1Integer)seq.getObjectAt(0)).getValue().intValue(); - - if (version != 0) - { - throw new IllegalArgumentException("sequence not version 0"); - } - - this.data = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - - public EncryptedData( - ASN1ObjectIdentifier contentType, - AlgorithmIdentifier encryptionAlgorithm, - ASN1Encodable content) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(contentType); - v.add(encryptionAlgorithm.toASN1Primitive()); - v.add(new BERTaggedObject(false, 0, content)); - - data = new BERSequence(v); - } - - public ASN1ObjectIdentifier getContentType() - { - return ASN1ObjectIdentifier.getInstance(data.getObjectAt(0)); - } - - public AlgorithmIdentifier getEncryptionAlgorithm() - { - return AlgorithmIdentifier.getInstance(data.getObjectAt(1)); - } - - public ASN1OctetString getContent() - { - if (data.size() == 3) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(data.getObjectAt(2)); - - return ASN1OctetString.getInstance(o, false); - } - - return null; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(0)); - v.add(data); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedPrivateKeyInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedPrivateKeyInfo.java deleted file mode 100644 index 03b908f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptedPrivateKeyInfo.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class EncryptedPrivateKeyInfo - extends ASN1Object -{ - private AlgorithmIdentifier algId; - private ASN1OctetString data; - - private EncryptedPrivateKeyInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - algId = AlgorithmIdentifier.getInstance(e.nextElement()); - data = ASN1OctetString.getInstance(e.nextElement()); - } - - public EncryptedPrivateKeyInfo( - AlgorithmIdentifier algId, - byte[] encoding) - { - this.algId = algId; - this.data = new DEROctetString(encoding); - } - - public static EncryptedPrivateKeyInfo getInstance( - Object obj) - { - if (obj instanceof EncryptedPrivateKeyInfo) - { - return (EncryptedPrivateKeyInfo)obj; - } - else if (obj != null) - { - return new EncryptedPrivateKeyInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public AlgorithmIdentifier getEncryptionAlgorithm() - { - return algId; - } - - public byte[] getEncryptedData() - { - return data.getOctets(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * EncryptedPrivateKeyInfo ::= SEQUENCE {
    -     *      encryptionAlgorithm AlgorithmIdentifier {{KeyEncryptionAlgorithms}},
    -     *      encryptedData EncryptedData
    -     * }
    -     *
    -     * EncryptedData ::= OCTET STRING
    -     *
    -     * KeyEncryptionAlgorithms ALGORITHM-IDENTIFIER ::= {
    -     *          ... -- For local profiles
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algId); - v.add(data); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptionScheme.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptionScheme.java deleted file mode 100644 index 87a9f31..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/EncryptionScheme.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class EncryptionScheme - extends AlgorithmIdentifier -{ - public EncryptionScheme( - ASN1ObjectIdentifier objectId, - ASN1Encodable parameters) - { - super(objectId, parameters); - } - - EncryptionScheme( - ASN1Sequence seq) - { - this((ASN1ObjectIdentifier)seq.getObjectAt(0), seq.getObjectAt(1)); - } - - public static final AlgorithmIdentifier getInstance(Object obj) - { - if (obj instanceof EncryptionScheme) - { - return (EncryptionScheme)obj; - } - else if (obj instanceof ASN1Sequence) - { - return new EncryptionScheme((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public ASN1Primitive getObject() - { - return (ASN1Primitive)getParameters(); - } - - public ASN1Primitive getASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(getObjectId()); - v.add(getParameters()); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/IssuerAndSerialNumber.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/IssuerAndSerialNumber.java deleted file mode 100644 index 3476caa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/IssuerAndSerialNumber.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x509.X509Name; - -public class IssuerAndSerialNumber - extends ASN1Object -{ - X500Name name; - ASN1Integer certSerialNumber; - - public static IssuerAndSerialNumber getInstance( - Object obj) - { - if (obj instanceof IssuerAndSerialNumber) - { - return (IssuerAndSerialNumber)obj; - } - else if (obj != null) - { - return new IssuerAndSerialNumber(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private IssuerAndSerialNumber( - ASN1Sequence seq) - { - this.name = X500Name.getInstance(seq.getObjectAt(0)); - this.certSerialNumber = (ASN1Integer)seq.getObjectAt(1); - } - - public IssuerAndSerialNumber( - X509Name name, - BigInteger certSerialNumber) - { - this.name = X500Name.getInstance(name.toASN1Primitive()); - this.certSerialNumber = new ASN1Integer(certSerialNumber); - } - - public IssuerAndSerialNumber( - X509Name name, - ASN1Integer certSerialNumber) - { - this.name = X500Name.getInstance(name.toASN1Primitive()); - this.certSerialNumber = certSerialNumber; - } - - public IssuerAndSerialNumber( - X500Name name, - BigInteger certSerialNumber) - { - this.name = name; - this.certSerialNumber = new ASN1Integer(certSerialNumber); - } - - public X500Name getName() - { - return name; - } - - public ASN1Integer getCertificateSerialNumber() - { - return certSerialNumber; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(name); - v.add(certSerialNumber); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/KeyDerivationFunc.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/KeyDerivationFunc.java deleted file mode 100644 index 18a7498..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/KeyDerivationFunc.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class KeyDerivationFunc - extends AlgorithmIdentifier -{ - KeyDerivationFunc( - ASN1Sequence seq) - { - super(seq); - } - - public KeyDerivationFunc( - ASN1ObjectIdentifier id, - ASN1Encodable params) - { - super(id, params); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/MacData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/MacData.java deleted file mode 100644 index d89539b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/MacData.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.DigestInfo; - -public class MacData - extends ASN1Object -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - - DigestInfo digInfo; - byte[] salt; - BigInteger iterationCount; - - public static MacData getInstance( - Object obj) - { - if (obj instanceof MacData) - { - return (MacData)obj; - } - else if (obj != null) - { - return new MacData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private MacData( - ASN1Sequence seq) - { - this.digInfo = DigestInfo.getInstance(seq.getObjectAt(0)); - - this.salt = ((ASN1OctetString)seq.getObjectAt(1)).getOctets(); - - if (seq.size() == 3) - { - this.iterationCount = ((ASN1Integer)seq.getObjectAt(2)).getValue(); - } - else - { - this.iterationCount = ONE; - } - } - - public MacData( - DigestInfo digInfo, - byte[] salt, - int iterationCount) - { - this.digInfo = digInfo; - this.salt = salt; - this.iterationCount = BigInteger.valueOf(iterationCount); - } - - public DigestInfo getMac() - { - return digInfo; - } - - public byte[] getSalt() - { - return salt; - } - - public BigInteger getIterationCount() - { - return iterationCount; - } - - /** - *
    -     * MacData ::= SEQUENCE {
    -     *     mac      DigestInfo,
    -     *     macSalt  OCTET STRING,
    -     *     iterations INTEGER DEFAULT 1
    -     *     -- Note: The default is for historic reasons and its use is deprecated. A
    -     *     -- higher value, like 1024 is recommended.
    -     * 
    - * @return the basic ASN1Primitive construction. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(digInfo); - v.add(new DEROctetString(salt)); - - if (!iterationCount.equals(ONE)) - { - v.add(new ASN1Integer(iterationCount)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBEParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBEParameter.java deleted file mode 100644 index dc7f914..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBEParameter.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class PBEParameter - extends ASN1Object -{ - ASN1Integer iterations; - ASN1OctetString salt; - - public PBEParameter( - byte[] salt, - int iterations) - { - if (salt.length != 8) - { - throw new IllegalArgumentException("salt length must be 8"); - } - this.salt = new DEROctetString(salt); - this.iterations = new ASN1Integer(iterations); - } - - private PBEParameter( - ASN1Sequence seq) - { - salt = (ASN1OctetString)seq.getObjectAt(0); - iterations = (ASN1Integer)seq.getObjectAt(1); - } - - public static PBEParameter getInstance( - Object obj) - { - if (obj instanceof PBEParameter) - { - return (PBEParameter)obj; - } - else if (obj != null) - { - return new PBEParameter(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public BigInteger getIterationCount() - { - return iterations.getValue(); - } - - public byte[] getSalt() - { - return salt.getOctets(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(salt); - v.add(iterations); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Algorithms.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Algorithms.java deleted file mode 100644 index 842a046..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Algorithms.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * @deprecated - use AlgorithmIdentifier and PBES2Parameters - */ -public class PBES2Algorithms - extends AlgorithmIdentifier implements PKCSObjectIdentifiers -{ - private ASN1ObjectIdentifier objectId; - private KeyDerivationFunc func; - private EncryptionScheme scheme; - - public PBES2Algorithms( - ASN1Sequence obj) - { - super(obj); - - Enumeration e = obj.getObjects(); - - objectId = (ASN1ObjectIdentifier)e.nextElement(); - - ASN1Sequence seq = (ASN1Sequence)e.nextElement(); - - e = seq.getObjects(); - - ASN1Sequence funcSeq = (ASN1Sequence)e.nextElement(); - - if (funcSeq.getObjectAt(0).equals(id_PBKDF2)) - { - func = new KeyDerivationFunc(id_PBKDF2, PBKDF2Params.getInstance(funcSeq.getObjectAt(1))); - } - else - { - func = new KeyDerivationFunc(funcSeq); - } - - scheme = new EncryptionScheme((ASN1Sequence)e.nextElement()); - } - - public ASN1ObjectIdentifier getObjectId() - { - return objectId; - } - - public KeyDerivationFunc getKeyDerivationFunc() - { - return func; - } - - public EncryptionScheme getEncryptionScheme() - { - return scheme; - } - - public ASN1Primitive getASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - ASN1EncodableVector subV = new ASN1EncodableVector(); - - v.add(objectId); - - subV.add(func); - subV.add(scheme); - v.add(new DERSequence(subV)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Parameters.java deleted file mode 100644 index 037e400..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBES2Parameters.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PBES2Parameters - extends ASN1Object - implements PKCSObjectIdentifiers -{ - private KeyDerivationFunc func; - private EncryptionScheme scheme; - - public static PBES2Parameters getInstance( - Object obj) - { - if (obj== null || obj instanceof PBES2Parameters) - { - return (PBES2Parameters)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new PBES2Parameters((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public PBES2Parameters( - ASN1Sequence obj) - { - Enumeration e = obj.getObjects(); - ASN1Sequence funcSeq = ASN1Sequence.getInstance(((ASN1Encodable)e.nextElement()).toASN1Primitive()); - - if (funcSeq.getObjectAt(0).equals(id_PBKDF2)) - { - func = new KeyDerivationFunc(id_PBKDF2, PBKDF2Params.getInstance(funcSeq.getObjectAt(1))); - } - else - { - func = new KeyDerivationFunc(funcSeq); - } - - scheme = (EncryptionScheme)EncryptionScheme.getInstance(e.nextElement()); - } - - public KeyDerivationFunc getKeyDerivationFunc() - { - return func; - } - - public EncryptionScheme getEncryptionScheme() - { - return scheme; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(func); - v.add(scheme); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBKDF2Params.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBKDF2Params.java deleted file mode 100644 index bcd3cbc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PBKDF2Params.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class PBKDF2Params - extends ASN1Object -{ - private ASN1OctetString octStr; - private ASN1Integer iterationCount; - private ASN1Integer keyLength; - - public static PBKDF2Params getInstance( - Object obj) - { - if (obj instanceof PBKDF2Params) - { - return (PBKDF2Params)obj; - } - - if (obj != null) - { - return new PBKDF2Params(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public PBKDF2Params( - byte[] salt, - int iterationCount) - { - this.octStr = new DEROctetString(salt); - this.iterationCount = new ASN1Integer(iterationCount); - } - - public PBKDF2Params( - byte[] salt, - int iterationCount, - int keyLength) - { - this(salt, iterationCount); - - this.keyLength = new ASN1Integer(keyLength); - } - - private PBKDF2Params( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - octStr = (ASN1OctetString)e.nextElement(); - iterationCount = (ASN1Integer)e.nextElement(); - - if (e.hasMoreElements()) - { - keyLength = (ASN1Integer)e.nextElement(); - } - else - { - keyLength = null; - } - } - - public byte[] getSalt() - { - return octStr.getOctets(); - } - - public BigInteger getIterationCount() - { - return iterationCount.getValue(); - } - - public BigInteger getKeyLength() - { - if (keyLength != null) - { - return keyLength.getValue(); - } - - return null; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(octStr); - v.add(iterationCount); - - if (keyLength != null) - { - v.add(keyLength); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCS12PBEParams.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCS12PBEParams.java deleted file mode 100644 index 48d1ad3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCS12PBEParams.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class PKCS12PBEParams - extends ASN1Object -{ - ASN1Integer iterations; - ASN1OctetString iv; - - public PKCS12PBEParams( - byte[] salt, - int iterations) - { - this.iv = new DEROctetString(salt); - this.iterations = new ASN1Integer(iterations); - } - - private PKCS12PBEParams( - ASN1Sequence seq) - { - iv = (ASN1OctetString)seq.getObjectAt(0); - iterations = ASN1Integer.getInstance(seq.getObjectAt(1)); - } - - public static PKCS12PBEParams getInstance( - Object obj) - { - if (obj instanceof PKCS12PBEParams) - { - return (PKCS12PBEParams)obj; - } - else if (obj != null) - { - return new PKCS12PBEParams(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public BigInteger getIterations() - { - return iterations.getValue(); - } - - public byte[] getIV() - { - return iv.getOctets(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(iv); - v.add(iterations); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCSObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCSObjectIdentifiers.java deleted file mode 100644 index 911e9e0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PKCSObjectIdentifiers.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface PKCSObjectIdentifiers -{ - // - // pkcs-1 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } - // - static final ASN1ObjectIdentifier pkcs_1 = new ASN1ObjectIdentifier("1.2.840.113549.1.1"); - static final ASN1ObjectIdentifier rsaEncryption = pkcs_1.branch("1"); - static final ASN1ObjectIdentifier md2WithRSAEncryption = pkcs_1.branch("2"); - static final ASN1ObjectIdentifier md4WithRSAEncryption = pkcs_1.branch("3"); - static final ASN1ObjectIdentifier md5WithRSAEncryption = pkcs_1.branch("4"); - static final ASN1ObjectIdentifier sha1WithRSAEncryption = pkcs_1.branch("5"); - static final ASN1ObjectIdentifier srsaOAEPEncryptionSET = pkcs_1.branch("6"); - static final ASN1ObjectIdentifier id_RSAES_OAEP = pkcs_1.branch("7"); - static final ASN1ObjectIdentifier id_mgf1 = pkcs_1.branch("8"); - static final ASN1ObjectIdentifier id_pSpecified = pkcs_1.branch("9"); - static final ASN1ObjectIdentifier id_RSASSA_PSS = pkcs_1.branch("10"); - static final ASN1ObjectIdentifier sha256WithRSAEncryption = pkcs_1.branch("11"); - static final ASN1ObjectIdentifier sha384WithRSAEncryption = pkcs_1.branch("12"); - static final ASN1ObjectIdentifier sha512WithRSAEncryption = pkcs_1.branch("13"); - static final ASN1ObjectIdentifier sha224WithRSAEncryption = pkcs_1.branch("14"); - - // - // pkcs-3 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 3 } - // - static final ASN1ObjectIdentifier pkcs_3 = new ASN1ObjectIdentifier("1.2.840.113549.1.3"); - static final ASN1ObjectIdentifier dhKeyAgreement = pkcs_3.branch("1"); - - // - // pkcs-5 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } - // - static final ASN1ObjectIdentifier pkcs_5 = new ASN1ObjectIdentifier("1.2.840.113549.1.5"); - - static final ASN1ObjectIdentifier pbeWithMD2AndDES_CBC = pkcs_5.branch("1"); - static final ASN1ObjectIdentifier pbeWithMD2AndRC2_CBC = pkcs_5.branch("4"); - static final ASN1ObjectIdentifier pbeWithMD5AndDES_CBC = pkcs_5.branch("3"); - static final ASN1ObjectIdentifier pbeWithMD5AndRC2_CBC = pkcs_5.branch("6"); - static final ASN1ObjectIdentifier pbeWithSHA1AndDES_CBC = pkcs_5.branch("10"); - static final ASN1ObjectIdentifier pbeWithSHA1AndRC2_CBC = pkcs_5.branch("11"); - - static final ASN1ObjectIdentifier id_PBES2 = pkcs_5.branch("13"); - - static final ASN1ObjectIdentifier id_PBKDF2 = pkcs_5.branch("12"); - - // - // encryptionAlgorithm OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) 3 } - // - static final ASN1ObjectIdentifier encryptionAlgorithm = new ASN1ObjectIdentifier("1.2.840.113549.3"); - - static final ASN1ObjectIdentifier des_EDE3_CBC = encryptionAlgorithm.branch("7"); - static final ASN1ObjectIdentifier RC2_CBC = encryptionAlgorithm.branch("2"); - static final ASN1ObjectIdentifier rc4 = encryptionAlgorithm.branch("4"); - - // - // object identifiers for digests - // - static final ASN1ObjectIdentifier digestAlgorithm = new ASN1ObjectIdentifier("1.2.840.113549.2"); - // - // md2 OBJECT IDENTIFIER ::= - // {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 2} - // - static final ASN1ObjectIdentifier md2 = digestAlgorithm.branch("2"); - - // - // md4 OBJECT IDENTIFIER ::= - // {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 4} - // - static final ASN1ObjectIdentifier md4 = digestAlgorithm.branch("4"); - - // - // md5 OBJECT IDENTIFIER ::= - // {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5} - // - static final ASN1ObjectIdentifier md5 = digestAlgorithm.branch("5"); - - static final ASN1ObjectIdentifier id_hmacWithSHA1 = digestAlgorithm.branch("7"); - static final ASN1ObjectIdentifier id_hmacWithSHA224 = digestAlgorithm.branch("8"); - static final ASN1ObjectIdentifier id_hmacWithSHA256 = digestAlgorithm.branch("9"); - static final ASN1ObjectIdentifier id_hmacWithSHA384 = digestAlgorithm.branch("10"); - static final ASN1ObjectIdentifier id_hmacWithSHA512 = digestAlgorithm.branch("11"); - - // - // pkcs-7 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 7 } - // - static final String pkcs_7 = "1.2.840.113549.1.7"; - static final ASN1ObjectIdentifier data = new ASN1ObjectIdentifier(pkcs_7 + ".1"); - static final ASN1ObjectIdentifier signedData = new ASN1ObjectIdentifier(pkcs_7 + ".2"); - static final ASN1ObjectIdentifier envelopedData = new ASN1ObjectIdentifier(pkcs_7 + ".3"); - static final ASN1ObjectIdentifier signedAndEnvelopedData = new ASN1ObjectIdentifier(pkcs_7 + ".4"); - static final ASN1ObjectIdentifier digestedData = new ASN1ObjectIdentifier(pkcs_7 + ".5"); - static final ASN1ObjectIdentifier encryptedData = new ASN1ObjectIdentifier(pkcs_7 + ".6"); - - // - // pkcs-9 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } - // - static final ASN1ObjectIdentifier pkcs_9 = new ASN1ObjectIdentifier("1.2.840.113549.1.9"); - - static final ASN1ObjectIdentifier pkcs_9_at_emailAddress = pkcs_9.branch("1"); - static final ASN1ObjectIdentifier pkcs_9_at_unstructuredName = pkcs_9.branch("2"); - static final ASN1ObjectIdentifier pkcs_9_at_contentType = pkcs_9.branch("3"); - static final ASN1ObjectIdentifier pkcs_9_at_messageDigest = pkcs_9.branch("4"); - static final ASN1ObjectIdentifier pkcs_9_at_signingTime = pkcs_9.branch("5"); - static final ASN1ObjectIdentifier pkcs_9_at_counterSignature = pkcs_9.branch("6"); - static final ASN1ObjectIdentifier pkcs_9_at_challengePassword = pkcs_9.branch("7"); - static final ASN1ObjectIdentifier pkcs_9_at_unstructuredAddress = pkcs_9.branch("8"); - static final ASN1ObjectIdentifier pkcs_9_at_extendedCertificateAttributes = pkcs_9.branch("9"); - - static final ASN1ObjectIdentifier pkcs_9_at_signingDescription = pkcs_9.branch("13"); - static final ASN1ObjectIdentifier pkcs_9_at_extensionRequest = pkcs_9.branch("14"); - static final ASN1ObjectIdentifier pkcs_9_at_smimeCapabilities = pkcs_9.branch("15"); - - static final ASN1ObjectIdentifier pkcs_9_at_friendlyName = pkcs_9.branch("20"); - static final ASN1ObjectIdentifier pkcs_9_at_localKeyId = pkcs_9.branch("21"); - - /** @deprecated use x509Certificate instead */ - static final ASN1ObjectIdentifier x509certType = pkcs_9.branch("22.1"); - - static final ASN1ObjectIdentifier certTypes = pkcs_9.branch("22"); - static final ASN1ObjectIdentifier x509Certificate = certTypes.branch("1"); - static final ASN1ObjectIdentifier sdsiCertificate = certTypes.branch("2"); - - static final ASN1ObjectIdentifier crlTypes = pkcs_9.branch("23"); - static final ASN1ObjectIdentifier x509Crl = crlTypes.branch("1"); - - static final ASN1ObjectIdentifier id_alg_PWRI_KEK = pkcs_9.branch("16.3.9"); - - // - // SMIME capability sub oids. - // - static final ASN1ObjectIdentifier preferSignedData = pkcs_9.branch("15.1"); - static final ASN1ObjectIdentifier canNotDecryptAny = pkcs_9.branch("15.2"); - static final ASN1ObjectIdentifier sMIMECapabilitiesVersions = pkcs_9.branch("15.3"); - - // - // id-ct OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) - // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) ct(1)} - // - static final ASN1ObjectIdentifier id_ct = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.1"); - - static final ASN1ObjectIdentifier id_ct_authData = id_ct.branch("2"); - static final ASN1ObjectIdentifier id_ct_TSTInfo = id_ct.branch("4"); - static final ASN1ObjectIdentifier id_ct_compressedData = id_ct.branch("9"); - static final ASN1ObjectIdentifier id_ct_authEnvelopedData = id_ct.branch("23"); - static final ASN1ObjectIdentifier id_ct_timestampedData = id_ct.branch("31"); - - // - // id-cti OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) - // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) cti(6)} - // - static final ASN1ObjectIdentifier id_cti = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.6"); - - static final ASN1ObjectIdentifier id_cti_ets_proofOfOrigin = id_cti.branch("1"); - static final ASN1ObjectIdentifier id_cti_ets_proofOfReceipt = id_cti.branch("2"); - static final ASN1ObjectIdentifier id_cti_ets_proofOfDelivery = id_cti.branch("3"); - static final ASN1ObjectIdentifier id_cti_ets_proofOfSender = id_cti.branch("4"); - static final ASN1ObjectIdentifier id_cti_ets_proofOfApproval = id_cti.branch("5"); - static final ASN1ObjectIdentifier id_cti_ets_proofOfCreation = id_cti.branch("6"); - - // - // id-aa OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) - // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) attributes(2)} - // - static final ASN1ObjectIdentifier id_aa = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.2"); - - - static final ASN1ObjectIdentifier id_aa_receiptRequest = id_aa.branch("1"); - - static final ASN1ObjectIdentifier id_aa_contentHint = id_aa.branch("4"); // See RFC 2634 - static final ASN1ObjectIdentifier id_aa_msgSigDigest = id_aa.branch("5"); - static final ASN1ObjectIdentifier id_aa_contentReference = id_aa.branch("10"); - /* - * id-aa-encrypKeyPref OBJECT IDENTIFIER ::= {id-aa 11} - * - */ - static final ASN1ObjectIdentifier id_aa_encrypKeyPref = id_aa.branch("11"); - static final ASN1ObjectIdentifier id_aa_signingCertificate = id_aa.branch("12"); - static final ASN1ObjectIdentifier id_aa_signingCertificateV2 = id_aa.branch("47"); - - static final ASN1ObjectIdentifier id_aa_contentIdentifier = id_aa.branch("7"); // See RFC 2634 - - /* - * RFC 3126 - */ - static final ASN1ObjectIdentifier id_aa_signatureTimeStampToken = id_aa.branch("14"); - - static final ASN1ObjectIdentifier id_aa_ets_sigPolicyId = id_aa.branch("15"); - static final ASN1ObjectIdentifier id_aa_ets_commitmentType = id_aa.branch("16"); - static final ASN1ObjectIdentifier id_aa_ets_signerLocation = id_aa.branch("17"); - static final ASN1ObjectIdentifier id_aa_ets_signerAttr = id_aa.branch("18"); - static final ASN1ObjectIdentifier id_aa_ets_otherSigCert = id_aa.branch("19"); - static final ASN1ObjectIdentifier id_aa_ets_contentTimestamp = id_aa.branch("20"); - static final ASN1ObjectIdentifier id_aa_ets_certificateRefs = id_aa.branch("21"); - static final ASN1ObjectIdentifier id_aa_ets_revocationRefs = id_aa.branch("22"); - static final ASN1ObjectIdentifier id_aa_ets_certValues = id_aa.branch("23"); - static final ASN1ObjectIdentifier id_aa_ets_revocationValues = id_aa.branch("24"); - static final ASN1ObjectIdentifier id_aa_ets_escTimeStamp = id_aa.branch("25"); - static final ASN1ObjectIdentifier id_aa_ets_certCRLTimestamp = id_aa.branch("26"); - static final ASN1ObjectIdentifier id_aa_ets_archiveTimestamp = id_aa.branch("27"); - - /** @deprecated use id_aa_ets_sigPolicyId instead */ - static final ASN1ObjectIdentifier id_aa_sigPolicyId = id_aa_ets_sigPolicyId; - /** @deprecated use id_aa_ets_commitmentType instead */ - static final ASN1ObjectIdentifier id_aa_commitmentType = id_aa_ets_commitmentType; - /** @deprecated use id_aa_ets_signerLocation instead */ - static final ASN1ObjectIdentifier id_aa_signerLocation = id_aa_ets_signerLocation; - /** @deprecated use id_aa_ets_otherSigCert instead */ - static final ASN1ObjectIdentifier id_aa_otherSigCert = id_aa_ets_otherSigCert; - - // - // id-spq OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) - // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) id-spq(5)} - // - final String id_spq = "1.2.840.113549.1.9.16.5"; - - static final ASN1ObjectIdentifier id_spq_ets_uri = new ASN1ObjectIdentifier(id_spq + ".1"); - static final ASN1ObjectIdentifier id_spq_ets_unotice = new ASN1ObjectIdentifier(id_spq + ".2"); - - // - // pkcs-12 OBJECT IDENTIFIER ::= { - // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } - // - static final ASN1ObjectIdentifier pkcs_12 = new ASN1ObjectIdentifier("1.2.840.113549.1.12"); - static final ASN1ObjectIdentifier bagtypes = pkcs_12.branch("10.1"); - - static final ASN1ObjectIdentifier keyBag = bagtypes.branch("1"); - static final ASN1ObjectIdentifier pkcs8ShroudedKeyBag = bagtypes.branch("2"); - static final ASN1ObjectIdentifier certBag = bagtypes.branch("3"); - static final ASN1ObjectIdentifier crlBag = bagtypes.branch("4"); - static final ASN1ObjectIdentifier secretBag = bagtypes.branch("5"); - static final ASN1ObjectIdentifier safeContentsBag = bagtypes.branch("6"); - - static final ASN1ObjectIdentifier pkcs_12PbeIds = pkcs_12.branch("1"); - - static final ASN1ObjectIdentifier pbeWithSHAAnd128BitRC4 = pkcs_12PbeIds.branch("1"); - static final ASN1ObjectIdentifier pbeWithSHAAnd40BitRC4 = pkcs_12PbeIds.branch("2"); - static final ASN1ObjectIdentifier pbeWithSHAAnd3_KeyTripleDES_CBC = pkcs_12PbeIds.branch("3"); - static final ASN1ObjectIdentifier pbeWithSHAAnd2_KeyTripleDES_CBC = pkcs_12PbeIds.branch("4"); - static final ASN1ObjectIdentifier pbeWithSHAAnd128BitRC2_CBC = pkcs_12PbeIds.branch("5"); - static final ASN1ObjectIdentifier pbeWithSHAAnd40BitRC2_CBC = pkcs_12PbeIds.branch("6"); - - /** - * @deprecated use pbeWithSHAAnd40BitRC2_CBC - */ - static final ASN1ObjectIdentifier pbewithSHAAnd40BitRC2_CBC = pkcs_12PbeIds.branch("6"); - - static final ASN1ObjectIdentifier id_alg_CMS3DESwrap = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.3.6"); - static final ASN1ObjectIdentifier id_alg_CMSRC2wrap = new ASN1ObjectIdentifier("1.2.840.113549.1.9.16.3.7"); -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Pfx.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Pfx.java deleted file mode 100644 index f6d386d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/Pfx.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.BERSequence; - -/** - * the infamous Pfx from PKCS12 - */ -public class Pfx - extends ASN1Object - implements PKCSObjectIdentifiers -{ - private ContentInfo contentInfo; - private MacData macData = null; - - private Pfx( - ASN1Sequence seq) - { - BigInteger version = ((ASN1Integer)seq.getObjectAt(0)).getValue(); - if (version.intValue() != 3) - { - throw new IllegalArgumentException("wrong version for PFX PDU"); - } - - contentInfo = ContentInfo.getInstance(seq.getObjectAt(1)); - - if (seq.size() == 3) - { - macData = MacData.getInstance(seq.getObjectAt(2)); - } - } - - public static Pfx getInstance( - Object obj) - { - if (obj instanceof Pfx) - { - return (Pfx)obj; - } - - if (obj != null) - { - return new Pfx(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public Pfx( - ContentInfo contentInfo, - MacData macData) - { - this.contentInfo = contentInfo; - this.macData = macData; - } - - public ContentInfo getAuthSafe() - { - return contentInfo; - } - - public MacData getMacData() - { - return macData; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(3)); - v.add(contentInfo); - - if (macData != null) - { - v.add(macData); - } - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PrivateKeyInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PrivateKeyInfo.java deleted file mode 100644 index 10e708d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/PrivateKeyInfo.java +++ /dev/null @@ -1,160 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.io.IOException; -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class PrivateKeyInfo - extends ASN1Object -{ - private ASN1OctetString privKey; - private AlgorithmIdentifier algId; - private ASN1Set attributes; - - public static PrivateKeyInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static PrivateKeyInfo getInstance( - Object obj) - { - if (obj instanceof PrivateKeyInfo) - { - return (PrivateKeyInfo)obj; - } - else if (obj != null) - { - return new PrivateKeyInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public PrivateKeyInfo( - AlgorithmIdentifier algId, - ASN1Encodable privateKey) - throws IOException - { - this(algId, privateKey, null); - } - - public PrivateKeyInfo( - AlgorithmIdentifier algId, - ASN1Encodable privateKey, - ASN1Set attributes) - throws IOException - { - this.privKey = new DEROctetString(privateKey.toASN1Primitive().getEncoded(ASN1Encoding.DER)); - this.algId = algId; - this.attributes = attributes; - } - - public PrivateKeyInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - BigInteger version = ((ASN1Integer)e.nextElement()).getValue(); - if (version.intValue() != 0) - { - throw new IllegalArgumentException("wrong version for private key info"); - } - - algId = AlgorithmIdentifier.getInstance(e.nextElement()); - privKey = ASN1OctetString.getInstance(e.nextElement()); - - if (e.hasMoreElements()) - { - attributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false); - } - } - - public AlgorithmIdentifier getPrivateKeyAlgorithm() - { - return algId; - } - /** - * @deprecated use getPrivateKeyAlgorithm() - */ - public AlgorithmIdentifier getAlgorithmId() - { - return algId; - } - - public ASN1Encodable parsePrivateKey() - throws IOException - { - return ASN1Primitive.fromByteArray(privKey.getOctets()); - } - - /** - * @deprecated use parsePrivateKey() - */ - public ASN1Primitive getPrivateKey() - { - try - { - return parsePrivateKey().toASN1Primitive(); - } - catch (IOException e) - { - throw new IllegalStateException("unable to parse private key"); - } - } - - public ASN1Set getAttributes() - { - return attributes; - } - - /** - * write out an RSA private key with its associated information - * as described in PKCS8. - *
    -     *      PrivateKeyInfo ::= SEQUENCE {
    -     *                              version Version,
    -     *                              privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
    -     *                              privateKey PrivateKey,
    -     *                              attributes [0] IMPLICIT Attributes OPTIONAL 
    -     *                          }
    -     *      Version ::= INTEGER {v1(0)} (v1,...)
    -     *
    -     *      PrivateKey ::= OCTET STRING
    -     *
    -     *      Attributes ::= SET OF Attribute
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(0)); - v.add(algId); - v.add(privKey); - - if (attributes != null) - { - v.add(new DERTaggedObject(false, 0, attributes)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RC2CBCParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RC2CBCParameter.java deleted file mode 100644 index d4e5e4b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RC2CBCParameter.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class RC2CBCParameter - extends ASN1Object -{ - ASN1Integer version; - ASN1OctetString iv; - - public static RC2CBCParameter getInstance( - Object o) - { - if (o instanceof RC2CBCParameter) - { - return (RC2CBCParameter)o; - } - if (o != null) - { - return new RC2CBCParameter(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public RC2CBCParameter( - byte[] iv) - { - this.version = null; - this.iv = new DEROctetString(iv); - } - - public RC2CBCParameter( - int parameterVersion, - byte[] iv) - { - this.version = new ASN1Integer(parameterVersion); - this.iv = new DEROctetString(iv); - } - - private RC2CBCParameter( - ASN1Sequence seq) - { - if (seq.size() == 1) - { - version = null; - iv = (ASN1OctetString)seq.getObjectAt(0); - } - else - { - version = (ASN1Integer)seq.getObjectAt(0); - iv = (ASN1OctetString)seq.getObjectAt(1); - } - } - - public BigInteger getRC2ParameterVersion() - { - if (version == null) - { - return null; - } - - return version.getValue(); - } - - public byte[] getIV() - { - return iv.getOctets(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (version != null) - { - v.add(version); - } - - v.add(iv); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAESOAEPparams.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAESOAEPparams.java deleted file mode 100644 index a9263f7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAESOAEPparams.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERNull; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.oiw.OIWObjectIdentifiers; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class RSAESOAEPparams - extends ASN1Object -{ - private AlgorithmIdentifier hashAlgorithm; - private AlgorithmIdentifier maskGenAlgorithm; - private AlgorithmIdentifier pSourceAlgorithm; - - public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE); - public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM); - public final static AlgorithmIdentifier DEFAULT_P_SOURCE_ALGORITHM = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(new byte[0])); - - public static RSAESOAEPparams getInstance( - Object obj) - { - if (obj instanceof RSAESOAEPparams) - { - return (RSAESOAEPparams)obj; - } - else if (obj != null) - { - return new RSAESOAEPparams(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * The default version - */ - public RSAESOAEPparams() - { - hashAlgorithm = DEFAULT_HASH_ALGORITHM; - maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION; - pSourceAlgorithm = DEFAULT_P_SOURCE_ALGORITHM; - } - - public RSAESOAEPparams( - AlgorithmIdentifier hashAlgorithm, - AlgorithmIdentifier maskGenAlgorithm, - AlgorithmIdentifier pSourceAlgorithm) - { - this.hashAlgorithm = hashAlgorithm; - this.maskGenAlgorithm = maskGenAlgorithm; - this.pSourceAlgorithm = pSourceAlgorithm; - } - - public RSAESOAEPparams( - ASN1Sequence seq) - { - hashAlgorithm = DEFAULT_HASH_ALGORITHM; - maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION; - pSourceAlgorithm = DEFAULT_P_SOURCE_ALGORITHM; - - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(i); - - switch (o.getTagNo()) - { - case 0: - hashAlgorithm = AlgorithmIdentifier.getInstance(o, true); - break; - case 1: - maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true); - break; - case 2: - pSourceAlgorithm = AlgorithmIdentifier.getInstance(o, true); - break; - default: - throw new IllegalArgumentException("unknown tag"); - } - } - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public AlgorithmIdentifier getMaskGenAlgorithm() - { - return maskGenAlgorithm; - } - - public AlgorithmIdentifier getPSourceAlgorithm() - { - return pSourceAlgorithm; - } - - /** - *
    -     *  RSAES-OAEP-params ::= SEQUENCE {
    -     *     hashAlgorithm      [0] OAEP-PSSDigestAlgorithms     DEFAULT sha1,
    -     *     maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
    -     *     pSourceAlgorithm   [2] PKCS1PSourceAlgorithms  DEFAULT pSpecifiedEmpty
    -     *   }
    -     *  
    -     *   OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
    -     *     { OID id-sha1 PARAMETERS NULL   }|
    -     *     { OID id-sha256 PARAMETERS NULL }|
    -     *     { OID id-sha384 PARAMETERS NULL }|
    -     *     { OID id-sha512 PARAMETERS NULL },
    -     *     ...  -- Allows for future expansion --
    -     *   }
    -     *   PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
    -     *     { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
    -     *    ...  -- Allows for future expansion --
    -     *   }
    -     *   PKCS1PSourceAlgorithms    ALGORITHM-IDENTIFIER ::= {
    -     *     { OID id-pSpecified PARAMETERS OCTET STRING },
    -     *     ...  -- Allows for future expansion --
    -     *  }
    -     * 
    - * @return the asn1 primitive representing the parameters. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM)) - { - v.add(new DERTaggedObject(true, 0, hashAlgorithm)); - } - - if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION)) - { - v.add(new DERTaggedObject(true, 1, maskGenAlgorithm)); - } - - if (!pSourceAlgorithm.equals(DEFAULT_P_SOURCE_ALGORITHM)) - { - v.add(new DERTaggedObject(true, 2, pSourceAlgorithm)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKey.java deleted file mode 100644 index 76c004e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKey.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class RSAPrivateKey - extends ASN1Object -{ - private BigInteger version; - private BigInteger modulus; - private BigInteger publicExponent; - private BigInteger privateExponent; - private BigInteger prime1; - private BigInteger prime2; - private BigInteger exponent1; - private BigInteger exponent2; - private BigInteger coefficient; - private ASN1Sequence otherPrimeInfos = null; - - public static RSAPrivateKey getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static RSAPrivateKey getInstance( - Object obj) - { - if (obj instanceof RSAPrivateKey) - { - return (RSAPrivateKey)obj; - } - - if (obj != null) - { - return new RSAPrivateKey(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public RSAPrivateKey( - BigInteger modulus, - BigInteger publicExponent, - BigInteger privateExponent, - BigInteger prime1, - BigInteger prime2, - BigInteger exponent1, - BigInteger exponent2, - BigInteger coefficient) - { - this.version = BigInteger.valueOf(0); - this.modulus = modulus; - this.publicExponent = publicExponent; - this.privateExponent = privateExponent; - this.prime1 = prime1; - this.prime2 = prime2; - this.exponent1 = exponent1; - this.exponent2 = exponent2; - this.coefficient = coefficient; - } - - private RSAPrivateKey( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - BigInteger v = ((ASN1Integer)e.nextElement()).getValue(); - if (v.intValue() != 0 && v.intValue() != 1) - { - throw new IllegalArgumentException("wrong version for RSA private key"); - } - - version = v; - modulus = ((ASN1Integer)e.nextElement()).getValue(); - publicExponent = ((ASN1Integer)e.nextElement()).getValue(); - privateExponent = ((ASN1Integer)e.nextElement()).getValue(); - prime1 = ((ASN1Integer)e.nextElement()).getValue(); - prime2 = ((ASN1Integer)e.nextElement()).getValue(); - exponent1 = ((ASN1Integer)e.nextElement()).getValue(); - exponent2 = ((ASN1Integer)e.nextElement()).getValue(); - coefficient = ((ASN1Integer)e.nextElement()).getValue(); - - if (e.hasMoreElements()) - { - otherPrimeInfos = (ASN1Sequence)e.nextElement(); - } - } - - public BigInteger getVersion() - { - return version; - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getPublicExponent() - { - return publicExponent; - } - - public BigInteger getPrivateExponent() - { - return privateExponent; - } - - public BigInteger getPrime1() - { - return prime1; - } - - public BigInteger getPrime2() - { - return prime2; - } - - public BigInteger getExponent1() - { - return exponent1; - } - - public BigInteger getExponent2() - { - return exponent2; - } - - public BigInteger getCoefficient() - { - return coefficient; - } - - /** - * This outputs the key in PKCS1v2 format. - *
    -     *      RSAPrivateKey ::= SEQUENCE {
    -     *                          version Version,
    -     *                          modulus INTEGER, -- n
    -     *                          publicExponent INTEGER, -- e
    -     *                          privateExponent INTEGER, -- d
    -     *                          prime1 INTEGER, -- p
    -     *                          prime2 INTEGER, -- q
    -     *                          exponent1 INTEGER, -- d mod (p-1)
    -     *                          exponent2 INTEGER, -- d mod (q-1)
    -     *                          coefficient INTEGER, -- (inverse of q) mod p
    -     *                          otherPrimeInfos OtherPrimeInfos OPTIONAL
    -     *                      }
    -     *
    -     *      Version ::= INTEGER { two-prime(0), multi(1) }
    -     *        (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
    -     * 
    - *

    - * This routine is written to output PKCS1 version 2.1, private keys. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(version)); // version - v.add(new ASN1Integer(getModulus())); - v.add(new ASN1Integer(getPublicExponent())); - v.add(new ASN1Integer(getPrivateExponent())); - v.add(new ASN1Integer(getPrime1())); - v.add(new ASN1Integer(getPrime2())); - v.add(new ASN1Integer(getExponent1())); - v.add(new ASN1Integer(getExponent2())); - v.add(new ASN1Integer(getCoefficient())); - - if (otherPrimeInfos != null) - { - v.add(otherPrimeInfos); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKeyStructure.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKeyStructure.java deleted file mode 100644 index 22c78c0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPrivateKeyStructure.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -/** - * @deprecated use RSAPrivateKey - */ -public class RSAPrivateKeyStructure - extends ASN1Object -{ - private int version; - private BigInteger modulus; - private BigInteger publicExponent; - private BigInteger privateExponent; - private BigInteger prime1; - private BigInteger prime2; - private BigInteger exponent1; - private BigInteger exponent2; - private BigInteger coefficient; - private ASN1Sequence otherPrimeInfos = null; - - public static RSAPrivateKeyStructure getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static RSAPrivateKeyStructure getInstance( - Object obj) - { - if (obj instanceof RSAPrivateKeyStructure) - { - return (RSAPrivateKeyStructure)obj; - } - else if (obj instanceof ASN1Sequence) - { - return new RSAPrivateKeyStructure((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public RSAPrivateKeyStructure( - BigInteger modulus, - BigInteger publicExponent, - BigInteger privateExponent, - BigInteger prime1, - BigInteger prime2, - BigInteger exponent1, - BigInteger exponent2, - BigInteger coefficient) - { - this.version = 0; - this.modulus = modulus; - this.publicExponent = publicExponent; - this.privateExponent = privateExponent; - this.prime1 = prime1; - this.prime2 = prime2; - this.exponent1 = exponent1; - this.exponent2 = exponent2; - this.coefficient = coefficient; - } - - public RSAPrivateKeyStructure( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - BigInteger v = ((ASN1Integer)e.nextElement()).getValue(); - if (v.intValue() != 0 && v.intValue() != 1) - { - throw new IllegalArgumentException("wrong version for RSA private key"); - } - - version = v.intValue(); - modulus = ((ASN1Integer)e.nextElement()).getValue(); - publicExponent = ((ASN1Integer)e.nextElement()).getValue(); - privateExponent = ((ASN1Integer)e.nextElement()).getValue(); - prime1 = ((ASN1Integer)e.nextElement()).getValue(); - prime2 = ((ASN1Integer)e.nextElement()).getValue(); - exponent1 = ((ASN1Integer)e.nextElement()).getValue(); - exponent2 = ((ASN1Integer)e.nextElement()).getValue(); - coefficient = ((ASN1Integer)e.nextElement()).getValue(); - - if (e.hasMoreElements()) - { - otherPrimeInfos = (ASN1Sequence)e.nextElement(); - } - } - - public int getVersion() - { - return version; - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getPublicExponent() - { - return publicExponent; - } - - public BigInteger getPrivateExponent() - { - return privateExponent; - } - - public BigInteger getPrime1() - { - return prime1; - } - - public BigInteger getPrime2() - { - return prime2; - } - - public BigInteger getExponent1() - { - return exponent1; - } - - public BigInteger getExponent2() - { - return exponent2; - } - - public BigInteger getCoefficient() - { - return coefficient; - } - - /** - * This outputs the key in PKCS1v2 format. - *

    -     *      RSAPrivateKey ::= SEQUENCE {
    -     *                          version Version,
    -     *                          modulus INTEGER, -- n
    -     *                          publicExponent INTEGER, -- e
    -     *                          privateExponent INTEGER, -- d
    -     *                          prime1 INTEGER, -- p
    -     *                          prime2 INTEGER, -- q
    -     *                          exponent1 INTEGER, -- d mod (p-1)
    -     *                          exponent2 INTEGER, -- d mod (q-1)
    -     *                          coefficient INTEGER, -- (inverse of q) mod p
    -     *                          otherPrimeInfos OtherPrimeInfos OPTIONAL
    -     *                      }
    -     *
    -     *      Version ::= INTEGER { two-prime(0), multi(1) }
    -     *        (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
    -     * 
    - *

    - * This routine is written to output PKCS1 version 2.1, private keys. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(version)); // version - v.add(new ASN1Integer(getModulus())); - v.add(new ASN1Integer(getPublicExponent())); - v.add(new ASN1Integer(getPrivateExponent())); - v.add(new ASN1Integer(getPrime1())); - v.add(new ASN1Integer(getPrime2())); - v.add(new ASN1Integer(getExponent1())); - v.add(new ASN1Integer(getExponent2())); - v.add(new ASN1Integer(getCoefficient())); - - if (otherPrimeInfos != null) - { - v.add(otherPrimeInfos); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPublicKey.java deleted file mode 100644 index a5d9d45..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSAPublicKey.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class RSAPublicKey - extends ASN1Object -{ - private BigInteger modulus; - private BigInteger publicExponent; - - public static RSAPublicKey getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static RSAPublicKey getInstance( - Object obj) - { - if (obj instanceof RSAPublicKey) - { - return (RSAPublicKey)obj; - } - - if (obj != null) - { - return new RSAPublicKey(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public RSAPublicKey( - BigInteger modulus, - BigInteger publicExponent) - { - this.modulus = modulus; - this.publicExponent = publicExponent; - } - - private RSAPublicKey( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - modulus = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); - publicExponent = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getPublicExponent() - { - return publicExponent; - } - - /** - * This outputs the key in PKCS1v2 format. - *

    -     *      RSAPublicKey ::= SEQUENCE {
    -     *                          modulus INTEGER, -- n
    -     *                          publicExponent INTEGER, -- e
    -     *                      }
    -     * 
    - *

    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(getModulus())); - v.add(new ASN1Integer(getPublicExponent())); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSASSAPSSparams.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSASSAPSSparams.java deleted file mode 100644 index 3a25dce..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/RSASSAPSSparams.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERNull; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.oiw.OIWObjectIdentifiers; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class RSASSAPSSparams - extends ASN1Object -{ - private AlgorithmIdentifier hashAlgorithm; - private AlgorithmIdentifier maskGenAlgorithm; - private ASN1Integer saltLength; - private ASN1Integer trailerField; - - public final static AlgorithmIdentifier DEFAULT_HASH_ALGORITHM = new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1, DERNull.INSTANCE); - public final static AlgorithmIdentifier DEFAULT_MASK_GEN_FUNCTION = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, DEFAULT_HASH_ALGORITHM); - public final static ASN1Integer DEFAULT_SALT_LENGTH = new ASN1Integer(20); - public final static ASN1Integer DEFAULT_TRAILER_FIELD = new ASN1Integer(1); - - public static RSASSAPSSparams getInstance( - Object obj) - { - if (obj instanceof RSASSAPSSparams) - { - return (RSASSAPSSparams)obj; - } - else if (obj != null) - { - return new RSASSAPSSparams(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * The default version - */ - public RSASSAPSSparams() - { - hashAlgorithm = DEFAULT_HASH_ALGORITHM; - maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION; - saltLength = DEFAULT_SALT_LENGTH; - trailerField = DEFAULT_TRAILER_FIELD; - } - - public RSASSAPSSparams( - AlgorithmIdentifier hashAlgorithm, - AlgorithmIdentifier maskGenAlgorithm, - ASN1Integer saltLength, - ASN1Integer trailerField) - { - this.hashAlgorithm = hashAlgorithm; - this.maskGenAlgorithm = maskGenAlgorithm; - this.saltLength = saltLength; - this.trailerField = trailerField; - } - - private RSASSAPSSparams( - ASN1Sequence seq) - { - hashAlgorithm = DEFAULT_HASH_ALGORITHM; - maskGenAlgorithm = DEFAULT_MASK_GEN_FUNCTION; - saltLength = DEFAULT_SALT_LENGTH; - trailerField = DEFAULT_TRAILER_FIELD; - - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(i); - - switch (o.getTagNo()) - { - case 0: - hashAlgorithm = AlgorithmIdentifier.getInstance(o, true); - break; - case 1: - maskGenAlgorithm = AlgorithmIdentifier.getInstance(o, true); - break; - case 2: - saltLength = ASN1Integer.getInstance(o, true); - break; - case 3: - trailerField = ASN1Integer.getInstance(o, true); - break; - default: - throw new IllegalArgumentException("unknown tag"); - } - } - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public AlgorithmIdentifier getMaskGenAlgorithm() - { - return maskGenAlgorithm; - } - - public BigInteger getSaltLength() - { - return saltLength.getValue(); - } - - public BigInteger getTrailerField() - { - return trailerField.getValue(); - } - - /** - *

    -     * RSASSA-PSS-params ::= SEQUENCE {
    -     *   hashAlgorithm      [0] OAEP-PSSDigestAlgorithms  DEFAULT sha1,
    -     *    maskGenAlgorithm   [1] PKCS1MGFAlgorithms  DEFAULT mgf1SHA1,
    -     *    saltLength         [2] INTEGER  DEFAULT 20,
    -     *    trailerField       [3] TrailerField  DEFAULT trailerFieldBC
    -     *  }
    -     *
    -     * OAEP-PSSDigestAlgorithms    ALGORITHM-IDENTIFIER ::= {
    -     *    { OID id-sha1 PARAMETERS NULL   }|
    -     *    { OID id-sha256 PARAMETERS NULL }|
    -     *    { OID id-sha384 PARAMETERS NULL }|
    -     *    { OID id-sha512 PARAMETERS NULL },
    -     *    ...  -- Allows for future expansion --
    -     * }
    -     *
    -     * PKCS1MGFAlgorithms    ALGORITHM-IDENTIFIER ::= {
    -     *   { OID id-mgf1 PARAMETERS OAEP-PSSDigestAlgorithms },
    -     *    ...  -- Allows for future expansion --
    -     * }
    -     * 
    -     * TrailerField ::= INTEGER { trailerFieldBC(1) }
    -     * 
    - * @return the asn1 primitive representing the parameters. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (!hashAlgorithm.equals(DEFAULT_HASH_ALGORITHM)) - { - v.add(new DERTaggedObject(true, 0, hashAlgorithm)); - } - - if (!maskGenAlgorithm.equals(DEFAULT_MASK_GEN_FUNCTION)) - { - v.add(new DERTaggedObject(true, 1, maskGenAlgorithm)); - } - - if (!saltLength.equals(DEFAULT_SALT_LENGTH)) - { - v.add(new DERTaggedObject(true, 2, saltLength)); - } - - if (!trailerField.equals(DEFAULT_TRAILER_FIELD)) - { - v.add(new DERTaggedObject(true, 3, trailerField)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SafeBag.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SafeBag.java deleted file mode 100644 index cfd17c3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SafeBag.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.asn1.pkcs; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DLSequence; -import org.bc.asn1.DLTaggedObject; - -public class SafeBag - extends ASN1Object -{ - private ASN1ObjectIdentifier bagId; - private ASN1Encodable bagValue; - private ASN1Set bagAttributes; - - public SafeBag( - ASN1ObjectIdentifier oid, - ASN1Encodable obj) - { - this.bagId = oid; - this.bagValue = obj; - this.bagAttributes = null; - } - - public SafeBag( - ASN1ObjectIdentifier oid, - ASN1Encodable obj, - ASN1Set bagAttributes) - { - this.bagId = oid; - this.bagValue = obj; - this.bagAttributes = bagAttributes; - } - - public static SafeBag getInstance( - Object obj) - { - if (obj instanceof SafeBag) - { - return (SafeBag)obj; - } - - if (obj != null) - { - return new SafeBag(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private SafeBag( - ASN1Sequence seq) - { - this.bagId = (ASN1ObjectIdentifier)seq.getObjectAt(0); - this.bagValue = ((ASN1TaggedObject)seq.getObjectAt(1)).getObject(); - if (seq.size() == 3) - { - this.bagAttributes = (ASN1Set)seq.getObjectAt(2); - } - } - - public ASN1ObjectIdentifier getBagId() - { - return bagId; - } - - public ASN1Encodable getBagValue() - { - return bagValue; - } - - public ASN1Set getBagAttributes() - { - return bagAttributes; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(bagId); - v.add(new DLTaggedObject(true, 0, bagValue)); - - if (bagAttributes != null) - { - v.add(bagAttributes); - } - - return new DLSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignedData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignedData.java deleted file mode 100644 index ab9c823..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignedData.java +++ /dev/null @@ -1,167 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * a PKCS#7 signed data object. - */ -public class SignedData - extends ASN1Object - implements PKCSObjectIdentifiers -{ - private ASN1Integer version; - private ASN1Set digestAlgorithms; - private ContentInfo contentInfo; - private ASN1Set certificates; - private ASN1Set crls; - private ASN1Set signerInfos; - - public static SignedData getInstance( - Object o) - { - if (o instanceof SignedData) - { - return (SignedData)o; - } - else if (o != null) - { - return new SignedData(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public SignedData( - ASN1Integer _version, - ASN1Set _digestAlgorithms, - ContentInfo _contentInfo, - ASN1Set _certificates, - ASN1Set _crls, - ASN1Set _signerInfos) - { - version = _version; - digestAlgorithms = _digestAlgorithms; - contentInfo = _contentInfo; - certificates = _certificates; - crls = _crls; - signerInfos = _signerInfos; - } - - public SignedData( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - version = (ASN1Integer)e.nextElement(); - digestAlgorithms = ((ASN1Set)e.nextElement()); - contentInfo = ContentInfo.getInstance(e.nextElement()); - - while (e.hasMoreElements()) - { - ASN1Primitive o = (ASN1Primitive)e.nextElement(); - - // - // an interesting feature of SignedData is that there appear to be varying implementations... - // for the moment we ignore anything which doesn't fit. - // - if (o instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagged = (ASN1TaggedObject)o; - - switch (tagged.getTagNo()) - { - case 0: - certificates = ASN1Set.getInstance(tagged, false); - break; - case 1: - crls = ASN1Set.getInstance(tagged, false); - break; - default: - throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo()); - } - } - else - { - signerInfos = (ASN1Set)o; - } - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public ASN1Set getDigestAlgorithms() - { - return digestAlgorithms; - } - - public ContentInfo getContentInfo() - { - return contentInfo; - } - - public ASN1Set getCertificates() - { - return certificates; - } - - public ASN1Set getCRLs() - { - return crls; - } - - public ASN1Set getSignerInfos() - { - return signerInfos; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  SignedData ::= SEQUENCE {
    -     *      version Version,
    -     *      digestAlgorithms DigestAlgorithmIdentifiers,
    -     *      contentInfo ContentInfo,
    -     *      certificates
    -     *          [0] IMPLICIT ExtendedCertificatesAndCertificates
    -     *                   OPTIONAL,
    -     *      crls
    -     *          [1] IMPLICIT CertificateRevocationLists OPTIONAL,
    -     *      signerInfos SignerInfos }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(digestAlgorithms); - v.add(contentInfo); - - if (certificates != null) - { - v.add(new DERTaggedObject(false, 0, certificates)); - } - - if (crls != null) - { - v.add(new DERTaggedObject(false, 1, crls)); - } - - v.add(signerInfos); - - return new BERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignerInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignerInfo.java deleted file mode 100644 index 6cbfa4e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/pkcs/SignerInfo.java +++ /dev/null @@ -1,178 +0,0 @@ -package org.bc.asn1.pkcs; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; - -/** - * a PKCS#7 signer info object. - */ -public class SignerInfo - extends ASN1Object -{ - private ASN1Integer version; - private IssuerAndSerialNumber issuerAndSerialNumber; - private AlgorithmIdentifier digAlgorithm; - private ASN1Set authenticatedAttributes; - private AlgorithmIdentifier digEncryptionAlgorithm; - private ASN1OctetString encryptedDigest; - private ASN1Set unauthenticatedAttributes; - - public static SignerInfo getInstance( - Object o) - { - if (o instanceof SignerInfo) - { - return (SignerInfo)o; - } - else if (o instanceof ASN1Sequence) - { - return new SignerInfo((ASN1Sequence)o); - } - - throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); - } - - public SignerInfo( - ASN1Integer version, - IssuerAndSerialNumber issuerAndSerialNumber, - AlgorithmIdentifier digAlgorithm, - ASN1Set authenticatedAttributes, - AlgorithmIdentifier digEncryptionAlgorithm, - ASN1OctetString encryptedDigest, - ASN1Set unauthenticatedAttributes) - { - this.version = version; - this.issuerAndSerialNumber = issuerAndSerialNumber; - this.digAlgorithm = digAlgorithm; - this.authenticatedAttributes = authenticatedAttributes; - this.digEncryptionAlgorithm = digEncryptionAlgorithm; - this.encryptedDigest = encryptedDigest; - this.unauthenticatedAttributes = unauthenticatedAttributes; - } - - public SignerInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - version = (ASN1Integer)e.nextElement(); - issuerAndSerialNumber = IssuerAndSerialNumber.getInstance(e.nextElement()); - digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); - - Object obj = e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false); - - digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); - } - else - { - authenticatedAttributes = null; - digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj); - } - - encryptedDigest = DEROctetString.getInstance(e.nextElement()); - - if (e.hasMoreElements()) - { - unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false); - } - else - { - unauthenticatedAttributes = null; - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public IssuerAndSerialNumber getIssuerAndSerialNumber() - { - return issuerAndSerialNumber; - } - - public ASN1Set getAuthenticatedAttributes() - { - return authenticatedAttributes; - } - - public AlgorithmIdentifier getDigestAlgorithm() - { - return digAlgorithm; - } - - public ASN1OctetString getEncryptedDigest() - { - return encryptedDigest; - } - - public AlgorithmIdentifier getDigestEncryptionAlgorithm() - { - return digEncryptionAlgorithm; - } - - public ASN1Set getUnauthenticatedAttributes() - { - return unauthenticatedAttributes; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  SignerInfo ::= SEQUENCE {
    -     *      version Version,
    -     *      issuerAndSerialNumber IssuerAndSerialNumber,
    -     *      digestAlgorithm DigestAlgorithmIdentifier,
    -     *      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
    -     *      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
    -     *      encryptedDigest EncryptedDigest,
    -     *      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
    -     *  }
    -     *
    -     *  EncryptedDigest ::= OCTET STRING
    -     *
    -     *  DigestAlgorithmIdentifier ::= AlgorithmIdentifier
    -     *
    -     *  DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(issuerAndSerialNumber); - v.add(digAlgorithm); - - if (authenticatedAttributes != null) - { - v.add(new DERTaggedObject(false, 0, authenticatedAttributes)); - } - - v.add(digEncryptionAlgorithm); - v.add(encryptedDigest); - - if (unauthenticatedAttributes != null) - { - v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKey.java deleted file mode 100644 index d6cfc2f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKey.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.bc.asn1.sec; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.util.BigIntegers; - -/** - * the elliptic curve private key object from SEC 1 - */ -public class ECPrivateKey - extends ASN1Object -{ - private ASN1Sequence seq; - - private ECPrivateKey( - ASN1Sequence seq) - { - this.seq = seq; - } - - public static ECPrivateKey getInstance( - Object obj) - { - if (obj instanceof ECPrivateKey) - { - return (ECPrivateKey)obj; - } - - if (obj != null) - { - return new ECPrivateKey(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public ECPrivateKey( - BigInteger key) - { - byte[] bytes = BigIntegers.asUnsignedByteArray(key); - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(1)); - v.add(new DEROctetString(bytes)); - - seq = new DERSequence(v); - } - - public ECPrivateKey( - BigInteger key, - ASN1Object parameters) - { - this(key, null, parameters); - } - - public ECPrivateKey( - BigInteger key, - DERBitString publicKey, - ASN1Object parameters) - { - byte[] bytes = BigIntegers.asUnsignedByteArray(key); - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(1)); - v.add(new DEROctetString(bytes)); - - if (parameters != null) - { - v.add(new DERTaggedObject(true, 0, parameters)); - } - - if (publicKey != null) - { - v.add(new DERTaggedObject(true, 1, publicKey)); - } - - seq = new DERSequence(v); - } - - public BigInteger getKey() - { - ASN1OctetString octs = (ASN1OctetString)seq.getObjectAt(1); - - return new BigInteger(1, octs.getOctets()); - } - - public DERBitString getPublicKey() - { - return (DERBitString)getObjectInTag(1); - } - - public ASN1Primitive getParameters() - { - return getObjectInTag(0); - } - - private ASN1Primitive getObjectInTag(int tagNo) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Encodable obj = (ASN1Encodable)e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tag = (ASN1TaggedObject)obj; - if (tag.getTagNo() == tagNo) - { - return tag.getObject().toASN1Primitive(); - } - } - } - return null; - } - - /** - * ECPrivateKey ::= SEQUENCE { - * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), - * privateKey OCTET STRING, - * parameters [0] Parameters OPTIONAL, - * publicKey [1] BIT STRING OPTIONAL } - */ - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKeyStructure.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKeyStructure.java deleted file mode 100644 index bd47d13..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/ECPrivateKeyStructure.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.asn1.sec; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.util.BigIntegers; - -/** - * the elliptic curve private key object from SEC 1 - * @deprecated use ECPrivateKey - */ -public class ECPrivateKeyStructure - extends ASN1Object -{ - private ASN1Sequence seq; - - public ECPrivateKeyStructure( - ASN1Sequence seq) - { - this.seq = seq; - } - - public ECPrivateKeyStructure( - BigInteger key) - { - byte[] bytes = BigIntegers.asUnsignedByteArray(key); - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(1)); - v.add(new DEROctetString(bytes)); - - seq = new DERSequence(v); - } - - public ECPrivateKeyStructure( - BigInteger key, - ASN1Encodable parameters) - { - this(key, null, parameters); - } - - public ECPrivateKeyStructure( - BigInteger key, - DERBitString publicKey, - ASN1Encodable parameters) - { - byte[] bytes = BigIntegers.asUnsignedByteArray(key); - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(1)); - v.add(new DEROctetString(bytes)); - - if (parameters != null) - { - v.add(new DERTaggedObject(true, 0, parameters)); - } - - if (publicKey != null) - { - v.add(new DERTaggedObject(true, 1, publicKey)); - } - - seq = new DERSequence(v); - } - - public BigInteger getKey() - { - ASN1OctetString octs = (ASN1OctetString)seq.getObjectAt(1); - - return new BigInteger(1, octs.getOctets()); - } - - public DERBitString getPublicKey() - { - return (DERBitString)getObjectInTag(1); - } - - public ASN1Primitive getParameters() - { - return getObjectInTag(0); - } - - private ASN1Primitive getObjectInTag(int tagNo) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Encodable obj = (ASN1Encodable)e.nextElement(); - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tag = (ASN1TaggedObject)obj; - if (tag.getTagNo() == tagNo) - { - return (ASN1Primitive)((ASN1Encodable)tag.getObject()).toASN1Primitive(); - } - } - } - return null; - } - - /** - * ECPrivateKey ::= SEQUENCE { - * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), - * privateKey OCTET STRING, - * parameters [0] Parameters OPTIONAL, - * publicKey [1] BIT STRING OPTIONAL } - */ - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECNamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECNamedCurves.java deleted file mode 100644 index c8ec3fa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECNamedCurves.java +++ /dev/null @@ -1,1029 +0,0 @@ -package org.bc.asn1.sec; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.asn1.x9.X9ECParametersHolder; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECPoint; -import org.bc.util.Strings; -import org.bc.util.encoders.Hex; - -public class SECNamedCurves -{ - private static BigInteger fromHex( - String hex) - { - return new BigInteger(1, Hex.decode(hex)); - } - - /* - * secp112r1 - */ - static X9ECParametersHolder secp112r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = (2^128 - 3) / 76439 - BigInteger p = fromHex("DB7C2ABF62E35E668076BEAD208B"); - BigInteger a = fromHex("DB7C2ABF62E35E668076BEAD2088"); - BigInteger b = fromHex("659EF8BA043916EEDE8911702B22"); - byte[] S = Hex.decode("00F50B028E4D696E676875615175290472783FB1"); - BigInteger n = fromHex("DB7C2ABF62E35E7628DFAC6561C5"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "09487239995A5EE76B55F9C2F098")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "09487239995A5EE76B55F9C2F098" - + "A89CE5AF8724C0A23E0E0FF77500")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp112r2 - */ - static X9ECParametersHolder secp112r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = (2^128 - 3) / 76439 - BigInteger p = fromHex("DB7C2ABF62E35E668076BEAD208B"); - BigInteger a = fromHex("6127C24C05F38A0AAAF65C0EF02C"); - BigInteger b = fromHex("51DEF1815DB5ED74FCC34C85D709"); - byte[] S = Hex.decode("002757A1114D696E6768756151755316C05E0BD4"); - BigInteger n = fromHex("36DF0AAFD8B8D7597CA10520D04B"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "4BA30AB5E892B4E1649DD0928643")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "4BA30AB5E892B4E1649DD0928643" - + "ADCD46F5882E3747DEF36E956E97")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp128r1 - */ - static X9ECParametersHolder secp128r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^128 - 2^97 - 1 - BigInteger p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"); - BigInteger a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC"); - BigInteger b = fromHex("E87579C11079F43DD824993C2CEE5ED3"); - byte[] S = Hex.decode("000E0D4D696E6768756151750CC03A4473D03679"); - BigInteger n = fromHex("FFFFFFFE0000000075A30D1B9038A115"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "161FF7528B899B2D0C28607CA52C5B86")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "161FF7528B899B2D0C28607CA52C5B86" - + "CF5AC8395BAFEB13C02DA292DDED7A83")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp128r2 - */ - static X9ECParametersHolder secp128r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^128 - 2^97 - 1 - BigInteger p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"); - BigInteger a = fromHex("D6031998D1B3BBFEBF59CC9BBFF9AEE1"); - BigInteger b = fromHex("5EEEFCA380D02919DC2C6558BB6D8A5D"); - byte[] S = Hex.decode("004D696E67687561517512D8F03431FCE63B88F4"); - BigInteger n = fromHex("3FFFFFFF7FFFFFFFBE0024720613B5A3"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "7B6AA5D85E572983E6FB32A7CDEBC140")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "7B6AA5D85E572983E6FB32A7CDEBC140" - + "27B6916A894D3AEE7106FE805FC34B44")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp160k1 - */ - static X9ECParametersHolder secp160k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"); - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(7); - byte[] S = null; - BigInteger n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); -// ECPoint G = curve.decodePoint(Hex.decode("02" -// + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB" - + "938CF935318FDCED6BC28286531733C3F03C4FEE")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp160r1 - */ - static X9ECParametersHolder secp160r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^160 - 2^31 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"); - BigInteger a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"); - BigInteger b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"); - byte[] S = Hex.decode("1053CDE42C14D696E67687561517533BF3F83345"); - BigInteger n = fromHex("0100000000000000000001F4C8F927AED3CA752257"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "4A96B5688EF573284664698968C38BB913CBFC82")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "4A96B5688EF573284664698968C38BB913CBFC82" - + "23A628553168947D59DCC912042351377AC5FB32")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp160r2 - */ - static X9ECParametersHolder secp160r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"); - BigInteger a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70"); - BigInteger b = fromHex("B4E134D3FB59EB8BAB57274904664D5AF50388BA"); - byte[] S = Hex.decode("B99B99B099B323E02709A4D696E6768756151751"); - BigInteger n = fromHex("0100000000000000000000351EE786A818F3A1A16B"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "52DCB034293A117E1F4FF11B30F7199D3144CE6D")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "52DCB034293A117E1F4FF11B30F7199D3144CE6D" - + "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp192k1 - */ - static X9ECParametersHolder secp192k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"); - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(3); - byte[] S = null; - BigInteger n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D" - + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp192r1 - */ - static X9ECParametersHolder secp192r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^192 - 2^64 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"); - BigInteger a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); - BigInteger b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"); - byte[] S = Hex.decode("3045AE6FC8422F64ED579528D38120EAE12196D5"); - BigInteger n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012" - + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp224k1 - */ - static X9ECParametersHolder secp224k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^224 - 2^32 - 2^12 - 2^11 - 2^9 - 2^7 - 2^4 - 2 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D"); - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(5); - byte[] S = null; - BigInteger n = fromHex("010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C" - + "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp224r1 - */ - static X9ECParametersHolder secp224r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^224 - 2^96 + 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"); - BigInteger a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"); - BigInteger b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"); - byte[] S = Hex.decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5"); - BigInteger n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21" - + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp256k1 - */ - static X9ECParametersHolder secp256k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(7); - byte[] S = null; - BigInteger n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798" - + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp256r1 - */ - static X9ECParametersHolder secp256r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1 - BigInteger p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"); - BigInteger a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"); - BigInteger b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); - byte[] S = Hex.decode("C49D360886E704936A6678E1139D26B7819F7E90"); - BigInteger n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" - + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp384r1 - */ - static X9ECParametersHolder secp384r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^384 - 2^128 - 2^96 + 2^32 - 1 - BigInteger p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"); - BigInteger a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC"); - BigInteger b = fromHex("B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF"); - byte[] S = Hex.decode("A335926AA319A27A1D00896A6773A4827ACDAC73"); - BigInteger n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7" - + "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * secp521r1 - */ - static X9ECParametersHolder secp521r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - // p = 2^521 - 1 - BigInteger p = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); - BigInteger a = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"); - BigInteger b = fromHex("0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"); - byte[] S = Hex.decode("D09E8800291CB85396CC6717393284AAA0DA64BA"); - BigInteger n = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"); - BigInteger h = BigInteger.valueOf(1); - - ECCurve curve = new ECCurve.Fp(p, a, b); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66" - + "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect113r1 - */ - static X9ECParametersHolder sect113r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 113; - int k = 9; - - BigInteger a = fromHex("003088250CA6E7C7FE649CE85820F7"); - BigInteger b = fromHex("00E8BEE4D3E2260744188BE0E9C723"); - byte[] S = Hex.decode("10E723AB14D696E6768756151756FEBF8FCB49A9"); - BigInteger n = fromHex("0100000000000000D9CCEC8A39E56F"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "009D73616F35F4AB1407D73562C10F")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "009D73616F35F4AB1407D73562C10F" - + "00A52830277958EE84D1315ED31886")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect113r2 - */ - static X9ECParametersHolder sect113r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 113; - int k = 9; - - BigInteger a = fromHex("00689918DBEC7E5A0DD6DFC0AA55C7"); - BigInteger b = fromHex("0095E9A9EC9B297BD4BF36E059184F"); - byte[] S = Hex.decode("10C0FB15760860DEF1EEF4D696E676875615175D"); - BigInteger n = fromHex("010000000000000108789B2496AF93"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "01A57A6A7B26CA5EF52FCDB8164797")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "01A57A6A7B26CA5EF52FCDB8164797" - + "00B3ADC94ED1FE674C06E695BABA1D")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect131r1 - */ - static X9ECParametersHolder sect131r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 131; - int k1 = 2; - int k2 = 3; - int k3 = 8; - - BigInteger a = fromHex("07A11B09A76B562144418FF3FF8C2570B8"); - BigInteger b = fromHex("0217C05610884B63B9C6C7291678F9D341"); - byte[] S = Hex.decode("4D696E676875615175985BD3ADBADA21B43A97E2"); - BigInteger n = fromHex("0400000000000000023123953A9464B54D"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "0081BAF91FDF9833C40F9C181343638399")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0081BAF91FDF9833C40F9C181343638399" - + "078C6E7EA38C001F73C8134B1B4EF9E150")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect131r2 - */ - static X9ECParametersHolder sect131r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 131; - int k1 = 2; - int k2 = 3; - int k3 = 8; - - BigInteger a = fromHex("03E5A88919D7CAFCBF415F07C2176573B2"); - BigInteger b = fromHex("04B8266A46C55657AC734CE38F018F2192"); - byte[] S = Hex.decode("985BD3ADBAD4D696E676875615175A21B43A97E3"); - BigInteger n = fromHex("0400000000000000016954A233049BA98F"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "0356DCD8F2F95031AD652D23951BB366A8")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0356DCD8F2F95031AD652D23951BB366A8" - + "0648F06D867940A5366D9E265DE9EB240F")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect163k1 - */ - static X9ECParametersHolder sect163k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 163; - int k1 = 3; - int k2 = 6; - int k3 = 7; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("04000000000000000000020108A2E0CC0D99F8A5EF"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8" - + "0289070FB05D38FF58321F2E800536D538CCDAA3D9")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect163r1 - */ - static X9ECParametersHolder sect163r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 163; - int k1 = 3; - int k2 = 6; - int k3 = 7; - - BigInteger a = fromHex("07B6882CAAEFA84F9554FF8428BD88E246D2782AE2"); - BigInteger b = fromHex("0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9"); - byte[] S = Hex.decode("24B7B137C8A14D696E6768756151756FD0DA2E5C"); - BigInteger n = fromHex("03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "0369979697AB43897789566789567F787A7876A654")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0369979697AB43897789566789567F787A7876A654" - + "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect163r2 - */ - static X9ECParametersHolder sect163r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 163; - int k1 = 3; - int k2 = 6; - int k3 = 7; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = fromHex("020A601907B8C953CA1481EB10512F78744A3205FD"); - byte[] S = Hex.decode("85E25BFE5C86226CDB12016F7553F9D0E693A268"); - BigInteger n = fromHex("040000000000000000000292FE77E70C12A4234C33"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "03F0EBA16286A2D57EA0991168D4994637E8343E36")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "03F0EBA16286A2D57EA0991168D4994637E8343E36" - + "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect193r1 - */ - static X9ECParametersHolder sect193r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 193; - int k = 15; - - BigInteger a = fromHex("0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01"); - BigInteger b = fromHex("00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814"); - byte[] S = Hex.decode("103FAEC74D696E676875615175777FC5B191EF30"); - BigInteger n = fromHex("01000000000000000000000000C7F34A778F443ACC920EBA49"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1" - + "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect193r2 - */ - static X9ECParametersHolder sect193r2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 193; - int k = 15; - - BigInteger a = fromHex("0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B"); - BigInteger b = fromHex("00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE"); - byte[] S = Hex.decode("10B7B4D696E676875615175137C8A16FD0DA2211"); - BigInteger n = fromHex("010000000000000000000000015AAB561B005413CCD4EE99D5"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F" - + "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect233k1 - */ - static X9ECParametersHolder sect233k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 233; - int k = 74; - - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126" - + "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect233r1 - */ - static X9ECParametersHolder sect233r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 233; - int k = 74; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = fromHex("0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD"); - byte[] S = Hex.decode("74D59FF07F6B413D0EA14B344B20A2DB049B50C3"); - BigInteger n = fromHex("01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B" - + "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect239k1 - */ - static X9ECParametersHolder sect239k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 239; - int k = 158; - - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC" - + "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect283k1 - */ - static X9ECParametersHolder sect283k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 283; - int k1 = 5; - int k2 = 7; - int k3 = 12; - - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836" - + "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect283r1 - */ - static X9ECParametersHolder sect283r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 283; - int k1 = 5; - int k2 = 7; - int k3 = 12; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = fromHex("027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5"); - byte[] S = Hex.decode("77E2B07370EB0F832A6DD5B62DFC88CD06BB84BE"); - BigInteger n = fromHex("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053" - + "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect409k1 - */ - static X9ECParametersHolder sect409k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 409; - int k = 87; - - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746" - + "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect409r1 - */ - static X9ECParametersHolder sect409r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 409; - int k = 87; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = fromHex("0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F"); - byte[] S = Hex.decode("4099B5A457F9D69F79213D094C4BCD4D4262210B"); - BigInteger n = fromHex("010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7" - + "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect571k1 - */ - static X9ECParametersHolder sect571k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 571; - int k1 = 2; - int k2 = 5; - int k3 = 10; - - BigInteger a = ECConstants.ZERO; - BigInteger b = BigInteger.valueOf(1); - byte[] S = null; - BigInteger n = fromHex("020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001"); - BigInteger h = BigInteger.valueOf(4); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("02" - //+ "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972" - + "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - /* - * sect571r1 - */ - static X9ECParametersHolder sect571r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - int m = 571; - int k1 = 2; - int k2 = 5; - int k3 = 10; - - BigInteger a = BigInteger.valueOf(1); - BigInteger b = fromHex("02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A"); - byte[] S = Hex.decode("2AA058F73A0E33AB486B0F610410C53A7F132310"); - BigInteger n = fromHex("03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47"); - BigInteger h = BigInteger.valueOf(2); - - ECCurve curve = new ECCurve.F2m(m, k1, k2, k3, a, b, n, h); - //ECPoint G = curve.decodePoint(Hex.decode("03" - //+ "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19")); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19" - + "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B")); - - return new X9ECParameters(curve, G, n, h, S); - } - }; - - - static final Hashtable objIds = new Hashtable(); - static final Hashtable curves = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static void defineCurve(String name, ASN1ObjectIdentifier oid, X9ECParametersHolder holder) - { - objIds.put(name, oid); - names.put(oid, name); - curves.put(oid, holder); - } - - static - { - defineCurve("secp112r1", SECObjectIdentifiers.secp112r1, secp112r1); - defineCurve("secp112r2", SECObjectIdentifiers.secp112r2, secp112r2); - defineCurve("secp128r1", SECObjectIdentifiers.secp128r1, secp128r1); - defineCurve("secp128r2", SECObjectIdentifiers.secp128r2, secp128r2); - defineCurve("secp160k1", SECObjectIdentifiers.secp160k1, secp160k1); - defineCurve("secp160r1", SECObjectIdentifiers.secp160r1, secp160r1); - defineCurve("secp160r2", SECObjectIdentifiers.secp160r2, secp160r2); - defineCurve("secp192k1", SECObjectIdentifiers.secp192k1, secp192k1); - defineCurve("secp192r1", SECObjectIdentifiers.secp192r1, secp192r1); - defineCurve("secp224k1", SECObjectIdentifiers.secp224k1, secp224k1); - defineCurve("secp224r1", SECObjectIdentifiers.secp224r1, secp224r1); - defineCurve("secp256k1", SECObjectIdentifiers.secp256k1, secp256k1); - defineCurve("secp256r1", SECObjectIdentifiers.secp256r1, secp256r1); - defineCurve("secp384r1", SECObjectIdentifiers.secp384r1, secp384r1); - defineCurve("secp521r1", SECObjectIdentifiers.secp521r1, secp521r1); - - defineCurve("sect113r1", SECObjectIdentifiers.sect113r1, sect113r1); - defineCurve("sect113r2", SECObjectIdentifiers.sect113r2, sect113r2); - defineCurve("sect131r1", SECObjectIdentifiers.sect131r1, sect131r1); - defineCurve("sect131r2", SECObjectIdentifiers.sect131r2, sect131r2); - defineCurve("sect163k1", SECObjectIdentifiers.sect163k1, sect163k1); - defineCurve("sect163r1", SECObjectIdentifiers.sect163r1, sect163r1); - defineCurve("sect163r2", SECObjectIdentifiers.sect163r2, sect163r2); - defineCurve("sect193r1", SECObjectIdentifiers.sect193r1, sect193r1); - defineCurve("sect193r2", SECObjectIdentifiers.sect193r2, sect193r2); - defineCurve("sect233k1", SECObjectIdentifiers.sect233k1, sect233k1); - defineCurve("sect233r1", SECObjectIdentifiers.sect233r1, sect233r1); - defineCurve("sect239k1", SECObjectIdentifiers.sect239k1, sect239k1); - defineCurve("sect283k1", SECObjectIdentifiers.sect283k1, sect283k1); - defineCurve("sect283r1", SECObjectIdentifiers.sect283r1, sect283r1); - defineCurve("sect409k1", SECObjectIdentifiers.sect409k1, sect409k1); - defineCurve("sect409r1", SECObjectIdentifiers.sect409r1, sect409r1); - defineCurve("sect571k1", SECObjectIdentifiers.sect571k1, sect571k1); - defineCurve("sect571r1", SECObjectIdentifiers.sect571r1, sect571r1); - } - - public static X9ECParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - - if (oid != null) - { - return getByOID(oid); - } - - return null; - } - - /** - * return the X9ECParameters object for the named curve represented by - * the passed in object identifier. Null if the curve isn't present. - * - * @param oid an object identifier representing a named curve, if present. - */ - public static X9ECParameters getByOID( - ASN1ObjectIdentifier oid) - { - X9ECParametersHolder holder = (X9ECParametersHolder)curves.get(oid); - - if (holder != null) - { - return holder.getParameters(); - } - - return null; - } - - /** - * return the object identifier signified by the passed in name. Null - * if there is no object identifier associated with name. - * - * @return the object identifier associated with name, if present. - */ - public static ASN1ObjectIdentifier getOID( - String name) - { - return (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName( - ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - /** - * returns an enumeration containing the name strings for curves - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECObjectIdentifiers.java deleted file mode 100644 index a944787..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/sec/SECObjectIdentifiers.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.asn1.sec; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.x9.X9ObjectIdentifiers; - -public interface SECObjectIdentifiers -{ - /** - * ellipticCurve OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) - * } - */ - static final ASN1ObjectIdentifier ellipticCurve = new ASN1ObjectIdentifier("1.3.132.0"); - - static final ASN1ObjectIdentifier sect163k1 = ellipticCurve.branch("1"); - static final ASN1ObjectIdentifier sect163r1 = ellipticCurve.branch("2"); - static final ASN1ObjectIdentifier sect239k1 = ellipticCurve.branch("3"); - static final ASN1ObjectIdentifier sect113r1 = ellipticCurve.branch("4"); - static final ASN1ObjectIdentifier sect113r2 = ellipticCurve.branch("5"); - static final ASN1ObjectIdentifier secp112r1 = ellipticCurve.branch("6"); - static final ASN1ObjectIdentifier secp112r2 = ellipticCurve.branch("7"); - static final ASN1ObjectIdentifier secp160r1 = ellipticCurve.branch("8"); - static final ASN1ObjectIdentifier secp160k1 = ellipticCurve.branch("9"); - static final ASN1ObjectIdentifier secp256k1 = ellipticCurve.branch("10"); - static final ASN1ObjectIdentifier sect163r2 = ellipticCurve.branch("15"); - static final ASN1ObjectIdentifier sect283k1 = ellipticCurve.branch("16"); - static final ASN1ObjectIdentifier sect283r1 = ellipticCurve.branch("17"); - static final ASN1ObjectIdentifier sect131r1 = ellipticCurve.branch("22"); - static final ASN1ObjectIdentifier sect131r2 = ellipticCurve.branch("23"); - static final ASN1ObjectIdentifier sect193r1 = ellipticCurve.branch("24"); - static final ASN1ObjectIdentifier sect193r2 = ellipticCurve.branch("25"); - static final ASN1ObjectIdentifier sect233k1 = ellipticCurve.branch("26"); - static final ASN1ObjectIdentifier sect233r1 = ellipticCurve.branch("27"); - static final ASN1ObjectIdentifier secp128r1 = ellipticCurve.branch("28"); - static final ASN1ObjectIdentifier secp128r2 = ellipticCurve.branch("29"); - static final ASN1ObjectIdentifier secp160r2 = ellipticCurve.branch("30"); - static final ASN1ObjectIdentifier secp192k1 = ellipticCurve.branch("31"); - static final ASN1ObjectIdentifier secp224k1 = ellipticCurve.branch("32"); - static final ASN1ObjectIdentifier secp224r1 = ellipticCurve.branch("33"); - static final ASN1ObjectIdentifier secp384r1 = ellipticCurve.branch("34"); - static final ASN1ObjectIdentifier secp521r1 = ellipticCurve.branch("35"); - static final ASN1ObjectIdentifier sect409k1 = ellipticCurve.branch("36"); - static final ASN1ObjectIdentifier sect409r1 = ellipticCurve.branch("37"); - static final ASN1ObjectIdentifier sect571k1 = ellipticCurve.branch("38"); - static final ASN1ObjectIdentifier sect571r1 = ellipticCurve.branch("39"); - - static final ASN1ObjectIdentifier secp192r1 = X9ObjectIdentifiers.prime192v1; - static final ASN1ObjectIdentifier secp256r1 = X9ObjectIdentifiers.prime256v1; - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEAttributes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEAttributes.java deleted file mode 100644 index 318c5c2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEAttributes.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.asn1.smime; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public interface SMIMEAttributes -{ - public static final ASN1ObjectIdentifier smimeCapabilities = PKCSObjectIdentifiers.pkcs_9_at_smimeCapabilities; - public static final ASN1ObjectIdentifier encrypKeyPref = PKCSObjectIdentifiers.id_aa_encrypKeyPref; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilities.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilities.java deleted file mode 100644 index 80ff142..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilities.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.bc.asn1.smime; - -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.cms.Attribute; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -/** - * Handler class for dealing with S/MIME Capabilities - */ -public class SMIMECapabilities - extends ASN1Object -{ - /** - * general preferences - */ - public static final ASN1ObjectIdentifier preferSignedData = PKCSObjectIdentifiers.preferSignedData; - public static final ASN1ObjectIdentifier canNotDecryptAny = PKCSObjectIdentifiers.canNotDecryptAny; - public static final ASN1ObjectIdentifier sMIMECapabilitesVersions = PKCSObjectIdentifiers.sMIMECapabilitiesVersions; - - /** - * encryption algorithms preferences - */ - public static final ASN1ObjectIdentifier dES_CBC = new ASN1ObjectIdentifier("1.3.14.3.2.7"); - public static final ASN1ObjectIdentifier dES_EDE3_CBC = PKCSObjectIdentifiers.des_EDE3_CBC; - public static final ASN1ObjectIdentifier rC2_CBC = PKCSObjectIdentifiers.RC2_CBC; - - private ASN1Sequence capabilities; - - /** - * return an Attribute object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static SMIMECapabilities getInstance( - Object o) - { - if (o == null || o instanceof SMIMECapabilities) - { - return (SMIMECapabilities)o; - } - - if (o instanceof ASN1Sequence) - { - return new SMIMECapabilities((ASN1Sequence)o); - } - - if (o instanceof Attribute) - { - return new SMIMECapabilities( - (ASN1Sequence)(((Attribute)o).getAttrValues().getObjectAt(0))); - } - - throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName()); - } - - public SMIMECapabilities( - ASN1Sequence seq) - { - capabilities = seq; - } - - /** - * returns a vector with 0 or more objects of all the capabilities - * matching the passed in capability OID. If the OID passed is null the - * entire set is returned. - */ - public Vector getCapabilities( - ASN1ObjectIdentifier capability) - { - Enumeration e = capabilities.getObjects(); - Vector list = new Vector(); - - if (capability == null) - { - while (e.hasMoreElements()) - { - SMIMECapability cap = SMIMECapability.getInstance(e.nextElement()); - - list.addElement(cap); - } - } - else - { - while (e.hasMoreElements()) - { - SMIMECapability cap = SMIMECapability.getInstance(e.nextElement()); - - if (capability.equals(cap.getCapabilityID())) - { - list.addElement(cap); - } - } - } - - return list; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * SMIMECapabilities ::= SEQUENCE OF SMIMECapability
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return capabilities; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilitiesAttribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilitiesAttribute.java deleted file mode 100644 index 905c626..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilitiesAttribute.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.asn1.smime; - -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERSet; -import org.bc.asn1.cms.Attribute; - -public class SMIMECapabilitiesAttribute - extends Attribute -{ - public SMIMECapabilitiesAttribute( - SMIMECapabilityVector capabilities) - { - super(SMIMEAttributes.smimeCapabilities, - new DERSet(new DERSequence(capabilities.toASN1EncodableVector()))); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapability.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapability.java deleted file mode 100644 index 7071b06..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapability.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.bc.asn1.smime; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.nist.NISTObjectIdentifiers; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; - -public class SMIMECapability - extends ASN1Object -{ - /** - * general preferences - */ - public static final ASN1ObjectIdentifier preferSignedData = PKCSObjectIdentifiers.preferSignedData; - public static final ASN1ObjectIdentifier canNotDecryptAny = PKCSObjectIdentifiers.canNotDecryptAny; - public static final ASN1ObjectIdentifier sMIMECapabilitiesVersions = PKCSObjectIdentifiers.sMIMECapabilitiesVersions; - - /** - * encryption algorithms preferences - */ - public static final ASN1ObjectIdentifier dES_CBC = new ASN1ObjectIdentifier("1.3.14.3.2.7"); - public static final ASN1ObjectIdentifier dES_EDE3_CBC = PKCSObjectIdentifiers.des_EDE3_CBC; - public static final ASN1ObjectIdentifier rC2_CBC = PKCSObjectIdentifiers.RC2_CBC; - public static final ASN1ObjectIdentifier aES128_CBC = NISTObjectIdentifiers.id_aes128_CBC; - public static final ASN1ObjectIdentifier aES192_CBC = NISTObjectIdentifiers.id_aes192_CBC; - public static final ASN1ObjectIdentifier aES256_CBC = NISTObjectIdentifiers.id_aes256_CBC; - - private ASN1ObjectIdentifier capabilityID; - private ASN1Encodable parameters; - - public SMIMECapability( - ASN1Sequence seq) - { - capabilityID = (ASN1ObjectIdentifier)seq.getObjectAt(0); - - if (seq.size() > 1) - { - parameters = (ASN1Primitive)seq.getObjectAt(1); - } - } - - public SMIMECapability( - ASN1ObjectIdentifier capabilityID, - ASN1Encodable parameters) - { - this.capabilityID = capabilityID; - this.parameters = parameters; - } - - public static SMIMECapability getInstance( - Object obj) - { - if (obj == null || obj instanceof SMIMECapability) - { - return (SMIMECapability)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new SMIMECapability((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid SMIMECapability"); - } - - public ASN1ObjectIdentifier getCapabilityID() - { - return capabilityID; - } - - public ASN1Encodable getParameters() - { - return parameters; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
     
    -     * SMIMECapability ::= SEQUENCE {
    -     *     capabilityID OBJECT IDENTIFIER,
    -     *     parameters ANY DEFINED BY capabilityID OPTIONAL 
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(capabilityID); - - if (parameters != null) - { - v.add(parameters); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilityVector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilityVector.java deleted file mode 100644 index 9ec0f55..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMECapabilityVector.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.asn1.smime; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERSequence; - -/** - * Handler for creating a vector S/MIME Capabilities - */ -public class SMIMECapabilityVector -{ - private ASN1EncodableVector capabilities = new ASN1EncodableVector(); - - public void addCapability( - ASN1ObjectIdentifier capability) - { - capabilities.add(new DERSequence(capability)); - } - - public void addCapability( - ASN1ObjectIdentifier capability, - int value) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(capability); - v.add(new ASN1Integer(value)); - - capabilities.add(new DERSequence(v)); - } - - public void addCapability( - ASN1ObjectIdentifier capability, - ASN1Encodable params) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(capability); - v.add(params); - - capabilities.add(new DERSequence(v)); - } - - public ASN1EncodableVector toASN1EncodableVector() - { - return capabilities; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.java deleted file mode 100644 index 06db6e1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/smime/SMIMEEncryptionKeyPreferenceAttribute.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.smime; - -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.DERSet; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.cms.Attribute; -import org.bc.asn1.cms.IssuerAndSerialNumber; -import org.bc.asn1.cms.RecipientKeyIdentifier; - -/** - * The SMIMEEncryptionKeyPreference object. - *
    - * SMIMEEncryptionKeyPreference ::= CHOICE {
    - *     issuerAndSerialNumber   [0] IssuerAndSerialNumber,
    - *     receipentKeyId          [1] RecipientKeyIdentifier,
    - *     subjectAltKeyIdentifier [2] SubjectKeyIdentifier
    - * }
    - * 
    - */ -public class SMIMEEncryptionKeyPreferenceAttribute - extends Attribute -{ - public SMIMEEncryptionKeyPreferenceAttribute( - IssuerAndSerialNumber issAndSer) - { - super(SMIMEAttributes.encrypKeyPref, - new DERSet(new DERTaggedObject(false, 0, issAndSer))); - } - - public SMIMEEncryptionKeyPreferenceAttribute( - RecipientKeyIdentifier rKeyId) - { - - super(SMIMEAttributes.encrypKeyPref, - new DERSet(new DERTaggedObject(false, 1, rKeyId))); - } - - /** - * @param sKeyId the subjectKeyIdentifier value (normally the X.509 one) - */ - public SMIMEEncryptionKeyPreferenceAttribute( - ASN1OctetString sKeyId) - { - - super(SMIMEAttributes.encrypKeyPref, - new DERSet(new DERTaggedObject(false, 2, sKeyId))); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTNamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTNamedCurves.java deleted file mode 100644 index 801b1ba..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTNamedCurves.java +++ /dev/null @@ -1,351 +0,0 @@ -package org.bc.asn1.teletrust; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.asn1.x9.X9ECParametersHolder; -import org.bc.math.ec.ECCurve; -import org.bc.util.Strings; -import org.bc.util.encoders.Hex; - -/** - * elliptic curves defined in "ECC Brainpool Standard Curves and Curve Generation" - * http://www.ecc-brainpool.org/download/draft_pkix_additional_ecc_dp.txt - */ -public class TeleTrusTNamedCurves -{ - static X9ECParametersHolder brainpoolP160r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620F", 16), // q - new BigInteger("340E7BE2A280EB74E2BE61BADA745D97E8F7C300", 16), // a - new BigInteger("1E589A8595423412134FAA2DBDEC95C8D8675E58", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321")), // G - new BigInteger("E95E4A5F737059DC60DF5991D45029409E60FC09", 16), //n - new BigInteger("01", 16)); // h - } - }; - - static X9ECParametersHolder brainpoolP160t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - // new BigInteger("24DBFF5DEC9B986BBFE5295A29BFBAE45E0F5D0B", 16), // Z - new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620F", 16), // q - new BigInteger("E95E4A5F737059DC60DFC7AD95B3D8139515620C", 16), // a' - new BigInteger("7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04B199B13B9B34EFC1397E64BAEB05ACC265FF2378ADD6718B7C7C1961F0991B842443772152C9E0AD")), // G - new BigInteger("E95E4A5F737059DC60DF5991D45029409E60FC09", 16), //n - new BigInteger("01", 16)); // h - } - }; - - static X9ECParametersHolder brainpoolP192r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", 16), // q - new BigInteger("6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF", 16), // a - new BigInteger("469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F")), // G - new BigInteger("C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", 16), //n - new BigInteger("01", 16)); // h - } - }; - - static X9ECParametersHolder brainpoolP192t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("1B6F5CC8DB4DC7AF19458A9CB80DC2295E5EB9C3732104CB") //Z - new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297", 16), // q - new BigInteger("C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294", 16), // a' - new BigInteger("13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("043AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9")), // G' - new BigInteger("C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1", 16), //n - new BigInteger("01", 16)); // h - } - }; - - static X9ECParametersHolder brainpoolP224r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", 16), // q - new BigInteger("68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43", 16), // a - new BigInteger("2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD")), // G - new BigInteger("D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", 16), //n - new BigInteger("01", 16)); // n - } - }; - static X9ECParametersHolder brainpoolP224t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("2DF271E14427A346910CF7A2E6CFA7B3F484E5C2CCE1C8B730E28B3F") //Z - new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF", 16), // q - new BigInteger("D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC", 16), // a' - new BigInteger("4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("046AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D5800374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C")), // G' - new BigInteger("D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP256r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16), // q - new BigInteger("7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9", 16), // a - new BigInteger("26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997")), // G - new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP256t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0") //Z - new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16), // q - new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374", 16), // a' - new BigInteger("662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE")), // G' - new BigInteger("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP320r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", 16), // q - new BigInteger("3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4", 16), // a - new BigInteger("520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1")), // G - new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP320t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("15F75CAF668077F7E85B42EB01F0A81FF56ECD6191D55CB82B7D861458A18FEFC3E5AB7496F3C7B1") //Z - new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27", 16), // q - new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E24", 16), // a' - new BigInteger("A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CEB5B4FEF422340353", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF3357F624A21BED5263BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B1B9BC0455FB0D2C3")), // G' - new BigInteger("D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP384r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16), // q - new BigInteger("7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826", 16), // a - new BigInteger("4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315")), // G - new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP384t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C") //Z - new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16), // q - new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC50", 16), // a' - new BigInteger("7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("0418DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928")), // G' - new BigInteger("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP512r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16), // q - new BigInteger("7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA", 16), // a - new BigInteger("3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723", 16)); // b - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892")), // G - new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16), //n - new BigInteger("01", 16)); // h - } - }; - static X9ECParametersHolder brainpoolP512t1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve curve = new ECCurve.Fp( - //new BigInteger("12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB") //Z - new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16), // q - new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0", 16), // a' - new BigInteger("7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E", 16)); // b' - - return new X9ECParameters( - curve, - curve.decodePoint(Hex.decode("04640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332")), // G' - new BigInteger("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16), //n - new BigInteger("01", 16)); // h - } - }; - - static final Hashtable objIds = new Hashtable(); - static final Hashtable curves = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static void defineCurve(String name, ASN1ObjectIdentifier oid, X9ECParametersHolder holder) - { - objIds.put(name, oid); - names.put(oid, name); - curves.put(oid, holder); - } - - static - { - defineCurve("brainpoolp160r1", TeleTrusTObjectIdentifiers.brainpoolP160r1, brainpoolP160r1); - defineCurve("brainpoolp160t1", TeleTrusTObjectIdentifiers.brainpoolP160t1, brainpoolP160t1); - defineCurve("brainpoolp192r1", TeleTrusTObjectIdentifiers.brainpoolP192r1, brainpoolP192r1); - defineCurve("brainpoolp192t1", TeleTrusTObjectIdentifiers.brainpoolP192t1, brainpoolP192t1); - defineCurve("brainpoolp224r1", TeleTrusTObjectIdentifiers.brainpoolP224r1, brainpoolP224r1); - defineCurve("brainpoolp224t1", TeleTrusTObjectIdentifiers.brainpoolP224t1, brainpoolP224t1); - defineCurve("brainpoolp256r1", TeleTrusTObjectIdentifiers.brainpoolP256r1, brainpoolP256r1); - defineCurve("brainpoolp256t1", TeleTrusTObjectIdentifiers.brainpoolP256t1, brainpoolP256t1); - defineCurve("brainpoolp320r1", TeleTrusTObjectIdentifiers.brainpoolP320r1, brainpoolP320r1); - defineCurve("brainpoolp320t1", TeleTrusTObjectIdentifiers.brainpoolP320t1, brainpoolP320t1); - defineCurve("brainpoolp384r1", TeleTrusTObjectIdentifiers.brainpoolP384r1, brainpoolP384r1); - defineCurve("brainpoolp384t1", TeleTrusTObjectIdentifiers.brainpoolP384t1, brainpoolP384t1); - defineCurve("brainpoolp512r1", TeleTrusTObjectIdentifiers.brainpoolP512r1, brainpoolP512r1); - defineCurve("brainpoolp512t1", TeleTrusTObjectIdentifiers.brainpoolP512t1, brainpoolP512t1); - } - - public static X9ECParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - - if (oid != null) - { - return getByOID(oid); - } - - return null; - } - - /** - * return the X9ECParameters object for the named curve represented by - * the passed in object identifier. Null if the curve isn't present. - * - * @param oid an object identifier representing a named curve, if present. - */ - public static X9ECParameters getByOID( - ASN1ObjectIdentifier oid) - { - X9ECParametersHolder holder = (X9ECParametersHolder)curves.get(oid); - - if (holder != null) - { - return holder.getParameters(); - } - - return null; - } - - /** - * return the object identifier signified by the passed in name. Null - * if there is no object identifier associated with name. - * - * @return the object identifier associated with name, if present. - */ - public static ASN1ObjectIdentifier getOID( - String name) - { - return (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName( - ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - /** - * returns an enumeration containing the name strings for curves - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } - - public static ASN1ObjectIdentifier getOID(short curvesize, boolean twisted) - { - return getOID("brainpoolP" + curvesize + (twisted ? "t" : "r") + "1"); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTObjectIdentifiers.java deleted file mode 100644 index eb4b7f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/teletrust/TeleTrusTObjectIdentifiers.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.asn1.teletrust; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface TeleTrusTObjectIdentifiers -{ - static final ASN1ObjectIdentifier teleTrusTAlgorithm = new ASN1ObjectIdentifier("1.3.36.3"); - - static final ASN1ObjectIdentifier ripemd160 = teleTrusTAlgorithm.branch("2.1"); - static final ASN1ObjectIdentifier ripemd128 = teleTrusTAlgorithm.branch("2.2"); - static final ASN1ObjectIdentifier ripemd256 = teleTrusTAlgorithm.branch("2.3"); - - static final ASN1ObjectIdentifier teleTrusTRSAsignatureAlgorithm = teleTrusTAlgorithm.branch("3.1"); - - static final ASN1ObjectIdentifier rsaSignatureWithripemd160 = teleTrusTRSAsignatureAlgorithm.branch("2"); - static final ASN1ObjectIdentifier rsaSignatureWithripemd128 = teleTrusTRSAsignatureAlgorithm.branch("3"); - static final ASN1ObjectIdentifier rsaSignatureWithripemd256 = teleTrusTRSAsignatureAlgorithm.branch("4"); - - static final ASN1ObjectIdentifier ecSign = teleTrusTAlgorithm.branch("3.2"); - - static final ASN1ObjectIdentifier ecSignWithSha1 = ecSign.branch("1"); - static final ASN1ObjectIdentifier ecSignWithRipemd160 = ecSign.branch("2"); - - static final ASN1ObjectIdentifier ecc_brainpool = teleTrusTAlgorithm.branch("3.2.8"); - static final ASN1ObjectIdentifier ellipticCurve = ecc_brainpool.branch("1"); - static final ASN1ObjectIdentifier versionOne = ellipticCurve.branch("1"); - - static final ASN1ObjectIdentifier brainpoolP160r1 = versionOne.branch("1"); - static final ASN1ObjectIdentifier brainpoolP160t1 = versionOne.branch("2"); - static final ASN1ObjectIdentifier brainpoolP192r1 = versionOne.branch("3"); - static final ASN1ObjectIdentifier brainpoolP192t1 = versionOne.branch("4"); - static final ASN1ObjectIdentifier brainpoolP224r1 = versionOne.branch("5"); - static final ASN1ObjectIdentifier brainpoolP224t1 = versionOne.branch("6"); - static final ASN1ObjectIdentifier brainpoolP256r1 = versionOne.branch("7"); - static final ASN1ObjectIdentifier brainpoolP256t1 = versionOne.branch("8"); - static final ASN1ObjectIdentifier brainpoolP320r1 = versionOne.branch("9"); - static final ASN1ObjectIdentifier brainpoolP320t1 = versionOne.branch("10"); - static final ASN1ObjectIdentifier brainpoolP384r1 = versionOne.branch("11"); - static final ASN1ObjectIdentifier brainpoolP384t1 = versionOne.branch("12"); - static final ASN1ObjectIdentifier brainpoolP512r1 = versionOne.branch("13"); - static final ASN1ObjectIdentifier brainpoolP512t1 = versionOne.branch("14"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/Accuracy.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/Accuracy.java deleted file mode 100644 index e44b34f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/Accuracy.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.bc.asn1.tsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - - -public class Accuracy - extends ASN1Object -{ - ASN1Integer seconds; - - ASN1Integer millis; - - ASN1Integer micros; - - // constantes - protected static final int MIN_MILLIS = 1; - - protected static final int MAX_MILLIS = 999; - - protected static final int MIN_MICROS = 1; - - protected static final int MAX_MICROS = 999; - - protected Accuracy() - { - } - - public Accuracy( - ASN1Integer seconds, - ASN1Integer millis, - ASN1Integer micros) - { - this.seconds = seconds; - - //Verifications - if (millis != null - && (millis.getValue().intValue() < MIN_MILLIS || millis - .getValue().intValue() > MAX_MILLIS)) - { - throw new IllegalArgumentException( - "Invalid millis field : not in (1..999)"); - } - else - { - this.millis = millis; - } - - if (micros != null - && (micros.getValue().intValue() < MIN_MICROS || micros - .getValue().intValue() > MAX_MICROS)) - { - throw new IllegalArgumentException( - "Invalid micros field : not in (1..999)"); - } - else - { - this.micros = micros; - } - - } - - private Accuracy(ASN1Sequence seq) - { - seconds = null; - millis = null; - micros = null; - - for (int i = 0; i < seq.size(); i++) - { - // seconds - if (seq.getObjectAt(i) instanceof ASN1Integer) - { - seconds = (ASN1Integer) seq.getObjectAt(i); - } - else if (seq.getObjectAt(i) instanceof DERTaggedObject) - { - DERTaggedObject extra = (DERTaggedObject) seq.getObjectAt(i); - - switch (extra.getTagNo()) - { - case 0: - millis = ASN1Integer.getInstance(extra, false); - if (millis.getValue().intValue() < MIN_MILLIS - || millis.getValue().intValue() > MAX_MILLIS) - { - throw new IllegalArgumentException( - "Invalid millis field : not in (1..999)."); - } - break; - case 1: - micros = ASN1Integer.getInstance(extra, false); - if (micros.getValue().intValue() < MIN_MICROS - || micros.getValue().intValue() > MAX_MICROS) - { - throw new IllegalArgumentException( - "Invalid micros field : not in (1..999)."); - } - break; - default: - throw new IllegalArgumentException("Invalig tag number"); - } - } - } - } - - public static Accuracy getInstance(Object o) - { - if (o instanceof Accuracy) - { - return (Accuracy) o; - } - - if (o != null) - { - return new Accuracy(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer getSeconds() - { - return seconds; - } - - public ASN1Integer getMillis() - { - return millis; - } - - public ASN1Integer getMicros() - { - return micros; - } - - /** - *
    -     * Accuracy ::= SEQUENCE {
    -     *             seconds        INTEGER              OPTIONAL,
    -     *             millis     [0] INTEGER  (1..999)    OPTIONAL,
    -     *             micros     [1] INTEGER  (1..999)    OPTIONAL
    -     *             }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (seconds != null) - { - v.add(seconds); - } - - if (millis != null) - { - v.add(new DERTaggedObject(false, 0, millis)); - } - - if (micros != null) - { - v.add(new DERTaggedObject(false, 1, micros)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/MessageImprint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/MessageImprint.java deleted file mode 100644 index 548a8bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/MessageImprint.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.bc.asn1.tsp; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; - -public class MessageImprint - extends ASN1Object -{ - AlgorithmIdentifier hashAlgorithm; - byte[] hashedMessage; - - /** - * @param o - * @return a MessageImprint object. - */ - public static MessageImprint getInstance(Object o) - { - if (o instanceof MessageImprint) - { - return (MessageImprint)o; - } - - if (o != null) - { - return new MessageImprint(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private MessageImprint( - ASN1Sequence seq) - { - this.hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(0)); - this.hashedMessage = ASN1OctetString.getInstance(seq.getObjectAt(1)).getOctets(); - } - - public MessageImprint( - AlgorithmIdentifier hashAlgorithm, - byte[] hashedMessage) - { - this.hashAlgorithm = hashAlgorithm; - this.hashedMessage = hashedMessage; - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public byte[] getHashedMessage() - { - return hashedMessage; - } - - /** - *
    -     *    MessageImprint ::= SEQUENCE  {
    -     *       hashAlgorithm                AlgorithmIdentifier,
    -     *       hashedMessage                OCTET STRING  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(hashAlgorithm); - v.add(new DEROctetString(hashedMessage)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TSTInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TSTInfo.java deleted file mode 100644 index d575412..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TSTInfo.java +++ /dev/null @@ -1,233 +0,0 @@ -package org.bc.asn1.tsp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.GeneralName; - -public class TSTInfo - extends ASN1Object -{ - private ASN1Integer version; - private ASN1ObjectIdentifier tsaPolicyId; - private MessageImprint messageImprint; - private ASN1Integer serialNumber; - private ASN1GeneralizedTime genTime; - private Accuracy accuracy; - private ASN1Boolean ordering; - private ASN1Integer nonce; - private GeneralName tsa; - private Extensions extensions; - - public static TSTInfo getInstance(Object o) - { - if (o instanceof TSTInfo) - { - return (TSTInfo)o; - } - else if (o != null) - { - return new TSTInfo(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private TSTInfo(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - // version - version = ASN1Integer.getInstance(e.nextElement()); - - // tsaPolicy - tsaPolicyId = ASN1ObjectIdentifier.getInstance(e.nextElement()); - - // messageImprint - messageImprint = MessageImprint.getInstance(e.nextElement()); - - // serialNumber - serialNumber = ASN1Integer.getInstance(e.nextElement()); - - // genTime - genTime = ASN1GeneralizedTime.getInstance(e.nextElement()); - - // default for ordering - ordering = ASN1Boolean.getInstance(false); - - while (e.hasMoreElements()) - { - ASN1Object o = (ASN1Object) e.nextElement(); - - if (o instanceof ASN1TaggedObject) - { - DERTaggedObject tagged = (DERTaggedObject) o; - - switch (tagged.getTagNo()) - { - case 0: - tsa = GeneralName.getInstance(tagged, true); - break; - case 1: - extensions = Extensions.getInstance(tagged, false); - break; - default: - throw new IllegalArgumentException("Unknown tag value " + tagged.getTagNo()); - } - } - else if (o instanceof ASN1Sequence || o instanceof Accuracy) - { - accuracy = Accuracy.getInstance(o); - } - else if (o instanceof ASN1Boolean) - { - ordering = ASN1Boolean.getInstance(o); - } - else if (o instanceof ASN1Integer) - { - nonce = ASN1Integer.getInstance(o); - } - - } - } - - public TSTInfo(ASN1ObjectIdentifier tsaPolicyId, MessageImprint messageImprint, - ASN1Integer serialNumber, ASN1GeneralizedTime genTime, - Accuracy accuracy, ASN1Boolean ordering, ASN1Integer nonce, - GeneralName tsa, Extensions extensions) - { - version = new ASN1Integer(1); - this.tsaPolicyId = tsaPolicyId; - this.messageImprint = messageImprint; - this.serialNumber = serialNumber; - this.genTime = genTime; - - this.accuracy = accuracy; - this.ordering = ordering; - this.nonce = nonce; - this.tsa = tsa; - this.extensions = extensions; - } - - public ASN1Integer getVersion() - { - return version; - } - - public MessageImprint getMessageImprint() - { - return messageImprint; - } - - public ASN1ObjectIdentifier getPolicy() - { - return tsaPolicyId; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public Accuracy getAccuracy() - { - return accuracy; - } - - public ASN1GeneralizedTime getGenTime() - { - return genTime; - } - - public ASN1Boolean getOrdering() - { - return ordering; - } - - public ASN1Integer getNonce() - { - return nonce; - } - - public GeneralName getTsa() - { - return tsa; - } - - public Extensions getExtensions() - { - return extensions; - } - - /** - *
    -     * 
    -     *     TSTInfo ::= SEQUENCE  {
    -     *        version                      INTEGER  { v1(1) },
    -     *        policy                       TSAPolicyId,
    -     *        messageImprint               MessageImprint,
    -     *          -- MUST have the same value as the similar field in
    -     *          -- TimeStampReq
    -     *        serialNumber                 INTEGER,
    -     *         -- Time-Stamping users MUST be ready to accommodate integers
    -     *         -- up to 160 bits.
    -     *        genTime                      GeneralizedTime,
    -     *        accuracy                     Accuracy                 OPTIONAL,
    -     *        ordering                     BOOLEAN             DEFAULT FALSE,
    -     *        nonce                        INTEGER                  OPTIONAL,
    -     *          -- MUST be present if the similar field was present
    -     *          -- in TimeStampReq.  In that case it MUST have the same value.
    -     *        tsa                          [0] GeneralName          OPTIONAL,
    -     *        extensions                   [1] IMPLICIT Extensions   OPTIONAL  }
    -     * 
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(version); - - seq.add(tsaPolicyId); - seq.add(messageImprint); - seq.add(serialNumber); - seq.add(genTime); - - if (accuracy != null) - { - seq.add(accuracy); - } - - if (ordering != null && ordering.isTrue()) - { - seq.add(ordering); - } - - if (nonce != null) - { - seq.add(nonce); - } - - if (tsa != null) - { - seq.add(new DERTaggedObject(true, 0, tsa)); - } - - if (extensions != null) - { - seq.add(new DERTaggedObject(false, 1, extensions)); - } - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampReq.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampReq.java deleted file mode 100644 index da46329..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampReq.java +++ /dev/null @@ -1,179 +0,0 @@ -package org.bc.asn1.tsp; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.Extensions; - -public class TimeStampReq - extends ASN1Object -{ - ASN1Integer version; - - MessageImprint messageImprint; - - ASN1ObjectIdentifier tsaPolicy; - - ASN1Integer nonce; - - ASN1Boolean certReq; - - Extensions extensions; - - public static TimeStampReq getInstance(Object o) - { - if (o instanceof TimeStampReq) - { - return (TimeStampReq) o; - } - else if (o != null) - { - return new TimeStampReq(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private TimeStampReq(ASN1Sequence seq) - { - int nbObjects = seq.size(); - - int seqStart = 0; - - // version - version = ASN1Integer.getInstance(seq.getObjectAt(seqStart)); - - seqStart++; - - // messageImprint - messageImprint = MessageImprint.getInstance(seq.getObjectAt(seqStart)); - - seqStart++; - - for (int opt = seqStart; opt < nbObjects; opt++) - { - // tsaPolicy - if (seq.getObjectAt(opt) instanceof ASN1ObjectIdentifier) - { - tsaPolicy = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(opt)); - } - // nonce - else if (seq.getObjectAt(opt) instanceof ASN1Integer) - { - nonce = ASN1Integer.getInstance(seq.getObjectAt(opt)); - } - // certReq - else if (seq.getObjectAt(opt) instanceof ASN1Boolean) - { - certReq = ASN1Boolean.getInstance(seq.getObjectAt(opt)); - } - // extensions - else if (seq.getObjectAt(opt) instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(opt); - if (tagged.getTagNo() == 0) - { - extensions = Extensions.getInstance(tagged, false); - } - } - } - } - - public TimeStampReq( - MessageImprint messageImprint, - ASN1ObjectIdentifier tsaPolicy, - ASN1Integer nonce, - ASN1Boolean certReq, - Extensions extensions) - { - // default - version = new ASN1Integer(1); - - this.messageImprint = messageImprint; - this.tsaPolicy = tsaPolicy; - this.nonce = nonce; - this.certReq = certReq; - this.extensions = extensions; - } - - public ASN1Integer getVersion() - { - return version; - } - - public MessageImprint getMessageImprint() - { - return messageImprint; - } - - public ASN1ObjectIdentifier getReqPolicy() - { - return tsaPolicy; - } - - public ASN1Integer getNonce() - { - return nonce; - } - - public ASN1Boolean getCertReq() - { - return certReq; - } - - public Extensions getExtensions() - { - return extensions; - } - - /** - *
    -     * TimeStampReq ::= SEQUENCE  {
    -     *  version                      INTEGER  { v1(1) },
    -     *  messageImprint               MessageImprint,
    -     *    --a hash algorithm OID and the hash value of the data to be
    -     *    --time-stamped
    -     *  reqPolicy             TSAPolicyId              OPTIONAL,
    -     *  nonce                 INTEGER                  OPTIONAL,
    -     *  certReq               BOOLEAN                  DEFAULT FALSE,
    -     *  extensions            [0] IMPLICIT Extensions  OPTIONAL
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(messageImprint); - - if (tsaPolicy != null) - { - v.add(tsaPolicy); - } - - if (nonce != null) - { - v.add(nonce); - } - - if (certReq != null && certReq.isTrue()) - { - v.add(certReq); - } - - if (extensions != null) - { - v.add(new DERTaggedObject(false, 0, extensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampResp.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampResp.java deleted file mode 100644 index 6b77fe0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/tsp/TimeStampResp.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.asn1.tsp; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.cmp.PKIStatusInfo; -import org.bc.asn1.cms.ContentInfo; - - -public class TimeStampResp - extends ASN1Object -{ - PKIStatusInfo pkiStatusInfo; - - ContentInfo timeStampToken; - - public static TimeStampResp getInstance(Object o) - { - if (o instanceof TimeStampResp) - { - return (TimeStampResp) o; - } - else if (o != null) - { - return new TimeStampResp(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private TimeStampResp(ASN1Sequence seq) - { - - Enumeration e = seq.getObjects(); - - // status - pkiStatusInfo = PKIStatusInfo.getInstance(e.nextElement()); - - if (e.hasMoreElements()) - { - timeStampToken = ContentInfo.getInstance(e.nextElement()); - } - } - - public TimeStampResp(PKIStatusInfo pkiStatusInfo, ContentInfo timeStampToken) - { - this.pkiStatusInfo = pkiStatusInfo; - this.timeStampToken = timeStampToken; - } - - public PKIStatusInfo getStatus() - { - return pkiStatusInfo; - } - - public ContentInfo getTimeStampToken() - { - return timeStampToken; - } - - /** - *
    -     * TimeStampResp ::= SEQUENCE  {
    -     *   status                  PKIStatusInfo,
    -     *   timeStampToken          TimeStampToken     OPTIONAL  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(pkiStatusInfo); - if (timeStampToken != null) - { - v.add(timeStampToken); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145BinaryField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145BinaryField.java deleted file mode 100644 index bae61bf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145BinaryField.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.asn1.ua; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class DSTU4145BinaryField - extends ASN1Object -{ - - private int m, k, j, l; - - private DSTU4145BinaryField(ASN1Sequence seq) - { - m = ASN1Integer.getInstance(seq.getObjectAt(0)).getPositiveValue().intValue(); - - if (seq.getObjectAt(1) instanceof ASN1Integer) - { - k = ((ASN1Integer)seq.getObjectAt(1)).getPositiveValue().intValue(); - } - else if (seq.getObjectAt(1) instanceof ASN1Sequence) - { - ASN1Sequence coefs = ASN1Sequence.getInstance(seq.getObjectAt(1)); - - k = ASN1Integer.getInstance(coefs.getObjectAt(0)).getPositiveValue().intValue(); - j = ASN1Integer.getInstance(coefs.getObjectAt(1)).getPositiveValue().intValue(); - l = ASN1Integer.getInstance(coefs.getObjectAt(2)).getPositiveValue().intValue(); - } - else - { - throw new IllegalArgumentException("object parse error"); - } - } - - public static DSTU4145BinaryField getInstance(Object obj) - { - if (obj instanceof DSTU4145BinaryField) - { - return (DSTU4145BinaryField)obj; - } - - if (obj != null) - { - return new DSTU4145BinaryField(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DSTU4145BinaryField(int m, int k1, int k2, int k3) - { - this.m = m; - this.k = k1; - this.j = k2; - this.l = k3; - } - - public int getM() - { - return m; - } - - public int getK1() - { - return k; - } - - public int getK2() - { - return j; - } - - public int getK3() - { - return l; - } - - public DSTU4145BinaryField(int m, int k) - { - this(m, k, 0, 0); - } - - /** - * BinaryField ::= SEQUENCE { - * M INTEGER, - * CHOICE {Trinomial, Pentanomial} - * Trinomial::= INTEGER - * Pentanomial::= SEQUENCE { - * k INTEGER, - * j INTEGER, - * l INTEGER} - */ - public ASN1Primitive toASN1Primitive() - { - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(m)); - if (j == 0) //Trinomial - { - v.add(new ASN1Integer(k)); - } - else - { - ASN1EncodableVector coefs = new ASN1EncodableVector(); - coefs.add(new ASN1Integer(k)); - coefs.add(new ASN1Integer(j)); - coefs.add(new ASN1Integer(l)); - - v.add(new DERSequence(coefs)); - } - - return new DERSequence(v); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145ECBinary.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145ECBinary.java deleted file mode 100644 index e2df6a8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145ECBinary.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.bc.asn1.ua; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x9.X9IntegerConverter; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.math.ec.ECCurve; -import org.bc.util.Arrays; - -public class DSTU4145ECBinary - extends ASN1Object -{ - - BigInteger version = BigInteger.valueOf(0); - - DSTU4145BinaryField f; - ASN1Integer a; - ASN1OctetString b; - ASN1Integer n; - ASN1OctetString bp; - - public DSTU4145ECBinary(ECDomainParameters params) - { - if (!(params.getCurve() instanceof ECCurve.F2m)) - { - throw new IllegalArgumentException("only binary domain is possible"); - } - - // We always use big-endian in parameter encoding - ECCurve.F2m curve = (ECCurve.F2m)params.getCurve(); - f = new DSTU4145BinaryField(curve.getM(), curve.getK1(), curve.getK2(), curve.getK3()); - a = new ASN1Integer(curve.getA().toBigInteger()); - X9IntegerConverter converter = new X9IntegerConverter(); - b = new DEROctetString(converter.integerToBytes(curve.getB().toBigInteger(), converter.getByteLength(curve))); - n = new ASN1Integer(params.getN()); - bp = new DEROctetString(DSTU4145PointEncoder.encodePoint(params.getG())); - } - - private DSTU4145ECBinary(ASN1Sequence seq) - { - int index = 0; - - if (seq.getObjectAt(index) instanceof ASN1TaggedObject) - { - ASN1TaggedObject taggedVersion = (ASN1TaggedObject)seq.getObjectAt(index); - if (taggedVersion.isExplicit() && 0 == taggedVersion.getTagNo()) - { - version = ASN1Integer.getInstance(taggedVersion.getLoadedObject()).getValue(); - index++; - } - else - { - throw new IllegalArgumentException("object parse error"); - } - } - f = DSTU4145BinaryField.getInstance(seq.getObjectAt(index)); - index++; - a = ASN1Integer.getInstance(seq.getObjectAt(index)); - index++; - b = ASN1OctetString.getInstance(seq.getObjectAt(index)); - index++; - n = ASN1Integer.getInstance(seq.getObjectAt(index)); - index++; - bp = ASN1OctetString.getInstance(seq.getObjectAt(index)); - } - - public static DSTU4145ECBinary getInstance(Object obj) - { - if (obj instanceof DSTU4145ECBinary) - { - return (DSTU4145ECBinary)obj; - } - - if (obj != null) - { - return new DSTU4145ECBinary(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DSTU4145BinaryField getField() - { - return f; - } - - public BigInteger getA() - { - return a.getValue(); - } - - public byte[] getB() - { - return Arrays.clone(b.getOctets()); - } - - public BigInteger getN() - { - return n.getValue(); - } - - public byte[] getG() - { - return Arrays.clone(bp.getOctets()); - } - - /** - * ECBinary ::= SEQUENCE { - * version [0] EXPLICIT INTEGER DEFAULT 0, - * f BinaryField, - * a INTEGER (0..1), - * b OCTET STRING, - * n INTEGER, - * bp OCTET STRING} - */ - public ASN1Primitive toASN1Primitive() - { - - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (0 != version.compareTo(BigInteger.valueOf(0))) - { - v.add(new DERTaggedObject(true, 0, new ASN1Integer(version))); - } - v.add(f); - v.add(a); - v.add(b); - v.add(n); - v.add(bp); - - return new DERSequence(v); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145NamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145NamedCurves.java deleted file mode 100644 index 7145672..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145NamedCurves.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.asn1.ua; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECPoint; - -public class DSTU4145NamedCurves -{ - private static final BigInteger ZERO = BigInteger.valueOf(0); - private static final BigInteger ONE = BigInteger.valueOf(1); - - public static final ECDomainParameters[] params = new ECDomainParameters[10]; - static final ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[10]; - - //All named curves have the following oid format: 1.2.804.2.1.1.1.1.3.1.1.2.X - //where X is the curve number 0-9 - static final String oidBase = UAObjectIdentifiers.dstu4145le.getId() + ".2."; - - static - { - ECCurve.F2m[] curves = new ECCurve.F2m[10]; - curves[0] = new ECCurve.F2m(163, 3, 6, 7, ONE, new BigInteger("5FF6108462A2DC8210AB403925E638A19C1455D21", 16)); - curves[1] = new ECCurve.F2m(167, 6, ONE, new BigInteger("6EE3CEEB230811759F20518A0930F1A4315A827DAC", 16)); - curves[2] = new ECCurve.F2m(173, 1, 2, 10, ZERO, new BigInteger("108576C80499DB2FC16EDDF6853BBB278F6B6FB437D9", 16)); - curves[3] = new ECCurve.F2m(179, 1, 2, 4, ONE, new BigInteger("4A6E0856526436F2F88DD07A341E32D04184572BEB710", 16)); - curves[4] = new ECCurve.F2m(191, 9, ONE, new BigInteger("7BC86E2102902EC4D5890E8B6B4981ff27E0482750FEFC03", 16)); - curves[5] = new ECCurve.F2m(233, 1, 4, 9, ONE, new BigInteger("06973B15095675534C7CF7E64A21BD54EF5DD3B8A0326AA936ECE454D2C", 16)); - curves[6] = new ECCurve.F2m(257, 12, ZERO, new BigInteger("1CEF494720115657E18F938D7A7942394FF9425C1458C57861F9EEA6ADBE3BE10", 16)); - curves[7] = new ECCurve.F2m(307, 2, 4, 8, ONE, new BigInteger("393C7F7D53666B5054B5E6C6D3DE94F4296C0C599E2E2E241050DF18B6090BDC90186904968BB", 16)); - curves[8] = new ECCurve.F2m(367, 21, ONE, new BigInteger("43FC8AD242B0B7A6F3D1627AD5654447556B47BF6AA4A64B0C2AFE42CADAB8F93D92394C79A79755437B56995136", 16)); - curves[9] = new ECCurve.F2m(431, 1, 3, 5, ONE, new BigInteger("03CE10490F6A708FC26DFE8C3D27C4F94E690134D5BFF988D8D28AAEAEDE975936C66BAC536B18AE2DC312CA493117DAA469C640CAF3", 16)); - - ECPoint[] points = new ECPoint[10]; - points[0] = curves[0].createPoint(new BigInteger("2E2F85F5DD74CE983A5C4237229DAF8A3F35823BE", 16), new BigInteger("3826F008A8C51D7B95284D9D03FF0E00CE2CD723A", 16), false); - points[1] = curves[1].createPoint(new BigInteger("7A1F6653786A68192803910A3D30B2A2018B21CD54", 16), new BigInteger("5F49EB26781C0EC6B8909156D98ED435E45FD59918", 16), false); - points[2] = curves[2].createPoint(new BigInteger("4D41A619BCC6EADF0448FA22FAD567A9181D37389CA", 16), new BigInteger("10B51CC12849B234C75E6DD2028BF7FF5C1CE0D991A1", 16), false); - points[3] = curves[3].createPoint(new BigInteger("6BA06FE51464B2BD26DC57F48819BA9954667022C7D03", 16), new BigInteger("25FBC363582DCEC065080CA8287AAFF09788A66DC3A9E", 16), false); - points[4] = curves[4].createPoint(new BigInteger("714114B762F2FF4A7912A6D2AC58B9B5C2FCFE76DAEB7129", 16), new BigInteger("29C41E568B77C617EFE5902F11DB96FA9613CD8D03DB08DA", 16), false); - points[5] = curves[5].createPoint(new BigInteger("3FCDA526B6CDF83BA1118DF35B3C31761D3545F32728D003EEB25EFE96", 16), new BigInteger("9CA8B57A934C54DEEDA9E54A7BBAD95E3B2E91C54D32BE0B9DF96D8D35", 16), false); - points[6] = curves[6].createPoint(new BigInteger("02A29EF207D0E9B6C55CD260B306C7E007AC491CA1B10C62334A9E8DCD8D20FB7", 16), new BigInteger("10686D41FF744D4449FCCF6D8EEA03102E6812C93A9D60B978B702CF156D814EF", 16), false); - points[7] = curves[7].createPoint(new BigInteger("216EE8B189D291A0224984C1E92F1D16BF75CCD825A087A239B276D3167743C52C02D6E7232AA", 16), new BigInteger("5D9306BACD22B7FAEB09D2E049C6E2866C5D1677762A8F2F2DC9A11C7F7BE8340AB2237C7F2A0", 16), false); - points[8] = curves[8].createPoint(new BigInteger("324A6EDDD512F08C49A99AE0D3F961197A76413E7BE81A400CA681E09639B5FE12E59A109F78BF4A373541B3B9A1", 16), new BigInteger("1AB597A5B4477F59E39539007C7F977D1A567B92B043A49C6B61984C3FE3481AAF454CD41BA1F051626442B3C10", 16), false); - points[9] = curves[9].createPoint(new BigInteger("1A62BA79D98133A16BBAE7ED9A8E03C32E0824D57AEF72F88986874E5AAE49C27BED49A2A95058068426C2171E99FD3B43C5947C857D", 16), new BigInteger("70B5E1E14031C1F70BBEFE96BDDE66F451754B4CA5F48DA241F331AA396B8D1839A855C1769B1EA14BA53308B5E2723724E090E02DB9", 16), false); - - BigInteger[] n_s = new BigInteger[10]; - n_s[0] = new BigInteger("400000000000000000002BEC12BE2262D39BCF14D", 16); - n_s[1] = new BigInteger("3FFFFFFFFFFFFFFFFFFFFFB12EBCC7D7F29FF7701F", 16); - n_s[2] = new BigInteger("800000000000000000000189B4E67606E3825BB2831", 16); - n_s[3] = new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFB981960435FE5AB64236EF", 16); - n_s[4] = new BigInteger("40000000000000000000000069A779CAC1DABC6788F7474F", 16); - n_s[5] = new BigInteger("1000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", 16); - n_s[6] = new BigInteger("800000000000000000000000000000006759213AF182E987D3E17714907D470D", 16); - n_s[7] = new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC079C2F3825DA70D390FBBA588D4604022B7B7", 16); - n_s[8] = new BigInteger("40000000000000000000000000000000000000000000009C300B75A3FA824F22428FD28CE8812245EF44049B2D49", 16); - n_s[9] = new BigInteger("3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA3175458009A8C0A724F02F81AA8A1FCBAF80D90C7A95110504CF", 16); - - for (int i = 0; i < params.length; i++) - { - params[i] = new ECDomainParameters(curves[i], points[i], n_s[i]); - } - - for (int i = 0; i < oids.length; i++) - { - oids[i] = new ASN1ObjectIdentifier(oidBase + i); - } - } - - /** - * All named curves have the following oid format: 1.2.804.2.1.1.1.1.3.1.1.2.X - * where X is the curve number 0-9 - */ - public static ASN1ObjectIdentifier[] getOIDs() - { - return oids; - } - - /** - * All named curves have the following oid format: 1.2.804.2.1.1.1.1.3.1.1.2.X - * where X is the curve number 0-9 - */ - public static ECDomainParameters getByOID(ASN1ObjectIdentifier oid) - { - String oidStr = oid.getId(); - if (oidStr.startsWith(oidBase)) - { - int index = Integer.parseInt(oidStr.substring(oidStr.length() - 1)); - return params[index]; - } - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145Params.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145Params.java deleted file mode 100644 index 54387dd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145Params.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.asn1.ua; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -public class DSTU4145Params extends ASN1Object -{ - private static final byte DEFAULT_DKE[]={ - (byte) 0xa9, (byte) 0xd6, (byte) 0xeb, 0x45, (byte) 0xf1, 0x3c, 0x70, (byte) 0x82, - (byte) 0x80, (byte) 0xc4, (byte) 0x96, 0x7b, 0x23, 0x1f, 0x5e, (byte) 0xad, - (byte) 0xf6, 0x58, (byte) 0xeb, (byte) 0xa4, (byte) 0xc0, 0x37, 0x29, 0x1d, - 0x38, (byte) 0xd9, 0x6b, (byte) 0xf0, 0x25, (byte) 0xca, 0x4e, 0x17, - (byte) 0xf8, (byte) 0xe9, 0x72, 0x0d, (byte) 0xc6, 0x15, (byte) 0xb4, 0x3a, - 0x28, (byte) 0x97, 0x5f, 0x0b, (byte) 0xc1, (byte) 0xde, (byte) 0xa3, 0x64, - 0x38, (byte) 0xb5, 0x64, (byte) 0xea, 0x2c, 0x17, (byte) 0x9f, (byte) 0xd0, - 0x12, 0x3e, 0x6d, (byte) 0xb8, (byte) 0xfa, (byte) 0xc5, 0x79, 0x04}; - - - private ASN1ObjectIdentifier namedCurve; - private DSTU4145ECBinary ecbinary; - private byte[] dke=DEFAULT_DKE; - - public DSTU4145Params(ASN1ObjectIdentifier namedCurve) - { - this.namedCurve=namedCurve; - } - - public DSTU4145Params(DSTU4145ECBinary ecbinary) - { - this.ecbinary=ecbinary; - } - - public boolean isNamedCurve() - { - return namedCurve != null; - } - - public DSTU4145ECBinary getECBinary() - { - return ecbinary; - } - - public byte[] getDKE() - { - return dke; - } - - public static byte[] getDefaultDKE() - { - return DEFAULT_DKE; - } - - public ASN1ObjectIdentifier getNamedCurve() - { - return namedCurve; - } - - public static DSTU4145Params getInstance(Object obj) - { - if (obj instanceof DSTU4145Params) - { - return (DSTU4145Params)obj; - } - - if (obj != null) - { - ASN1Sequence seq=ASN1Sequence.getInstance(obj); - DSTU4145Params params; - - if (seq.getObjectAt(0) instanceof ASN1ObjectIdentifier) - params=new DSTU4145Params(ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0))); - else - params=new DSTU4145Params(DSTU4145ECBinary.getInstance(seq.getObjectAt(0))); - - if (seq.size()==2) - { - params.dke = ASN1OctetString.getInstance(seq.getObjectAt(1)).getOctets(); - if (params.dke.length!=DSTU4145Params.DEFAULT_DKE.length) - throw new IllegalArgumentException("object parse error"); - } - - return params; - } - - throw new IllegalArgumentException("object parse error"); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v=new ASN1EncodableVector(); - - if (namedCurve!=null) - { - v.add(namedCurve); - } - else - { - v.add(ecbinary); - } - - if (!org.bc.util.Arrays.areEqual(dke, DEFAULT_DKE)) - { - v.add(new DEROctetString(dke)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PointEncoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PointEncoder.java deleted file mode 100644 index ca655f5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PointEncoder.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.bc.asn1.ua; - -import java.math.BigInteger; -import java.util.Random; - -import org.bc.asn1.x9.X9IntegerConverter; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECFieldElement; -import org.bc.math.ec.ECPoint; -import org.bc.util.Arrays; - -/** - * DSTU4145 encodes points somewhat differently than X9.62 - * It compresses the point to the size of the field element - */ - -public abstract class DSTU4145PointEncoder -{ - - private static X9IntegerConverter converter = new X9IntegerConverter(); - - private static BigInteger trace(ECFieldElement fe) - { - ECFieldElement t = fe; - for (int i = 0; i < fe.getFieldSize() - 1; i++) - { - t = t.square().add(fe); - } - return t.toBigInteger(); - } - - /** - * Solves a quadratic equation z2 + z = beta(X9.62 - * D.1.6) The other solution is z + 1. - * - * @param beta The value to solve the qradratic equation for. - * @return the solution for z2 + z = beta or - * null if no solution exists. - */ - private static ECFieldElement solveQuadradicEquation(ECFieldElement beta) - { - ECFieldElement.F2m b = (ECFieldElement.F2m)beta; - ECFieldElement zeroElement = new ECFieldElement.F2m( - b.getM(), b.getK1(), b.getK2(), b.getK3(), ECConstants.ZERO); - - if (beta.toBigInteger().equals(ECConstants.ZERO)) - { - return zeroElement; - } - - ECFieldElement z = null; - ECFieldElement gamma = zeroElement; - - Random rand = new Random(); - int m = b.getM(); - do - { - ECFieldElement t = new ECFieldElement.F2m(b.getM(), b.getK1(), - b.getK2(), b.getK3(), new BigInteger(m, rand)); - z = zeroElement; - ECFieldElement w = beta; - for (int i = 1; i <= m - 1; i++) - { - ECFieldElement w2 = w.square(); - z = z.square().add(w2.multiply(t)); - w = w2.add(beta); - } - if (!w.toBigInteger().equals(ECConstants.ZERO)) - { - return null; - } - gamma = z.square().add(z); - } - while (gamma.toBigInteger().equals(ECConstants.ZERO)); - - return z; - } - - public static byte[] encodePoint(ECPoint Q) - { - /*if (!Q.isCompressed()) - Q=new ECPoint.F2m(Q.getCurve(),Q.getX(),Q.getY(),true); - - byte[] bytes=Q.getEncoded(); - - if (bytes[0]==0x02) - bytes[bytes.length-1]&=0xFE; - else if (bytes[0]==0x02) - bytes[bytes.length-1]|=0x01; - - return Arrays.copyOfRange(bytes, 1, bytes.length);*/ - - int byteCount = converter.getByteLength(Q.getX()); - byte[] bytes = converter.integerToBytes(Q.getX().toBigInteger(), byteCount); - - if (!(Q.getX().toBigInteger().equals(ECConstants.ZERO))) - { - ECFieldElement y = Q.getY().multiply(Q.getX().invert()); - if (trace(y).equals(ECConstants.ONE)) - { - bytes[bytes.length - 1] |= 0x01; - } - else - { - bytes[bytes.length - 1] &= 0xFE; - } - } - - return bytes; - } - - public static ECPoint decodePoint(ECCurve curve, byte[] bytes) - { - /*byte[] bp_enc=new byte[bytes.length+1]; - if (0==(bytes[bytes.length-1]&0x1)) - bp_enc[0]=0x02; - else - bp_enc[0]=0x03; - System.arraycopy(bytes, 0, bp_enc, 1, bytes.length); - if (!trace(curve.fromBigInteger(new BigInteger(1, bytes))).equals(curve.getA().toBigInteger())) - bp_enc[bp_enc.length-1]^=0x01; - - return curve.decodePoint(bp_enc);*/ - - BigInteger k = BigInteger.valueOf(bytes[bytes.length - 1] & 0x1); - if (!trace(curve.fromBigInteger(new BigInteger(1, bytes))).equals(curve.getA().toBigInteger())) - { - bytes = Arrays.clone(bytes); - bytes[bytes.length - 1] ^= 0x01; - } - ECCurve.F2m c = (ECCurve.F2m)curve; - ECFieldElement xp = curve.fromBigInteger(new BigInteger(1, bytes)); - ECFieldElement yp = null; - if (xp.toBigInteger().equals(ECConstants.ZERO)) - { - yp = (ECFieldElement.F2m)curve.getB(); - for (int i = 0; i < c.getM() - 1; i++) - { - yp = yp.square(); - } - } - else - { - ECFieldElement beta = xp.add(curve.getA()).add( - curve.getB().multiply(xp.square().invert())); - ECFieldElement z = solveQuadradicEquation(beta); - if (z == null) - { - throw new RuntimeException("Invalid point compression"); - } - if (!trace(z).equals(k)) - { - z = z.add(curve.fromBigInteger(ECConstants.ONE)); - } - yp = xp.multiply(z); - } - - return new ECPoint.F2m(curve, xp, yp); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PublicKey.java deleted file mode 100644 index 15d18cf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/DSTU4145PublicKey.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.asn1.ua; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; -import org.bc.math.ec.ECPoint; - -public class DSTU4145PublicKey - extends ASN1Object -{ - - private ASN1OctetString pubKey; - - public DSTU4145PublicKey(ECPoint pubKey) - { - // We always use big-endian in parameter encoding - this.pubKey = new DEROctetString(DSTU4145PointEncoder.encodePoint(pubKey)); - } - - private DSTU4145PublicKey(ASN1OctetString ocStr) - { - pubKey = ocStr; - } - - public static DSTU4145PublicKey getInstance(Object obj) - { - if (obj instanceof DSTU4145PublicKey) - { - return (DSTU4145PublicKey)obj; - } - - if (obj != null) - { - return new DSTU4145PublicKey(ASN1OctetString.getInstance(obj)); - } - - return null; - } - - public ASN1Primitive toASN1Primitive() - { - return pubKey; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/UAObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/UAObjectIdentifiers.java deleted file mode 100644 index 4d00337..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/ua/UAObjectIdentifiers.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.asn1.ua; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface UAObjectIdentifiers -{ - // Ukrainian object identifiers - // {iso(1) member-body(2) Ukraine(804 ) root(2) security(1) cryptography(1) pki(1)} - - static final ASN1ObjectIdentifier UaOid = new ASN1ObjectIdentifier("1.2.804.2.1.1.1"); - - // {pki-alg(1) pki-alg-�sym(3) Dstu4145WithGost34311(1) PB(1)} - // DSTU4145 in polynomial basis has 2 oids, one for little-endian representation and one for big-endian - static final ASN1ObjectIdentifier dstu4145le = UaOid.branch("1.3.1.1"); - static final ASN1ObjectIdentifier dstu4145be = UaOid.branch("1.3.1.1.1.1"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/ASN1Dump.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/ASN1Dump.java deleted file mode 100644 index 54d8709..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/ASN1Dump.java +++ /dev/null @@ -1,402 +0,0 @@ -package org.bc.asn1.util; - -import java.io.IOException; -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.BERApplicationSpecific; -import org.bc.asn1.BERConstructedOctetString; -import org.bc.asn1.BEROctetString; -import org.bc.asn1.BERSequence; -import org.bc.asn1.BERSet; -import org.bc.asn1.BERTaggedObject; -import org.bc.asn1.BERTags; -import org.bc.asn1.DERApplicationSpecific; -import org.bc.asn1.DERBMPString; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERBoolean; -import org.bc.asn1.DEREnumerated; -import org.bc.asn1.DERExternal; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERNull; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERT61String; -import org.bc.asn1.DERUTCTime; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.DERVisibleString; -import org.bc.util.encoders.Hex; - -public class ASN1Dump -{ - private static final String TAB = " "; - private static final int SAMPLE_SIZE = 32; - - /** - * dump a DER object as a formatted string with indentation - * - * @param obj the ASN1Primitive to be dumped out. - */ - static void _dumpAsString( - String indent, - boolean verbose, - ASN1Primitive obj, - StringBuffer buf) - { - String nl = System.getProperty("line.separator"); - if (obj instanceof ASN1Sequence) - { - Enumeration e = ((ASN1Sequence)obj).getObjects(); - String tab = indent + TAB; - - buf.append(indent); - if (obj instanceof BERSequence) - { - buf.append("BER Sequence"); - } - else if (obj instanceof DERSequence) - { - buf.append("DER Sequence"); - } - else - { - buf.append("Sequence"); - } - - buf.append(nl); - - while (e.hasMoreElements()) - { - Object o = e.nextElement(); - - if (o == null || o.equals(DERNull.INSTANCE)) - { - buf.append(tab); - buf.append("NULL"); - buf.append(nl); - } - else if (o instanceof ASN1Primitive) - { - _dumpAsString(tab, verbose, (ASN1Primitive)o, buf); - } - else - { - _dumpAsString(tab, verbose, ((ASN1Encodable)o).toASN1Primitive(), buf); - } - } - } - else if (obj instanceof ASN1TaggedObject) - { - String tab = indent + TAB; - - buf.append(indent); - if (obj instanceof BERTaggedObject) - { - buf.append("BER Tagged ["); - } - else - { - buf.append("Tagged ["); - } - - ASN1TaggedObject o = (ASN1TaggedObject)obj; - - buf.append(Integer.toString(o.getTagNo())); - buf.append(']'); - - if (!o.isExplicit()) - { - buf.append(" IMPLICIT "); - } - - buf.append(nl); - - if (o.isEmpty()) - { - buf.append(tab); - buf.append("EMPTY"); - buf.append(nl); - } - else - { - _dumpAsString(tab, verbose, o.getObject(), buf); - } - } - else if (obj instanceof ASN1Set) - { - Enumeration e = ((ASN1Set)obj).getObjects(); - String tab = indent + TAB; - - buf.append(indent); - - if (obj instanceof BERSet) - { - buf.append("BER Set"); - } - else - { - buf.append("DER Set"); - } - - buf.append(nl); - - while (e.hasMoreElements()) - { - Object o = e.nextElement(); - - if (o == null) - { - buf.append(tab); - buf.append("NULL"); - buf.append(nl); - } - else if (o instanceof ASN1Primitive) - { - _dumpAsString(tab, verbose, (ASN1Primitive)o, buf); - } - else - { - _dumpAsString(tab, verbose, ((ASN1Encodable)o).toASN1Primitive(), buf); - } - } - } - else if (obj instanceof ASN1OctetString) - { - ASN1OctetString oct = (ASN1OctetString)obj; - - if (obj instanceof BEROctetString || obj instanceof BERConstructedOctetString) - { - buf.append(indent + "BER Constructed Octet String" + "[" + oct.getOctets().length + "] "); - } - else - { - buf.append(indent + "DER Octet String" + "[" + oct.getOctets().length + "] "); - } - if (verbose) - { - buf.append(dumpBinaryDataAsString(indent, oct.getOctets())); - } - else{ - buf.append(nl); - } - } - else if (obj instanceof ASN1ObjectIdentifier) - { - buf.append(indent + "ObjectIdentifier(" + ((ASN1ObjectIdentifier)obj).getId() + ")" + nl); - } - else if (obj instanceof DERBoolean) - { - buf.append(indent + "Boolean(" + ((DERBoolean)obj).isTrue() + ")" + nl); - } - else if (obj instanceof ASN1Integer) - { - buf.append(indent + "Integer(" + ((ASN1Integer)obj).getValue() + ")" + nl); - } - else if (obj instanceof DERBitString) - { - DERBitString bt = (DERBitString)obj; - buf.append(indent + "DER Bit String" + "[" + bt.getBytes().length + ", " + bt.getPadBits() + "] "); - if (verbose) - { - buf.append(dumpBinaryDataAsString(indent, bt.getBytes())); - } - else{ - buf.append(nl); - } - } - else if (obj instanceof DERIA5String) - { - buf.append(indent + "IA5String(" + ((DERIA5String)obj).getString() + ") " + nl); - } - else if (obj instanceof DERUTF8String) - { - buf.append(indent + "UTF8String(" + ((DERUTF8String)obj).getString() + ") " + nl); - } - else if (obj instanceof DERPrintableString) - { - buf.append(indent + "PrintableString(" + ((DERPrintableString)obj).getString() + ") " + nl); - } - else if (obj instanceof DERVisibleString) - { - buf.append(indent + "VisibleString(" + ((DERVisibleString)obj).getString() + ") " + nl); - } - else if (obj instanceof DERBMPString) - { - buf.append(indent + "BMPString(" + ((DERBMPString)obj).getString() + ") " + nl); - } - else if (obj instanceof DERT61String) - { - buf.append(indent + "T61String(" + ((DERT61String)obj).getString() + ") " + nl); - } - else if (obj instanceof DERUTCTime) - { - buf.append(indent + "UTCTime(" + ((DERUTCTime)obj).getTime() + ") " + nl); - } - else if (obj instanceof DERGeneralizedTime) - { - buf.append(indent + "GeneralizedTime(" + ((DERGeneralizedTime)obj).getTime() + ") " + nl); - } - else if (obj instanceof BERApplicationSpecific) - { - buf.append(outputApplicationSpecific("BER", indent, verbose, obj, nl)); - } - else if (obj instanceof DERApplicationSpecific) - { - buf.append(outputApplicationSpecific("DER", indent, verbose, obj, nl)); - } - else if (obj instanceof DEREnumerated) - { - DEREnumerated en = (DEREnumerated) obj; - buf.append(indent + "DER Enumerated(" + en.getValue() + ")" + nl); - } - else if (obj instanceof DERExternal) - { - DERExternal ext = (DERExternal) obj; - buf.append(indent + "External " + nl); - String tab = indent + TAB; - if (ext.getDirectReference() != null) - { - buf.append(tab + "Direct Reference: " + ext.getDirectReference().getId() + nl); - } - if (ext.getIndirectReference() != null) - { - buf.append(tab + "Indirect Reference: " + ext.getIndirectReference().toString() + nl); - } - if (ext.getDataValueDescriptor() != null) - { - _dumpAsString(tab, verbose, ext.getDataValueDescriptor(), buf); - } - buf.append(tab + "Encoding: " + ext.getEncoding() + nl); - _dumpAsString(tab, verbose, ext.getExternalContent(), buf); - } - else - { - buf.append(indent + obj.toString() + nl); - } - } - - private static String outputApplicationSpecific(String type, String indent, boolean verbose, ASN1Primitive obj, String nl) - { - DERApplicationSpecific app = (DERApplicationSpecific)obj; - StringBuffer buf = new StringBuffer(); - - if (app.isConstructed()) - { - try - { - ASN1Sequence s = ASN1Sequence.getInstance(app.getObject(BERTags.SEQUENCE)); - buf.append(indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "]" + nl); - for (Enumeration e = s.getObjects(); e.hasMoreElements();) - { - _dumpAsString(indent + TAB, verbose, (ASN1Primitive)e.nextElement(), buf); - } - } - catch (IOException e) - { - buf.append(e); - } - return buf.toString(); - } - - return indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "] (" + new String(Hex.encode(app.getContents())) + ")" + nl; - } - - /** - * dump out a DER object as a formatted string, in non-verbose mode. - * - * @param obj the ASN1Primitive to be dumped out. - * @return the resulting string. - */ - public static String dumpAsString( - Object obj) - { - return dumpAsString(obj, false); - } - - /** - * Dump out the object as a string. - * - * @param obj the object to be dumped - * @param verbose if true, dump out the contents of octet and bit strings. - * @return the resulting string. - */ - public static String dumpAsString( - Object obj, - boolean verbose) - { - StringBuffer buf = new StringBuffer(); - - if (obj instanceof ASN1Primitive) - { - _dumpAsString("", verbose, (ASN1Primitive)obj, buf); - } - else if (obj instanceof ASN1Encodable) - { - _dumpAsString("", verbose, ((ASN1Encodable)obj).toASN1Primitive(), buf); - } - else - { - return "unknown object type " + obj.toString(); - } - - return buf.toString(); - } - - private static String dumpBinaryDataAsString(String indent, byte[] bytes) - { - String nl = System.getProperty("line.separator"); - StringBuffer buf = new StringBuffer(); - - indent += TAB; - - buf.append(nl); - for (int i = 0; i < bytes.length; i += SAMPLE_SIZE) - { - if (bytes.length - i > SAMPLE_SIZE) - { - buf.append(indent); - buf.append(new String(Hex.encode(bytes, i, SAMPLE_SIZE))); - buf.append(TAB); - buf.append(calculateAscString(bytes, i, SAMPLE_SIZE)); - buf.append(nl); - } - else - { - buf.append(indent); - buf.append(new String(Hex.encode(bytes, i, bytes.length - i))); - for (int j = bytes.length - i; j != SAMPLE_SIZE; j++) - { - buf.append(" "); - } - buf.append(TAB); - buf.append(calculateAscString(bytes, i, bytes.length - i)); - buf.append(nl); - } - } - - return buf.toString(); - } - - private static String calculateAscString(byte[] bytes, int off, int len) - { - StringBuffer buf = new StringBuffer(); - - for (int i = off; i != off + len; i++) - { - if (bytes[i] >= ' ' && bytes[i] <= '~') - { - buf.append((char)bytes[i]); - } - } - - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/DERDump.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/DERDump.java deleted file mode 100644 index ca036e1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/DERDump.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.asn1.util; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Primitive; - -/** - * @deprecated use ASN1Dump. - */ -public class DERDump - extends ASN1Dump -{ - /** - * dump out a DER object as a formatted string - * - * @param obj the ASN1Primitive to be dumped out. - */ - public static String dumpAsString( - ASN1Primitive obj) - { - StringBuffer buf = new StringBuffer(); - - _dumpAsString("", false, obj, buf); - - return buf.toString(); - } - - /** - * dump out a DER object as a formatted string - * - * @param obj the ASN1Primitive to be dumped out. - */ - public static String dumpAsString( - ASN1Encodable obj) - { - StringBuffer buf = new StringBuffer(); - - _dumpAsString("", false, obj.toASN1Primitive(), buf); - - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/Dump.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/Dump.java deleted file mode 100644 index 913c339..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/util/Dump.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.asn1.util; - -import java.io.FileInputStream; - -import org.bc.asn1.ASN1InputStream; - -public class Dump -{ - public static void main( - String args[]) - throws Exception - { - FileInputStream fIn = new FileInputStream(args[0]); - ASN1InputStream bIn = new ASN1InputStream(fIn); - Object obj = null; - - while ((obj = bIn.readObject()) != null) - { - System.out.println(ASN1Dump.dumpAsString(obj)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/AttributeTypeAndValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/AttributeTypeAndValue.java deleted file mode 100644 index e0c043d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/AttributeTypeAndValue.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.bc.asn1.x500; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class AttributeTypeAndValue - extends ASN1Object -{ - private ASN1ObjectIdentifier type; - private ASN1Encodable value; - - private AttributeTypeAndValue(ASN1Sequence seq) - { - type = (ASN1ObjectIdentifier)seq.getObjectAt(0); - value = (ASN1Encodable)seq.getObjectAt(1); - } - - public static AttributeTypeAndValue getInstance(Object o) - { - if (o instanceof AttributeTypeAndValue) - { - return (AttributeTypeAndValue)o; - } - else if (o != null) - { - return new AttributeTypeAndValue(ASN1Sequence.getInstance(o)); - } - - throw new IllegalArgumentException("null value in getInstance()"); - } - - public AttributeTypeAndValue( - ASN1ObjectIdentifier type, - ASN1Encodable value) - { - this.type = type; - this.value = value; - } - - public ASN1ObjectIdentifier getType() - { - return type; - } - - public ASN1Encodable getValue() - { - return value; - } - - /** - *
    -     * AttributeTypeAndValue ::= SEQUENCE {
    -     *           type         OBJECT IDENTIFIER,
    -     *           value        ANY DEFINED BY type }
    -     * 
    - * @return a basic ASN.1 object representation. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(type); - v.add(value); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/DirectoryString.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/DirectoryString.java deleted file mode 100644 index 7a21e0b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/DirectoryString.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.bc.asn1.x500; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1String; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBMPString; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERT61String; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.DERUniversalString; - -public class DirectoryString - extends ASN1Object - implements ASN1Choice, ASN1String -{ - private ASN1String string; - - public static DirectoryString getInstance(Object o) - { - if (o == null || o instanceof DirectoryString) - { - return (DirectoryString)o; - } - - if (o instanceof DERT61String) - { - return new DirectoryString((DERT61String)o); - } - - if (o instanceof DERPrintableString) - { - return new DirectoryString((DERPrintableString)o); - } - - if (o instanceof DERUniversalString) - { - return new DirectoryString((DERUniversalString)o); - } - - if (o instanceof DERUTF8String) - { - return new DirectoryString((DERUTF8String)o); - } - - if (o instanceof DERBMPString) - { - return new DirectoryString((DERBMPString)o); - } - - throw new IllegalArgumentException("illegal object in getInstance: " + o.getClass().getName()); - } - - public static DirectoryString getInstance(ASN1TaggedObject o, boolean explicit) - { - if (!explicit) - { - throw new IllegalArgumentException("choice item must be explicitly tagged"); - } - - return getInstance(o.getObject()); - } - - private DirectoryString( - DERT61String string) - { - this.string = string; - } - - private DirectoryString( - DERPrintableString string) - { - this.string = string; - } - - private DirectoryString( - DERUniversalString string) - { - this.string = string; - } - - private DirectoryString( - DERUTF8String string) - { - this.string = string; - } - - private DirectoryString( - DERBMPString string) - { - this.string = string; - } - - public DirectoryString(String string) - { - this.string = new DERUTF8String(string); - } - - public String getString() - { - return string.getString(); - } - - public String toString() - { - return string.getString(); - } - - /** - *
    -     *  DirectoryString ::= CHOICE {
    -     *    teletexString               TeletexString (SIZE (1..MAX)),
    -     *    printableString             PrintableString (SIZE (1..MAX)),
    -     *    universalString             UniversalString (SIZE (1..MAX)),
    -     *    utf8String                  UTF8String (SIZE (1..MAX)),
    -     *    bmpString                   BMPString (SIZE (1..MAX))  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return ((ASN1Encodable)string).toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/RDN.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/RDN.java deleted file mode 100644 index d81b023..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/RDN.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.asn1.x500; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERSet; - -public class RDN - extends ASN1Object -{ - private ASN1Set values; - - private RDN(ASN1Set values) - { - this.values = values; - } - - public static RDN getInstance(Object obj) - { - if (obj instanceof RDN) - { - return (RDN)obj; - } - else if (obj != null) - { - return new RDN(ASN1Set.getInstance(obj)); - } - - return null; - } - - /** - * Create a single valued RDN. - * - * @param oid RDN type. - * @param value RDN value. - */ - public RDN(ASN1ObjectIdentifier oid, ASN1Encodable value) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oid); - v.add(value); - - this.values = new DERSet(new DERSequence(v)); - } - - public RDN(AttributeTypeAndValue attrTAndV) - { - this.values = new DERSet(attrTAndV); - } - - /** - * Create a multi-valued RDN. - * - * @param aAndVs attribute type/value pairs making up the RDN - */ - public RDN(AttributeTypeAndValue[] aAndVs) - { - this.values = new DERSet(aAndVs); - } - - public boolean isMultiValued() - { - return this.values.size() > 1; - } - - /** - * Return the number of AttributeTypeAndValue objects in this RDN, - * - * @return size of RDN, greater than 1 if multi-valued. - */ - public int size() - { - return this.values.size(); - } - - public AttributeTypeAndValue getFirst() - { - if (this.values.size() == 0) - { - return null; - } - - return AttributeTypeAndValue.getInstance(this.values.getObjectAt(0)); - } - - public AttributeTypeAndValue[] getTypesAndValues() - { - AttributeTypeAndValue[] tmp = new AttributeTypeAndValue[values.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = AttributeTypeAndValue.getInstance(values.getObjectAt(i)); - } - - return tmp; - } - - /** - *
    -     * RelativeDistinguishedName ::=
    -     *                     SET OF AttributeTypeAndValue
    -
    -     * AttributeTypeAndValue ::= SEQUENCE {
    -     *        type     AttributeType,
    -     *        value    AttributeValue }
    -     * 
    - * @return this object as an ASN1Primitive type - */ - public ASN1Primitive toASN1Primitive() - { - return values; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500Name.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500Name.java deleted file mode 100644 index c7ffc13..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500Name.java +++ /dev/null @@ -1,326 +0,0 @@ -package org.bc.asn1.x500; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.style.BCStyle; - -/** - *
    - *     Name ::= CHOICE {
    - *                       RDNSequence }
    - *
    - *     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
    - *
    - *     RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
    - *
    - *     AttributeTypeAndValue ::= SEQUENCE {
    - *                                   type  OBJECT IDENTIFIER,
    - *                                   value ANY }
    - * 
    - */ -public class X500Name - extends ASN1Object - implements ASN1Choice -{ - private static X500NameStyle defaultStyle = BCStyle.INSTANCE; - - private boolean isHashCodeCalculated; - private int hashCodeValue; - - private X500NameStyle style; - private RDN[] rdns; - - public X500Name(X500NameStyle style, X500Name name) - { - this.rdns = name.rdns; - this.style = style; - } - - /** - * Return a X500Name based on the passed in tagged object. - * - * @param obj tag object holding name. - * @param explicit true if explicitly tagged false otherwise. - * @return the X500Name - */ - public static X500Name getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - // must be true as choice item - return getInstance(ASN1Sequence.getInstance(obj, true)); - } - - public static X500Name getInstance( - Object obj) - { - if (obj instanceof X500Name) - { - return (X500Name)obj; - } - else if (obj != null) - { - return new X500Name(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static X500Name getInstance( - X500NameStyle style, - Object obj) - { - if (obj instanceof X500Name) - { - return getInstance(style, ((X500Name)obj).toASN1Primitive()); - } - else if (obj != null) - { - return new X500Name(style, ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from ASN1Sequence - * - * the principal will be a list of constructed sets, each containing an (OID, String) pair. - */ - private X500Name( - ASN1Sequence seq) - { - this(defaultStyle, seq); - } - - private X500Name( - X500NameStyle style, - ASN1Sequence seq) - { - this.style = style; - this.rdns = new RDN[seq.size()]; - - int index = 0; - - for (Enumeration e = seq.getObjects(); e.hasMoreElements();) - { - rdns[index++] = RDN.getInstance(e.nextElement()); - } - } - - public X500Name( - RDN[] rDNs) - { - this(defaultStyle, rDNs); - } - - public X500Name( - X500NameStyle style, - RDN[] rDNs) - { - this.rdns = rDNs; - this.style = style; - } - - public X500Name( - String dirName) - { - this(defaultStyle, dirName); - } - - public X500Name( - X500NameStyle style, - String dirName) - { - this(style.fromString(dirName)); - - this.style = style; - } - - /** - * return an array of RDNs in structure order. - * - * @return an array of RDN objects. - */ - public RDN[] getRDNs() - { - RDN[] tmp = new RDN[this.rdns.length]; - - System.arraycopy(rdns, 0, tmp, 0, tmp.length); - - return tmp; - } - - /** - * return an array of OIDs contained in the attribute type of each RDN in structure order. - * - * @return an array, possibly zero length, of ASN1ObjectIdentifiers objects. - */ - public ASN1ObjectIdentifier[] getAttributeTypes() - { - int count = 0; - - for (int i = 0; i != rdns.length; i++) - { - RDN rdn = rdns[i]; - - count += rdn.size(); - } - - ASN1ObjectIdentifier[] res = new ASN1ObjectIdentifier[count]; - - count = 0; - - for (int i = 0; i != rdns.length; i++) - { - RDN rdn = rdns[i]; - - if (rdn.isMultiValued()) - { - AttributeTypeAndValue[] attr = rdn.getTypesAndValues(); - for (int j = 0; j != attr.length; j++) - { - res[count++] = attr[j].getType(); - } - } - else if (rdn.size() != 0) - { - res[count++] = rdn.getFirst().getType(); - } - } - - return res; - } - - /** - * return an array of RDNs containing the attribute type given by OID in structure order. - * - * @param attributeType the type OID we are looking for. - * @return an array, possibly zero length, of RDN objects. - */ - public RDN[] getRDNs(ASN1ObjectIdentifier attributeType) - { - RDN[] res = new RDN[rdns.length]; - int count = 0; - - for (int i = 0; i != rdns.length; i++) - { - RDN rdn = rdns[i]; - - if (rdn.isMultiValued()) - { - AttributeTypeAndValue[] attr = rdn.getTypesAndValues(); - for (int j = 0; j != attr.length; j++) - { - if (attr[j].getType().equals(attributeType)) - { - res[count++] = rdn; - break; - } - } - } - else - { - if (rdn.getFirst().getType().equals(attributeType)) - { - res[count++] = rdn; - } - } - } - - RDN[] tmp = new RDN[count]; - - System.arraycopy(res, 0, tmp, 0, tmp.length); - - return tmp; - } - - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(rdns); - } - - public int hashCode() - { - if (isHashCodeCalculated) - { - return hashCodeValue; - } - - isHashCodeCalculated = true; - - hashCodeValue = style.calculateHashCode(this); - - return hashCodeValue; - } - - /** - * test for equality - note: case is ignored. - */ - public boolean equals(Object obj) - { - if (obj == this) - { - return true; - } - - if (!(obj instanceof X500Name || obj instanceof ASN1Sequence)) - { - return false; - } - - ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive(); - - if (this.toASN1Primitive().equals(derO)) - { - return true; - } - - try - { - return style.areEqual(this, new X500Name(ASN1Sequence.getInstance(((ASN1Encodable)obj).toASN1Primitive()))); - } - catch (Exception e) - { - return false; - } - } - - public String toString() - { - return style.toString(this); - } - - /** - * Set the default style for X500Name construction. - * - * @param style an X500NameStyle - */ - public static void setDefaultStyle(X500NameStyle style) - { - if (style == null) - { - throw new NullPointerException("cannot set style to null"); - } - - defaultStyle = style; - } - - /** - * Return the current default style. - * - * @return default style for X500Name construction. - */ - public static X500NameStyle getDefaultStyle() - { - return defaultStyle; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameBuilder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameBuilder.java deleted file mode 100644 index 4616cb7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameBuilder.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.asn1.x500; - -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.x500.style.BCStyle; - -public class X500NameBuilder -{ - private X500NameStyle template; - private Vector rdns = new Vector(); - - public X500NameBuilder() - { - this(BCStyle.INSTANCE); - } - - public X500NameBuilder(X500NameStyle template) - { - this.template = template; - } - - public X500NameBuilder addRDN(ASN1ObjectIdentifier oid, String value) - { - this.addRDN(oid, template.stringToValue(oid, value)); - - return this; - } - - public X500NameBuilder addRDN(ASN1ObjectIdentifier oid, ASN1Encodable value) - { - rdns.addElement(new RDN(oid, value)); - - return this; - } - - public X500NameBuilder addRDN(AttributeTypeAndValue attrTAndV) - { - rdns.addElement(new RDN(attrTAndV)); - - return this; - } - - public X500NameBuilder addMultiValuedRDN(ASN1ObjectIdentifier[] oids, String[] values) - { - ASN1Encodable[] vals = new ASN1Encodable[values.length]; - - for (int i = 0; i != vals.length; i++) - { - vals[i] = template.stringToValue(oids[i], values[i]); - } - - return addMultiValuedRDN(oids, vals); - } - - public X500NameBuilder addMultiValuedRDN(ASN1ObjectIdentifier[] oids, ASN1Encodable[] values) - { - AttributeTypeAndValue[] avs = new AttributeTypeAndValue[oids.length]; - - for (int i = 0; i != oids.length; i++) - { - avs[i] = new AttributeTypeAndValue(oids[i], values[i]); - } - - return addMultiValuedRDN(avs); - } - - public X500NameBuilder addMultiValuedRDN(AttributeTypeAndValue[] attrTAndVs) - { - rdns.addElement(new RDN(attrTAndVs)); - - return this; - } - - public X500Name build() - { - RDN[] vals = new RDN[rdns.size()]; - - for (int i = 0; i != vals.length; i++) - { - vals[i] = (RDN)rdns.elementAt(i); - } - - return new X500Name(template, vals); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameStyle.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameStyle.java deleted file mode 100644 index 22b89af..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/X500NameStyle.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.bc.asn1.x500; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; - -/** - * It turns out that the number of standard ways the fields in a DN should be - * encoded into their ASN.1 counterparts is rapidly approaching the - * number of machines on the internet. By default the X500Name class - * will produce UTF8Strings in line with the current recommendations (RFC 3280). - *

    - */ -public interface X500NameStyle -{ - /** - * Convert the passed in String value into the appropriate ASN.1 - * encoded object. - * - * @param oid the oid associated with the value in the DN. - * @param value the value of the particular DN component. - * @return the ASN.1 equivalent for the value. - */ - ASN1Encodable stringToValue(ASN1ObjectIdentifier oid, String value); - - ASN1ObjectIdentifier attrNameToOID(String attrName); - - boolean areEqual(X500Name name1, X500Name name2); - - RDN[] fromString(String dirName); - - int calculateHashCode(X500Name name); - - String toString(X500Name name); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStrictStyle.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStrictStyle.java deleted file mode 100644 index d5a13cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStrictStyle.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.asn1.x500.style; - -import org.bc.asn1.x500.RDN; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x500.X500NameStyle; - -/** - * Variation of BCStyle that insists on strict ordering for equality - * and hashCode comparisons - */ -public class BCStrictStyle - extends BCStyle -{ - public static final X500NameStyle INSTANCE = new BCStrictStyle(); - - public boolean areEqual(X500Name name1, X500Name name2) - { - RDN[] rdns1 = name1.getRDNs(); - RDN[] rdns2 = name2.getRDNs(); - - if (rdns1.length != rdns2.length) - { - return false; - } - - for (int i = 0; i != rdns1.length; i++) - { - if (!rdnAreEqual(rdns1[i], rdns2[i])) - { - return false; - } - } - - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStyle.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStyle.java deleted file mode 100644 index 599b755..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/BCStyle.java +++ /dev/null @@ -1,449 +0,0 @@ -package org.bc.asn1.x500.style; - -import java.io.IOException; -import java.util.Hashtable; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.x500.AttributeTypeAndValue; -import org.bc.asn1.x500.RDN; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x500.X500NameStyle; -import org.bc.asn1.x509.X509ObjectIdentifiers; - -public class BCStyle - implements X500NameStyle -{ - public static final X500NameStyle INSTANCE = new BCStyle(); - - /** - * country code - StringType(SIZE(2)) - */ - public static final ASN1ObjectIdentifier C = new ASN1ObjectIdentifier("2.5.4.6"); - - /** - * organization - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier O = new ASN1ObjectIdentifier("2.5.4.10"); - - /** - * organizational unit name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier OU = new ASN1ObjectIdentifier("2.5.4.11"); - - /** - * Title - */ - public static final ASN1ObjectIdentifier T = new ASN1ObjectIdentifier("2.5.4.12"); - - /** - * common name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier CN = new ASN1ObjectIdentifier("2.5.4.3"); - - /** - * device serial number name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier SN = new ASN1ObjectIdentifier("2.5.4.5"); - - /** - * street - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier STREET = new ASN1ObjectIdentifier("2.5.4.9"); - - /** - * device serial number name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier SERIALNUMBER = SN; - - /** - * locality name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier L = new ASN1ObjectIdentifier("2.5.4.7"); - - /** - * state, or province name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier ST = new ASN1ObjectIdentifier("2.5.4.8"); - - /** - * Naming attributes of type X520name - */ - public static final ASN1ObjectIdentifier SURNAME = new ASN1ObjectIdentifier("2.5.4.4"); - public static final ASN1ObjectIdentifier GIVENNAME = new ASN1ObjectIdentifier("2.5.4.42"); - public static final ASN1ObjectIdentifier INITIALS = new ASN1ObjectIdentifier("2.5.4.43"); - public static final ASN1ObjectIdentifier GENERATION = new ASN1ObjectIdentifier("2.5.4.44"); - public static final ASN1ObjectIdentifier UNIQUE_IDENTIFIER = new ASN1ObjectIdentifier("2.5.4.45"); - - /** - * businessCategory - DirectoryString(SIZE(1..128) - */ - public static final ASN1ObjectIdentifier BUSINESS_CATEGORY = new ASN1ObjectIdentifier( - "2.5.4.15"); - - /** - * postalCode - DirectoryString(SIZE(1..40) - */ - public static final ASN1ObjectIdentifier POSTAL_CODE = new ASN1ObjectIdentifier( - "2.5.4.17"); - - /** - * dnQualifier - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier DN_QUALIFIER = new ASN1ObjectIdentifier( - "2.5.4.46"); - - /** - * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier PSEUDONYM = new ASN1ObjectIdentifier( - "2.5.4.65"); - - - /** - * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z - */ - public static final ASN1ObjectIdentifier DATE_OF_BIRTH = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.1"); - - /** - * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128) - */ - public static final ASN1ObjectIdentifier PLACE_OF_BIRTH = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.2"); - - /** - * RFC 3039 Gender - PrintableString (SIZE(1)) -- "M", "F", "m" or "f" - */ - public static final ASN1ObjectIdentifier GENDER = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.3"); - - /** - * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166 - * codes only - */ - public static final ASN1ObjectIdentifier COUNTRY_OF_CITIZENSHIP = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.4"); - - /** - * RFC 3039 CountryOfResidence - PrintableString (SIZE (2)) -- ISO 3166 - * codes only - */ - public static final ASN1ObjectIdentifier COUNTRY_OF_RESIDENCE = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.5"); - - - /** - * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier NAME_AT_BIRTH = new ASN1ObjectIdentifier("1.3.36.8.3.14"); - - /** - * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF - * DirectoryString(SIZE(1..30)) - */ - public static final ASN1ObjectIdentifier POSTAL_ADDRESS = new ASN1ObjectIdentifier("2.5.4.16"); - - /** - * RFC 2256 dmdName - */ - public static final ASN1ObjectIdentifier DMD_NAME = new ASN1ObjectIdentifier("2.5.4.54"); - - /** - * id-at-telephoneNumber - */ - public static final ASN1ObjectIdentifier TELEPHONE_NUMBER = X509ObjectIdentifiers.id_at_telephoneNumber; - - /** - * id-at-name - */ - public static final ASN1ObjectIdentifier NAME = X509ObjectIdentifiers.id_at_name; - - /** - * Email address (RSA PKCS#9 extension) - IA5String. - *

    Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here. - */ - public static final ASN1ObjectIdentifier EmailAddress = PKCSObjectIdentifiers.pkcs_9_at_emailAddress; - - /** - * more from PKCS#9 - */ - public static final ASN1ObjectIdentifier UnstructuredName = PKCSObjectIdentifiers.pkcs_9_at_unstructuredName; - public static final ASN1ObjectIdentifier UnstructuredAddress = PKCSObjectIdentifiers.pkcs_9_at_unstructuredAddress; - - /** - * email address in Verisign certificates - */ - public static final ASN1ObjectIdentifier E = EmailAddress; - - /* - * others... - */ - public static final ASN1ObjectIdentifier DC = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25"); - - /** - * LDAP User id. - */ - public static final ASN1ObjectIdentifier UID = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1"); - - /** - * default look up table translating OID values into their common symbols following - * the convention in RFC 2253 with a few extras - */ - private static final Hashtable DefaultSymbols = new Hashtable(); - - /** - * look up table translating common symbols into their OIDS. - */ - private static final Hashtable DefaultLookUp = new Hashtable(); - - static - { - DefaultSymbols.put(C, "C"); - DefaultSymbols.put(O, "O"); - DefaultSymbols.put(T, "T"); - DefaultSymbols.put(OU, "OU"); - DefaultSymbols.put(CN, "CN"); - DefaultSymbols.put(L, "L"); - DefaultSymbols.put(ST, "ST"); - DefaultSymbols.put(SN, "SERIALNUMBER"); - DefaultSymbols.put(EmailAddress, "E"); - DefaultSymbols.put(DC, "DC"); - DefaultSymbols.put(UID, "UID"); - DefaultSymbols.put(STREET, "STREET"); - DefaultSymbols.put(SURNAME, "SURNAME"); - DefaultSymbols.put(GIVENNAME, "GIVENNAME"); - DefaultSymbols.put(INITIALS, "INITIALS"); - DefaultSymbols.put(GENERATION, "GENERATION"); - DefaultSymbols.put(UnstructuredAddress, "unstructuredAddress"); - DefaultSymbols.put(UnstructuredName, "unstructuredName"); - DefaultSymbols.put(UNIQUE_IDENTIFIER, "UniqueIdentifier"); - DefaultSymbols.put(DN_QUALIFIER, "DN"); - DefaultSymbols.put(PSEUDONYM, "Pseudonym"); - DefaultSymbols.put(POSTAL_ADDRESS, "PostalAddress"); - DefaultSymbols.put(NAME_AT_BIRTH, "NameAtBirth"); - DefaultSymbols.put(COUNTRY_OF_CITIZENSHIP, "CountryOfCitizenship"); - DefaultSymbols.put(COUNTRY_OF_RESIDENCE, "CountryOfResidence"); - DefaultSymbols.put(GENDER, "Gender"); - DefaultSymbols.put(PLACE_OF_BIRTH, "PlaceOfBirth"); - DefaultSymbols.put(DATE_OF_BIRTH, "DateOfBirth"); - DefaultSymbols.put(POSTAL_CODE, "PostalCode"); - DefaultSymbols.put(BUSINESS_CATEGORY, "BusinessCategory"); - DefaultSymbols.put(TELEPHONE_NUMBER, "TelephoneNumber"); - DefaultSymbols.put(NAME, "Name"); - - DefaultLookUp.put("c", C); - DefaultLookUp.put("o", O); - DefaultLookUp.put("t", T); - DefaultLookUp.put("ou", OU); - DefaultLookUp.put("cn", CN); - DefaultLookUp.put("l", L); - DefaultLookUp.put("st", ST); - DefaultLookUp.put("sn", SN); - DefaultLookUp.put("serialnumber", SN); - DefaultLookUp.put("street", STREET); - DefaultLookUp.put("emailaddress", E); - DefaultLookUp.put("dc", DC); - DefaultLookUp.put("e", E); - DefaultLookUp.put("uid", UID); - DefaultLookUp.put("surname", SURNAME); - DefaultLookUp.put("givenname", GIVENNAME); - DefaultLookUp.put("initials", INITIALS); - DefaultLookUp.put("generation", GENERATION); - DefaultLookUp.put("unstructuredaddress", UnstructuredAddress); - DefaultLookUp.put("unstructuredname", UnstructuredName); - DefaultLookUp.put("uniqueidentifier", UNIQUE_IDENTIFIER); - DefaultLookUp.put("dn", DN_QUALIFIER); - DefaultLookUp.put("pseudonym", PSEUDONYM); - DefaultLookUp.put("postaladdress", POSTAL_ADDRESS); - DefaultLookUp.put("nameofbirth", NAME_AT_BIRTH); - DefaultLookUp.put("countryofcitizenship", COUNTRY_OF_CITIZENSHIP); - DefaultLookUp.put("countryofresidence", COUNTRY_OF_RESIDENCE); - DefaultLookUp.put("gender", GENDER); - DefaultLookUp.put("placeofbirth", PLACE_OF_BIRTH); - DefaultLookUp.put("dateofbirth", DATE_OF_BIRTH); - DefaultLookUp.put("postalcode", POSTAL_CODE); - DefaultLookUp.put("businesscategory", BUSINESS_CATEGORY); - DefaultLookUp.put("telephonenumber", TELEPHONE_NUMBER); - DefaultLookUp.put("name", NAME); - } - - protected BCStyle() - { - - } - - public ASN1Encodable stringToValue(ASN1ObjectIdentifier oid, String value) - { - if (value.length() != 0 && value.charAt(0) == '#') - { - try - { - return IETFUtils.valueFromHexString(value, 1); - } - catch (IOException e) - { - throw new RuntimeException("can't recode value for oid " + oid.getId()); - } - } - else - { - if (value.length() != 0 && value.charAt(0) == '\\') - { - value = value.substring(1); - } - if (oid.equals(EmailAddress) || oid.equals(DC)) - { - return new DERIA5String(value); - } - else if (oid.equals(DATE_OF_BIRTH)) // accept time string as well as # (for compatibility) - { - return new ASN1GeneralizedTime(value); - } - else if (oid.equals(C) || oid.equals(SN) || oid.equals(DN_QUALIFIER) - || oid.equals(TELEPHONE_NUMBER)) - { - return new DERPrintableString(value); - } - } - - return new DERUTF8String(value); - } - - public ASN1ObjectIdentifier attrNameToOID(String attrName) - { - return IETFUtils.decodeAttrName(attrName, DefaultLookUp); - } - - public boolean areEqual(X500Name name1, X500Name name2) - { - RDN[] rdns1 = name1.getRDNs(); - RDN[] rdns2 = name2.getRDNs(); - - if (rdns1.length != rdns2.length) - { - return false; - } - - boolean reverse = false; - - if (rdns1[0].getFirst() != null && rdns2[0].getFirst() != null) - { - reverse = !rdns1[0].getFirst().getType().equals(rdns2[0].getFirst().getType()); // guess forward - } - - for (int i = 0; i != rdns1.length; i++) - { - if (!foundMatch(reverse, rdns1[i], rdns2)) - { - return false; - } - } - - return true; - } - - private boolean foundMatch(boolean reverse, RDN rdn, RDN[] possRDNs) - { - if (reverse) - { - for (int i = possRDNs.length - 1; i >= 0; i--) - { - if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i])) - { - possRDNs[i] = null; - return true; - } - } - } - else - { - for (int i = 0; i != possRDNs.length; i++) - { - if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i])) - { - possRDNs[i] = null; - return true; - } - } - } - - return false; - } - - protected boolean rdnAreEqual(RDN rdn1, RDN rdn2) - { - return IETFUtils.rDNAreEqual(rdn1, rdn2); - } - - public RDN[] fromString(String dirName) - { - return IETFUtils.rDNsFromString(dirName, this); - } - - public int calculateHashCode(X500Name name) - { - int hashCodeValue = 0; - RDN[] rdns = name.getRDNs(); - - // this needs to be order independent, like equals - for (int i = 0; i != rdns.length; i++) - { - if (rdns[i].isMultiValued()) - { - AttributeTypeAndValue[] atv = rdns[i].getTypesAndValues(); - - for (int j = 0; j != atv.length; j++) - { - hashCodeValue ^= atv[j].getType().hashCode(); - hashCodeValue ^= calcHashCode(atv[j].getValue()); - } - } - else - { - hashCodeValue ^= rdns[i].getFirst().getType().hashCode(); - hashCodeValue ^= calcHashCode(rdns[i].getFirst().getValue()); - } - } - - return hashCodeValue; - } - - private int calcHashCode(ASN1Encodable enc) - { - String value = IETFUtils.valueToString(enc); - - value = IETFUtils.canonicalize(value); - - return value.hashCode(); - } - - public String toString(X500Name name) - { - StringBuffer buf = new StringBuffer(); - boolean first = true; - - RDN[] rdns = name.getRDNs(); - - for (int i = 0; i < rdns.length; i++) - { - if (first) - { - first = false; - } - else - { - buf.append(','); - } - - IETFUtils.appendRDN(buf, rdns[i], DefaultSymbols); - } - - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/IETFUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/IETFUtils.java deleted file mode 100644 index bcd1828..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/IETFUtils.java +++ /dev/null @@ -1,409 +0,0 @@ -package org.bc.asn1.x500.style; - -import java.io.IOException; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1String; -import org.bc.asn1.DERUniversalString; -import org.bc.asn1.x500.AttributeTypeAndValue; -import org.bc.asn1.x500.RDN; -import org.bc.asn1.x500.X500NameBuilder; -import org.bc.asn1.x500.X500NameStyle; -import org.bc.util.Strings; -import org.bc.util.encoders.Hex; - -public class IETFUtils -{ - public static RDN[] rDNsFromString(String name, X500NameStyle x500Style) - { - X500NameTokenizer nTok = new X500NameTokenizer(name); - X500NameBuilder builder = new X500NameBuilder(x500Style); - - while (nTok.hasMoreTokens()) - { - String token = nTok.nextToken(); - int index = token.indexOf('='); - - if (index == -1) - { - throw new IllegalArgumentException("badly formated directory string"); - } - - String attr = token.substring(0, index); - String value = token.substring(index + 1); - ASN1ObjectIdentifier oid = x500Style.attrNameToOID(attr); - - if (value.indexOf('+') > 0) - { - X500NameTokenizer vTok = new X500NameTokenizer(value, '+'); - String v = vTok.nextToken(); - - Vector oids = new Vector(); - Vector values = new Vector(); - - oids.addElement(oid); - values.addElement(v); - - while (vTok.hasMoreTokens()) - { - String sv = vTok.nextToken(); - int ndx = sv.indexOf('='); - - String nm = sv.substring(0, ndx); - String vl = sv.substring(ndx + 1); - - oids.addElement(x500Style.attrNameToOID(nm)); - values.addElement(vl); - } - - builder.addMultiValuedRDN(toOIDArray(oids), toValueArray(values)); - } - else - { - builder.addRDN(oid, value); - } - } - - return builder.build().getRDNs(); - } - - private static String[] toValueArray(Vector values) - { - String[] tmp = new String[values.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = (String)values.elementAt(i); - } - - return tmp; - } - - private static ASN1ObjectIdentifier[] toOIDArray(Vector oids) - { - ASN1ObjectIdentifier[] tmp = new ASN1ObjectIdentifier[oids.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = (ASN1ObjectIdentifier)oids.elementAt(i); - } - - return tmp; - } - - public static ASN1ObjectIdentifier decodeAttrName( - String name, - Hashtable lookUp) - { - if (Strings.toUpperCase(name).startsWith("OID.")) - { - return new ASN1ObjectIdentifier(name.substring(4)); - } - else if (name.charAt(0) >= '0' && name.charAt(0) <= '9') - { - return new ASN1ObjectIdentifier(name); - } - - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)lookUp.get(Strings.toLowerCase(name)); - if (oid == null) - { - throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name"); - } - - return oid; - } - - public static ASN1Encodable valueFromHexString( - String str, - int off) - throws IOException - { - str = Strings.toLowerCase(str); - byte[] data = new byte[(str.length() - off) / 2]; - for (int index = 0; index != data.length; index++) - { - char left = str.charAt((index * 2) + off); - char right = str.charAt((index * 2) + off + 1); - - if (left < 'a') - { - data[index] = (byte)((left - '0') << 4); - } - else - { - data[index] = (byte)((left - 'a' + 10) << 4); - } - if (right < 'a') - { - data[index] |= (byte)(right - '0'); - } - else - { - data[index] |= (byte)(right - 'a' + 10); - } - } - - return ASN1Primitive.fromByteArray(data); - } - - public static void appendRDN( - StringBuffer buf, - RDN rdn, - Hashtable oidSymbols) - { - if (rdn.isMultiValued()) - { - AttributeTypeAndValue[] atv = rdn.getTypesAndValues(); - boolean firstAtv = true; - - for (int j = 0; j != atv.length; j++) - { - if (firstAtv) - { - firstAtv = false; - } - else - { - buf.append('+'); - } - - IETFUtils.appendTypeAndValue(buf, atv[j], oidSymbols); - } - } - else - { - IETFUtils.appendTypeAndValue(buf, rdn.getFirst(), oidSymbols); - } - } - - public static void appendTypeAndValue( - StringBuffer buf, - AttributeTypeAndValue typeAndValue, - Hashtable oidSymbols) - { - String sym = (String)oidSymbols.get(typeAndValue.getType()); - - if (sym != null) - { - buf.append(sym); - } - else - { - buf.append(typeAndValue.getType().getId()); - } - - buf.append('='); - - buf.append(valueToString(typeAndValue.getValue())); - } - - public static String valueToString(ASN1Encodable value) - { - StringBuffer vBuf = new StringBuffer(); - - if (value instanceof ASN1String && !(value instanceof DERUniversalString)) - { - String v = ((ASN1String)value).getString(); - if (v.length() > 0 && v.charAt(0) == '#') - { - vBuf.append("\\" + v); - } - else - { - vBuf.append(v); - } - } - else - { - try - { - vBuf.append("#" + bytesToString(Hex.encode(value.toASN1Primitive().getEncoded(ASN1Encoding.DER)))); - } - catch (IOException e) - { - throw new IllegalArgumentException("Other value has no encoded form"); - } - } - - int end = vBuf.length(); - int index = 0; - - if (vBuf.length() >= 2 && vBuf.charAt(0) == '\\' && vBuf.charAt(1) == '#') - { - index += 2; - } - - while (index != end) - { - if ((vBuf.charAt(index) == ',') - || (vBuf.charAt(index) == '"') - || (vBuf.charAt(index) == '\\') - || (vBuf.charAt(index) == '+') - || (vBuf.charAt(index) == '=') - || (vBuf.charAt(index) == '<') - || (vBuf.charAt(index) == '>') - || (vBuf.charAt(index) == ';')) - { - vBuf.insert(index, "\\"); - index++; - end++; - } - - index++; - } - - return vBuf.toString(); - } - - private static String bytesToString( - byte[] data) - { - char[] cs = new char[data.length]; - - for (int i = 0; i != cs.length; i++) - { - cs[i] = (char)(data[i] & 0xff); - } - - return new String(cs); - } - - public static String canonicalize(String s) - { - String value = Strings.toLowerCase(s.trim()); - - if (value.length() > 0 && value.charAt(0) == '#') - { - ASN1Primitive obj = decodeObject(value); - - if (obj instanceof ASN1String) - { - value = Strings.toLowerCase(((ASN1String)obj).getString().trim()); - } - } - - value = stripInternalSpaces(value); - - return value; - } - - private static ASN1Primitive decodeObject(String oValue) - { - try - { - return ASN1Primitive.fromByteArray(Hex.decode(oValue.substring(1))); - } - catch (IOException e) - { - throw new IllegalStateException("unknown encoding in name: " + e); - } - } - - public static String stripInternalSpaces( - String str) - { - StringBuffer res = new StringBuffer(); - - if (str.length() != 0) - { - char c1 = str.charAt(0); - - res.append(c1); - - for (int k = 1; k < str.length(); k++) - { - char c2 = str.charAt(k); - if (!(c1 == ' ' && c2 == ' ')) - { - res.append(c2); - } - c1 = c2; - } - } - - return res.toString(); - } - - public static boolean rDNAreEqual(RDN rdn1, RDN rdn2) - { - if (rdn1.isMultiValued()) - { - if (rdn2.isMultiValued()) - { - AttributeTypeAndValue[] atvs1 = rdn1.getTypesAndValues(); - AttributeTypeAndValue[] atvs2 = rdn2.getTypesAndValues(); - - if (atvs1.length != atvs2.length) - { - return false; - } - - for (int i = 0; i != atvs1.length; i++) - { - if (!atvAreEqual(atvs1[i], atvs2[i])) - { - return false; - } - } - } - else - { - return false; - } - } - else - { - if (!rdn2.isMultiValued()) - { - return atvAreEqual(rdn1.getFirst(), rdn2.getFirst()); - } - else - { - return false; - } - } - - return true; - } - - private static boolean atvAreEqual(AttributeTypeAndValue atv1, AttributeTypeAndValue atv2) - { - if (atv1 == atv2) - { - return true; - } - - if (atv1 == null) - { - return false; - } - - if (atv2 == null) - { - return false; - } - - ASN1ObjectIdentifier o1 = atv1.getType(); - ASN1ObjectIdentifier o2 = atv2.getType(); - - if (!o1.equals(o2)) - { - return false; - } - - String v1 = IETFUtils.canonicalize(IETFUtils.valueToString(atv1.getValue())); - String v2 = IETFUtils.canonicalize(IETFUtils.valueToString(atv2.getValue())); - - if (!v1.equals(v2)) - { - return false; - } - - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/RFC4519Style.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/RFC4519Style.java deleted file mode 100644 index c40b869..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/RFC4519Style.java +++ /dev/null @@ -1,348 +0,0 @@ -package org.bc.asn1.x500.style; - -import java.io.IOException; -import java.util.Hashtable; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.x500.AttributeTypeAndValue; -import org.bc.asn1.x500.RDN; -import org.bc.asn1.x500.X500Name; -import org.bc.asn1.x500.X500NameStyle; - -public class RFC4519Style - implements X500NameStyle -{ - public static final X500NameStyle INSTANCE = new RFC4519Style(); - - public static final ASN1ObjectIdentifier businessCategory = new ASN1ObjectIdentifier("2.5.4.15"); - public static final ASN1ObjectIdentifier c = new ASN1ObjectIdentifier("2.5.4.6"); - public static final ASN1ObjectIdentifier cn = new ASN1ObjectIdentifier("2.5.4.3"); - public static final ASN1ObjectIdentifier dc = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25"); - public static final ASN1ObjectIdentifier description = new ASN1ObjectIdentifier("2.5.4.13"); - public static final ASN1ObjectIdentifier destinationIndicator = new ASN1ObjectIdentifier("2.5.4.27"); - public static final ASN1ObjectIdentifier distinguishedName = new ASN1ObjectIdentifier("2.5.4.49"); - public static final ASN1ObjectIdentifier dnQualifier = new ASN1ObjectIdentifier("2.5.4.46"); - public static final ASN1ObjectIdentifier enhancedSearchGuide = new ASN1ObjectIdentifier("2.5.4.47"); - public static final ASN1ObjectIdentifier facsimileTelephoneNumber = new ASN1ObjectIdentifier("2.5.4.23"); - public static final ASN1ObjectIdentifier generationQualifier = new ASN1ObjectIdentifier("2.5.4.44"); - public static final ASN1ObjectIdentifier givenName = new ASN1ObjectIdentifier("2.5.4.42"); - public static final ASN1ObjectIdentifier houseIdentifier = new ASN1ObjectIdentifier("2.5.4.51"); - public static final ASN1ObjectIdentifier initials = new ASN1ObjectIdentifier("2.5.4.43"); - public static final ASN1ObjectIdentifier internationalISDNNumber = new ASN1ObjectIdentifier("2.5.4.25"); - public static final ASN1ObjectIdentifier l = new ASN1ObjectIdentifier("2.5.4.7"); - public static final ASN1ObjectIdentifier member = new ASN1ObjectIdentifier("2.5.4.31"); - public static final ASN1ObjectIdentifier name = new ASN1ObjectIdentifier("2.5.4.41"); - public static final ASN1ObjectIdentifier o = new ASN1ObjectIdentifier("2.5.4.10"); - public static final ASN1ObjectIdentifier ou = new ASN1ObjectIdentifier("2.5.4.11"); - public static final ASN1ObjectIdentifier owner = new ASN1ObjectIdentifier("2.5.4.32"); - public static final ASN1ObjectIdentifier physicalDeliveryOfficeName = new ASN1ObjectIdentifier("2.5.4.19"); - public static final ASN1ObjectIdentifier postalAddress = new ASN1ObjectIdentifier("2.5.4.16"); - public static final ASN1ObjectIdentifier postalCode = new ASN1ObjectIdentifier("2.5.4.17"); - public static final ASN1ObjectIdentifier postOfficeBox = new ASN1ObjectIdentifier("2.5.4.18"); - public static final ASN1ObjectIdentifier preferredDeliveryMethod = new ASN1ObjectIdentifier("2.5.4.28"); - public static final ASN1ObjectIdentifier registeredAddress = new ASN1ObjectIdentifier("2.5.4.26"); - public static final ASN1ObjectIdentifier roleOccupant = new ASN1ObjectIdentifier("2.5.4.33"); - public static final ASN1ObjectIdentifier searchGuide = new ASN1ObjectIdentifier("2.5.4.14"); - public static final ASN1ObjectIdentifier seeAlso = new ASN1ObjectIdentifier("2.5.4.34"); - public static final ASN1ObjectIdentifier serialNumber = new ASN1ObjectIdentifier("2.5.4.5"); - public static final ASN1ObjectIdentifier sn = new ASN1ObjectIdentifier("2.5.4.4"); - public static final ASN1ObjectIdentifier st = new ASN1ObjectIdentifier("2.5.4.8"); - public static final ASN1ObjectIdentifier street = new ASN1ObjectIdentifier("2.5.4.9"); - public static final ASN1ObjectIdentifier telephoneNumber = new ASN1ObjectIdentifier("2.5.4.20"); - public static final ASN1ObjectIdentifier teletexTerminalIdentifier = new ASN1ObjectIdentifier("2.5.4.22"); - public static final ASN1ObjectIdentifier telexNumber = new ASN1ObjectIdentifier("2.5.4.21"); - public static final ASN1ObjectIdentifier title = new ASN1ObjectIdentifier("2.5.4.12"); - public static final ASN1ObjectIdentifier uid = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1"); - public static final ASN1ObjectIdentifier uniqueMember = new ASN1ObjectIdentifier("2.5.4.50"); - public static final ASN1ObjectIdentifier userPassword = new ASN1ObjectIdentifier("2.5.4.35"); - public static final ASN1ObjectIdentifier x121Address = new ASN1ObjectIdentifier("2.5.4.24"); - public static final ASN1ObjectIdentifier x500UniqueIdentifier = new ASN1ObjectIdentifier("2.5.4.45"); - - /** - * default look up table translating OID values into their common symbols following - * the convention in RFC 2253 with a few extras - */ - private static final Hashtable DefaultSymbols = new Hashtable(); - - /** - * look up table translating common symbols into their OIDS. - */ - private static final Hashtable DefaultLookUp = new Hashtable(); - - static - { - DefaultSymbols.put(businessCategory, "businessCategory"); - DefaultSymbols.put(c, "c"); - DefaultSymbols.put(cn, "cn"); - DefaultSymbols.put(dc, "dc"); - DefaultSymbols.put(description, "description"); - DefaultSymbols.put(destinationIndicator, "destinationIndicator"); - DefaultSymbols.put(distinguishedName, "distinguishedName"); - DefaultSymbols.put(dnQualifier, "dnQualifier"); - DefaultSymbols.put(enhancedSearchGuide, "enhancedSearchGuide"); - DefaultSymbols.put(facsimileTelephoneNumber, "facsimileTelephoneNumber"); - DefaultSymbols.put(generationQualifier, "generationQualifier"); - DefaultSymbols.put(givenName, "givenName"); - DefaultSymbols.put(houseIdentifier, "houseIdentifier"); - DefaultSymbols.put(initials, "initials"); - DefaultSymbols.put(internationalISDNNumber, "internationalISDNNumber"); - DefaultSymbols.put(l, "l"); - DefaultSymbols.put(member, "member"); - DefaultSymbols.put(name, "name"); - DefaultSymbols.put(o, "o"); - DefaultSymbols.put(ou, "ou"); - DefaultSymbols.put(owner, "owner"); - DefaultSymbols.put(physicalDeliveryOfficeName, "physicalDeliveryOfficeName"); - DefaultSymbols.put(postalAddress, "postalAddress"); - DefaultSymbols.put(postalCode, "postalCode"); - DefaultSymbols.put(postOfficeBox, "postOfficeBox"); - DefaultSymbols.put(preferredDeliveryMethod, "preferredDeliveryMethod"); - DefaultSymbols.put(registeredAddress, "registeredAddress"); - DefaultSymbols.put(roleOccupant, "roleOccupant"); - DefaultSymbols.put(searchGuide, "searchGuide"); - DefaultSymbols.put(seeAlso, "seeAlso"); - DefaultSymbols.put(serialNumber, "serialNumber"); - DefaultSymbols.put(sn, "sn"); - DefaultSymbols.put(st, "st"); - DefaultSymbols.put(street, "street"); - DefaultSymbols.put(telephoneNumber, "telephoneNumber"); - DefaultSymbols.put(teletexTerminalIdentifier, "teletexTerminalIdentifier"); - DefaultSymbols.put(telexNumber, "telexNumber"); - DefaultSymbols.put(title, "title"); - DefaultSymbols.put(uid, "uid"); - DefaultSymbols.put(uniqueMember, "uniqueMember"); - DefaultSymbols.put(userPassword, "userPassword"); - DefaultSymbols.put(x121Address, "x121Address"); - DefaultSymbols.put(x500UniqueIdentifier, "x500UniqueIdentifier"); - - DefaultLookUp.put("businesscategory", businessCategory); - DefaultLookUp.put("c", c); - DefaultLookUp.put("cn", cn); - DefaultLookUp.put("dc", dc); - DefaultLookUp.put("description", description); - DefaultLookUp.put("destinationindicator", destinationIndicator); - DefaultLookUp.put("distinguishedname", distinguishedName); - DefaultLookUp.put("dnqualifier", dnQualifier); - DefaultLookUp.put("enhancedsearchguide", enhancedSearchGuide); - DefaultLookUp.put("facsimiletelephonenumber", facsimileTelephoneNumber); - DefaultLookUp.put("generationqualifier", generationQualifier); - DefaultLookUp.put("givenname", givenName); - DefaultLookUp.put("houseidentifier", houseIdentifier); - DefaultLookUp.put("initials", initials); - DefaultLookUp.put("internationalisdnnumber", internationalISDNNumber); - DefaultLookUp.put("l", l); - DefaultLookUp.put("member", member); - DefaultLookUp.put("name", name); - DefaultLookUp.put("o", o); - DefaultLookUp.put("ou", ou); - DefaultLookUp.put("owner", owner); - DefaultLookUp.put("physicaldeliveryofficename", physicalDeliveryOfficeName); - DefaultLookUp.put("postaladdress", postalAddress); - DefaultLookUp.put("postalcode", postalCode); - DefaultLookUp.put("postofficebox", postOfficeBox); - DefaultLookUp.put("preferreddeliverymethod", preferredDeliveryMethod); - DefaultLookUp.put("registeredaddress", registeredAddress); - DefaultLookUp.put("roleoccupant", roleOccupant); - DefaultLookUp.put("searchguide", searchGuide); - DefaultLookUp.put("seealso", seeAlso); - DefaultLookUp.put("serialnumber", serialNumber); - DefaultLookUp.put("sn", sn); - DefaultLookUp.put("st", st); - DefaultLookUp.put("street", street); - DefaultLookUp.put("telephonenumber", telephoneNumber); - DefaultLookUp.put("teletexterminalidentifier", teletexTerminalIdentifier); - DefaultLookUp.put("telexnumber", telexNumber); - DefaultLookUp.put("title", title); - DefaultLookUp.put("uid", uid); - DefaultLookUp.put("uniquemember", uniqueMember); - DefaultLookUp.put("userpassword", userPassword); - DefaultLookUp.put("x121address", x121Address); - DefaultLookUp.put("x500uniqueidentifier", x500UniqueIdentifier); - - // TODO: need to add correct matching for equality comparisons. - } - - protected RFC4519Style() - { - - } - - public ASN1Encodable stringToValue(ASN1ObjectIdentifier oid, String value) - { - if (value.length() != 0 && value.charAt(0) == '#') - { - try - { - return IETFUtils.valueFromHexString(value, 1); - } - catch (IOException e) - { - throw new RuntimeException("can't recode value for oid " + oid.getId()); - } - } - else - { - if (value.length() != 0 && value.charAt(0) == '\\') - { - value = value.substring(1); - } - if (oid.equals(dc)) - { - return new DERIA5String(value); - } - else if (oid.equals(c) || oid.equals(serialNumber) || oid.equals(dnQualifier) - || oid.equals(telephoneNumber)) - { - return new DERPrintableString(value); - } - } - - return new DERUTF8String(value); - } - - public ASN1ObjectIdentifier attrNameToOID(String attrName) - { - return IETFUtils.decodeAttrName(attrName, DefaultLookUp); - } - - public boolean areEqual(X500Name name1, X500Name name2) - { - RDN[] rdns1 = name1.getRDNs(); - RDN[] rdns2 = name2.getRDNs(); - - if (rdns1.length != rdns2.length) - { - return false; - } - - boolean reverse = false; - - if (rdns1[0].getFirst() != null && rdns2[0].getFirst() != null) - { - reverse = !rdns1[0].getFirst().getType().equals(rdns2[0].getFirst().getType()); // guess forward - } - - for (int i = 0; i != rdns1.length; i++) - { - if (!foundMatch(reverse, rdns1[i], rdns2)) - { - return false; - } - } - - return true; - } - - private boolean foundMatch(boolean reverse, RDN rdn, RDN[] possRDNs) - { - if (reverse) - { - for (int i = possRDNs.length - 1; i >= 0; i--) - { - if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i])) - { - possRDNs[i] = null; - return true; - } - } - } - else - { - for (int i = 0; i != possRDNs.length; i++) - { - if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i])) - { - possRDNs[i] = null; - return true; - } - } - } - - return false; - } - - protected boolean rdnAreEqual(RDN rdn1, RDN rdn2) - { - return IETFUtils.rDNAreEqual(rdn1, rdn2); - } - - // parse backwards - public RDN[] fromString(String dirName) - { - RDN[] tmp = IETFUtils.rDNsFromString(dirName, this); - RDN[] res = new RDN[tmp.length]; - - for (int i = 0; i != tmp.length; i++) - { - res[res.length - i - 1] = tmp[i]; - } - - return res; - } - - public int calculateHashCode(X500Name name) - { - int hashCodeValue = 0; - RDN[] rdns = name.getRDNs(); - - // this needs to be order independent, like equals - for (int i = 0; i != rdns.length; i++) - { - if (rdns[i].isMultiValued()) - { - AttributeTypeAndValue[] atv = rdns[i].getTypesAndValues(); - - for (int j = 0; j != atv.length; j++) - { - hashCodeValue ^= atv[j].getType().hashCode(); - hashCodeValue ^= calcHashCode(atv[j].getValue()); - } - } - else - { - hashCodeValue ^= rdns[i].getFirst().getType().hashCode(); - hashCodeValue ^= calcHashCode(rdns[i].getFirst().getValue()); - } - } - - return hashCodeValue; - } - - private int calcHashCode(ASN1Encodable enc) - { - String value = IETFUtils.valueToString(enc); - - value = IETFUtils.canonicalize(value); - - return value.hashCode(); - } - - // convert in reverse - public String toString(X500Name name) - { - StringBuffer buf = new StringBuffer(); - boolean first = true; - - RDN[] rdns = name.getRDNs(); - - for (int i = rdns.length - 1; i >= 0; i--) - { - if (first) - { - first = false; - } - else - { - buf.append(','); - } - - IETFUtils.appendRDN(buf, rdns[i], DefaultSymbols); - } - - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/X500NameTokenizer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/X500NameTokenizer.java deleted file mode 100644 index 2760ca5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x500/style/X500NameTokenizer.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.bc.asn1.x500.style; - -/** - * class for breaking up an X500 Name into it's component tokens, ala - * java.util.StringTokenizer. We need this class as some of the - * lightweight Java environment don't support classes like - * StringTokenizer. - */ -class X500NameTokenizer -{ - private String value; - private int index; - private char separator; - private StringBuffer buf = new StringBuffer(); - - public X500NameTokenizer( - String oid) - { - this(oid, ','); - } - - public X500NameTokenizer( - String oid, - char separator) - { - this.value = oid; - this.index = -1; - this.separator = separator; - } - - public boolean hasMoreTokens() - { - return (index != value.length()); - } - - public String nextToken() - { - if (index == value.length()) - { - return null; - } - - int end = index + 1; - boolean quoted = false; - boolean escaped = false; - - buf.setLength(0); - - while (end != value.length()) - { - char c = value.charAt(end); - - if (c == '"') - { - if (!escaped) - { - quoted = !quoted; - } - else - { - if (c == '#' && buf.charAt(buf.length() - 1) == '=') - { - buf.append('\\'); - } - else if (c == '+' && separator != '+') - { - buf.append('\\'); - } - buf.append(c); - } - escaped = false; - } - else - { - if (escaped || quoted) - { - if (c == '#' && buf.charAt(buf.length() - 1) == '=') - { - buf.append('\\'); - } - else if (c == '+' && separator != '+') - { - buf.append('\\'); - } - buf.append(c); - escaped = false; - } - else if (c == '\\') - { - escaped = true; - } - else if (c == separator) - { - break; - } - else - { - buf.append(c); - } - } - end++; - } - - index = end; - return buf.toString().trim(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AccessDescription.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AccessDescription.java deleted file mode 100644 index 072d497..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AccessDescription.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * The AccessDescription object. - *

    - * AccessDescription  ::=  SEQUENCE {
    - *       accessMethod          OBJECT IDENTIFIER,
    - *       accessLocation        GeneralName  }
    - * 
    - */ -public class AccessDescription - extends ASN1Object -{ - public final static ASN1ObjectIdentifier id_ad_caIssuers = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.48.2"); - - public final static ASN1ObjectIdentifier id_ad_ocsp = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.48.1"); - - ASN1ObjectIdentifier accessMethod = null; - GeneralName accessLocation = null; - - public static AccessDescription getInstance( - Object obj) - { - if (obj instanceof AccessDescription) - { - return (AccessDescription)obj; - } - else if (obj != null) - { - return new AccessDescription(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private AccessDescription( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("wrong number of elements in sequence"); - } - - accessMethod = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - accessLocation = GeneralName.getInstance(seq.getObjectAt(1)); - } - - /** - * create an AccessDescription with the oid and location provided. - */ - public AccessDescription( - ASN1ObjectIdentifier oid, - GeneralName location) - { - accessMethod = oid; - accessLocation = location; - } - - /** - * - * @return the access method. - */ - public ASN1ObjectIdentifier getAccessMethod() - { - return accessMethod; - } - - /** - * - * @return the access location - */ - public GeneralName getAccessLocation() - { - return accessLocation; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector accessDescription = new ASN1EncodableVector(); - - accessDescription.add(accessMethod); - accessDescription.add(accessLocation); - - return new DERSequence(accessDescription); - } - - public String toString() - { - return ("AccessDescription: Oid(" + this.accessMethod.getId() + ")"); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AlgorithmIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AlgorithmIdentifier.java deleted file mode 100644 index bbfd26f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AlgorithmIdentifier.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1SequenceParser; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERNull; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSequence; - -public class AlgorithmIdentifier - extends ASN1Object -{ - private ASN1ObjectIdentifier objectId; - private ASN1Encodable parameters; - private boolean parametersDefined = false; - - public static AlgorithmIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static AlgorithmIdentifier getInstance( - Object obj) - { - if (obj== null || obj instanceof AlgorithmIdentifier) - { - return (AlgorithmIdentifier)obj; - } - - if (obj instanceof ASN1ObjectIdentifier) - { - return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj); - } - - if (obj instanceof String) - { - return new AlgorithmIdentifier((String)obj); - } - - if (obj instanceof ASN1Sequence || obj instanceof ASN1SequenceParser) - { - return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj)); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public AlgorithmIdentifier( - ASN1ObjectIdentifier objectId) - { - this.objectId = objectId; - } - - /** - * @deprecated use ASN1ObjectIdentifier - * @param objectId - */ - public AlgorithmIdentifier( - String objectId) - { - this.objectId = new ASN1ObjectIdentifier(objectId); - } - - /** - * @deprecated use ASN1ObjectIdentifier - * @param objectId - */ - public AlgorithmIdentifier( - DERObjectIdentifier objectId) - { - this.objectId = new ASN1ObjectIdentifier(objectId.getId()); - } - - /** - * @deprecated use ASN1ObjectIdentifier - * @param objectId - * @param parameters - */ - public AlgorithmIdentifier( - DERObjectIdentifier objectId, - ASN1Encodable parameters) - { - parametersDefined = true; - this.objectId = new ASN1ObjectIdentifier(objectId.getId()); - this.parameters = parameters; - } - - public AlgorithmIdentifier( - ASN1ObjectIdentifier objectId, - ASN1Encodable parameters) - { - parametersDefined = true; - this.objectId = objectId; - this.parameters = parameters; - } - - public AlgorithmIdentifier( - ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - objectId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - - if (seq.size() == 2) - { - parametersDefined = true; - parameters = seq.getObjectAt(1); - } - else - { - parameters = null; - } - } - - public ASN1ObjectIdentifier getAlgorithm() - { - return new ASN1ObjectIdentifier(objectId.getId()); - } - - /** - * @deprecated use getAlgorithm - * @return - */ - public ASN1ObjectIdentifier getObjectId() - { - return objectId; - } - - public ASN1Encodable getParameters() - { - return parameters; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *      AlgorithmIdentifier ::= SEQUENCE {
    -     *                            algorithm OBJECT IDENTIFIER,
    -     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(objectId); - - if (parametersDefined) - { - if (parameters != null) - { - v.add(parameters); - } - else - { - v.add(DERNull.INSTANCE); - } - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertIssuer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertIssuer.java deleted file mode 100644 index 35a0bd5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertIssuer.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -public class AttCertIssuer - extends ASN1Object - implements ASN1Choice -{ - ASN1Encodable obj; - ASN1Primitive choiceObj; - - public static AttCertIssuer getInstance( - Object obj) - { - if (obj == null || obj instanceof AttCertIssuer) - { - return (AttCertIssuer)obj; - } - else if (obj instanceof V2Form) - { - return new AttCertIssuer(V2Form.getInstance(obj)); - } - else if (obj instanceof GeneralNames) - { - return new AttCertIssuer((GeneralNames)obj); - } - else if (obj instanceof ASN1TaggedObject) - { - return new AttCertIssuer(V2Form.getInstance((ASN1TaggedObject)obj, false)); - } - else if (obj instanceof ASN1Sequence) - { - return new AttCertIssuer(GeneralNames.getInstance(obj)); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public static AttCertIssuer getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - /** - * Don't use this one if you are trying to be RFC 3281 compliant. - * Use it for v1 attribute certificates only. - * - * @param names our GeneralNames structure - */ - public AttCertIssuer( - GeneralNames names) - { - obj = names; - choiceObj = obj.toASN1Primitive(); - } - - public AttCertIssuer( - V2Form v2Form) - { - obj = v2Form; - choiceObj = new DERTaggedObject(false, 0, obj); - } - - public ASN1Encodable getIssuer() - { - return obj; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  AttCertIssuer ::= CHOICE {
    -     *       v1Form   GeneralNames,  -- MUST NOT be used in this
    -     *                               -- profile
    -     *       v2Form   [0] V2Form     -- v2 only
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return choiceObj; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertValidityPeriod.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertValidityPeriod.java deleted file mode 100644 index bc12929..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttCertValidityPeriod.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class AttCertValidityPeriod - extends ASN1Object -{ - ASN1GeneralizedTime notBeforeTime; - ASN1GeneralizedTime notAfterTime; - - public static AttCertValidityPeriod getInstance( - Object obj) - { - if (obj instanceof AttCertValidityPeriod) - { - return (AttCertValidityPeriod)obj; - } - else if (obj != null) - { - return new AttCertValidityPeriod(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private AttCertValidityPeriod( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - notBeforeTime = ASN1GeneralizedTime.getInstance(seq.getObjectAt(0)); - notAfterTime = ASN1GeneralizedTime.getInstance(seq.getObjectAt(1)); - } - - /** - * @param notBeforeTime - * @param notAfterTime - */ - public AttCertValidityPeriod( - ASN1GeneralizedTime notBeforeTime, - ASN1GeneralizedTime notAfterTime) - { - this.notBeforeTime = notBeforeTime; - this.notAfterTime = notAfterTime; - } - - public ASN1GeneralizedTime getNotBeforeTime() - { - return notBeforeTime; - } - - public ASN1GeneralizedTime getNotAfterTime() - { - return notAfterTime; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  AttCertValidityPeriod  ::= SEQUENCE {
    -     *       notBeforeTime  GeneralizedTime,
    -     *       notAfterTime   GeneralizedTime
    -     *  } 
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(notBeforeTime); - v.add(notAfterTime); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Attribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Attribute.java deleted file mode 100644 index ca622b6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Attribute.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.DERSequence; - -public class Attribute - extends ASN1Object -{ - private ASN1ObjectIdentifier attrType; - private ASN1Set attrValues; - - /** - * return an Attribute object from the given object. - * - * @param o the object we want converted. - * @exception IllegalArgumentException if the object cannot be converted. - */ - public static Attribute getInstance( - Object o) - { - if (o instanceof Attribute) - { - return (Attribute)o; - } - - if (o != null) - { - return new Attribute(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private Attribute( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - attrType = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - attrValues = ASN1Set.getInstance(seq.getObjectAt(1)); - } - - public Attribute( - ASN1ObjectIdentifier attrType, - ASN1Set attrValues) - { - this.attrType = attrType; - this.attrValues = attrValues; - } - - public ASN1ObjectIdentifier getAttrType() - { - return new ASN1ObjectIdentifier(attrType.getId()); - } - - public ASN1Encodable[] getAttributeValues() - { - return attrValues.toArray(); - } - - public ASN1Set getAttrValues() - { - return attrValues; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Attribute ::= SEQUENCE {
    -     *     attrType OBJECT IDENTIFIER,
    -     *     attrValues SET OF AttributeValue
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(attrType); - v.add(attrValues); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificate.java deleted file mode 100644 index f3c75bf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificate.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -public class AttributeCertificate - extends ASN1Object -{ - AttributeCertificateInfo acinfo; - AlgorithmIdentifier signatureAlgorithm; - DERBitString signatureValue; - - /** - * @param obj - * @return an AttributeCertificate object - */ - public static AttributeCertificate getInstance(Object obj) - { - if (obj instanceof AttributeCertificate) - { - return (AttributeCertificate)obj; - } - else if (obj != null) - { - return new AttributeCertificate(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public AttributeCertificate( - AttributeCertificateInfo acinfo, - AlgorithmIdentifier signatureAlgorithm, - DERBitString signatureValue) - { - this.acinfo = acinfo; - this.signatureAlgorithm = signatureAlgorithm; - this.signatureValue = signatureValue; - } - - public AttributeCertificate( - ASN1Sequence seq) - { - if (seq.size() != 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - this.acinfo = AttributeCertificateInfo.getInstance(seq.getObjectAt(0)); - this.signatureAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - this.signatureValue = DERBitString.getInstance(seq.getObjectAt(2)); - } - - public AttributeCertificateInfo getAcinfo() - { - return acinfo; - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return signatureAlgorithm; - } - - public DERBitString getSignatureValue() - { - return signatureValue; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  AttributeCertificate ::= SEQUENCE {
    -     *       acinfo               AttributeCertificateInfo,
    -     *       signatureAlgorithm   AlgorithmIdentifier,
    -     *       signatureValue       BIT STRING
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(acinfo); - v.add(signatureAlgorithm); - v.add(signatureValue); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificateInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificateInfo.java deleted file mode 100644 index 9b09414..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AttributeCertificateInfo.java +++ /dev/null @@ -1,166 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -public class AttributeCertificateInfo - extends ASN1Object -{ - private ASN1Integer version; - private Holder holder; - private AttCertIssuer issuer; - private AlgorithmIdentifier signature; - private ASN1Integer serialNumber; - private AttCertValidityPeriod attrCertValidityPeriod; - private ASN1Sequence attributes; - private DERBitString issuerUniqueID; - private Extensions extensions; - - public static AttributeCertificateInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static AttributeCertificateInfo getInstance( - Object obj) - { - if (obj instanceof AttributeCertificateInfo) - { - return (AttributeCertificateInfo)obj; - } - else if (obj != null) - { - return new AttributeCertificateInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private AttributeCertificateInfo( - ASN1Sequence seq) - { - if (seq.size() < 7 || seq.size() > 9) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - this.version = ASN1Integer.getInstance(seq.getObjectAt(0)); - this.holder = Holder.getInstance(seq.getObjectAt(1)); - this.issuer = AttCertIssuer.getInstance(seq.getObjectAt(2)); - this.signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(3)); - this.serialNumber = ASN1Integer.getInstance(seq.getObjectAt(4)); - this.attrCertValidityPeriod = AttCertValidityPeriod.getInstance(seq.getObjectAt(5)); - this.attributes = ASN1Sequence.getInstance(seq.getObjectAt(6)); - - for (int i = 7; i < seq.size(); i++) - { - ASN1Encodable obj = (ASN1Encodable)seq.getObjectAt(i); - - if (obj instanceof DERBitString) - { - this.issuerUniqueID = DERBitString.getInstance(seq.getObjectAt(i)); - } - else if (obj instanceof ASN1Sequence || obj instanceof Extensions) - { - this.extensions = Extensions.getInstance(seq.getObjectAt(i)); - } - } - } - - public ASN1Integer getVersion() - { - return version; - } - - public Holder getHolder() - { - return holder; - } - - public AttCertIssuer getIssuer() - { - return issuer; - } - - public AlgorithmIdentifier getSignature() - { - return signature; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public AttCertValidityPeriod getAttrCertValidityPeriod() - { - return attrCertValidityPeriod; - } - - public ASN1Sequence getAttributes() - { - return attributes; - } - - public DERBitString getIssuerUniqueID() - { - return issuerUniqueID; - } - - public Extensions getExtensions() - { - return extensions; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  AttributeCertificateInfo ::= SEQUENCE {
    -     *       version              AttCertVersion -- version is v2,
    -     *       holder               Holder,
    -     *       issuer               AttCertIssuer,
    -     *       signature            AlgorithmIdentifier,
    -     *       serialNumber         CertificateSerialNumber,
    -     *       attrCertValidityPeriod   AttCertValidityPeriod,
    -     *       attributes           SEQUENCE OF Attribute,
    -     *       issuerUniqueID       UniqueIdentifier OPTIONAL,
    -     *       extensions           Extensions OPTIONAL
    -     *  }
    -     *
    -     *  AttCertVersion ::= INTEGER { v2(1) }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(holder); - v.add(issuer); - v.add(signature); - v.add(serialNumber); - v.add(attrCertValidityPeriod); - v.add(attributes); - - if (issuerUniqueID != null) - { - v.add(issuerUniqueID); - } - - if (extensions != null) - { - v.add(extensions); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityInformationAccess.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityInformationAccess.java deleted file mode 100644 index e82bfb9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityInformationAccess.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * The AuthorityInformationAccess object. - *
    - * id-pe-authorityInfoAccess OBJECT IDENTIFIER ::= { id-pe 1 }
    - *
    - * AuthorityInfoAccessSyntax  ::=
    - *      SEQUENCE SIZE (1..MAX) OF AccessDescription
    - * AccessDescription  ::=  SEQUENCE {
    - *       accessMethod          OBJECT IDENTIFIER,
    - *       accessLocation        GeneralName  }
    - *
    - * id-ad OBJECT IDENTIFIER ::= { id-pkix 48 }
    - * id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 }
    - * id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }
    - * 
    - */ -public class AuthorityInformationAccess - extends ASN1Object -{ - private AccessDescription[] descriptions; - - public static AuthorityInformationAccess getInstance( - Object obj) - { - if (obj instanceof AuthorityInformationAccess) - { - return (AuthorityInformationAccess)obj; - } - - if (obj != null) - { - return new AuthorityInformationAccess(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private AuthorityInformationAccess( - ASN1Sequence seq) - { - if (seq.size() < 1) - { - throw new IllegalArgumentException("sequence may not be empty"); - } - - descriptions = new AccessDescription[seq.size()]; - - for (int i = 0; i != seq.size(); i++) - { - descriptions[i] = AccessDescription.getInstance(seq.getObjectAt(i)); - } - } - - /** - * create an AuthorityInformationAccess with the oid and location provided. - */ - public AuthorityInformationAccess( - ASN1ObjectIdentifier oid, - GeneralName location) - { - descriptions = new AccessDescription[1]; - - descriptions[0] = new AccessDescription(oid, location); - } - - - /** - * - * @return the access descriptions contained in this object. - */ - public AccessDescription[] getAccessDescriptions() - { - return descriptions; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - - for (int i = 0; i != descriptions.length; i++) - { - vec.add(descriptions[i]); - } - - return new DERSequence(vec); - } - - public String toString() - { - return ("AuthorityInformationAccess: Oid(" + this.descriptions[0].getAccessMethod().getId() + ")"); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityKeyIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityKeyIdentifier.java deleted file mode 100644 index 182c6ae..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/AuthorityKeyIdentifier.java +++ /dev/null @@ -1,232 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; - -/** - * The AuthorityKeyIdentifier object. - *
    - * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
    - *
    - *   AuthorityKeyIdentifier ::= SEQUENCE {
    - *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
    - *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
    - *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
    - *
    - *   KeyIdentifier ::= OCTET STRING
    - * 
    - * - */ -public class AuthorityKeyIdentifier - extends ASN1Object -{ - ASN1OctetString keyidentifier=null; - GeneralNames certissuer=null; - ASN1Integer certserno=null; - - public static AuthorityKeyIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static AuthorityKeyIdentifier getInstance( - Object obj) - { - if (obj instanceof AuthorityKeyIdentifier) - { - return (AuthorityKeyIdentifier)obj; - } - if (obj != null) - { - return new AuthorityKeyIdentifier(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static AuthorityKeyIdentifier fromExtensions(Extensions extensions) - { - return AuthorityKeyIdentifier.getInstance(extensions.getExtensionParsedValue(Extension.authorityKeyIdentifier)); - } - - protected AuthorityKeyIdentifier( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1TaggedObject o = DERTaggedObject.getInstance(e.nextElement()); - - switch (o.getTagNo()) - { - case 0: - this.keyidentifier = ASN1OctetString.getInstance(o, false); - break; - case 1: - this.certissuer = GeneralNames.getInstance(o, false); - break; - case 2: - this.certserno = ASN1Integer.getInstance(o, false); - break; - default: - throw new IllegalArgumentException("illegal tag"); - } - } - } - - /** - * - * Calulates the keyidentifier using a SHA1 hash over the BIT STRING - * from SubjectPublicKeyInfo as defined in RFC2459. - * - * Example of making a AuthorityKeyIdentifier: - *
    -     *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(
    -     *       publicKey.getEncoded()).readObject());
    -     *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
    -     * 
    - * - **/ - public AuthorityKeyIdentifier( - SubjectPublicKeyInfo spki) - { - Digest digest = new SHA1Digest(); - byte[] resBuf = new byte[digest.getDigestSize()]; - - byte[] bytes = spki.getPublicKeyData().getBytes(); - digest.update(bytes, 0, bytes.length); - digest.doFinal(resBuf, 0); - this.keyidentifier = new DEROctetString(resBuf); - } - - /** - * create an AuthorityKeyIdentifier with the GeneralNames tag and - * the serial number provided as well. - */ - public AuthorityKeyIdentifier( - SubjectPublicKeyInfo spki, - GeneralNames name, - BigInteger serialNumber) - { - Digest digest = new SHA1Digest(); - byte[] resBuf = new byte[digest.getDigestSize()]; - - byte[] bytes = spki.getPublicKeyData().getBytes(); - digest.update(bytes, 0, bytes.length); - digest.doFinal(resBuf, 0); - - this.keyidentifier = new DEROctetString(resBuf); - this.certissuer = GeneralNames.getInstance(name.toASN1Primitive()); - this.certserno = new ASN1Integer(serialNumber); - } - - /** - * create an AuthorityKeyIdentifier with the GeneralNames tag and - * the serial number provided. - */ - public AuthorityKeyIdentifier( - GeneralNames name, - BigInteger serialNumber) - { - this.keyidentifier = null; - this.certissuer = GeneralNames.getInstance(name.toASN1Primitive()); - this.certserno = new ASN1Integer(serialNumber); - } - - /** - * create an AuthorityKeyIdentifier with a precomupted key identifier - */ - public AuthorityKeyIdentifier( - byte[] keyIdentifier) - { - this.keyidentifier = new DEROctetString(keyIdentifier); - this.certissuer = null; - this.certserno = null; - } - - /** - * create an AuthorityKeyIdentifier with a precomupted key identifier - * and the GeneralNames tag and the serial number provided as well. - */ - public AuthorityKeyIdentifier( - byte[] keyIdentifier, - GeneralNames name, - BigInteger serialNumber) - { - this.keyidentifier = new DEROctetString(keyIdentifier); - this.certissuer = GeneralNames.getInstance(name.toASN1Primitive()); - this.certserno = new ASN1Integer(serialNumber); - } - - public byte[] getKeyIdentifier() - { - if (keyidentifier != null) - { - return keyidentifier.getOctets(); - } - - return null; - } - - public GeneralNames getAuthorityCertIssuer() - { - return certissuer; - } - - public BigInteger getAuthorityCertSerialNumber() - { - if (certserno != null) - { - return certserno.getValue(); - } - - return null; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (keyidentifier != null) - { - v.add(new DERTaggedObject(false, 0, keyidentifier)); - } - - if (certissuer != null) - { - v.add(new DERTaggedObject(false, 1, certissuer)); - } - - if (certserno != null) - { - v.add(new DERTaggedObject(false, 2, certserno)); - } - - - return new DERSequence(v); - } - - public String toString() - { - return ("AuthorityKeyIdentifier: KeyID(" + this.keyidentifier.getOctets() + ")"); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/BasicConstraints.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/BasicConstraints.java deleted file mode 100644 index 74630a5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/BasicConstraints.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBoolean; -import org.bc.asn1.DERSequence; - -public class BasicConstraints - extends ASN1Object -{ - ASN1Boolean cA = ASN1Boolean.getInstance(false); - ASN1Integer pathLenConstraint = null; - - public static BasicConstraints getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static BasicConstraints getInstance( - Object obj) - { - if (obj instanceof BasicConstraints) - { - return (BasicConstraints)obj; - } - if (obj instanceof X509Extension) - { - return getInstance(X509Extension.convertValueToObject((X509Extension)obj)); - } - if (obj != null) - { - return new BasicConstraints(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static BasicConstraints fromExtensions(Extensions extensions) - { - return BasicConstraints.getInstance(extensions.getExtensionParsedValue(Extension.basicConstraints)); - } - - private BasicConstraints( - ASN1Sequence seq) - { - if (seq.size() == 0) - { - this.cA = null; - this.pathLenConstraint = null; - } - else - { - if (seq.getObjectAt(0) instanceof DERBoolean) - { - this.cA = DERBoolean.getInstance(seq.getObjectAt(0)); - } - else - { - this.cA = null; - this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(0)); - } - if (seq.size() > 1) - { - if (this.cA != null) - { - this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(1)); - } - else - { - throw new IllegalArgumentException("wrong sequence in constructor"); - } - } - } - } - - public BasicConstraints( - boolean cA) - { - if (cA) - { - this.cA = ASN1Boolean.getInstance(true); - } - else - { - this.cA = null; - } - this.pathLenConstraint = null; - } - - /** - * create a cA=true object for the given path length constraint. - * - * @param pathLenConstraint - */ - public BasicConstraints( - int pathLenConstraint) - { - this.cA = ASN1Boolean.getInstance(true); - this.pathLenConstraint = new ASN1Integer(pathLenConstraint); - } - - public boolean isCA() - { - return (cA != null) && cA.isTrue(); - } - - public BigInteger getPathLenConstraint() - { - if (pathLenConstraint != null) - { - return pathLenConstraint.getValue(); - } - - return null; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * BasicConstraints := SEQUENCE {
    -     *    cA                  BOOLEAN DEFAULT FALSE,
    -     *    pathLenConstraint   INTEGER (0..MAX) OPTIONAL
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (cA != null) - { - v.add(cA); - } - - if (pathLenConstraint != null) // yes some people actually do this when cA is false... - { - v.add(pathLenConstraint); - } - - return new DERSequence(v); - } - - public String toString() - { - if (pathLenConstraint == null) - { - if (cA == null) - { - return "BasicConstraints: isCa(false)"; - } - return "BasicConstraints: isCa(" + this.isCA() + ")"; - } - return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLDistPoint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLDistPoint.java deleted file mode 100644 index 9aa4cff..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLDistPoint.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class CRLDistPoint - extends ASN1Object -{ - ASN1Sequence seq = null; - - public static CRLDistPoint getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static CRLDistPoint getInstance( - Object obj) - { - if (obj instanceof CRLDistPoint) - { - return (CRLDistPoint)obj; - } - else if (obj != null) - { - return new CRLDistPoint(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private CRLDistPoint( - ASN1Sequence seq) - { - this.seq = seq; - } - - public CRLDistPoint( - DistributionPoint[] points) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != points.length; i++) - { - v.add(points[i]); - } - - seq = new DERSequence(v); - } - - /** - * Return the distribution points making up the sequence. - * - * @return DistributionPoint[] - */ - public DistributionPoint[] getDistributionPoints() - { - DistributionPoint[] dp = new DistributionPoint[seq.size()]; - - for (int i = 0; i != seq.size(); i++) - { - dp[i] = DistributionPoint.getInstance(seq.getObjectAt(i)); - } - - return dp; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * CRLDistPoint ::= SEQUENCE SIZE {1..MAX} OF DistributionPoint
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return seq; - } - - public String toString() - { - StringBuffer buf = new StringBuffer(); - String sep = System.getProperty("line.separator"); - - buf.append("CRLDistPoint:"); - buf.append(sep); - DistributionPoint dp[] = getDistributionPoints(); - for (int i = 0; i != dp.length; i++) - { - buf.append(" "); - buf.append(dp[i]); - buf.append(sep); - } - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLNumber.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLNumber.java deleted file mode 100644 index b1e7b06..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLNumber.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; - -/** - * The CRLNumber object. - *
    - * CRLNumber::= INTEGER(0..MAX)
    - * 
    - */ -public class CRLNumber - extends ASN1Object -{ - private BigInteger number; - - public CRLNumber( - BigInteger number) - { - this.number = number; - } - - public BigInteger getCRLNumber() - { - return number; - } - - public String toString() - { - return "CRLNumber: " + getCRLNumber(); - } - - public ASN1Primitive toASN1Primitive() - { - return new ASN1Integer(number); - } - - public static CRLNumber getInstance(Object o) - { - if (o instanceof CRLNumber) - { - return (CRLNumber)o; - } - else if (o != null) - { - return new CRLNumber(ASN1Integer.getInstance(o).getValue()); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLReason.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLReason.java deleted file mode 100644 index 6e2e8e1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CRLReason.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; -import java.util.Hashtable; - -import org.bc.asn1.ASN1Enumerated; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.util.Integers; - -/** - * The CRLReason enumeration. - *
    - * CRLReason ::= ENUMERATED {
    - *  unspecified             (0),
    - *  keyCompromise           (1),
    - *  cACompromise            (2),
    - *  affiliationChanged      (3),
    - *  superseded              (4),
    - *  cessationOfOperation    (5),
    - *  certificateHold         (6),
    - *  removeFromCRL           (8),
    - *  privilegeWithdrawn      (9),
    - *  aACompromise           (10)
    - * }
    - * 
    - */ -public class CRLReason - extends ASN1Object -{ - /** - * @deprecated use lower case version - */ - public static final int UNSPECIFIED = 0; - /** - * @deprecated use lower case version - */ - public static final int KEY_COMPROMISE = 1; - /** - * @deprecated use lower case version - */ - public static final int CA_COMPROMISE = 2; - /** - * @deprecated use lower case version - */ - public static final int AFFILIATION_CHANGED = 3; - /** - * @deprecated use lower case version - */ - public static final int SUPERSEDED = 4; - /** - * @deprecated use lower case version - */ - public static final int CESSATION_OF_OPERATION = 5; - /** - * @deprecated use lower case version - */ - public static final int CERTIFICATE_HOLD = 6; - /** - * @deprecated use lower case version - */ - public static final int REMOVE_FROM_CRL = 8; - /** - * @deprecated use lower case version - */ - public static final int PRIVILEGE_WITHDRAWN = 9; - /** - * @deprecated use lower case version - */ - public static final int AA_COMPROMISE = 10; - - public static final int unspecified = 0; - public static final int keyCompromise = 1; - public static final int cACompromise = 2; - public static final int affiliationChanged = 3; - public static final int superseded = 4; - public static final int cessationOfOperation = 5; - public static final int certificateHold = 6; - // 7 -> unknown - public static final int removeFromCRL = 8; - public static final int privilegeWithdrawn = 9; - public static final int aACompromise = 10; - - private static final String[] reasonString = - { - "unspecified", "keyCompromise", "cACompromise", "affiliationChanged", - "superseded", "cessationOfOperation", "certificateHold", "unknown", - "removeFromCRL", "privilegeWithdrawn", "aACompromise" - }; - - private static final Hashtable table = new Hashtable(); - - private ASN1Enumerated value; - - public static CRLReason getInstance(Object o) - { - if (o instanceof CRLReason) - { - return (CRLReason)o; - } - else if (o != null) - { - return lookup(ASN1Enumerated.getInstance(o).getValue().intValue()); - } - - return null; - } - - private CRLReason( - int reason) - { - value = new ASN1Enumerated(reason); - } - - public String toString() - { - String str; - int reason = getValue().intValue(); - if (reason < 0 || reason > 10) - { - str = "invalid"; - } - else - { - str = reasonString[reason]; - } - return "CRLReason: " + str; - } - - public BigInteger getValue() - { - return value.getValue(); - } - - public ASN1Primitive toASN1Primitive() - { - return value; - } - - public static CRLReason lookup(int value) - { - Integer idx = Integers.valueOf(value); - - if (!table.containsKey(idx)) - { - table.put(idx, new CRLReason(value)); - } - - return (CRLReason)table.get(idx); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertPolicyId.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertPolicyId.java deleted file mode 100644 index aba2ee0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertPolicyId.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; - - -/** - * CertPolicyId, used in the CertificatePolicies and PolicyMappings - * X509V3 Extensions. - * - *
    - *     CertPolicyId ::= OBJECT IDENTIFIER
    - * 
    - */ -/** - * CertPolicyId, used in the CertificatePolicies and PolicyMappings - * X509V3 Extensions. - * - *
    - *     CertPolicyId ::= OBJECT IDENTIFIER
    - * 
    - */ -public class CertPolicyId - extends ASN1Object -{ - private ASN1ObjectIdentifier id; - - private CertPolicyId(ASN1ObjectIdentifier id) - { - this.id = id; - } - - public static CertPolicyId getInstance(Object o) - { - if (o instanceof CertPolicyId) - { - return (CertPolicyId)o; - } - else if (o != null) - { - return new CertPolicyId(ASN1ObjectIdentifier.getInstance(o)); - } - - return null; - } - - public String getId() - { - return id.getId(); - } - - public ASN1Primitive toASN1Primitive() - { - return id; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Certificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Certificate.java deleted file mode 100644 index f065e36..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Certificate.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.x500.X500Name; - -/** - * an X509Certificate structure. - *
    - *  Certificate ::= SEQUENCE {
    - *      tbsCertificate          TBSCertificate,
    - *      signatureAlgorithm      AlgorithmIdentifier,
    - *      signature               BIT STRING
    - *  }
    - * 
    - */ -public class Certificate - extends ASN1Object -{ - ASN1Sequence seq; - TBSCertificate tbsCert; - AlgorithmIdentifier sigAlgId; - DERBitString sig; - - public static Certificate getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static Certificate getInstance( - Object obj) - { - if (obj instanceof Certificate) - { - return (Certificate)obj; - } - else if (obj != null) - { - return new Certificate(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private Certificate( - ASN1Sequence seq) - { - this.seq = seq; - - // - // correct x509 certficate - // - if (seq.size() == 3) - { - tbsCert = TBSCertificate.getInstance(seq.getObjectAt(0)); - sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - - sig = DERBitString.getInstance(seq.getObjectAt(2)); - } - else - { - throw new IllegalArgumentException("sequence wrong size for a certificate"); - } - } - - public TBSCertificate getTBSCertificate() - { - return tbsCert; - } - - public ASN1Integer getVersion() - { - return tbsCert.getVersion(); - } - - public int getVersionNumber() - { - return tbsCert.getVersionNumber(); - } - - public ASN1Integer getSerialNumber() - { - return tbsCert.getSerialNumber(); - } - - public X500Name getIssuer() - { - return tbsCert.getIssuer(); - } - - public Time getStartDate() - { - return tbsCert.getStartDate(); - } - - public Time getEndDate() - { - return tbsCert.getEndDate(); - } - - public X500Name getSubject() - { - return tbsCert.getSubject(); - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return tbsCert.getSubjectPublicKeyInfo(); - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return sigAlgId; - } - - public DERBitString getSignature() - { - return sig; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificateList.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificateList.java deleted file mode 100644 index a78d72f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificateList.java +++ /dev/null @@ -1,127 +0,0 @@ - -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.X500Name; - -/** - * PKIX RFC-2459 - * - * The X.509 v2 CRL syntax is as follows. For signature calculation, - * the data that is to be signed is ASN.1 DER encoded. - * - *
    - * CertificateList  ::=  SEQUENCE  {
    - *      tbsCertList          TBSCertList,
    - *      signatureAlgorithm   AlgorithmIdentifier,
    - *      signatureValue       BIT STRING  }
    - * 
    - */ -public class CertificateList - extends ASN1Object -{ - TBSCertList tbsCertList; - AlgorithmIdentifier sigAlgId; - DERBitString sig; - - public static CertificateList getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static CertificateList getInstance( - Object obj) - { - if (obj instanceof CertificateList) - { - return (CertificateList)obj; - } - else if (obj != null) - { - return new CertificateList(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public CertificateList( - ASN1Sequence seq) - { - if (seq.size() == 3) - { - tbsCertList = TBSCertList.getInstance(seq.getObjectAt(0)); - sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - sig = DERBitString.getInstance(seq.getObjectAt(2)); - } - else - { - throw new IllegalArgumentException("sequence wrong size for CertificateList"); - } - } - - public TBSCertList getTBSCertList() - { - return tbsCertList; - } - - public TBSCertList.CRLEntry[] getRevokedCertificates() - { - return tbsCertList.getRevokedCertificates(); - } - - public Enumeration getRevokedCertificateEnumeration() - { - return tbsCertList.getRevokedCertificateEnumeration(); - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return sigAlgId; - } - - public DERBitString getSignature() - { - return sig; - } - - public int getVersionNumber() - { - return tbsCertList.getVersionNumber(); - } - - public X500Name getIssuer() - { - return tbsCertList.getIssuer(); - } - - public Time getThisUpdate() - { - return tbsCertList.getThisUpdate(); - } - - public Time getNextUpdate() - { - return tbsCertList.getNextUpdate(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(tbsCertList); - v.add(sigAlgId); - v.add(sig); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePair.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePair.java deleted file mode 100644 index df7d3b5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePair.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * This class helps to support crossCerfificatePairs in a LDAP directory - * according RFC 2587 - * - *
    - *     crossCertificatePairATTRIBUTE::={
    - *       WITH SYNTAX   CertificatePair
    - *       EQUALITY MATCHING RULE certificatePairExactMatch
    - *       ID joint-iso-ccitt(2) ds(5) attributeType(4) crossCertificatePair(40)}
    - * 
    - * - *
    The forward elements of the crossCertificatePair attribute of a - * CA's directory entry shall be used to store all, except self-issued - * certificates issued to this CA. Optionally, the reverse elements of the - * crossCertificatePair attribute, of a CA's directory entry may contain a - * subset of certificates issued by this CA to other CAs. When both the forward - * and the reverse elements are present in a single attribute value, issuer name - * in one certificate shall match the subject name in the other and vice versa, - * and the subject public key in one certificate shall be capable of verifying - * the digital signature on the other certificate and vice versa. - * - * When a reverse element is present, the forward element value and the reverse - * element value need not be stored in the same attribute value; in other words, - * they can be stored in either a single attribute value or two attribute - * values.
    - * - *
    - *       CertificatePair ::= SEQUENCE {
    - *         forward        [0]    Certificate OPTIONAL,
    - *         reverse        [1]    Certificate OPTIONAL,
    - *         -- at least one of the pair shall be present -- } 
    - * 
    - */ -public class CertificatePair - extends ASN1Object -{ - private Certificate forward; - - private Certificate reverse; - - public static CertificatePair getInstance(Object obj) - { - if (obj == null || obj instanceof CertificatePair) - { - return (CertificatePair)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new CertificatePair((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type CertificatePair: - *

    - *

    -     *       CertificatePair ::= SEQUENCE {
    -     *         forward        [0]    Certificate OPTIONAL,
    -     *         reverse        [1]    Certificate OPTIONAL,
    -     *         -- at least one of the pair shall be present -- }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private CertificatePair(ASN1Sequence seq) - { - if (seq.size() != 1 && seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement()); - if (o.getTagNo() == 0) - { - forward = Certificate.getInstance(o, true); - } - else if (o.getTagNo() == 1) - { - reverse = Certificate.getInstance(o, true); - } - else - { - throw new IllegalArgumentException("Bad tag number: " - + o.getTagNo()); - } - } - } - - /** - * Constructor from a given details. - * - * @param forward Certificates issued to this CA. - * @param reverse Certificates issued by this CA to other CAs. - */ - public CertificatePair(Certificate forward, Certificate reverse) - { - this.forward = forward; - this.reverse = reverse; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *       CertificatePair ::= SEQUENCE {
    -     *         forward        [0]    Certificate OPTIONAL,
    -     *         reverse        [1]    Certificate OPTIONAL,
    -     *         -- at least one of the pair shall be present -- }
    -     * 
    - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - - if (forward != null) - { - vec.add(new DERTaggedObject(0, forward)); - } - if (reverse != null) - { - vec.add(new DERTaggedObject(1, reverse)); - } - - return new DERSequence(vec); - } - - /** - * @return Returns the forward. - */ - public Certificate getForward() - { - return forward; - } - - /** - * @return Returns the reverse. - */ - public Certificate getReverse() - { - return reverse; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePolicies.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePolicies.java deleted file mode 100644 index 5d22cf8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/CertificatePolicies.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class CertificatePolicies - extends ASN1Object -{ - private final PolicyInformation[] policyInformation; - - public static CertificatePolicies getInstance( - Object obj) - { - if (obj instanceof CertificatePolicies) - { - return (CertificatePolicies)obj; - } - - if (obj != null) - { - return new CertificatePolicies(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static CertificatePolicies getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * Construct a CertificatePolicies object containing one PolicyInformation. - * - * @param name the name to be contained. - */ - public CertificatePolicies( - PolicyInformation name) - { - this.policyInformation = new PolicyInformation[] { name }; - } - - public CertificatePolicies( - PolicyInformation[] policyInformation) - { - this.policyInformation = policyInformation; - } - - private CertificatePolicies( - ASN1Sequence seq) - { - this.policyInformation = new PolicyInformation[seq.size()]; - - for (int i = 0; i != seq.size(); i++) - { - policyInformation[i] = PolicyInformation.getInstance(seq.getObjectAt(i)); - } - } - - public PolicyInformation[] getPolicyInformation() - { - PolicyInformation[] tmp = new PolicyInformation[policyInformation.length]; - - System.arraycopy(policyInformation, 0, tmp, 0, policyInformation.length); - - return tmp; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * CertificatePolicies ::= SEQUENCE SIZE {1..MAX} OF PolicyInformation
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(policyInformation); - } - - public String toString() - { - String p = null; - for (int i = 0; i < policyInformation.length; i++) - { - if (p != null) - { - p += ", "; - } - p += policyInformation[i]; - } - - return "CertificatePolicies: " + p; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DSAParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DSAParameter.java deleted file mode 100644 index 0b04edd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DSAParameter.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class DSAParameter - extends ASN1Object -{ - ASN1Integer p, q, g; - - public static DSAParameter getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static DSAParameter getInstance( - Object obj) - { - if (obj instanceof DSAParameter) - { - return (DSAParameter)obj; - } - - if(obj != null) - { - return new DSAParameter(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DSAParameter( - BigInteger p, - BigInteger q, - BigInteger g) - { - this.p = new ASN1Integer(p); - this.q = new ASN1Integer(q); - this.g = new ASN1Integer(g); - } - - private DSAParameter( - ASN1Sequence seq) - { - if (seq.size() != 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - Enumeration e = seq.getObjects(); - - p = ASN1Integer.getInstance(e.nextElement()); - q = ASN1Integer.getInstance(e.nextElement()); - g = ASN1Integer.getInstance(e.nextElement()); - } - - public BigInteger getP() - { - return p.getPositiveValue(); - } - - public BigInteger getQ() - { - return q.getPositiveValue(); - } - - public BigInteger getG() - { - return g.getPositiveValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(p); - v.add(q); - v.add(g); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DigestInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DigestInfo.java deleted file mode 100644 index 13bb5f5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DigestInfo.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; - -/** - * The DigestInfo object. - *
    - * DigestInfo::=SEQUENCE{
    - *          digestAlgorithm  AlgorithmIdentifier,
    - *          digest OCTET STRING }
    - * 
    - */ -public class DigestInfo - extends ASN1Object -{ - private byte[] digest; - private AlgorithmIdentifier algId; - - public static DigestInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static DigestInfo getInstance( - Object obj) - { - if (obj instanceof DigestInfo) - { - return (DigestInfo)obj; - } - else if (obj != null) - { - return new DigestInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public DigestInfo( - AlgorithmIdentifier algId, - byte[] digest) - { - this.digest = digest; - this.algId = algId; - } - - public DigestInfo( - ASN1Sequence obj) - { - Enumeration e = obj.getObjects(); - - algId = AlgorithmIdentifier.getInstance(e.nextElement()); - digest = ASN1OctetString.getInstance(e.nextElement()).getOctets(); - } - - public AlgorithmIdentifier getAlgorithmId() - { - return algId; - } - - public byte[] getDigest() - { - return digest; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algId); - v.add(new DEROctetString(digest)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DisplayText.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DisplayText.java deleted file mode 100644 index 1f6dda0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DisplayText.java +++ /dev/null @@ -1,165 +0,0 @@ - -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1String; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBMPString; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERUTF8String; -import org.bc.asn1.DERVisibleString; - -/** - * DisplayText class, used in - * CertificatePolicies X509 V3 extensions (in policy qualifiers). - * - *

    It stores a string in a chosen encoding. - *

    - * DisplayText ::= CHOICE {
    - *      ia5String        IA5String      (SIZE (1..200)),
    - *      visibleString    VisibleString  (SIZE (1..200)),
    - *      bmpString        BMPString      (SIZE (1..200)),
    - *      utf8String       UTF8String     (SIZE (1..200)) }
    - * 
    - * @see PolicyQualifierInfo - * @see PolicyInformation - */ -public class DisplayText - extends ASN1Object - implements ASN1Choice -{ - /** - * Constant corresponding to ia5String encoding. - * - */ - public static final int CONTENT_TYPE_IA5STRING = 0; - /** - * Constant corresponding to bmpString encoding. - * - */ - public static final int CONTENT_TYPE_BMPSTRING = 1; - /** - * Constant corresponding to utf8String encoding. - * - */ - public static final int CONTENT_TYPE_UTF8STRING = 2; - /** - * Constant corresponding to visibleString encoding. - * - */ - public static final int CONTENT_TYPE_VISIBLESTRING = 3; - - /** - * Describe constant DISPLAY_TEXT_MAXIMUM_SIZE here. - * - */ - public static final int DISPLAY_TEXT_MAXIMUM_SIZE = 200; - - int contentType; - ASN1String contents; - - /** - * Creates a new DisplayText instance. - * - * @param type the desired encoding type for the text. - * @param text the text to store. Strings longer than 200 - * characters are truncated. - */ - public DisplayText(int type, String text) - { - if (text.length() > DISPLAY_TEXT_MAXIMUM_SIZE) - { - // RFC3280 limits these strings to 200 chars - // truncate the string - text = text.substring (0, DISPLAY_TEXT_MAXIMUM_SIZE); - } - - contentType = type; - switch (type) - { - case CONTENT_TYPE_IA5STRING: - contents = new DERIA5String(text); - break; - case CONTENT_TYPE_UTF8STRING: - contents = new DERUTF8String(text); - break; - case CONTENT_TYPE_VISIBLESTRING: - contents = new DERVisibleString(text); - break; - case CONTENT_TYPE_BMPSTRING: - contents = new DERBMPString(text); - break; - default: - contents = new DERUTF8String(text); - break; - } - } - - /** - * Creates a new DisplayText instance. - * - * @param text the text to encapsulate. Strings longer than 200 - * characters are truncated. - */ - public DisplayText(String text) - { - // by default use UTF8String - if (text.length() > DISPLAY_TEXT_MAXIMUM_SIZE) - { - text = text.substring(0, DISPLAY_TEXT_MAXIMUM_SIZE); - } - - contentType = CONTENT_TYPE_UTF8STRING; - contents = new DERUTF8String(text); - } - - /** - * Creates a new DisplayText instance. - *

    Useful when reading back a DisplayText class - * from it's ASN1Encodable/DEREncodable form. - * - * @param de a DEREncodable instance. - */ - private DisplayText(ASN1String de) - { - contents = de; - } - - public static DisplayText getInstance(Object obj) - { - if (obj instanceof ASN1String) - { - return new DisplayText((ASN1String)obj); - } - else if (obj == null || obj instanceof DisplayText) - { - return (DisplayText)obj; - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - public static DisplayText getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - public ASN1Primitive toASN1Primitive() - { - return (ASN1Primitive)contents; - } - - /** - * Returns the stored String object. - * - * @return the stored text as a String. - */ - public String getString() - { - return contents.getString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPoint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPoint.java deleted file mode 100644 index 4baf52d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPoint.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * The DistributionPoint object. - *

    - * DistributionPoint ::= SEQUENCE {
    - *      distributionPoint [0] DistributionPointName OPTIONAL,
    - *      reasons           [1] ReasonFlags OPTIONAL,
    - *      cRLIssuer         [2] GeneralNames OPTIONAL
    - * }
    - * 
    - */ -public class DistributionPoint - extends ASN1Object -{ - DistributionPointName distributionPoint; - ReasonFlags reasons; - GeneralNames cRLIssuer; - - public static DistributionPoint getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static DistributionPoint getInstance( - Object obj) - { - if(obj == null || obj instanceof DistributionPoint) - { - return (DistributionPoint)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new DistributionPoint((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid DistributionPoint: " + obj.getClass().getName()); - } - - public DistributionPoint( - ASN1Sequence seq) - { - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject t = ASN1TaggedObject.getInstance(seq.getObjectAt(i)); - switch (t.getTagNo()) - { - case 0: - distributionPoint = DistributionPointName.getInstance(t, true); - break; - case 1: - reasons = new ReasonFlags(DERBitString.getInstance(t, false)); - break; - case 2: - cRLIssuer = GeneralNames.getInstance(t, false); - } - } - } - - public DistributionPoint( - DistributionPointName distributionPoint, - ReasonFlags reasons, - GeneralNames cRLIssuer) - { - this.distributionPoint = distributionPoint; - this.reasons = reasons; - this.cRLIssuer = cRLIssuer; - } - - public DistributionPointName getDistributionPoint() - { - return distributionPoint; - } - - public ReasonFlags getReasons() - { - return reasons; - } - - public GeneralNames getCRLIssuer() - { - return cRLIssuer; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (distributionPoint != null) - { - // - // as this is a CHOICE it must be explicitly tagged - // - v.add(new DERTaggedObject(0, distributionPoint)); - } - - if (reasons != null) - { - v.add(new DERTaggedObject(false, 1, reasons)); - } - - if (cRLIssuer != null) - { - v.add(new DERTaggedObject(false, 2, cRLIssuer)); - } - - return new DERSequence(v); - } - - public String toString() - { - String sep = System.getProperty("line.separator"); - StringBuffer buf = new StringBuffer(); - buf.append("DistributionPoint: ["); - buf.append(sep); - if (distributionPoint != null) - { - appendObject(buf, sep, "distributionPoint", distributionPoint.toString()); - } - if (reasons != null) - { - appendObject(buf, sep, "reasons", reasons.toString()); - } - if (cRLIssuer != null) - { - appendObject(buf, sep, "cRLIssuer", cRLIssuer.toString()); - } - buf.append("]"); - buf.append(sep); - return buf.toString(); - } - - private void appendObject(StringBuffer buf, String sep, String name, String value) - { - String indent = " "; - - buf.append(indent); - buf.append(name); - buf.append(":"); - buf.append(sep); - buf.append(indent); - buf.append(indent); - buf.append(value); - buf.append(sep); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPointName.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPointName.java deleted file mode 100644 index be852cd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/DistributionPointName.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -/** - * The DistributionPointName object. - *
    - * DistributionPointName ::= CHOICE {
    - *     fullName                 [0] GeneralNames,
    - *     nameRelativeToCRLIssuer  [1] RDN
    - * }
    - * 
    - */ -public class DistributionPointName - extends ASN1Object - implements ASN1Choice -{ - ASN1Encodable name; - int type; - - public static final int FULL_NAME = 0; - public static final int NAME_RELATIVE_TO_CRL_ISSUER = 1; - - public static DistributionPointName getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1TaggedObject.getInstance(obj, true)); - } - - public static DistributionPointName getInstance( - Object obj) - { - if (obj == null || obj instanceof DistributionPointName) - { - return (DistributionPointName)obj; - } - else if (obj instanceof ASN1TaggedObject) - { - return new DistributionPointName((ASN1TaggedObject)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public DistributionPointName( - int type, - ASN1Encodable name) - { - this.type = type; - this.name = name; - } - - public DistributionPointName( - GeneralNames name) - { - this(FULL_NAME, name); - } - - /** - * Return the tag number applying to the underlying choice. - * - * @return the tag number for this point name. - */ - public int getType() - { - return this.type; - } - - /** - * Return the tagged object inside the distribution point name. - * - * @return the underlying choice item. - */ - public ASN1Encodable getName() - { - return (ASN1Encodable)name; - } - - public DistributionPointName( - ASN1TaggedObject obj) - { - this.type = obj.getTagNo(); - - if (type == 0) - { - this.name = GeneralNames.getInstance(obj, false); - } - else - { - this.name = ASN1Set.getInstance(obj, false); - } - } - - public ASN1Primitive toASN1Primitive() - { - return new DERTaggedObject(false, type, name); - } - - public String toString() - { - String sep = System.getProperty("line.separator"); - StringBuffer buf = new StringBuffer(); - buf.append("DistributionPointName: ["); - buf.append(sep); - if (type == FULL_NAME) - { - appendObject(buf, sep, "fullName", name.toString()); - } - else - { - appendObject(buf, sep, "nameRelativeToCRLIssuer", name.toString()); - } - buf.append("]"); - buf.append(sep); - return buf.toString(); - } - - private void appendObject(StringBuffer buf, String sep, String name, String value) - { - String indent = " "; - - buf.append(indent); - buf.append(name); - buf.append(":"); - buf.append(sep); - buf.append(indent); - buf.append(indent); - buf.append(value); - buf.append(sep); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtendedKeyUsage.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtendedKeyUsage.java deleted file mode 100644 index a9f9d08..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtendedKeyUsage.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -/** - * The extendedKeyUsage object. - *
    - *      extendedKeyUsage ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
    - * 
    - */ -public class ExtendedKeyUsage - extends ASN1Object -{ - Hashtable usageTable = new Hashtable(); - ASN1Sequence seq; - - public static ExtendedKeyUsage getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static ExtendedKeyUsage getInstance( - Object obj) - { - if (obj instanceof ExtendedKeyUsage) - { - return (ExtendedKeyUsage)obj; - } - else if (obj != null) - { - return new ExtendedKeyUsage(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static ExtendedKeyUsage fromExtensions(Extensions extensions) - { - return ExtendedKeyUsage.getInstance(extensions.getExtensionParsedValue(Extension.extendedKeyUsage)); - } - - public ExtendedKeyUsage( - KeyPurposeId usage) - { - this.seq = new DERSequence(usage); - - this.usageTable.put(usage, usage); - } - - private ExtendedKeyUsage( - ASN1Sequence seq) - { - this.seq = seq; - - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Encodable o = (ASN1Encodable)e.nextElement(); - if (!(o.toASN1Primitive() instanceof ASN1ObjectIdentifier)) - { - throw new IllegalArgumentException("Only ASN1ObjectIdentifiers allowed in ExtendedKeyUsage."); - } - this.usageTable.put(o, o); - } - } - - public ExtendedKeyUsage( - KeyPurposeId[] usages) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - for (int i = 0; i != usages.length; i++) - { - v.add(usages[i]); - this.usageTable.put(usages[i], usages[i]); - } - - this.seq = new DERSequence(v); - } - - /** - * @deprecated use KeyPurposeId[] constructor. - */ - public ExtendedKeyUsage( - Vector usages) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - Enumeration e = usages.elements(); - - while (e.hasMoreElements()) - { - ASN1Primitive o = (ASN1Primitive)e.nextElement(); - - v.add(o); - this.usageTable.put(o, o); - } - - this.seq = new DERSequence(v); - } - - public boolean hasKeyPurposeId( - KeyPurposeId keyPurposeId) - { - return (usageTable.get(keyPurposeId) != null); - } - - /** - * Returns all extended key usages. - * The returned vector contains DERObjectIdentifiers. - * @return An array with all key purposes. - */ - public KeyPurposeId[] getUsages() - { - KeyPurposeId[] temp = new KeyPurposeId[seq.size()]; - - int i = 0; - for (Enumeration it = seq.getObjects(); it.hasMoreElements();) - { - temp[i++] = KeyPurposeId.getInstance(it.nextElement()); - } - return temp; - } - - public int size() - { - return usageTable.size(); - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extension.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extension.java deleted file mode 100644 index 9ceebac..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extension.java +++ /dev/null @@ -1,266 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; - -/** - * an object for the elements in the X.509 V3 extension block. - */ -public class Extension -{ - /** - * Subject Directory Attributes - */ - public static final ASN1ObjectIdentifier subjectDirectoryAttributes = new ASN1ObjectIdentifier("2.5.29.9"); - - /** - * Subject Key Identifier - */ - public static final ASN1ObjectIdentifier subjectKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.14"); - - /** - * Key Usage - */ - public static final ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier("2.5.29.15"); - - /** - * Private Key Usage Period - */ - public static final ASN1ObjectIdentifier privateKeyUsagePeriod = new ASN1ObjectIdentifier("2.5.29.16"); - - /** - * Subject Alternative Name - */ - public static final ASN1ObjectIdentifier subjectAlternativeName = new ASN1ObjectIdentifier("2.5.29.17"); - - /** - * Issuer Alternative Name - */ - public static final ASN1ObjectIdentifier issuerAlternativeName = new ASN1ObjectIdentifier("2.5.29.18"); - - /** - * Basic Constraints - */ - public static final ASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier("2.5.29.19"); - - /** - * CRL Number - */ - public static final ASN1ObjectIdentifier cRLNumber = new ASN1ObjectIdentifier("2.5.29.20"); - - /** - * Reason code - */ - public static final ASN1ObjectIdentifier reasonCode = new ASN1ObjectIdentifier("2.5.29.21"); - - /** - * Hold Instruction Code - */ - public static final ASN1ObjectIdentifier instructionCode = new ASN1ObjectIdentifier("2.5.29.23"); - - /** - * Invalidity Date - */ - public static final ASN1ObjectIdentifier invalidityDate = new ASN1ObjectIdentifier("2.5.29.24"); - - /** - * Delta CRL indicator - */ - public static final ASN1ObjectIdentifier deltaCRLIndicator = new ASN1ObjectIdentifier("2.5.29.27"); - - /** - * Issuing Distribution Point - */ - public static final ASN1ObjectIdentifier issuingDistributionPoint = new ASN1ObjectIdentifier("2.5.29.28"); - - /** - * Certificate Issuer - */ - public static final ASN1ObjectIdentifier certificateIssuer = new ASN1ObjectIdentifier("2.5.29.29"); - - /** - * Name Constraints - */ - public static final ASN1ObjectIdentifier nameConstraints = new ASN1ObjectIdentifier("2.5.29.30"); - - /** - * CRL Distribution Points - */ - public static final ASN1ObjectIdentifier cRLDistributionPoints = new ASN1ObjectIdentifier("2.5.29.31"); - - /** - * Certificate Policies - */ - public static final ASN1ObjectIdentifier certificatePolicies = new ASN1ObjectIdentifier("2.5.29.32"); - - /** - * Policy Mappings - */ - public static final ASN1ObjectIdentifier policyMappings = new ASN1ObjectIdentifier("2.5.29.33"); - - /** - * Authority Key Identifier - */ - public static final ASN1ObjectIdentifier authorityKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.35"); - - /** - * Policy Constraints - */ - public static final ASN1ObjectIdentifier policyConstraints = new ASN1ObjectIdentifier("2.5.29.36"); - - /** - * Extended Key Usage - */ - public static final ASN1ObjectIdentifier extendedKeyUsage = new ASN1ObjectIdentifier("2.5.29.37"); - - /** - * Freshest CRL - */ - public static final ASN1ObjectIdentifier freshestCRL = new ASN1ObjectIdentifier("2.5.29.46"); - - /** - * Inhibit Any Policy - */ - public static final ASN1ObjectIdentifier inhibitAnyPolicy = new ASN1ObjectIdentifier("2.5.29.54"); - - /** - * Authority Info Access - */ - public static final ASN1ObjectIdentifier authorityInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.1"); - - /** - * Subject Info Access - */ - public static final ASN1ObjectIdentifier subjectInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.11"); - - /** - * Logo Type - */ - public static final ASN1ObjectIdentifier logoType = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.12"); - - /** - * BiometricInfo - */ - public static final ASN1ObjectIdentifier biometricInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.2"); - - /** - * QCStatements - */ - public static final ASN1ObjectIdentifier qCStatements = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.3"); - - /** - * Audit identity extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier auditIdentity = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.4"); - - /** - * NoRevAvail extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier noRevAvail = new ASN1ObjectIdentifier("2.5.29.56"); - - /** - * TargetInformation extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier targetInformation = new ASN1ObjectIdentifier("2.5.29.55"); - - private ASN1ObjectIdentifier extnId; - - boolean critical; - ASN1OctetString value; - - public Extension( - ASN1ObjectIdentifier extnId, - ASN1Boolean critical, - ASN1OctetString value) - { - this(extnId, critical.isTrue(), value); - } - - public Extension( - ASN1ObjectIdentifier extnId, - boolean critical, - byte[] value) - { - this(extnId, critical, new DEROctetString(value)); - } - - public Extension( - ASN1ObjectIdentifier extnId, - boolean critical, - ASN1OctetString value) - { - this.extnId = extnId; - this.critical = critical; - this.value = value; - } - - public ASN1ObjectIdentifier getExtnId() - { - return extnId; - } - - public boolean isCritical() - { - return critical; - } - - public ASN1OctetString getExtnValue() - { - return value; - } - - public ASN1Encodable getParsedValue() - { - return convertValueToObject(this); - } - - public int hashCode() - { - if (this.isCritical()) - { - return this.getExtnValue().hashCode(); - } - - return ~this.getExtnValue().hashCode(); - } - - public boolean equals( - Object o) - { - if (!(o instanceof Extension)) - { - return false; - } - - Extension other = (Extension)o; - - return other.getExtnValue().equals(this.getExtnValue()) - && (other.isCritical() == this.isCritical()); - } - - /** - * Convert the value of the passed in extension to an object - * @param ext the extension to parse - * @return the object the value string contains - * @exception IllegalArgumentException if conversion is not possible - */ - private static ASN1Primitive convertValueToObject( - Extension ext) - throws IllegalArgumentException - { - try - { - return ASN1Primitive.fromByteArray(ext.getExtnValue().getOctets()); - } - catch (IOException e) - { - throw new IllegalArgumentException("can't convert extension: " + e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extensions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extensions.java deleted file mode 100644 index 840e9a3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Extensions.java +++ /dev/null @@ -1,245 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class Extensions - extends ASN1Object -{ - private Hashtable extensions = new Hashtable(); - private Vector ordering = new Vector(); - - public static Extensions getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static Extensions getInstance( - Object obj) - { - if (obj instanceof Extensions) - { - return (Extensions)obj; - } - else if (obj != null) - { - return new Extensions(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from ASN1Sequence. - * - * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString) - */ - private Extensions( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Sequence s = ASN1Sequence.getInstance(e.nextElement()); - - if (s.size() == 3) - { - extensions.put(s.getObjectAt(0), new Extension(ASN1ObjectIdentifier.getInstance(s.getObjectAt(0)), ASN1Boolean.getInstance(s.getObjectAt(1)), ASN1OctetString.getInstance(s.getObjectAt(2)))); - } - else if (s.size() == 2) - { - extensions.put(s.getObjectAt(0), new Extension(ASN1ObjectIdentifier.getInstance(s.getObjectAt(0)), false, ASN1OctetString.getInstance(s.getObjectAt(1)))); - } - else - { - throw new IllegalArgumentException("Bad sequence size: " + s.size()); - } - - ordering.addElement(s.getObjectAt(0)); - } - } - - /** - * Base Constructor - * - * @param extension a single extension. - */ - public Extensions( - Extension extension) - { - this.ordering.addElement(extension.getExtnId()); - this.extensions.put(extension.getExtnId(), extension); - } - - /** - * Base Constructor - * - * @param extensions an array of extensions. - */ - public Extensions( - Extension[] extensions) - { - for (int i = 0; i != extensions.length; i++) - { - Extension ext = extensions[i]; - - this.ordering.addElement(ext.getExtnId()); - this.extensions.put(ext.getExtnId(), ext); - } - } - - /** - * return an Enumeration of the extension field's object ids. - */ - public Enumeration oids() - { - return ordering.elements(); - } - - /** - * return the extension represented by the object identifier - * passed in. - * - * @return the extension if it's present, null otherwise. - */ - public Extension getExtension( - ASN1ObjectIdentifier oid) - { - return (Extension)extensions.get(oid); - } - - /** - * return the parsed value of the extension represented by the object identifier - * passed in. - * - * @return the parsed value of the extension if it's present, null otherwise. - */ - public ASN1Encodable getExtensionParsedValue(ASN1ObjectIdentifier oid) - { - Extension ext = this.getExtension(oid); - - if (ext != null) - { - return ext.getParsedValue(); - } - - return null; - } - - /** - *
    -     *     Extensions        ::=   SEQUENCE SIZE (1..MAX) OF Extension
    -     *
    -     *     Extension         ::=   SEQUENCE {
    -     *        extnId            EXTENSION.&id ({ExtensionSet}),
    -     *        critical          BOOLEAN DEFAULT FALSE,
    -     *        extnValue         OCTET STRING }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - Enumeration e = ordering.elements(); - - while (e.hasMoreElements()) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); - Extension ext = (Extension)extensions.get(oid); - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oid); - - if (ext.isCritical()) - { - v.add(ASN1Boolean.getInstance(true)); - } - - v.add(ext.getExtnValue()); - - vec.add(new DERSequence(v)); - } - - return new DERSequence(vec); - } - - public boolean equivalent( - Extensions other) - { - if (extensions.size() != other.extensions.size()) - { - return false; - } - - Enumeration e1 = extensions.keys(); - - while (e1.hasMoreElements()) - { - Object key = e1.nextElement(); - - if (!extensions.get(key).equals(other.extensions.get(key))) - { - return false; - } - } - - return true; - } - - public ASN1ObjectIdentifier[] getExtensionOIDs() - { - return toOidArray(ordering); - } - - public ASN1ObjectIdentifier[] getNonCriticalExtensionOIDs() - { - return getExtensionOIDs(false); - } - - public ASN1ObjectIdentifier[] getCriticalExtensionOIDs() - { - return getExtensionOIDs(true); - } - - private ASN1ObjectIdentifier[] getExtensionOIDs(boolean isCritical) - { - Vector oidVec = new Vector(); - - for (int i = 0; i != ordering.size(); i++) - { - Object oid = ordering.elementAt(i); - - if (((Extension)extensions.get(oid)).isCritical() == isCritical) - { - oidVec.addElement(oid); - } - } - - return toOidArray(oidVec); - } - - private ASN1ObjectIdentifier[] toOidArray(Vector oidVec) - { - ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[oidVec.size()]; - - for (int i = 0; i != oids.length; i++) - { - oids[i] = (ASN1ObjectIdentifier)oidVec.elementAt(i); - } - return oids; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtensionsGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtensionsGenerator.java deleted file mode 100644 index 0537f66..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ExtensionsGenerator.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DEROctetString; - -/** - * Generator for X.509 extensions - */ -public class ExtensionsGenerator -{ - private Hashtable extensions = new Hashtable(); - private Vector extOrdering = new Vector(); - - /** - * Reset the generator - */ - public void reset() - { - extensions = new Hashtable(); - extOrdering = new Vector(); - } - - /** - * Add an extension with the given oid and the passed in value to be included - * in the OCTET STRING associated with the extension. - * - * @param oid OID for the extension. - * @param critical true if critical, false otherwise. - * @param value the ASN.1 object to be included in the extension. - */ - public void addExtension( - ASN1ObjectIdentifier oid, - boolean critical, - ASN1Encodable value) - throws IOException - { - this.addExtension(oid, critical, value.toASN1Primitive().getEncoded(ASN1Encoding.DER)); - } - - /** - * Add an extension with the given oid and the passed in byte array to be wrapped in the - * OCTET STRING associated with the extension. - * - * @param oid OID for the extension. - * @param critical true if critical, false otherwise. - * @param value the byte array to be wrapped. - */ - public void addExtension( - ASN1ObjectIdentifier oid, - boolean critical, - byte[] value) - { - if (extensions.containsKey(oid)) - { - throw new IllegalArgumentException("extension " + oid + " already added"); - } - - extOrdering.addElement(oid); - extensions.put(oid, new Extension(oid, critical, new DEROctetString(value))); - } - - /** - * Return true if there are no extension present in this generator. - * - * @return true if empty, false otherwise - */ - public boolean isEmpty() - { - return extOrdering.isEmpty(); - } - - /** - * Generate an Extensions object based on the current state of the generator. - * - * @return an X09Extensions object. - */ - public Extensions generate() - { - Extension[] exts = new Extension[extOrdering.size()]; - - for (int i = 0; i != extOrdering.size(); i++) - { - exts[i] = (Extension)extensions.get(extOrdering.elementAt(i)); - } - - return new Extensions(exts); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralName.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralName.java deleted file mode 100644 index 85098ae..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralName.java +++ /dev/null @@ -1,439 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; -import java.util.StringTokenizer; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; -import org.bc.util.IPAddress; - -/** - * The GeneralName object. - *
    - * GeneralName ::= CHOICE {
    - *      otherName                       [0]     OtherName,
    - *      rfc822Name                      [1]     IA5String,
    - *      dNSName                         [2]     IA5String,
    - *      x400Address                     [3]     ORAddress,
    - *      directoryName                   [4]     Name,
    - *      ediPartyName                    [5]     EDIPartyName,
    - *      uniformResourceIdentifier       [6]     IA5String,
    - *      iPAddress                       [7]     OCTET STRING,
    - *      registeredID                    [8]     OBJECT IDENTIFIER}
    - *
    - * OtherName ::= SEQUENCE {
    - *      type-id    OBJECT IDENTIFIER,
    - *      value      [0] EXPLICIT ANY DEFINED BY type-id }
    - *
    - * EDIPartyName ::= SEQUENCE {
    - *      nameAssigner            [0]     DirectoryString OPTIONAL,
    - *      partyName               [1]     DirectoryString }
    - * 
    - * Name ::= CHOICE { RDNSequence }
    - * 
    - */ -public class GeneralName - extends ASN1Object - implements ASN1Choice -{ - public static final int otherName = 0; - public static final int rfc822Name = 1; - public static final int dNSName = 2; - public static final int x400Address = 3; - public static final int directoryName = 4; - public static final int ediPartyName = 5; - public static final int uniformResourceIdentifier = 6; - public static final int iPAddress = 7; - public static final int registeredID = 8; - - private ASN1Encodable obj; - private int tag; - - /** - * @deprecated use X500Name constructor. - * @param dirName - */ - public GeneralName( - X509Name dirName) - { - this.obj = X500Name.getInstance(dirName); - this.tag = 4; - } - - public GeneralName( - X500Name dirName) - { - this.obj = dirName; - this.tag = 4; - } - - /** - * When the subjectAltName extension contains an Internet mail address, - * the address MUST be included as an rfc822Name. The format of an - * rfc822Name is an "addr-spec" as defined in RFC 822 [RFC 822]. - * - * When the subjectAltName extension contains a domain name service - * label, the domain name MUST be stored in the dNSName (an IA5String). - * The name MUST be in the "preferred name syntax," as specified by RFC - * 1034 [RFC 1034]. - * - * When the subjectAltName extension contains a URI, the name MUST be - * stored in the uniformResourceIdentifier (an IA5String). The name MUST - * be a non-relative URL, and MUST follow the URL syntax and encoding - * rules specified in [RFC 1738]. The name must include both a scheme - * (e.g., "http" or "ftp") and a scheme-specific-part. The scheme- - * specific-part must include a fully qualified domain name or IP - * address as the host. - * - * When the subjectAltName extension contains a iPAddress, the address - * MUST be stored in the octet string in "network byte order," as - * specified in RFC 791 [RFC 791]. The least significant bit (LSB) of - * each octet is the LSB of the corresponding byte in the network - * address. For IP Version 4, as specified in RFC 791, the octet string - * MUST contain exactly four octets. For IP Version 6, as specified in - * RFC 1883, the octet string MUST contain exactly sixteen octets [RFC - * 1883]. - */ - public GeneralName( - int tag, - ASN1Encodable name) - { - this.obj = name; - this.tag = tag; - } - - /** - * Create a GeneralName for the given tag from the passed in String. - *

    - * This constructor can handle: - *

      - *
    • rfc822Name - *
    • iPAddress - *
    • directoryName - *
    • dNSName - *
    • uniformResourceIdentifier - *
    • registeredID - *
    - * For x400Address, otherName and ediPartyName there is no common string - * format defined. - *

    - * Note: A directory name can be encoded in different ways into a byte - * representation. Be aware of this if the byte representation is used for - * comparing results. - * - * @param tag tag number - * @param name string representation of name - * @throws IllegalArgumentException if the string encoding is not correct or * not supported. - */ - public GeneralName( - int tag, - String name) - { - this.tag = tag; - - if (tag == rfc822Name || tag == dNSName || tag == uniformResourceIdentifier) - { - this.obj = new DERIA5String(name); - } - else if (tag == registeredID) - { - this.obj = new ASN1ObjectIdentifier(name); - } - else if (tag == directoryName) - { - this.obj = new X500Name(name); - } - else if (tag == iPAddress) - { - byte[] enc = toGeneralNameEncoding(name); - if (enc != null) - { - this.obj = new DEROctetString(enc); - } - else - { - throw new IllegalArgumentException("IP Address is invalid"); - } - } - else - { - throw new IllegalArgumentException("can't process String for tag: " + tag); - } - } - - public static GeneralName getInstance( - Object obj) - { - if (obj == null || obj instanceof GeneralName) - { - return (GeneralName)obj; - } - - if (obj instanceof ASN1TaggedObject) - { - ASN1TaggedObject tagObj = (ASN1TaggedObject)obj; - int tag = tagObj.getTagNo(); - - switch (tag) - { - case otherName: - return new GeneralName(tag, ASN1Sequence.getInstance(tagObj, false)); - case rfc822Name: - return new GeneralName(tag, DERIA5String.getInstance(tagObj, false)); - case dNSName: - return new GeneralName(tag, DERIA5String.getInstance(tagObj, false)); - case x400Address: - throw new IllegalArgumentException("unknown tag: " + tag); - case directoryName: - return new GeneralName(tag, X500Name.getInstance(tagObj, true)); - case ediPartyName: - return new GeneralName(tag, ASN1Sequence.getInstance(tagObj, false)); - case uniformResourceIdentifier: - return new GeneralName(tag, DERIA5String.getInstance(tagObj, false)); - case iPAddress: - return new GeneralName(tag, ASN1OctetString.getInstance(tagObj, false)); - case registeredID: - return new GeneralName(tag, ASN1ObjectIdentifier.getInstance(tagObj, false)); - } - } - - if (obj instanceof byte[]) - { - try - { - return getInstance(ASN1Primitive.fromByteArray((byte[])obj)); - } - catch (IOException e) - { - throw new IllegalArgumentException("unable to parse encoded general name"); - } - } - - throw new IllegalArgumentException("unknown object in getInstance: " + obj.getClass().getName()); - } - - public static GeneralName getInstance( - ASN1TaggedObject tagObj, - boolean explicit) - { - return GeneralName.getInstance(ASN1TaggedObject.getInstance(tagObj, true)); - } - - public int getTagNo() - { - return tag; - } - - public ASN1Encodable getName() - { - return obj; - } - - public String toString() - { - StringBuffer buf = new StringBuffer(); - - buf.append(tag); - buf.append(": "); - switch (tag) - { - case rfc822Name: - case dNSName: - case uniformResourceIdentifier: - buf.append(DERIA5String.getInstance(obj).getString()); - break; - case directoryName: - buf.append(X500Name.getInstance(obj).toString()); - break; - default: - buf.append(obj.toString()); - } - return buf.toString(); - } - - private byte[] toGeneralNameEncoding(String ip) - { - if (IPAddress.isValidIPv6WithNetmask(ip) || IPAddress.isValidIPv6(ip)) - { - int slashIndex = ip.indexOf('/'); - - if (slashIndex < 0) - { - byte[] addr = new byte[16]; - int[] parsedIp = parseIPv6(ip); - copyInts(parsedIp, addr, 0); - - return addr; - } - else - { - byte[] addr = new byte[32]; - int[] parsedIp = parseIPv6(ip.substring(0, slashIndex)); - copyInts(parsedIp, addr, 0); - String mask = ip.substring(slashIndex + 1); - if (mask.indexOf(':') > 0) - { - parsedIp = parseIPv6(mask); - } - else - { - parsedIp = parseMask(mask); - } - copyInts(parsedIp, addr, 16); - - return addr; - } - } - else if (IPAddress.isValidIPv4WithNetmask(ip) || IPAddress.isValidIPv4(ip)) - { - int slashIndex = ip.indexOf('/'); - - if (slashIndex < 0) - { - byte[] addr = new byte[4]; - - parseIPv4(ip, addr, 0); - - return addr; - } - else - { - byte[] addr = new byte[8]; - - parseIPv4(ip.substring(0, slashIndex), addr, 0); - - String mask = ip.substring(slashIndex + 1); - if (mask.indexOf('.') > 0) - { - parseIPv4(mask, addr, 4); - } - else - { - parseIPv4Mask(mask, addr, 4); - } - - return addr; - } - } - - return null; - } - - private void parseIPv4Mask(String mask, byte[] addr, int offset) - { - int maskVal = Integer.parseInt(mask); - - for (int i = 0; i != maskVal; i++) - { - addr[(i / 8) + offset] |= 1 << (7 - (i % 8)); - } - } - - private void parseIPv4(String ip, byte[] addr, int offset) - { - StringTokenizer sTok = new StringTokenizer(ip, "./"); - int index = 0; - - while (sTok.hasMoreTokens()) - { - addr[offset + index++] = (byte)Integer.parseInt(sTok.nextToken()); - } - } - - private int[] parseMask(String mask) - { - int[] res = new int[8]; - int maskVal = Integer.parseInt(mask); - - for (int i = 0; i != maskVal; i++) - { - res[i / 16] |= 1 << (15 - (i % 16)); - } - return res; - } - - private void copyInts(int[] parsedIp, byte[] addr, int offSet) - { - for (int i = 0; i != parsedIp.length; i++) - { - addr[(i * 2) + offSet] = (byte)(parsedIp[i] >> 8); - addr[(i * 2 + 1) + offSet] = (byte)parsedIp[i]; - } - } - - private int[] parseIPv6(String ip) - { - StringTokenizer sTok = new StringTokenizer(ip, ":", true); - int index = 0; - int[] val = new int[8]; - - if (ip.charAt(0) == ':' && ip.charAt(1) == ':') - { - sTok.nextToken(); // skip the first one - } - - int doubleColon = -1; - - while (sTok.hasMoreTokens()) - { - String e = sTok.nextToken(); - - if (e.equals(":")) - { - doubleColon = index; - val[index++] = 0; - } - else - { - if (e.indexOf('.') < 0) - { - val[index++] = Integer.parseInt(e, 16); - if (sTok.hasMoreTokens()) - { - sTok.nextToken(); - } - } - else - { - StringTokenizer eTok = new StringTokenizer(e, "."); - - val[index++] = (Integer.parseInt(eTok.nextToken()) << 8) | Integer.parseInt(eTok.nextToken()); - val[index++] = (Integer.parseInt(eTok.nextToken()) << 8) | Integer.parseInt(eTok.nextToken()); - } - } - } - - if (index != val.length) - { - System.arraycopy(val, doubleColon, val, val.length - (index - doubleColon), index - doubleColon); - for (int i = doubleColon; i != val.length - (index - doubleColon); i++) - { - val[i] = 0; - } - } - - return val; - } - - public ASN1Primitive toASN1Primitive() - { - if (tag == directoryName) // directoryName is explicitly tagged as it is a CHOICE - { - return new DERTaggedObject(true, tag, obj); - } - else - { - return new DERTaggedObject(false, tag, obj); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralNames.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralNames.java deleted file mode 100644 index c4befa4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralNames.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class GeneralNames - extends ASN1Object -{ - private final GeneralName[] names; - - public static GeneralNames getInstance( - Object obj) - { - if (obj instanceof GeneralNames) - { - return (GeneralNames)obj; - } - - if (obj != null) - { - return new GeneralNames(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static GeneralNames getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static GeneralNames fromExtensions(Extensions extensions, ASN1ObjectIdentifier extOID) - { - return GeneralNames.getInstance(extensions.getExtensionParsedValue(extOID)); - } - - /** - * Construct a GeneralNames object containing one GeneralName. - * - * @param name the name to be contained. - */ - public GeneralNames( - GeneralName name) - { - this.names = new GeneralName[] { name }; - } - - - public GeneralNames( - GeneralName[] names) - { - this.names = names; - } - - private GeneralNames( - ASN1Sequence seq) - { - this.names = new GeneralName[seq.size()]; - - for (int i = 0; i != seq.size(); i++) - { - names[i] = GeneralName.getInstance(seq.getObjectAt(i)); - } - } - - public GeneralName[] getNames() - { - GeneralName[] tmp = new GeneralName[names.length]; - - System.arraycopy(names, 0, tmp, 0, names.length); - - return tmp; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    -     * GeneralNames ::= SEQUENCE SIZE {1..MAX} OF GeneralName
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return new DERSequence(names); - } - - public String toString() - { - StringBuffer buf = new StringBuffer(); - String sep = System.getProperty("line.separator"); - - buf.append("GeneralNames:"); - buf.append(sep); - - for (int i = 0; i != names.length; i++) - { - buf.append(" "); - buf.append(names[i]); - buf.append(sep); - } - return buf.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralSubtree.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralSubtree.java deleted file mode 100644 index af805ad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/GeneralSubtree.java +++ /dev/null @@ -1,218 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * Class for containing a restriction object subtrees in NameConstraints. See - * RFC 3280. - * - *
    - *       
    - *       GeneralSubtree ::= SEQUENCE 
    - *       {
    - *         base                    GeneralName,
    - *         minimum         [0]     BaseDistance DEFAULT 0,
    - *         maximum         [1]     BaseDistance OPTIONAL 
    - *       }
    - * 
    - * - * @see org.bc.asn1.x509.NameConstraints - * - */ -public class GeneralSubtree - extends ASN1Object -{ - private static final BigInteger ZERO = BigInteger.valueOf(0); - - private GeneralName base; - - private ASN1Integer minimum; - - private ASN1Integer maximum; - - private GeneralSubtree( - ASN1Sequence seq) - { - base = GeneralName.getInstance(seq.getObjectAt(0)); - - switch (seq.size()) - { - case 1: - break; - case 2: - ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(1)); - switch (o.getTagNo()) - { - case 0: - minimum = ASN1Integer.getInstance(o, false); - break; - case 1: - maximum = ASN1Integer.getInstance(o, false); - break; - default: - throw new IllegalArgumentException("Bad tag number: " - + o.getTagNo()); - } - break; - case 3: - { - { - ASN1TaggedObject oMin = ASN1TaggedObject.getInstance(seq.getObjectAt(1)); - if (oMin.getTagNo() != 0) - { - throw new IllegalArgumentException("Bad tag number for 'minimum': " + oMin.getTagNo()); - } - minimum = ASN1Integer.getInstance(oMin, false); - } - - { - ASN1TaggedObject oMax = ASN1TaggedObject.getInstance(seq.getObjectAt(2)); - if (oMax.getTagNo() != 1) - { - throw new IllegalArgumentException("Bad tag number for 'maximum': " + oMax.getTagNo()); - } - maximum = ASN1Integer.getInstance(oMax, false); - } - - break; - } - default: - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - } - - /** - * Constructor from a given details. - * - * According RFC 3280, the minimum and maximum fields are not used with any - * name forms, thus minimum MUST be zero, and maximum MUST be absent. - *

    - * If minimum is null, zero is assumed, if - * maximum is null, maximum is absent. - * - * @param base - * A restriction. - * @param minimum - * Minimum - * - * @param maximum - * Maximum - */ - public GeneralSubtree( - GeneralName base, - BigInteger minimum, - BigInteger maximum) - { - this.base = base; - if (maximum != null) - { - this.maximum = new ASN1Integer(maximum); - } - if (minimum == null) - { - this.minimum = null; - } - else - { - this.minimum = new ASN1Integer(minimum); - } - } - - public GeneralSubtree(GeneralName base) - { - this(base, null, null); - } - - public static GeneralSubtree getInstance( - ASN1TaggedObject o, - boolean explicit) - { - return new GeneralSubtree(ASN1Sequence.getInstance(o, explicit)); - } - - public static GeneralSubtree getInstance( - Object obj) - { - if (obj == null) - { - return null; - } - - if (obj instanceof GeneralSubtree) - { - return (GeneralSubtree) obj; - } - - return new GeneralSubtree(ASN1Sequence.getInstance(obj)); - } - - public GeneralName getBase() - { - return base; - } - - public BigInteger getMinimum() - { - if (minimum == null) - { - return ZERO; - } - - return minimum.getValue(); - } - - public BigInteger getMaximum() - { - if (maximum == null) - { - return null; - } - - return maximum.getValue(); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - * Returns: - * - *

    -     *       GeneralSubtree ::= SEQUENCE 
    -     *       {
    -     *         base                    GeneralName,
    -     *         minimum         [0]     BaseDistance DEFAULT 0,
    -     *         maximum         [1]     BaseDistance OPTIONAL 
    -     *       }
    -     * 
    - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(base); - - if (minimum != null && !minimum.getValue().equals(ZERO)) - { - v.add(new DERTaggedObject(false, 0, minimum)); - } - - if (maximum != null) - { - v.add(new DERTaggedObject(false, 1, maximum)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Holder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Holder.java deleted file mode 100644 index a375726..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Holder.java +++ /dev/null @@ -1,245 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * The Holder object. - *

    - * For an v2 attribute certificate this is: - * - *

    - *            Holder ::= SEQUENCE {
    - *                  baseCertificateID   [0] IssuerSerial OPTIONAL,
    - *                           -- the issuer and serial number of
    - *                           -- the holder's Public Key Certificate
    - *                  entityName          [1] GeneralNames OPTIONAL,
    - *                           -- the name of the claimant or role
    - *                  objectDigestInfo    [2] ObjectDigestInfo OPTIONAL
    - *                           -- used to directly authenticate the holder,
    - *                           -- for example, an executable
    - *            }
    - * 
    - * - *

    - * For an v1 attribute certificate this is: - * - *

    - *         subject CHOICE {
    - *          baseCertificateID [0] IssuerSerial,
    - *          -- associated with a Public Key Certificate
    - *          subjectName [1] GeneralNames },
    - *          -- associated with a name
    - * 
    - */ -public class Holder - extends ASN1Object -{ - public static final int V1_CERTIFICATE_HOLDER = 0; - public static final int V2_CERTIFICATE_HOLDER = 1; - - IssuerSerial baseCertificateID; - - GeneralNames entityName; - - ObjectDigestInfo objectDigestInfo; - - private int version = V2_CERTIFICATE_HOLDER; - - public static Holder getInstance(Object obj) - { - if (obj instanceof Holder) - { - return (Holder)obj; - } - else if (obj instanceof ASN1TaggedObject) - { - return new Holder(ASN1TaggedObject.getInstance(obj)); - } - else if (obj != null) - { - return new Holder(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor for a holder for an V1 attribute certificate. - * - * @param tagObj The ASN.1 tagged holder object. - */ - private Holder(ASN1TaggedObject tagObj) - { - switch (tagObj.getTagNo()) - { - case 0: - baseCertificateID = IssuerSerial.getInstance(tagObj, false); - break; - case 1: - entityName = GeneralNames.getInstance(tagObj, false); - break; - default: - throw new IllegalArgumentException("unknown tag in Holder"); - } - version = 0; - } - - /** - * Constructor for a holder for an V2 attribute certificate. - * - * @param seq The ASN.1 sequence. - */ - private Holder(ASN1Sequence seq) - { - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject tObj = ASN1TaggedObject.getInstance(seq - .getObjectAt(i)); - - switch (tObj.getTagNo()) - { - case 0: - baseCertificateID = IssuerSerial.getInstance(tObj, false); - break; - case 1: - entityName = GeneralNames.getInstance(tObj, false); - break; - case 2: - objectDigestInfo = ObjectDigestInfo.getInstance(tObj, false); - break; - default: - throw new IllegalArgumentException("unknown tag in Holder"); - } - } - version = 1; - } - - public Holder(IssuerSerial baseCertificateID) - { - this(baseCertificateID, V2_CERTIFICATE_HOLDER); - } - - /** - * Constructs a holder from a IssuerSerial for a V1 or V2 certificate. - * . - * @param baseCertificateID The IssuerSerial. - * @param version The version of the attribute certificate. - */ - public Holder(IssuerSerial baseCertificateID, int version) - { - this.baseCertificateID = baseCertificateID; - this.version = version; - } - - /** - * Returns 1 for V2 attribute certificates or 0 for V1 attribute - * certificates. - * @return The version of the attribute certificate. - */ - public int getVersion() - { - return version; - } - - /** - * Constructs a holder with an entityName for V2 attribute certificates. - * - * @param entityName The entity or subject name. - */ - public Holder(GeneralNames entityName) - { - this(entityName, V2_CERTIFICATE_HOLDER); - } - - /** - * Constructs a holder with an entityName for V2 attribute certificates or - * with a subjectName for V1 attribute certificates. - * - * @param entityName The entity or subject name. - * @param version The version of the attribute certificate. - */ - public Holder(GeneralNames entityName, int version) - { - this.entityName = entityName; - this.version = version; - } - - /** - * Constructs a holder from an object digest info. - * - * @param objectDigestInfo The object digest info object. - */ - public Holder(ObjectDigestInfo objectDigestInfo) - { - this.objectDigestInfo = objectDigestInfo; - } - - public IssuerSerial getBaseCertificateID() - { - return baseCertificateID; - } - - /** - * Returns the entityName for an V2 attribute certificate or the subjectName - * for an V1 attribute certificate. - * - * @return The entityname or subjectname. - */ - public GeneralNames getEntityName() - { - return entityName; - } - - public ObjectDigestInfo getObjectDigestInfo() - { - return objectDigestInfo; - } - - public ASN1Primitive toASN1Primitive() - { - if (version == 1) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (baseCertificateID != null) - { - v.add(new DERTaggedObject(false, 0, baseCertificateID)); - } - - if (entityName != null) - { - v.add(new DERTaggedObject(false, 1, entityName)); - } - - if (objectDigestInfo != null) - { - v.add(new DERTaggedObject(false, 2, objectDigestInfo)); - } - - return new DERSequence(v); - } - else - { - if (entityName != null) - { - return new DERTaggedObject(false, 1, entityName); - } - else - { - return new DERTaggedObject(false, 0, baseCertificateID); - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IetfAttrSyntax.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IetfAttrSyntax.java deleted file mode 100644 index 2e5afb2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IetfAttrSyntax.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.DERUTF8String; - -/** - * Implementation of IetfAttrSyntax as specified by RFC3281. - */ -public class IetfAttrSyntax - extends ASN1Object -{ - public static final int VALUE_OCTETS = 1; - public static final int VALUE_OID = 2; - public static final int VALUE_UTF8 = 3; - GeneralNames policyAuthority = null; - Vector values = new Vector(); - int valueChoice = -1; - - public static IetfAttrSyntax getInstance(Object obj) - { - if (obj instanceof IetfAttrSyntax) - { - return (IetfAttrSyntax)obj; - } - if (obj != null) - { - return new IetfAttrSyntax(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * - */ - private IetfAttrSyntax(ASN1Sequence seq) - { - int i = 0; - - if (seq.getObjectAt(0) instanceof ASN1TaggedObject) - { - policyAuthority = GeneralNames.getInstance(((ASN1TaggedObject)seq.getObjectAt(0)), false); - i++; - } - else if (seq.size() == 2) - { // VOMS fix - policyAuthority = GeneralNames.getInstance(seq.getObjectAt(0)); - i++; - } - - if (!(seq.getObjectAt(i) instanceof ASN1Sequence)) - { - throw new IllegalArgumentException("Non-IetfAttrSyntax encoding"); - } - - seq = (ASN1Sequence)seq.getObjectAt(i); - - for (Enumeration e = seq.getObjects(); e.hasMoreElements();) - { - ASN1Primitive obj = (ASN1Primitive)e.nextElement(); - int type; - - if (obj instanceof ASN1ObjectIdentifier) - { - type = VALUE_OID; - } - else if (obj instanceof DERUTF8String) - { - type = VALUE_UTF8; - } - else if (obj instanceof DEROctetString) - { - type = VALUE_OCTETS; - } - else - { - throw new IllegalArgumentException("Bad value type encoding IetfAttrSyntax"); - } - - if (valueChoice < 0) - { - valueChoice = type; - } - - if (type != valueChoice) - { - throw new IllegalArgumentException("Mix of value types in IetfAttrSyntax"); - } - - values.addElement(obj); - } - } - - public GeneralNames getPolicyAuthority() - { - return policyAuthority; - } - - public int getValueType() - { - return valueChoice; - } - - public Object[] getValues() - { - if (this.getValueType() == VALUE_OCTETS) - { - ASN1OctetString[] tmp = new ASN1OctetString[values.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = (ASN1OctetString)values.elementAt(i); - } - - return tmp; - } - else if (this.getValueType() == VALUE_OID) - { - ASN1ObjectIdentifier[] tmp = new ASN1ObjectIdentifier[values.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = (ASN1ObjectIdentifier)values.elementAt(i); - } - - return tmp; - } - else - { - DERUTF8String[] tmp = new DERUTF8String[values.size()]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = (DERUTF8String)values.elementAt(i); - } - - return tmp; - } - } - - /** - * - *
    -     * 
    -     *  IetfAttrSyntax ::= SEQUENCE {
    -     *    policyAuthority [0] GeneralNames OPTIONAL,
    -     *    values SEQUENCE OF CHOICE {
    -     *      octets OCTET STRING,
    -     *      oid OBJECT IDENTIFIER,
    -     *      string UTF8String
    -     *    }
    -     *  }
    -     *  
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (policyAuthority != null) - { - v.add(new DERTaggedObject(0, policyAuthority)); - } - - ASN1EncodableVector v2 = new ASN1EncodableVector(); - - for (Enumeration i = values.elements(); i.hasMoreElements();) - { - v2.add((ASN1Encodable)i.nextElement()); - } - - v.add(new DERSequence(v2)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuerSerial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuerSerial.java deleted file mode 100644 index 01ea871..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuerSerial.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -public class IssuerSerial - extends ASN1Object -{ - GeneralNames issuer; - ASN1Integer serial; - DERBitString issuerUID; - - public static IssuerSerial getInstance( - Object obj) - { - if (obj instanceof IssuerSerial) - { - return (IssuerSerial)obj; - } - - if (obj != null) - { - return new IssuerSerial(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static IssuerSerial getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - private IssuerSerial( - ASN1Sequence seq) - { - if (seq.size() != 2 && seq.size() != 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - issuer = GeneralNames.getInstance(seq.getObjectAt(0)); - serial = ASN1Integer.getInstance(seq.getObjectAt(1)); - - if (seq.size() == 3) - { - issuerUID = DERBitString.getInstance(seq.getObjectAt(2)); - } - } - - public IssuerSerial( - GeneralNames issuer, - BigInteger serial) - { - this(issuer, new ASN1Integer(serial)); - } - - public IssuerSerial( - GeneralNames issuer, - ASN1Integer serial) - { - this.issuer = issuer; - this.serial = serial; - } - - public GeneralNames getIssuer() - { - return issuer; - } - - public ASN1Integer getSerial() - { - return serial; - } - - public DERBitString getIssuerUID() - { - return issuerUID; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  IssuerSerial  ::=  SEQUENCE {
    -     *       issuer         GeneralNames,
    -     *       serial         CertificateSerialNumber,
    -     *       issuerUID      UniqueIdentifier OPTIONAL
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(issuer); - v.add(serial); - - if (issuerUID != null) - { - v.add(issuerUID); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuingDistributionPoint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuingDistributionPoint.java deleted file mode 100644 index fe268ec..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/IssuingDistributionPoint.java +++ /dev/null @@ -1,274 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Boolean; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - *
    - * IssuingDistributionPoint ::= SEQUENCE { 
    - *   distributionPoint          [0] DistributionPointName OPTIONAL, 
    - *   onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE, 
    - *   onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE, 
    - *   onlySomeReasons            [3] ReasonFlags OPTIONAL, 
    - *   indirectCRL                [4] BOOLEAN DEFAULT FALSE,
    - *   onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
    - * 
    - */ -public class IssuingDistributionPoint - extends ASN1Object -{ - private DistributionPointName distributionPoint; - - private boolean onlyContainsUserCerts; - - private boolean onlyContainsCACerts; - - private ReasonFlags onlySomeReasons; - - private boolean indirectCRL; - - private boolean onlyContainsAttributeCerts; - - private ASN1Sequence seq; - - public static IssuingDistributionPoint getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static IssuingDistributionPoint getInstance( - Object obj) - { - if (obj instanceof IssuingDistributionPoint) - { - return (IssuingDistributionPoint)obj; - } - else if (obj != null) - { - return new IssuingDistributionPoint(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from given details. - * - * @param distributionPoint - * May contain an URI as pointer to most current CRL. - * @param onlyContainsUserCerts Covers revocation information for end certificates. - * @param onlyContainsCACerts Covers revocation information for CA certificates. - * - * @param onlySomeReasons - * Which revocation reasons does this point cover. - * @param indirectCRL - * If true then the CRL contains revocation - * information about certificates ssued by other CAs. - * @param onlyContainsAttributeCerts Covers revocation information for attribute certificates. - */ - public IssuingDistributionPoint( - DistributionPointName distributionPoint, - boolean onlyContainsUserCerts, - boolean onlyContainsCACerts, - ReasonFlags onlySomeReasons, - boolean indirectCRL, - boolean onlyContainsAttributeCerts) - { - this.distributionPoint = distributionPoint; - this.indirectCRL = indirectCRL; - this.onlyContainsAttributeCerts = onlyContainsAttributeCerts; - this.onlyContainsCACerts = onlyContainsCACerts; - this.onlyContainsUserCerts = onlyContainsUserCerts; - this.onlySomeReasons = onlySomeReasons; - - ASN1EncodableVector vec = new ASN1EncodableVector(); - if (distributionPoint != null) - { // CHOICE item so explicitly tagged - vec.add(new DERTaggedObject(true, 0, distributionPoint)); - } - if (onlyContainsUserCerts) - { - vec.add(new DERTaggedObject(false, 1, ASN1Boolean.getInstance(true))); - } - if (onlyContainsCACerts) - { - vec.add(new DERTaggedObject(false, 2, ASN1Boolean.getInstance(true))); - } - if (onlySomeReasons != null) - { - vec.add(new DERTaggedObject(false, 3, onlySomeReasons)); - } - if (indirectCRL) - { - vec.add(new DERTaggedObject(false, 4, ASN1Boolean.getInstance(true))); - } - if (onlyContainsAttributeCerts) - { - vec.add(new DERTaggedObject(false, 5, ASN1Boolean.getInstance(true))); - } - - seq = new DERSequence(vec); - } - - /** - * Shorthand Constructor from given details. - * - * @param distributionPoint - * May contain an URI as pointer to most current CRL. - * @param indirectCRL - * If true then the CRL contains revocation - * information about certificates ssued by other CAs. - * @param onlyContainsAttributeCerts Covers revocation information for attribute certificates. - */ - public IssuingDistributionPoint( - DistributionPointName distributionPoint, - boolean indirectCRL, - boolean onlyContainsAttributeCerts) - { - this(distributionPoint, false, false, null, indirectCRL, onlyContainsAttributeCerts); - } - - /** - * Constructor from ASN1Sequence - */ - private IssuingDistributionPoint( - ASN1Sequence seq) - { - this.seq = seq; - - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(i)); - - switch (o.getTagNo()) - { - case 0: - // CHOICE so explicit - distributionPoint = DistributionPointName.getInstance(o, true); - break; - case 1: - onlyContainsUserCerts = ASN1Boolean.getInstance(o, false).isTrue(); - break; - case 2: - onlyContainsCACerts = ASN1Boolean.getInstance(o, false).isTrue(); - break; - case 3: - onlySomeReasons = new ReasonFlags(ReasonFlags.getInstance(o, false)); - break; - case 4: - indirectCRL = ASN1Boolean.getInstance(o, false).isTrue(); - break; - case 5: - onlyContainsAttributeCerts = ASN1Boolean.getInstance(o, false).isTrue(); - break; - default: - throw new IllegalArgumentException( - "unknown tag in IssuingDistributionPoint"); - } - } - } - - public boolean onlyContainsUserCerts() - { - return onlyContainsUserCerts; - } - - public boolean onlyContainsCACerts() - { - return onlyContainsCACerts; - } - - public boolean isIndirectCRL() - { - return indirectCRL; - } - - public boolean onlyContainsAttributeCerts() - { - return onlyContainsAttributeCerts; - } - - /** - * @return Returns the distributionPoint. - */ - public DistributionPointName getDistributionPoint() - { - return distributionPoint; - } - - /** - * @return Returns the onlySomeReasons. - */ - public ReasonFlags getOnlySomeReasons() - { - return onlySomeReasons; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } - - public String toString() - { - String sep = System.getProperty("line.separator"); - StringBuffer buf = new StringBuffer(); - - buf.append("IssuingDistributionPoint: ["); - buf.append(sep); - if (distributionPoint != null) - { - appendObject(buf, sep, "distributionPoint", distributionPoint.toString()); - } - if (onlyContainsUserCerts) - { - appendObject(buf, sep, "onlyContainsUserCerts", booleanToString(onlyContainsUserCerts)); - } - if (onlyContainsCACerts) - { - appendObject(buf, sep, "onlyContainsCACerts", booleanToString(onlyContainsCACerts)); - } - if (onlySomeReasons != null) - { - appendObject(buf, sep, "onlySomeReasons", onlySomeReasons.toString()); - } - if (onlyContainsAttributeCerts) - { - appendObject(buf, sep, "onlyContainsAttributeCerts", booleanToString(onlyContainsAttributeCerts)); - } - if (indirectCRL) - { - appendObject(buf, sep, "indirectCRL", booleanToString(indirectCRL)); - } - buf.append("]"); - buf.append(sep); - return buf.toString(); - } - - private void appendObject(StringBuffer buf, String sep, String name, String value) - { - String indent = " "; - - buf.append(indent); - buf.append(name); - buf.append(":"); - buf.append(sep); - buf.append(indent); - buf.append(indent); - buf.append(value); - buf.append(sep); - } - - private String booleanToString(boolean value) - { - return value ? "true" : "false"; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyPurposeId.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyPurposeId.java deleted file mode 100644 index 2bb0897..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyPurposeId.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; - -/** - * The KeyPurposeId object. - *
    - *     KeyPurposeId ::= OBJECT IDENTIFIER
    - *
    - *     id-kp ::= OBJECT IDENTIFIER { iso(1) identified-organization(3) 
    - *          dod(6) internet(1) security(5) mechanisms(5) pkix(7) 3}
    - *
    - * 
    - */ -public class KeyPurposeId - extends ASN1Object -{ - private static final ASN1ObjectIdentifier id_kp = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.3"); - - /** - * { 2 5 29 37 0 } - */ - public static final KeyPurposeId anyExtendedKeyUsage = new KeyPurposeId(Extension.extendedKeyUsage.branch("0")); - - /** - * { id-kp 1 } - */ - public static final KeyPurposeId id_kp_serverAuth = new KeyPurposeId(id_kp.branch("1")); - /** - * { id-kp 2 } - */ - public static final KeyPurposeId id_kp_clientAuth = new KeyPurposeId(id_kp.branch("2")); - /** - * { id-kp 3 } - */ - public static final KeyPurposeId id_kp_codeSigning = new KeyPurposeId(id_kp.branch("3")); - /** - * { id-kp 4 } - */ - public static final KeyPurposeId id_kp_emailProtection = new KeyPurposeId(id_kp.branch("4")); - /** - * Usage deprecated by RFC4945 - was { id-kp 5 } - */ - public static final KeyPurposeId id_kp_ipsecEndSystem = new KeyPurposeId(id_kp.branch("5")); - /** - * Usage deprecated by RFC4945 - was { id-kp 6 } - */ - public static final KeyPurposeId id_kp_ipsecTunnel = new KeyPurposeId(id_kp.branch("6")); - /** - * Usage deprecated by RFC4945 - was { idkp 7 } - */ - public static final KeyPurposeId id_kp_ipsecUser = new KeyPurposeId(id_kp.branch("7")); - /** - * { id-kp 8 } - */ - public static final KeyPurposeId id_kp_timeStamping = new KeyPurposeId(id_kp.branch("8")); - /** - * { id-kp 9 } - */ - public static final KeyPurposeId id_kp_OCSPSigning = new KeyPurposeId(id_kp.branch("9")); - /** - * { id-kp 10 } - */ - public static final KeyPurposeId id_kp_dvcs = new KeyPurposeId(id_kp.branch("10")); - /** - * { id-kp 11 } - */ - public static final KeyPurposeId id_kp_sbgpCertAAServerAuth = new KeyPurposeId(id_kp.branch("11")); - /** - * { id-kp 12 } - */ - public static final KeyPurposeId id_kp_scvp_responder = new KeyPurposeId(id_kp.branch("12")); - /** - * { id-kp 13 } - */ - public static final KeyPurposeId id_kp_eapOverPPP = new KeyPurposeId(id_kp.branch("13")); - /** - * { id-kp 14 } - */ - public static final KeyPurposeId id_kp_eapOverLAN = new KeyPurposeId(id_kp.branch("14")); - /** - * { id-kp 15 } - */ - public static final KeyPurposeId id_kp_scvpServer = new KeyPurposeId(id_kp.branch("15")); - /** - * { id-kp 16 } - */ - public static final KeyPurposeId id_kp_scvpClient = new KeyPurposeId(id_kp.branch("16")); - /** - * { id-kp 17 } - */ - public static final KeyPurposeId id_kp_ipsecIKE = new KeyPurposeId(id_kp.branch("17")); - /** - * { id-kp 18 } - */ - public static final KeyPurposeId id_kp_capwapAC = new KeyPurposeId(id_kp.branch("18")); - /** - * { id-kp 19 } - */ - public static final KeyPurposeId id_kp_capwapWTP = new KeyPurposeId(id_kp.branch("19")); - - // - // microsoft key purpose ids - // - /** - * { 1 3 6 1 4 1 311 20 2 2 } - */ - public static final KeyPurposeId id_kp_smartcardlogon = new KeyPurposeId(new ASN1ObjectIdentifier("1.3.6.1.4.1.311.20.2.2")); - - private ASN1ObjectIdentifier id; - - private KeyPurposeId(ASN1ObjectIdentifier id) - { - this.id = id; - } - - /** - * @deprecated use getInstance and an OID or one of the constants above. - * @param id string representation of an OID. - */ - public KeyPurposeId(String id) - { - this(new ASN1ObjectIdentifier(id)); - } - - public static KeyPurposeId getInstance(Object o) - { - if (o instanceof KeyPurposeId) - { - return (KeyPurposeId)o; - } - else if (o != null) - { - return new KeyPurposeId(ASN1ObjectIdentifier.getInstance(o)); - } - - return null; - } - - public ASN1Primitive toASN1Primitive() - { - return id; - } - - public String getId() - { - return id.getId(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyUsage.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyUsage.java deleted file mode 100644 index ce5720b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/KeyUsage.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERBitString; - -/** - * The KeyUsage object. - *
    - *    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
    - *
    - *    KeyUsage ::= BIT STRING {
    - *         digitalSignature        (0),
    - *         nonRepudiation          (1),
    - *         keyEncipherment         (2),
    - *         dataEncipherment        (3),
    - *         keyAgreement            (4),
    - *         keyCertSign             (5),
    - *         cRLSign                 (6),
    - *         encipherOnly            (7),
    - *         decipherOnly            (8) }
    - * 
    - */ -public class KeyUsage - extends ASN1Object -{ - public static final int digitalSignature = (1 << 7); - public static final int nonRepudiation = (1 << 6); - public static final int keyEncipherment = (1 << 5); - public static final int dataEncipherment = (1 << 4); - public static final int keyAgreement = (1 << 3); - public static final int keyCertSign = (1 << 2); - public static final int cRLSign = (1 << 1); - public static final int encipherOnly = (1 << 0); - public static final int decipherOnly = (1 << 15); - - private DERBitString bitString; - - public static KeyUsage getInstance(Object obj) // needs to be DERBitString for other VMs - { - if (obj instanceof KeyUsage) - { - return (KeyUsage)obj; - } - else if (obj != null) - { - return new KeyUsage(DERBitString.getInstance(obj)); - } - - return null; - } - - public static KeyUsage fromExtensions(Extensions extensions) - { - return KeyUsage.getInstance(extensions.getExtensionParsedValue(Extension.keyUsage)); - } - - /** - * Basic constructor. - * - * @param usage - the bitwise OR of the Key Usage flags giving the - * allowed uses for the key. - * e.g. (KeyUsage.keyEncipherment | KeyUsage.dataEncipherment) - */ - public KeyUsage( - int usage) - { - this.bitString = new DERBitString(usage); - } - - private KeyUsage( - DERBitString bitString) - { - this.bitString = bitString; - } - - public byte[] getBytes() - { - return bitString.getBytes(); - } - - public int getPadBits() - { - return bitString.getPadBits(); - } - - public String toString() - { - byte[] data = bitString.getBytes(); - - if (data.length == 1) - { - return "KeyUsage: 0x" + Integer.toHexString(data[0] & 0xff); - } - return "KeyUsage: 0x" + Integer.toHexString((data[1] & 0xff) << 8 | (data[0] & 0xff)); - } - - public ASN1Primitive toASN1Primitive() - { - return bitString; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NameConstraints.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NameConstraints.java deleted file mode 100644 index 5081162..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NameConstraints.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class NameConstraints - extends ASN1Object -{ - private GeneralSubtree[] permitted, excluded; - - public static NameConstraints getInstance(Object obj) - { - if (obj instanceof NameConstraints) - { - return (NameConstraints)obj; - } - if (obj != null) - { - return new NameConstraints(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private NameConstraints(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - while (e.hasMoreElements()) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement()); - switch (o.getTagNo()) - { - case 0: - permitted = createArray(ASN1Sequence.getInstance(o, false)); - break; - case 1: - excluded = createArray(ASN1Sequence.getInstance(o, false)); - break; - } - } - } - - /** - * Constructor from a given details. - * - *

    - * permitted and excluded are arrays of GeneralSubtree objects. - * - * @param permitted - * Permitted subtrees - * @param excluded - * Excludes subtrees - */ - public NameConstraints( - GeneralSubtree[] permitted, - GeneralSubtree[] excluded) - { - if (permitted != null) - { - this.permitted = permitted; - } - - if (excluded != null) - { - this.excluded = excluded; - } - } - - private GeneralSubtree[] createArray(ASN1Sequence subtree) - { - GeneralSubtree[] ar = new GeneralSubtree[subtree.size()]; - - for (int i = 0; i != ar.length; i++) - { - ar[i] = GeneralSubtree.getInstance(subtree.getObjectAt(i)); - } - - return ar; - } - - public GeneralSubtree[] getPermittedSubtrees() - { - return permitted; - } - - public GeneralSubtree[] getExcludedSubtrees() - { - return excluded; - } - - /* - * NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees - * OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL } - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (permitted != null) - { - v.add(new DERTaggedObject(false, 0, new DERSequence(permitted))); - } - - if (excluded != null) - { - v.add(new DERTaggedObject(false, 1, new DERSequence(excluded))); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NoticeReference.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NoticeReference.java deleted file mode 100644 index 7bc1b43..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/NoticeReference.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * NoticeReference class, used in - * CertificatePolicies X509 V3 extensions - * (in policy qualifiers). - * - *

    - *  NoticeReference ::= SEQUENCE {
    - *      organization     DisplayText,
    - *      noticeNumbers    SEQUENCE OF INTEGER }
    - *
    - * 
    - * - * @see PolicyQualifierInfo - * @see PolicyInformation - */ -public class NoticeReference - extends ASN1Object -{ - private DisplayText organization; - private ASN1Sequence noticeNumbers; - - private static ASN1EncodableVector convertVector(Vector numbers) - { - ASN1EncodableVector av = new ASN1EncodableVector(); - - Enumeration it = numbers.elements(); - - while (it.hasMoreElements()) - { - Object o = it.nextElement(); - ASN1Integer di; - - if (o instanceof BigInteger) - { - di = new ASN1Integer((BigInteger)o); - } - else if (o instanceof Integer) - { - di = new ASN1Integer(((Integer)o).intValue()); - } - else - { - throw new IllegalArgumentException(); - } - - av.add(di); - } - return av; - } - - /** - * Creates a new NoticeReference instance. - * - * @param organization a String value - * @param numbers a Vector value - */ - public NoticeReference( - String organization, - Vector numbers) - { - this(organization, convertVector(numbers)); - } - - /** - * Creates a new NoticeReference instance. - * - * @param organization a String value - * @param noticeNumbers an ASN1EncodableVector value - */ - public NoticeReference( - String organization, - ASN1EncodableVector noticeNumbers) - { - this(new DisplayText(organization), noticeNumbers); - } - - /** - * Creates a new NoticeReference instance. - * - * @param organization displayText - * @param noticeNumbers an ASN1EncodableVector value - */ - public NoticeReference( - DisplayText organization, - ASN1EncodableVector noticeNumbers) - { - this.organization = organization; - this.noticeNumbers = new DERSequence(noticeNumbers); - } - - /** - * Creates a new NoticeReference instance. - *

    Useful for reconstructing a NoticeReference - * instance from its encodable/encoded form. - * - * @param as an ASN1Sequence value obtained from either - * calling @{link toASN1Primitive()} for a NoticeReference - * instance or from parsing it from a DER-encoded stream. - */ - private NoticeReference( - ASN1Sequence as) - { - if (as.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + as.size()); - } - - organization = DisplayText.getInstance(as.getObjectAt(0)); - noticeNumbers = ASN1Sequence.getInstance(as.getObjectAt(1)); - } - - public static NoticeReference getInstance( - Object as) - { - if (as instanceof NoticeReference) - { - return (NoticeReference)as; - } - else if (as != null) - { - return new NoticeReference(ASN1Sequence.getInstance(as)); - } - - return null; - } - - public DisplayText getOrganization() - { - return organization; - } - - public ASN1Integer[] getNoticeNumbers() - { - ASN1Integer[] tmp = new ASN1Integer[noticeNumbers.size()]; - - for (int i = 0; i != noticeNumbers.size(); i++) - { - tmp[i] = ASN1Integer.getInstance(noticeNumbers.getObjectAt(i)); - } - - return tmp; - } - - /** - * Describe toASN1Object method here. - * - * @return a ASN1Primitive value - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector av = new ASN1EncodableVector(); - av.add (organization); - av.add (noticeNumbers); - return new DERSequence (av); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ObjectDigestInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ObjectDigestInfo.java deleted file mode 100644 index 6dc0fb8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ObjectDigestInfo.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Enumerated; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -/** - * ObjectDigestInfo ASN.1 structure used in v2 attribute certificates. - * - *

    - *  
    - *    ObjectDigestInfo ::= SEQUENCE {
    - *         digestedObjectType  ENUMERATED {
    - *                 publicKey            (0),
    - *                 publicKeyCert        (1),
    - *                 otherObjectTypes     (2) },
    - *                         -- otherObjectTypes MUST NOT
    - *                         -- be used in this profile
    - *         otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,
    - *         digestAlgorithm     AlgorithmIdentifier,
    - *         objectDigest        BIT STRING
    - *    }
    - *   
    - * 
    - * - */ -public class ObjectDigestInfo - extends ASN1Object -{ - /** - * The public key is hashed. - */ - public final static int publicKey = 0; - - /** - * The public key certificate is hashed. - */ - public final static int publicKeyCert = 1; - - /** - * An other object is hashed. - */ - public final static int otherObjectDigest = 2; - - ASN1Enumerated digestedObjectType; - - ASN1ObjectIdentifier otherObjectTypeID; - - AlgorithmIdentifier digestAlgorithm; - - DERBitString objectDigest; - - public static ObjectDigestInfo getInstance( - Object obj) - { - if (obj instanceof ObjectDigestInfo) - { - return (ObjectDigestInfo)obj; - } - - if (obj != null) - { - return new ObjectDigestInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public static ObjectDigestInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - /** - * Constructor from given details. - *

    - * If digestedObjectType is not {@link #publicKeyCert} or - * {@link #publicKey} otherObjectTypeID must be given, - * otherwise it is ignored. - * - * @param digestedObjectType The digest object type. - * @param otherObjectTypeID The object type ID for - * otherObjectDigest. - * @param digestAlgorithm The algorithm identifier for the hash. - * @param objectDigest The hash value. - */ - public ObjectDigestInfo( - int digestedObjectType, - ASN1ObjectIdentifier otherObjectTypeID, - AlgorithmIdentifier digestAlgorithm, - byte[] objectDigest) - { - this.digestedObjectType = new ASN1Enumerated(digestedObjectType); - if (digestedObjectType == otherObjectDigest) - { - this.otherObjectTypeID = otherObjectTypeID; - } - - this.digestAlgorithm = digestAlgorithm; - this.objectDigest = new DERBitString(objectDigest); - } - - private ObjectDigestInfo( - ASN1Sequence seq) - { - if (seq.size() > 4 || seq.size() < 3) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - digestedObjectType = ASN1Enumerated.getInstance(seq.getObjectAt(0)); - - int offset = 0; - - if (seq.size() == 4) - { - otherObjectTypeID = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(1)); - offset++; - } - - digestAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1 + offset)); - - objectDigest = DERBitString.getInstance(seq.getObjectAt(2 + offset)); - } - - public ASN1Enumerated getDigestedObjectType() - { - return digestedObjectType; - } - - public ASN1ObjectIdentifier getOtherObjectTypeID() - { - return otherObjectTypeID; - } - - public AlgorithmIdentifier getDigestAlgorithm() - { - return digestAlgorithm; - } - - public DERBitString getObjectDigest() - { - return objectDigest; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - *

    -     *  
    -     *    ObjectDigestInfo ::= SEQUENCE {
    -     *         digestedObjectType  ENUMERATED {
    -     *                 publicKey            (0),
    -     *                 publicKeyCert        (1),
    -     *                 otherObjectTypes     (2) },
    -     *                         -- otherObjectTypes MUST NOT
    -     *                         -- be used in this profile
    -     *         otherObjectTypeID   OBJECT IDENTIFIER OPTIONAL,
    -     *         digestAlgorithm     AlgorithmIdentifier,
    -     *         objectDigest        BIT STRING
    -     *    }
    -     *   
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(digestedObjectType); - - if (otherObjectTypeID != null) - { - v.add(otherObjectTypeID); - } - - v.add(digestAlgorithm); - v.add(objectDigest); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyInformation.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyInformation.java deleted file mode 100644 index af724e2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyInformation.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -public class PolicyInformation - extends ASN1Object -{ - private ASN1ObjectIdentifier policyIdentifier; - private ASN1Sequence policyQualifiers; - - private PolicyInformation( - ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - policyIdentifier = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - - if (seq.size() > 1) - { - policyQualifiers = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - } - - public PolicyInformation( - ASN1ObjectIdentifier policyIdentifier) - { - this.policyIdentifier = policyIdentifier; - } - - public PolicyInformation( - ASN1ObjectIdentifier policyIdentifier, - ASN1Sequence policyQualifiers) - { - this.policyIdentifier = policyIdentifier; - this.policyQualifiers = policyQualifiers; - } - - public static PolicyInformation getInstance( - Object obj) - { - if (obj == null || obj instanceof PolicyInformation) - { - return (PolicyInformation)obj; - } - - return new PolicyInformation(ASN1Sequence.getInstance(obj)); - } - - public ASN1ObjectIdentifier getPolicyIdentifier() - { - return policyIdentifier; - } - - public ASN1Sequence getPolicyQualifiers() - { - return policyQualifiers; - } - - /* - * PolicyInformation ::= SEQUENCE { - * policyIdentifier CertPolicyId, - * policyQualifiers SEQUENCE SIZE (1..MAX) OF - * PolicyQualifierInfo OPTIONAL } - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(policyIdentifier); - - if (policyQualifiers != null) - { - v.add(policyQualifiers); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyMappings.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyMappings.java deleted file mode 100644 index ac3fdc7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyMappings.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * PolicyMappings V3 extension, described in RFC3280. - *
    - *    PolicyMappings ::= SEQUENCE SIZE (1..MAX) OF SEQUENCE {
    - *      issuerDomainPolicy      CertPolicyId,
    - *      subjectDomainPolicy     CertPolicyId }
    - * 
    - * - * @see RFC 3280, section 4.2.1.6 - */ -public class PolicyMappings - extends ASN1Object -{ - ASN1Sequence seq = null; - - public static PolicyMappings getInstance(Object obj) - { - if (obj instanceof PolicyMappings) - { - return (PolicyMappings)obj; - } - if (obj != null) - { - return new PolicyMappings(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Creates a new PolicyMappings instance. - * - * @param seq an ASN1Sequence constructed as specified - * in RFC 3280 - */ - private PolicyMappings(ASN1Sequence seq) - { - this.seq = seq; - } - - /** - * Creates a new PolicyMappings instance. - * - * @param mappings a HashMap value that maps - * String oids - * to other String oids. - * @deprecated use CertPolicyId constructors. - */ - public PolicyMappings(Hashtable mappings) - { - ASN1EncodableVector dev = new ASN1EncodableVector(); - Enumeration it = mappings.keys(); - - while (it.hasMoreElements()) - { - String idp = (String)it.nextElement(); - String sdp = (String)mappings.get(idp); - ASN1EncodableVector dv = new ASN1EncodableVector(); - dv.add(new ASN1ObjectIdentifier(idp)); - dv.add(new ASN1ObjectIdentifier(sdp)); - dev.add(new DERSequence(dv)); - } - - seq = new DERSequence(dev); - } - - public PolicyMappings(CertPolicyId issuerDomainPolicy, CertPolicyId subjectDomainPolicy) - { - ASN1EncodableVector dv = new ASN1EncodableVector(); - dv.add(issuerDomainPolicy); - dv.add(subjectDomainPolicy); - - seq = new DERSequence(new DERSequence(dv)); - } - - public PolicyMappings(CertPolicyId[] issuerDomainPolicy, CertPolicyId[] subjectDomainPolicy) - { - ASN1EncodableVector dev = new ASN1EncodableVector(); - - for (int i = 0; i != issuerDomainPolicy.length; i++) - { - ASN1EncodableVector dv = new ASN1EncodableVector(); - dv.add(issuerDomainPolicy[i]); - dv.add(subjectDomainPolicy[i]); - dev.add(new DERSequence(dv)); - } - - seq = new DERSequence(dev); - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierId.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierId.java deleted file mode 100644 index 323f0ef..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierId.java +++ /dev/null @@ -1,31 +0,0 @@ - -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1ObjectIdentifier; - -/** - * PolicyQualifierId, used in the CertificatePolicies - * X509V3 extension. - * - *
    - *    id-qt          OBJECT IDENTIFIER ::=  { id-pkix 2 }
    - *    id-qt-cps      OBJECT IDENTIFIER ::=  { id-qt 1 }
    - *    id-qt-unotice  OBJECT IDENTIFIER ::=  { id-qt 2 }
    - *  PolicyQualifierId ::=
    - *       OBJECT IDENTIFIER (id-qt-cps | id-qt-unotice)
    - * 
    - */ -public class PolicyQualifierId extends ASN1ObjectIdentifier -{ - private static final String id_qt = "1.3.6.1.5.5.7.2"; - - private PolicyQualifierId(String id) - { - super(id); - } - - public static final PolicyQualifierId id_qt_cps = - new PolicyQualifierId(id_qt + ".1"); - public static final PolicyQualifierId id_qt_unotice = - new PolicyQualifierId(id_qt + ".2"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierInfo.java deleted file mode 100644 index 25aa42a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PolicyQualifierInfo.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERSequence; - -/** - * Policy qualifiers, used in the X509V3 CertificatePolicies - * extension. - * - *
    - *   PolicyQualifierInfo ::= SEQUENCE {
    - *       policyQualifierId  PolicyQualifierId,
    - *       qualifier          ANY DEFINED BY policyQualifierId }
    - * 
    - */ -public class PolicyQualifierInfo - extends ASN1Object -{ - private ASN1ObjectIdentifier policyQualifierId; - private ASN1Encodable qualifier; - - /** - * Creates a new PolicyQualifierInfo instance. - * - * @param policyQualifierId a PolicyQualifierId value - * @param qualifier the qualifier, defined by the above field. - */ - public PolicyQualifierInfo( - ASN1ObjectIdentifier policyQualifierId, - ASN1Encodable qualifier) - { - this.policyQualifierId = policyQualifierId; - this.qualifier = qualifier; - } - - /** - * Creates a new PolicyQualifierInfo containing a - * cPSuri qualifier. - * - * @param cps the CPS (certification practice statement) uri as a - * String. - */ - public PolicyQualifierInfo( - String cps) - { - policyQualifierId = PolicyQualifierId.id_qt_cps; - qualifier = new DERIA5String (cps); - } - - /** - * Creates a new PolicyQualifierInfo instance. - * - * @param as PolicyQualifierInfo X509 structure - * encoded as an ASN1Sequence. - */ - public PolicyQualifierInfo( - ASN1Sequence as) - { - if (as.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + as.size()); - } - - policyQualifierId = ASN1ObjectIdentifier.getInstance(as.getObjectAt(0)); - qualifier = as.getObjectAt(1); - } - - public static PolicyQualifierInfo getInstance( - Object obj) - { - if (obj instanceof PolicyQualifierInfo) - { - return (PolicyQualifierInfo)obj; - } - else if (obj != null) - { - return new PolicyQualifierInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - - public ASN1ObjectIdentifier getPolicyQualifierId() - { - return policyQualifierId; - } - - public ASN1Encodable getQualifier() - { - return qualifier; - } - - /** - * Returns a DER-encodable representation of this instance. - * - * @return a ASN1Primitive value - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector dev = new ASN1EncodableVector(); - dev.add(policyQualifierId); - dev.add(qualifier); - - return new DERSequence(dev); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PrivateKeyUsagePeriod.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PrivateKeyUsagePeriod.java deleted file mode 100644 index 66511f7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/PrivateKeyUsagePeriod.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - *
    - *    PrivateKeyUsagePeriod ::= SEQUENCE {
    - *      notBefore       [0]     GeneralizedTime OPTIONAL,
    - *      notAfter        [1]     GeneralizedTime OPTIONAL }
    - * 
    - */ -public class PrivateKeyUsagePeriod - extends ASN1Object -{ - public static PrivateKeyUsagePeriod getInstance(Object obj) - { - if (obj instanceof PrivateKeyUsagePeriod) - { - return (PrivateKeyUsagePeriod)obj; - } - - if (obj != null) - { - return new PrivateKeyUsagePeriod(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private DERGeneralizedTime _notBefore, _notAfter; - - private PrivateKeyUsagePeriod(ASN1Sequence seq) - { - Enumeration en = seq.getObjects(); - while (en.hasMoreElements()) - { - ASN1TaggedObject tObj = (ASN1TaggedObject)en.nextElement(); - - if (tObj.getTagNo() == 0) - { - _notBefore = DERGeneralizedTime.getInstance(tObj, false); - } - else if (tObj.getTagNo() == 1) - { - _notAfter = DERGeneralizedTime.getInstance(tObj, false); - } - } - } - - public DERGeneralizedTime getNotBefore() - { - return _notBefore; - } - - public DERGeneralizedTime getNotAfter() - { - return _notAfter; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (_notBefore != null) - { - v.add(new DERTaggedObject(false, 0, _notBefore)); - } - if (_notAfter != null) - { - v.add(new DERTaggedObject(false, 1, _notAfter)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RSAPublicKeyStructure.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RSAPublicKeyStructure.java deleted file mode 100644 index 488dad7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RSAPublicKeyStructure.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.asn1.x509; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -/** - * @deprecated use org.bouncycastle.asn1.pkcs.RSAPublicKey - */ -public class RSAPublicKeyStructure - extends ASN1Object -{ - private BigInteger modulus; - private BigInteger publicExponent; - - public static RSAPublicKeyStructure getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static RSAPublicKeyStructure getInstance( - Object obj) - { - if(obj == null || obj instanceof RSAPublicKeyStructure) - { - return (RSAPublicKeyStructure)obj; - } - - if(obj instanceof ASN1Sequence) - { - return new RSAPublicKeyStructure((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid RSAPublicKeyStructure: " + obj.getClass().getName()); - } - - public RSAPublicKeyStructure( - BigInteger modulus, - BigInteger publicExponent) - { - this.modulus = modulus; - this.publicExponent = publicExponent; - } - - public RSAPublicKeyStructure( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - modulus = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); - publicExponent = ASN1Integer.getInstance(e.nextElement()).getPositiveValue(); - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getPublicExponent() - { - return publicExponent; - } - - /** - * This outputs the key in PKCS1v2 format. - *
    -     *      RSAPublicKey ::= SEQUENCE {
    -     *                          modulus INTEGER, -- n
    -     *                          publicExponent INTEGER, -- e
    -     *                      }
    -     * 
    - *

    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(getModulus())); - v.add(new ASN1Integer(getPublicExponent())); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ReasonFlags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ReasonFlags.java deleted file mode 100644 index 36bdc0b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/ReasonFlags.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.DERBitString; - -/** - * The ReasonFlags object. - *

    - * ReasonFlags ::= BIT STRING {
    - *      unused                  (0),
    - *      keyCompromise           (1),
    - *      cACompromise            (2),
    - *      affiliationChanged      (3),
    - *      superseded              (4),
    - *      cessationOfOperation    (5),
    - *      certificateHold         (6),
    - *      privilegeWithdrawn      (7),
    - *      aACompromise            (8) }
    - * 
    - */ -public class ReasonFlags - extends DERBitString -{ - /** - * @deprecated use lower case version - */ - public static final int UNUSED = (1 << 7); - /** - * @deprecated use lower case version - */ - public static final int KEY_COMPROMISE = (1 << 6); - /** - * @deprecated use lower case version - */ - public static final int CA_COMPROMISE = (1 << 5); - /** - * @deprecated use lower case version - */ - public static final int AFFILIATION_CHANGED = (1 << 4); - /** - * @deprecated use lower case version - */ - public static final int SUPERSEDED = (1 << 3); - /** - * @deprecated use lower case version - */ - public static final int CESSATION_OF_OPERATION = (1 << 2); - /** - * @deprecated use lower case version - */ - public static final int CERTIFICATE_HOLD = (1 << 1); - /** - * @deprecated use lower case version - */ - public static final int PRIVILEGE_WITHDRAWN = (1 << 0); - /** - * @deprecated use lower case version - */ - public static final int AA_COMPROMISE = (1 << 15); - - public static final int unused = (1 << 7); - public static final int keyCompromise = (1 << 6); - public static final int cACompromise = (1 << 5); - public static final int affiliationChanged = (1 << 4); - public static final int superseded = (1 << 3); - public static final int cessationOfOperation = (1 << 2); - public static final int certificateHold = (1 << 1); - public static final int privilegeWithdrawn = (1 << 0); - public static final int aACompromise = (1 << 15); - - /** - * @param reasons - the bitwise OR of the Key Reason flags giving the - * allowed uses for the key. - */ - public ReasonFlags( - int reasons) - { - super(getBytes(reasons), getPadBits(reasons)); - } - - public ReasonFlags( - DERBitString reasons) - { - super(reasons.getBytes(), reasons.getPadBits()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RoleSyntax.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RoleSyntax.java deleted file mode 100644 index 71c1202..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/RoleSyntax.java +++ /dev/null @@ -1,237 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1String; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * Implementation of the RoleSyntax object as specified by the RFC3281. - * - *
    - * RoleSyntax ::= SEQUENCE {
    - *                 roleAuthority  [0] GeneralNames OPTIONAL,
    - *                 roleName       [1] GeneralName
    - *           } 
    - * 
    - */ -public class RoleSyntax - extends ASN1Object -{ - private GeneralNames roleAuthority; - private GeneralName roleName; - - /** - * RoleSyntax factory method. - * @param obj the object used to construct an instance of - * RoleSyntax. It must be an instance of RoleSyntax - * or ASN1Sequence. - * @return the instance of RoleSyntax built from the - * supplied object. - * @throws java.lang.IllegalArgumentException if the object passed - * to the factory is not an instance of RoleSyntax or - * ASN1Sequence. - */ - public static RoleSyntax getInstance( - Object obj) - { - - if (obj instanceof RoleSyntax) - { - return (RoleSyntax)obj; - } - else if (obj != null) - { - return new RoleSyntax(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor. - * @param roleAuthority the role authority of this RoleSyntax. - * @param roleName the role name of this RoleSyntax. - */ - public RoleSyntax( - GeneralNames roleAuthority, - GeneralName roleName) - { - if(roleName == null || - roleName.getTagNo() != GeneralName.uniformResourceIdentifier || - ((ASN1String)roleName.getName()).getString().equals("")) - { - throw new IllegalArgumentException("the role name MUST be non empty and MUST " + - "use the URI option of GeneralName"); - } - this.roleAuthority = roleAuthority; - this.roleName = roleName; - } - - /** - * Constructor. Invoking this constructor is the same as invoking - * new RoleSyntax(null, roleName). - * @param roleName the role name of this RoleSyntax. - */ - public RoleSyntax( - GeneralName roleName) - { - this(null, roleName); - } - - /** - * Utility constructor. Takes a String argument representing - * the role name, builds a GeneralName to hold the role name - * and calls the constructor that takes a GeneralName. - * @param roleName - */ - public RoleSyntax( - String roleName) - { - this(new GeneralName(GeneralName.uniformResourceIdentifier, - (roleName == null)? "": roleName)); - } - - /** - * Constructor that builds an instance of RoleSyntax by - * extracting the encoded elements from the ASN1Sequence - * object supplied. - * @param seq an instance of ASN1Sequence that holds - * the encoded elements used to build this RoleSyntax. - */ - private RoleSyntax( - ASN1Sequence seq) - { - if (seq.size() < 1 || seq.size() > 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - for (int i = 0; i != seq.size(); i++) - { - ASN1TaggedObject taggedObject = ASN1TaggedObject.getInstance(seq.getObjectAt(i)); - switch (taggedObject.getTagNo()) - { - case 0: - roleAuthority = GeneralNames.getInstance(taggedObject, false); - break; - case 1: - roleName = GeneralName.getInstance(taggedObject, true); - break; - default: - throw new IllegalArgumentException("Unknown tag in RoleSyntax"); - } - } - } - - /** - * Gets the role authority of this RoleSyntax. - * @return an instance of GeneralNames holding the - * role authority of this RoleSyntax. - */ - public GeneralNames getRoleAuthority() - { - return this.roleAuthority; - } - - /** - * Gets the role name of this RoleSyntax. - * @return an instance of GeneralName holding the - * role name of this RoleSyntax. - */ - public GeneralName getRoleName() - { - return this.roleName; - } - - /** - * Gets the role name as a java.lang.String object. - * @return the role name of this RoleSyntax represented as a - * java.lang.String object. - */ - public String getRoleNameAsString() - { - ASN1String str = (ASN1String)this.roleName.getName(); - - return str.getString(); - } - - /** - * Gets the role authority as a String[] object. - * @return the role authority of this RoleSyntax represented as a - * String[] array. - */ - public String[] getRoleAuthorityAsString() - { - if(roleAuthority == null) - { - return new String[0]; - } - - GeneralName[] names = roleAuthority.getNames(); - String[] namesString = new String[names.length]; - for(int i = 0; i < names.length; i++) - { - ASN1Encodable value = names[i].getName(); - if(value instanceof ASN1String) - { - namesString[i] = ((ASN1String)value).getString(); - } - else - { - namesString[i] = value.toString(); - } - } - return namesString; - } - - /** - * Implementation of the method toASN1Object as - * required by the superclass ASN1Encodable. - * - *
    -     * RoleSyntax ::= SEQUENCE {
    -     *                 roleAuthority  [0] GeneralNames OPTIONAL,
    -     *                 roleName       [1] GeneralName
    -     *           } 
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - if(this.roleAuthority != null) - { - v.add(new DERTaggedObject(false, 0, roleAuthority)); - } - v.add(new DERTaggedObject(true, 1, roleName)); - - return new DERSequence(v); - } - - public String toString() - { - StringBuffer buff = new StringBuffer("Name: " + this.getRoleNameAsString() + - " - Auth: "); - if(this.roleAuthority == null || roleAuthority.getNames().length == 0) - { - buff.append("N/A"); - } - else - { - String[] names = this.getRoleAuthorityAsString(); - buff.append('[').append(names[0]); - for(int i = 1; i < names.length; i++) - { - buff.append(", ").append(names[i]); - } - buff.append(']'); - } - return buff.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectDirectoryAttributes.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectDirectoryAttributes.java deleted file mode 100644 index 2fe1bb4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectDirectoryAttributes.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * This extension may contain further X.500 attributes of the subject. See also - * RFC 3039. - * - *
    - *     SubjectDirectoryAttributes ::= Attributes
    - *     Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
    - *     Attribute ::= SEQUENCE 
    - *     {
    - *       type AttributeType 
    - *       values SET OF AttributeValue 
    - *     }
    - *     
    - *     AttributeType ::= OBJECT IDENTIFIER
    - *     AttributeValue ::= ANY DEFINED BY AttributeType
    - * 
    - * - * @see org.bc.asn1.x500.style.BCStyle for AttributeType ObjectIdentifiers. - */ -public class SubjectDirectoryAttributes - extends ASN1Object -{ - private Vector attributes = new Vector(); - - public static SubjectDirectoryAttributes getInstance( - Object obj) - { - if (obj instanceof SubjectDirectoryAttributes) - { - return (SubjectDirectoryAttributes)obj; - } - - if (obj != null) - { - return new SubjectDirectoryAttributes(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from ASN1Sequence. - * - * The sequence is of type SubjectDirectoryAttributes: - * - *
    -     *      SubjectDirectoryAttributes ::= Attributes
    -     *      Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
    -     *      Attribute ::= SEQUENCE 
    -     *      {
    -     *        type AttributeType 
    -     *        values SET OF AttributeValue 
    -     *      }
    -     *      
    -     *      AttributeType ::= OBJECT IDENTIFIER
    -     *      AttributeValue ::= ANY DEFINED BY AttributeType
    -     * 
    - * - * @param seq - * The ASN.1 sequence. - */ - private SubjectDirectoryAttributes(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Sequence s = ASN1Sequence.getInstance(e.nextElement()); - attributes.addElement(Attribute.getInstance(s)); - } - } - - /** - * Constructor from a vector of attributes. - * - * The vector consists of attributes of type {@link Attribute Attribute} - * - * @param attributes - * The attributes. - * - */ - public SubjectDirectoryAttributes(Vector attributes) - { - Enumeration e = attributes.elements(); - - while (e.hasMoreElements()) - { - this.attributes.addElement(e.nextElement()); - } - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - * Returns: - * - *
    -     *      SubjectDirectoryAttributes ::= Attributes
    -     *      Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
    -     *      Attribute ::= SEQUENCE 
    -     *      {
    -     *        type AttributeType 
    -     *        values SET OF AttributeValue 
    -     *      }
    -     *      
    -     *      AttributeType ::= OBJECT IDENTIFIER
    -     *      AttributeValue ::= ANY DEFINED BY AttributeType
    -     * 
    - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - Enumeration e = attributes.elements(); - - while (e.hasMoreElements()) - { - - vec.add((Attribute)e.nextElement()); - } - - return new DERSequence(vec); - } - - /** - * @return Returns the attributes. - */ - public Vector getAttributes() - { - return attributes; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectKeyIdentifier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectKeyIdentifier.java deleted file mode 100644 index 19d3676..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectKeyIdentifier.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DEROctetString; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; - -/** - * The SubjectKeyIdentifier object. - *
    - * SubjectKeyIdentifier::= OCTET STRING
    - * 
    - */ -public class SubjectKeyIdentifier - extends ASN1Object -{ - private byte[] keyidentifier; - - public static SubjectKeyIdentifier getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1OctetString.getInstance(obj, explicit)); - } - - public static SubjectKeyIdentifier getInstance( - Object obj) - { - if (obj instanceof SubjectKeyIdentifier) - { - return (SubjectKeyIdentifier)obj; - } - else if (obj != null) - { - return new SubjectKeyIdentifier(ASN1OctetString.getInstance(obj)); - } - - return null; - } - - public static SubjectKeyIdentifier fromExtensions(Extensions extensions) - { - return SubjectKeyIdentifier.getInstance(extensions.getExtensionParsedValue(Extension.subjectKeyIdentifier)); - } - - public SubjectKeyIdentifier( - byte[] keyid) - { - this.keyidentifier = keyid; - } - - protected SubjectKeyIdentifier( - ASN1OctetString keyid) - { - this.keyidentifier = keyid.getOctets(); - } - - public byte[] getKeyIdentifier() - { - return keyidentifier; - } - - public ASN1Primitive toASN1Primitive() - { - return new DEROctetString(keyidentifier); - } - - - /** - * Calculates the keyidentifier using a SHA1 hash over the BIT STRING - * from SubjectPublicKeyInfo as defined in RFC3280. - * - * @param spki the subject public key info. - * @deprecated - */ - public SubjectKeyIdentifier( - SubjectPublicKeyInfo spki) - { - this.keyidentifier = getDigest(spki); - } - - /** - * Return a RFC 3280 type 1 key identifier. As in: - *
    -     * (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the
    -     * value of the BIT STRING subjectPublicKey (excluding the tag,
    -     * length, and number of unused bits).
    -     * 
    - * @param keyInfo the key info object containing the subjectPublicKey field. - * @return the key identifier. - * @deprecated use org.bouncycastle.cert.X509ExtensionUtils.createSubjectKeyIdentifier - */ - public static SubjectKeyIdentifier createSHA1KeyIdentifier(SubjectPublicKeyInfo keyInfo) - { - return new SubjectKeyIdentifier(keyInfo); - } - - /** - * Return a RFC 3280 type 2 key identifier. As in: - *
    -     * (2) The keyIdentifier is composed of a four bit type field with
    -     * the value 0100 followed by the least significant 60 bits of the
    -     * SHA-1 hash of the value of the BIT STRING subjectPublicKey.
    -     * 
    - * @param keyInfo the key info object containing the subjectPublicKey field. - * @return the key identifier. - * @deprecated use org.bouncycastle.cert.X509ExtensionUtils.createTruncatedSubjectKeyIdentifier - */ - public static SubjectKeyIdentifier createTruncatedSHA1KeyIdentifier(SubjectPublicKeyInfo keyInfo) - { - byte[] dig = getDigest(keyInfo); - byte[] id = new byte[8]; - - System.arraycopy(dig, dig.length - 8, id, 0, id.length); - - id[0] &= 0x0f; - id[0] |= 0x40; - - return new SubjectKeyIdentifier(id); - } - - private static byte[] getDigest(SubjectPublicKeyInfo spki) - { - Digest digest = new SHA1Digest(); - byte[] resBuf = new byte[digest.getDigestSize()]; - - byte[] bytes = spki.getPublicKeyData().getBytes(); - digest.update(bytes, 0, bytes.length); - digest.doFinal(resBuf, 0); - return resBuf; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectPublicKeyInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectPublicKeyInfo.java deleted file mode 100644 index 98ed68a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/SubjectPublicKeyInfo.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -/** - * The object that contains the public key stored in a certficate. - *

    - * The getEncoded() method in the public keys in the JCE produces a DER - * encoded one of these. - */ -public class SubjectPublicKeyInfo - extends ASN1Object -{ - private AlgorithmIdentifier algId; - private DERBitString keyData; - - public static SubjectPublicKeyInfo getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static SubjectPublicKeyInfo getInstance( - Object obj) - { - if (obj instanceof SubjectPublicKeyInfo) - { - return (SubjectPublicKeyInfo)obj; - } - else if (obj != null) - { - return new SubjectPublicKeyInfo(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public SubjectPublicKeyInfo( - AlgorithmIdentifier algId, - ASN1Encodable publicKey) - throws IOException - { - this.keyData = new DERBitString(publicKey); - this.algId = algId; - } - - public SubjectPublicKeyInfo( - AlgorithmIdentifier algId, - byte[] publicKey) - { - this.keyData = new DERBitString(publicKey); - this.algId = algId; - } - - public SubjectPublicKeyInfo( - ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - this.algId = AlgorithmIdentifier.getInstance(e.nextElement()); - this.keyData = DERBitString.getInstance(e.nextElement()); - } - - public AlgorithmIdentifier getAlgorithm() - { - return algId; - } - - /** - * @deprecated use getAlgorithm() - * @return alg ID. - */ - public AlgorithmIdentifier getAlgorithmId() - { - return algId; - } - - /** - * for when the public key is an encoded object - if the bitstring - * can't be decoded this routine throws an IOException. - * - * @exception IOException - if the bit string doesn't represent a DER - * encoded object. - * @return the public key as an ASN.1 primitive. - */ - public ASN1Primitive parsePublicKey() - throws IOException - { - ASN1InputStream aIn = new ASN1InputStream(keyData.getBytes()); - - return aIn.readObject(); - } - - /** - * for when the public key is an encoded object - if the bitstring - * can't be decoded this routine throws an IOException. - * - * @exception IOException - if the bit string doesn't represent a DER - * encoded object. - * @deprecated use parsePublicKey - * @return the public key as an ASN.1 primitive. - */ - public ASN1Primitive getPublicKey() - throws IOException - { - ASN1InputStream aIn = new ASN1InputStream(keyData.getBytes()); - - return aIn.readObject(); - } - - /** - * for when the public key is raw bits. - * - * @return the public key as the raw bit string... - */ - public DERBitString getPublicKeyData() - { - return keyData; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    -     * SubjectPublicKeyInfo ::= SEQUENCE {
    -     *                          algorithm AlgorithmIdentifier,
    -     *                          publicKey BIT STRING }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algId); - v.add(keyData); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertList.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertList.java deleted file mode 100644 index d6dffa0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertList.java +++ /dev/null @@ -1,309 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.DERUTCTime; -import org.bc.asn1.x500.X500Name; - -/** - * PKIX RFC-2459 - TBSCertList object. - *
    - * TBSCertList  ::=  SEQUENCE  {
    - *      version                 Version OPTIONAL,
    - *                                   -- if present, shall be v2
    - *      signature               AlgorithmIdentifier,
    - *      issuer                  Name,
    - *      thisUpdate              Time,
    - *      nextUpdate              Time OPTIONAL,
    - *      revokedCertificates     SEQUENCE OF SEQUENCE  {
    - *           userCertificate         CertificateSerialNumber,
    - *           revocationDate          Time,
    - *           crlEntryExtensions      Extensions OPTIONAL
    - *                                         -- if present, shall be v2
    - *                                }  OPTIONAL,
    - *      crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
    - *                                         -- if present, shall be v2
    - *                                }
    - * 
    - */ -public class TBSCertList - extends ASN1Object -{ - public static class CRLEntry - extends ASN1Object - { - ASN1Sequence seq; - - Extensions crlEntryExtensions; - - private CRLEntry( - ASN1Sequence seq) - { - if (seq.size() < 2 || seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - this.seq = seq; - } - - public static CRLEntry getInstance(Object o) - { - if (o instanceof CRLEntry) - { - return ((CRLEntry)o); - } - else if (o != null) - { - return new CRLEntry(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer getUserCertificate() - { - return ASN1Integer.getInstance(seq.getObjectAt(0)); - } - - public Time getRevocationDate() - { - return Time.getInstance(seq.getObjectAt(1)); - } - - public Extensions getExtensions() - { - if (crlEntryExtensions == null && seq.size() == 3) - { - crlEntryExtensions = Extensions.getInstance(seq.getObjectAt(2)); - } - - return crlEntryExtensions; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } - - public boolean hasExtensions() - { - return seq.size() == 3; - } - } - - private class RevokedCertificatesEnumeration - implements Enumeration - { - private final Enumeration en; - - RevokedCertificatesEnumeration(Enumeration en) - { - this.en = en; - } - - public boolean hasMoreElements() - { - return en.hasMoreElements(); - } - - public Object nextElement() - { - return CRLEntry.getInstance(en.nextElement()); - } - } - - private class EmptyEnumeration - implements Enumeration - { - public boolean hasMoreElements() - { - return false; - } - - public Object nextElement() - { - return null; // TODO: check exception handling - } - } - - ASN1Integer version; - AlgorithmIdentifier signature; - X500Name issuer; - Time thisUpdate; - Time nextUpdate; - ASN1Sequence revokedCertificates; - Extensions crlExtensions; - - public static TBSCertList getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static TBSCertList getInstance( - Object obj) - { - if (obj instanceof TBSCertList) - { - return (TBSCertList)obj; - } - else if (obj != null) - { - return new TBSCertList(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public TBSCertList( - ASN1Sequence seq) - { - if (seq.size() < 3 || seq.size() > 7) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - int seqPos = 0; - - if (seq.getObjectAt(seqPos) instanceof ASN1Integer) - { - version = ASN1Integer.getInstance(seq.getObjectAt(seqPos++)); - } - else - { - version = null; // version is optional - } - - signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqPos++)); - issuer = X500Name.getInstance(seq.getObjectAt(seqPos++)); - thisUpdate = Time.getInstance(seq.getObjectAt(seqPos++)); - - if (seqPos < seq.size() - && (seq.getObjectAt(seqPos) instanceof DERUTCTime - || seq.getObjectAt(seqPos) instanceof DERGeneralizedTime - || seq.getObjectAt(seqPos) instanceof Time)) - { - nextUpdate = Time.getInstance(seq.getObjectAt(seqPos++)); - } - - if (seqPos < seq.size() - && !(seq.getObjectAt(seqPos) instanceof DERTaggedObject)) - { - revokedCertificates = ASN1Sequence.getInstance(seq.getObjectAt(seqPos++)); - } - - if (seqPos < seq.size() - && seq.getObjectAt(seqPos) instanceof DERTaggedObject) - { - crlExtensions = Extensions.getInstance(ASN1Sequence.getInstance((ASN1TaggedObject)seq.getObjectAt(seqPos), true)); - } - } - - public int getVersionNumber() - { - if (version == null) - { - return 1; - } - return version.getValue().intValue() + 1; - } - - public ASN1Integer getVersion() - { - return version; - } - - public AlgorithmIdentifier getSignature() - { - return signature; - } - - public X500Name getIssuer() - { - return issuer; - } - - public Time getThisUpdate() - { - return thisUpdate; - } - - public Time getNextUpdate() - { - return nextUpdate; - } - - public CRLEntry[] getRevokedCertificates() - { - if (revokedCertificates == null) - { - return new CRLEntry[0]; - } - - CRLEntry[] entries = new CRLEntry[revokedCertificates.size()]; - - for (int i = 0; i < entries.length; i++) - { - entries[i] = CRLEntry.getInstance(revokedCertificates.getObjectAt(i)); - } - - return entries; - } - - public Enumeration getRevokedCertificateEnumeration() - { - if (revokedCertificates == null) - { - return new EmptyEnumeration(); - } - - return new RevokedCertificatesEnumeration(revokedCertificates.getObjects()); - } - - public Extensions getExtensions() - { - return crlExtensions; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (version != null) - { - v.add(version); - } - v.add(signature); - v.add(issuer); - - v.add(thisUpdate); - if (nextUpdate != null) - { - v.add(nextUpdate); - } - - // Add CRLEntries if they exist - if (revokedCertificates != null) - { - v.add(revokedCertificates); - } - - if (crlExtensions != null) - { - v.add(new DERTaggedObject(0, crlExtensions)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificate.java deleted file mode 100644 index 3d09fdc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificate.java +++ /dev/null @@ -1,192 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; - -/** - * The TBSCertificate object. - *
    - * TBSCertificate ::= SEQUENCE {
    - *      version          [ 0 ]  Version DEFAULT v1(0),
    - *      serialNumber            CertificateSerialNumber,
    - *      signature               AlgorithmIdentifier,
    - *      issuer                  Name,
    - *      validity                Validity,
    - *      subject                 Name,
    - *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
    - *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      extensions        [ 3 ] Extensions OPTIONAL
    - *      }
    - * 
    - *

    - * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class - * will parse them, but you really shouldn't be creating new ones. - */ -public class TBSCertificate - extends ASN1Object -{ - ASN1Sequence seq; - - ASN1Integer version; - ASN1Integer serialNumber; - AlgorithmIdentifier signature; - X500Name issuer; - Time startDate, endDate; - X500Name subject; - SubjectPublicKeyInfo subjectPublicKeyInfo; - DERBitString issuerUniqueId; - DERBitString subjectUniqueId; - Extensions extensions; - - public static TBSCertificate getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static TBSCertificate getInstance( - Object obj) - { - if (obj instanceof TBSCertificate) - { - return (TBSCertificate)obj; - } - else if (obj != null) - { - return new TBSCertificate(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private TBSCertificate( - ASN1Sequence seq) - { - int seqStart = 0; - - this.seq = seq; - - // - // some certficates don't include a version number - we assume v1 - // - if (seq.getObjectAt(0) instanceof DERTaggedObject) - { - version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true); - } - else - { - seqStart = -1; // field 0 is missing! - version = new ASN1Integer(0); - } - - serialNumber = ASN1Integer.getInstance(seq.getObjectAt(seqStart + 1)); - - signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2)); - issuer = X500Name.getInstance(seq.getObjectAt(seqStart + 3)); - - // - // before and after dates - // - ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4); - - startDate = Time.getInstance(dates.getObjectAt(0)); - endDate = Time.getInstance(dates.getObjectAt(1)); - - subject = X500Name.getInstance(seq.getObjectAt(seqStart + 5)); - - // - // public key info. - // - subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6)); - - for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--) - { - DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras); - - switch (extra.getTagNo()) - { - case 1: - issuerUniqueId = DERBitString.getInstance(extra, false); - break; - case 2: - subjectUniqueId = DERBitString.getInstance(extra, false); - break; - case 3: - extensions = Extensions.getInstance(ASN1Sequence.getInstance(extra, true)); - } - } - } - - public int getVersionNumber() - { - return version.getValue().intValue() + 1; - } - - public ASN1Integer getVersion() - { - return version; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public AlgorithmIdentifier getSignature() - { - return signature; - } - - public X500Name getIssuer() - { - return issuer; - } - - public Time getStartDate() - { - return startDate; - } - - public Time getEndDate() - { - return endDate; - } - - public X500Name getSubject() - { - return subject; - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return subjectPublicKeyInfo; - } - - public DERBitString getIssuerUniqueId() - { - return issuerUniqueId; - } - - public DERBitString getSubjectUniqueId() - { - return subjectUniqueId; - } - - public Extensions getExtensions() - { - return extensions; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificateStructure.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificateStructure.java deleted file mode 100644 index 50cfec3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TBSCertificateStructure.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.x500.X500Name; - -/** - * The TBSCertificate object. - *

    - * TBSCertificate ::= SEQUENCE {
    - *      version          [ 0 ]  Version DEFAULT v1(0),
    - *      serialNumber            CertificateSerialNumber,
    - *      signature               AlgorithmIdentifier,
    - *      issuer                  Name,
    - *      validity                Validity,
    - *      subject                 Name,
    - *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
    - *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      extensions        [ 3 ] Extensions OPTIONAL
    - *      }
    - * 
    - *

    - * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class - * will parse them, but you really shouldn't be creating new ones. - */ -public class TBSCertificateStructure - extends ASN1Object - implements X509ObjectIdentifiers, PKCSObjectIdentifiers -{ - ASN1Sequence seq; - - ASN1Integer version; - ASN1Integer serialNumber; - AlgorithmIdentifier signature; - X500Name issuer; - Time startDate, endDate; - X500Name subject; - SubjectPublicKeyInfo subjectPublicKeyInfo; - DERBitString issuerUniqueId; - DERBitString subjectUniqueId; - X509Extensions extensions; - - public static TBSCertificateStructure getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static TBSCertificateStructure getInstance( - Object obj) - { - if (obj instanceof TBSCertificateStructure) - { - return (TBSCertificateStructure)obj; - } - else if (obj != null) - { - return new TBSCertificateStructure(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public TBSCertificateStructure( - ASN1Sequence seq) - { - int seqStart = 0; - - this.seq = seq; - - // - // some certficates don't include a version number - we assume v1 - // - if (seq.getObjectAt(0) instanceof DERTaggedObject) - { - version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true); - } - else - { - seqStart = -1; // field 0 is missing! - version = new ASN1Integer(0); - } - - serialNumber = ASN1Integer.getInstance(seq.getObjectAt(seqStart + 1)); - - signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2)); - issuer = X500Name.getInstance(seq.getObjectAt(seqStart + 3)); - - // - // before and after dates - // - ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4); - - startDate = Time.getInstance(dates.getObjectAt(0)); - endDate = Time.getInstance(dates.getObjectAt(1)); - - subject = X500Name.getInstance(seq.getObjectAt(seqStart + 5)); - - // - // public key info. - // - subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6)); - - for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--) - { - DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras); - - switch (extra.getTagNo()) - { - case 1: - issuerUniqueId = DERBitString.getInstance(extra, false); - break; - case 2: - subjectUniqueId = DERBitString.getInstance(extra, false); - break; - case 3: - extensions = X509Extensions.getInstance(extra); - } - } - } - - public int getVersion() - { - return version.getValue().intValue() + 1; - } - - public ASN1Integer getVersionNumber() - { - return version; - } - - public ASN1Integer getSerialNumber() - { - return serialNumber; - } - - public AlgorithmIdentifier getSignature() - { - return signature; - } - - public X500Name getIssuer() - { - return issuer; - } - - public Time getStartDate() - { - return startDate; - } - - public Time getEndDate() - { - return endDate; - } - - public X500Name getSubject() - { - return subject; - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return subjectPublicKeyInfo; - } - - public DERBitString getIssuerUniqueId() - { - return issuerUniqueId; - } - - public DERBitString getSubjectUniqueId() - { - return subjectUniqueId; - } - - public X509Extensions getExtensions() - { - return extensions; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Target.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Target.java deleted file mode 100644 index 4e09ca8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Target.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERTaggedObject; - -/** - * Target structure used in target information extension for attribute - * certificates from RFC 3281. - * - *

    - *     Target  ::= CHOICE {
    - *       targetName          [0] GeneralName,
    - *       targetGroup         [1] GeneralName,
    - *       targetCert          [2] TargetCert
    - *     }
    - * 
    - * - *

    - * The targetCert field is currently not supported and must not be used - * according to RFC 3281. - */ -public class Target - extends ASN1Object - implements ASN1Choice -{ - public static final int targetName = 0; - public static final int targetGroup = 1; - - private GeneralName targName; - private GeneralName targGroup; - - /** - * Creates an instance of a Target from the given object. - *

    - * obj can be a Target or a {@link ASN1TaggedObject} - * - * @param obj The object. - * @return A Target instance. - * @throws IllegalArgumentException if the given object cannot be - * interpreted as Target. - */ - public static Target getInstance(Object obj) - { - if (obj == null || obj instanceof Target) - { - return (Target) obj; - } - else if (obj instanceof ASN1TaggedObject) - { - return new Target((ASN1TaggedObject)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " - + obj.getClass()); - } - - /** - * Constructor from ASN1TaggedObject. - * - * @param tagObj The tagged object. - * @throws IllegalArgumentException if the encoding is wrong. - */ - private Target(ASN1TaggedObject tagObj) - { - switch (tagObj.getTagNo()) - { - case targetName: // GeneralName is already a choice so explicit - targName = GeneralName.getInstance(tagObj, true); - break; - case targetGroup: - targGroup = GeneralName.getInstance(tagObj, true); - break; - default: - throw new IllegalArgumentException("unknown tag: " + tagObj.getTagNo()); - } - } - - /** - * Constructor from given details. - *

    - * Exactly one of the parameters must be not null. - * - * @param type the choice type to apply to the name. - * @param name the general name. - * @throws IllegalArgumentException if type is invalid. - */ - public Target(int type, GeneralName name) - { - this(new DERTaggedObject(type, name)); - } - - /** - * @return Returns the targetGroup. - */ - public GeneralName getTargetGroup() - { - return targGroup; - } - - /** - * @return Returns the targetName. - */ - public GeneralName getTargetName() - { - return targName; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - * Returns: - * - *

    -     *     Target  ::= CHOICE {
    -     *       targetName          [0] GeneralName,
    -     *       targetGroup         [1] GeneralName,
    -     *       targetCert          [2] TargetCert
    -     *     }
    -     * 
    - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - // GeneralName is a choice already so most be explicitly tagged - if (targName != null) - { - return new DERTaggedObject(true, 0, targName); - } - else - { - return new DERTaggedObject(true, 1, targGroup); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TargetInformation.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TargetInformation.java deleted file mode 100644 index 25fa242..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/TargetInformation.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * Target information extension for attributes certificates according to RFC - * 3281. - * - *
    - *           SEQUENCE OF Targets
    - * 
    - * - */ -public class TargetInformation - extends ASN1Object -{ - private ASN1Sequence targets; - - /** - * Creates an instance of a TargetInformation from the given object. - *

    - * obj can be a TargetInformation or a {@link ASN1Sequence} - * - * @param obj The object. - * @return A TargetInformation instance. - * @throws IllegalArgumentException if the given object cannot be - * interpreted as TargetInformation. - */ - public static TargetInformation getInstance(Object obj) - { - if (obj instanceof TargetInformation) - { - return (TargetInformation)obj; - } - else if (obj != null) - { - return new TargetInformation(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from a ASN1Sequence. - * - * @param seq The ASN1Sequence. - * @throws IllegalArgumentException if the sequence does not contain - * correctly encoded Targets elements. - */ - private TargetInformation(ASN1Sequence seq) - { - targets = seq; - } - - /** - * Returns the targets in this target information extension. - * - * @return Returns the targets. - */ - public Targets[] getTargetsObjects() - { - Targets[] copy = new Targets[targets.size()]; - int count = 0; - for (Enumeration e = targets.getObjects(); e.hasMoreElements();) - { - copy[count++] = Targets.getInstance(e.nextElement()); - } - return copy; - } - - /** - * Constructs a target information from a single targets element. - * According to RFC 3281 only one targets element must be produced. - * - * @param targets A Targets instance. - */ - public TargetInformation(Targets targets) - { - this.targets = new DERSequence(targets); - } - - /** - * According to RFC 3281 only one targets element must be produced. If - * multiple targets are given they must be merged in - * into one targets element. - * - * @param targets An array with {@link Targets}. - */ - public TargetInformation(Target[] targets) - { - this(new Targets(targets)); - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - * Returns: - * - *

    -     *          SEQUENCE OF Targets
    -     * 
    - * - *

    - * According to RFC 3281 only one targets element must be produced. If - * multiple targets are given in the constructor they are merged into one - * targets element. If this was produced from a - * {@link org.bc.asn1.ASN1Sequence} the encoding is kept. - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - return targets; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Targets.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Targets.java deleted file mode 100644 index 67d8649..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Targets.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * Targets structure used in target information extension for attribute - * certificates from RFC 3281. - * - *

    - *            Targets ::= SEQUENCE OF Target
    - *           
    - *            Target  ::= CHOICE {
    - *              targetName          [0] GeneralName,
    - *              targetGroup         [1] GeneralName,
    - *              targetCert          [2] TargetCert
    - *            }
    - *           
    - *            TargetCert  ::= SEQUENCE {
    - *              targetCertificate    IssuerSerial,
    - *              targetName           GeneralName OPTIONAL,
    - *              certDigestInfo       ObjectDigestInfo OPTIONAL
    - *            }
    - * 
    - * - * @see org.bc.asn1.x509.Target - * @see org.bc.asn1.x509.TargetInformation - */ -public class Targets - extends ASN1Object -{ - private ASN1Sequence targets; - - /** - * Creates an instance of a Targets from the given object. - *

    - * obj can be a Targets or a {@link ASN1Sequence} - * - * @param obj The object. - * @return A Targets instance. - * @throws IllegalArgumentException if the given object cannot be - * interpreted as Target. - */ - public static Targets getInstance(Object obj) - { - if (obj instanceof Targets) - { - return (Targets)obj; - } - else if (obj != null) - { - return new Targets(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - /** - * Constructor from ASN1Sequence. - * - * @param targets The ASN.1 SEQUENCE. - * @throws IllegalArgumentException if the contents of the sequence are - * invalid. - */ - private Targets(ASN1Sequence targets) - { - this.targets = targets; - } - - /** - * Constructor from given targets. - *

    - * The vector is copied. - * - * @param targets A Vector of {@link Target}s. - * @see Target - * @throws IllegalArgumentException if the vector contains not only Targets. - */ - public Targets(Target[] targets) - { - this.targets = new DERSequence(targets); - } - - /** - * Returns the targets in a Vector. - *

    - * The vector is cloned before it is returned. - * - * @return Returns the targets. - */ - public Target[] getTargets() - { - Target[] targs = new Target[targets.size()]; - int count = 0; - for (Enumeration e = targets.getObjects(); e.hasMoreElements();) - { - targs[count++] = Target.getInstance(e.nextElement()); - } - return targs; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - * - * Returns: - * - *

    -     *            Targets ::= SEQUENCE OF Target
    -     * 
    - * - * @return a ASN1Primitive - */ - public ASN1Primitive toASN1Primitive() - { - return targets; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Time.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Time.java deleted file mode 100644 index ed101b8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/Time.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.bc.asn1.x509; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.SimpleTimeZone; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERUTCTime; - -public class Time - extends ASN1Object - implements ASN1Choice -{ - ASN1Primitive time; - - public static Time getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - public Time( - ASN1Primitive time) - { - if (!(time instanceof DERUTCTime) - && !(time instanceof DERGeneralizedTime)) - { - throw new IllegalArgumentException("unknown object passed to Time"); - } - - this.time = time; - } - - /** - * creates a time object from a given date - if the date is between 1950 - * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime - * is used. - */ - public Time( - Date date) - { - SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); - SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); - - dateF.setTimeZone(tz); - - String d = dateF.format(date) + "Z"; - int year = Integer.parseInt(d.substring(0, 4)); - - if (year < 1950 || year > 2049) - { - time = new DERGeneralizedTime(d); - } - else - { - time = new DERUTCTime(d.substring(2)); - } - } - - public static Time getInstance( - Object obj) - { - if (obj == null || obj instanceof Time) - { - return (Time)obj; - } - else if (obj instanceof DERUTCTime) - { - return new Time((DERUTCTime)obj); - } - else if (obj instanceof DERGeneralizedTime) - { - return new Time((DERGeneralizedTime)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public String getTime() - { - if (time instanceof DERUTCTime) - { - return ((DERUTCTime)time).getAdjustedTime(); - } - else - { - return ((DERGeneralizedTime)time).getTime(); - } - } - - public Date getDate() - { - try - { - if (time instanceof DERUTCTime) - { - return ((DERUTCTime)time).getAdjustedDate(); - } - else - { - return ((DERGeneralizedTime)time).getDate(); - } - } - catch (ParseException e) - { // this should never happen - throw new IllegalStateException("invalid date string: " + e.getMessage()); - } - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Time ::= CHOICE {
    -     *             utcTime        UTCTime,
    -     *             generalTime    GeneralizedTime }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return time; - } - - public String toString() - { - return getTime(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/UserNotice.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/UserNotice.java deleted file mode 100644 index 5e7e6c3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/UserNotice.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * UserNotice class, used in - * CertificatePolicies X509 extensions (in policy - * qualifiers). - *
    - * UserNotice ::= SEQUENCE {
    - *      noticeRef        NoticeReference OPTIONAL,
    - *      explicitText     DisplayText OPTIONAL}
    - *
    - * 
    - * - * @see PolicyQualifierId - * @see PolicyInformation - */ -public class UserNotice - extends ASN1Object -{ - private NoticeReference noticeRef; - private DisplayText explicitText; - - /** - * Creates a new UserNotice instance. - * - * @param noticeRef a NoticeReference value - * @param explicitText a DisplayText value - */ - public UserNotice( - NoticeReference noticeRef, - DisplayText explicitText) - { - this.noticeRef = noticeRef; - this.explicitText = explicitText; - } - - /** - * Creates a new UserNotice instance. - * - * @param noticeRef a NoticeReference value - * @param str the explicitText field as a String. - */ - public UserNotice( - NoticeReference noticeRef, - String str) - { - this(noticeRef, new DisplayText(str)); - } - - /** - * Creates a new UserNotice instance. - *

    Useful from reconstructing a UserNotice instance - * from its encodable/encoded form. - * - * @param as an ASN1Sequence value obtained from either - * calling @{link toASN1Primitive()} for a UserNotice - * instance or from parsing it from a DER-encoded stream. - */ - private UserNotice( - ASN1Sequence as) - { - if (as.size() == 2) - { - noticeRef = NoticeReference.getInstance(as.getObjectAt(0)); - explicitText = DisplayText.getInstance(as.getObjectAt(1)); - } - else if (as.size() == 1) - { - if (as.getObjectAt(0).toASN1Primitive() instanceof ASN1Sequence) - { - noticeRef = NoticeReference.getInstance(as.getObjectAt(0)); - } - else - { - explicitText = DisplayText.getInstance(as.getObjectAt(0)); - } - } - else - { - throw new IllegalArgumentException("Bad sequence size: " + as.size()); - } - } - - public static UserNotice getInstance( - Object obj) - { - if (obj instanceof UserNotice) - { - return (UserNotice)obj; - } - - if (obj != null) - { - return new UserNotice(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public NoticeReference getNoticeRef() - { - return noticeRef; - } - - public DisplayText getExplicitText() - { - return explicitText; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector av = new ASN1EncodableVector(); - - if (noticeRef != null) - { - av.add(noticeRef); - } - - if (explicitText != null) - { - av.add(explicitText); - } - - return new DERSequence(av); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V1TBSCertificateGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V1TBSCertificateGenerator.java deleted file mode 100644 index 69ea8d5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V1TBSCertificateGenerator.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1UTCTime; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; - -/** - * Generator for Version 1 TBSCertificateStructures. - *

    - * TBSCertificate ::= SEQUENCE {
    - *      version          [ 0 ]  Version DEFAULT v1(0),
    - *      serialNumber            CertificateSerialNumber,
    - *      signature               AlgorithmIdentifier,
    - *      issuer                  Name,
    - *      validity                Validity,
    - *      subject                 Name,
    - *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
    - *      }
    - * 
    - * - */ -public class V1TBSCertificateGenerator -{ - DERTaggedObject version = new DERTaggedObject(true, 0, new ASN1Integer(0)); - - ASN1Integer serialNumber; - AlgorithmIdentifier signature; - X500Name issuer; - Time startDate, endDate; - X500Name subject; - SubjectPublicKeyInfo subjectPublicKeyInfo; - - public V1TBSCertificateGenerator() - { - } - - public void setSerialNumber( - ASN1Integer serialNumber) - { - this.serialNumber = serialNumber; - } - - public void setSignature( - AlgorithmIdentifier signature) - { - this.signature = signature; - } - - /** - * @deprecated use X500Name method - */ - public void setIssuer( - X509Name issuer) - { - this.issuer = X500Name.getInstance(issuer.toASN1Primitive()); - } - - public void setIssuer( - X500Name issuer) - { - this.issuer = issuer; - } - - public void setStartDate( - Time startDate) - { - this.startDate = startDate; - } - - public void setStartDate( - ASN1UTCTime startDate) - { - this.startDate = new Time(startDate); - } - - public void setEndDate( - Time endDate) - { - this.endDate = endDate; - } - - public void setEndDate( - ASN1UTCTime endDate) - { - this.endDate = new Time(endDate); - } - - /** - * @deprecated use X500Name method - */ - public void setSubject( - X509Name subject) - { - this.subject = X500Name.getInstance(subject.toASN1Primitive()); - } - - public void setSubject( - X500Name subject) - { - this.subject = subject; - } - - public void setSubjectPublicKeyInfo( - SubjectPublicKeyInfo pubKeyInfo) - { - this.subjectPublicKeyInfo = pubKeyInfo; - } - - public TBSCertificate generateTBSCertificate() - { - if ((serialNumber == null) || (signature == null) - || (issuer == null) || (startDate == null) || (endDate == null) - || (subject == null) || (subjectPublicKeyInfo == null)) - { - throw new IllegalStateException("not all mandatory fields set in V1 TBScertificate generator"); - } - - ASN1EncodableVector seq = new ASN1EncodableVector(); - - // seq.add(version); - not required as default value. - seq.add(serialNumber); - seq.add(signature); - seq.add(issuer); - - // - // before and after dates - // - ASN1EncodableVector validity = new ASN1EncodableVector(); - - validity.add(startDate); - validity.add(endDate); - - seq.add(new DERSequence(validity)); - - seq.add(subject); - - seq.add(subjectPublicKeyInfo); - - return TBSCertificate.getInstance(new DERSequence(seq)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2AttributeCertificateInfoGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2AttributeCertificateInfoGenerator.java deleted file mode 100644 index 3df68fe..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2AttributeCertificateInfoGenerator.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERSet; - -/** - * Generator for Version 2 AttributeCertificateInfo - *
    - * AttributeCertificateInfo ::= SEQUENCE {
    - *       version              AttCertVersion -- version is v2,
    - *       holder               Holder,
    - *       issuer               AttCertIssuer,
    - *       signature            AlgorithmIdentifier,
    - *       serialNumber         CertificateSerialNumber,
    - *       attrCertValidityPeriod   AttCertValidityPeriod,
    - *       attributes           SEQUENCE OF Attribute,
    - *       issuerUniqueID       UniqueIdentifier OPTIONAL,
    - *       extensions           Extensions OPTIONAL
    - * }
    - * 
    - * - */ -public class V2AttributeCertificateInfoGenerator -{ - private ASN1Integer version; - private Holder holder; - private AttCertIssuer issuer; - private AlgorithmIdentifier signature; - private ASN1Integer serialNumber; - private ASN1EncodableVector attributes; - private DERBitString issuerUniqueID; - private Extensions extensions; - - // Note: validity period start/end dates stored directly - //private AttCertValidityPeriod attrCertValidityPeriod; - private ASN1GeneralizedTime startDate, endDate; - - public V2AttributeCertificateInfoGenerator() - { - this.version = new ASN1Integer(1); - attributes = new ASN1EncodableVector(); - } - - public void setHolder(Holder holder) - { - this.holder = holder; - } - - public void addAttribute(String oid, ASN1Encodable value) - { - attributes.add(new Attribute(new ASN1ObjectIdentifier(oid), new DERSet(value))); - } - - /** - * @param attribute - */ - public void addAttribute(Attribute attribute) - { - attributes.add(attribute); - } - - public void setSerialNumber( - ASN1Integer serialNumber) - { - this.serialNumber = serialNumber; - } - - public void setSignature( - AlgorithmIdentifier signature) - { - this.signature = signature; - } - - public void setIssuer( - AttCertIssuer issuer) - { - this.issuer = issuer; - } - - public void setStartDate( - ASN1GeneralizedTime startDate) - { - this.startDate = startDate; - } - - public void setEndDate( - ASN1GeneralizedTime endDate) - { - this.endDate = endDate; - } - - public void setIssuerUniqueID( - DERBitString issuerUniqueID) - { - this.issuerUniqueID = issuerUniqueID; - } - - /** - * @deprecated use method taking Extensions - * @param extensions - */ - public void setExtensions( - X509Extensions extensions) - { - this.extensions = Extensions.getInstance(extensions.toASN1Primitive()); - } - - public void setExtensions( - Extensions extensions) - { - this.extensions = extensions; - } - - public AttributeCertificateInfo generateAttributeCertificateInfo() - { - if ((serialNumber == null) || (signature == null) - || (issuer == null) || (startDate == null) || (endDate == null) - || (holder == null) || (attributes == null)) - { - throw new IllegalStateException("not all mandatory fields set in V2 AttributeCertificateInfo generator"); - } - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(holder); - v.add(issuer); - v.add(signature); - v.add(serialNumber); - - // - // before and after dates => AttCertValidityPeriod - // - AttCertValidityPeriod validity = new AttCertValidityPeriod(startDate, endDate); - v.add(validity); - - // Attributes - v.add(new DERSequence(attributes)); - - if (issuerUniqueID != null) - { - v.add(issuerUniqueID); - } - - if (extensions != null) - { - v.add(extensions); - } - - return AttributeCertificateInfo.getInstance(new DERSequence(v)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2Form.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2Form.java deleted file mode 100644 index 5444f02..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2Form.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -public class V2Form - extends ASN1Object -{ - GeneralNames issuerName; - IssuerSerial baseCertificateID; - ObjectDigestInfo objectDigestInfo; - - public static V2Form getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static V2Form getInstance( - Object obj) - { - if (obj == null || obj instanceof V2Form) - { - return (V2Form)obj; - } - else if (obj instanceof ASN1Sequence) - { - return new V2Form((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); - } - - public V2Form( - GeneralNames issuerName) - { - this.issuerName = issuerName; - } - - public V2Form( - ASN1Sequence seq) - { - if (seq.size() > 3) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - int index = 0; - - if (!(seq.getObjectAt(0) instanceof ASN1TaggedObject)) - { - index++; - this.issuerName = GeneralNames.getInstance(seq.getObjectAt(0)); - } - - for (int i = index; i != seq.size(); i++) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(i)); - if (o.getTagNo() == 0) - { - baseCertificateID = IssuerSerial.getInstance(o, false); - } - else if (o.getTagNo() == 1) - { - objectDigestInfo = ObjectDigestInfo.getInstance(o, false); - } - else - { - throw new IllegalArgumentException("Bad tag number: " - + o.getTagNo()); - } - } - } - - public GeneralNames getIssuerName() - { - return issuerName; - } - - public IssuerSerial getBaseCertificateID() - { - return baseCertificateID; - } - - public ObjectDigestInfo getObjectDigestInfo() - { - return objectDigestInfo; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  V2Form ::= SEQUENCE {
    -     *       issuerName            GeneralNames  OPTIONAL,
    -     *       baseCertificateID     [0] IssuerSerial  OPTIONAL,
    -     *       objectDigestInfo      [1] ObjectDigestInfo  OPTIONAL
    -     *         -- issuerName MUST be present in this profile
    -     *         -- baseCertificateID and objectDigestInfo MUST NOT
    -     *         -- be present in this profile
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (issuerName != null) - { - v.add(issuerName); - } - - if (baseCertificateID != null) - { - v.add(new DERTaggedObject(false, 0, baseCertificateID)); - } - - if (objectDigestInfo != null) - { - v.add(new DERTaggedObject(false, 1, objectDigestInfo)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2TBSCertListGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2TBSCertListGenerator.java deleted file mode 100644 index 00e9238..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V2TBSCertListGenerator.java +++ /dev/null @@ -1,281 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1UTCTime; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.X500Name; - -/** - * Generator for Version 2 TBSCertList structures. - *
    - *  TBSCertList  ::=  SEQUENCE  {
    - *       version                 Version OPTIONAL,
    - *                                    -- if present, shall be v2
    - *       signature               AlgorithmIdentifier,
    - *       issuer                  Name,
    - *       thisUpdate              Time,
    - *       nextUpdate              Time OPTIONAL,
    - *       revokedCertificates     SEQUENCE OF SEQUENCE  {
    - *            userCertificate         CertificateSerialNumber,
    - *            revocationDate          Time,
    - *            crlEntryExtensions      Extensions OPTIONAL
    - *                                          -- if present, shall be v2
    - *                                 }  OPTIONAL,
    - *       crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
    - *                                          -- if present, shall be v2
    - *                                 }
    - * 
    - * - * Note: This class may be subject to change - */ -public class V2TBSCertListGenerator -{ - private ASN1Integer version = new ASN1Integer(1); - private AlgorithmIdentifier signature; - private X500Name issuer; - private Time thisUpdate, nextUpdate=null; - private Extensions extensions = null; - private ASN1EncodableVector crlentries = new ASN1EncodableVector(); - - private final static ASN1Sequence[] reasons; - - static - { - reasons = new ASN1Sequence[11]; - - reasons[0] = createReasonExtension(CRLReason.unspecified); - reasons[1] = createReasonExtension(CRLReason.keyCompromise); - reasons[2] = createReasonExtension(CRLReason.cACompromise); - reasons[3] = createReasonExtension(CRLReason.affiliationChanged); - reasons[4] = createReasonExtension(CRLReason.superseded); - reasons[5] = createReasonExtension(CRLReason.cessationOfOperation); - reasons[6] = createReasonExtension(CRLReason.certificateHold); - reasons[7] = createReasonExtension(7); // 7 -> unknown - reasons[8] = createReasonExtension(CRLReason.removeFromCRL); - reasons[9] = createReasonExtension(CRLReason.privilegeWithdrawn); - reasons[10] = createReasonExtension(CRLReason.aACompromise); - } - - public V2TBSCertListGenerator() - { - } - - - public void setSignature( - AlgorithmIdentifier signature) - { - this.signature = signature; - } - - /** - * @deprecated use X500Name method - */ - public void setIssuer( - X509Name issuer) - { - this.issuer = X500Name.getInstance(issuer.toASN1Primitive()); - } - - public void setIssuer(X500Name issuer) - { - this.issuer = issuer; - } - - public void setThisUpdate( - ASN1UTCTime thisUpdate) - { - this.thisUpdate = new Time(thisUpdate); - } - - public void setNextUpdate( - ASN1UTCTime nextUpdate) - { - this.nextUpdate = new Time(nextUpdate); - } - - public void setThisUpdate( - Time thisUpdate) - { - this.thisUpdate = thisUpdate; - } - - public void setNextUpdate( - Time nextUpdate) - { - this.nextUpdate = nextUpdate; - } - - public void addCRLEntry( - ASN1Sequence crlEntry) - { - crlentries.add(crlEntry); - } - - public void addCRLEntry(ASN1Integer userCertificate, ASN1UTCTime revocationDate, int reason) - { - addCRLEntry(userCertificate, new Time(revocationDate), reason); - } - - public void addCRLEntry(ASN1Integer userCertificate, Time revocationDate, int reason) - { - addCRLEntry(userCertificate, revocationDate, reason, null); - } - - public void addCRLEntry(ASN1Integer userCertificate, Time revocationDate, int reason, ASN1GeneralizedTime invalidityDate) - { - if (reason != 0) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (reason < reasons.length) - { - if (reason < 0) - { - throw new IllegalArgumentException("invalid reason value: " + reason); - } - v.add(reasons[reason]); - } - else - { - v.add(createReasonExtension(reason)); - } - - if (invalidityDate != null) - { - v.add(createInvalidityDateExtension(revocationDate)); - } - - internalAddCRLEntry(userCertificate, revocationDate, new DERSequence(v)); - } - else if (invalidityDate != null) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(createInvalidityDateExtension(revocationDate)); - - internalAddCRLEntry(userCertificate, revocationDate, new DERSequence(v)); - } - else - { - addCRLEntry(userCertificate, revocationDate, null); - } - } - - private void internalAddCRLEntry(ASN1Integer userCertificate, Time revocationDate, ASN1Sequence extensions) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(userCertificate); - v.add(revocationDate); - - if (extensions != null) - { - v.add(extensions); - } - - addCRLEntry(new DERSequence(v)); - } - - public void addCRLEntry(ASN1Integer userCertificate, Time revocationDate, Extensions extensions) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(userCertificate); - v.add(revocationDate); - - if (extensions != null) - { - v.add(extensions); - } - - addCRLEntry(new DERSequence(v)); - } - - public void setExtensions( - X509Extensions extensions) - { - setExtensions(Extensions.getInstance(extensions)); - } - - public void setExtensions( - Extensions extensions) - { - this.extensions = extensions; - } - - public TBSCertList generateTBSCertList() - { - if ((signature == null) || (issuer == null) || (thisUpdate == null)) - { - throw new IllegalStateException("Not all mandatory fields set in V2 TBSCertList generator."); - } - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(signature); - v.add(issuer); - - v.add(thisUpdate); - if (nextUpdate != null) - { - v.add(nextUpdate); - } - - // Add CRLEntries if they exist - if (crlentries.size() != 0) - { - v.add(new DERSequence(crlentries)); - } - - if (extensions != null) - { - v.add(new DERTaggedObject(0, extensions)); - } - - return new TBSCertList(new DERSequence(v)); - } - - private static ASN1Sequence createReasonExtension(int reasonCode) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - CRLReason crlReason = CRLReason.lookup(reasonCode); - - try - { - v.add(Extension.reasonCode); - v.add(new DEROctetString(crlReason.getEncoded())); - } - catch (IOException e) - { - throw new IllegalArgumentException("error encoding reason: " + e); - } - - return new DERSequence(v); - } - - private static ASN1Sequence createInvalidityDateExtension(Time invalidityDate) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - try - { - v.add(Extension.invalidityDate); - v.add(new DEROctetString(invalidityDate.getEncoded())); - } - catch (IOException e) - { - throw new IllegalArgumentException("error encoding reason: " + e); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V3TBSCertificateGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V3TBSCertificateGenerator.java deleted file mode 100644 index 8056c1a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/V3TBSCertificateGenerator.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.DERUTCTime; -import org.bc.asn1.x500.X500Name; - -/** - * Generator for Version 3 TBSCertificateStructures. - *
    - * TBSCertificate ::= SEQUENCE {
    - *      version          [ 0 ]  Version DEFAULT v1(0),
    - *      serialNumber            CertificateSerialNumber,
    - *      signature               AlgorithmIdentifier,
    - *      issuer                  Name,
    - *      validity                Validity,
    - *      subject                 Name,
    - *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
    - *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
    - *      extensions        [ 3 ] Extensions OPTIONAL
    - *      }
    - * 
    - * - */ -public class V3TBSCertificateGenerator -{ - DERTaggedObject version = new DERTaggedObject(true, 0, new ASN1Integer(2)); - - ASN1Integer serialNumber; - AlgorithmIdentifier signature; - X500Name issuer; - Time startDate, endDate; - X500Name subject; - SubjectPublicKeyInfo subjectPublicKeyInfo; - Extensions extensions; - - private boolean altNamePresentAndCritical; - private DERBitString issuerUniqueID; - private DERBitString subjectUniqueID; - - public V3TBSCertificateGenerator() - { - } - - public void setSerialNumber( - ASN1Integer serialNumber) - { - this.serialNumber = serialNumber; - } - - public void setSignature( - AlgorithmIdentifier signature) - { - this.signature = signature; - } - - /** - * @deprecated use X500Name method - */ - public void setIssuer( - X509Name issuer) - { - this.issuer = X500Name.getInstance(issuer); - } - - public void setIssuer( - X500Name issuer) - { - this.issuer = issuer; - } - - public void setStartDate( - DERUTCTime startDate) - { - this.startDate = new Time(startDate); - } - - public void setStartDate( - Time startDate) - { - this.startDate = startDate; - } - - public void setEndDate( - DERUTCTime endDate) - { - this.endDate = new Time(endDate); - } - - public void setEndDate( - Time endDate) - { - this.endDate = endDate; - } - - /** - * @deprecated use X500Name method - */ - public void setSubject( - X509Name subject) - { - this.subject = X500Name.getInstance(subject.toASN1Primitive()); - } - - public void setSubject( - X500Name subject) - { - this.subject = subject; - } - - public void setIssuerUniqueID( - DERBitString uniqueID) - { - this.issuerUniqueID = uniqueID; - } - - public void setSubjectUniqueID( - DERBitString uniqueID) - { - this.subjectUniqueID = uniqueID; - } - - public void setSubjectPublicKeyInfo( - SubjectPublicKeyInfo pubKeyInfo) - { - this.subjectPublicKeyInfo = pubKeyInfo; - } - - /** - * @deprecated use method taking Extensions - * @param extensions - */ - public void setExtensions( - X509Extensions extensions) - { - setExtensions(Extensions.getInstance(extensions)); - } - - public void setExtensions( - Extensions extensions) - { - this.extensions = extensions; - if (extensions != null) - { - Extension altName = extensions.getExtension(Extension.subjectAlternativeName); - - if (altName != null && altName.isCritical()) - { - altNamePresentAndCritical = true; - } - } - } - - public TBSCertificate generateTBSCertificate() - { - if ((serialNumber == null) || (signature == null) - || (issuer == null) || (startDate == null) || (endDate == null) - || (subject == null && !altNamePresentAndCritical) || (subjectPublicKeyInfo == null)) - { - throw new IllegalStateException("not all mandatory fields set in V3 TBScertificate generator"); - } - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(serialNumber); - v.add(signature); - v.add(issuer); - - // - // before and after dates - // - ASN1EncodableVector validity = new ASN1EncodableVector(); - - validity.add(startDate); - validity.add(endDate); - - v.add(new DERSequence(validity)); - - if (subject != null) - { - v.add(subject); - } - else - { - v.add(new DERSequence()); - } - - v.add(subjectPublicKeyInfo); - - if (issuerUniqueID != null) - { - v.add(new DERTaggedObject(false, 1, issuerUniqueID)); - } - - if (subjectUniqueID != null) - { - v.add(new DERTaggedObject(false, 2, subjectUniqueID)); - } - - if (extensions != null) - { - v.add(new DERTaggedObject(true, 3, extensions)); - } - - return TBSCertificate.getInstance(new DERSequence(v)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509AttributeIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509AttributeIdentifiers.java deleted file mode 100644 index 7befb9a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509AttributeIdentifiers.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface X509AttributeIdentifiers -{ - /** - * @deprecated use id_at_role - */ - static final ASN1ObjectIdentifier RoleSyntax = new ASN1ObjectIdentifier("2.5.4.72"); - - static final ASN1ObjectIdentifier id_pe_ac_auditIdentity = X509ObjectIdentifiers.id_pe.branch("4"); - static final ASN1ObjectIdentifier id_pe_aaControls = X509ObjectIdentifiers.id_pe.branch("6"); - static final ASN1ObjectIdentifier id_pe_ac_proxying = X509ObjectIdentifiers.id_pe.branch("10"); - - static final ASN1ObjectIdentifier id_ce_targetInformation= X509ObjectIdentifiers.id_ce.branch("55"); - - static final ASN1ObjectIdentifier id_aca = X509ObjectIdentifiers.id_pkix.branch("10"); - - static final ASN1ObjectIdentifier id_aca_authenticationInfo = id_aca.branch("1"); - static final ASN1ObjectIdentifier id_aca_accessIdentity = id_aca.branch("2"); - static final ASN1ObjectIdentifier id_aca_chargingIdentity = id_aca.branch("3"); - static final ASN1ObjectIdentifier id_aca_group = id_aca.branch("4"); - // { id-aca 5 } is reserved - static final ASN1ObjectIdentifier id_aca_encAttrs = id_aca.branch("6"); - - static final ASN1ObjectIdentifier id_at_role = new ASN1ObjectIdentifier("2.5.4.72"); - static final ASN1ObjectIdentifier id_at_clearance = new ASN1ObjectIdentifier("2.5.1.5.55"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509CertificateStructure.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509CertificateStructure.java deleted file mode 100644 index 80ef3b8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509CertificateStructure.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.bc.asn1.x509; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.x500.X500Name; - -/** - * an X509Certificate structure. - *
    - *  Certificate ::= SEQUENCE {
    - *      tbsCertificate          TBSCertificate,
    - *      signatureAlgorithm      AlgorithmIdentifier,
    - *      signature               BIT STRING
    - *  }
    - * 
    - * @deprecated use org.bouncycastle.asn1.x509.Certificate - */ -public class X509CertificateStructure - extends ASN1Object - implements X509ObjectIdentifiers, PKCSObjectIdentifiers -{ - ASN1Sequence seq; - TBSCertificateStructure tbsCert; - AlgorithmIdentifier sigAlgId; - DERBitString sig; - - public static X509CertificateStructure getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static X509CertificateStructure getInstance( - Object obj) - { - if (obj instanceof X509CertificateStructure) - { - return (X509CertificateStructure)obj; - } - else if (obj != null) - { - return new X509CertificateStructure(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public X509CertificateStructure( - ASN1Sequence seq) - { - this.seq = seq; - - // - // correct x509 certficate - // - if (seq.size() == 3) - { - tbsCert = TBSCertificateStructure.getInstance(seq.getObjectAt(0)); - sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); - - sig = DERBitString.getInstance(seq.getObjectAt(2)); - } - else - { - throw new IllegalArgumentException("sequence wrong size for a certificate"); - } - } - - public TBSCertificateStructure getTBSCertificate() - { - return tbsCert; - } - - public int getVersion() - { - return tbsCert.getVersion(); - } - - public ASN1Integer getSerialNumber() - { - return tbsCert.getSerialNumber(); - } - - public X500Name getIssuer() - { - return tbsCert.getIssuer(); - } - - public Time getStartDate() - { - return tbsCert.getStartDate(); - } - - public Time getEndDate() - { - return tbsCert.getEndDate(); - } - - public X500Name getSubject() - { - return tbsCert.getSubject(); - } - - public SubjectPublicKeyInfo getSubjectPublicKeyInfo() - { - return tbsCert.getSubjectPublicKeyInfo(); - } - - public AlgorithmIdentifier getSignatureAlgorithm() - { - return sigAlgId; - } - - public DERBitString getSignature() - { - return sig; - } - - public ASN1Primitive toASN1Primitive() - { - return seq; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509DefaultEntryConverter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509DefaultEntryConverter.java deleted file mode 100644 index 6f2d9ba..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509DefaultEntryConverter.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERGeneralizedTime; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERUTF8String; - -/** - * The default converter for X509 DN entries when going from their - * string value to ASN.1 strings. - */ -public class X509DefaultEntryConverter - extends X509NameEntryConverter -{ - /** - * Apply default coversion for the given value depending on the oid - * and the character range of the value. - * - * @param oid the object identifier for the DN entry - * @param value the value associated with it - * @return the ASN.1 equivalent for the string value. - */ - public ASN1Primitive getConvertedValue( - ASN1ObjectIdentifier oid, - String value) - { - if (value.length() != 0 && value.charAt(0) == '#') - { - try - { - return convertHexEncoded(value, 1); - } - catch (IOException e) - { - throw new RuntimeException("can't recode value for oid " + oid.getId()); - } - } - else - { - if (value.length() != 0 && value.charAt(0) == '\\') - { - value = value.substring(1); - } - if (oid.equals(X509Name.EmailAddress) || oid.equals(X509Name.DC)) - { - return new DERIA5String(value); - } - else if (oid.equals(X509Name.DATE_OF_BIRTH)) // accept time string as well as # (for compatibility) - { - return new DERGeneralizedTime(value); - } - else if (oid.equals(X509Name.C) || oid.equals(X509Name.SN) || oid.equals(X509Name.DN_QUALIFIER) - || oid.equals(X509Name.TELEPHONE_NUMBER)) - { - return new DERPrintableString(value); - } - } - - return new DERUTF8String(value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extension.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extension.java deleted file mode 100644 index 5ac4829..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extension.java +++ /dev/null @@ -1,248 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERBoolean; - -/** - * an object for the elements in the X.509 V3 extension block. - */ -public class X509Extension -{ - /** - * Subject Directory Attributes - */ - public static final ASN1ObjectIdentifier subjectDirectoryAttributes = new ASN1ObjectIdentifier("2.5.29.9"); - - /** - * Subject Key Identifier - */ - public static final ASN1ObjectIdentifier subjectKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.14"); - - /** - * Key Usage - */ - public static final ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier("2.5.29.15"); - - /** - * Private Key Usage Period - */ - public static final ASN1ObjectIdentifier privateKeyUsagePeriod = new ASN1ObjectIdentifier("2.5.29.16"); - - /** - * Subject Alternative Name - */ - public static final ASN1ObjectIdentifier subjectAlternativeName = new ASN1ObjectIdentifier("2.5.29.17"); - - /** - * Issuer Alternative Name - */ - public static final ASN1ObjectIdentifier issuerAlternativeName = new ASN1ObjectIdentifier("2.5.29.18"); - - /** - * Basic Constraints - */ - public static final ASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier("2.5.29.19"); - - /** - * CRL Number - */ - public static final ASN1ObjectIdentifier cRLNumber = new ASN1ObjectIdentifier("2.5.29.20"); - - /** - * Reason code - */ - public static final ASN1ObjectIdentifier reasonCode = new ASN1ObjectIdentifier("2.5.29.21"); - - /** - * Hold Instruction Code - */ - public static final ASN1ObjectIdentifier instructionCode = new ASN1ObjectIdentifier("2.5.29.23"); - - /** - * Invalidity Date - */ - public static final ASN1ObjectIdentifier invalidityDate = new ASN1ObjectIdentifier("2.5.29.24"); - - /** - * Delta CRL indicator - */ - public static final ASN1ObjectIdentifier deltaCRLIndicator = new ASN1ObjectIdentifier("2.5.29.27"); - - /** - * Issuing Distribution Point - */ - public static final ASN1ObjectIdentifier issuingDistributionPoint = new ASN1ObjectIdentifier("2.5.29.28"); - - /** - * Certificate Issuer - */ - public static final ASN1ObjectIdentifier certificateIssuer = new ASN1ObjectIdentifier("2.5.29.29"); - - /** - * Name Constraints - */ - public static final ASN1ObjectIdentifier nameConstraints = new ASN1ObjectIdentifier("2.5.29.30"); - - /** - * CRL Distribution Points - */ - public static final ASN1ObjectIdentifier cRLDistributionPoints = new ASN1ObjectIdentifier("2.5.29.31"); - - /** - * Certificate Policies - */ - public static final ASN1ObjectIdentifier certificatePolicies = new ASN1ObjectIdentifier("2.5.29.32"); - - /** - * Policy Mappings - */ - public static final ASN1ObjectIdentifier policyMappings = new ASN1ObjectIdentifier("2.5.29.33"); - - /** - * Authority Key Identifier - */ - public static final ASN1ObjectIdentifier authorityKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.35"); - - /** - * Policy Constraints - */ - public static final ASN1ObjectIdentifier policyConstraints = new ASN1ObjectIdentifier("2.5.29.36"); - - /** - * Extended Key Usage - */ - public static final ASN1ObjectIdentifier extendedKeyUsage = new ASN1ObjectIdentifier("2.5.29.37"); - - /** - * Freshest CRL - */ - public static final ASN1ObjectIdentifier freshestCRL = new ASN1ObjectIdentifier("2.5.29.46"); - - /** - * Inhibit Any Policy - */ - public static final ASN1ObjectIdentifier inhibitAnyPolicy = new ASN1ObjectIdentifier("2.5.29.54"); - - /** - * Authority Info Access - */ - public static final ASN1ObjectIdentifier authorityInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.1"); - - /** - * Subject Info Access - */ - public static final ASN1ObjectIdentifier subjectInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.11"); - - /** - * Logo Type - */ - public static final ASN1ObjectIdentifier logoType = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.12"); - - /** - * BiometricInfo - */ - public static final ASN1ObjectIdentifier biometricInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.2"); - - /** - * QCStatements - */ - public static final ASN1ObjectIdentifier qCStatements = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.3"); - - /** - * Audit identity extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier auditIdentity = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.4"); - - /** - * NoRevAvail extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier noRevAvail = new ASN1ObjectIdentifier("2.5.29.56"); - - /** - * TargetInformation extension in attribute certificates. - */ - public static final ASN1ObjectIdentifier targetInformation = new ASN1ObjectIdentifier("2.5.29.55"); - - boolean critical; - ASN1OctetString value; - - public X509Extension( - DERBoolean critical, - ASN1OctetString value) - { - this.critical = critical.isTrue(); - this.value = value; - } - - public X509Extension( - boolean critical, - ASN1OctetString value) - { - this.critical = critical; - this.value = value; - } - - public boolean isCritical() - { - return critical; - } - - public ASN1OctetString getValue() - { - return value; - } - - public ASN1Encodable getParsedValue() - { - return convertValueToObject(this); - } - - public int hashCode() - { - if (this.isCritical()) - { - return this.getValue().hashCode(); - } - - return ~this.getValue().hashCode(); - } - - public boolean equals( - Object o) - { - if (!(o instanceof X509Extension)) - { - return false; - } - - X509Extension other = (X509Extension)o; - - return other.getValue().equals(this.getValue()) - && (other.isCritical() == this.isCritical()); - } - - /** - * Convert the value of the passed in extension to an object - * @param ext the extension to parse - * @return the object the value string contains - * @exception IllegalArgumentException if conversion is not possible - */ - public static ASN1Primitive convertValueToObject( - X509Extension ext) - throws IllegalArgumentException - { - try - { - return ASN1Primitive.fromByteArray(ext.getValue().getOctets()); - } - catch (IOException e) - { - throw new IllegalArgumentException("can't convert extension: " + e); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extensions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extensions.java deleted file mode 100644 index 096d6b7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Extensions.java +++ /dev/null @@ -1,489 +0,0 @@ -package org.bc.asn1.x509; - -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBoolean; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DERSequence; - -/** - * @deprecated use Extensions - */ -public class X509Extensions - extends ASN1Object -{ - /** - * Subject Directory Attributes - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier SubjectDirectoryAttributes = new ASN1ObjectIdentifier("2.5.29.9"); - - /** - * Subject Key Identifier - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier SubjectKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.14"); - - /** - * Key Usage - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier KeyUsage = new ASN1ObjectIdentifier("2.5.29.15"); - - /** - * Private Key Usage Period - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier PrivateKeyUsagePeriod = new ASN1ObjectIdentifier("2.5.29.16"); - - /** - * Subject Alternative Name - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier SubjectAlternativeName = new ASN1ObjectIdentifier("2.5.29.17"); - - /** - * Issuer Alternative Name - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier IssuerAlternativeName = new ASN1ObjectIdentifier("2.5.29.18"); - - /** - * Basic Constraints - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier BasicConstraints = new ASN1ObjectIdentifier("2.5.29.19"); - - /** - * CRL Number - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier CRLNumber = new ASN1ObjectIdentifier("2.5.29.20"); - - /** - * Reason code - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier ReasonCode = new ASN1ObjectIdentifier("2.5.29.21"); - - /** - * Hold Instruction Code - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier InstructionCode = new ASN1ObjectIdentifier("2.5.29.23"); - - /** - * Invalidity Date - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier InvalidityDate = new ASN1ObjectIdentifier("2.5.29.24"); - - /** - * Delta CRL indicator - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier DeltaCRLIndicator = new ASN1ObjectIdentifier("2.5.29.27"); - - /** - * Issuing Distribution Point - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier IssuingDistributionPoint = new ASN1ObjectIdentifier("2.5.29.28"); - - /** - * Certificate Issuer - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier CertificateIssuer = new ASN1ObjectIdentifier("2.5.29.29"); - - /** - * Name Constraints - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier NameConstraints = new ASN1ObjectIdentifier("2.5.29.30"); - - /** - * CRL Distribution Points - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier CRLDistributionPoints = new ASN1ObjectIdentifier("2.5.29.31"); - - /** - * Certificate Policies - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier CertificatePolicies = new ASN1ObjectIdentifier("2.5.29.32"); - - /** - * Policy Mappings - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier PolicyMappings = new ASN1ObjectIdentifier("2.5.29.33"); - - /** - * Authority Key Identifier - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier AuthorityKeyIdentifier = new ASN1ObjectIdentifier("2.5.29.35"); - - /** - * Policy Constraints - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier PolicyConstraints = new ASN1ObjectIdentifier("2.5.29.36"); - - /** - * Extended Key Usage - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier ExtendedKeyUsage = new ASN1ObjectIdentifier("2.5.29.37"); - - /** - * Freshest CRL - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier FreshestCRL = new ASN1ObjectIdentifier("2.5.29.46"); - - /** - * Inhibit Any Policy - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier InhibitAnyPolicy = new ASN1ObjectIdentifier("2.5.29.54"); - - /** - * Authority Info Access - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier AuthorityInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.1"); - - /** - * Subject Info Access - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier SubjectInfoAccess = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.11"); - - /** - * Logo Type - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier LogoType = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.12"); - - /** - * BiometricInfo - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier BiometricInfo = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.2"); - - /** - * QCStatements - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier QCStatements = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.3"); - - /** - * Audit identity extension in attribute certificates. - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier AuditIdentity = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.1.4"); - - /** - * NoRevAvail extension in attribute certificates. - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier NoRevAvail = new ASN1ObjectIdentifier("2.5.29.56"); - - /** - * TargetInformation extension in attribute certificates. - * @deprecated use X509Extension value. - */ - public static final ASN1ObjectIdentifier TargetInformation = new ASN1ObjectIdentifier("2.5.29.55"); - - private Hashtable extensions = new Hashtable(); - private Vector ordering = new Vector(); - - public static X509Extensions getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static X509Extensions getInstance( - Object obj) - { - if (obj == null || obj instanceof X509Extensions) - { - return (X509Extensions)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new X509Extensions((ASN1Sequence)obj); - } - - if (obj instanceof Extensions) - { - return new X509Extensions((ASN1Sequence)((Extensions)obj).toASN1Primitive()); - } - - if (obj instanceof ASN1TaggedObject) - { - return getInstance(((ASN1TaggedObject)obj).getObject()); - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - * - * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString) - */ - public X509Extensions( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Sequence s = ASN1Sequence.getInstance(e.nextElement()); - - if (s.size() == 3) - { - extensions.put(s.getObjectAt(0), new X509Extension(DERBoolean.getInstance(s.getObjectAt(1)), ASN1OctetString.getInstance(s.getObjectAt(2)))); - } - else if (s.size() == 2) - { - extensions.put(s.getObjectAt(0), new X509Extension(false, ASN1OctetString.getInstance(s.getObjectAt(1)))); - } - else - { - throw new IllegalArgumentException("Bad sequence size: " + s.size()); - } - - ordering.addElement(s.getObjectAt(0)); - } - } - - /** - * constructor from a table of extensions. - *

    - * it's is assumed the table contains OID/String pairs. - */ - public X509Extensions( - Hashtable extensions) - { - this(null, extensions); - } - - /** - * Constructor from a table of extensions with ordering. - *

    - * It's is assumed the table contains OID/String pairs. - * @deprecated use Extensions - */ - public X509Extensions( - Vector ordering, - Hashtable extensions) - { - Enumeration e; - - if (ordering == null) - { - e = extensions.keys(); - } - else - { - e = ordering.elements(); - } - - while (e.hasMoreElements()) - { - this.ordering.addElement(ASN1ObjectIdentifier.getInstance(e.nextElement())); - } - - e = this.ordering.elements(); - - while (e.hasMoreElements()) - { - ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(e.nextElement()); - X509Extension ext = (X509Extension)extensions.get(oid); - - this.extensions.put(oid, ext); - } - } - - /** - * Constructor from two vectors - * - * @param objectIDs a vector of the object identifiers. - * @param values a vector of the extension values. - * @deprecated use Extensions - */ - public X509Extensions( - Vector objectIDs, - Vector values) - { - Enumeration e = objectIDs.elements(); - - while (e.hasMoreElements()) - { - this.ordering.addElement(e.nextElement()); - } - - int count = 0; - - e = this.ordering.elements(); - - while (e.hasMoreElements()) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); - X509Extension ext = (X509Extension)values.elementAt(count); - - this.extensions.put(oid, ext); - count++; - } - } - - /** - * return an Enumeration of the extension field's object ids. - */ - public Enumeration oids() - { - return ordering.elements(); - } - - /** - * return the extension represented by the object identifier - * passed in. - * - * @return the extension if it's present, null otherwise. - */ - public X509Extension getExtension( - DERObjectIdentifier oid) - { - return (X509Extension)extensions.get(oid); - } - - /** - * @deprecated - * @param oid - * @return - */ - public X509Extension getExtension( - ASN1ObjectIdentifier oid) - { - return (X509Extension)extensions.get(oid); - } - - /** - *

    -     *     Extensions        ::=   SEQUENCE SIZE (1..MAX) OF Extension
    -     *
    -     *     Extension         ::=   SEQUENCE {
    -     *        extnId            EXTENSION.&id ({ExtensionSet}),
    -     *        critical          BOOLEAN DEFAULT FALSE,
    -     *        extnValue         OCTET STRING }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - Enumeration e = ordering.elements(); - - while (e.hasMoreElements()) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); - X509Extension ext = (X509Extension)extensions.get(oid); - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(oid); - - if (ext.isCritical()) - { - v.add(DERBoolean.TRUE); - } - - v.add(ext.getValue()); - - vec.add(new DERSequence(v)); - } - - return new DERSequence(vec); - } - - public boolean equivalent( - X509Extensions other) - { - if (extensions.size() != other.extensions.size()) - { - return false; - } - - Enumeration e1 = extensions.keys(); - - while (e1.hasMoreElements()) - { - Object key = e1.nextElement(); - - if (!extensions.get(key).equals(other.extensions.get(key))) - { - return false; - } - } - - return true; - } - - public ASN1ObjectIdentifier[] getExtensionOIDs() - { - return toOidArray(ordering); - } - - public ASN1ObjectIdentifier[] getNonCriticalExtensionOIDs() - { - return getExtensionOIDs(false); - } - - public ASN1ObjectIdentifier[] getCriticalExtensionOIDs() - { - return getExtensionOIDs(true); - } - - private ASN1ObjectIdentifier[] getExtensionOIDs(boolean isCritical) - { - Vector oidVec = new Vector(); - - for (int i = 0; i != ordering.size(); i++) - { - Object oid = ordering.elementAt(i); - - if (((X509Extension)extensions.get(oid)).isCritical() == isCritical) - { - oidVec.addElement(oid); - } - } - - return toOidArray(oidVec); - } - - private ASN1ObjectIdentifier[] toOidArray(Vector oidVec) - { - ASN1ObjectIdentifier[] oids = new ASN1ObjectIdentifier[oidVec.size()]; - - for (int i = 0; i != oids.length; i++) - { - oids[i] = (ASN1ObjectIdentifier)oidVec.elementAt(i); - } - return oids; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ExtensionsGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ExtensionsGenerator.java deleted file mode 100644 index a6c98c1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ExtensionsGenerator.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DEROctetString; - -/** - * Generator for X.509 extensions - * @deprecated use org.bouncycastle.asn1.x509.ExtensionsGenerator - */ -public class X509ExtensionsGenerator -{ - private Hashtable extensions = new Hashtable(); - private Vector extOrdering = new Vector(); - - /** - * Reset the generator - */ - public void reset() - { - extensions = new Hashtable(); - extOrdering = new Vector(); - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public void addExtension( - DERObjectIdentifier oid, - boolean critical, - ASN1Encodable value) - { - addExtension(new ASN1ObjectIdentifier(oid.getId()), critical, value); - } - - /** - * @deprecated use ASN1ObjectIdentifier - */ - public void addExtension( - DERObjectIdentifier oid, - boolean critical, - byte[] value) - { - addExtension(new ASN1ObjectIdentifier(oid.getId()), critical, value); - } - - /** - * Add an extension with the given oid and the passed in value to be included - * in the OCTET STRING associated with the extension. - * - * @param oid OID for the extension. - * @param critical true if critical, false otherwise. - * @param value the ASN.1 object to be included in the extension. - */ - public void addExtension( - ASN1ObjectIdentifier oid, - boolean critical, - ASN1Encodable value) - { - try - { - this.addExtension(oid, critical, value.toASN1Primitive().getEncoded(ASN1Encoding.DER)); - } - catch (IOException e) - { - throw new IllegalArgumentException("error encoding value: " + e); - } - } - - /** - * Add an extension with the given oid and the passed in byte array to be wrapped in the - * OCTET STRING associated with the extension. - * - * @param oid OID for the extension. - * @param critical true if critical, false otherwise. - * @param value the byte array to be wrapped. - */ - public void addExtension( - ASN1ObjectIdentifier oid, - boolean critical, - byte[] value) - { - if (extensions.containsKey(oid)) - { - throw new IllegalArgumentException("extension " + oid + " already added"); - } - - extOrdering.addElement(oid); - extensions.put(oid, new X509Extension(critical, new DEROctetString(value))); - } - - /** - * Return true if there are no extension present in this generator. - * - * @return true if empty, false otherwise - */ - public boolean isEmpty() - { - return extOrdering.isEmpty(); - } - - /** - * Generate an X509Extensions object based on the current state of the generator. - * - * @return an X09Extensions object. - */ - public X509Extensions generate() - { - return new X509Extensions(extOrdering, extensions); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Name.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Name.java deleted file mode 100644 index bb17373..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509Name.java +++ /dev/null @@ -1,1280 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1Set; -import org.bc.asn1.ASN1String; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERSet; -import org.bc.asn1.DERUniversalString; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.x500.X500Name; -import org.bc.util.Strings; -import org.bc.util.encoders.Hex; - -/** - *
    - *     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
    - *
    - *     RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
    - *
    - *     AttributeTypeAndValue ::= SEQUENCE {
    - *                                   type  OBJECT IDENTIFIER,
    - *                                   value ANY }
    - * 
    - * @deprecated use org.bouncycastle.asn1.x500.X500Name. - */ -public class X509Name - extends ASN1Object -{ - /** - * country code - StringType(SIZE(2)) - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier C = new ASN1ObjectIdentifier("2.5.4.6"); - - /** - * organization - StringType(SIZE(1..64)) - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier O = new ASN1ObjectIdentifier("2.5.4.10"); - - /** - * organizational unit name - StringType(SIZE(1..64)) - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier OU = new ASN1ObjectIdentifier("2.5.4.11"); - - /** - * Title - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier T = new ASN1ObjectIdentifier("2.5.4.12"); - - /** - * common name - StringType(SIZE(1..64)) - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier CN = new ASN1ObjectIdentifier("2.5.4.3"); - - /** - * device serial number name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier SN = new ASN1ObjectIdentifier("2.5.4.5"); - - /** - * street - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier STREET = new ASN1ObjectIdentifier("2.5.4.9"); - - /** - * device serial number name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier SERIALNUMBER = SN; - - /** - * locality name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier L = new ASN1ObjectIdentifier("2.5.4.7"); - - /** - * state, or province name - StringType(SIZE(1..64)) - */ - public static final ASN1ObjectIdentifier ST = new ASN1ObjectIdentifier("2.5.4.8"); - - /** - * Naming attributes of type X520name - */ - public static final ASN1ObjectIdentifier SURNAME = new ASN1ObjectIdentifier("2.5.4.4"); - public static final ASN1ObjectIdentifier GIVENNAME = new ASN1ObjectIdentifier("2.5.4.42"); - public static final ASN1ObjectIdentifier INITIALS = new ASN1ObjectIdentifier("2.5.4.43"); - public static final ASN1ObjectIdentifier GENERATION = new ASN1ObjectIdentifier("2.5.4.44"); - public static final ASN1ObjectIdentifier UNIQUE_IDENTIFIER = new ASN1ObjectIdentifier("2.5.4.45"); - - /** - * businessCategory - DirectoryString(SIZE(1..128) - */ - public static final ASN1ObjectIdentifier BUSINESS_CATEGORY = new ASN1ObjectIdentifier( - "2.5.4.15"); - - /** - * postalCode - DirectoryString(SIZE(1..40) - */ - public static final ASN1ObjectIdentifier POSTAL_CODE = new ASN1ObjectIdentifier( - "2.5.4.17"); - - /** - * dnQualifier - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier DN_QUALIFIER = new ASN1ObjectIdentifier( - "2.5.4.46"); - - /** - * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier PSEUDONYM = new ASN1ObjectIdentifier( - "2.5.4.65"); - - - /** - * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z - */ - public static final ASN1ObjectIdentifier DATE_OF_BIRTH = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.1"); - - /** - * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128) - */ - public static final ASN1ObjectIdentifier PLACE_OF_BIRTH = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.2"); - - /** - * RFC 3039 Gender - PrintableString (SIZE(1)) -- "M", "F", "m" or "f" - */ - public static final ASN1ObjectIdentifier GENDER = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.3"); - - /** - * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166 - * codes only - */ - public static final ASN1ObjectIdentifier COUNTRY_OF_CITIZENSHIP = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.4"); - - /** - * RFC 3039 CountryOfResidence - PrintableString (SIZE (2)) -- ISO 3166 - * codes only - */ - public static final ASN1ObjectIdentifier COUNTRY_OF_RESIDENCE = new ASN1ObjectIdentifier( - "1.3.6.1.5.5.7.9.5"); - - - /** - * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64) - */ - public static final ASN1ObjectIdentifier NAME_AT_BIRTH = new ASN1ObjectIdentifier("1.3.36.8.3.14"); - - /** - * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF - * DirectoryString(SIZE(1..30)) - */ - public static final ASN1ObjectIdentifier POSTAL_ADDRESS = new ASN1ObjectIdentifier("2.5.4.16"); - - /** - * RFC 2256 dmdName - */ - public static final ASN1ObjectIdentifier DMD_NAME = new ASN1ObjectIdentifier("2.5.4.54"); - - /** - * id-at-telephoneNumber - */ - public static final ASN1ObjectIdentifier TELEPHONE_NUMBER = X509ObjectIdentifiers.id_at_telephoneNumber; - - /** - * id-at-name - */ - public static final ASN1ObjectIdentifier NAME = X509ObjectIdentifiers.id_at_name; - - /** - * Email address (RSA PKCS#9 extension) - IA5String. - *

    Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here. - * @deprecated use a X500NameStyle - */ - public static final ASN1ObjectIdentifier EmailAddress = PKCSObjectIdentifiers.pkcs_9_at_emailAddress; - - /** - * more from PKCS#9 - */ - public static final ASN1ObjectIdentifier UnstructuredName = PKCSObjectIdentifiers.pkcs_9_at_unstructuredName; - public static final ASN1ObjectIdentifier UnstructuredAddress = PKCSObjectIdentifiers.pkcs_9_at_unstructuredAddress; - - /** - * email address in Verisign certificates - */ - public static final ASN1ObjectIdentifier E = EmailAddress; - - /* - * others... - */ - public static final ASN1ObjectIdentifier DC = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25"); - - /** - * LDAP User id. - */ - public static final ASN1ObjectIdentifier UID = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1"); - - /** - * determines whether or not strings should be processed and printed - * from back to front. - */ - public static boolean DefaultReverse = false; - - /** - * default look up table translating OID values into their common symbols following - * the convention in RFC 2253 with a few extras - */ - public static final Hashtable DefaultSymbols = new Hashtable(); - - /** - * look up table translating OID values into their common symbols following the convention in RFC 2253 - * - */ - public static final Hashtable RFC2253Symbols = new Hashtable(); - - /** - * look up table translating OID values into their common symbols following the convention in RFC 1779 - * - */ - public static final Hashtable RFC1779Symbols = new Hashtable(); - - /** - * look up table translating common symbols into their OIDS. - */ - public static final Hashtable DefaultLookUp = new Hashtable(); - - /** - * look up table translating OID values into their common symbols - * @deprecated use DefaultSymbols - */ - public static final Hashtable OIDLookUp = DefaultSymbols; - - /** - * look up table translating string values into their OIDS - - * @deprecated use DefaultLookUp - */ - public static final Hashtable SymbolLookUp = DefaultLookUp; - - private static final Boolean TRUE = new Boolean(true); // for J2ME compatibility - private static final Boolean FALSE = new Boolean(false); - - static - { - DefaultSymbols.put(C, "C"); - DefaultSymbols.put(O, "O"); - DefaultSymbols.put(T, "T"); - DefaultSymbols.put(OU, "OU"); - DefaultSymbols.put(CN, "CN"); - DefaultSymbols.put(L, "L"); - DefaultSymbols.put(ST, "ST"); - DefaultSymbols.put(SN, "SERIALNUMBER"); - DefaultSymbols.put(EmailAddress, "E"); - DefaultSymbols.put(DC, "DC"); - DefaultSymbols.put(UID, "UID"); - DefaultSymbols.put(STREET, "STREET"); - DefaultSymbols.put(SURNAME, "SURNAME"); - DefaultSymbols.put(GIVENNAME, "GIVENNAME"); - DefaultSymbols.put(INITIALS, "INITIALS"); - DefaultSymbols.put(GENERATION, "GENERATION"); - DefaultSymbols.put(UnstructuredAddress, "unstructuredAddress"); - DefaultSymbols.put(UnstructuredName, "unstructuredName"); - DefaultSymbols.put(UNIQUE_IDENTIFIER, "UniqueIdentifier"); - DefaultSymbols.put(DN_QUALIFIER, "DN"); - DefaultSymbols.put(PSEUDONYM, "Pseudonym"); - DefaultSymbols.put(POSTAL_ADDRESS, "PostalAddress"); - DefaultSymbols.put(NAME_AT_BIRTH, "NameAtBirth"); - DefaultSymbols.put(COUNTRY_OF_CITIZENSHIP, "CountryOfCitizenship"); - DefaultSymbols.put(COUNTRY_OF_RESIDENCE, "CountryOfResidence"); - DefaultSymbols.put(GENDER, "Gender"); - DefaultSymbols.put(PLACE_OF_BIRTH, "PlaceOfBirth"); - DefaultSymbols.put(DATE_OF_BIRTH, "DateOfBirth"); - DefaultSymbols.put(POSTAL_CODE, "PostalCode"); - DefaultSymbols.put(BUSINESS_CATEGORY, "BusinessCategory"); - DefaultSymbols.put(TELEPHONE_NUMBER, "TelephoneNumber"); - DefaultSymbols.put(NAME, "Name"); - - RFC2253Symbols.put(C, "C"); - RFC2253Symbols.put(O, "O"); - RFC2253Symbols.put(OU, "OU"); - RFC2253Symbols.put(CN, "CN"); - RFC2253Symbols.put(L, "L"); - RFC2253Symbols.put(ST, "ST"); - RFC2253Symbols.put(STREET, "STREET"); - RFC2253Symbols.put(DC, "DC"); - RFC2253Symbols.put(UID, "UID"); - - RFC1779Symbols.put(C, "C"); - RFC1779Symbols.put(O, "O"); - RFC1779Symbols.put(OU, "OU"); - RFC1779Symbols.put(CN, "CN"); - RFC1779Symbols.put(L, "L"); - RFC1779Symbols.put(ST, "ST"); - RFC1779Symbols.put(STREET, "STREET"); - - DefaultLookUp.put("c", C); - DefaultLookUp.put("o", O); - DefaultLookUp.put("t", T); - DefaultLookUp.put("ou", OU); - DefaultLookUp.put("cn", CN); - DefaultLookUp.put("l", L); - DefaultLookUp.put("st", ST); - DefaultLookUp.put("sn", SN); - DefaultLookUp.put("serialnumber", SN); - DefaultLookUp.put("street", STREET); - DefaultLookUp.put("emailaddress", E); - DefaultLookUp.put("dc", DC); - DefaultLookUp.put("e", E); - DefaultLookUp.put("uid", UID); - DefaultLookUp.put("surname", SURNAME); - DefaultLookUp.put("givenname", GIVENNAME); - DefaultLookUp.put("initials", INITIALS); - DefaultLookUp.put("generation", GENERATION); - DefaultLookUp.put("unstructuredaddress", UnstructuredAddress); - DefaultLookUp.put("unstructuredname", UnstructuredName); - DefaultLookUp.put("uniqueidentifier", UNIQUE_IDENTIFIER); - DefaultLookUp.put("dn", DN_QUALIFIER); - DefaultLookUp.put("pseudonym", PSEUDONYM); - DefaultLookUp.put("postaladdress", POSTAL_ADDRESS); - DefaultLookUp.put("nameofbirth", NAME_AT_BIRTH); - DefaultLookUp.put("countryofcitizenship", COUNTRY_OF_CITIZENSHIP); - DefaultLookUp.put("countryofresidence", COUNTRY_OF_RESIDENCE); - DefaultLookUp.put("gender", GENDER); - DefaultLookUp.put("placeofbirth", PLACE_OF_BIRTH); - DefaultLookUp.put("dateofbirth", DATE_OF_BIRTH); - DefaultLookUp.put("postalcode", POSTAL_CODE); - DefaultLookUp.put("businesscategory", BUSINESS_CATEGORY); - DefaultLookUp.put("telephonenumber", TELEPHONE_NUMBER); - DefaultLookUp.put("name", NAME); - } - - private X509NameEntryConverter converter = null; - private Vector ordering = new Vector(); - private Vector values = new Vector(); - private Vector added = new Vector(); - - private ASN1Sequence seq; - - private boolean isHashCodeCalculated; - private int hashCodeValue; - - /** - * Return a X509Name based on the passed in tagged object. - * - * @param obj tag object holding name. - * @param explicit true if explicitly tagged false otherwise. - * @return the X509Name - */ - public static X509Name getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static X509Name getInstance( - Object obj) - { - if (obj == null || obj instanceof X509Name) - { - return (X509Name)obj; - } - else if (obj instanceof X500Name) - { - return new X509Name(ASN1Sequence.getInstance(((X500Name)obj).toASN1Primitive())); - } - else if (obj != null) - { - return new X509Name(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - protected X509Name() - { - // constructure use by new X500 Name class - } - /** - * Constructor from ASN1Sequence - * - * the principal will be a list of constructed sets, each containing an (OID, String) pair. - */ - public X509Name( - ASN1Sequence seq) - { - this.seq = seq; - - Enumeration e = seq.getObjects(); - - while (e.hasMoreElements()) - { - ASN1Set set = ASN1Set.getInstance(((ASN1Encodable)e.nextElement()).toASN1Primitive()); - - for (int i = 0; i < set.size(); i++) - { - ASN1Sequence s = ASN1Sequence.getInstance(set.getObjectAt(i).toASN1Primitive()); - - if (s.size() != 2) - { - throw new IllegalArgumentException("badly sized pair"); - } - - ordering.addElement(ASN1ObjectIdentifier.getInstance(s.getObjectAt(0))); - - ASN1Encodable value = s.getObjectAt(1); - if (value instanceof ASN1String && !(value instanceof DERUniversalString)) - { - String v = ((ASN1String)value).getString(); - if (v.length() > 0 && v.charAt(0) == '#') - { - values.addElement("\\" + v); - } - else - { - values.addElement(v); - } - } - else - { - try - { - values.addElement("#" + bytesToString(Hex.encode(value.toASN1Primitive().getEncoded(ASN1Encoding.DER)))); - } - catch (IOException e1) - { - throw new IllegalArgumentException("cannot encode value"); - } - } - added.addElement((i != 0) ? TRUE : FALSE); // to allow earlier JDK compatibility - } - } - } - - /** - * constructor from a table of attributes. - *

    - * it's is assumed the table contains OID/String pairs, and the contents - * of the table are copied into an internal table as part of the - * construction process. - *

    - * Note: if the name you are trying to generate should be - * following a specific ordering, you should use the constructor - * with the ordering specified below. - * @deprecated use an ordered constructor! The hashtable ordering is rarely correct - */ - public X509Name( - Hashtable attributes) - { - this(null, attributes); - } - - /** - * Constructor from a table of attributes with ordering. - *

    - * it's is assumed the table contains OID/String pairs, and the contents - * of the table are copied into an internal table as part of the - * construction process. The ordering vector should contain the OIDs - * in the order they are meant to be encoded or printed in toString. - */ - public X509Name( - Vector ordering, - Hashtable attributes) - { - this(ordering, attributes, new X509DefaultEntryConverter()); - } - - /** - * Constructor from a table of attributes with ordering. - *

    - * it's is assumed the table contains OID/String pairs, and the contents - * of the table are copied into an internal table as part of the - * construction process. The ordering vector should contain the OIDs - * in the order they are meant to be encoded or printed in toString. - *

    - * The passed in converter will be used to convert the strings into their - * ASN.1 counterparts. - */ - public X509Name( - Vector ordering, - Hashtable attributes, - X509NameEntryConverter converter) - { - this.converter = converter; - - if (ordering != null) - { - for (int i = 0; i != ordering.size(); i++) - { - this.ordering.addElement(ordering.elementAt(i)); - this.added.addElement(FALSE); - } - } - else - { - Enumeration e = attributes.keys(); - - while (e.hasMoreElements()) - { - this.ordering.addElement(e.nextElement()); - this.added.addElement(FALSE); - } - } - - for (int i = 0; i != this.ordering.size(); i++) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)this.ordering.elementAt(i); - - if (attributes.get(oid) == null) - { - throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name"); - } - - this.values.addElement(attributes.get(oid)); // copy the hash table - } - } - - /** - * Takes two vectors one of the oids and the other of the values. - */ - public X509Name( - Vector oids, - Vector values) - { - this(oids, values, new X509DefaultEntryConverter()); - } - - /** - * Takes two vectors one of the oids and the other of the values. - *

    - * The passed in converter will be used to convert the strings into their - * ASN.1 counterparts. - */ - public X509Name( - Vector oids, - Vector values, - X509NameEntryConverter converter) - { - this.converter = converter; - - if (oids.size() != values.size()) - { - throw new IllegalArgumentException("oids vector must be same length as values."); - } - - for (int i = 0; i < oids.size(); i++) - { - this.ordering.addElement(oids.elementAt(i)); - this.values.addElement(values.elementAt(i)); - this.added.addElement(FALSE); - } - } - -// private Boolean isEncoded(String s) -// { -// if (s.charAt(0) == '#') -// { -// return TRUE; -// } -// -// return FALSE; -// } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes. - */ - public X509Name( - String dirName) - { - this(DefaultReverse, DefaultLookUp, dirName); - } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes with each - * string value being converted to its associated ASN.1 type using the passed - * in converter. - */ - public X509Name( - String dirName, - X509NameEntryConverter converter) - { - this(DefaultReverse, DefaultLookUp, dirName, converter); - } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes. If reverse - * is true, create the encoded version of the sequence starting from the - * last element in the string. - */ - public X509Name( - boolean reverse, - String dirName) - { - this(reverse, DefaultLookUp, dirName); - } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes with each - * string value being converted to its associated ASN.1 type using the passed - * in converter. If reverse is true the ASN.1 sequence representing the DN will - * be built by starting at the end of the string, rather than the start. - */ - public X509Name( - boolean reverse, - String dirName, - X509NameEntryConverter converter) - { - this(reverse, DefaultLookUp, dirName, converter); - } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes. lookUp - * should provide a table of lookups, indexed by lowercase only strings and - * yielding a ASN1ObjectIdentifier, other than that OID. and numeric oids - * will be processed automatically. - *
    - * If reverse is true, create the encoded version of the sequence - * starting from the last element in the string. - * @param reverse true if we should start scanning from the end (RFC 2553). - * @param lookUp table of names and their oids. - * @param dirName the X.500 string to be parsed. - */ - public X509Name( - boolean reverse, - Hashtable lookUp, - String dirName) - { - this(reverse, lookUp, dirName, new X509DefaultEntryConverter()); - } - - private ASN1ObjectIdentifier decodeOID( - String name, - Hashtable lookUp) - { - if (Strings.toUpperCase(name).startsWith("OID.")) - { - return new ASN1ObjectIdentifier(name.substring(4)); - } - else if (name.charAt(0) >= '0' && name.charAt(0) <= '9') - { - return new ASN1ObjectIdentifier(name); - } - - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)lookUp.get(Strings.toLowerCase(name)); - if (oid == null) - { - throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name"); - } - - return oid; - } - - /** - * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or - * some such, converting it into an ordered set of name attributes. lookUp - * should provide a table of lookups, indexed by lowercase only strings and - * yielding a ASN1ObjectIdentifier, other than that OID. and numeric oids - * will be processed automatically. The passed in converter is used to convert the - * string values to the right of each equals sign to their ASN.1 counterparts. - *
    - * @param reverse true if we should start scanning from the end, false otherwise. - * @param lookUp table of names and oids. - * @param dirName the string dirName - * @param converter the converter to convert string values into their ASN.1 equivalents - */ - public X509Name( - boolean reverse, - Hashtable lookUp, - String dirName, - X509NameEntryConverter converter) - { - this.converter = converter; - X509NameTokenizer nTok = new X509NameTokenizer(dirName); - - while (nTok.hasMoreTokens()) - { - String token = nTok.nextToken(); - int index = token.indexOf('='); - - if (index == -1) - { - throw new IllegalArgumentException("badly formatted directory string"); - } - - String name = token.substring(0, index); - String value = token.substring(index + 1); - ASN1ObjectIdentifier oid = decodeOID(name, lookUp); - - if (value.indexOf('+') > 0) - { - X509NameTokenizer vTok = new X509NameTokenizer(value, '+'); - String v = vTok.nextToken(); - - this.ordering.addElement(oid); - this.values.addElement(v); - this.added.addElement(FALSE); - - while (vTok.hasMoreTokens()) - { - String sv = vTok.nextToken(); - int ndx = sv.indexOf('='); - - String nm = sv.substring(0, ndx); - String vl = sv.substring(ndx + 1); - this.ordering.addElement(decodeOID(nm, lookUp)); - this.values.addElement(vl); - this.added.addElement(TRUE); - } - } - else - { - this.ordering.addElement(oid); - this.values.addElement(value); - this.added.addElement(FALSE); - } - } - - if (reverse) - { - Vector o = new Vector(); - Vector v = new Vector(); - Vector a = new Vector(); - - int count = 1; - - for (int i = 0; i < this.ordering.size(); i++) - { - if (((Boolean)this.added.elementAt(i)).booleanValue()) - { - o.insertElementAt(this.ordering.elementAt(i), count); - v.insertElementAt(this.values.elementAt(i), count); - a.insertElementAt(this.added.elementAt(i), count); - count++; - } - else - { - o.insertElementAt(this.ordering.elementAt(i), 0); - v.insertElementAt(this.values.elementAt(i), 0); - a.insertElementAt(this.added.elementAt(i), 0); - count = 1; - } - } - - this.ordering = o; - this.values = v; - this.added = a; - } - } - - /** - * return a vector of the oids in the name, in the order they were found. - */ - public Vector getOIDs() - { - Vector v = new Vector(); - - for (int i = 0; i != ordering.size(); i++) - { - v.addElement(ordering.elementAt(i)); - } - - return v; - } - - /** - * return a vector of the values found in the name, in the order they - * were found. - */ - public Vector getValues() - { - Vector v = new Vector(); - - for (int i = 0; i != values.size(); i++) - { - v.addElement(values.elementAt(i)); - } - - return v; - } - - /** - * return a vector of the values found in the name, in the order they - * were found, with the DN label corresponding to passed in oid. - */ - public Vector getValues( - ASN1ObjectIdentifier oid) - { - Vector v = new Vector(); - - for (int i = 0; i != values.size(); i++) - { - if (ordering.elementAt(i).equals(oid)) - { - String val = (String)values.elementAt(i); - - if (val.length() > 2 && val.charAt(0) == '\\' && val.charAt(1) == '#') - { - v.addElement(val.substring(1)); - } - else - { - v.addElement(val); - } - } - } - - return v; - } - - public ASN1Primitive toASN1Primitive() - { - if (seq == null) - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - ASN1EncodableVector sVec = new ASN1EncodableVector(); - ASN1ObjectIdentifier lstOid = null; - - for (int i = 0; i != ordering.size(); i++) - { - ASN1EncodableVector v = new ASN1EncodableVector(); - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)ordering.elementAt(i); - - v.add(oid); - - String str = (String)values.elementAt(i); - - v.add(converter.getConvertedValue(oid, str)); - - if (lstOid == null - || ((Boolean)this.added.elementAt(i)).booleanValue()) - { - sVec.add(new DERSequence(v)); - } - else - { - vec.add(new DERSet(sVec)); - sVec = new ASN1EncodableVector(); - - sVec.add(new DERSequence(v)); - } - - lstOid = oid; - } - - vec.add(new DERSet(sVec)); - - seq = new DERSequence(vec); - } - - return seq; - } - - /** - * @param inOrder if true the order of both X509 names must be the same, - * as well as the values associated with each element. - */ - public boolean equals(Object obj, boolean inOrder) - { - if (!inOrder) - { - return this.equals(obj); - } - - if (obj == this) - { - return true; - } - - if (!(obj instanceof X509Name || obj instanceof ASN1Sequence)) - { - return false; - } - - ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive(); - - if (this.toASN1Primitive().equals(derO)) - { - return true; - } - - X509Name other; - - try - { - other = X509Name.getInstance(obj); - } - catch (IllegalArgumentException e) - { - return false; - } - - int orderingSize = ordering.size(); - - if (orderingSize != other.ordering.size()) - { - return false; - } - - for (int i = 0; i < orderingSize; i++) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)ordering.elementAt(i); - ASN1ObjectIdentifier oOid = (ASN1ObjectIdentifier)other.ordering.elementAt(i); - - if (oid.equals(oOid)) - { - String value = (String)values.elementAt(i); - String oValue = (String)other.values.elementAt(i); - - if (!equivalentStrings(value, oValue)) - { - return false; - } - } - else - { - return false; - } - } - - return true; - } - - public int hashCode() - { - if (isHashCodeCalculated) - { - return hashCodeValue; - } - - isHashCodeCalculated = true; - - // this needs to be order independent, like equals - for (int i = 0; i != ordering.size(); i += 1) - { - String value = (String)values.elementAt(i); - - value = canonicalize(value); - value = stripInternalSpaces(value); - - hashCodeValue ^= ordering.elementAt(i).hashCode(); - hashCodeValue ^= value.hashCode(); - } - - return hashCodeValue; - } - - /** - * test for equality - note: case is ignored. - */ - public boolean equals(Object obj) - { - if (obj == this) - { - return true; - } - - if (!(obj instanceof X509Name || obj instanceof ASN1Sequence)) - { - return false; - } - - ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive(); - - if (this.toASN1Primitive().equals(derO)) - { - return true; - } - - X509Name other; - - try - { - other = X509Name.getInstance(obj); - } - catch (IllegalArgumentException e) - { - return false; - } - - int orderingSize = ordering.size(); - - if (orderingSize != other.ordering.size()) - { - return false; - } - - boolean[] indexes = new boolean[orderingSize]; - int start, end, delta; - - if (ordering.elementAt(0).equals(other.ordering.elementAt(0))) // guess forward - { - start = 0; - end = orderingSize; - delta = 1; - } - else // guess reversed - most common problem - { - start = orderingSize - 1; - end = -1; - delta = -1; - } - - for (int i = start; i != end; i += delta) - { - boolean found = false; - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)ordering.elementAt(i); - String value = (String)values.elementAt(i); - - for (int j = 0; j < orderingSize; j++) - { - if (indexes[j]) - { - continue; - } - - ASN1ObjectIdentifier oOid = (ASN1ObjectIdentifier)other.ordering.elementAt(j); - - if (oid.equals(oOid)) - { - String oValue = (String)other.values.elementAt(j); - - if (equivalentStrings(value, oValue)) - { - indexes[j] = true; - found = true; - break; - } - } - } - - if (!found) - { - return false; - } - } - - return true; - } - - private boolean equivalentStrings(String s1, String s2) - { - String value = canonicalize(s1); - String oValue = canonicalize(s2); - - if (!value.equals(oValue)) - { - value = stripInternalSpaces(value); - oValue = stripInternalSpaces(oValue); - - if (!value.equals(oValue)) - { - return false; - } - } - - return true; - } - - private String canonicalize(String s) - { - String value = Strings.toLowerCase(s.trim()); - - if (value.length() > 0 && value.charAt(0) == '#') - { - ASN1Primitive obj = decodeObject(value); - - if (obj instanceof ASN1String) - { - value = Strings.toLowerCase(((ASN1String)obj).getString().trim()); - } - } - - return value; - } - - private ASN1Primitive decodeObject(String oValue) - { - try - { - return ASN1Primitive.fromByteArray(Hex.decode(oValue.substring(1))); - } - catch (IOException e) - { - throw new IllegalStateException("unknown encoding in name: " + e); - } - } - - private String stripInternalSpaces( - String str) - { - StringBuffer res = new StringBuffer(); - - if (str.length() != 0) - { - char c1 = str.charAt(0); - - res.append(c1); - - for (int k = 1; k < str.length(); k++) - { - char c2 = str.charAt(k); - if (!(c1 == ' ' && c2 == ' ')) - { - res.append(c2); - } - c1 = c2; - } - } - - return res.toString(); - } - - private void appendValue( - StringBuffer buf, - Hashtable oidSymbols, - ASN1ObjectIdentifier oid, - String value) - { - String sym = (String)oidSymbols.get(oid); - - if (sym != null) - { - buf.append(sym); - } - else - { - buf.append(oid.getId()); - } - - buf.append('='); - - int index = buf.length(); - - buf.append(value); - - int end = buf.length(); - - if (value.length() >= 2 && value.charAt(0) == '\\' && value.charAt(1) == '#') - { - index += 2; - } - - while (index != end) - { - if ((buf.charAt(index) == ',') - || (buf.charAt(index) == '"') - || (buf.charAt(index) == '\\') - || (buf.charAt(index) == '+') - || (buf.charAt(index) == '=') - || (buf.charAt(index) == '<') - || (buf.charAt(index) == '>') - || (buf.charAt(index) == ';')) - { - buf.insert(index, "\\"); - index++; - end++; - } - - index++; - } - } - - /** - * convert the structure to a string - if reverse is true the - * oids and values are listed out starting with the last element - * in the sequence (ala RFC 2253), otherwise the string will begin - * with the first element of the structure. If no string definition - * for the oid is found in oidSymbols the string value of the oid is - * added. Two standard symbol tables are provided DefaultSymbols, and - * RFC2253Symbols as part of this class. - * - * @param reverse if true start at the end of the sequence and work back. - * @param oidSymbols look up table strings for oids. - */ - public String toString( - boolean reverse, - Hashtable oidSymbols) - { - StringBuffer buf = new StringBuffer(); - Vector components = new Vector(); - boolean first = true; - - StringBuffer ava = null; - - for (int i = 0; i < ordering.size(); i++) - { - if (((Boolean)added.elementAt(i)).booleanValue()) - { - ava.append('+'); - appendValue(ava, oidSymbols, - (ASN1ObjectIdentifier)ordering.elementAt(i), - (String)values.elementAt(i)); - } - else - { - ava = new StringBuffer(); - appendValue(ava, oidSymbols, - (ASN1ObjectIdentifier)ordering.elementAt(i), - (String)values.elementAt(i)); - components.addElement(ava); - } - } - - if (reverse) - { - for (int i = components.size() - 1; i >= 0; i--) - { - if (first) - { - first = false; - } - else - { - buf.append(','); - } - - buf.append(components.elementAt(i).toString()); - } - } - else - { - for (int i = 0; i < components.size(); i++) - { - if (first) - { - first = false; - } - else - { - buf.append(','); - } - - buf.append(components.elementAt(i).toString()); - } - } - - return buf.toString(); - } - - private String bytesToString( - byte[] data) - { - char[] cs = new char[data.length]; - - for (int i = 0; i != cs.length; i++) - { - cs[i] = (char)(data[i] & 0xff); - } - - return new String(cs); - } - - public String toString() - { - return toString(DefaultReverse, DefaultSymbols); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameEntryConverter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameEntryConverter.java deleted file mode 100644 index 853994b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameEntryConverter.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.bc.asn1.x509; - -import java.io.IOException; - -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERPrintableString; -import org.bc.util.Strings; - -/** - * It turns out that the number of standard ways the fields in a DN should be - * encoded into their ASN.1 counterparts is rapidly approaching the - * number of machines on the internet. By default the X509Name class - * will produce UTF8Strings in line with the current recommendations (RFC 3280). - *

    - * An example of an encoder look like below: - *

    - * public class X509DirEntryConverter
    - *     extends X509NameEntryConverter
    - * {
    - *     public ASN1Primitive getConvertedValue(
    - *         ASN1ObjectIdentifier  oid,
    - *         String               value)
    - *     {
    - *         if (str.length() != 0 && str.charAt(0) == '#')
    - *         {
    - *             return convertHexEncoded(str, 1);
    - *         }
    - *         if (oid.equals(EmailAddress))
    - *         {
    - *             return new DERIA5String(str);
    - *         }
    - *         else if (canBePrintable(str))
    - *         {
    - *             return new DERPrintableString(str);
    - *         }
    - *         else if (canBeUTF8(str))
    - *         {
    - *             return new DERUTF8String(str);
    - *         }
    - *         else
    - *         {
    - *             return new DERBMPString(str);
    - *         }
    - *     }
    - * }
    - */
    -public abstract class X509NameEntryConverter
    -{
    -    /**
    -     * Convert an inline encoded hex string rendition of an ASN.1
    -     * object back into its corresponding ASN.1 object.
    -     * 
    -     * @param str the hex encoded object
    -     * @param off the index at which the encoding starts
    -     * @return the decoded object
    -     */
    -    protected ASN1Primitive convertHexEncoded(
    -        String  str,
    -        int     off)
    -        throws IOException
    -    {
    -        str = Strings.toLowerCase(str);
    -        byte[] data = new byte[(str.length() - off) / 2];
    -        for (int index = 0; index != data.length; index++)
    -        {
    -            char left = str.charAt((index * 2) + off);
    -            char right = str.charAt((index * 2) + off + 1);
    -            
    -            if (left < 'a')
    -            {
    -                data[index] = (byte)((left - '0') << 4);
    -            }
    -            else
    -            {
    -                data[index] = (byte)((left - 'a' + 10) << 4);
    -            }
    -            if (right < 'a')
    -            {
    -                data[index] |= (byte)(right - '0');
    -            }
    -            else
    -            {
    -                data[index] |= (byte)(right - 'a' + 10);
    -            }
    -        }
    -
    -        ASN1InputStream aIn = new ASN1InputStream(data);
    -                                            
    -        return aIn.readObject();
    -    }
    -    
    -    /**
    -     * return true if the passed in String can be represented without
    -     * loss as a PrintableString, false otherwise.
    -     */
    -    protected boolean canBePrintable(
    -        String  str)
    -    {
    -        return DERPrintableString.isPrintableString(str);
    -    }
    -    
    -    /**
    -     * Convert the passed in String value into the appropriate ASN.1
    -     * encoded object.
    -     * 
    -     * @param oid the oid associated with the value in the DN.
    -     * @param value the value of the particular DN component.
    -     * @return the ASN.1 equivalent for the value.
    -     */
    -    public abstract ASN1Primitive getConvertedValue(ASN1ObjectIdentifier oid, String value);
    -}
    diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameTokenizer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameTokenizer.java
    deleted file mode 100644
    index 1018b6c..0000000
    --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509NameTokenizer.java
    +++ /dev/null
    @@ -1,108 +0,0 @@
    -package org.bc.asn1.x509;
    -
    -/**
    - * class for breaking up an X500 Name into it's component tokens, ala
    - * java.util.StringTokenizer. We need this class as some of the
    - * lightweight Java environment don't support classes like
    - * StringTokenizer.
    - * @deprecated use X500NameTokenizer
    - */
    -public class X509NameTokenizer
    -{
    -    private String          value;
    -    private int             index;
    -    private char separator;
    -    private StringBuffer    buf = new StringBuffer();
    -
    -    public X509NameTokenizer(
    -        String  oid)
    -    {
    -        this(oid, ',');
    -    }
    -    
    -    public X509NameTokenizer(
    -        String  oid,
    -        char separator)
    -    {
    -        this.value = oid;
    -        this.index = -1;
    -        this.separator = separator;
    -    }
    -
    -    public boolean hasMoreTokens()
    -    {
    -        return (index != value.length());
    -    }
    -
    -    public String nextToken()
    -    {
    -        if (index == value.length())
    -        {
    -            return null;
    -        }
    -
    -        int     end = index + 1;
    -        boolean quoted = false;
    -        boolean escaped = false;
    -
    -        buf.setLength(0);
    -
    -        while (end != value.length())
    -        {
    -            char    c = value.charAt(end);
    -
    -            if (c == '"')
    -            {
    -                if (!escaped)
    -                {
    -                    quoted = !quoted;
    -                }
    -                else
    -                {
    -                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
    -                    {
    -                        buf.append('\\');
    -                    }
    -                    else if (c == '+' && separator != '+')
    -                    {
    -                        buf.append('\\');
    -                    }
    -                    buf.append(c);
    -                }
    -                escaped = false;
    -            }
    -            else
    -            {
    -                if (escaped || quoted)
    -                {
    -                    if (c == '#' && buf.charAt(buf.length() - 1) == '=')
    -                    {
    -                        buf.append('\\');
    -                    }
    -                    else if (c == '+' && separator != '+')
    -                    {
    -                        buf.append('\\');
    -                    }
    -                    buf.append(c);
    -                    escaped = false;
    -                }
    -                else if (c == '\\')
    -                {
    -                    escaped = true;
    -                }
    -                else if (c == separator)
    -                {
    -                    break;
    -                }
    -                else
    -                {
    -                    buf.append(c);
    -                }
    -            }
    -            end++;
    -        }
    -
    -        index = end;
    -        return buf.toString().trim();
    -    }
    -}
    diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ObjectIdentifiers.java
    deleted file mode 100644
    index 0dd5598..0000000
    --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/X509ObjectIdentifiers.java
    +++ /dev/null
    @@ -1,67 +0,0 @@
    -package org.bc.asn1.x509;
    -
    -import org.bc.asn1.ASN1ObjectIdentifier;
    -
    -public interface X509ObjectIdentifiers
    -{
    -    //
    -    // base id
    -    //
    -    static final String                 id                      = "2.5.4";
    -
    -    static final ASN1ObjectIdentifier    commonName              = new ASN1ObjectIdentifier(id + ".3");
    -    static final ASN1ObjectIdentifier    countryName             = new ASN1ObjectIdentifier(id + ".6");
    -    static final ASN1ObjectIdentifier    localityName            = new ASN1ObjectIdentifier(id + ".7");
    -    static final ASN1ObjectIdentifier    stateOrProvinceName     = new ASN1ObjectIdentifier(id + ".8");
    -    static final ASN1ObjectIdentifier    organization            = new ASN1ObjectIdentifier(id + ".10");
    -    static final ASN1ObjectIdentifier    organizationalUnitName  = new ASN1ObjectIdentifier(id + ".11");
    -
    -    static final ASN1ObjectIdentifier    id_at_telephoneNumber   = new ASN1ObjectIdentifier("2.5.4.20");
    -    static final ASN1ObjectIdentifier    id_at_name              = new ASN1ObjectIdentifier(id + ".41");
    -
    -    // id-SHA1 OBJECT IDENTIFIER ::=    
    -    //   {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 }    //
    -    static final ASN1ObjectIdentifier    id_SHA1                 = new ASN1ObjectIdentifier("1.3.14.3.2.26");
    -
    -    //
    -    // ripemd160 OBJECT IDENTIFIER ::=
    -    //      {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) hashAlgorithm(2) RIPEMD-160(1)}
    -    //
    -    static final ASN1ObjectIdentifier    ripemd160               = new ASN1ObjectIdentifier("1.3.36.3.2.1");
    -
    -    //
    -    // ripemd160WithRSAEncryption OBJECT IDENTIFIER ::=
    -    //      {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) rsaSignatureWithripemd160(2) }
    -    //
    -    static final ASN1ObjectIdentifier    ripemd160WithRSAEncryption = new ASN1ObjectIdentifier("1.3.36.3.3.1.2");
    -
    -
    -    static final ASN1ObjectIdentifier    id_ea_rsa = new ASN1ObjectIdentifier("2.5.8.1.1");
    -    
    -    // id-pkix
    -    static final ASN1ObjectIdentifier id_pkix = new ASN1ObjectIdentifier("1.3.6.1.5.5.7");
    -
    -    //
    -    // private internet extensions
    -    //
    -    static final ASN1ObjectIdentifier  id_pe = new ASN1ObjectIdentifier(id_pkix + ".1");
    -
    -    //
    -    // ISO ARC for standard certificate and CRL extensions
    -    //
    -    static final ASN1ObjectIdentifier id_ce = new ASN1ObjectIdentifier("2.5.29");
    -
    -    //
    -    // authority information access
    -    //
    -    static final ASN1ObjectIdentifier  id_ad = new ASN1ObjectIdentifier(id_pkix + ".48");
    -    static final ASN1ObjectIdentifier  id_ad_caIssuers = new ASN1ObjectIdentifier(id_ad + ".2");
    -    static final ASN1ObjectIdentifier  id_ad_ocsp = new ASN1ObjectIdentifier(id_ad + ".1");
    -
    -    //
    -    //    OID for ocsp and crl uri in AuthorityInformationAccess extension
    -    //
    -    static final ASN1ObjectIdentifier ocspAccessMethod = id_ad_ocsp;
    -    static final ASN1ObjectIdentifier crlAccessMethod = id_ad_caIssuers;
    -}
    -
    diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/BiometricData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/BiometricData.java
    deleted file mode 100644
    index d79c205..0000000
    --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/BiometricData.java
    +++ /dev/null
    @@ -1,122 +0,0 @@
    -package org.bc.asn1.x509.qualified;
    -
    -import java.util.Enumeration;
    -
    -import org.bc.asn1.ASN1EncodableVector;
    -import org.bc.asn1.ASN1Object;
    -import org.bc.asn1.ASN1OctetString;
    -import org.bc.asn1.ASN1Primitive;
    -import org.bc.asn1.ASN1Sequence;
    -import org.bc.asn1.DERIA5String;
    -import org.bc.asn1.DERSequence;
    -import org.bc.asn1.x509.AlgorithmIdentifier;
    -
    -/**
    - * The BiometricData object.
    - * 
    - * BiometricData  ::=  SEQUENCE {
    - *       typeOfBiometricData  TypeOfBiometricData,
    - *       hashAlgorithm        AlgorithmIdentifier,
    - *       biometricDataHash    OCTET STRING,
    - *       sourceDataUri        IA5String OPTIONAL  }
    - * 
    - */ -public class BiometricData - extends ASN1Object -{ - private TypeOfBiometricData typeOfBiometricData; - private AlgorithmIdentifier hashAlgorithm; - private ASN1OctetString biometricDataHash; - private DERIA5String sourceDataUri; - - public static BiometricData getInstance( - Object obj) - { - if (obj instanceof BiometricData) - { - return (BiometricData)obj; - } - - if (obj != null) - { - return new BiometricData(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private BiometricData(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - // typeOfBiometricData - typeOfBiometricData = TypeOfBiometricData.getInstance(e.nextElement()); - // hashAlgorithm - hashAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement()); - // biometricDataHash - biometricDataHash = ASN1OctetString.getInstance(e.nextElement()); - // sourceDataUri - if (e.hasMoreElements()) - { - sourceDataUri = DERIA5String.getInstance(e.nextElement()); - } - } - - public BiometricData( - TypeOfBiometricData typeOfBiometricData, - AlgorithmIdentifier hashAlgorithm, - ASN1OctetString biometricDataHash, - DERIA5String sourceDataUri) - { - this.typeOfBiometricData = typeOfBiometricData; - this.hashAlgorithm = hashAlgorithm; - this.biometricDataHash = biometricDataHash; - this.sourceDataUri = sourceDataUri; - } - - public BiometricData( - TypeOfBiometricData typeOfBiometricData, - AlgorithmIdentifier hashAlgorithm, - ASN1OctetString biometricDataHash) - { - this.typeOfBiometricData = typeOfBiometricData; - this.hashAlgorithm = hashAlgorithm; - this.biometricDataHash = biometricDataHash; - this.sourceDataUri = null; - } - - public TypeOfBiometricData getTypeOfBiometricData() - { - return typeOfBiometricData; - } - - public AlgorithmIdentifier getHashAlgorithm() - { - return hashAlgorithm; - } - - public ASN1OctetString getBiometricDataHash() - { - return biometricDataHash; - } - - public DERIA5String getSourceDataUri() - { - return sourceDataUri; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(typeOfBiometricData); - seq.add(hashAlgorithm); - seq.add(biometricDataHash); - - if (sourceDataUri != null) - { - seq.add(sourceDataUri); - } - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/ETSIQCObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/ETSIQCObjectIdentifiers.java deleted file mode 100644 index e89a340..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/ETSIQCObjectIdentifiers.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface ETSIQCObjectIdentifiers -{ - // - // base id - // - static final ASN1ObjectIdentifier id_etsi_qcs = new ASN1ObjectIdentifier("0.4.0.1862.1"); - - static final ASN1ObjectIdentifier id_etsi_qcs_QcCompliance = id_etsi_qcs.branch("1"); - static final ASN1ObjectIdentifier id_etsi_qcs_LimiteValue = id_etsi_qcs.branch("2"); - static final ASN1ObjectIdentifier id_etsi_qcs_RetentionPeriod = id_etsi_qcs.branch("3"); - static final ASN1ObjectIdentifier id_etsi_qcs_QcSSCD = id_etsi_qcs.branch("4"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/Iso4217CurrencyCode.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/Iso4217CurrencyCode.java deleted file mode 100644 index ce5ea72..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/Iso4217CurrencyCode.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DERPrintableString; - -/** - * The Iso4217CurrencyCode object. - *
    - * Iso4217CurrencyCode  ::=  CHOICE {
    - *       alphabetic              PrintableString (SIZE 3), --Recommended
    - *       numeric              INTEGER (1..999) }
    - * -- Alphabetic or numeric currency code as defined in ISO 4217
    - * -- It is recommended that the Alphabetic form is used
    - * 
    - */ -public class Iso4217CurrencyCode - extends ASN1Object - implements ASN1Choice -{ - final int ALPHABETIC_MAXSIZE = 3; - final int NUMERIC_MINSIZE = 1; - final int NUMERIC_MAXSIZE = 999; - - ASN1Encodable obj; - int numeric; - - public static Iso4217CurrencyCode getInstance( - Object obj) - { - if (obj == null || obj instanceof Iso4217CurrencyCode) - { - return (Iso4217CurrencyCode)obj; - } - - if (obj instanceof ASN1Integer) - { - ASN1Integer numericobj = ASN1Integer.getInstance(obj); - int numeric = numericobj.getValue().intValue(); - return new Iso4217CurrencyCode(numeric); - } - else - if (obj instanceof DERPrintableString) - { - DERPrintableString alphabetic = DERPrintableString.getInstance(obj); - return new Iso4217CurrencyCode(alphabetic.getString()); - } - throw new IllegalArgumentException("unknown object in getInstance"); - } - - public Iso4217CurrencyCode( - int numeric) - { - if (numeric > NUMERIC_MAXSIZE || numeric < NUMERIC_MINSIZE) - { - throw new IllegalArgumentException("wrong size in numeric code : not in (" +NUMERIC_MINSIZE +".."+ NUMERIC_MAXSIZE +")"); - } - obj = new ASN1Integer(numeric); - } - - public Iso4217CurrencyCode( - String alphabetic) - { - if (alphabetic.length() > ALPHABETIC_MAXSIZE) - { - throw new IllegalArgumentException("wrong size in alphabetic code : max size is " + ALPHABETIC_MAXSIZE); - } - obj = new DERPrintableString(alphabetic); - } - - public boolean isAlphabetic() - { - return obj instanceof DERPrintableString; - } - - public String getAlphabetic() - { - return ((DERPrintableString)obj).getString(); - } - - public int getNumeric() - { - return ((ASN1Integer)obj).getValue().intValue(); - } - - public ASN1Primitive toASN1Primitive() - { - return obj.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/MonetaryValue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/MonetaryValue.java deleted file mode 100644 index 81bebc5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/MonetaryValue.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * The MonetaryValue object. - *
    - * MonetaryValue  ::=  SEQUENCE {
    - *       currency              Iso4217CurrencyCode,
    - *       amount               INTEGER, 
    - *       exponent             INTEGER }
    - * -- value = amount * 10^exponent
    - * 
    - */ -public class MonetaryValue - extends ASN1Object -{ - private Iso4217CurrencyCode currency; - private ASN1Integer amount; - private ASN1Integer exponent; - - public static MonetaryValue getInstance( - Object obj) - { - if (obj instanceof MonetaryValue) - { - return (MonetaryValue)obj; - } - - if (obj != null) - { - return new MonetaryValue(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private MonetaryValue( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - // currency - currency = Iso4217CurrencyCode.getInstance(e.nextElement()); - // hashAlgorithm - amount = ASN1Integer.getInstance(e.nextElement()); - // exponent - exponent = ASN1Integer.getInstance(e.nextElement()); - } - - public MonetaryValue( - Iso4217CurrencyCode currency, - int amount, - int exponent) - { - this.currency = currency; - this.amount = new ASN1Integer(amount); - this.exponent = new ASN1Integer(exponent); - } - - public Iso4217CurrencyCode getCurrency() - { - return currency; - } - - public BigInteger getAmount() - { - return amount.getValue(); - } - - public BigInteger getExponent() - { - return exponent.getValue(); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(currency); - seq.add(amount); - seq.add(exponent); - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/QCStatement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/QCStatement.java deleted file mode 100644 index e39150c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/QCStatement.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * The QCStatement object. - *
    - * QCStatement ::= SEQUENCE {
    - *   statementId        OBJECT IDENTIFIER,
    - *   statementInfo      ANY DEFINED BY statementId OPTIONAL} 
    - * 
    - */ - -public class QCStatement - extends ASN1Object - implements ETSIQCObjectIdentifiers, RFC3739QCObjectIdentifiers -{ - ASN1ObjectIdentifier qcStatementId; - ASN1Encodable qcStatementInfo; - - public static QCStatement getInstance( - Object obj) - { - if (obj instanceof QCStatement) - { - return (QCStatement)obj; - } - if (obj != null) - { - return new QCStatement(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private QCStatement( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - // qcStatementId - qcStatementId = ASN1ObjectIdentifier.getInstance(e.nextElement()); - // qcstatementInfo - if (e.hasMoreElements()) - { - qcStatementInfo = (ASN1Encodable) e.nextElement(); - } - } - - public QCStatement( - ASN1ObjectIdentifier qcStatementId) - { - this.qcStatementId = qcStatementId; - this.qcStatementInfo = null; - } - - public QCStatement( - ASN1ObjectIdentifier qcStatementId, - ASN1Encodable qcStatementInfo) - { - this.qcStatementId = qcStatementId; - this.qcStatementInfo = qcStatementInfo; - } - - public ASN1ObjectIdentifier getStatementId() - { - return qcStatementId; - } - - public ASN1Encodable getStatementInfo() - { - return qcStatementInfo; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - seq.add(qcStatementId); - - if (qcStatementInfo != null) - { - seq.add(qcStatementInfo); - } - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/RFC3739QCObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/RFC3739QCObjectIdentifiers.java deleted file mode 100644 index 4acee90..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/RFC3739QCObjectIdentifiers.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface RFC3739QCObjectIdentifiers -{ - // - // base id - // - static final ASN1ObjectIdentifier id_qcs = new ASN1ObjectIdentifier("1.3.6.1.5.5.7.11"); - - static final ASN1ObjectIdentifier id_qcs_pkixQCSyntax_v1 = id_qcs.branch("1"); - static final ASN1ObjectIdentifier id_qcs_pkixQCSyntax_v2 = id_qcs.branch("2"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/SemanticsInformation.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/SemanticsInformation.java deleted file mode 100644 index d522e86..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/SemanticsInformation.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.GeneralName; - -/** - * The SemanticsInformation object. - *
    - *       SemanticsInformation ::= SEQUENCE {
    - *         semanticsIdentifier        OBJECT IDENTIFIER   OPTIONAL,
    - *         nameRegistrationAuthorities NameRegistrationAuthorities
    - *                                                         OPTIONAL }
    - *         (WITH COMPONENTS {..., semanticsIdentifier PRESENT}|
    - *          WITH COMPONENTS {..., nameRegistrationAuthorities PRESENT})
    - *
    - *     NameRegistrationAuthorities ::=  SEQUENCE SIZE (1..MAX) OF
    - *         GeneralName
    - * 
    - */ -public class SemanticsInformation - extends ASN1Object -{ - private ASN1ObjectIdentifier semanticsIdentifier; - private GeneralName[] nameRegistrationAuthorities; - - public static SemanticsInformation getInstance(Object obj) - { - if (obj instanceof SemanticsInformation) - { - return (SemanticsInformation)obj; - } - - if (obj != null) - { - return new SemanticsInformation(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - private SemanticsInformation(ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - if (seq.size() < 1) - { - throw new IllegalArgumentException("no objects in SemanticsInformation"); - } - - Object object = e.nextElement(); - if (object instanceof ASN1ObjectIdentifier) - { - semanticsIdentifier = ASN1ObjectIdentifier.getInstance(object); - if (e.hasMoreElements()) - { - object = e.nextElement(); - } - else - { - object = null; - } - } - - if (object != null) - { - ASN1Sequence generalNameSeq = ASN1Sequence.getInstance(object); - nameRegistrationAuthorities = new GeneralName[generalNameSeq.size()]; - for (int i= 0; i < generalNameSeq.size(); i++) - { - nameRegistrationAuthorities[i] = GeneralName.getInstance(generalNameSeq.getObjectAt(i)); - } - } - } - - public SemanticsInformation( - ASN1ObjectIdentifier semanticsIdentifier, - GeneralName[] generalNames) - { - this.semanticsIdentifier = semanticsIdentifier; - this.nameRegistrationAuthorities = generalNames; - } - - public SemanticsInformation(ASN1ObjectIdentifier semanticsIdentifier) - { - this.semanticsIdentifier = semanticsIdentifier; - this.nameRegistrationAuthorities = null; - } - - public SemanticsInformation(GeneralName[] generalNames) - { - this.semanticsIdentifier = null; - this.nameRegistrationAuthorities = generalNames; - } - - public ASN1ObjectIdentifier getSemanticsIdentifier() - { - return semanticsIdentifier; - } - - public GeneralName[] getNameRegistrationAuthorities() - { - return nameRegistrationAuthorities; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seq = new ASN1EncodableVector(); - - if (this.semanticsIdentifier != null) - { - seq.add(semanticsIdentifier); - } - if (this.nameRegistrationAuthorities != null) - { - ASN1EncodableVector seqname = new ASN1EncodableVector(); - for (int i = 0; i < nameRegistrationAuthorities.length; i++) - { - seqname.add(nameRegistrationAuthorities[i]); - } - seq.add(new DERSequence(seqname)); - } - - return new DERSequence(seq); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/TypeOfBiometricData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/TypeOfBiometricData.java deleted file mode 100644 index 9f1900c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/qualified/TypeOfBiometricData.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bc.asn1.x509.qualified; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; - -/** - * The TypeOfBiometricData object. - *
    - * TypeOfBiometricData ::= CHOICE {
    - *   predefinedBiometricType   PredefinedBiometricType,
    - *   biometricDataOid          OBJECT IDENTIFIER }
    - *
    - * PredefinedBiometricType ::= INTEGER {
    - *   picture(0),handwritten-signature(1)}
    - *   (picture|handwritten-signature)
    - * 
    - */ -public class TypeOfBiometricData - extends ASN1Object - implements ASN1Choice -{ - public static final int PICTURE = 0; - public static final int HANDWRITTEN_SIGNATURE = 1; - - ASN1Encodable obj; - - public static TypeOfBiometricData getInstance(Object obj) - { - if (obj == null || obj instanceof TypeOfBiometricData) - { - return (TypeOfBiometricData)obj; - } - - if (obj instanceof ASN1Integer) - { - ASN1Integer predefinedBiometricTypeObj = ASN1Integer.getInstance(obj); - int predefinedBiometricType = predefinedBiometricTypeObj.getValue().intValue(); - - return new TypeOfBiometricData(predefinedBiometricType); - } - else if (obj instanceof ASN1ObjectIdentifier) - { - ASN1ObjectIdentifier BiometricDataID = ASN1ObjectIdentifier.getInstance(obj); - return new TypeOfBiometricData(BiometricDataID); - } - - throw new IllegalArgumentException("unknown object in getInstance"); - } - - public TypeOfBiometricData(int predefinedBiometricType) - { - if (predefinedBiometricType == PICTURE || predefinedBiometricType == HANDWRITTEN_SIGNATURE) - { - obj = new ASN1Integer(predefinedBiometricType); - } - else - { - throw new IllegalArgumentException("unknow PredefinedBiometricType : " + predefinedBiometricType); - } - } - - public TypeOfBiometricData(ASN1ObjectIdentifier BiometricDataID) - { - obj = BiometricDataID; - } - - public boolean isPredefined() - { - return obj instanceof ASN1Integer; - } - - public int getPredefinedBiometricType() - { - return ((ASN1Integer)obj).getValue().intValue(); - } - - public ASN1ObjectIdentifier getBiometricDataOid() - { - return (ASN1ObjectIdentifier)obj; - } - - public ASN1Primitive toASN1Primitive() - { - return obj.toASN1Primitive(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/NameOrPseudonym.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/NameOrPseudonym.java deleted file mode 100644 index 50ee75d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/NameOrPseudonym.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.bc.asn1.x509.sigi; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1String; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x500.DirectoryString; - -/** - * Structure for a name or pseudonym. - * - *
    - *       NameOrPseudonym ::= CHOICE {
    - *            surAndGivenName SEQUENCE {
    - *              surName DirectoryString,
    - *              givenName SEQUENCE OF DirectoryString 
    - *         },
    - *            pseudonym DirectoryString 
    - *       }
    - * 
    - * - * @see org.bc.asn1.x509.sigi.PersonalData - * - */ -public class NameOrPseudonym - extends ASN1Object - implements ASN1Choice -{ - private DirectoryString pseudonym; - - private DirectoryString surname; - - private ASN1Sequence givenName; - - public static NameOrPseudonym getInstance(Object obj) - { - if (obj == null || obj instanceof NameOrPseudonym) - { - return (NameOrPseudonym)obj; - } - - if (obj instanceof ASN1String) - { - return new NameOrPseudonym(DirectoryString.getInstance(obj)); - } - - if (obj instanceof ASN1Sequence) - { - return new NameOrPseudonym((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " - + obj.getClass().getName()); - } - - /** - * Constructor from DirectoryString. - *

    - * The sequence is of type NameOrPseudonym: - *

    - *

    -     *       NameOrPseudonym ::= CHOICE {
    -     *            surAndGivenName SEQUENCE {
    -     *              surName DirectoryString,
    -     *              givenName SEQUENCE OF DirectoryString
    -     *         },
    -     *            pseudonym DirectoryString
    -     *       }
    -     * 
    - * @param pseudonym pseudonym value to use. - */ - public NameOrPseudonym(DirectoryString pseudonym) - { - this.pseudonym = pseudonym; - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type NameOrPseudonym: - *

    - *

    -     *       NameOrPseudonym ::= CHOICE {
    -     *            surAndGivenName SEQUENCE {
    -     *              surName DirectoryString,
    -     *              givenName SEQUENCE OF DirectoryString
    -     *         },
    -     *            pseudonym DirectoryString
    -     *       }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private NameOrPseudonym(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - if (!(seq.getObjectAt(0) instanceof ASN1String)) - { - throw new IllegalArgumentException("Bad object encountered: " - + seq.getObjectAt(0).getClass()); - } - - surname = DirectoryString.getInstance(seq.getObjectAt(0)); - givenName = ASN1Sequence.getInstance(seq.getObjectAt(1)); - } - - /** - * Constructor from a given details. - * - * @param pseudonym The pseudonym. - */ - public NameOrPseudonym(String pseudonym) - { - this(new DirectoryString(pseudonym)); - } - - /** - * Constructor from a given details. - * - * @param surname The surname. - * @param givenName A sequence of directory strings making up the givenName - */ - public NameOrPseudonym(DirectoryString surname, ASN1Sequence givenName) - { - this.surname = surname; - this.givenName = givenName; - } - - public DirectoryString getPseudonym() - { - return pseudonym; - } - - public DirectoryString getSurname() - { - return surname; - } - - public DirectoryString[] getGivenName() - { - DirectoryString[] items = new DirectoryString[givenName.size()]; - int count = 0; - for (Enumeration e = givenName.getObjects(); e.hasMoreElements();) - { - items[count++] = DirectoryString.getInstance(e.nextElement()); - } - return items; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *       NameOrPseudonym ::= CHOICE {
    -     *            surAndGivenName SEQUENCE {
    -     *              surName DirectoryString,
    -     *              givenName SEQUENCE OF DirectoryString
    -     *         },
    -     *            pseudonym DirectoryString
    -     *       }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - if (pseudonym != null) - { - return pseudonym.toASN1Primitive(); - } - else - { - ASN1EncodableVector vec1 = new ASN1EncodableVector(); - vec1.add(surname); - vec1.add(givenName); - return new DERSequence(vec1); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/PersonalData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/PersonalData.java deleted file mode 100644 index 0e9c9f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/PersonalData.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.bc.asn1.x509.sigi; - -import java.math.BigInteger; -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1GeneralizedTime; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERPrintableString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x500.DirectoryString; - -/** - * Contains personal data for the otherName field in the subjectAltNames - * extension. - *

    - *

    - *     PersonalData ::= SEQUENCE {
    - *       nameOrPseudonym NameOrPseudonym,
    - *       nameDistinguisher [0] INTEGER OPTIONAL,
    - *       dateOfBirth [1] GeneralizedTime OPTIONAL,
    - *       placeOfBirth [2] DirectoryString OPTIONAL,
    - *       gender [3] PrintableString OPTIONAL,
    - *       postalAddress [4] DirectoryString OPTIONAL
    - *       }
    - * 
    - * - * @see org.bc.asn1.x509.sigi.NameOrPseudonym - * @see org.bc.asn1.x509.sigi.SigIObjectIdentifiers - */ -public class PersonalData - extends ASN1Object -{ - private NameOrPseudonym nameOrPseudonym; - private BigInteger nameDistinguisher; - private ASN1GeneralizedTime dateOfBirth; - private DirectoryString placeOfBirth; - private String gender; - private DirectoryString postalAddress; - - public static PersonalData getInstance(Object obj) - { - if (obj == null || obj instanceof PersonalData) - { - return (PersonalData)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new PersonalData((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); - } - - /** - * Constructor from ASN1Sequence. - *

    - * The sequence is of type NameOrPseudonym: - *

    - *

    -     *     PersonalData ::= SEQUENCE {
    -     *       nameOrPseudonym NameOrPseudonym,
    -     *       nameDistinguisher [0] INTEGER OPTIONAL,
    -     *       dateOfBirth [1] GeneralizedTime OPTIONAL,
    -     *       placeOfBirth [2] DirectoryString OPTIONAL,
    -     *       gender [3] PrintableString OPTIONAL,
    -     *       postalAddress [4] DirectoryString OPTIONAL
    -     *       }
    -     * 
    - * - * @param seq The ASN.1 sequence. - */ - private PersonalData(ASN1Sequence seq) - { - if (seq.size() < 1) - { - throw new IllegalArgumentException("Bad sequence size: " - + seq.size()); - } - - Enumeration e = seq.getObjects(); - - nameOrPseudonym = NameOrPseudonym.getInstance(e.nextElement()); - - while (e.hasMoreElements()) - { - ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement()); - int tag = o.getTagNo(); - switch (tag) - { - case 0: - nameDistinguisher = ASN1Integer.getInstance(o, false).getValue(); - break; - case 1: - dateOfBirth = ASN1GeneralizedTime.getInstance(o, false); - break; - case 2: - placeOfBirth = DirectoryString.getInstance(o, true); - break; - case 3: - gender = DERPrintableString.getInstance(o, false).getString(); - break; - case 4: - postalAddress = DirectoryString.getInstance(o, true); - break; - default: - throw new IllegalArgumentException("Bad tag number: " + o.getTagNo()); - } - } - } - - /** - * Constructor from a given details. - * - * @param nameOrPseudonym Name or pseudonym. - * @param nameDistinguisher Name distinguisher. - * @param dateOfBirth Date of birth. - * @param placeOfBirth Place of birth. - * @param gender Gender. - * @param postalAddress Postal Address. - */ - public PersonalData(NameOrPseudonym nameOrPseudonym, - BigInteger nameDistinguisher, ASN1GeneralizedTime dateOfBirth, - DirectoryString placeOfBirth, String gender, DirectoryString postalAddress) - { - this.nameOrPseudonym = nameOrPseudonym; - this.dateOfBirth = dateOfBirth; - this.gender = gender; - this.nameDistinguisher = nameDistinguisher; - this.postalAddress = postalAddress; - this.placeOfBirth = placeOfBirth; - } - - public NameOrPseudonym getNameOrPseudonym() - { - return nameOrPseudonym; - } - - public BigInteger getNameDistinguisher() - { - return nameDistinguisher; - } - - public ASN1GeneralizedTime getDateOfBirth() - { - return dateOfBirth; - } - - public DirectoryString getPlaceOfBirth() - { - return placeOfBirth; - } - - public String getGender() - { - return gender; - } - - public DirectoryString getPostalAddress() - { - return postalAddress; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    - * Returns: - *

    - *

    -     *     PersonalData ::= SEQUENCE {
    -     *       nameOrPseudonym NameOrPseudonym,
    -     *       nameDistinguisher [0] INTEGER OPTIONAL,
    -     *       dateOfBirth [1] GeneralizedTime OPTIONAL,
    -     *       placeOfBirth [2] DirectoryString OPTIONAL,
    -     *       gender [3] PrintableString OPTIONAL,
    -     *       postalAddress [4] DirectoryString OPTIONAL
    -     *       }
    -     * 
    - * - * @return a DERObject - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector vec = new ASN1EncodableVector(); - vec.add(nameOrPseudonym); - if (nameDistinguisher != null) - { - vec.add(new DERTaggedObject(false, 0, new ASN1Integer(nameDistinguisher))); - } - if (dateOfBirth != null) - { - vec.add(new DERTaggedObject(false, 1, dateOfBirth)); - } - if (placeOfBirth != null) - { - vec.add(new DERTaggedObject(true, 2, placeOfBirth)); - } - if (gender != null) - { - vec.add(new DERTaggedObject(false, 3, new DERPrintableString(gender, true))); - } - if (postalAddress != null) - { - vec.add(new DERTaggedObject(true, 4, postalAddress)); - } - return new DERSequence(vec); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/SigIObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/SigIObjectIdentifiers.java deleted file mode 100644 index 59be5fa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x509/sigi/SigIObjectIdentifiers.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.asn1.x509.sigi; - -import org.bc.asn1.ASN1ObjectIdentifier; - -/** - * Object Identifiers of SigI specifciation (German Signature Law - * Interoperability specification). - */ -public interface SigIObjectIdentifiers -{ - public final static ASN1ObjectIdentifier id_sigi = new ASN1ObjectIdentifier("1.3.36.8"); - - /** - * Key purpose IDs for German SigI (Signature Interoperability - * Specification) - */ - public final static ASN1ObjectIdentifier id_sigi_kp = new ASN1ObjectIdentifier(id_sigi + ".2"); - - /** - * Certificate policy IDs for German SigI (Signature Interoperability - * Specification) - */ - public final static ASN1ObjectIdentifier id_sigi_cp = new ASN1ObjectIdentifier(id_sigi + ".1"); - - /** - * Other Name IDs for German SigI (Signature Interoperability Specification) - */ - public final static ASN1ObjectIdentifier id_sigi_on = new ASN1ObjectIdentifier(id_sigi + ".4"); - - /** - * To be used for for the generation of directory service certificates. - */ - public static final ASN1ObjectIdentifier id_sigi_kp_directoryService = new ASN1ObjectIdentifier(id_sigi_kp + ".1"); - - /** - * ID for PersonalData - */ - public static final ASN1ObjectIdentifier id_sigi_on_personalData = new ASN1ObjectIdentifier(id_sigi_on + ".1"); - - /** - * Certificate is conform to german signature law. - */ - public static final ASN1ObjectIdentifier id_sigi_cp_sigconform = new ASN1ObjectIdentifier(id_sigi_cp + ".1"); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHDomainParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHDomainParameters.java deleted file mode 100644 index f0cabe4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHDomainParameters.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.bc.asn1.x9; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERSequence; - -public class DHDomainParameters - extends ASN1Object -{ - private ASN1Integer p, g, q, j; - private DHValidationParms validationParms; - - public static DHDomainParameters getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static DHDomainParameters getInstance(Object obj) - { - if (obj == null || obj instanceof DHDomainParameters) - { - return (DHDomainParameters)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new DHDomainParameters((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid DHDomainParameters: " - + obj.getClass().getName()); - } - - public DHDomainParameters(ASN1Integer p, ASN1Integer g, ASN1Integer q, ASN1Integer j, - DHValidationParms validationParms) - { - if (p == null) - { - throw new IllegalArgumentException("'p' cannot be null"); - } - if (g == null) - { - throw new IllegalArgumentException("'g' cannot be null"); - } - if (q == null) - { - throw new IllegalArgumentException("'q' cannot be null"); - } - - this.p = p; - this.g = g; - this.q = q; - this.j = j; - this.validationParms = validationParms; - } - - private DHDomainParameters(ASN1Sequence seq) - { - if (seq.size() < 3 || seq.size() > 5) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - Enumeration e = seq.getObjects(); - this.p = ASN1Integer.getInstance(e.nextElement()); - this.g = ASN1Integer.getInstance(e.nextElement()); - this.q = ASN1Integer.getInstance(e.nextElement()); - - ASN1Encodable next = getNext(e); - - if (next != null && next instanceof ASN1Integer) - { - this.j = ASN1Integer.getInstance(next); - next = getNext(e); - } - - if (next != null) - { - this.validationParms = DHValidationParms.getInstance(next.toASN1Primitive()); - } - } - - private static ASN1Encodable getNext(Enumeration e) - { - return e.hasMoreElements() ? (ASN1Encodable)e.nextElement() : null; - } - - public ASN1Integer getP() - { - return this.p; - } - - public ASN1Integer getG() - { - return this.g; - } - - public ASN1Integer getQ() - { - return this.q; - } - - public ASN1Integer getJ() - { - return this.j; - } - - public DHValidationParms getValidationParms() - { - return this.validationParms; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.p); - v.add(this.g); - v.add(this.q); - - if (this.j != null) - { - v.add(this.j); - } - - if (this.validationParms != null) - { - v.add(this.validationParms); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHPublicKey.java deleted file mode 100644 index 5dc07c2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHPublicKey.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.asn1.x9; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; - -public class DHPublicKey - extends ASN1Object -{ - private ASN1Integer y; - - public static DHPublicKey getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1Integer.getInstance(obj, explicit)); - } - - public static DHPublicKey getInstance(Object obj) - { - if (obj == null || obj instanceof DHPublicKey) - { - return (DHPublicKey)obj; - } - - if (obj instanceof ASN1Integer) - { - return new DHPublicKey((ASN1Integer)obj); - } - - throw new IllegalArgumentException("Invalid DHPublicKey: " + obj.getClass().getName()); - } - - public DHPublicKey(ASN1Integer y) - { - if (y == null) - { - throw new IllegalArgumentException("'y' cannot be null"); - } - - this.y = y; - } - - public ASN1Integer getY() - { - return this.y; - } - - public ASN1Primitive toASN1Primitive() - { - return this.y; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHValidationParms.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHValidationParms.java deleted file mode 100644 index 7774c7e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/DHValidationParms.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.asn1.x9; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.ASN1TaggedObject; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; - -public class DHValidationParms extends ASN1Object -{ - private DERBitString seed; - private ASN1Integer pgenCounter; - - public static DHValidationParms getInstance(ASN1TaggedObject obj, boolean explicit) - { - return getInstance(ASN1Sequence.getInstance(obj, explicit)); - } - - public static DHValidationParms getInstance(Object obj) - { - if (obj == null || obj instanceof DHDomainParameters) - { - return (DHValidationParms)obj; - } - - if (obj instanceof ASN1Sequence) - { - return new DHValidationParms((ASN1Sequence)obj); - } - - throw new IllegalArgumentException("Invalid DHValidationParms: " + obj.getClass().getName()); - } - - public DHValidationParms(DERBitString seed, ASN1Integer pgenCounter) - { - if (seed == null) - { - throw new IllegalArgumentException("'seed' cannot be null"); - } - if (pgenCounter == null) - { - throw new IllegalArgumentException("'pgenCounter' cannot be null"); - } - - this.seed = seed; - this.pgenCounter = pgenCounter; - } - - private DHValidationParms(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("Bad sequence size: " + seq.size()); - } - - this.seed = DERBitString.getInstance(seq.getObjectAt(0)); - this.pgenCounter = ASN1Integer.getInstance(seq.getObjectAt(1)); - } - - public DERBitString getSeed() - { - return this.seed; - } - - public ASN1Integer getPgenCounter() - { - return this.pgenCounter; - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(this.seed); - v.add(this.pgenCounter); - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/KeySpecificInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/KeySpecificInfo.java deleted file mode 100644 index 173453e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/KeySpecificInfo.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.bc.asn1.x9; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * ASN.1 def for Diffie-Hellman key exchange KeySpecificInfo structure. See - * RFC 2631, or X9.42, for further details. - */ -public class KeySpecificInfo - extends ASN1Object -{ - private ASN1ObjectIdentifier algorithm; - private ASN1OctetString counter; - - public KeySpecificInfo( - ASN1ObjectIdentifier algorithm, - ASN1OctetString counter) - { - this.algorithm = algorithm; - this.counter = counter; - } - - public KeySpecificInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - algorithm = (ASN1ObjectIdentifier)e.nextElement(); - counter = (ASN1OctetString)e.nextElement(); - } - - public ASN1ObjectIdentifier getAlgorithm() - { - return algorithm; - } - - public ASN1OctetString getCounter() - { - return counter; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  KeySpecificInfo ::= SEQUENCE {
    -     *      algorithm OBJECT IDENTIFIER,
    -     *      counter OCTET STRING SIZE (4..4)
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(algorithm); - v.add(counter); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/OtherInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/OtherInfo.java deleted file mode 100644 index 9b632ce..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/OtherInfo.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.asn1.x9; - -import java.util.Enumeration; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; - -/** - * ANS.1 def for Diffie-Hellman key exchange OtherInfo structure. See - * RFC 2631, or X9.42, for further details. - */ -public class OtherInfo - extends ASN1Object -{ - private KeySpecificInfo keyInfo; - private ASN1OctetString partyAInfo; - private ASN1OctetString suppPubInfo; - - public OtherInfo( - KeySpecificInfo keyInfo, - ASN1OctetString partyAInfo, - ASN1OctetString suppPubInfo) - { - this.keyInfo = keyInfo; - this.partyAInfo = partyAInfo; - this.suppPubInfo = suppPubInfo; - } - - public OtherInfo( - ASN1Sequence seq) - { - Enumeration e = seq.getObjects(); - - keyInfo = new KeySpecificInfo((ASN1Sequence)e.nextElement()); - - while (e.hasMoreElements()) - { - DERTaggedObject o = (DERTaggedObject)e.nextElement(); - - if (o.getTagNo() == 0) - { - partyAInfo = (ASN1OctetString)o.getObject(); - } - else if (o.getTagNo() == 2) - { - suppPubInfo = (ASN1OctetString)o.getObject(); - } - } - } - - public KeySpecificInfo getKeyInfo() - { - return keyInfo; - } - - public ASN1OctetString getPartyAInfo() - { - return partyAInfo; - } - - public ASN1OctetString getSuppPubInfo() - { - return suppPubInfo; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  OtherInfo ::= SEQUENCE {
    -     *      keyInfo KeySpecificInfo,
    -     *      partyAInfo [0] OCTET STRING OPTIONAL,
    -     *      suppPubInfo [2] OCTET STRING
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(keyInfo); - - if (partyAInfo != null) - { - v.add(new DERTaggedObject(0, partyAInfo)); - } - - v.add(new DERTaggedObject(2, suppPubInfo)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962NamedCurves.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962NamedCurves.java deleted file mode 100644 index 67153d0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962NamedCurves.java +++ /dev/null @@ -1,621 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.math.ec.ECCurve; -import org.bc.util.Strings; -import org.bc.util.encoders.Hex; - - -/** - * table of the current named curves defined in X.962 EC-DSA. - */ -public class X962NamedCurves -{ - static X9ECParametersHolder prime192v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp192v1 = new ECCurve.Fp( - new BigInteger("6277101735386680763835789423207666416083908700390324961279"), - new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16), - new BigInteger("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16)); - - return new X9ECParameters( - cFp192v1, - cFp192v1.decodePoint( - Hex.decode("03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012")), - new BigInteger("ffffffffffffffffffffffff99def836146bc9b1b4d22831", 16), - BigInteger.valueOf(1), - Hex.decode("3045AE6FC8422f64ED579528D38120EAE12196D5")); - } - }; - - static X9ECParametersHolder prime192v2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp192v2 = new ECCurve.Fp( - new BigInteger("6277101735386680763835789423207666416083908700390324961279"), - new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16), - new BigInteger("cc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953", 16)); - - return new X9ECParameters( - cFp192v2, - cFp192v2.decodePoint( - Hex.decode("03eea2bae7e1497842f2de7769cfe9c989c072ad696f48034a")), - new BigInteger("fffffffffffffffffffffffe5fb1a724dc80418648d8dd31", 16), - BigInteger.valueOf(1), - Hex.decode("31a92ee2029fd10d901b113e990710f0d21ac6b6")); - } - }; - - static X9ECParametersHolder prime192v3 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp192v3 = new ECCurve.Fp( - new BigInteger("6277101735386680763835789423207666416083908700390324961279"), - new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16), - new BigInteger("22123dc2395a05caa7423daeccc94760a7d462256bd56916", 16)); - - return new X9ECParameters( - cFp192v3, - cFp192v3.decodePoint( - Hex.decode("027d29778100c65a1da1783716588dce2b8b4aee8e228f1896")), - new BigInteger("ffffffffffffffffffffffff7a62d031c83f4294f640ec13", 16), - BigInteger.valueOf(1), - Hex.decode("c469684435deb378c4b65ca9591e2a5763059a2e")); - } - }; - - static X9ECParametersHolder prime239v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp239v1 = new ECCurve.Fp( - new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), - new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), - new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); - - return new X9ECParameters( - cFp239v1, - cFp239v1.decodePoint( - Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), - new BigInteger("7fffffffffffffffffffffff7fffff9e5e9a9f5d9071fbd1522688909d0b", 16), - BigInteger.valueOf(1), - Hex.decode("e43bb460f0b80cc0c0b075798e948060f8321b7d")); - } - }; - - static X9ECParametersHolder prime239v2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp239v2 = new ECCurve.Fp( - new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), - new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), - new BigInteger("617fab6832576cbbfed50d99f0249c3fee58b94ba0038c7ae84c8c832f2c", 16)); - - return new X9ECParameters( - cFp239v2, - cFp239v2.decodePoint( - Hex.decode("0238af09d98727705120c921bb5e9e26296a3cdcf2f35757a0eafd87b830e7")), - new BigInteger("7fffffffffffffffffffffff800000cfa7e8594377d414c03821bc582063", 16), - BigInteger.valueOf(1), - Hex.decode("e8b4011604095303ca3b8099982be09fcb9ae616")); - } - }; - - static X9ECParametersHolder prime239v3 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp239v3 = new ECCurve.Fp( - new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), - new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), - new BigInteger("255705fa2a306654b1f4cb03d6a750a30c250102d4988717d9ba15ab6d3e", 16)); - - return new X9ECParameters( - cFp239v3, - cFp239v3.decodePoint( - Hex.decode("036768ae8e18bb92cfcf005c949aa2c6d94853d0e660bbf854b1c9505fe95a")), - new BigInteger("7fffffffffffffffffffffff7fffff975deb41b3a6057c3c432146526551", 16), - BigInteger.valueOf(1), - Hex.decode("7d7374168ffe3471b60a857686a19475d3bfa2ff")); - } - }; - - static X9ECParametersHolder prime256v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - ECCurve cFp256v1 = new ECCurve.Fp( - new BigInteger("115792089210356248762697446949407573530086143415290314195533631308867097853951"), - new BigInteger("ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", 16), - new BigInteger("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)); - - return new X9ECParameters( - cFp256v1, - cFp256v1.decodePoint( - Hex.decode("036b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296")), - new BigInteger("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", 16), - BigInteger.valueOf(1), - Hex.decode("c49d360886e704936a6678e1139d26b7819f7e90")); - } - }; - - /* - * F2m Curves - */ - static X9ECParametersHolder c2pnb163v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m163v1n = new BigInteger("0400000000000000000001E60FC8821CC74DAEAFC1", 16); - BigInteger c2m163v1h = BigInteger.valueOf(2); - - ECCurve c2m163v1 = new ECCurve.F2m( - 163, - 1, 2, 8, - new BigInteger("072546B5435234A422E0789675F432C89435DE5242", 16), - new BigInteger("00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", 16), - c2m163v1n, c2m163v1h); - - return new X9ECParameters( - c2m163v1, - c2m163v1.decodePoint( - Hex.decode("0307AF69989546103D79329FCC3D74880F33BBE803CB")), - c2m163v1n, c2m163v1h, - Hex.decode("D2C0FB15760860DEF1EEF4D696E6768756151754")); - } - }; - - static X9ECParametersHolder c2pnb163v2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m163v2n = new BigInteger("03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", 16); - BigInteger c2m163v2h = BigInteger.valueOf(2); - - ECCurve c2m163v2 = new ECCurve.F2m( - 163, - 1, 2, 8, - new BigInteger("0108B39E77C4B108BED981ED0E890E117C511CF072", 16), - new BigInteger("0667ACEB38AF4E488C407433FFAE4F1C811638DF20", 16), - c2m163v2n, c2m163v2h); - - return new X9ECParameters( - c2m163v2, - c2m163v2.decodePoint( - Hex.decode("030024266E4EB5106D0A964D92C4860E2671DB9B6CC5")), - c2m163v2n, c2m163v2h, - null); - } - }; - - static X9ECParametersHolder c2pnb163v3 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m163v3n = new BigInteger("03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", 16); - BigInteger c2m163v3h = BigInteger.valueOf(2); - - ECCurve c2m163v3 = new ECCurve.F2m( - 163, - 1, 2, 8, - new BigInteger("07A526C63D3E25A256A007699F5447E32AE456B50E", 16), - new BigInteger("03F7061798EB99E238FD6F1BF95B48FEEB4854252B", 16), - c2m163v3n, c2m163v3h); - - return new X9ECParameters( - c2m163v3, - c2m163v3.decodePoint( - Hex.decode("0202F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB")), - c2m163v3n, c2m163v3h, - null); - } - }; - - static X9ECParametersHolder c2pnb176w1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m176w1n = new BigInteger("010092537397ECA4F6145799D62B0A19CE06FE26AD", 16); - BigInteger c2m176w1h = BigInteger.valueOf(0xFF6E); - - ECCurve c2m176w1 = new ECCurve.F2m( - 176, - 1, 2, 43, - new BigInteger("00E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", 16), - new BigInteger("005DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", 16), - c2m176w1n, c2m176w1h); - - return new X9ECParameters( - c2m176w1, - c2m176w1.decodePoint( - Hex.decode("038D16C2866798B600F9F08BB4A8E860F3298CE04A5798")), - c2m176w1n, c2m176w1h, - null); - } - }; - - static X9ECParametersHolder c2tnb191v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m191v1n = new BigInteger("40000000000000000000000004A20E90C39067C893BBB9A5", 16); - BigInteger c2m191v1h = BigInteger.valueOf(2); - - ECCurve c2m191v1 = new ECCurve.F2m( - 191, - 9, - new BigInteger("2866537B676752636A68F56554E12640276B649EF7526267", 16), - new BigInteger("2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", 16), - c2m191v1n, c2m191v1h); - - return new X9ECParameters( - c2m191v1, - c2m191v1.decodePoint( - Hex.decode("0236B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D")), - c2m191v1n, c2m191v1h, - Hex.decode("4E13CA542744D696E67687561517552F279A8C84")); - } - }; - - static X9ECParametersHolder c2tnb191v2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m191v2n = new BigInteger("20000000000000000000000050508CB89F652824E06B8173", 16); - BigInteger c2m191v2h = BigInteger.valueOf(4); - - ECCurve c2m191v2 = new ECCurve.F2m( - 191, - 9, - new BigInteger("401028774D7777C7B7666D1366EA432071274F89FF01E718", 16), - new BigInteger("0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", 16), - c2m191v2n, c2m191v2h); - - return new X9ECParameters( - c2m191v2, - c2m191v2.decodePoint( - Hex.decode("023809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10")), - c2m191v2n, c2m191v2h, - null); - } - }; - - static X9ECParametersHolder c2tnb191v3 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m191v3n = new BigInteger("155555555555555555555555610C0B196812BFB6288A3EA3", 16); - BigInteger c2m191v3h = BigInteger.valueOf(6); - - ECCurve c2m191v3 = new ECCurve.F2m( - 191, - 9, - new BigInteger("6C01074756099122221056911C77D77E77A777E7E7E77FCB", 16), - new BigInteger("71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", 16), - c2m191v3n, c2m191v3h); - - return new X9ECParameters( - c2m191v3, - c2m191v3.decodePoint( - Hex.decode("03375D4CE24FDE434489DE8746E71786015009E66E38A926DD")), - c2m191v3n, c2m191v3h, - null); - } - }; - - static X9ECParametersHolder c2pnb208w1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m208w1n = new BigInteger("0101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", 16); - BigInteger c2m208w1h = BigInteger.valueOf(0xFE48); - - ECCurve c2m208w1 = new ECCurve.F2m( - 208, - 1, 2, 83, - new BigInteger("0", 16), - new BigInteger("00C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", 16), - c2m208w1n, c2m208w1h); - - return new X9ECParameters( - c2m208w1, - c2m208w1.decodePoint( - Hex.decode("0289FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A")), - c2m208w1n, c2m208w1h, - null); - } - }; - - static X9ECParametersHolder c2tnb239v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m239v1n = new BigInteger("2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", 16); - BigInteger c2m239v1h = BigInteger.valueOf(4); - - ECCurve c2m239v1 = new ECCurve.F2m( - 239, - 36, - new BigInteger("32010857077C5431123A46B808906756F543423E8D27877578125778AC76", 16), - new BigInteger("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", 16), - c2m239v1n, c2m239v1h); - - return new X9ECParameters( - c2m239v1, - c2m239v1.decodePoint( - Hex.decode("0257927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D")), - c2m239v1n, c2m239v1h, - null); - } - }; - - static X9ECParametersHolder c2tnb239v2 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m239v2n = new BigInteger("1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", 16); - BigInteger c2m239v2h = BigInteger.valueOf(6); - - ECCurve c2m239v2 = new ECCurve.F2m( - 239, - 36, - new BigInteger("4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", 16), - new BigInteger("5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", 16), - c2m239v2n, c2m239v2h); - - return new X9ECParameters( - c2m239v2, - c2m239v2.decodePoint( - Hex.decode("0228F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205")), - c2m239v2n, c2m239v2h, - null); - } - }; - - static X9ECParametersHolder c2tnb239v3 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m239v3n = new BigInteger("0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", 16); - BigInteger c2m239v3h = BigInteger.valueOf(10); - - ECCurve c2m239v3 = new ECCurve.F2m( - 239, - 36, - new BigInteger("01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", 16), - new BigInteger("6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", 16), - c2m239v3n, c2m239v3h); - - return new X9ECParameters( - c2m239v3, - c2m239v3.decodePoint( - Hex.decode("0370F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92")), - c2m239v3n, c2m239v3h, - null); - } - }; - - static X9ECParametersHolder c2pnb272w1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m272w1n = new BigInteger("0100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", 16); - BigInteger c2m272w1h = BigInteger.valueOf(0xFF06); - - ECCurve c2m272w1 = new ECCurve.F2m( - 272, - 1, 3, 56, - new BigInteger("0091A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", 16), - new BigInteger("7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", 16), - c2m272w1n, c2m272w1h); - - return new X9ECParameters( - c2m272w1, - c2m272w1.decodePoint( - Hex.decode("026108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D")), - c2m272w1n, c2m272w1h, - null); - } - }; - - static X9ECParametersHolder c2pnb304w1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m304w1n = new BigInteger("0101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D", 16); - BigInteger c2m304w1h = BigInteger.valueOf(0xFE2E); - - ECCurve c2m304w1 = new ECCurve.F2m( - 304, - 1, 2, 11, - new BigInteger("00FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681", 16), - new BigInteger("00BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE", 16), - c2m304w1n, c2m304w1h); - - return new X9ECParameters( - c2m304w1, - c2m304w1.decodePoint( - Hex.decode("02197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614")), - c2m304w1n, c2m304w1h, - null); - } - }; - - static X9ECParametersHolder c2tnb359v1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m359v1n = new BigInteger("01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B", 16); - BigInteger c2m359v1h = BigInteger.valueOf(0x4C); - - ECCurve c2m359v1 = new ECCurve.F2m( - 359, - 68, - new BigInteger("5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557", 16), - new BigInteger("2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988", 16), - c2m359v1n, c2m359v1h); - - return new X9ECParameters( - c2m359v1, - c2m359v1.decodePoint( - Hex.decode("033C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097")), - c2m359v1n, c2m359v1h, - null); - } - }; - - static X9ECParametersHolder c2pnb368w1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m368w1n = new BigInteger("010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967", 16); - BigInteger c2m368w1h = BigInteger.valueOf(0xFF70); - - ECCurve c2m368w1 = new ECCurve.F2m( - 368, - 1, 2, 85, - new BigInteger("00E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D", 16), - new BigInteger("00FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A", 16), - c2m368w1n, c2m368w1h); - - return new X9ECParameters( - c2m368w1, - c2m368w1.decodePoint( - Hex.decode("021085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F")), - c2m368w1n, c2m368w1h, - null); - } - }; - - static X9ECParametersHolder c2tnb431r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - BigInteger c2m431r1n = new BigInteger("0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91", 16); - BigInteger c2m431r1h = BigInteger.valueOf(0x2760); - - ECCurve c2m431r1 = new ECCurve.F2m( - 431, - 120, - new BigInteger("1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F", 16), - new BigInteger("10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618", 16), - c2m431r1n, c2m431r1h); - - return new X9ECParameters( - c2m431r1, - c2m431r1.decodePoint( - Hex.decode("02120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7")), - c2m431r1n, c2m431r1h, - null); - } - }; - - static final Hashtable objIds = new Hashtable(); - static final Hashtable curves = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static void defineCurve(String name, ASN1ObjectIdentifier oid, X9ECParametersHolder holder) - { - objIds.put(name, oid); - names.put(oid, name); - curves.put(oid, holder); - } - - static - { - defineCurve("prime192v1", X9ObjectIdentifiers.prime192v1, prime192v1); - defineCurve("prime192v2", X9ObjectIdentifiers.prime192v2, prime192v2); - defineCurve("prime192v3", X9ObjectIdentifiers.prime192v3, prime192v3); - defineCurve("prime239v1", X9ObjectIdentifiers.prime239v1, prime239v1); - defineCurve("prime239v2", X9ObjectIdentifiers.prime239v2, prime239v2); - defineCurve("prime239v3", X9ObjectIdentifiers.prime239v3, prime239v3); - defineCurve("prime256v1", X9ObjectIdentifiers.prime256v1, prime256v1); - defineCurve("c2pnb163v1", X9ObjectIdentifiers.c2pnb163v1, c2pnb163v1); - defineCurve("c2pnb163v2", X9ObjectIdentifiers.c2pnb163v2, c2pnb163v2); - defineCurve("c2pnb163v3", X9ObjectIdentifiers.c2pnb163v3, c2pnb163v3); - defineCurve("c2pnb176w1", X9ObjectIdentifiers.c2pnb176w1, c2pnb176w1); - defineCurve("c2tnb191v1", X9ObjectIdentifiers.c2tnb191v1, c2tnb191v1); - defineCurve("c2tnb191v2", X9ObjectIdentifiers.c2tnb191v2, c2tnb191v2); - defineCurve("c2tnb191v3", X9ObjectIdentifiers.c2tnb191v3, c2tnb191v3); - defineCurve("c2pnb208w1", X9ObjectIdentifiers.c2pnb208w1, c2pnb208w1); - defineCurve("c2tnb239v1", X9ObjectIdentifiers.c2tnb239v1, c2tnb239v1); - defineCurve("c2tnb239v2", X9ObjectIdentifiers.c2tnb239v2, c2tnb239v2); - defineCurve("c2tnb239v3", X9ObjectIdentifiers.c2tnb239v3, c2tnb239v3); - defineCurve("c2pnb272w1", X9ObjectIdentifiers.c2pnb272w1, c2pnb272w1); - defineCurve("c2pnb304w1", X9ObjectIdentifiers.c2pnb304w1, c2pnb304w1); - defineCurve("c2tnb359v1", X9ObjectIdentifiers.c2tnb359v1, c2tnb359v1); - defineCurve("c2pnb368w1", X9ObjectIdentifiers.c2pnb368w1, c2pnb368w1); - defineCurve("c2tnb431r1", X9ObjectIdentifiers.c2tnb431r1, c2tnb431r1); - } - - public static X9ECParameters getByName( - String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - - if (oid != null) - { - return getByOID(oid); - } - - return null; - } - - /** - * return the X9ECParameters object for the named curve represented by - * the passed in object identifier. Null if the curve isn't present. - * - * @param oid an object identifier representing a named curve, if present. - */ - public static X9ECParameters getByOID( - ASN1ObjectIdentifier oid) - { - X9ECParametersHolder holder = (X9ECParametersHolder)curves.get(oid); - - if (holder != null) - { - return holder.getParameters(); - } - - return null; - } - - /** - * return the object identifier signified by the passed in name. Null - * if there is no object identifier associated with name. - * - * @return the object identifier associated with name, if present. - */ - public static ASN1ObjectIdentifier getOID( - String name) - { - return (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName( - ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - /** - * returns an enumeration containing the name strings for curves - * contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962Parameters.java deleted file mode 100644 index 49552f9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X962Parameters.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.bc.asn1.x9; - -import org.bc.asn1.ASN1Choice; -import org.bc.asn1.ASN1Null; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1TaggedObject; - -public class X962Parameters - extends ASN1Object - implements ASN1Choice -{ - private ASN1Primitive params = null; - - public static X962Parameters getInstance( - Object obj) - { - if (obj == null || obj instanceof X962Parameters) - { - return (X962Parameters)obj; - } - - if (obj instanceof ASN1Primitive) - { - return new X962Parameters((ASN1Primitive)obj); - } - - throw new IllegalArgumentException("unknown object in getInstance()"); - } - - public static X962Parameters getInstance( - ASN1TaggedObject obj, - boolean explicit) - { - return getInstance(obj.getObject()); // must be explicitly tagged - } - - public X962Parameters( - X9ECParameters ecParameters) - { - this.params = ecParameters.toASN1Primitive(); - } - - public X962Parameters( - ASN1ObjectIdentifier namedCurve) - { - this.params = namedCurve; - } - - public X962Parameters( - ASN1Primitive obj) - { - this.params = obj; - } - - public boolean isNamedCurve() - { - return (params instanceof ASN1ObjectIdentifier); - } - - public boolean isImplicitlyCA() - { - return (params instanceof ASN1Null); - } - - public ASN1Primitive getParameters() - { - return params; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     * Parameters ::= CHOICE {
    -     *    ecParameters ECParameters,
    -     *    namedCurve   CURVES.&id({CurveNames}),
    -     *    implicitlyCA NULL
    -     * }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - return (ASN1Primitive)params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9Curve.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9Curve.java deleted file mode 100644 index 03963f6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9Curve.java +++ /dev/null @@ -1,161 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERBitString; -import org.bc.asn1.DERSequence; -import org.bc.math.ec.ECCurve; - -/** - * ASN.1 def for Elliptic-Curve Curve structure. See - * X9.62, for further details. - */ -public class X9Curve - extends ASN1Object - implements X9ObjectIdentifiers -{ - private ECCurve curve; - private byte[] seed; - private ASN1ObjectIdentifier fieldIdentifier = null; - - public X9Curve( - ECCurve curve) - { - this.curve = curve; - this.seed = null; - setFieldIdentifier(); - } - - public X9Curve( - ECCurve curve, - byte[] seed) - { - this.curve = curve; - this.seed = seed; - setFieldIdentifier(); - } - - public X9Curve( - X9FieldID fieldID, - ASN1Sequence seq) - { - fieldIdentifier = fieldID.getIdentifier(); - if (fieldIdentifier.equals(prime_field)) - { - BigInteger p = ((ASN1Integer)fieldID.getParameters()).getValue(); - X9FieldElement x9A = new X9FieldElement(p, (ASN1OctetString)seq.getObjectAt(0)); - X9FieldElement x9B = new X9FieldElement(p, (ASN1OctetString)seq.getObjectAt(1)); - curve = new ECCurve.Fp(p, x9A.getValue().toBigInteger(), x9B.getValue().toBigInteger()); - } - else - { - if (fieldIdentifier.equals(characteristic_two_field)) - { - // Characteristic two field - ASN1Sequence parameters = ASN1Sequence.getInstance(fieldID.getParameters()); - int m = ((ASN1Integer)parameters.getObjectAt(0)).getValue(). - intValue(); - ASN1ObjectIdentifier representation - = (ASN1ObjectIdentifier)parameters.getObjectAt(1); - - int k1 = 0; - int k2 = 0; - int k3 = 0; - if (representation.equals(tpBasis)) - { - // Trinomial basis representation - k1 = ((ASN1Integer)parameters.getObjectAt(2)).getValue(). - intValue(); - } - else - { - // Pentanomial basis representation - DERSequence pentanomial - = (DERSequence)parameters.getObjectAt(2); - k1 = ((ASN1Integer)pentanomial.getObjectAt(0)).getValue(). - intValue(); - k2 = ((ASN1Integer)pentanomial.getObjectAt(1)).getValue(). - intValue(); - k3 = ((ASN1Integer)pentanomial.getObjectAt(2)).getValue(). - intValue(); - } - X9FieldElement x9A = new X9FieldElement(m, k1, k2, k3, (ASN1OctetString)seq.getObjectAt(0)); - X9FieldElement x9B = new X9FieldElement(m, k1, k2, k3, (ASN1OctetString)seq.getObjectAt(1)); - // TODO Is it possible to get the order (n) and cofactor(h) too? - curve = new ECCurve.F2m(m, k1, k2, k3, x9A.getValue().toBigInteger(), x9B.getValue().toBigInteger()); - } - } - - if (seq.size() == 3) - { - seed = ((DERBitString)seq.getObjectAt(2)).getBytes(); - } - } - - private void setFieldIdentifier() - { - if (curve instanceof ECCurve.Fp) - { - fieldIdentifier = prime_field; - } - else if (curve instanceof ECCurve.F2m) - { - fieldIdentifier = characteristic_two_field; - } - else - { - throw new IllegalArgumentException("This type of ECCurve is not " - + "implemented"); - } - } - - public ECCurve getCurve() - { - return curve; - } - - public byte[] getSeed() - { - return seed; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  Curve ::= SEQUENCE {
    -     *      a               FieldElement,
    -     *      b               FieldElement,
    -     *      seed            BIT STRING      OPTIONAL
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - if (fieldIdentifier.equals(prime_field)) - { - v.add(new X9FieldElement(curve.getA()).toASN1Primitive()); - v.add(new X9FieldElement(curve.getB()).toASN1Primitive()); - } - else if (fieldIdentifier.equals(characteristic_two_field)) - { - v.add(new X9FieldElement(curve.getA()).toASN1Primitive()); - v.add(new X9FieldElement(curve.getB()).toASN1Primitive()); - } - - if (seed != null) - { - v.add(new DERBitString(seed)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParameters.java deleted file mode 100644 index 9b1c505..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParameters.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECPoint; - -/** - * ASN.1 def for Elliptic-Curve ECParameters structure. See - * X9.62, for further details. - */ -public class X9ECParameters - extends ASN1Object - implements X9ObjectIdentifiers -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - - private X9FieldID fieldID; - private ECCurve curve; - private ECPoint g; - private BigInteger n; - private BigInteger h; - private byte[] seed; - - private X9ECParameters( - ASN1Sequence seq) - { - if (!(seq.getObjectAt(0) instanceof ASN1Integer) - || !((ASN1Integer)seq.getObjectAt(0)).getValue().equals(ONE)) - { - throw new IllegalArgumentException("bad version in X9ECParameters"); - } - - X9Curve x9c = new X9Curve( - new X9FieldID((ASN1Sequence)seq.getObjectAt(1)), - (ASN1Sequence)seq.getObjectAt(2)); - - this.curve = x9c.getCurve(); - this.g = new X9ECPoint(curve, (ASN1OctetString)seq.getObjectAt(3)).getPoint(); - this.n = ((ASN1Integer)seq.getObjectAt(4)).getValue(); - this.seed = x9c.getSeed(); - - if (seq.size() == 6) - { - this.h = ((ASN1Integer)seq.getObjectAt(5)).getValue(); - } - } - - public static X9ECParameters getInstance(Object obj) - { - if (obj instanceof X9ECParameters) - { - return (X9ECParameters)obj; - } - - if (obj != null) - { - return new X9ECParameters(ASN1Sequence.getInstance(obj)); - } - - return null; - } - - public X9ECParameters( - ECCurve curve, - ECPoint g, - BigInteger n) - { - this(curve, g, n, ONE, null); - } - - public X9ECParameters( - ECCurve curve, - ECPoint g, - BigInteger n, - BigInteger h) - { - this(curve, g, n, h, null); - } - - public X9ECParameters( - ECCurve curve, - ECPoint g, - BigInteger n, - BigInteger h, - byte[] seed) - { - this.curve = curve; - this.g = g; - this.n = n; - this.h = h; - this.seed = seed; - - if (curve instanceof ECCurve.Fp) - { - this.fieldID = new X9FieldID(((ECCurve.Fp)curve).getQ()); - } - else - { - if (curve instanceof ECCurve.F2m) - { - ECCurve.F2m curveF2m = (ECCurve.F2m)curve; - this.fieldID = new X9FieldID(curveF2m.getM(), curveF2m.getK1(), - curveF2m.getK2(), curveF2m.getK3()); - } - } - } - - public ECCurve getCurve() - { - return curve; - } - - public ECPoint getG() - { - return g; - } - - public BigInteger getN() - { - return n; - } - - public BigInteger getH() - { - if (h == null) - { - return ONE; // TODO - this should be calculated, it will cause issues with custom curves. - } - - return h; - } - - public byte[] getSeed() - { - return seed; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  ECParameters ::= SEQUENCE {
    -     *      version         INTEGER { ecpVer1(1) } (ecpVer1),
    -     *      fieldID         FieldID {{FieldTypes}},
    -     *      curve           X9Curve,
    -     *      base            X9ECPoint,
    -     *      order           INTEGER,
    -     *      cofactor        INTEGER OPTIONAL
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(1)); - v.add(fieldID); - v.add(new X9Curve(curve, seed)); - v.add(new X9ECPoint(g)); - v.add(new ASN1Integer(n)); - - if (h != null) - { - v.add(new ASN1Integer(h)); - } - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParametersHolder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParametersHolder.java deleted file mode 100644 index f1becb3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECParametersHolder.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.asn1.x9; - -public abstract class X9ECParametersHolder -{ - private X9ECParameters params; - - public X9ECParameters getParameters() - { - if (params == null) - { - params = createParameters(); - } - - return params; - } - - protected abstract X9ECParameters createParameters(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECPoint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECPoint.java deleted file mode 100644 index b9ae23a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ECPoint.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.asn1.x9; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECPoint; - -/** - * class for describing an ECPoint as a DER object. - */ -public class X9ECPoint - extends ASN1Object -{ - ECPoint p; - - public X9ECPoint( - ECPoint p) - { - this.p = p; - } - - public X9ECPoint( - ECCurve c, - ASN1OctetString s) - { - this.p = c.decodePoint(s.getOctets()); - } - - public ECPoint getPoint() - { - return p; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *
    -     *  ECPoint ::= OCTET STRING
    -     * 
    - *

    - * Octet string produced using ECPoint.getEncoded(). - */ - public ASN1Primitive toASN1Primitive() - { - return new DEROctetString(p.getEncoded()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldElement.java deleted file mode 100644 index f6e98cf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldElement.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.DEROctetString; -import org.bc.math.ec.ECFieldElement; - -/** - * class for processing an FieldElement as a DER object. - */ -public class X9FieldElement - extends ASN1Object -{ - protected ECFieldElement f; - - private static X9IntegerConverter converter = new X9IntegerConverter(); - - public X9FieldElement(ECFieldElement f) - { - this.f = f; - } - - public X9FieldElement(BigInteger p, ASN1OctetString s) - { - this(new ECFieldElement.Fp(p, new BigInteger(1, s.getOctets()))); - } - - public X9FieldElement(int m, int k1, int k2, int k3, ASN1OctetString s) - { - this(new ECFieldElement.F2m(m, k1, k2, k3, new BigInteger(1, s.getOctets()))); - } - - public ECFieldElement getValue() - { - return f; - } - - /** - * Produce an object suitable for an ASN1OutputStream. - *

    -     *  FieldElement ::= OCTET STRING
    -     * 
    - *

    - *

      - *
    1. if q is an odd prime then the field element is - * processed as an Integer and converted to an octet string - * according to x 9.62 4.3.1.
    2. - *
    3. if q is 2m then the bit string - * contained in the field element is converted into an octet - * string with the same ordering padded at the front if necessary. - *
    4. - *
    - */ - public ASN1Primitive toASN1Primitive() - { - int byteCount = converter.getByteLength(f); - byte[] paddedBigInteger = converter.integerToBytes(f.toBigInteger(), byteCount); - - return new DEROctetString(paddedBigInteger); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldID.java deleted file mode 100644 index 7e97c0e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9FieldID.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; - -/** - * ASN.1 def for Elliptic-Curve Field ID structure. See - * X9.62, for further details. - */ -public class X9FieldID - extends ASN1Object - implements X9ObjectIdentifiers -{ - private ASN1ObjectIdentifier id; - private ASN1Primitive parameters; - - /** - * Constructor for elliptic curves over prime fields - * F2. - * @param primeP The prime p defining the prime field. - */ - public X9FieldID(BigInteger primeP) - { - this.id = prime_field; - this.parameters = new ASN1Integer(primeP); - } - - /** - * Constructor for elliptic curves over binary fields - * F2m. - * @param m The exponent m of - * F2m. - * @param k1 The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k2 The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k3 The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).. - */ - public X9FieldID(int m, int k1, int k2, int k3) - { - this.id = characteristic_two_field; - ASN1EncodableVector fieldIdParams = new ASN1EncodableVector(); - fieldIdParams.add(new ASN1Integer(m)); - - if (k2 == 0) - { - fieldIdParams.add(tpBasis); - fieldIdParams.add(new ASN1Integer(k1)); - } - else - { - fieldIdParams.add(ppBasis); - ASN1EncodableVector pentanomialParams = new ASN1EncodableVector(); - pentanomialParams.add(new ASN1Integer(k1)); - pentanomialParams.add(new ASN1Integer(k2)); - pentanomialParams.add(new ASN1Integer(k3)); - fieldIdParams.add(new DERSequence(pentanomialParams)); - } - - this.parameters = new DERSequence(fieldIdParams); - } - - public X9FieldID( - ASN1Sequence seq) - { - this.id = (ASN1ObjectIdentifier)seq.getObjectAt(0); - this.parameters = (ASN1Primitive)seq.getObjectAt(1); - } - - public ASN1ObjectIdentifier getIdentifier() - { - return id; - } - - public ASN1Primitive getParameters() - { - return parameters; - } - - /** - * Produce a DER encoding of the following structure. - *
    -     *  FieldID ::= SEQUENCE {
    -     *      fieldType       FIELD-ID.&id({IOSet}),
    -     *      parameters      FIELD-ID.&Type({IOSet}{@fieldType})
    -     *  }
    -     * 
    - */ - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(this.id); - v.add(this.parameters); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9IntegerConverter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9IntegerConverter.java deleted file mode 100644 index 9112502..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9IntegerConverter.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.asn1.x9; - -import java.math.BigInteger; - -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECFieldElement; - -public class X9IntegerConverter -{ - public int getByteLength( - ECCurve c) - { - return (c.getFieldSize() + 7) / 8; - } - - public int getByteLength( - ECFieldElement fe) - { - return (fe.getFieldSize() + 7) / 8; - } - - public byte[] integerToBytes( - BigInteger s, - int qLength) - { - byte[] bytes = s.toByteArray(); - - if (qLength < bytes.length) - { - byte[] tmp = new byte[qLength]; - - System.arraycopy(bytes, bytes.length - tmp.length, tmp, 0, tmp.length); - - return tmp; - } - else if (qLength > bytes.length) - { - byte[] tmp = new byte[qLength]; - - System.arraycopy(bytes, 0, tmp, tmp.length - bytes.length, bytes.length); - - return tmp; - } - - return bytes; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ObjectIdentifiers.java deleted file mode 100644 index a58423d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/asn1/x9/X9ObjectIdentifiers.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.bc.asn1.x9; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface X9ObjectIdentifiers -{ - // - // X9.62 - // - // ansi-X9-62 OBJECT IDENTIFIER ::= { iso(1) member-body(2) - // us(840) ansi-x962(10045) } - // - static final ASN1ObjectIdentifier ansi_X9_62 = new ASN1ObjectIdentifier("1.2.840.10045"); - static final ASN1ObjectIdentifier id_fieldType = ansi_X9_62.branch("1"); - - static final ASN1ObjectIdentifier prime_field = id_fieldType.branch("1"); - - static final ASN1ObjectIdentifier characteristic_two_field = id_fieldType.branch("2"); - - static final ASN1ObjectIdentifier gnBasis = id_fieldType.branch("2.3.1"); - - static final ASN1ObjectIdentifier tpBasis = id_fieldType.branch("2.3.2"); - - static final ASN1ObjectIdentifier ppBasis = id_fieldType.branch("2.3.3"); - - static final ASN1ObjectIdentifier id_ecSigType = ansi_X9_62.branch("4"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA1 = new ASN1ObjectIdentifier(id_ecSigType + ".1"); - - static final ASN1ObjectIdentifier id_publicKeyType = ansi_X9_62.branch("2"); - - static final ASN1ObjectIdentifier id_ecPublicKey = id_publicKeyType.branch("1"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA2 = id_ecSigType.branch("3"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA224 = ecdsa_with_SHA2.branch("1"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA256 = ecdsa_with_SHA2.branch("2"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA384 = ecdsa_with_SHA2.branch("3"); - - static final ASN1ObjectIdentifier ecdsa_with_SHA512 = ecdsa_with_SHA2.branch("4"); - - // - // named curves - // - static final ASN1ObjectIdentifier ellipticCurve = ansi_X9_62.branch("3"); - - // - // Two Curves - // - static final ASN1ObjectIdentifier cTwoCurve = ellipticCurve.branch("0"); - - static final ASN1ObjectIdentifier c2pnb163v1 = cTwoCurve.branch("1"); - static final ASN1ObjectIdentifier c2pnb163v2 = cTwoCurve.branch("2"); - static final ASN1ObjectIdentifier c2pnb163v3 = cTwoCurve.branch("3"); - static final ASN1ObjectIdentifier c2pnb176w1 = cTwoCurve.branch("4"); - static final ASN1ObjectIdentifier c2tnb191v1 = cTwoCurve.branch("5"); - static final ASN1ObjectIdentifier c2tnb191v2 = cTwoCurve.branch("6"); - static final ASN1ObjectIdentifier c2tnb191v3 = cTwoCurve.branch("7"); - static final ASN1ObjectIdentifier c2onb191v4 = cTwoCurve.branch("8"); - static final ASN1ObjectIdentifier c2onb191v5 = cTwoCurve.branch("9"); - static final ASN1ObjectIdentifier c2pnb208w1 = cTwoCurve.branch("10"); - static final ASN1ObjectIdentifier c2tnb239v1 = cTwoCurve.branch("11"); - static final ASN1ObjectIdentifier c2tnb239v2 = cTwoCurve.branch("12"); - static final ASN1ObjectIdentifier c2tnb239v3 = cTwoCurve.branch("13"); - static final ASN1ObjectIdentifier c2onb239v4 = cTwoCurve.branch("14"); - static final ASN1ObjectIdentifier c2onb239v5 = cTwoCurve.branch("15"); - static final ASN1ObjectIdentifier c2pnb272w1 = cTwoCurve.branch("16"); - static final ASN1ObjectIdentifier c2pnb304w1 = cTwoCurve.branch("17"); - static final ASN1ObjectIdentifier c2tnb359v1 = cTwoCurve.branch("18"); - static final ASN1ObjectIdentifier c2pnb368w1 = cTwoCurve.branch("19"); - static final ASN1ObjectIdentifier c2tnb431r1 = cTwoCurve.branch("20"); - - // - // Prime - // - static final ASN1ObjectIdentifier primeCurve = ellipticCurve.branch("1"); - - static final ASN1ObjectIdentifier prime192v1 = primeCurve.branch("1"); - static final ASN1ObjectIdentifier prime192v2 = primeCurve.branch("2"); - static final ASN1ObjectIdentifier prime192v3 = primeCurve.branch("3"); - static final ASN1ObjectIdentifier prime239v1 = primeCurve.branch("4"); - static final ASN1ObjectIdentifier prime239v2 = primeCurve.branch("5"); - static final ASN1ObjectIdentifier prime239v3 = primeCurve.branch("6"); - static final ASN1ObjectIdentifier prime256v1 = primeCurve.branch("7"); - - // - // DSA - // - // dsapublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2) - // us(840) ansi-x957(10040) number-type(4) 1 } - static final ASN1ObjectIdentifier id_dsa = new ASN1ObjectIdentifier("1.2.840.10040.4.1"); - - /** - * id-dsa-with-sha1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) x9-57 - * (10040) x9cm(4) 3 } - */ - public static final ASN1ObjectIdentifier id_dsa_with_sha1 = new ASN1ObjectIdentifier("1.2.840.10040.4.3"); - - /** - * X9.63 - */ - public static final ASN1ObjectIdentifier x9_63_scheme = new ASN1ObjectIdentifier("1.3.133.16.840.63.0"); - public static final ASN1ObjectIdentifier dhSinglePass_stdDH_sha1kdf_scheme = x9_63_scheme.branch("2"); - public static final ASN1ObjectIdentifier dhSinglePass_cofactorDH_sha1kdf_scheme = x9_63_scheme.branch("3"); - public static final ASN1ObjectIdentifier mqvSinglePass_sha1kdf_scheme = x9_63_scheme.branch("16"); - - /** - * X9.42 - */ - - static final ASN1ObjectIdentifier ansi_X9_42 = new ASN1ObjectIdentifier("1.2.840.10046"); - - // - // Diffie-Hellman - // - // dhpublicnumber OBJECT IDENTIFIER ::= { iso(1) member-body(2) - // us(840) ansi-x942(10046) number-type(2) 1 } - // - public static final ASN1ObjectIdentifier dhpublicnumber = ansi_X9_42.branch("2.1"); - - public static final ASN1ObjectIdentifier x9_42_schemes = ansi_X9_42.branch("3"); - public static final ASN1ObjectIdentifier dhStatic = x9_42_schemes.branch("1"); - public static final ASN1ObjectIdentifier dhEphem = x9_42_schemes.branch("2"); - public static final ASN1ObjectIdentifier dhOneFlow = x9_42_schemes.branch("3"); - public static final ASN1ObjectIdentifier dhHybrid1 = x9_42_schemes.branch("4"); - public static final ASN1ObjectIdentifier dhHybrid2 = x9_42_schemes.branch("5"); - public static final ASN1ObjectIdentifier dhHybridOneFlow = x9_42_schemes.branch("6"); - public static final ASN1ObjectIdentifier mqv2 = x9_42_schemes.branch("7"); - public static final ASN1ObjectIdentifier mqv1 = x9_42_schemes.branch("8"); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredInputStream.java deleted file mode 100644 index e923a55..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredInputStream.java +++ /dev/null @@ -1,471 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.util.Vector; - -/** - * reader for Base64 armored objects - read the headers and then start returning - * bytes when the data is reached. An IOException is thrown if the CRC check - * fails. - */ -public class ArmoredInputStream - extends InputStream -{ - /* - * set up the decoding table. - */ - private static final byte[] decodingTable; - - static - { - decodingTable = new byte[128]; - - for (int i = 'A'; i <= 'Z'; i++) - { - decodingTable[i] = (byte)(i - 'A'); - } - - for (int i = 'a'; i <= 'z'; i++) - { - decodingTable[i] = (byte)(i - 'a' + 26); - } - - for (int i = '0'; i <= '9'; i++) - { - decodingTable[i] = (byte)(i - '0' + 52); - } - - decodingTable['+'] = 62; - decodingTable['/'] = 63; - } - - /** - * decode the base 64 encoded input data. - * - * @return the offset the data starts in out. - */ - private int decode( - int in0, - int in1, - int in2, - int in3, - int[] out) - throws EOFException - { - int b1, b2, b3, b4; - - if (in3 < 0) - { - throw new EOFException("unexpected end of file in armored stream."); - } - - if (in2 == '=') - { - b1 = decodingTable[in0] &0xff; - b2 = decodingTable[in1] & 0xff; - - out[2] = ((b1 << 2) | (b2 >> 4)) & 0xff; - - return 2; - } - else if (in3 == '=') - { - b1 = decodingTable[in0]; - b2 = decodingTable[in1]; - b3 = decodingTable[in2]; - - out[1] = ((b1 << 2) | (b2 >> 4)) & 0xff; - out[2] = ((b2 << 4) | (b3 >> 2)) & 0xff; - - return 1; - } - else - { - b1 = decodingTable[in0]; - b2 = decodingTable[in1]; - b3 = decodingTable[in2]; - b4 = decodingTable[in3]; - - out[0] = ((b1 << 2) | (b2 >> 4)) & 0xff; - out[1] = ((b2 << 4) | (b3 >> 2)) & 0xff; - out[2] = ((b3 << 6) | b4) & 0xff; - - return 0; - } - } - - InputStream in; - boolean start = true; - int[] outBuf = new int[3]; - int bufPtr = 3; - CRC24 crc = new CRC24(); - boolean crcFound = false; - boolean hasHeaders = true; - String header = null; - boolean newLineFound = false; - boolean clearText = false; - boolean restart = false; - Vector headerList= new Vector(); - int lastC = 0; - boolean isEndOfStream; - - /** - * Create a stream for reading a PGP armoured message, parsing up to a header - * and then reading the data that follows. - * - * @param in - */ - public ArmoredInputStream( - InputStream in) - throws IOException - { - this(in, true); - } - - /** - * Create an armoured input stream which will assume the data starts - * straight away, or parse for headers first depending on the value of - * hasHeaders. - * - * @param in - * @param hasHeaders true if headers are to be looked for, false otherwise. - */ - public ArmoredInputStream( - InputStream in, - boolean hasHeaders) - throws IOException - { - this.in = in; - this.hasHeaders = hasHeaders; - - if (hasHeaders) - { - parseHeaders(); - } - - start = false; - } - - public int available() - throws IOException - { - return in.available(); - } - - private boolean parseHeaders() - throws IOException - { - header = null; - - int c; - int last = 0; - boolean headerFound = false; - - headerList = new Vector(); - - // - // if restart we already have a header - // - if (restart) - { - headerFound = true; - } - else - { - while ((c = in.read()) >= 0) - { - if (c == '-' && (last == 0 || last == '\n' || last == '\r')) - { - headerFound = true; - break; - } - - last = c; - } - } - - if (headerFound) - { - StringBuffer buf = new StringBuffer("-"); - boolean eolReached = false; - boolean crLf = false; - - if (restart) // we've had to look ahead two '-' - { - buf.append('-'); - } - - while ((c = in.read()) >= 0) - { - if (last == '\r' && c == '\n') - { - crLf = true; - } - if (eolReached && (last != '\r' && c == '\n')) - { - break; - } - if (eolReached && c == '\r') - { - break; - } - if (c == '\r' || (last != '\r' && c == '\n')) - { - String line = buf.toString(); - if (line.trim().length() == 0) - { - break; - } - headerList.addElement(line); - buf.setLength(0); - } - - if (c != '\n' && c != '\r') - { - buf.append((char)c); - eolReached = false; - } - else - { - if (c == '\r' || (last != '\r' && c == '\n')) - { - eolReached = true; - } - } - - last = c; - } - - if (crLf) - { - in.read(); // skip last \n - } - } - - if (headerList.size() > 0) - { - header = (String)headerList.elementAt(0); - } - - clearText = "-----BEGIN PGP SIGNED MESSAGE-----".equals(header); - newLineFound = true; - - return headerFound; - } - - /** - * @return true if we are inside the clear text section of a PGP - * signed message. - */ - public boolean isClearText() - { - return clearText; - } - - /** - * @return true if the stream is actually at end of file. - */ - public boolean isEndOfStream() - { - return isEndOfStream; - } - - /** - * Return the armor header line (if there is one) - * @return the armor header line, null if none present. - */ - public String getArmorHeaderLine() - { - return header; - } - - /** - * Return the armor headers (the lines after the armor header line), - * @return an array of armor headers, null if there aren't any. - */ - public String[] getArmorHeaders() - { - if (headerList.size() <= 1) - { - return null; - } - - String[] hdrs = new String[headerList.size() - 1]; - - for (int i = 0; i != hdrs.length; i++) - { - hdrs[i] = (String)headerList.elementAt(i + 1); - } - - return hdrs; - } - - private int readIgnoreSpace() - throws IOException - { - int c = in.read(); - - while (c == ' ' || c == '\t') - { - c = in.read(); - } - - return c; - } - - public int read() - throws IOException - { - int c; - - if (start) - { - if (hasHeaders) - { - parseHeaders(); - } - - crc.reset(); - start = false; - } - - if (clearText) - { - c = in.read(); - - if (c == '\r' || (c == '\n' && lastC != '\r')) - { - newLineFound = true; - } - else if (newLineFound && c == '-') - { - c = in.read(); - if (c == '-') // a header, not dash escaped - { - clearText = false; - start = true; - restart = true; - } - else // a space - must be a dash escape - { - c = in.read(); - } - newLineFound = false; - } - else - { - if (c != '\n' && lastC != '\r') - { - newLineFound = false; - } - } - - lastC = c; - - if (c < 0) - { - isEndOfStream = true; - } - - return c; - } - - if (bufPtr > 2 || crcFound) - { - c = readIgnoreSpace(); - - if (c == '\r' || c == '\n') - { - c = readIgnoreSpace(); - - while (c == '\n' || c == '\r') - { - c = readIgnoreSpace(); - } - - if (c < 0) // EOF - { - isEndOfStream = true; - return -1; - } - - if (c == '=') // crc reached - { - bufPtr = decode(readIgnoreSpace(), readIgnoreSpace(), readIgnoreSpace(), readIgnoreSpace(), outBuf); - if (bufPtr == 0) - { - int i = ((outBuf[0] & 0xff) << 16) - | ((outBuf[1] & 0xff) << 8) - | (outBuf[2] & 0xff); - - crcFound = true; - - if (i != crc.getValue()) - { - throw new IOException("crc check failed in armored message."); - } - return read(); - } - else - { - throw new IOException("no crc found in armored message."); - } - } - else if (c == '-') // end of record reached - { - while ((c = in.read()) >= 0) - { - if (c == '\n' || c == '\r') - { - break; - } - } - - if (!crcFound) - { - throw new IOException("crc check not found."); - } - - crcFound = false; - start = true; - bufPtr = 3; - - if (c < 0) - { - isEndOfStream = true; - } - - return -1; - } - else // data - { - bufPtr = decode(c, readIgnoreSpace(), readIgnoreSpace(), readIgnoreSpace(), outBuf); - } - } - else - { - if (c >= 0) - { - bufPtr = decode(c, readIgnoreSpace(), readIgnoreSpace(), readIgnoreSpace(), outBuf); - } - else - { - isEndOfStream = true; - return -1; - } - } - } - - c = outBuf[bufPtr++]; - - crc.update(c); - - return c; - } - - public void close() - throws IOException - { - in.close(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredOutputStream.java deleted file mode 100644 index 26cbf3c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ArmoredOutputStream.java +++ /dev/null @@ -1,410 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.util.Enumeration; -import java.util.Hashtable; - -/** - * Basic output stream. - */ -public class ArmoredOutputStream - extends OutputStream -{ - private static final byte[] encodingTable = - { - (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', - (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', - (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', - (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', - (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', - (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', - (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', - (byte)'v', - (byte)'w', (byte)'x', (byte)'y', (byte)'z', - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', - (byte)'7', (byte)'8', (byte)'9', - (byte)'+', (byte)'/' - }; - - /** - * encode the input data producing a base 64 encoded byte array. - */ - private void encode( - OutputStream out, - int[] data, - int len) - throws IOException - { - int d1, d2, d3; - - switch (len) - { - case 0: /* nothing left to do */ - break; - case 1: - d1 = data[0]; - - out.write(encodingTable[(d1 >>> 2) & 0x3f]); - out.write(encodingTable[(d1 << 4) & 0x3f]); - out.write('='); - out.write('='); - break; - case 2: - d1 = data[0]; - d2 = data[1]; - - out.write(encodingTable[(d1 >>> 2) & 0x3f]); - out.write(encodingTable[((d1 << 4) | (d2 >>> 4)) & 0x3f]); - out.write(encodingTable[(d2 << 2) & 0x3f]); - out.write('='); - break; - case 3: - d1 = data[0]; - d2 = data[1]; - d3 = data[2]; - - out.write(encodingTable[(d1 >>> 2) & 0x3f]); - out.write(encodingTable[((d1 << 4) | (d2 >>> 4)) & 0x3f]); - out.write(encodingTable[((d2 << 2) | (d3 >>> 6)) & 0x3f]); - out.write(encodingTable[d3 & 0x3f]); - break; - default: - throw new IOException("unknown length in encode"); - } - } - - OutputStream out; - int[] buf = new int[3]; - int bufPtr = 0; - CRC24 crc = new CRC24(); - int chunkCount = 0; - int lastb; - - boolean start = true; - boolean clearText = false; - boolean newLine = false; - - String nl = System.getProperty("line.separator"); - - String type; - String headerStart = "-----BEGIN PGP "; - String headerTail = "-----"; - String footerStart = "-----END PGP "; - String footerTail = "-----"; - - String version = "BCPG v@RELEASE_NAME@"; - - Hashtable headers = new Hashtable(); - - public ArmoredOutputStream( - OutputStream out) - { - this.out = out; - - if (nl == null) - { - nl = "\r\n"; - } - - resetHeaders(); - } - - public ArmoredOutputStream( - OutputStream out, - Hashtable headers) - { - this(out); - - Enumeration e = headers.keys(); - - while (e.hasMoreElements()) - { - Object key = e.nextElement(); - - this.headers.put(key, headers.get(key)); - } - } - - /** - * Set an additional header entry. - * - * @param name the name of the header entry. - * @param value the value of the header entry. - */ - public void setHeader( - String name, - String value) - { - this.headers.put(name, value); - } - - /** - * Reset the headers to only contain a Version string. - */ - public void resetHeaders() - { - headers.clear(); - headers.put("Version", version); - } - - /** - * Start a clear text signed message. - * @param hashAlgorithm - */ - public void beginClearText( - int hashAlgorithm) - throws IOException - { - String hash; - - switch (hashAlgorithm) - { - case HashAlgorithmTags.SHA1: - hash = "SHA1"; - break; - case HashAlgorithmTags.SHA256: - hash = "SHA256"; - break; - case HashAlgorithmTags.SHA384: - hash = "SHA384"; - break; - case HashAlgorithmTags.SHA512: - hash = "SHA512"; - break; - case HashAlgorithmTags.MD2: - hash = "MD2"; - break; - case HashAlgorithmTags.MD5: - hash = "MD5"; - break; - case HashAlgorithmTags.RIPEMD160: - hash = "RIPEMD160"; - break; - default: - throw new IOException("unknown hash algorithm tag in beginClearText: " + hashAlgorithm); - } - - String armorHdr = "-----BEGIN PGP SIGNED MESSAGE-----" + nl; - String hdrs = "Hash: " + hash + nl + nl; - - for (int i = 0; i != armorHdr.length(); i++) - { - out.write(armorHdr.charAt(i)); - } - - for (int i = 0; i != hdrs.length(); i++) - { - out.write(hdrs.charAt(i)); - } - - clearText = true; - newLine = true; - lastb = 0; - } - - public void endClearText() - { - clearText = false; - } - - private void writeHeaderEntry( - String name, - String value) - throws IOException - { - for (int i = 0; i != name.length(); i++) - { - out.write(name.charAt(i)); - } - - out.write(':'); - out.write(' '); - - for (int i = 0; i != value.length(); i++) - { - out.write(value.charAt(i)); - } - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - } - - public void write( - int b) - throws IOException - { - if (clearText) - { - out.write(b); - - if (newLine) - { - if (!(b == '\n' && lastb == '\r')) - { - newLine = false; - } - if (b == '-') - { - out.write(' '); - out.write('-'); // dash escape - } - } - if (b == '\r' || (b == '\n' && lastb != '\r')) - { - newLine = true; - } - lastb = b; - return; - } - - if (start) - { - boolean newPacket = (b & 0x40) != 0; - int tag = 0; - - if (newPacket) - { - tag = b & 0x3f; - } - else - { - tag = (b & 0x3f) >> 2; - } - - switch (tag) - { - case PacketTags.PUBLIC_KEY: - type = "PUBLIC KEY BLOCK"; - break; - case PacketTags.SECRET_KEY: - type = "PRIVATE KEY BLOCK"; - break; - case PacketTags.SIGNATURE: - type = "SIGNATURE"; - break; - default: - type = "MESSAGE"; - } - - for (int i = 0; i != headerStart.length(); i++) - { - out.write(headerStart.charAt(i)); - } - - for (int i = 0; i != type.length(); i++) - { - out.write(type.charAt(i)); - } - - for (int i = 0; i != headerTail.length(); i++) - { - out.write(headerTail.charAt(i)); - } - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - - writeHeaderEntry("Version", (String)headers.get("Version")); - - Enumeration e = headers.keys(); - while (e.hasMoreElements()) - { - String key = (String)e.nextElement(); - - if (!key.equals("Version")) - { - writeHeaderEntry(key, (String)headers.get(key)); - } - } - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - - start = false; - } - - if (bufPtr == 3) - { - encode(out, buf, bufPtr); - bufPtr = 0; - if ((++chunkCount & 0xf) == 0) - { - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - } - } - - crc.update(b); - buf[bufPtr++] = b & 0xff; - } - - public void flush() - throws IOException - { - } - - /** - * Note: close does nor close the underlying stream. So it is possible to write - * multiple objects using armoring to a single stream. - */ - public void close() - throws IOException - { - if (type != null) - { - encode(out, buf, bufPtr); - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - out.write('='); - - int crcV = crc.getValue(); - - buf[0] = ((crcV >> 16) & 0xff); - buf[1] = ((crcV >> 8) & 0xff); - buf[2] = (crcV & 0xff); - - encode(out, buf, 3); - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - - for (int i = 0; i != footerStart.length(); i++) - { - out.write(footerStart.charAt(i)); - } - - for (int i = 0; i != type.length(); i++) - { - out.write(type.charAt(i)); - } - - for (int i = 0; i != footerTail.length(); i++) - { - out.write(footerTail.charAt(i)); - } - - for (int i = 0; i != nl.length(); i++) - { - out.write(nl.charAt(i)); - } - - out.flush(); - - type = null; - start = true; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGInputStream.java deleted file mode 100644 index 76c7b4a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGInputStream.java +++ /dev/null @@ -1,385 +0,0 @@ -package org.bc.bcpg; - -import org.bc.util.io.Streams; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -/** - * reader for PGP objects - */ -public class BCPGInputStream - extends InputStream implements PacketTags -{ - InputStream in; - boolean next = false; - int nextB; - - public BCPGInputStream( - InputStream in) - { - this.in = in; - } - - public int available() - throws IOException - { - return in.available(); - } - - public int read() - throws IOException - { - if (next) - { - next = false; - - return nextB; - } - else - { - return in.read(); - } - } - - public int read( - byte[] buf, - int off, - int len) - throws IOException - { - if (len == 0) - { - return 0; - } - - if (!next) - { - return in.read(buf, off, len); - } - - // We have next byte waiting, so return it - - if (nextB < 0) - { - return -1; // EOF - } - - buf[off] = (byte)nextB; // May throw NullPointerException... - next = false; // ...so only set this afterwards - - return 1; - } - - public void readFully( - byte[] buf, - int off, - int len) - throws IOException - { - if (Streams.readFully(this, buf, off, len) < len) - { - throw new EOFException(); - } - } - - public void readFully( - byte[] buf) - throws IOException - { - readFully(buf, 0, buf.length); - } - - /** - * returns the next packet tag in the stream. - * - * @return the tag number. - * - * @throws IOException - */ - public int nextPacketTag() - throws IOException - { - if (!next) - { - try - { - nextB = in.read(); - } - catch (EOFException e) - { - nextB = -1; - } - } - - next = true; - - if (nextB >= 0) - { - if ((nextB & 0x40) != 0) // new - { - return (nextB & 0x3f); - } - else // old - { - return ((nextB & 0x3f) >> 2); - } - } - - return nextB; - } - - public Packet readPacket() - throws IOException - { - int hdr = this.read(); - - if (hdr < 0) - { - return null; - } - - if ((hdr & 0x80) == 0) - { - throw new IOException("invalid header encountered"); - } - - boolean newPacket = (hdr & 0x40) != 0; - int tag = 0; - int bodyLen = 0; - boolean partial = false; - - if (newPacket) - { - tag = hdr & 0x3f; - - int l = this.read(); - - if (l < 192) - { - bodyLen = l; - } - else if (l <= 223) - { - int b = in.read(); - - bodyLen = ((l - 192) << 8) + (b) + 192; - } - else if (l == 255) - { - bodyLen = (in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - } - else - { - partial = true; - bodyLen = 1 << (l & 0x1f); - } - } - else - { - int lengthType = hdr & 0x3; - - tag = (hdr & 0x3f) >> 2; - - switch (lengthType) - { - case 0: - bodyLen = this.read(); - break; - case 1: - bodyLen = (this.read() << 8) | this.read(); - break; - case 2: - bodyLen = (this.read() << 24) | (this.read() << 16) | (this.read() << 8) | this.read(); - break; - case 3: - partial = true; - break; - default: - throw new IOException("unknown length type encountered"); - } - } - - BCPGInputStream objStream; - - if (bodyLen == 0 && partial) - { - objStream = this; - } - else - { - objStream = new BCPGInputStream(new PartialInputStream(this, partial, bodyLen)); - } - - switch (tag) - { - case RESERVED: - return new InputStreamPacket(objStream); - case PUBLIC_KEY_ENC_SESSION: - return new PublicKeyEncSessionPacket(objStream); - case SIGNATURE: - return new SignaturePacket(objStream); - case SYMMETRIC_KEY_ENC_SESSION: - return new SymmetricKeyEncSessionPacket(objStream); - case ONE_PASS_SIGNATURE: - return new OnePassSignaturePacket(objStream); - case SECRET_KEY: - return new SecretKeyPacket(objStream); - case PUBLIC_KEY: - return new PublicKeyPacket(objStream); - case SECRET_SUBKEY: - return new SecretSubkeyPacket(objStream); - case COMPRESSED_DATA: - return new CompressedDataPacket(objStream); - case SYMMETRIC_KEY_ENC: - return new SymmetricEncDataPacket(objStream); - case MARKER: - return new MarkerPacket(objStream); - case LITERAL_DATA: - return new LiteralDataPacket(objStream); - case TRUST: - return new TrustPacket(objStream); - case USER_ID: - return new UserIDPacket(objStream); - case USER_ATTRIBUTE: - return new UserAttributePacket(objStream); - case PUBLIC_SUBKEY: - return new PublicSubkeyPacket(objStream); - case SYM_ENC_INTEGRITY_PRO: - return new SymmetricEncIntegrityPacket(objStream); - case MOD_DETECTION_CODE: - return new ModDetectionCodePacket(objStream); - case EXPERIMENTAL_1: - case EXPERIMENTAL_2: - case EXPERIMENTAL_3: - case EXPERIMENTAL_4: - return new ExperimentalPacket(tag, objStream); - default: - throw new IOException("unknown packet type encountered: " + tag); - } - } - - public void close() - throws IOException - { - in.close(); - } - - /** - * a stream that overlays our input stream, allowing the user to only read a segment of it. - * - * NB: dataLength will be negative if the segment length is in the upper range above 2**31. - */ - private static class PartialInputStream - extends InputStream - { - private BCPGInputStream in; - private boolean partial; - private int dataLength; - - PartialInputStream( - BCPGInputStream in, - boolean partial, - int dataLength) - { - this.in = in; - this.partial = partial; - this.dataLength = dataLength; - } - - public int available() - throws IOException - { - int avail = in.available(); - - if (avail <= dataLength || dataLength < 0) - { - return avail; - } - else - { - if (partial && dataLength == 0) - { - return 1; - } - return dataLength; - } - } - - private int loadDataLength() - throws IOException - { - int l = in.read(); - - if (l < 0) - { - return -1; - } - - partial = false; - if (l < 192) - { - dataLength = l; - } - else if (l <= 223) - { - dataLength = ((l - 192) << 8) + (in.read()) + 192; - } - else if (l == 255) - { - dataLength = (in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - } - else - { - partial = true; - dataLength = 1 << (l & 0x1f); - } - - return dataLength; - } - - public int read(byte[] buf, int offset, int len) - throws IOException - { - do - { - if (dataLength != 0) - { - int readLen = (dataLength > len || dataLength < 0) ? len : dataLength; - readLen = in.read(buf, offset, readLen); - if (readLen < 0) - { - throw new EOFException("premature end of stream in PartialInputStream"); - } - dataLength -= readLen; - return readLen; - } - } - while (partial && loadDataLength() >= 0); - - return -1; - } - - public int read() - throws IOException - { - do - { - if (dataLength != 0) - { - int ch = in.read(); - if (ch < 0) - { - throw new EOFException("premature end of stream in PartialInputStream"); - } - dataLength--; - return ch; - } - } - while (partial && loadDataLength() >= 0); - - return -1; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGKey.java deleted file mode 100644 index 4f94739..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGKey.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bc.bcpg; - -/** - * base interface for a PGP key - */ -public interface BCPGKey -{ - /** - * Return the base format for this key - in the case of the symmetric keys it will generally - * be raw indicating that the key is just a straight byte representation, for an asymmetric - * key the format will be PGP, indicating the key is a string of MPIs encoded in PGP format. - * - * @return "RAW" or "PGP" - */ - public String getFormat(); - - /** - * return a string of bytes giving the encoded format of the key, as described by it's format. - * - * @return byte[] - */ - public byte[] getEncoded(); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGObject.java deleted file mode 100644 index 5f8c5c9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGObject.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bc.bcpg; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * base class for a PGP object. - */ -public abstract class BCPGObject -{ - public byte[] getEncoded() - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.writeObject(this); - - return bOut.toByteArray(); - } - - public abstract void encode(BCPGOutputStream out) - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGOutputStream.java deleted file mode 100644 index bb03036..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/BCPGOutputStream.java +++ /dev/null @@ -1,360 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * Basic output stream. - */ -public class BCPGOutputStream - extends OutputStream - implements PacketTags, CompressionAlgorithmTags -{ - OutputStream out; - private byte[] partialBuffer; - private int partialBufferLength; - private int partialPower; - private int partialOffset; - - private static final int BUF_SIZE_POWER = 16; // 2^16 size buffer on long files - - public BCPGOutputStream( - OutputStream out) - { - this.out = out; - } - - /** - * Create a stream representing an old style partial object. - * - * @param tag the packet tag for the object. - */ - public BCPGOutputStream( - OutputStream out, - int tag) - throws IOException - { - this.out = out; - this.writeHeader(tag, true, true, 0); - } - - /** - * Create a stream representing a general packet. - * - * @param out - * @param tag - * @param length - * @param oldFormat - * @throws IOException - */ - public BCPGOutputStream( - OutputStream out, - int tag, - long length, - boolean oldFormat) - throws IOException - { - this.out = out; - - if (length > 0xFFFFFFFFL) - { - this.writeHeader(tag, false, true, 0); - this.partialBufferLength = 1 << BUF_SIZE_POWER; - this.partialBuffer = new byte[partialBufferLength]; - this.partialPower = BUF_SIZE_POWER; - this.partialOffset = 0; - } - else - { - this.writeHeader(tag, oldFormat, false, length); - } - } - - /** - * - * @param tag - * @param length - * @throws IOException - */ - public BCPGOutputStream( - OutputStream out, - int tag, - long length) - throws IOException - { - this.out = out; - - this.writeHeader(tag, false, false, length); - } - - /** - * Create a new style partial input stream buffered into chunks. - * - * @param out output stream to write to. - * @param tag packet tag. - * @param buffer size of chunks making up the packet. - * @throws IOException - */ - public BCPGOutputStream( - OutputStream out, - int tag, - byte[] buffer) - throws IOException - { - this.out = out; - this.writeHeader(tag, false, true, 0); - - this.partialBuffer = buffer; - - int length = partialBuffer.length; - - for (partialPower = 0; length != 1; partialPower++) - { - length >>>= 1; - } - - if (partialPower > 30) - { - throw new IOException("Buffer cannot be greater than 2^30 in length."); - } - - this.partialBufferLength = 1 << partialPower; - this.partialOffset = 0; - } - - private void writeNewPacketLength( - long bodyLen) - throws IOException - { - if (bodyLen < 192) - { - out.write((byte)bodyLen); - } - else if (bodyLen <= 8383) - { - bodyLen -= 192; - - out.write((byte)(((bodyLen >> 8) & 0xff) + 192)); - out.write((byte)bodyLen); - } - else - { - out.write(0xff); - out.write((byte)(bodyLen >> 24)); - out.write((byte)(bodyLen >> 16)); - out.write((byte)(bodyLen >> 8)); - out.write((byte)bodyLen); - } - } - - private void writeHeader( - int tag, - boolean oldPackets, - boolean partial, - long bodyLen) - throws IOException - { - int hdr = 0x80; - - if (partialBuffer != null) - { - partialFlush(true); - partialBuffer = null; - } - - if (oldPackets) - { - hdr |= tag << 2; - - if (partial) - { - this.write(hdr | 0x03); - } - else - { - if (bodyLen <= 0xff) - { - this.write(hdr); - this.write((byte)bodyLen); - } - else if (bodyLen <= 0xffff) - { - this.write(hdr | 0x01); - this.write((byte)(bodyLen >> 8)); - this.write((byte)(bodyLen)); - } - else - { - this.write(hdr | 0x02); - this.write((byte)(bodyLen >> 24)); - this.write((byte)(bodyLen >> 16)); - this.write((byte)(bodyLen >> 8)); - this.write((byte)bodyLen); - } - } - } - else - { - hdr |= 0x40 | tag; - this.write(hdr); - - if (partial) - { - partialOffset = 0; - } - else - { - this.writeNewPacketLength(bodyLen); - } - } - } - - private void partialFlush( - boolean isLast) - throws IOException - { - if (isLast) - { - writeNewPacketLength(partialOffset); - out.write(partialBuffer, 0, partialOffset); - } - else - { - out.write(0xE0 | partialPower); - out.write(partialBuffer, 0, partialBufferLength); - } - - partialOffset = 0; - } - - private void writePartial( - byte b) - throws IOException - { - if (partialOffset == partialBufferLength) - { - partialFlush(false); - } - - partialBuffer[partialOffset++] = b; - } - - private void writePartial( - byte[] buf, - int off, - int len) - throws IOException - { - if (partialOffset == partialBufferLength) - { - partialFlush(false); - } - - if (len <= (partialBufferLength - partialOffset)) - { - System.arraycopy(buf, off, partialBuffer, partialOffset, len); - partialOffset += len; - } - else - { - System.arraycopy(buf, off, partialBuffer, partialOffset, partialBufferLength - partialOffset); - off += partialBufferLength - partialOffset; - len -= partialBufferLength - partialOffset; - partialFlush(false); - - while (len > partialBufferLength) - { - System.arraycopy(buf, off, partialBuffer, 0, partialBufferLength); - off += partialBufferLength; - len -= partialBufferLength; - partialFlush(false); - } - - System.arraycopy(buf, off, partialBuffer, 0, len); - partialOffset += len; - } - } - - public void write( - int b) - throws IOException - { - if (partialBuffer != null) - { - writePartial((byte)b); - } - else - { - out.write(b); - } - } - - public void write( - byte[] bytes, - int off, - int len) - throws IOException - { - if (partialBuffer != null) - { - writePartial(bytes, off, len); - } - else - { - out.write(bytes, off, len); - } - } - - public void writePacket( - ContainedPacket p) - throws IOException - { - p.encode(this); - } - - void writePacket( - int tag, - byte[] body, - boolean oldFormat) - throws IOException - { - this.writeHeader(tag, oldFormat, false, body.length); - this.write(body); - } - - public void writeObject( - BCPGObject o) - throws IOException - { - o.encode(this); - } - - /** - * Flush the underlying stream. - */ - public void flush() - throws IOException - { - out.flush(); - } - - /** - * Finish writing out the current packet without closing the underlying stream. - */ - public void finish() - throws IOException - { - if (partialBuffer != null) - { - partialFlush(true); - partialBuffer = null; - } - } - - public void close() - throws IOException - { - this.finish(); - out.flush(); - out.close(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CRC24.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CRC24.java deleted file mode 100644 index 20c2575..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CRC24.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.bc.bcpg; - -public class CRC24 -{ - private static final int CRC24_INIT = 0x0b704ce; - private static final int CRC24_POLY = 0x1864cfb; - - private int crc = CRC24_INIT; - - public CRC24() - { - } - - public void update( - int b) - { - crc ^= b << 16; - for (int i = 0; i < 8; i++) - { - crc <<= 1; - if ((crc & 0x1000000) != 0) - { - crc ^= CRC24_POLY; - } - } - } - - public int getValue() - { - return crc; - } - - public void reset() - { - crc = CRC24_INIT; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressedDataPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressedDataPacket.java deleted file mode 100644 index 882b585..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressedDataPacket.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * generic compressed data object. - */ -public class CompressedDataPacket - extends InputStreamPacket -{ - int algorithm; - - CompressedDataPacket( - BCPGInputStream in) - throws IOException - { - super(in); - - algorithm = in.read(); - } - - /** - * return the algorithm tag value. - * - * @return algorithm tag value. - */ - public int getAlgorithm() - { - return algorithm; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressionAlgorithmTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressionAlgorithmTags.java deleted file mode 100644 index 6e3c3bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/CompressionAlgorithmTags.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic tags for compression algorithms - */ -public interface CompressionAlgorithmTags -{ - public static final int UNCOMPRESSED = 0; // Uncompressed - public static final int ZIP = 1; // ZIP (RFC 1951) - public static final int ZLIB = 2; // ZLIB (RFC 1950) - public static final int BZIP2 = 3; // BZ2 -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ContainedPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ContainedPacket.java deleted file mode 100644 index 2224152..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ContainedPacket.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * Basic type for a PGP packet. - */ -public abstract class ContainedPacket - extends Packet -{ - public byte[] getEncoded() - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.writePacket(this); - - return bOut.toByteArray(); - } - - public abstract void encode( - BCPGOutputStream pOut) - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSAPublicBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSAPublicBCPGKey.java deleted file mode 100644 index d1836d5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSAPublicBCPGKey.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * base class for a DSA Public Key. - */ -public class DSAPublicBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger p; - MPInteger q; - MPInteger g; - MPInteger y; - - /** - * @param in the stream to read the packet from. - */ - public DSAPublicBCPGKey( - BCPGInputStream in) - throws IOException - { - this.p = new MPInteger(in); - this.q = new MPInteger(in); - this.g = new MPInteger(in); - this.y = new MPInteger(in); - } - - public DSAPublicBCPGKey( - BigInteger p, - BigInteger q, - BigInteger g, - BigInteger y) - { - this.p = new MPInteger(p); - this.q = new MPInteger(q); - this.g = new MPInteger(g); - this.y = new MPInteger(y); - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(p); - out.writeObject(q); - out.writeObject(g); - out.writeObject(y); - } - - /** - * @return g - */ - public BigInteger getG() - { - return g.getValue(); - } - - /** - * @return p - */ - public BigInteger getP() - { - return p.getValue(); - } - - /** - * @return q - */ - public BigInteger getQ() - { - return q.getValue(); - } - - /** - * @return g - */ - public BigInteger getY() - { - return y.getValue(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSASecretBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSASecretBCPGKey.java deleted file mode 100644 index ee6c0dc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/DSASecretBCPGKey.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * base class for a DSA Secret Key. - */ -public class DSASecretBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger x; - - /** - * - * @param in - * @throws IOException - */ - public DSASecretBCPGKey( - BCPGInputStream in) - throws IOException - { - this.x = new MPInteger(in); - } - - /** - * - * @param x - */ - public DSASecretBCPGKey( - BigInteger x) - { - this.x = new MPInteger(x); - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(x); - } - - /** - * @return x - */ - public BigInteger getX() - { - return x.getValue(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalPublicBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalPublicBCPGKey.java deleted file mode 100644 index 393d948..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalPublicBCPGKey.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * base class for an ElGamal Public Key. - */ -public class ElGamalPublicBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger p; - MPInteger g; - MPInteger y; - - /** - * - */ - public ElGamalPublicBCPGKey( - BCPGInputStream in) - throws IOException - { - this.p = new MPInteger(in); - this.g = new MPInteger(in); - this.y = new MPInteger(in); - } - - public ElGamalPublicBCPGKey( - BigInteger p, - BigInteger g, - BigInteger y) - { - this.p = new MPInteger(p); - this.g = new MPInteger(g); - this.y = new MPInteger(y); - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public BigInteger getP() - { - return p.getValue(); - } - - public BigInteger getG() - { - return g.getValue(); - } - - public BigInteger getY() - { - return y.getValue(); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(p); - out.writeObject(g); - out.writeObject(y); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalSecretBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalSecretBCPGKey.java deleted file mode 100644 index aaeca54..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ElGamalSecretBCPGKey.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * base class for an ElGamal Secret Key. - */ -public class ElGamalSecretBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger x; - - /** - * - * @param in - * @throws IOException - */ - public ElGamalSecretBCPGKey( - BCPGInputStream in) - throws IOException - { - this.x = new MPInteger(in); - } - - /** - * - * @param x - */ - public ElGamalSecretBCPGKey( - BigInteger x) - { - this.x = new MPInteger(x); - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - public BigInteger getX() - { - return x.getValue(); - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(x); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ExperimentalPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ExperimentalPacket.java deleted file mode 100644 index 6bdfb52..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ExperimentalPacket.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * basic packet for an experimental packet. - */ -public class ExperimentalPacket - extends ContainedPacket implements PublicKeyAlgorithmTags -{ - private int tag; - private byte[] contents; - - /** - * - * @param in - * @throws IOException - */ - ExperimentalPacket( - int tag, - BCPGInputStream in) - throws IOException - { - this.tag = tag; - - if (in.available() != 0) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(in.available()); - - int b; - while ((b = in.read()) >= 0) - { - bOut.write(b); - } - - contents = bOut.toByteArray(); - } - else - { - contents = new byte[0]; - } - } - - public int getTag() - { - return tag; - } - - public byte[] getContents() - { - byte[] tmp = new byte[contents.length]; - - System.arraycopy(contents, 0, tmp, 0, tmp.length); - - return tmp; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(tag, contents, true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/HashAlgorithmTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/HashAlgorithmTags.java deleted file mode 100644 index 916562d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/HashAlgorithmTags.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.bc.bcpg; - -/** - * basic tags for hash algorithms - */ -public interface HashAlgorithmTags -{ - public static final int MD5 = 1; // MD5 - public static final int SHA1 = 2; // SHA-1 - public static final int RIPEMD160 = 3; // RIPE-MD/160 - public static final int DOUBLE_SHA = 4; // Reserved for double-width SHA (experimental) - public static final int MD2 = 5; // MD2 - public static final int TIGER_192 = 6; // Reserved for TIGER/192 - public static final int HAVAL_5_160 = 7; // Reserved for HAVAL (5 pass, 160-bit) - - public static final int SHA256 = 8; // SHA-256 - public static final int SHA384 = 9; // SHA-384 - public static final int SHA512 = 10; // SHA-512 - public static final int SHA224 = 11; // SHA-224 -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/InputStreamPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/InputStreamPacket.java deleted file mode 100644 index 62058e4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/InputStreamPacket.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.bcpg; - -/** - * - */ -public class InputStreamPacket - extends Packet -{ - private BCPGInputStream in; - - public InputStreamPacket( - BCPGInputStream in) - { - this.in = in; - } - - /** - * Note: you can only read from this once... - * - * @return the InputStream - */ - public BCPGInputStream getInputStream() - { - return in; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/LiteralDataPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/LiteralDataPacket.java deleted file mode 100644 index b84f4a6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/LiteralDataPacket.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bc.bcpg; - -import java.io.IOException; - -import org.bc.util.Strings; - -/** - * generic literal data packet. - */ -public class LiteralDataPacket - extends InputStreamPacket -{ - int format; - byte[] fileName; - long modDate; - - LiteralDataPacket( - BCPGInputStream in) - throws IOException - { - super(in); - - format = in.read(); - int l = in.read(); - - fileName = new byte[l]; - for (int i = 0; i != fileName.length; i++) - { - fileName[i] = (byte)in.read(); - } - - modDate = ((long)in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - } - - /** - * return the format tag value. - * - * @return format tag value. - */ - public int getFormat() - { - return format; - } - - /** - * Return the modification time of the file in milli-seconds. - * - * @return the modification time in millis - */ - public long getModificationTime() - { - return modDate * 1000L; - } - - /** - * @return filename - */ - public String getFileName() - { - return Strings.fromUTF8ByteArray(fileName); - } - - public byte[] getRawFileName() - { - byte[] tmp = new byte[fileName.length]; - - for (int i = 0; i != tmp.length; i++) - { - tmp[i] = fileName[i]; - } - - return tmp; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MPInteger.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MPInteger.java deleted file mode 100644 index c17ee64..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MPInteger.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * a multiple precision integer - */ -public class MPInteger - extends BCPGObject -{ - BigInteger value = null; - - public MPInteger( - BCPGInputStream in) - throws IOException - { - int length = (in.read() << 8) | in.read(); - byte[] bytes = new byte[(length + 7) / 8]; - - in.readFully(bytes); - - value = new BigInteger(1, bytes); - } - - public MPInteger( - BigInteger value) - { - if (value == null || value.signum() < 0) - { - throw new IllegalArgumentException("value must not be null, or negative"); - } - - this.value = value; - } - - public BigInteger getValue() - { - return value; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - int length = value.bitLength(); - - out.write(length >> 8); - out.write(length); - - byte[] bytes = value.toByteArray(); - - if (bytes[0] == 0) - { - out.write(bytes, 1, bytes.length - 1); - } - else - { - out.write(bytes, 0, bytes.length); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MarkerPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MarkerPacket.java deleted file mode 100644 index 575367d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/MarkerPacket.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.bcpg; - -import java.io.IOException; - -/** - * Basic type for a marker packet - */ -public class MarkerPacket - extends ContainedPacket -{ - // "PGP" - - byte[] marker = { (byte)0x50, (byte)0x47, (byte)0x50 }; - - public MarkerPacket( - BCPGInputStream in) - throws IOException - { - in.readFully(marker); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(MARKER, marker, true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ModDetectionCodePacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ModDetectionCodePacket.java deleted file mode 100644 index 720494d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/ModDetectionCodePacket.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * basic packet for a modification detection code packet. - */ -public class ModDetectionCodePacket - extends ContainedPacket -{ - private byte[] digest; - - ModDetectionCodePacket( - BCPGInputStream in) - throws IOException - { - this.digest = new byte[20]; - in.readFully(this.digest); - } - - public ModDetectionCodePacket( - byte[] digest) - throws IOException - { - this.digest = new byte[digest.length]; - - System.arraycopy(digest, 0, this.digest, 0, this.digest.length); - } - - public byte[] getDigest() - { - byte[] tmp = new byte[digest.length]; - - System.arraycopy(digest, 0, tmp, 0, tmp.length); - - return tmp; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(MOD_DETECTION_CODE, digest, false); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OnePassSignaturePacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OnePassSignaturePacket.java deleted file mode 100644 index 6c59398..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OnePassSignaturePacket.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * generic signature object - */ -public class OnePassSignaturePacket - extends ContainedPacket -{ - private int version; - private int sigType; - private int hashAlgorithm; - private int keyAlgorithm; - private long keyID; - private int nested; - - OnePassSignaturePacket( - BCPGInputStream in) - throws IOException - { - version = in.read(); - sigType = in.read(); - hashAlgorithm = in.read(); - keyAlgorithm = in.read(); - - keyID |= (long)in.read() << 56; - keyID |= (long)in.read() << 48; - keyID |= (long)in.read() << 40; - keyID |= (long)in.read() << 32; - keyID |= (long)in.read() << 24; - keyID |= (long)in.read() << 16; - keyID |= (long)in.read() << 8; - keyID |= in.read(); - - nested = in.read(); - } - - public OnePassSignaturePacket( - int sigType, - int hashAlgorithm, - int keyAlgorithm, - long keyID, - boolean isNested) - { - this.version = 3; - this.sigType = sigType; - this.hashAlgorithm = hashAlgorithm; - this.keyAlgorithm = keyAlgorithm; - this.keyID = keyID; - this.nested = (isNested) ? 0 : 1; - } - - /** - * Return the signature type. - * @return the signature type - */ - public int getSignatureType() - { - return sigType; - } - - /** - * return the encryption algorithm tag - */ - public int getKeyAlgorithm() - { - return keyAlgorithm; - } - - /** - * return the hashAlgorithm tag - */ - public int getHashAlgorithm() - { - return hashAlgorithm; - } - - /** - * @return long - */ - public long getKeyID() - { - return keyID; - } - - /** - * - */ - public void encode( - BCPGOutputStream out) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(version); - pOut.write(sigType); - pOut.write(hashAlgorithm); - pOut.write(keyAlgorithm); - - pOut.write((byte)(keyID >> 56)); - pOut.write((byte)(keyID >> 48)); - pOut.write((byte)(keyID >> 40)); - pOut.write((byte)(keyID >> 32)); - pOut.write((byte)(keyID >> 24)); - pOut.write((byte)(keyID >> 16)); - pOut.write((byte)(keyID >> 8)); - pOut.write((byte)(keyID)); - - pOut.write(nested); - - out.writePacket(ONE_PASS_SIGNATURE, bOut.toByteArray(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OutputStreamPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OutputStreamPacket.java deleted file mode 100644 index 4d1a587..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/OutputStreamPacket.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.bcpg; - -import java.io.IOException; - -public abstract class OutputStreamPacket -{ - protected BCPGOutputStream out; - - public OutputStreamPacket( - BCPGOutputStream out) - { - this.out = out; - } - - public abstract BCPGOutputStream open() throws IOException; - - public abstract void close() throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/Packet.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/Packet.java deleted file mode 100644 index b4bde42..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/Packet.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.bcpg; - -/** - */ -public class Packet - implements PacketTags -{ - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PacketTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PacketTags.java deleted file mode 100644 index 88d6051..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PacketTags.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic PGP packet tag types. - */ -public interface PacketTags -{ - public static final int RESERVED = 0 ; // Reserved - a packet tag must not have this value - public static final int PUBLIC_KEY_ENC_SESSION = 1; // Public-Key Encrypted Session Key Packet - public static final int SIGNATURE = 2; // Signature Packet - public static final int SYMMETRIC_KEY_ENC_SESSION = 3; // Symmetric-Key Encrypted Session Key Packet - public static final int ONE_PASS_SIGNATURE = 4 ; // One-Pass Signature Packet - public static final int SECRET_KEY = 5; // Secret Key Packet - public static final int PUBLIC_KEY = 6 ; // Public Key Packet - public static final int SECRET_SUBKEY = 7; // Secret Subkey Packet - public static final int COMPRESSED_DATA = 8; // Compressed Data Packet - public static final int SYMMETRIC_KEY_ENC = 9; // Symmetrically Encrypted Data Packet - public static final int MARKER = 10; // Marker Packet - public static final int LITERAL_DATA = 11; // Literal Data Packet - public static final int TRUST = 12; // Trust Packet - public static final int USER_ID = 13; // User ID Packet - public static final int PUBLIC_SUBKEY = 14; // Public Subkey Packet - public static final int USER_ATTRIBUTE = 17; // User attribute - public static final int SYM_ENC_INTEGRITY_PRO = 18; // Symmetric encrypted, integrity protected - public static final int MOD_DETECTION_CODE = 19; // Modification detection code - - public static final int EXPERIMENTAL_1 = 60; // Private or Experimental Values - public static final int EXPERIMENTAL_2 = 61; - public static final int EXPERIMENTAL_3 = 62; - public static final int EXPERIMENTAL_4 = 63; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyAlgorithmTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyAlgorithmTags.java deleted file mode 100644 index 0fa0b2a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyAlgorithmTags.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.bcpg; - -/** - * Public Key Algorithm tag numbers - */ -public interface PublicKeyAlgorithmTags -{ - public static final int RSA_GENERAL = 1; // RSA (Encrypt or Sign) - public static final int RSA_ENCRYPT = 2; // RSA Encrypt-Only - public static final int RSA_SIGN = 3; // RSA Sign-Only - public static final int ELGAMAL_ENCRYPT = 16; // Elgamal (Encrypt-Only), see [ELGAMAL] - public static final int DSA = 17; // DSA (Digital Signature Standard) - public static final int EC = 18; // Reserved for Elliptic Curve - public static final int ECDSA = 19; // Reserved for ECDSA - public static final int ELGAMAL_GENERAL = 20; // Elgamal (Encrypt or Sign) - public static final int DIFFIE_HELLMAN = 21; // Reserved for Diffie-Hellman (X9.42, as defined for IETF-S/MIME) - - public static final int EXPERIMENTAL_1 = 100; - public static final int EXPERIMENTAL_2 = 101; - public static final int EXPERIMENTAL_3 = 102; - public static final int EXPERIMENTAL_4 = 103; - public static final int EXPERIMENTAL_5 = 104; - public static final int EXPERIMENTAL_6 = 105; - public static final int EXPERIMENTAL_7 = 106; - public static final int EXPERIMENTAL_8 = 107; - public static final int EXPERIMENTAL_9 = 108; - public static final int EXPERIMENTAL_10 = 109; - public static final int EXPERIMENTAL_11 = 110; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyEncSessionPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyEncSessionPacket.java deleted file mode 100644 index 214b66a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyEncSessionPacket.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * basic packet for a PGP public key - */ -public class PublicKeyEncSessionPacket - extends ContainedPacket implements PublicKeyAlgorithmTags -{ - private int version; - private long keyID; - private int algorithm; - private BigInteger[] data; - - PublicKeyEncSessionPacket( - BCPGInputStream in) - throws IOException - { - version = in.read(); - - keyID |= (long)in.read() << 56; - keyID |= (long)in.read() << 48; - keyID |= (long)in.read() << 40; - keyID |= (long)in.read() << 32; - keyID |= (long)in.read() << 24; - keyID |= (long)in.read() << 16; - keyID |= (long)in.read() << 8; - keyID |= in.read(); - - algorithm = in.read(); - - switch (algorithm) - { - case RSA_ENCRYPT: - case RSA_GENERAL: - data = new BigInteger[1]; - - data[0] = new MPInteger(in).getValue(); - break; - case ELGAMAL_ENCRYPT: - case ELGAMAL_GENERAL: - data = new BigInteger[2]; - - data[0] = new MPInteger(in).getValue(); - data[1] = new MPInteger(in).getValue(); - break; - default: - throw new IOException("unknown PGP public key algorithm encountered"); - } - } - - public PublicKeyEncSessionPacket( - long keyID, - int algorithm, - BigInteger[] data) - { - this.version = 3; - this.keyID = keyID; - this.algorithm = algorithm; - this.data = data; - } - - public int getVersion() - { - return version; - } - - public long getKeyID() - { - return keyID; - } - - public int getAlgorithm() - { - return algorithm; - } - - public BigInteger[] getEncSessionKey() - { - return data; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(version); - - pOut.write((byte)(keyID >> 56)); - pOut.write((byte)(keyID >> 48)); - pOut.write((byte)(keyID >> 40)); - pOut.write((byte)(keyID >> 32)); - pOut.write((byte)(keyID >> 24)); - pOut.write((byte)(keyID >> 16)); - pOut.write((byte)(keyID >> 8)); - pOut.write((byte)(keyID)); - - pOut.write(algorithm); - - for (int i = 0; i != data.length; i++) - { - pOut.writeObject(new MPInteger(data[i])); - } - - out.writePacket(PUBLIC_KEY_ENC_SESSION , bOut.toByteArray(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyPacket.java deleted file mode 100644 index 83e8246..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicKeyPacket.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.util.Date; - -/** - * basic packet for a PGP public key - */ -public class PublicKeyPacket - extends ContainedPacket implements PublicKeyAlgorithmTags -{ - private int version; - private long time; - private int validDays; - private int algorithm; - private BCPGKey key; - - PublicKeyPacket( - BCPGInputStream in) - throws IOException - { - version = in.read(); - time = ((long)in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - - if (version <= 3) - { - validDays = (in.read() << 8) | in.read(); - } - - algorithm = (byte)in.read(); - - switch (algorithm) - { - case RSA_ENCRYPT: - case RSA_GENERAL: - case RSA_SIGN: - key = new RSAPublicBCPGKey(in); - break; - case DSA: - key = new DSAPublicBCPGKey(in); - break; - case ELGAMAL_ENCRYPT: - case ELGAMAL_GENERAL: - key = new ElGamalPublicBCPGKey(in); - break; - default: - throw new IOException("unknown PGP public key algorithm encountered"); - } - } - - /** - * Construct version 4 public key packet. - * - * @param algorithm - * @param time - * @param key - */ - public PublicKeyPacket( - int algorithm, - Date time, - BCPGKey key) - { - this.version = 4; - this.time = time.getTime() / 1000; - this.algorithm = algorithm; - this.key = key; - } - - public int getVersion() - { - return version; - } - - public int getAlgorithm() - { - return algorithm; - } - - public int getValidDays() - { - return validDays; - } - - public Date getTime() - { - return new Date(time * 1000); - } - - public BCPGKey getKey() - { - return key; - } - - public byte[] getEncodedContents() - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(version); - - pOut.write((byte)(time >> 24)); - pOut.write((byte)(time >> 16)); - pOut.write((byte)(time >> 8)); - pOut.write((byte)time); - - if (version <= 3) - { - pOut.write((byte)(validDays >> 8)); - pOut.write((byte)validDays); - } - - pOut.write(algorithm); - - pOut.writeObject((BCPGObject)key); - - return bOut.toByteArray(); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(PUBLIC_KEY, getEncodedContents(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicSubkeyPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicSubkeyPacket.java deleted file mode 100644 index bbab9ec..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/PublicSubkeyPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.util.Date; - -/** - * basic packet for a PGP public key - */ -public class PublicSubkeyPacket - extends PublicKeyPacket -{ - PublicSubkeyPacket( - BCPGInputStream in) - throws IOException - { - super(in); - } - - /** - * Construct version 4 public key packet. - * - * @param algorithm - * @param time - * @param key - */ - public PublicSubkeyPacket( - int algorithm, - Date time, - BCPGKey key) - { - super(algorithm, time, key); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(PUBLIC_SUBKEY, getEncodedContents(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSAPublicBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSAPublicBCPGKey.java deleted file mode 100644 index 435e472..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSAPublicBCPGKey.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.bcpg; - -import java.math.BigInteger; -import java.io.*; - -/** - * base class for an RSA Public Key. - */ -public class RSAPublicBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger n; - MPInteger e; - - /** - * Construct an RSA public key from the passed in stream. - * - * @param in - * @throws IOException - */ - public RSAPublicBCPGKey( - BCPGInputStream in) - throws IOException - { - this.n = new MPInteger(in); - this.e = new MPInteger(in); - } - - /** - * - * @param n the modulus - * @param e the public exponent - */ - public RSAPublicBCPGKey( - BigInteger n, - BigInteger e) - { - this.n = new MPInteger(n); - this.e = new MPInteger(e); - } - - public BigInteger getPublicExponent() - { - return e.getValue(); - } - - public BigInteger getModulus() - { - return n.getValue(); - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(n); - out.writeObject(e); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSASecretBCPGKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSASecretBCPGKey.java deleted file mode 100644 index ef7204b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/RSASecretBCPGKey.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; -import java.math.BigInteger; - -/** - * base class for an RSA Secret (or Private) Key. - */ -public class RSASecretBCPGKey - extends BCPGObject implements BCPGKey -{ - MPInteger d; - MPInteger p; - MPInteger q; - MPInteger u; - - BigInteger expP, expQ, crt; - - /** - * - * @param in - * @throws IOException - */ - public RSASecretBCPGKey( - BCPGInputStream in) - throws IOException - { - this.d = new MPInteger(in); - this.p = new MPInteger(in); - this.q = new MPInteger(in); - this.u = new MPInteger(in); - - expP = d.getValue().remainder(p.getValue().subtract(BigInteger.valueOf(1))); - expQ = d.getValue().remainder(q.getValue().subtract(BigInteger.valueOf(1))); - crt = q.getValue().modInverse(p.getValue()); - } - - /** - * - * @param d - * @param p - * @param q - */ - public RSASecretBCPGKey( - BigInteger d, - BigInteger p, - BigInteger q) - { - // - // pgp requires (p < q) - // - int cmp = p.compareTo(q); - if (cmp >= 0) - { - if (cmp == 0) - { - throw new IllegalArgumentException("p and q cannot be equal"); - } - - BigInteger tmp = p; - p = q; - q = tmp; - } - - this.d = new MPInteger(d); - this.p = new MPInteger(p); - this.q = new MPInteger(q); - this.u = new MPInteger(p.modInverse(q)); - - expP = d.remainder(p.subtract(BigInteger.valueOf(1))); - expQ = d.remainder(q.subtract(BigInteger.valueOf(1))); - crt = q.modInverse(p); - } - - /** - * return the modulus for this key. - * - * @return BigInteger - */ - public BigInteger getModulus() - { - return p.getValue().multiply(q.getValue()); - } - - /** - * return the private exponent for this key. - * - * @return BigInteger - */ - public BigInteger getPrivateExponent() - { - return d.getValue(); - } - - /** - * return the prime P - */ - public BigInteger getPrimeP() - { - return p.getValue(); - } - - /** - * return the prime Q - */ - public BigInteger getPrimeQ() - { - return q.getValue(); - } - - /** - * return the prime exponent of p - */ - public BigInteger getPrimeExponentP() - { - return expP; - } - - /** - * return the prime exponent of q - */ - public BigInteger getPrimeExponentQ() - { - return expQ; - } - - /** - * return the crt coefficient - */ - public BigInteger getCrtCoefficient() - { - return crt; - } - - /** - * return "PGP" - * - * @see org.bc.bcpg.BCPGKey#getFormat() - */ - public String getFormat() - { - return "PGP"; - } - - /** - * return the standard PGP encoding of the key. - * - * @see org.bc.bcpg.BCPGKey#getEncoded() - */ - public byte[] getEncoded() - { - try - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pgpOut = new BCPGOutputStream(bOut); - - pgpOut.writeObject(this); - - return bOut.toByteArray(); - } - catch (IOException e) - { - return null; - } - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writeObject(d); - out.writeObject(p); - out.writeObject(q); - out.writeObject(u); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/S2K.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/S2K.java deleted file mode 100644 index bae88bc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/S2K.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * The string to key specifier class - */ -public class S2K - extends BCPGObject -{ - private static final int EXPBIAS = 6; - - public static final int SIMPLE = 0; - public static final int SALTED = 1; - public static final int SALTED_AND_ITERATED = 3; - public static final int GNU_DUMMY_S2K = 101; - - int type; - int algorithm; - byte[] iv; - int itCount = -1; - int protectionMode = -1; - - S2K( - InputStream in) - throws IOException - { - DataInputStream dIn = new DataInputStream(in); - - type = dIn.read(); - algorithm = dIn.read(); - - // - // if this happens we have a dummy-S2K packet. - // - if (type != GNU_DUMMY_S2K) - { - if (type != 0) - { - iv = new byte[8]; - dIn.readFully(iv, 0, iv.length); - - if (type == 3) - { - itCount = dIn.read(); - } - } - } - else - { - dIn.read(); // G - dIn.read(); // N - dIn.read(); // U - protectionMode = dIn.read(); // protection mode - } - } - - public S2K( - int algorithm) - { - this.type = 0; - this.algorithm = algorithm; - } - - public S2K( - int algorithm, - byte[] iv) - { - this.type = 1; - this.algorithm = algorithm; - this.iv = iv; - } - - public S2K( - int algorithm, - byte[] iv, - int itCount) - { - this.type = 3; - this.algorithm = algorithm; - this.iv = iv; - this.itCount = itCount; - } - - public int getType() - { - return type; - } - - /** - * return the hash algorithm for this S2K - */ - public int getHashAlgorithm() - { - return algorithm; - } - - /** - * return the iv for the key generation algorithm - */ - public byte[] getIV() - { - return iv; - } - - /** - * return the iteration count - */ - public long getIterationCount() - { - return (16 + (itCount & 15)) << ((itCount >> 4) + EXPBIAS); - } - - /** - * the protection mode - only if GNU_DUMMY_S2K - */ - public int getProtectionMode() - { - return protectionMode; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.write(type); - out.write(algorithm); - - if (type != GNU_DUMMY_S2K) - { - if (type != 0) - { - out.write(iv); - } - - if (type == 3) - { - out.write(itCount); - } - } - else - { - out.write('G'); - out.write('N'); - out.write('U'); - out.write(protectionMode); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretKeyPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretKeyPacket.java deleted file mode 100644 index 31b8fb5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretKeyPacket.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * basic packet for a PGP secret key - */ -public class SecretKeyPacket - extends ContainedPacket implements PublicKeyAlgorithmTags -{ - public static final int USAGE_NONE = 0x00; - public static final int USAGE_CHECKSUM = 0xff; - public static final int USAGE_SHA1 = 0xfe; - - private PublicKeyPacket pubKeyPacket; - private byte[] secKeyData; - private int s2kUsage; - private int encAlgorithm; - private S2K s2k; - private byte[] iv; - - /** - * - * @param in - * @throws IOException - */ - SecretKeyPacket( - BCPGInputStream in) - throws IOException - { - if (this instanceof SecretSubkeyPacket) - { - pubKeyPacket = new PublicSubkeyPacket(in); - } - else - { - pubKeyPacket = new PublicKeyPacket(in); - } - - s2kUsage = in.read(); - - if (s2kUsage == USAGE_CHECKSUM || s2kUsage == USAGE_SHA1) - { - encAlgorithm = in.read(); - s2k = new S2K(in); - } - else - { - encAlgorithm = s2kUsage; - } - - if (!(s2k != null && s2k.getType() == S2K.GNU_DUMMY_S2K && s2k.getProtectionMode() == 0x01)) - { - if (s2kUsage != 0) - { - if (encAlgorithm < 7) - { - iv = new byte[8]; - } - else - { - iv = new byte[16]; - } - in.readFully(iv, 0, iv.length); - } - } - - if (in.available() != 0) - { - secKeyData = new byte[in.available()]; - - in.readFully(secKeyData); - } - } - - /** - * - * @param pubKeyPacket - * @param encAlgorithm - * @param s2k - * @param iv - * @param secKeyData - */ - public SecretKeyPacket( - PublicKeyPacket pubKeyPacket, - int encAlgorithm, - S2K s2k, - byte[] iv, - byte[] secKeyData) - { - this.pubKeyPacket = pubKeyPacket; - this.encAlgorithm = encAlgorithm; - - if (encAlgorithm != SymmetricKeyAlgorithmTags.NULL) - { - this.s2kUsage = USAGE_CHECKSUM; - } - else - { - this.s2kUsage = USAGE_NONE; - } - - this.s2k = s2k; - this.iv = iv; - this.secKeyData = secKeyData; - } - - public SecretKeyPacket( - PublicKeyPacket pubKeyPacket, - int encAlgorithm, - int s2kUsage, - S2K s2k, - byte[] iv, - byte[] secKeyData) - { - this.pubKeyPacket = pubKeyPacket; - this.encAlgorithm = encAlgorithm; - this.s2kUsage = s2kUsage; - this.s2k = s2k; - this.iv = iv; - this.secKeyData = secKeyData; - } - - public int getEncAlgorithm() - { - return encAlgorithm; - } - - public int getS2KUsage() - { - return s2kUsage; - } - - public byte[] getIV() - { - return iv; - } - - public S2K getS2K() - { - return s2k; - } - - public PublicKeyPacket getPublicKeyPacket() - { - return pubKeyPacket; - } - - public byte[] getSecretKeyData() - { - return secKeyData; - } - - public byte[] getEncodedContents() - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(pubKeyPacket.getEncodedContents()); - - pOut.write(s2kUsage); - - if (s2kUsage == USAGE_CHECKSUM || s2kUsage == USAGE_SHA1) - { - pOut.write(encAlgorithm); - pOut.writeObject(s2k); - } - - if (iv != null) - { - pOut.write(iv); - } - - if (secKeyData != null && secKeyData.length > 0) - { - pOut.write(secKeyData); - } - - return bOut.toByteArray(); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(SECRET_KEY, getEncodedContents(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretSubkeyPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretSubkeyPacket.java deleted file mode 100644 index 12308b8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SecretSubkeyPacket.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * basic packet for a PGP secret key - */ -public class SecretSubkeyPacket - extends SecretKeyPacket -{ - /** - * - * @param in - * @throws IOException - */ - SecretSubkeyPacket( - BCPGInputStream in) - throws IOException - { - super(in); - } - - /** - * - * @param pubKeyPacket - * @param encAlgorithm - * @param s2k - * @param iv - * @param secKeyData - */ - public SecretSubkeyPacket( - PublicKeyPacket pubKeyPacket, - int encAlgorithm, - S2K s2k, - byte[] iv, - byte[] secKeyData) - { - super(pubKeyPacket, encAlgorithm, s2k, iv, secKeyData); - } - - public SecretSubkeyPacket( - PublicKeyPacket pubKeyPacket, - int encAlgorithm, - int s2kUsage, - S2K s2k, - byte[] iv, - byte[] secKeyData) - { - super(pubKeyPacket, encAlgorithm, s2kUsage, s2k, iv, secKeyData); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(SECRET_SUBKEY, getEncodedContents(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignaturePacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignaturePacket.java deleted file mode 100644 index c2c2ee0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignaturePacket.java +++ /dev/null @@ -1,515 +0,0 @@ -package org.bc.bcpg; - -import org.bc.bcpg.sig.IssuerKeyID; -import org.bc.bcpg.sig.SignatureCreationTime; -import org.bc.util.Arrays; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Vector; - -/** - * generic signature packet - */ -public class SignaturePacket - extends ContainedPacket implements PublicKeyAlgorithmTags -{ - private int version; - private int signatureType; - private long creationTime; - private long keyID; - private int keyAlgorithm; - private int hashAlgorithm; - private MPInteger[] signature; - private byte[] fingerPrint; - private SignatureSubpacket[] hashedData; - private SignatureSubpacket[] unhashedData; - private byte[] signatureEncoding; - - SignaturePacket( - BCPGInputStream in) - throws IOException - { - version = in.read(); - - if (version == 3 || version == 2) - { - int l = in.read(); - - signatureType = in.read(); - creationTime = (((long)in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read()) * 1000; - keyID |= (long)in.read() << 56; - keyID |= (long)in.read() << 48; - keyID |= (long)in.read() << 40; - keyID |= (long)in.read() << 32; - keyID |= (long)in.read() << 24; - keyID |= (long)in.read() << 16; - keyID |= (long)in.read() << 8; - keyID |= in.read(); - keyAlgorithm = in.read(); - hashAlgorithm = in.read(); - } - else if (version == 4) - { - signatureType = in.read(); - keyAlgorithm = in.read(); - hashAlgorithm = in.read(); - - int hashedLength = (in.read() << 8) | in.read(); - byte[] hashed = new byte[hashedLength]; - - in.readFully(hashed); - - // - // read the signature sub packet data. - // - SignatureSubpacket sub; - SignatureSubpacketInputStream sIn = new SignatureSubpacketInputStream( - new ByteArrayInputStream(hashed)); - - Vector v = new Vector(); - while ((sub = sIn.readPacket()) != null) - { - v.addElement(sub); - } - - hashedData = new SignatureSubpacket[v.size()]; - - for (int i = 0; i != hashedData.length; i++) - { - SignatureSubpacket p = (SignatureSubpacket)v.elementAt(i); - if (p instanceof IssuerKeyID) - { - keyID = ((IssuerKeyID)p).getKeyID(); - } - else if (p instanceof SignatureCreationTime) - { - creationTime = ((SignatureCreationTime)p).getTime().getTime(); - } - - hashedData[i] = p; - } - - int unhashedLength = (in.read() << 8) | in.read(); - byte[] unhashed = new byte[unhashedLength]; - - in.readFully(unhashed); - - sIn = new SignatureSubpacketInputStream( - new ByteArrayInputStream(unhashed)); - - v.removeAllElements(); - while ((sub = sIn.readPacket()) != null) - { - v.addElement(sub); - } - - unhashedData = new SignatureSubpacket[v.size()]; - - for (int i = 0; i != unhashedData.length; i++) - { - SignatureSubpacket p = (SignatureSubpacket)v.elementAt(i); - if (p instanceof IssuerKeyID) - { - keyID = ((IssuerKeyID)p).getKeyID(); - } - - unhashedData[i] = p; - } - } - else - { - throw new RuntimeException("unsupported version: " + version); - } - - fingerPrint = new byte[2]; - in.readFully(fingerPrint); - - switch (keyAlgorithm) - { - case RSA_GENERAL: - case RSA_SIGN: - MPInteger v = new MPInteger(in); - - signature = new MPInteger[1]; - signature[0] = v; - break; - case DSA: - MPInteger r = new MPInteger(in); - MPInteger s = new MPInteger(in); - - signature = new MPInteger[2]; - signature[0] = r; - signature[1] = s; - break; - case ELGAMAL_ENCRYPT: // yep, this really does happen sometimes. - case ELGAMAL_GENERAL: - MPInteger p = new MPInteger(in); - MPInteger g = new MPInteger(in); - MPInteger y = new MPInteger(in); - - signature = new MPInteger[3]; - signature[0] = p; - signature[1] = g; - signature[2] = y; - break; - default: - if (keyAlgorithm >= PublicKeyAlgorithmTags.EXPERIMENTAL_1 && keyAlgorithm <= PublicKeyAlgorithmTags.EXPERIMENTAL_11) - { - signature = null; - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - int ch; - while ((ch = in.read()) >= 0) - { - bOut.write(ch); - } - signatureEncoding = bOut.toByteArray(); - } - else - { - throw new IOException("unknown signature key algorithm: " + keyAlgorithm); - } - } - } - - /** - * Generate a version 4 signature packet. - * - * @param signatureType - * @param keyAlgorithm - * @param hashAlgorithm - * @param hashedData - * @param unhashedData - * @param fingerPrint - * @param signature - */ - public SignaturePacket( - int signatureType, - long keyID, - int keyAlgorithm, - int hashAlgorithm, - SignatureSubpacket[] hashedData, - SignatureSubpacket[] unhashedData, - byte[] fingerPrint, - MPInteger[] signature) - { - this(4, signatureType, keyID, keyAlgorithm, hashAlgorithm, hashedData, unhashedData, fingerPrint, signature); - } - - /** - * Generate a version 2/3 signature packet. - * - * @param signatureType - * @param keyAlgorithm - * @param hashAlgorithm - * @param fingerPrint - * @param signature - */ - public SignaturePacket( - int version, - int signatureType, - long keyID, - int keyAlgorithm, - int hashAlgorithm, - long creationTime, - byte[] fingerPrint, - MPInteger[] signature) - { - this(version, signatureType, keyID, keyAlgorithm, hashAlgorithm, null, null, fingerPrint, signature); - - this.creationTime = creationTime; - } - - public SignaturePacket( - int version, - int signatureType, - long keyID, - int keyAlgorithm, - int hashAlgorithm, - SignatureSubpacket[] hashedData, - SignatureSubpacket[] unhashedData, - byte[] fingerPrint, - MPInteger[] signature) - { - this.version = version; - this.signatureType = signatureType; - this.keyID = keyID; - this.keyAlgorithm = keyAlgorithm; - this.hashAlgorithm = hashAlgorithm; - this.hashedData = hashedData; - this.unhashedData = unhashedData; - this.fingerPrint = fingerPrint; - this.signature = signature; - - if (hashedData != null) - { - setCreationTime(); - } - } - - /** - * get the version number - */ - public int getVersion() - { - return version; - } - - /** - * return the signature type. - */ - public int getSignatureType() - { - return signatureType; - } - - /** - * return the keyID - * @return the keyID that created the signature. - */ - public long getKeyID() - { - return keyID; - } - - /** - * return the signature trailer that must be included with the data - * to reconstruct the signature - * - * @return byte[] - */ - public byte[] getSignatureTrailer() - { - byte[] trailer = null; - - if (version == 3 || version == 2) - { - trailer = new byte[5]; - - long time = creationTime / 1000; - - trailer[0] = (byte)signatureType; - trailer[1] = (byte)(time >> 24); - trailer[2] = (byte)(time >> 16); - trailer[3] = (byte)(time >> 8); - trailer[4] = (byte)(time); - } - else - { - ByteArrayOutputStream sOut = new ByteArrayOutputStream(); - - try - { - sOut.write((byte)this.getVersion()); - sOut.write((byte)this.getSignatureType()); - sOut.write((byte)this.getKeyAlgorithm()); - sOut.write((byte)this.getHashAlgorithm()); - - ByteArrayOutputStream hOut = new ByteArrayOutputStream(); - SignatureSubpacket[] hashed = this.getHashedSubPackets(); - - for (int i = 0; i != hashed.length; i++) - { - hashed[i].encode(hOut); - } - - byte[] data = hOut.toByteArray(); - - sOut.write((byte)(data.length >> 8)); - sOut.write((byte)data.length); - sOut.write(data); - - byte[] hData = sOut.toByteArray(); - - sOut.write((byte)this.getVersion()); - sOut.write((byte)0xff); - sOut.write((byte)(hData.length>> 24)); - sOut.write((byte)(hData.length >> 16)); - sOut.write((byte)(hData.length >> 8)); - sOut.write((byte)(hData.length)); - } - catch (IOException e) - { - throw new RuntimeException("exception generating trailer: " + e); - } - - trailer = sOut.toByteArray(); - } - - return trailer; - } - - /** - * return the encryption algorithm tag - */ - public int getKeyAlgorithm() - { - return keyAlgorithm; - } - - /** - * return the hashAlgorithm tag - */ - public int getHashAlgorithm() - { - return hashAlgorithm; - } - - /** - * return the signature as a set of integers - note this is normalised to be the - * ASN.1 encoding of what appears in the signature packet. - */ - public MPInteger[] getSignature() - { - return signature; - } - - /** - * Return the byte encoding of the signature section. - * @return uninterpreted signature bytes. - */ - public byte[] getSignatureBytes() - { - if (signatureEncoding == null) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream bcOut = new BCPGOutputStream(bOut); - - for (int i = 0; i != signature.length; i++) - { - try - { - bcOut.writeObject(signature[i]); - } - catch (IOException e) - { - throw new RuntimeException("internal error: " + e); - } - } - return bOut.toByteArray(); - } - else - { - return Arrays.clone(signatureEncoding); - } - } - public SignatureSubpacket[] getHashedSubPackets() - { - return hashedData; - } - - public SignatureSubpacket[] getUnhashedSubPackets() - { - return unhashedData; - } - - /** - * Return the creation time of the signature in milli-seconds. - * - * @return the creation time in millis - */ - public long getCreationTime() - { - return creationTime; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(version); - - if (version == 3 || version == 2) - { - pOut.write(5); // the length of the next block - - long time = creationTime / 1000; - - pOut.write(signatureType); - pOut.write((byte)(time >> 24)); - pOut.write((byte)(time >> 16)); - pOut.write((byte)(time >> 8)); - pOut.write((byte)time); - - pOut.write((byte)(keyID >> 56)); - pOut.write((byte)(keyID >> 48)); - pOut.write((byte)(keyID >> 40)); - pOut.write((byte)(keyID >> 32)); - pOut.write((byte)(keyID >> 24)); - pOut.write((byte)(keyID >> 16)); - pOut.write((byte)(keyID >> 8)); - pOut.write((byte)(keyID)); - - pOut.write(keyAlgorithm); - pOut.write(hashAlgorithm); - } - else if (version == 4) - { - pOut.write(signatureType); - pOut.write(keyAlgorithm); - pOut.write(hashAlgorithm); - - ByteArrayOutputStream sOut = new ByteArrayOutputStream(); - - for (int i = 0; i != hashedData.length; i++) - { - hashedData[i].encode(sOut); - } - - byte[] data = sOut.toByteArray(); - - pOut.write(data.length >> 8); - pOut.write(data.length); - pOut.write(data); - - sOut.reset(); - - for (int i = 0; i != unhashedData.length; i++) - { - unhashedData[i].encode(sOut); - } - - data = sOut.toByteArray(); - - pOut.write(data.length >> 8); - pOut.write(data.length); - pOut.write(data); - } - else - { - throw new IOException("unknown version: " + version); - } - - pOut.write(fingerPrint); - - if (signature != null) - { - for (int i = 0; i != signature.length; i++) - { - pOut.writeObject(signature[i]); - } - } - else - { - pOut.write(signatureEncoding); - } - - out.writePacket(SIGNATURE, bOut.toByteArray(), true); - } - - private void setCreationTime() - { - for (int i = 0; i != hashedData.length; i++) - { - if (hashedData[i] instanceof SignatureCreationTime) - { - creationTime = ((SignatureCreationTime)hashedData[i]).getTime().getTime(); - break; - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacket.java deleted file mode 100644 index 1118943..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacket.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - * Basic type for a PGP Signature sub-packet. - */ -public class SignatureSubpacket -{ - int type; - boolean critical; - - protected byte[] data; - - protected SignatureSubpacket( - int type, - boolean critical, - byte[] data) - { - this.type = type; - this.critical = critical; - this.data = data; - } - - public int getType() - { - return type; - } - - public boolean isCritical() - { - return critical; - } - - /** - * return the generic data making up the packet. - */ - public byte[] getData() - { - return data; - } - - public void encode( - OutputStream out) - throws IOException - { - int bodyLen = data.length + 1; - - if (bodyLen < 192) - { - out.write((byte)bodyLen); - } - else if (bodyLen <= 8383) - { - bodyLen -= 192; - - out.write((byte)(((bodyLen >> 8) & 0xff) + 192)); - out.write((byte)bodyLen); - } - else - { - out.write(0xff); - out.write((byte)(bodyLen >> 24)); - out.write((byte)(bodyLen >> 16)); - out.write((byte)(bodyLen >> 8)); - out.write((byte)bodyLen); - } - - if (critical) - { - out.write(0x80 | type); - } - else - { - out.write(type); - } - - out.write(data); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketInputStream.java deleted file mode 100644 index cb13144..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketInputStream.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.bcpg; - -import org.bc.bcpg.sig.Exportable; -import org.bc.bcpg.sig.IssuerKeyID; -import org.bc.bcpg.sig.KeyExpirationTime; -import org.bc.bcpg.sig.KeyFlags; -import org.bc.bcpg.sig.NotationData; -import org.bc.bcpg.sig.PreferredAlgorithms; -import org.bc.bcpg.sig.PrimaryUserID; -import org.bc.bcpg.sig.Revocable; -import org.bc.bcpg.sig.SignatureCreationTime; -import org.bc.bcpg.sig.SignatureExpirationTime; -import org.bc.bcpg.sig.SignerUserID; -import org.bc.bcpg.sig.TrustSignature; -import org.bc.util.io.Streams; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -/** - * reader for signature sub-packets - */ -public class SignatureSubpacketInputStream - extends InputStream implements SignatureSubpacketTags -{ - InputStream in; - - public SignatureSubpacketInputStream( - InputStream in) - { - this.in = in; - } - - public int available() - throws IOException - { - return in.available(); - } - - public int read() - throws IOException - { - return in.read(); - } - - public SignatureSubpacket readPacket() - throws IOException - { - int l = this.read(); - int bodyLen = 0; - - if (l < 0) - { - return null; - } - - if (l < 192) - { - bodyLen = l; - } - else if (l <= 223) - { - bodyLen = ((l - 192) << 8) + (in.read()) + 192; - } - else if (l == 255) - { - bodyLen = (in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - } - else - { - // TODO Error? - } - - int tag = in.read(); - - if (tag < 0) - { - throw new EOFException("unexpected EOF reading signature sub packet"); - } - - byte[] data = new byte[bodyLen - 1]; - if (Streams.readFully(in, data) < data.length) - { - throw new EOFException(); - } - - boolean isCritical = ((tag & 0x80) != 0); - int type = tag & 0x7f; - - switch (type) - { - case CREATION_TIME: - return new SignatureCreationTime(isCritical, data); - case KEY_EXPIRE_TIME: - return new KeyExpirationTime(isCritical, data); - case EXPIRE_TIME: - return new SignatureExpirationTime(isCritical, data); - case REVOCABLE: - return new Revocable(isCritical, data); - case EXPORTABLE: - return new Exportable(isCritical, data); - case ISSUER_KEY_ID: - return new IssuerKeyID(isCritical, data); - case TRUST_SIG: - return new TrustSignature(isCritical, data); - case PREFERRED_COMP_ALGS: - case PREFERRED_HASH_ALGS: - case PREFERRED_SYM_ALGS: - return new PreferredAlgorithms(type, isCritical, data); - case KEY_FLAGS: - return new KeyFlags(isCritical, data); - case PRIMARY_USER_ID: - return new PrimaryUserID(isCritical, data); - case SIGNER_USER_ID: - return new SignerUserID(isCritical, data); - case NOTATION_DATA: - return new NotationData(isCritical, data); - } - - return new SignatureSubpacket(type, isCritical, data); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketTags.java deleted file mode 100644 index 2c10fb3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SignatureSubpacketTags.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic PGP signature sub-packet tag types. - */ -public interface SignatureSubpacketTags -{ - public static final int CREATION_TIME = 2; // signature creation time - public static final int EXPIRE_TIME = 3; // signature expiration time - public static final int EXPORTABLE = 4; // exportable certification - public static final int TRUST_SIG = 5; // trust signature - public static final int REG_EXP = 6; // regular expression - public static final int REVOCABLE = 7; // revocable - public static final int KEY_EXPIRE_TIME = 9; // key expiration time - public static final int PLACEHOLDER = 10; // placeholder for backward compatibility - public static final int PREFERRED_SYM_ALGS = 11; // preferred symmetric algorithms - public static final int REVOCATION_KEY = 12; // revocation key - public static final int ISSUER_KEY_ID = 16; // issuer key ID - public static final int NOTATION_DATA = 20; // notation data - public static final int PREFERRED_HASH_ALGS = 21; // preferred hash algorithms - public static final int PREFERRED_COMP_ALGS = 22; // preferred compression algorithms - public static final int KEY_SERVER_PREFS = 23; // key server preferences - public static final int PREFERRED_KEY_SERV = 24; // preferred key server - public static final int PRIMARY_USER_ID = 25; // primary user id - public static final int POLICY_URL = 26; // policy URL - public static final int KEY_FLAGS = 27; // key flags - public static final int SIGNER_USER_ID = 28; // signer's user id - public static final int REVOCATION_REASON = 29; // reason for revocation - public static final int FEATURES = 30; // features - public static final int SIGNATURE_TARGET = 31; // signature target - public static final int EMBEDDED_SIGNATURE = 32; // embedded signature -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncDataPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncDataPacket.java deleted file mode 100644 index 5722d26..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncDataPacket.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic type for a symmetric key encrypted packet - */ -public class SymmetricEncDataPacket - extends InputStreamPacket -{ - public SymmetricEncDataPacket( - BCPGInputStream in) - { - super(in); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncIntegrityPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncIntegrityPacket.java deleted file mode 100644 index 318a54e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricEncIntegrityPacket.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -/** - */ -public class SymmetricEncIntegrityPacket - extends InputStreamPacket -{ - int version; - - SymmetricEncIntegrityPacket( - BCPGInputStream in) - throws IOException - { - super(in); - - version = in.read(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyAlgorithmTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyAlgorithmTags.java deleted file mode 100644 index aa1ab7f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyAlgorithmTags.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic tags for symmetric key algorithms - */ -public interface SymmetricKeyAlgorithmTags -{ - public static final int NULL = 0; // Plaintext or unencrypted data - public static final int IDEA = 1; // IDEA [IDEA] - public static final int TRIPLE_DES = 2; // Triple-DES (DES-EDE, as per spec -168 bit key derived from 192) - public static final int CAST5 = 3; // CAST5 (128 bit key, as per RFC 2144) - public static final int BLOWFISH = 4; // Blowfish (128 bit key, 16 rounds) [BLOWFISH] - public static final int SAFER = 5; // SAFER-SK128 (13 rounds) [SAFER] - public static final int DES = 6; // Reserved for DES/SK - public static final int AES_128 = 7; // Reserved for AES with 128-bit key - public static final int AES_192 = 8; // Reserved for AES with 192-bit key - public static final int AES_256 = 9; // Reserved for AES with 256-bit key - public static final int TWOFISH = 10; // Reserved for Twofish -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyEncSessionPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyEncSessionPacket.java deleted file mode 100644 index 459134c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/SymmetricKeyEncSessionPacket.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.bcpg; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Basic type for a symmetric encrypted session key packet - */ -public class SymmetricKeyEncSessionPacket - extends ContainedPacket -{ - private int version; - private int encAlgorithm; - private S2K s2k; - private byte[] secKeyData; - - public SymmetricKeyEncSessionPacket( - BCPGInputStream in) - throws IOException - { - version = in.read(); - encAlgorithm = in.read(); - - s2k = new S2K(in); - - if (in.available() != 0) - { - secKeyData = new byte[in.available()]; - in.readFully(secKeyData, 0, secKeyData.length); - } - } - - public SymmetricKeyEncSessionPacket( - int encAlgorithm, - S2K s2k, - byte[] secKeyData) - { - this.version = 4; - this.encAlgorithm = encAlgorithm; - this.s2k = s2k; - this.secKeyData = secKeyData; - } - - /** - * @return int - */ - public int getEncAlgorithm() - { - return encAlgorithm; - } - - /** - * @return S2K - */ - public S2K getS2K() - { - return s2k; - } - - /** - * @return byte[] - */ - public byte[] getSecKeyData() - { - return secKeyData; - } - - /** - * @return int - */ - public int getVersion() - { - return version; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - BCPGOutputStream pOut = new BCPGOutputStream(bOut); - - pOut.write(version); - pOut.write(encAlgorithm); - pOut.writeObject(s2k); - - if (secKeyData != null && secKeyData.length > 0) - { - pOut.write(secKeyData); - } - - out.writePacket(SYMMETRIC_KEY_ENC_SESSION, bOut.toByteArray(), true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/TrustPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/TrustPacket.java deleted file mode 100644 index 9f15776..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/TrustPacket.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.bcpg; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Basic type for a trust packet - */ -public class TrustPacket - extends ContainedPacket -{ - byte[] levelAndTrustAmount; - - public TrustPacket( - BCPGInputStream in) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - int ch; - - while ((ch = in.read()) >= 0) - { - bOut.write(ch); - } - - levelAndTrustAmount = bOut.toByteArray(); - } - - public TrustPacket( - int trustCode) - { - this.levelAndTrustAmount = new byte[1]; - - this.levelAndTrustAmount[0] = (byte)trustCode; - } - - public byte[] getLevelAndTrustAmount() - { - return levelAndTrustAmount; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(TRUST, levelAndTrustAmount, true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributePacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributePacket.java deleted file mode 100644 index 0c08a40..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributePacket.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.bc.bcpg; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Vector; - -/** - * Basic type for a user attribute packet. - */ -public class UserAttributePacket - extends ContainedPacket -{ - private UserAttributeSubpacket[] subpackets; - - public UserAttributePacket( - BCPGInputStream in) - throws IOException - { - UserAttributeSubpacketInputStream sIn = new UserAttributeSubpacketInputStream(in); - UserAttributeSubpacket sub; - - Vector v= new Vector(); - while ((sub = sIn.readPacket()) != null) - { - v.addElement(sub); - } - - subpackets = new UserAttributeSubpacket[v.size()]; - - for (int i = 0; i != subpackets.length; i++) - { - subpackets[i] = (UserAttributeSubpacket)v.elementAt(i); - } - } - - public UserAttributePacket( - UserAttributeSubpacket[] subpackets) - { - this.subpackets = subpackets; - } - - public UserAttributeSubpacket[] getSubpackets() - { - return subpackets; - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - for (int i = 0; i != subpackets.length; i++) - { - subpackets[i].encode(bOut); - } - - out.writePacket(USER_ATTRIBUTE, bOut.toByteArray(), false); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacket.java deleted file mode 100644 index ef3d545..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacket.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.bcpg; - -import org.bc.util.Arrays; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * Basic type for a user attribute sub-packet. - */ -public class UserAttributeSubpacket -{ - int type; - - protected byte[] data; - - protected UserAttributeSubpacket( - int type, - byte[] data) - { - this.type = type; - this.data = data; - } - - public int getType() - { - return type; - } - - /** - * return the generic data making up the packet. - */ - public byte[] getData() - { - return data; - } - - public void encode( - OutputStream out) - throws IOException - { - int bodyLen = data.length + 1; - - if (bodyLen < 192) - { - out.write((byte)bodyLen); - } - else if (bodyLen <= 8383) - { - bodyLen -= 192; - - out.write((byte)(((bodyLen >> 8) & 0xff) + 192)); - out.write((byte)bodyLen); - } - else - { - out.write(0xff); - out.write((byte)(bodyLen >> 24)); - out.write((byte)(bodyLen >> 16)); - out.write((byte)(bodyLen >> 8)); - out.write((byte)bodyLen); - } - - out.write(type); - out.write(data); - } - - public boolean equals( - Object o) - { - if (o == this) - { - return true; - } - - if (!(o instanceof UserAttributeSubpacket)) - { - return false; - } - - UserAttributeSubpacket other = (UserAttributeSubpacket)o; - - return this.type == other.type - && Arrays.areEqual(this.data, other.data); - } - - public int hashCode() - { - return type ^ Arrays.hashCode(data); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketInputStream.java deleted file mode 100644 index 86dfe46..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketInputStream.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.bc.bcpg; - -import java.io.*; - -import org.bc.bcpg.attr.ImageAttribute; - -/** - * reader for user attribute sub-packets - */ -public class UserAttributeSubpacketInputStream - extends InputStream implements UserAttributeSubpacketTags -{ - InputStream in; - - public UserAttributeSubpacketInputStream( - InputStream in) - { - this.in = in; - } - - public int available() - throws IOException - { - return in.available(); - } - - public int read() - throws IOException - { - return in.read(); - } - - private void readFully( - byte[] buf, - int off, - int len) - throws IOException - { - if (len > 0) - { - int b = this.read(); - - if (b < 0) - { - throw new EOFException(); - } - - buf[off] = (byte)b; - off++; - len--; - } - - while (len > 0) - { - int l = in.read(buf, off, len); - - if (l < 0) - { - throw new EOFException(); - } - - off += l; - len -= l; - } - } - - public UserAttributeSubpacket readPacket() - throws IOException - { - int l = this.read(); - int bodyLen = 0; - - if (l < 0) - { - return null; - } - - if (l < 192) - { - bodyLen = l; - } - else if (l <= 223) - { - bodyLen = ((l - 192) << 8) + (in.read()) + 192; - } - else if (l == 255) - { - bodyLen = (in.read() << 24) | (in.read() << 16) | (in.read() << 8) | in.read(); - } - else - { - // TODO Error? - } - - int tag = in.read(); - - if (tag < 0) - { - throw new EOFException("unexpected EOF reading user attribute sub packet"); - } - - byte[] data = new byte[bodyLen - 1]; - - this.readFully(data, 0, data.length); - - int type = tag; - - switch (type) - { - case IMAGE_ATTRIBUTE: - return new ImageAttribute(data); - } - - return new UserAttributeSubpacket(type, data); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketTags.java deleted file mode 100644 index 2714471..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserAttributeSubpacketTags.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.bcpg; - -/** - * Basic PGP user attribute sub-packet tag types. - */ -public interface UserAttributeSubpacketTags -{ - public static final int IMAGE_ATTRIBUTE = 1; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserIDPacket.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserIDPacket.java deleted file mode 100644 index 49e1b19..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/UserIDPacket.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.bc.bcpg; - -import java.io.IOException; - -import org.bc.util.Strings; - -/** - * Basic type for a user ID packet. - */ -public class UserIDPacket - extends ContainedPacket -{ - private byte[] idData; - - public UserIDPacket( - BCPGInputStream in) - throws IOException - { - idData = new byte[in.available()]; - in.readFully(idData); - } - - public UserIDPacket( - String id) - { - this.idData = Strings.toUTF8ByteArray(id); - } - - public String getID() - { - return Strings.fromUTF8ByteArray(idData); - } - - public void encode( - BCPGOutputStream out) - throws IOException - { - out.writePacket(USER_ID, idData, true); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/attr/ImageAttribute.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/attr/ImageAttribute.java deleted file mode 100644 index 28be9f9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/attr/ImageAttribute.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.bc.bcpg.attr; - -import org.bc.bcpg.UserAttributeSubpacket; -import org.bc.bcpg.UserAttributeSubpacketTags; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Basic type for a image attribute packet. - */ -public class ImageAttribute - extends UserAttributeSubpacket -{ - public static final int JPEG = 1; - - private static final byte[] ZEROES = new byte[12]; - - private int hdrLength; - private int version; - private int encoding; - private byte[] imageData; - - public ImageAttribute( - byte[] data) - { - super(UserAttributeSubpacketTags.IMAGE_ATTRIBUTE, data); - - hdrLength = ((data[1] & 0xff) << 8) | (data[0] & 0xff); - version = data[2] & 0xff; - encoding = data[3] & 0xff; - - imageData = new byte[data.length - hdrLength]; - System.arraycopy(data, hdrLength, imageData, 0, imageData.length); - } - - public ImageAttribute( - int imageType, - byte[] imageData) - { - this(toByteArray(imageType, imageData)); - } - - private static byte[] toByteArray(int imageType, byte[] imageData) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - bOut.write(0x10); bOut.write(0x00); bOut.write(0x01); - bOut.write(imageType); - bOut.write(ZEROES); - bOut.write(imageData); - } - catch (IOException e) - { - throw new RuntimeException("unable to encode to byte array!"); - } - - return bOut.toByteArray(); - } - - public int version() - { - return version; - } - - public int getEncoding() - { - return encoding; - } - - public byte[] getImageData() - { - return imageData; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/EmbeddedSignature.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/EmbeddedSignature.java deleted file mode 100644 index 5dc5639..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/EmbeddedSignature.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * Packet embedded signature - */ -public class EmbeddedSignature - extends SignatureSubpacket -{ - public EmbeddedSignature( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.EMBEDDED_SIGNATURE, critical, data); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Exportable.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Exportable.java deleted file mode 100644 index 24da479..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Exportable.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving signature creation time. - */ -public class Exportable - extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - - public Exportable( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.EXPORTABLE, critical, data); - } - - public Exportable( - boolean critical, - boolean isExportable) - { - super(SignatureSubpacketTags.EXPORTABLE, critical, booleanToByteArray(isExportable)); - } - - public boolean isExportable() - { - return data[0] != 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Features.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Features.java deleted file mode 100644 index 7250139..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Features.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -public class Features - extends SignatureSubpacket -{ - - /** Identifier for the modification detection feature */ - public static final byte FEATURE_MODIFICATION_DETECTION = 1; - - private static final byte[] featureToByteArray(byte feature) - { - byte[] data = new byte[1]; - data[0] = feature; - return data; - } - - public Features(boolean critical, byte[] data) - { - super(SignatureSubpacketTags.FEATURES, critical, data); - } - - public Features(boolean critical, byte feature) - { - super(SignatureSubpacketTags.FEATURES, critical, featureToByteArray(feature)); - } - - /** - * Returns if modification detection is supported. - */ - public boolean supportsModificationDetection() - { - return supportsFeature(FEATURE_MODIFICATION_DETECTION); - } - - -// /** Class should be immutable. -// * Set modification detection support. -// */ -// public void setSupportsModificationDetection(boolean support) -// { -// setSupportsFeature(FEATURE_MODIFICATION_DETECTION, support); -// } - - - /** - * Returns if a particular feature is supported. - */ - public boolean supportsFeature(byte feature) - { - for (int i = 0; i < data.length; i++) - { - if (data[i] == feature) - { - return true; - } - } - return false; - } - - - /** - * Sets support for a particular feature. - */ - private void setSupportsFeature(byte feature, boolean support) - { - if (feature == 0) - { - throw new IllegalArgumentException("feature == 0"); - } - if (supportsFeature(feature) != support) - { - if (support == true) - { - byte[] temp = new byte[data.length + 1]; - System.arraycopy(data, 0, temp, 0, data.length); - temp[data.length] = feature; - data = temp; - } - else - { - for (int i = 0; i < data.length; i++) - { - if (data[i] == feature) - { - byte[] temp = new byte[data.length - 1]; - System.arraycopy(data, 0, temp, 0, i); - System.arraycopy(data, i + 1, temp, i, temp.length - i); - data = temp; - i = data.length + 1; - } - } - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/IssuerKeyID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/IssuerKeyID.java deleted file mode 100644 index d893ab4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/IssuerKeyID.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving signature creation time. - */ -public class IssuerKeyID - extends SignatureSubpacket -{ - protected static byte[] keyIDToBytes( - long keyId) - { - byte[] data = new byte[8]; - - data[0] = (byte)(keyId >> 56); - data[1] = (byte)(keyId >> 48); - data[2] = (byte)(keyId >> 40); - data[3] = (byte)(keyId >> 32); - data[4] = (byte)(keyId >> 24); - data[5] = (byte)(keyId >> 16); - data[6] = (byte)(keyId >> 8); - data[7] = (byte)keyId; - - return data; - } - - public IssuerKeyID( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.ISSUER_KEY_ID, critical, data); - } - - public IssuerKeyID( - boolean critical, - long keyID) - { - super(SignatureSubpacketTags.ISSUER_KEY_ID, critical, keyIDToBytes(keyID)); - } - - public long getKeyID() - { - long keyID = ((long)(data[0] & 0xff) << 56) | ((long)(data[1] & 0xff) << 48) | ((long)(data[2] & 0xff) << 40) | ((long)(data[3] & 0xff) << 32) - | ((long)(data[4] & 0xff) << 24) | ((data[5] & 0xff) << 16) | ((data[6] & 0xff) << 8) | (data[7] & 0xff); - - return keyID; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyExpirationTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyExpirationTime.java deleted file mode 100644 index eb4cfd8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyExpirationTime.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving time after creation at which the key expires. - */ -public class KeyExpirationTime - extends SignatureSubpacket -{ - protected static byte[] timeToBytes( - long t) - { - byte[] data = new byte[4]; - - data[0] = (byte)(t >> 24); - data[1] = (byte)(t >> 16); - data[2] = (byte)(t >> 8); - data[3] = (byte)t; - - return data; - } - - public KeyExpirationTime( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.KEY_EXPIRE_TIME, critical, data); - } - - public KeyExpirationTime( - boolean critical, - long seconds) - { - super(SignatureSubpacketTags.KEY_EXPIRE_TIME, critical, timeToBytes(seconds)); - } - - /** - * Return the number of seconds after creation time a key is valid for. - * - * @return second count for key validity. - */ - public long getTime() - { - long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff); - - return time; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyFlags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyFlags.java deleted file mode 100644 index 6ca161a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/KeyFlags.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * Packet holding the key flag values. - */ -public class KeyFlags - extends SignatureSubpacket -{ - public static final int CERTIFY_OTHER = 0x01; - public static final int SIGN_DATA = 0x02; - public static final int ENCRYPT_COMMS = 0x04; - public static final int ENCRYPT_STORAGE = 0x08; - public static final int SPLIT = 0x10; - public static final int AUTHENTICATION = 0x20; - public static final int SHARED = 0x80; - - private static byte[] intToByteArray( - int v) - { - byte[] tmp = new byte[4]; - int size = 0; - - for (int i = 0; i != 4; i++) - { - tmp[i] = (byte)(v >> (i * 8)); - if (tmp[i] != 0) - { - size = i; - } - } - - byte[] data = new byte[size + 1]; - - System.arraycopy(tmp, 0, data, 0, data.length); - - return data; - } - - public KeyFlags( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.KEY_FLAGS, critical, data); - } - - public KeyFlags( - boolean critical, - int flags) - { - super(SignatureSubpacketTags.KEY_FLAGS, critical, intToByteArray(flags)); - } - - /** - * Return the flag values contained in the first 4 octets (note: at the moment - * the standard only uses the first one). - * - * @return flag values. - */ - public int getFlags() - { - int flags = 0; - - for (int i = 0; i != data.length; i++) - { - flags |= (data[i] & 0xff) << (i * 8); - } - - return flags; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/NotationData.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/NotationData.java deleted file mode 100644 index ed10ea8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/NotationData.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; -import org.bc.util.Strings; - -import java.io.ByteArrayOutputStream; - -/** - * Class provided a NotationData object according to - * RFC2440, Chapter 5.2.3.15. Notation Data - */ -public class NotationData - extends SignatureSubpacket -{ - public static final int HEADER_FLAG_LENGTH = 4; - public static final int HEADER_NAME_LENGTH = 2; - public static final int HEADER_VALUE_LENGTH = 2; - - public NotationData(boolean critical, byte[] data) - { - super(SignatureSubpacketTags.NOTATION_DATA, critical, data); - } - - public NotationData( - boolean critical, - boolean humanReadable, - String notationName, - String notationValue) - { - super(SignatureSubpacketTags.NOTATION_DATA, critical, createData(humanReadable, notationName, notationValue)); - } - - private static byte[] createData(boolean humanReadable, String notationName, String notationValue) - { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - -// (4 octets of flags, 2 octets of name length (M), -// 2 octets of value length (N), -// M octets of name data, -// N octets of value data) - - // flags - out.write(humanReadable ? 0x80 : 0x00); - out.write(0x0); - out.write(0x0); - out.write(0x0); - - byte[] nameData, valueData = null; - int nameLength, valueLength; - - nameData = Strings.toUTF8ByteArray(notationName); - nameLength = Math.min(nameData.length, 0xFF); - - valueData = Strings.toUTF8ByteArray(notationValue); - valueLength = Math.min(valueData.length, 0xFF); - - // name length - out.write((nameLength >>> 8) & 0xFF); - out.write((nameLength >>> 0) & 0xFF); - - // value length - out.write((valueLength >>> 8) & 0xFF); - out.write((valueLength >>> 0) & 0xFF); - - // name - out.write(nameData, 0, nameLength); - - // value - out.write(valueData, 0, valueLength); - - return out.toByteArray(); - } - - public boolean isHumanReadable() - { - return data[0] == (byte)0x80; - } - - public String getNotationName() - { - int nameLength = ((data[HEADER_FLAG_LENGTH] << 8) + (data[HEADER_FLAG_LENGTH + 1] << 0)); - - byte bName[] = new byte[nameLength]; - System.arraycopy(data, HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + HEADER_VALUE_LENGTH, bName, 0, nameLength); - - return Strings.fromUTF8ByteArray(bName); - } - - public String getNotationValue() - { - return Strings.fromUTF8ByteArray(getNotationValueBytes()); - } - - public byte[] getNotationValueBytes() - { - int nameLength = ((data[HEADER_FLAG_LENGTH] << 8) + (data[HEADER_FLAG_LENGTH + 1] << 0)); - int valueLength = ((data[HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH] << 8) + (data[HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + 1] << 0)); - - byte bValue[] = new byte[valueLength]; - System.arraycopy(data, HEADER_FLAG_LENGTH + HEADER_NAME_LENGTH + HEADER_VALUE_LENGTH + nameLength, bValue, 0, valueLength); - return bValue; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PreferredAlgorithms.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PreferredAlgorithms.java deleted file mode 100644 index 58dbe3c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PreferredAlgorithms.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; - -/** - * packet giving signature creation time. - */ -public class PreferredAlgorithms - extends SignatureSubpacket -{ - private static byte[] intToByteArray( - int[] v) - { - byte[] data = new byte[v.length]; - - for (int i = 0; i != v.length; i++) - { - data[i] = (byte)v[i]; - } - - return data; - } - - public PreferredAlgorithms( - int type, - boolean critical, - byte[] data) - { - super(type, critical, data); - } - - public PreferredAlgorithms( - int type, - boolean critical, - int[] preferrences) - { - super(type, critical, intToByteArray(preferrences)); - } - - /** - * @deprecated mispelt! - */ - public int[] getPreferrences() - { - return getPreferences(); - } - - public int[] getPreferences() - { - int[] v = new int[data.length]; - - for (int i = 0; i != v.length; i++) - { - v[i] = data[i] & 0xff; - } - - return v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PrimaryUserID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PrimaryUserID.java deleted file mode 100644 index 2ef61d5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/PrimaryUserID.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving whether or not the signature is signed using the primary user ID for the key. - */ -public class PrimaryUserID - extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - - public PrimaryUserID( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, data); - } - - public PrimaryUserID( - boolean critical, - boolean isPrimaryUserID) - { - super(SignatureSubpacketTags.PRIMARY_USER_ID, critical, booleanToByteArray(isPrimaryUserID)); - } - - public boolean isPrimaryUserID() - { - return data[0] != 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Revocable.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Revocable.java deleted file mode 100644 index 3236fe7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/Revocable.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving whether or not is revocable. - */ -public class Revocable - extends SignatureSubpacket -{ - private static byte[] booleanToByteArray( - boolean value) - { - byte[] data = new byte[1]; - - if (value) - { - data[0] = 1; - return data; - } - else - { - return data; - } - } - - public Revocable( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.REVOCABLE, critical, data); - } - - public Revocable( - boolean critical, - boolean isRevocable) - { - super(SignatureSubpacketTags.REVOCABLE, critical, booleanToByteArray(isRevocable)); - } - - public boolean isRevocable() - { - return data[0] != 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKey.java deleted file mode 100644 index 35f1a9d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKey.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * Represents revocation key OpenPGP signature sub packet. - */ -public class RevocationKey extends SignatureSubpacket -{ - // 1 octet of class, - // 1 octet of public-key algorithm ID, - // 20 octets of fingerprint - public RevocationKey(boolean isCritical, byte[] data) - { - super(SignatureSubpacketTags.REVOCATION_KEY, isCritical, data); - } - - public RevocationKey(boolean isCritical, byte signatureClass, int keyAlgorithm, - byte[] fingerprint) - { - super(SignatureSubpacketTags.REVOCATION_KEY, isCritical, createData(signatureClass, - (byte)(keyAlgorithm & 0xff), fingerprint)); - } - - private static byte[] createData(byte signatureClass, byte keyAlgorithm, byte[] fingerprint) - { - byte[] data = new byte[2 + fingerprint.length]; - data[0] = signatureClass; - data[1] = keyAlgorithm; - System.arraycopy(fingerprint, 0, data, 2, fingerprint.length); - return data; - } - - public byte getSignatureClass() - { - return this.getData()[0]; - } - - public int getAlgorithm() - { - return this.getData()[1]; - } - - public byte[] getFingerprint() - { - byte[] data = this.getData(); - byte[] fingerprint = new byte[data.length - 2]; - System.arraycopy(data, 2, fingerprint, 0, fingerprint.length); - return fingerprint; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKeyTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKeyTags.java deleted file mode 100644 index 3af9f85..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationKeyTags.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.bcpg.sig; - -public interface RevocationKeyTags -{ - public static final byte CLASS_DEFAULT = (byte)0x80; - public static final byte CLASS_SENSITIVE = (byte)0x40; - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReason.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReason.java deleted file mode 100644 index b24655c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReason.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; -import org.bc.util.Strings; - -/** - * Represents revocation reason OpenPGP signature sub packet. - */ -public class RevocationReason extends SignatureSubpacket -{ - public RevocationReason(boolean isCritical, byte[] data) - { - super(SignatureSubpacketTags.REVOCATION_REASON, isCritical, data); - } - - public RevocationReason(boolean isCritical, byte reason, String description) - { - super(SignatureSubpacketTags.REVOCATION_REASON, isCritical, createData(reason, description)); - } - - private static byte[] createData(byte reason, String description) - { - byte[] descriptionBytes = Strings.toUTF8ByteArray(description); - byte[] data = new byte[1 + descriptionBytes.length]; - - data[0] = reason; - System.arraycopy(descriptionBytes, 0, data, 1, descriptionBytes.length); - - return data; - } - - public byte getRevocationReason() - { - return getData()[0]; - } - - public String getRevocationDescription() - { - byte[] data = getData(); - if (data.length == 1) - { - return ""; - } - - byte[] description = new byte[data.length - 1]; - System.arraycopy(data, 1, description, 0, description.length); - - return Strings.fromUTF8ByteArray(description); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReasonTags.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReasonTags.java deleted file mode 100644 index 94e505a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/RevocationReasonTags.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.bcpg.sig; - -public interface RevocationReasonTags -{ - public static final byte NO_REASON = 0; // No reason specified (key revocations or cert revocations) - public static final byte KEY_SUPERSEDED = 1; // Key is superseded (key revocations) - public static final byte KEY_COMPROMISED = 2; // Key material has been compromised (key revocations) - public static final byte KEY_RETIRED = 3; // Key is retired and no longer used (key revocations) - public static final byte USER_NO_LONGER_VALID = 32; // User ID information is no longer valid (cert revocations) - - // 100-110 - Private Use -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureCreationTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureCreationTime.java deleted file mode 100644 index e777de5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureCreationTime.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.bcpg.sig; - -import java.util.Date; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving signature creation time. - */ -public class SignatureCreationTime - extends SignatureSubpacket -{ - protected static byte[] timeToBytes( - Date date) - { - byte[] data = new byte[4]; - long t = date.getTime() / 1000; - - data[0] = (byte)(t >> 24); - data[1] = (byte)(t >> 16); - data[2] = (byte)(t >> 8); - data[3] = (byte)t; - - return data; - } - - public SignatureCreationTime( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.CREATION_TIME, critical, data); - } - - public SignatureCreationTime( - boolean critical, - Date date) - { - super(SignatureSubpacketTags.CREATION_TIME, critical, timeToBytes(date)); - } - - public Date getTime() - { - long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff); - - return new Date(time * 1000); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureExpirationTime.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureExpirationTime.java deleted file mode 100644 index d823143..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignatureExpirationTime.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving signature expiration time. - */ -public class SignatureExpirationTime - extends SignatureSubpacket -{ - protected static byte[] timeToBytes( - long t) - { - byte[] data = new byte[4]; - - data[0] = (byte)(t >> 24); - data[1] = (byte)(t >> 16); - data[2] = (byte)(t >> 8); - data[3] = (byte)t; - - return data; - } - - public SignatureExpirationTime( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.EXPIRE_TIME, critical, data); - } - - public SignatureExpirationTime( - boolean critical, - long seconds) - { - super(SignatureSubpacketTags.EXPIRE_TIME, critical, timeToBytes(seconds)); - } - - /** - * return time in seconds before signature expires after creation time. - */ - public long getTime() - { - long time = ((long)(data[0] & 0xff) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff); - - return time; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignerUserID.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignerUserID.java deleted file mode 100644 index 2a5f8f8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/SignerUserID.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving the User ID of the signer. - */ -public class SignerUserID - extends SignatureSubpacket -{ - private static byte[] userIDToBytes( - String id) - { - byte[] idData = new byte[id.length()]; - - for (int i = 0; i != id.length(); i++) - { - idData[i] = (byte)id.charAt(i); - } - - return idData; - } - - public SignerUserID( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.SIGNER_USER_ID, critical, data); - } - - public SignerUserID( - boolean critical, - String userID) - { - super(SignatureSubpacketTags.SIGNER_USER_ID, critical, userIDToBytes(userID)); - } - - public String getID() - { - char[] chars = new char[data.length]; - - for (int i = 0; i != chars.length; i++) - { - chars[i] = (char)(data[i] & 0xff); - } - - return new String(chars); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/TrustSignature.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/TrustSignature.java deleted file mode 100644 index 0facf88..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/bcpg/sig/TrustSignature.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.bcpg.sig; - -import org.bc.bcpg.SignatureSubpacket; -import org.bc.bcpg.SignatureSubpacketTags; - -/** - * packet giving trust. - */ -public class TrustSignature - extends SignatureSubpacket -{ - private static byte[] intToByteArray( - int v1, - int v2) - { - byte[] data = new byte[2]; - - data[0] = (byte)v1; - data[1] = (byte)v2; - - return data; - } - - public TrustSignature( - boolean critical, - byte[] data) - { - super(SignatureSubpacketTags.TRUST_SIG, critical, data); - } - - public TrustSignature( - boolean critical, - int depth, - int trustAmount) - { - super(SignatureSubpacketTags.TRUST_SIG, critical, intToByteArray(depth, trustAmount)); - } - - public int getDepth() - { - return data[0] & 0xff; - } - - public int getTrustAmount() - { - return data[1] & 0xff; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricBlockCipher.java deleted file mode 100644 index 726c488..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricBlockCipher.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.crypto; - - -/** - * base interface that a public/private key block cipher needs - * to conform to. - */ -public interface AsymmetricBlockCipher -{ - /** - * initialise the cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param param the key and other data required by the cipher. - */ - public void init(boolean forEncryption, CipherParameters param); - - /** - * returns the largest size an input block can be. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize(); - - /** - * returns the maximum size of the block produced by this cipher. - * - * @return maximum size of the output block produced by the cipher. - */ - public int getOutputBlockSize(); - - /** - * process the block of len bytes stored in in from offset inOff. - * - * @param in the input data - * @param inOff offset into the in array where the data starts - * @param len the length of the block to be processed. - * @return the resulting byte array of the encryption/decryption process. - * @exception InvalidCipherTextException data decrypts improperly. - * @exception DataLengthException the input data is too large for the cipher. - */ - public byte[] processBlock(byte[] in, int inOff, int len) - throws InvalidCipherTextException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPair.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPair.java deleted file mode 100644 index e897ff3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPair.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bc.crypto; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -/** - * a holding class for public/private parameter pairs. - */ -public class AsymmetricCipherKeyPair -{ - private AsymmetricKeyParameter publicParam; - private AsymmetricKeyParameter privateParam; - - /** - * basic constructor. - * - * @param publicParam a public key parameters object. - * @param privateParam the corresponding private key parameters. - */ - public AsymmetricCipherKeyPair( - AsymmetricKeyParameter publicParam, - AsymmetricKeyParameter privateParam) - { - this.publicParam = publicParam; - this.privateParam = privateParam; - } - - /** - * basic constructor. - * - * @param publicParam a public key parameters object. - * @param privateParam the corresponding private key parameters. - * @deprecated use AsymmetricKeyParameter - */ - public AsymmetricCipherKeyPair( - CipherParameters publicParam, - CipherParameters privateParam) - { - this.publicParam = (AsymmetricKeyParameter)publicParam; - this.privateParam = (AsymmetricKeyParameter)privateParam; - } - - /** - * return the public key parameters. - * - * @return the public key parameters. - */ - public AsymmetricKeyParameter getPublic() - { - return publicParam; - } - - /** - * return the private key parameters. - * - * @return the private key parameters. - */ - public AsymmetricKeyParameter getPrivate() - { - return privateParam; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPairGenerator.java deleted file mode 100644 index 5ae47e2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/AsymmetricCipherKeyPairGenerator.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.crypto; - -/** - * interface that a public/private key pair generator should conform to. - */ -public interface AsymmetricCipherKeyPairGenerator -{ - /** - * intialise the key pair generator. - * - * @param param the parameters the key pair is to be initialised with. - */ - public void init(KeyGenerationParameters param); - - /** - * return an AsymmetricCipherKeyPair containing the generated keys. - * - * @return an AsymmetricCipherKeyPair containing the generated keys. - */ - public AsymmetricCipherKeyPair generateKeyPair(); -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BasicAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BasicAgreement.java deleted file mode 100644 index cd7d689..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BasicAgreement.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.crypto; - -import java.math.BigInteger; - -/** - * The basic interface that basic Diffie-Hellman implementations - * conforms to. - */ -public interface BasicAgreement -{ - /** - * initialise the agreement engine. - */ - void init(CipherParameters param); - - /** - * return the field size for the agreement algorithm in bytes. - */ - int getFieldSize(); - - /** - * given a public key from a given party calculate the next - * message in the agreement sequence. - */ - BigInteger calculateAgreement(CipherParameters pubKey); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BlockCipher.java deleted file mode 100644 index 8e71dbc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BlockCipher.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bc.crypto; - - -/** - * Block cipher engines are expected to conform to this interface. - */ -public interface BlockCipher -{ - /** - * Initialise the cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException; - - /** - * Return the name of the algorithm the cipher implements. - * - * @return the name of the algorithm the cipher implements. - */ - public String getAlgorithmName(); - - /** - * Return the block size for this cipher (in bytes). - * - * @return the block size for this cipher in bytes. - */ - public int getBlockSize(); - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock(byte[] in, int inOff, byte[] out, int outOff) - throws DataLengthException, IllegalStateException; - - /** - * Reset the cipher. After resetting the cipher is in the same state - * as it was after the last init (if there was one). - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedAsymmetricBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedAsymmetricBlockCipher.java deleted file mode 100644 index 6ce7910..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedAsymmetricBlockCipher.java +++ /dev/null @@ -1,171 +0,0 @@ -package org.bc.crypto; - -/** - * a buffer wrapper for an asymmetric block cipher, allowing input - * to be accumulated in a piecemeal fashion until final processing. - */ -public class BufferedAsymmetricBlockCipher -{ - protected byte[] buf; - protected int bufOff; - - private final AsymmetricBlockCipher cipher; - - /** - * base constructor. - * - * @param cipher the cipher this buffering object wraps. - */ - public BufferedAsymmetricBlockCipher( - AsymmetricBlockCipher cipher) - { - this.cipher = cipher; - } - - /** - * return the underlying cipher for the buffer. - * - * @return the underlying cipher for the buffer. - */ - public AsymmetricBlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * return the amount of data sitting in the buffer. - * - * @return the amount of data sitting in the buffer. - */ - public int getBufferPosition() - { - return bufOff; - } - - /** - * initialise the buffer and the underlying cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - reset(); - - cipher.init(forEncryption, params); - - // - // we allow for an extra byte where people are using their own padding - // mechanisms on a raw cipher. - // - buf = new byte[cipher.getInputBlockSize() + (forEncryption ? 1 : 0)]; - bufOff = 0; - } - - /** - * returns the largest size an input block can be. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - return cipher.getInputBlockSize(); - } - - /** - * returns the maximum size of the block produced by this cipher. - * - * @return maximum size of the output block produced by the cipher. - */ - public int getOutputBlockSize() - { - return cipher.getOutputBlockSize(); - } - - /** - * add another byte for processing. - * - * @param in the input byte. - */ - public void processByte( - byte in) - { - if (bufOff >= buf.length) - { - throw new DataLengthException("attempt to process message too long for cipher"); - } - - buf[bufOff++] = in; - } - - /** - * add len bytes to the buffer for processing. - * - * @param in the input data - * @param inOff offset into the in array where the data starts - * @param len the length of the block to be processed. - */ - public void processBytes( - byte[] in, - int inOff, - int len) - { - if (len == 0) - { - return; - } - - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - if (bufOff + len > buf.length) - { - throw new DataLengthException("attempt to process message too long for cipher"); - } - - System.arraycopy(in, inOff, buf, bufOff, len); - bufOff += len; - } - - /** - * process the contents of the buffer using the underlying - * cipher. - * - * @return the result of the encryption/decryption process on the - * buffer. - * @exception InvalidCipherTextException if we are given a garbage block. - */ - public byte[] doFinal() - throws InvalidCipherTextException - { - byte[] out = cipher.processBlock(buf, 0, bufOff); - - reset(); - - return out; - } - - /** - * Reset the buffer and the underlying cipher. - */ - public void reset() - { - /* - * clean the buffer. - */ - if (buf != null) - { - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - } - - bufOff = 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedBlockCipher.java deleted file mode 100644 index 05e7f9b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/BufferedBlockCipher.java +++ /dev/null @@ -1,313 +0,0 @@ -package org.bc.crypto; - - -/** - * A wrapper class that allows block ciphers to be used to process data in - * a piecemeal fashion. The BufferedBlockCipher outputs a block only when the - * buffer is full and more data is being added, or on a doFinal. - *

    - * Note: in the case where the underlying cipher is either a CFB cipher or an - * OFB one the last block may not be a multiple of the block size. - */ -public class BufferedBlockCipher -{ - protected byte[] buf; - protected int bufOff; - - protected boolean forEncryption; - protected BlockCipher cipher; - - protected boolean partialBlockOkay; - protected boolean pgpCFB; - - /** - * constructor for subclasses - */ - protected BufferedBlockCipher() - { - } - - /** - * Create a buffered block cipher without padding. - * - * @param cipher the underlying block cipher this buffering object wraps. - */ - public BufferedBlockCipher( - BlockCipher cipher) - { - this.cipher = cipher; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - - // - // check if we can handle partial blocks on doFinal. - // - String name = cipher.getAlgorithmName(); - int idx = name.indexOf('/') + 1; - - pgpCFB = (idx > 0 && name.startsWith("PGP", idx)); - - if (pgpCFB) - { - partialBlockOkay = true; - } - else - { - partialBlockOkay = (idx > 0 && (name.startsWith("CFB", idx) || name.startsWith("OFB", idx) || name.startsWith("OpenPGP", idx) || name.startsWith("SIC", idx) || name.startsWith("GCTR", idx))); - } - } - - /** - * return the cipher this object wraps. - * - * @return the cipher this object wraps. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * initialise the cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - reset(); - - cipher.init(forEncryption, params); - } - - /** - * return the blocksize for the underlying cipher. - * - * @return the blocksize for the underlying cipher. - */ - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - /** - * return the size of the output buffer required for an update - * an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update - * with len bytes of input. - */ - public int getUpdateOutputSize( - int len) - { - int total = len + bufOff; - int leftOver; - - if (pgpCFB) - { - leftOver = total % buf.length - (cipher.getBlockSize() + 2); - } - else - { - leftOver = total % buf.length; - } - - return total - leftOver; - } - - /** - * return the size of the output buffer required for an update plus a - * doFinal with an input of 'length' bytes. - * - * @param length the length of the input. - * @return the space required to accommodate a call to update and doFinal - * with 'length' bytes of input. - */ - public int getOutputSize( - int length) - { - // Note: Can assume partialBlockOkay is true for purposes of this calculation - return length + bufOff; - } - - /** - * process a single byte, producing an output block if neccessary. - * - * @param in the input byte. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processByte( - byte in, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - int resultLen = 0; - - buf[bufOff++] = in; - - if (bufOff == buf.length) - { - resultLen = cipher.processBlock(buf, 0, out, outOff); - bufOff = 0; - } - - return resultLen; - } - - /** - * process an array of bytes, producing output if necessary. - * - * @param in the input byte array. - * @param inOff the offset at which the input data starts. - * @param len the number of bytes to be copied out of the input array. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = getBlockSize(); - int length = getUpdateOutputSize(len); - - if (length > 0) - { - if ((outOff + length) > out.length) - { - throw new OutputLengthException("output buffer too short"); - } - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, out, outOff); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > buf.length) - { - resultLen += cipher.processBlock(in, inOff, out, outOff + resultLen); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - - if (bufOff == buf.length) - { - resultLen += cipher.processBlock(buf, 0, out, outOff + resultLen); - bufOff = 0; - } - - return resultLen; - } - - /** - * Process the last block in the buffer. - * - * @param out the array the block currently being held is copied into. - * @param outOff the offset at which the copying starts. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there is insufficient space in out for - * the output, or the input is not block size aligned and should be. - * @exception IllegalStateException if the underlying cipher is not - * initialised. - * @exception InvalidCipherTextException if padding is expected and not found. - * @exception DataLengthException if the input is not block size - * aligned. - */ - public int doFinal( - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException, InvalidCipherTextException - { - try - { - int resultLen = 0; - - if (outOff + bufOff > out.length) - { - throw new OutputLengthException("output buffer too short for doFinal()"); - } - - if (bufOff != 0) - { - if (!partialBlockOkay) - { - throw new DataLengthException("data not block size aligned"); - } - - cipher.processBlock(buf, 0, buf, 0); - resultLen = bufOff; - bufOff = 0; - System.arraycopy(buf, 0, out, outOff, resultLen); - } - - return resultLen; - } - finally - { - reset(); - } - } - - /** - * Reset the buffer and cipher. After resetting the object is in the same - * state as it was after the last init (if there was one). - */ - public void reset() - { - // - // clean the buffer. - // - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - // - // reset the underlying cipher. - // - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherKeyGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherKeyGenerator.java deleted file mode 100644 index 94e2aed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherKeyGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.crypto; - -import java.security.SecureRandom; - -/** - * The base class for symmetric, or secret, cipher key generators. - */ -public class CipherKeyGenerator -{ - protected SecureRandom random; - protected int strength; - - /** - * initialise the key generator. - * - * @param param the parameters to be used for key generation - */ - public void init( - KeyGenerationParameters param) - { - this.random = param.getRandom(); - this.strength = (param.getStrength() + 7) / 8; - } - - /** - * generate a secret key. - * - * @return a byte array containing the key value. - */ - public byte[] generateKey() - { - byte[] key = new byte[strength]; - - random.nextBytes(key); - - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherParameters.java deleted file mode 100644 index 683093c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CipherParameters.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.crypto; - -/** - * all parameter classes implement this. - */ -public interface CipherParameters -{ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CryptoException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CryptoException.java deleted file mode 100644 index 17411a8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/CryptoException.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto; - -/** - * the foundation class for the hard exceptions thrown by the crypto packages. - */ -public class CryptoException - extends Exception -{ - private Throwable cause; - - /** - * base constructor. - */ - public CryptoException() - { - } - - /** - * create a CryptoException with the given message. - * - * @param message the message to be carried with the exception. - */ - public CryptoException( - String message) - { - super(message); - } - - /** - * Create a CryptoException with the given message and underlying cause. - * - * @param message message describing exception. - * @param cause the throwable that was the underlying cause. - */ - public CryptoException( - String message, - Throwable cause) - { - super(message); - - this.cause = cause; - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DSA.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DSA.java deleted file mode 100644 index 2dc5ac8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DSA.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.crypto; - -import java.math.BigInteger; - -/** - * interface for classes implementing algorithms modeled similar to the Digital Signature Alorithm. - */ -public interface DSA -{ - /** - * initialise the signer for signature generation or signature - * verification. - * - * @param forSigning true if we are generating a signature, false - * otherwise. - * @param param key parameters for signature generation. - */ - public void init(boolean forSigning, CipherParameters param); - - /** - * sign the passed in message (usually the output of a hash function). - * - * @param message the message to be signed. - * @return two big integers representing the r and s values respectively. - */ - public BigInteger[] generateSignature(byte[] message); - - /** - * verify the message message against the signature values r and s. - * - * @param message the message that was supposed to have been signed. - * @param r the r signature value. - * @param s the s signature value. - */ - public boolean verifySignature(byte[] message, BigInteger r, BigInteger s); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DataLengthException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DataLengthException.java deleted file mode 100644 index b9d76a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DataLengthException.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.crypto; - -/** - * this exception is thrown if a buffer that is meant to have output - * copied into it turns out to be too short, or if we've been given - * insufficient input. In general this exception will get thrown rather - * than an ArrayOutOfBounds exception. - */ -public class DataLengthException - extends RuntimeCryptoException -{ - /** - * base constructor. - */ - public DataLengthException() - { - } - - /** - * create a DataLengthException with the given message. - * - * @param message the message to be carried with the exception. - */ - public DataLengthException( - String message) - { - super(message); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationFunction.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationFunction.java deleted file mode 100644 index b545911..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationFunction.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.crypto; - -/** - * base interface for general purpose byte derivation functions. - */ -public interface DerivationFunction -{ - public void init(DerivationParameters param); - - /** - * return the message digest used as the basis for the function - */ - public Digest getDigest(); - - public int generateBytes(byte[] out, int outOff, int len) - throws DataLengthException, IllegalArgumentException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationParameters.java deleted file mode 100644 index 75e1075..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/DerivationParameters.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.crypto; - -/** - * Parameters for key/byte stream derivation classes - */ -public interface DerivationParameters -{ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Digest.java deleted file mode 100644 index feeb99e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Digest.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.crypto; - -/** - * interface that a message digest conforms to. - */ -public interface Digest -{ - /** - * return the algorithm name - * - * @return the algorithm name - */ - public String getAlgorithmName(); - - /** - * return the size, in bytes, of the digest produced by this message digest. - * - * @return the size, in bytes, of the digest produced by this message digest. - */ - public int getDigestSize(); - - /** - * update the message digest with a single byte. - * - * @param in the input byte to be entered. - */ - public void update(byte in); - - /** - * update the message digest with a block of bytes. - * - * @param in the byte array containing the data. - * @param inOff the offset into the byte array where the data starts. - * @param len the length of the data. - */ - public void update(byte[] in, int inOff, int len); - - /** - * close the digest, producing the final digest value. The doFinal - * call leaves the digest reset. - * - * @param out the array the digest is to be copied into. - * @param outOff the offset into the out array the digest is to start at. - */ - public int doFinal(byte[] out, int outOff); - - /** - * reset the digest back to it's initial state. - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/EphemeralKeyPair.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/EphemeralKeyPair.java deleted file mode 100644 index 28d03b3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/EphemeralKeyPair.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto; - -public class EphemeralKeyPair -{ - private AsymmetricCipherKeyPair keyPair; - private KeyEncoder publicKeyEncoder; - - public EphemeralKeyPair(AsymmetricCipherKeyPair keyPair, KeyEncoder publicKeyEncoder) - { - this.keyPair = keyPair; - this.publicKeyEncoder = publicKeyEncoder; - } - - public AsymmetricCipherKeyPair getKeyPair() - { - return keyPair; - } - - public byte[] getEncodedPublicKey() - { - return publicKeyEncoder.getEncoded(keyPair.getPublic()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/ExtendedDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/ExtendedDigest.java deleted file mode 100644 index 07eef70..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/ExtendedDigest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.bc.crypto; - -public interface ExtendedDigest - extends Digest -{ - /** - * Return the size in bytes of the internal buffer the digest applies it's compression - * function to. - * - * @return byte length of the digests internal buffer. - */ - public int getByteLength(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/InvalidCipherTextException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/InvalidCipherTextException.java deleted file mode 100644 index 48c9f9b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/InvalidCipherTextException.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.bc.crypto; - -/** - * this exception is thrown whenever we find something we don't expect in a - * message. - */ -public class InvalidCipherTextException - extends CryptoException -{ - /** - * base constructor. - */ - public InvalidCipherTextException() - { - } - - /** - * create a InvalidCipherTextException with the given message. - * - * @param message the message to be carried with the exception. - */ - public InvalidCipherTextException( - String message) - { - super(message); - } - - /** - * create a InvalidCipherTextException with the given message. - * - * @param message the message to be carried with the exception. - * @param cause the root cause of the exception. - */ - public InvalidCipherTextException( - String message, - Throwable cause) - { - super(message, cause); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyEncoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyEncoder.java deleted file mode 100644 index 1164ae9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyEncoder.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.crypto; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -public interface KeyEncoder -{ - byte[] getEncoded(AsymmetricKeyParameter keyParameter); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyGenerationParameters.java deleted file mode 100644 index dff6433..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyGenerationParameters.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto; - -import java.security.SecureRandom; - -/** - * The base class for parameters to key generators. - */ -public class KeyGenerationParameters -{ - private SecureRandom random; - private int strength; - - /** - * initialise the generator with a source of randomness - * and a strength (in bits). - * - * @param random the random byte source. - * @param strength the size, in bits, of the keys we want to produce. - */ - public KeyGenerationParameters( - SecureRandom random, - int strength) - { - this.random = random; - this.strength = strength; - } - - /** - * return the random source associated with this - * generator. - * - * @return the generators random source. - */ - public SecureRandom getRandom() - { - return random; - } - - /** - * return the bit strength for keys produced by this generator, - * - * @return the strength of the keys this generator produces (in bits). - */ - public int getStrength() - { - return strength; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyParser.java deleted file mode 100644 index a5634cd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/KeyParser.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.crypto; - -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -public interface KeyParser -{ - AsymmetricKeyParameter readKey(InputStream stream) - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Mac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Mac.java deleted file mode 100644 index 09f18af..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Mac.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.crypto; - - -/** - * The base interface for implementations of message authentication codes (MACs). - */ -public interface Mac -{ - /** - * Initialise the MAC. - * - * @param params the key and other data required by the MAC. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init(CipherParameters params) - throws IllegalArgumentException; - - /** - * Return the name of the algorithm the MAC implements. - * - * @return the name of the algorithm the MAC implements. - */ - public String getAlgorithmName(); - - /** - * Return the block size for this MAC (in bytes). - * - * @return the block size for this MAC in bytes. - */ - public int getMacSize(); - - /** - * add a single byte to the mac for processing. - * - * @param in the byte to be processed. - * @exception IllegalStateException if the MAC is not initialised. - */ - public void update(byte in) - throws IllegalStateException; - - /** - * @param in the array containing the input. - * @param inOff the index in the array the data begins at. - * @param len the length of the input starting at inOff. - * @exception IllegalStateException if the MAC is not initialised. - * @exception DataLengthException if there isn't enough data in in. - */ - public void update(byte[] in, int inOff, int len) - throws DataLengthException, IllegalStateException; - - /** - * Compute the final stage of the MAC writing the output to the out - * parameter. - *

    - * doFinal leaves the MAC in the same state it was after the last init. - * - * @param out the array the MAC is to be output to. - * @param outOff the offset into the out buffer the output is to start at. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the MAC is not initialised. - */ - public int doFinal(byte[] out, int outOff) - throws DataLengthException, IllegalStateException; - - /** - * Reset the MAC. At the end of resetting the MAC should be in the - * in the same state it was after the last init (if there was one). - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/MaxBytesExceededException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/MaxBytesExceededException.java deleted file mode 100644 index dd3fc14..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/MaxBytesExceededException.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.bc.crypto; - -/** - * this exception is thrown whenever a cipher requires a change of key, iv - * or similar after x amount of bytes enciphered - */ -public class MaxBytesExceededException - extends RuntimeCryptoException -{ - /** - * base constructor. - */ - public MaxBytesExceededException() - { - } - - /** - * create an with the given message. - * - * @param message the message to be carried with the exception. - */ - public MaxBytesExceededException( - String message) - { - super(message); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/OutputLengthException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/OutputLengthException.java deleted file mode 100644 index 5de00ce..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/OutputLengthException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.crypto; - -public class OutputLengthException - extends DataLengthException -{ - public OutputLengthException(String msg) - { - super(msg); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/PBEParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/PBEParametersGenerator.java deleted file mode 100644 index 549edd7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/PBEParametersGenerator.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.bc.crypto; - -import org.bc.util.Strings; - -/** - * super class for all Password Based Encryption (PBE) parameter generator classes. - */ -public abstract class PBEParametersGenerator -{ - protected byte[] password; - protected byte[] salt; - protected int iterationCount; - - /** - * base constructor. - */ - protected PBEParametersGenerator() - { - } - - /** - * initialise the PBE generator. - * - * @param password the password converted into bytes (see below). - * @param salt the salt to be mixed with the password. - * @param iterationCount the number of iterations the "mixing" function - * is to be applied for. - */ - public void init( - byte[] password, - byte[] salt, - int iterationCount) - { - this.password = password; - this.salt = salt; - this.iterationCount = iterationCount; - } - - /** - * return the password byte array. - * - * @return the password byte array. - */ - public byte[] getPassword() - { - return password; - } - - /** - * return the salt byte array. - * - * @return the salt byte array. - */ - public byte[] getSalt() - { - return salt; - } - - /** - * return the iteration count. - * - * @return the iteration count. - */ - public int getIterationCount() - { - return iterationCount; - } - - /** - * generate derived parameters for a key of length keySize. - * - * @param keySize the length, in bits, of the key required. - * @return a parameters object representing a key. - */ - public abstract CipherParameters generateDerivedParameters(int keySize); - - /** - * generate derived parameters for a key of length keySize, and - * an initialisation vector (IV) of length ivSize. - * - * @param keySize the length, in bits, of the key required. - * @param ivSize the length, in bits, of the iv required. - * @return a parameters object representing a key and an IV. - */ - public abstract CipherParameters generateDerivedParameters(int keySize, int ivSize); - - /** - * generate derived parameters for a key of length keySize, specifically - * for use with a MAC. - * - * @param keySize the length, in bits, of the key required. - * @return a parameters object representing a key. - */ - public abstract CipherParameters generateDerivedMacParameters(int keySize); - - /** - * converts a password to a byte array according to the scheme in - * PKCS5 (ascii, no padding) - * - * @param password a character array representing the password. - * @return a byte array representing the password. - */ - public static byte[] PKCS5PasswordToBytes( - char[] password) - { - if (password != null) - { - byte[] bytes = new byte[password.length]; - - for (int i = 0; i != bytes.length; i++) - { - bytes[i] = (byte)password[i]; - } - - return bytes; - } - else - { - return new byte[0]; - } - } - - /** - * converts a password to a byte array according to the scheme in - * PKCS5 (UTF-8, no padding) - * - * @param password a character array representing the password. - * @return a byte array representing the password. - */ - public static byte[] PKCS5PasswordToUTF8Bytes( - char[] password) - { - return Strings.toUTF8ByteArray(password); - } - - /** - * converts a password to a byte array according to the scheme in - * PKCS12 (unicode, big endian, 2 zero pad bytes at the end). - * - * @param password a character array representing the password. - * @return a byte array representing the password. - */ - public static byte[] PKCS12PasswordToBytes( - char[] password) - { - if (password != null && password.length > 0) - { - // +1 for extra 2 pad bytes. - byte[] bytes = new byte[(password.length + 1) * 2]; - - for (int i = 0; i != password.length; i ++) - { - bytes[i * 2] = (byte)(password[i] >>> 8); - bytes[i * 2 + 1] = (byte)password[i]; - } - - return bytes; - } - else - { - return new byte[0]; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/RuntimeCryptoException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/RuntimeCryptoException.java deleted file mode 100644 index 98daa3a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/RuntimeCryptoException.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.crypto; - -/** - * the foundation class for the exceptions thrown by the crypto packages. - */ -public class RuntimeCryptoException - extends RuntimeException -{ - /** - * base constructor. - */ - public RuntimeCryptoException() - { - } - - /** - * create a RuntimeCryptoException with the given message. - * - * @param message the message to be carried with the exception. - */ - public RuntimeCryptoException( - String message) - { - super(message); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Signer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Signer.java deleted file mode 100644 index b1d8bc8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Signer.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.bc.crypto; - -/** - * Generic signer interface for hash based and message recovery signers. - */ -public interface Signer -{ - /** - * Initialise the signer for signing or verification. - * - * @param forSigning true if for signing, false otherwise - * @param param necessary parameters. - */ - public void init(boolean forSigning, CipherParameters param); - - /** - * update the internal digest with the byte b - */ - public void update(byte b); - - /** - * update the internal digest with the byte array in - */ - public void update(byte[] in, int off, int len); - - /** - * generate a signature for the message we've been loaded with using - * the key we were initialised with. - */ - public byte[] generateSignature() - throws CryptoException, DataLengthException; - - /** - * return true if the internal state represents the signature described - * in the passed in array. - */ - public boolean verifySignature(byte[] signature); - - /** - * reset the internal state - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/SignerWithRecovery.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/SignerWithRecovery.java deleted file mode 100644 index 1407e32..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/SignerWithRecovery.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.bc.crypto; - -/** - * Signer with message recovery. - */ -public interface SignerWithRecovery - extends Signer -{ - /** - * Returns true if the signer has recovered the full message as - * part of signature verification. - * - * @return true if full message recovered. - */ - public boolean hasFullMessage(); - - /** - * Returns a reference to what message was recovered (if any). - * - * @return full/partial message, null if nothing. - */ - public byte[] getRecoveredMessage(); - - /** - * Perform an update with the recovered message before adding any other data. This must - * be the first update method called, and calling it will result in the signer assuming - * that further calls to update will include message content past what is recoverable. - * - * @param signature the signature that we are in the process of verifying. - * @throws IllegalStateException - */ - public void updateWithRecoveredMessage(byte[] signature) - throws InvalidCipherTextException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamBlockCipher.java deleted file mode 100644 index e04723e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamBlockCipher.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.bc.crypto; - -/** - * a wrapper for block ciphers with a single byte block size, so that they - * can be treated like stream ciphers. - */ -public class StreamBlockCipher - implements StreamCipher -{ - private BlockCipher cipher; - - private byte[] oneByte = new byte[1]; - - /** - * basic constructor. - * - * @param cipher the block cipher to be wrapped. - * @exception IllegalArgumentException if the cipher has a block size other than - * one. - */ - public StreamBlockCipher( - BlockCipher cipher) - { - if (cipher.getBlockSize() != 1) - { - throw new IllegalArgumentException("block cipher block size != 1."); - } - - this.cipher = cipher; - } - - /** - * initialise the underlying cipher. - * - * @param forEncryption true if we are setting up for encryption, false otherwise. - * @param params the necessary parameters for the underlying cipher to be initialised. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - cipher.init(forEncryption, params); - } - - /** - * return the name of the algorithm we are wrapping. - * - * @return the name of the algorithm we are wrapping. - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName(); - } - - /** - * encrypt/decrypt a single byte returning the result. - * - * @param in the byte to be processed. - * @return the result of processing the input byte. - */ - public byte returnByte( - byte in) - { - oneByte[0] = in; - - cipher.processBlock(oneByte, 0, oneByte, 0); - - return oneByte[0]; - } - - /** - * process a block of bytes from in putting the result into out. - * - * @param in the input byte array. - * @param inOff the offset into the in array where the data to be processed starts. - * @param len the number of bytes to be processed. - * @param out the output buffer the processed bytes go into. - * @param outOff the offset into the output byte array the processed data stars at. - * @exception DataLengthException if the output buffer is too small. - */ - public void processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - throws DataLengthException - { - if (outOff + len > out.length) - { - throw new DataLengthException("output buffer too small in processBytes()"); - } - - for (int i = 0; i != len; i++) - { - cipher.processBlock(in, inOff + i, out, outOff + i); - } - } - - /** - * reset the underlying cipher. This leaves it in the same state - * it was at after the last init (if there was one). - */ - public void reset() - { - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamCipher.java deleted file mode 100644 index 6335363..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/StreamCipher.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bc.crypto; - -/** - * the interface stream ciphers conform to. - */ -public interface StreamCipher -{ - /** - * Initialise the cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException; - - /** - * Return the name of the algorithm the cipher implements. - * - * @return the name of the algorithm the cipher implements. - */ - public String getAlgorithmName(); - - /** - * encrypt/decrypt a single byte returning the result. - * - * @param in the byte to be processed. - * @return the result of processing the input byte. - */ - public byte returnByte(byte in); - - /** - * process a block of bytes from in putting the result into out. - * - * @param in the input byte array. - * @param inOff the offset into the in array where the data to be processed starts. - * @param len the number of bytes to be processed. - * @param out the output buffer the processed bytes go into. - * @param outOff the offset into the output byte array the processed data starts at. - * @exception DataLengthException if the output buffer is too small. - */ - public void processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) - throws DataLengthException; - - /** - * reset the cipher. This leaves it in the same state - * it was at after the last init (if there was one). - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Wrapper.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Wrapper.java deleted file mode 100644 index 7868a30..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/Wrapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto; - -public interface Wrapper -{ - public void init(boolean forWrapping, CipherParameters param); - - /** - * Return the name of the algorithm the wrapper implements. - * - * @return the name of the algorithm the wrapper implements. - */ - public String getAlgorithmName(); - - public byte[] wrap(byte[] in, int inOff, int inLen); - - public byte[] unwrap(byte[] in, int inOff, int inLen) - throws InvalidCipherTextException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHAgreement.java deleted file mode 100644 index 9d6aa2a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHAgreement.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.bc.crypto.agreement; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.generators.DHKeyPairGenerator; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHKeyGenerationParameters; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; - -/** - * a Diffie-Hellman key exchange engine. - *

    - * note: This uses MTI/A0 key agreement in order to make the key agreement - * secure against passive attacks. If you're doing Diffie-Hellman and both - * parties have long term public keys you should look at using this. For - * further information have a look at RFC 2631. - *

    - * It's possible to extend this to more than two parties as well, for the moment - * that is left as an exercise for the reader. - */ -public class DHAgreement -{ - private DHPrivateKeyParameters key; - private DHParameters dhParams; - private BigInteger privateValue; - private SecureRandom random; - - public void init( - CipherParameters param) - { - AsymmetricKeyParameter kParam; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - kParam = (AsymmetricKeyParameter)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - kParam = (AsymmetricKeyParameter)param; - } - - - if (!(kParam instanceof DHPrivateKeyParameters)) - { - throw new IllegalArgumentException("DHEngine expects DHPrivateKeyParameters"); - } - - this.key = (DHPrivateKeyParameters)kParam; - this.dhParams = key.getParameters(); - } - - /** - * calculate our initial message. - */ - public BigInteger calculateMessage() - { - DHKeyPairGenerator dhGen = new DHKeyPairGenerator(); - dhGen.init(new DHKeyGenerationParameters(random, dhParams)); - AsymmetricCipherKeyPair dhPair = dhGen.generateKeyPair(); - - this.privateValue = ((DHPrivateKeyParameters)dhPair.getPrivate()).getX(); - - return ((DHPublicKeyParameters)dhPair.getPublic()).getY(); - } - - /** - * given a message from a given party and the corresponding public key, - * calculate the next message in the agreement sequence. In this case - * this will represent the shared secret. - */ - public BigInteger calculateAgreement( - DHPublicKeyParameters pub, - BigInteger message) - { - if (!pub.getParameters().equals(dhParams)) - { - throw new IllegalArgumentException("Diffie-Hellman public key has wrong parameters."); - } - - BigInteger p = dhParams.getP(); - - return message.modPow(key.getX(), p).multiply(pub.getY().modPow(privateValue, p)).mod(p); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHBasicAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHBasicAgreement.java deleted file mode 100644 index 85871aa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/DHBasicAgreement.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.bc.crypto.agreement; - -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; - -/** - * a Diffie-Hellman key agreement class. - *

    - * note: This is only the basic algorithm, it doesn't take advantage of - * long term public keys if they are available. See the DHAgreement class - * for a "better" implementation. - */ -public class DHBasicAgreement - implements BasicAgreement -{ - private DHPrivateKeyParameters key; - private DHParameters dhParams; - - public void init( - CipherParameters param) - { - AsymmetricKeyParameter kParam; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - kParam = (AsymmetricKeyParameter)rParam.getParameters(); - } - else - { - kParam = (AsymmetricKeyParameter)param; - } - - if (!(kParam instanceof DHPrivateKeyParameters)) - { - throw new IllegalArgumentException("DHEngine expects DHPrivateKeyParameters"); - } - - this.key = (DHPrivateKeyParameters)kParam; - this.dhParams = key.getParameters(); - } - - public int getFieldSize() - { - return (key.getParameters().getP().bitLength() + 7) / 8; - } - - /** - * given a short term public key from a given party calculate the next - * message in the agreement sequence. - */ - public BigInteger calculateAgreement( - CipherParameters pubKey) - { - DHPublicKeyParameters pub = (DHPublicKeyParameters)pubKey; - - if (!pub.getParameters().equals(dhParams)) - { - throw new IllegalArgumentException("Diffie-Hellman public key has wrong parameters."); - } - - return pub.getY().modPow(key.getX(), dhParams.getP()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHBasicAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHBasicAgreement.java deleted file mode 100644 index 6d98ce9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHBasicAgreement.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.crypto.agreement; - -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.math.ec.ECPoint; - -/** - * P1363 7.2.1 ECSVDP-DH - * - * ECSVDP-DH is Elliptic Curve Secret Value Derivation Primitive, - * Diffie-Hellman version. It is based on the work of [DH76], [Mil86], - * and [Kob87]. This primitive derives a shared secret value from one - * party's private key and another party's public key, where both have - * the same set of EC domain parameters. If two parties correctly - * execute this primitive, they will produce the same output. This - * primitive can be invoked by a scheme to derive a shared secret key; - * specifically, it may be used with the schemes ECKAS-DH1 and - * DL/ECKAS-DH2. It assumes that the input keys are valid (see also - * Section 7.2.2). - */ -public class ECDHBasicAgreement - implements BasicAgreement -{ - private ECPrivateKeyParameters key; - - public void init( - CipherParameters key) - { - this.key = (ECPrivateKeyParameters)key; - } - - public int getFieldSize() - { - return (key.getParameters().getCurve().getFieldSize() + 7) / 8; - } - - public BigInteger calculateAgreement( - CipherParameters pubKey) - { - ECPublicKeyParameters pub = (ECPublicKeyParameters)pubKey; - ECPoint P = pub.getQ().multiply(key.getD()); - - // if (p.isInfinity()) throw new RuntimeException("d*Q == infinity"); - - return P.getX().toBigInteger(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHCBasicAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHCBasicAgreement.java deleted file mode 100644 index 279ffc0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECDHCBasicAgreement.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.bc.crypto.agreement; - -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.math.ec.ECPoint; - -/** - * P1363 7.2.2 ECSVDP-DHC - * - * ECSVDP-DHC is Elliptic Curve Secret Value Derivation Primitive, - * Diffie-Hellman version with cofactor multiplication. It is based on - * the work of [DH76], [Mil86], [Kob87], [LMQ98] and [Kal98a]. This - * primitive derives a shared secret value from one party's private key - * and another party's public key, where both have the same set of EC - * domain parameters. If two parties correctly execute this primitive, - * they will produce the same output. This primitive can be invoked by a - * scheme to derive a shared secret key; specifically, it may be used - * with the schemes ECKAS-DH1 and DL/ECKAS-DH2. It does not assume the - * validity of the input public key (see also Section 7.2.1). - *

    - * Note: As stated P1363 compatibility mode with ECDH can be preset, and - * in this case the implementation doesn't have a ECDH compatibility mode - * (if you want that just use ECDHBasicAgreement and note they both implement - * BasicAgreement!). - */ -public class ECDHCBasicAgreement - implements BasicAgreement -{ - ECPrivateKeyParameters key; - - public void init( - CipherParameters key) - { - this.key = (ECPrivateKeyParameters)key; - } - - public int getFieldSize() - { - return (key.getParameters().getCurve().getFieldSize() + 7) / 8; - } - - public BigInteger calculateAgreement( - CipherParameters pubKey) - { - ECPublicKeyParameters pub = (ECPublicKeyParameters)pubKey; - ECDomainParameters params = pub.getParameters(); - ECPoint P = pub.getQ().multiply(params.getH().multiply(key.getD())); - - // if (p.isInfinity()) throw new RuntimeException("Invalid public key"); - - return P.getX().toBigInteger(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECMQVBasicAgreement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECMQVBasicAgreement.java deleted file mode 100644 index 9599535..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/ECMQVBasicAgreement.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.crypto.agreement; - -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.MQVPrivateParameters; -import org.bc.crypto.params.MQVPublicParameters; -import org.bc.math.ec.ECAlgorithms; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECPoint; - -public class ECMQVBasicAgreement - implements BasicAgreement -{ - MQVPrivateParameters privParams; - - public void init( - CipherParameters key) - { - this.privParams = (MQVPrivateParameters)key; - } - - public int getFieldSize() - { - return (privParams.getStaticPrivateKey().getParameters().getCurve().getFieldSize() + 7) / 8; - } - - public BigInteger calculateAgreement(CipherParameters pubKey) - { - MQVPublicParameters pubParams = (MQVPublicParameters)pubKey; - - ECPrivateKeyParameters staticPrivateKey = privParams.getStaticPrivateKey(); - - ECPoint agreement = calculateMqvAgreement(staticPrivateKey.getParameters(), staticPrivateKey, - privParams.getEphemeralPrivateKey(), privParams.getEphemeralPublicKey(), - pubParams.getStaticPublicKey(), pubParams.getEphemeralPublicKey()); - - return agreement.getX().toBigInteger(); - } - - // The ECMQV Primitive as described in SEC-1, 3.4 - private ECPoint calculateMqvAgreement( - ECDomainParameters parameters, - ECPrivateKeyParameters d1U, - ECPrivateKeyParameters d2U, - ECPublicKeyParameters Q2U, - ECPublicKeyParameters Q1V, - ECPublicKeyParameters Q2V) - { - BigInteger n = parameters.getN(); - int e = (n.bitLength() + 1) / 2; - BigInteger powE = ECConstants.ONE.shiftLeft(e); - - // The Q2U public key is optional - ECPoint q; - if (Q2U == null) - { - q = parameters.getG().multiply(d2U.getD()); - } - else - { - q = Q2U.getQ(); - } - - BigInteger x = q.getX().toBigInteger(); - BigInteger xBar = x.mod(powE); - BigInteger Q2UBar = xBar.setBit(e); - BigInteger s = d1U.getD().multiply(Q2UBar).mod(n).add(d2U.getD()).mod(n); - - BigInteger xPrime = Q2V.getQ().getX().toBigInteger(); - BigInteger xPrimeBar = xPrime.mod(powE); - BigInteger Q2VBar = xPrimeBar.setBit(e); - - BigInteger hs = parameters.getH().multiply(s).mod(n); - -// ECPoint p = Q1V.getQ().multiply(Q2VBar).add(Q2V.getQ()).multiply(hs); - ECPoint p = ECAlgorithms.sumOfTwoMultiplies( - Q1V.getQ(), Q2VBar.multiply(hs).mod(n), Q2V.getQ(), hs); - - if (p.isInfinity()) - { - throw new IllegalStateException("Infinity is not a valid agreement value for MQV"); - } - - return p; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEParticipant.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEParticipant.java deleted file mode 100644 index 486a632..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEParticipant.java +++ /dev/null @@ -1,573 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.util.Arrays; - -/** - * A participant in a Password Authenticated Key Exchange by Juggling (J-PAKE) exchange. - *

    - *

    - * The J-PAKE exchange is defined by Feng Hao and Peter Ryan in the paper - * - * "Password Authenticated Key Exchange by Juggling, 2008." - *

    - *

    - * The J-PAKE protocol is symmetric. - * There is no notion of a client or server, but rather just two participants. - * An instance of {@link JPAKEParticipant} represents one participant, and - * is the primary interface for executing the exchange. - *

    - *

    - * To execute an exchange, construct a {@link JPAKEParticipant} on each end, - * and call the following 7 methods - * (once and only once, in the given order, for each participant, sending messages between them as described): - *

      - *
    1. {@link #createRound1PayloadToSend()} - and send the payload to the other participant
    2. - *
    3. {@link #validateRound1PayloadReceived(JPAKERound1Payload)} - use the payload received from the other participant
    4. - *
    5. {@link #createRound2PayloadToSend()} - and send the payload to the other participant
    6. - *
    7. {@link #validateRound2PayloadReceived(JPAKERound2Payload)} - use the payload received from the other participant
    8. - *
    9. {@link #calculateKeyingMaterial()}
    10. - *
    11. {@link #createRound3PayloadToSend(BigInteger)} - and send the payload to the other participant
    12. - *
    13. {@link #validateRound3PayloadReceived(JPAKERound3Payload, BigInteger)} - use the payload received from the other participant
    14. - *
    - *

    - *

    - * Each side should derive a session key from the keying material returned by {@link #calculateKeyingMaterial()}. - * The caller is responsible for deriving the session key using a secure key derivation function (KDF). - *

    - *

    - * Round 3 is an optional key confirmation process. - * If you do not execute round 3, then there is no assurance that both participants are using the same key. - * (i.e. if the participants used different passwords, then their session keys will differ.) - *

    - *

    - * If the round 3 validation succeeds, then the keys are guaranteed to be the same on both sides. - *

    - *

    - * The symmetric design can easily support the asymmetric cases when one party initiates the communication. - * e.g. Sometimes the round1 payload and round2 payload may be sent in one pass. - * Also, in some cases, the key confirmation payload can be sent together with the round2 payload. - * These are the trivial techniques to optimize the communication. - *

    - *

    - * The key confirmation process is implemented as specified in - * NIST SP 800-56A Revision 1, - * Section 8.2 Unilateral Key Confirmation for Key Agreement Schemes. - *

    - *

    - * This class is stateful and NOT threadsafe. - * Each instance should only be used for ONE complete J-PAKE exchange - * (i.e. a new {@link JPAKEParticipant} should be constructed for each new J-PAKE exchange). - *

    - *

    - * See {@link JPAKEExample} for example usage. - */ -public class JPAKEParticipant -{ - /* - * Possible internal states. Used for state checking. - */ - - public static final int STATE_INITIALIZED = 0; - public static final int STATE_ROUND_1_CREATED = 10; - public static final int STATE_ROUND_1_VALIDATED = 20; - public static final int STATE_ROUND_2_CREATED = 30; - public static final int STATE_ROUND_2_VALIDATED = 40; - public static final int STATE_KEY_CALCULATED = 50; - public static final int STATE_ROUND_3_CREATED = 60; - public static final int STATE_ROUND_3_VALIDATED = 70; - - /** - * Unique identifier of this participant. - * The two participants in the exchange must NOT share the same id. - */ - private final String participantId; - - /** - * Shared secret. This only contains the secret between construction - * and the call to {@link #calculateKeyingMaterial()}. - *

    - * i.e. When {@link #calculateKeyingMaterial()} is called, this buffer overwritten with 0's, - * and the field is set to null. - */ - private char[] password; - - /** - * Digest to use during calculations. - */ - private final Digest digest; - - /** - * Source of secure random data. - */ - private final SecureRandom random; - - private final BigInteger p; - private final BigInteger q; - private final BigInteger g; - - /** - * The participantId of the other participant in this exchange. - */ - private String partnerParticipantId; - - /** - * Alice's x1 or Bob's x3. - */ - private BigInteger x1; - /** - * Alice's x2 or Bob's x4. - */ - private BigInteger x2; - /** - * Alice's g^x1 or Bob's g^x3. - */ - private BigInteger gx1; - /** - * Alice's g^x2 or Bob's g^x4. - */ - private BigInteger gx2; - /** - * Alice's g^x3 or Bob's g^x1. - */ - private BigInteger gx3; - /** - * Alice's g^x4 or Bob's g^x2. - */ - private BigInteger gx4; - /** - * Alice's B or Bob's A. - */ - private BigInteger b; - - /** - * The current state. - * See the STATE_* constants for possible values. - */ - private int state; - - /** - * Convenience constructor for a new {@link JPAKEParticipant} that uses - * the {@link JPAKEPrimeOrderGroups#NIST_3072} prime order group, - * a SHA-256 digest, and a default {@link SecureRandom} implementation. - *

    - * After construction, the {@link #getState() state} will be {@link #STATE_INITIALIZED}. - * - * @param participantId unique identifier of this participant. - * The two participants in the exchange must NOT share the same id. - * @param password shared secret. - * A defensive copy of this array is made (and cleared once {@link #calculateKeyingMaterial()} is called). - * Caller should clear the input password as soon as possible. - * @throws NullPointerException if any argument is null - * @throws IllegalArgumentException if password is empty - */ - public JPAKEParticipant( - String participantId, - char[] password) - { - this( - participantId, - password, - JPAKEPrimeOrderGroups.NIST_3072); - } - - - /** - * Convenience constructor for a new {@link JPAKEParticipant} that uses - * a SHA-256 digest and a default {@link SecureRandom} implementation. - *

    - * After construction, the {@link #getState() state} will be {@link #STATE_INITIALIZED}. - * - * @param participantId unique identifier of this participant. - * The two participants in the exchange must NOT share the same id. - * @param password shared secret. - * A defensive copy of this array is made (and cleared once {@link #calculateKeyingMaterial()} is called). - * Caller should clear the input password as soon as possible. - * @param group prime order group. - * See {@link JPAKEPrimeOrderGroups} for standard groups - * @throws NullPointerException if any argument is null - * @throws IllegalArgumentException if password is empty - */ - public JPAKEParticipant( - String participantId, - char[] password, - JPAKEPrimeOrderGroup group) - { - this( - participantId, - password, - group, - new SHA256Digest(), - new SecureRandom()); - } - - - /** - * Construct a new {@link JPAKEParticipant}. - *

    - * After construction, the {@link #getState() state} will be {@link #STATE_INITIALIZED}. - * - * @param participantId unique identifier of this participant. - * The two participants in the exchange must NOT share the same id. - * @param password shared secret. - * A defensive copy of this array is made (and cleared once {@link #calculateKeyingMaterial()} is called). - * Caller should clear the input password as soon as possible. - * @param group prime order group. - * See {@link JPAKEPrimeOrderGroups} for standard groups - * @param digest digest to use during zero knowledge proofs and key confirmation (SHA-256 or stronger preferred) - * @param random source of secure random data for x1 and x2, and for the zero knowledge proofs - * @throws NullPointerException if any argument is null - * @throws IllegalArgumentException if password is empty - */ - public JPAKEParticipant( - String participantId, - char[] password, - JPAKEPrimeOrderGroup group, - Digest digest, - SecureRandom random) - { - JPAKEUtil.validateNotNull(participantId, "participantId"); - JPAKEUtil.validateNotNull(password, "password"); - JPAKEUtil.validateNotNull(group, "p"); - JPAKEUtil.validateNotNull(digest, "digest"); - JPAKEUtil.validateNotNull(random, "random"); - if (password.length == 0) - { - throw new IllegalArgumentException("Password must not be empty."); - } - - this.participantId = participantId; - - /* - * Create a defensive copy so as to fully encapsulate the password. - * - * This array will contain the password for the lifetime of this - * participant BEFORE {@link #calculateKeyingMaterial()} is called. - * - * i.e. When {@link #calculateKeyingMaterial()} is called, the array will be cleared - * in order to remove the password from memory. - * - * The caller is responsible for clearing the original password array - * given as input to this constructor. - */ - this.password = Arrays.copyOf(password, password.length); - - this.p = group.getP(); - this.q = group.getQ(); - this.g = group.getG(); - - this.digest = digest; - this.random = random; - - this.state = STATE_INITIALIZED; - } - - /** - * Gets the current state of this participant. - * See the STATE_* constants for possible values. - */ - public int getState() - { - return this.state; - } - - /** - * Creates and returns the payload to send to the other participant during round 1. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_1_CREATED}. - */ - public JPAKERound1Payload createRound1PayloadToSend() - { - if (this.state >= STATE_ROUND_1_CREATED) - { - throw new IllegalStateException("Round1 payload already created for " + participantId); - } - - this.x1 = JPAKEUtil.generateX1(q, random); - this.x2 = JPAKEUtil.generateX2(q, random); - - this.gx1 = JPAKEUtil.calculateGx(p, g, x1); - this.gx2 = JPAKEUtil.calculateGx(p, g, x2); - BigInteger[] knowledgeProofForX1 = JPAKEUtil.calculateZeroKnowledgeProof(p, q, g, gx1, x1, participantId, digest, random); - BigInteger[] knowledgeProofForX2 = JPAKEUtil.calculateZeroKnowledgeProof(p, q, g, gx2, x2, participantId, digest, random); - - this.state = STATE_ROUND_1_CREATED; - - return new JPAKERound1Payload(participantId, gx1, gx2, knowledgeProofForX1, knowledgeProofForX2); - } - - /** - * Validates the payload received from the other participant during round 1. - *

    - *

    - * Must be called prior to {@link #createRound2PayloadToSend()}. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_1_VALIDATED}. - * - * @throws CryptoException if validation fails. - * @throws IllegalStateException if called multiple times. - */ - public void validateRound1PayloadReceived(JPAKERound1Payload round1PayloadReceived) - throws CryptoException - { - if (this.state >= STATE_ROUND_1_VALIDATED) - { - throw new IllegalStateException("Validation already attempted for round1 payload for" + participantId); - } - this.partnerParticipantId = round1PayloadReceived.getParticipantId(); - this.gx3 = round1PayloadReceived.getGx1(); - this.gx4 = round1PayloadReceived.getGx2(); - - BigInteger[] knowledgeProofForX3 = round1PayloadReceived.getKnowledgeProofForX1(); - BigInteger[] knowledgeProofForX4 = round1PayloadReceived.getKnowledgeProofForX2(); - - JPAKEUtil.validateParticipantIdsDiffer(participantId, round1PayloadReceived.getParticipantId()); - JPAKEUtil.validateGx4(gx4); - JPAKEUtil.validateZeroKnowledgeProof(p, q, g, gx3, knowledgeProofForX3, round1PayloadReceived.getParticipantId(), digest); - JPAKEUtil.validateZeroKnowledgeProof(p, q, g, gx4, knowledgeProofForX4, round1PayloadReceived.getParticipantId(), digest); - - this.state = STATE_ROUND_1_VALIDATED; - } - - /** - * Creates and returns the payload to send to the other participant during round 2. - *

    - *

    - * {@link #validateRound1PayloadReceived(JPAKERound1Payload)} must be called prior to this method. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_2_CREATED}. - * - * @throws IllegalStateException if called prior to {@link #validateRound1PayloadReceived(JPAKERound1Payload)}, or multiple times - */ - public JPAKERound2Payload createRound2PayloadToSend() - { - if (this.state >= STATE_ROUND_2_CREATED) - { - throw new IllegalStateException("Round2 payload already created for " + this.participantId); - } - if (this.state < STATE_ROUND_1_VALIDATED) - { - throw new IllegalStateException("Round1 payload must be validated prior to creating Round2 payload for " + this.participantId); - } - BigInteger gA = JPAKEUtil.calculateGA(p, gx1, gx3, gx4); - BigInteger s = JPAKEUtil.calculateS(password); - BigInteger x2s = JPAKEUtil.calculateX2s(q, x2, s); - BigInteger A = JPAKEUtil.calculateA(p, q, gA, x2s); - BigInteger[] knowledgeProofForX2s = JPAKEUtil.calculateZeroKnowledgeProof(p, q, gA, A, x2s, participantId, digest, random); - - this.state = STATE_ROUND_2_CREATED; - - return new JPAKERound2Payload(participantId, A, knowledgeProofForX2s); - } - - /** - * Validates the payload received from the other participant during round 2. - *

    - *

    - * Note that this DOES NOT detect a non-common password. - * The only indication of a non-common password is through derivation - * of different keys (which can be detected explicitly by executing round 3 and round 4) - *

    - *

    - * Must be called prior to {@link #calculateKeyingMaterial()}. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_2_VALIDATED}. - * - * @throws CryptoException if validation fails. - * @throws IllegalStateException if called prior to {@link #validateRound1PayloadReceived(JPAKERound1Payload)}, or multiple times - */ - public void validateRound2PayloadReceived(JPAKERound2Payload round2PayloadReceived) - throws CryptoException - { - if (this.state >= STATE_ROUND_2_VALIDATED) - { - throw new IllegalStateException("Validation already attempted for round2 payload for" + participantId); - } - if (this.state < STATE_ROUND_1_VALIDATED) - { - throw new IllegalStateException("Round1 payload must be validated prior to validating Round2 payload for " + this.participantId); - } - BigInteger gB = JPAKEUtil.calculateGA(p, gx3, gx1, gx2); - this.b = round2PayloadReceived.getA(); - BigInteger[] knowledgeProofForX4s = round2PayloadReceived.getKnowledgeProofForX2s(); - - JPAKEUtil.validateParticipantIdsDiffer(participantId, round2PayloadReceived.getParticipantId()); - JPAKEUtil.validateParticipantIdsEqual(this.partnerParticipantId, round2PayloadReceived.getParticipantId()); - JPAKEUtil.validateGa(gB); - JPAKEUtil.validateZeroKnowledgeProof(p, q, gB, b, knowledgeProofForX4s, round2PayloadReceived.getParticipantId(), digest); - - this.state = STATE_ROUND_2_VALIDATED; - } - - /** - * Calculates and returns the key material. - * A session key must be derived from this key material using a secure key derivation function (KDF). - * The KDF used to derive the key is handled externally (i.e. not by {@link JPAKEParticipant}). - *

    - *

    - * The keying material will be identical for each participant if and only if - * each participant's password is the same. i.e. If the participants do not - * share the same password, then each participant will derive a different key. - * Therefore, if you immediately start using a key derived from - * the keying material, then you must handle detection of incorrect keys. - * If you want to handle this detection explicitly, you can optionally perform - * rounds 3 and 4. See {@link JPAKEParticipant} for details on how to execute - * rounds 3 and 4. - *

    - *

    - * The keying material will be in the range [0, p-1]. - *

    - *

    - * {@link #validateRound2PayloadReceived(JPAKERound2Payload)} must be called prior to this method. - *

    - *

    - * As a side effect, the internal {@link #password} array is cleared, since it is no longer needed. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_KEY_CALCULATED}. - * - * @throws IllegalStateException if called prior to {@link #validateRound2PayloadReceived(JPAKERound2Payload)}, - * or if called multiple times. - */ - public BigInteger calculateKeyingMaterial() - { - if (this.state >= STATE_KEY_CALCULATED) - { - throw new IllegalStateException("Key already calculated for " + participantId); - } - if (this.state < STATE_ROUND_2_VALIDATED) - { - throw new IllegalStateException("Round2 payload must be validated prior to creating key for " + participantId); - } - BigInteger s = JPAKEUtil.calculateS(password); - - /* - * Clear the password array from memory, since we don't need it anymore. - * - * Also set the field to null as a flag to indicate that the key has already been calculated. - */ - Arrays.fill(password, (char)0); - this.password = null; - - BigInteger keyingMaterial = JPAKEUtil.calculateKeyingMaterial(p, q, gx4, x2, s, b); - - /* - * Clear the ephemeral private key fields as well. - * Note that we're relying on the garbage collector to do its job to clean these up. - * The old objects will hang around in memory until the garbage collector destroys them. - * - * If the ephemeral private keys x1 and x2 are leaked, - * the attacker might be able to brute-force the password. - */ - this.x1 = null; - this.x2 = null; - this.b = null; - - /* - * Do not clear gx* yet, since those are needed by round 3. - */ - - this.state = STATE_KEY_CALCULATED; - - return keyingMaterial; - } - - - /** - * Creates and returns the payload to send to the other participant during round 3. - *

    - *

    - * See {@link JPAKEParticipant} for more details on round 3. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_3_CREATED}. - * - * @param keyingMaterial The keying material as returned from {@link #calculateKeyingMaterial()}. - * @throws IllegalStateException if called prior to {@link #calculateKeyingMaterial()}, or multiple times - */ - public JPAKERound3Payload createRound3PayloadToSend(BigInteger keyingMaterial) - { - if (this.state >= STATE_ROUND_3_CREATED) - { - throw new IllegalStateException("Round3 payload already created for " + this.participantId); - } - if (this.state < STATE_KEY_CALCULATED) - { - throw new IllegalStateException("Keying material must be calculated prior to creating Round3 payload for " + this.participantId); - } - - BigInteger macTag = JPAKEUtil.calculateMacTag( - this.participantId, - this.partnerParticipantId, - this.gx1, - this.gx2, - this.gx3, - this.gx4, - keyingMaterial, - this.digest); - - this.state = STATE_ROUND_3_CREATED; - - return new JPAKERound3Payload(participantId, macTag); - } - - /** - * Validates the payload received from the other participant during round 3. - *

    - *

    - * See {@link JPAKEParticipant} for more details on round 3. - *

    - *

    - * After execution, the {@link #getState() state} will be {@link #STATE_ROUND_3_VALIDATED}. - * - * @param keyingMaterial The keying material as returned from {@link #calculateKeyingMaterial()}. - * @throws CryptoException if validation fails. - * @throws IllegalStateException if called prior to {@link #calculateKeyingMaterial()}, or multiple times - */ - public void validateRound3PayloadReceived(JPAKERound3Payload round3PayloadReceived, BigInteger keyingMaterial) - throws CryptoException - { - if (this.state >= STATE_ROUND_3_VALIDATED) - { - throw new IllegalStateException("Validation already attempted for round3 payload for" + participantId); - } - if (this.state < STATE_KEY_CALCULATED) - { - throw new IllegalStateException("Keying material must be calculated validated prior to validating Round3 payload for " + this.participantId); - } - JPAKEUtil.validateParticipantIdsDiffer(participantId, round3PayloadReceived.getParticipantId()); - JPAKEUtil.validateParticipantIdsEqual(this.partnerParticipantId, round3PayloadReceived.getParticipantId()); - - JPAKEUtil.validateMacTag( - this.participantId, - this.partnerParticipantId, - this.gx1, - this.gx2, - this.gx3, - this.gx4, - keyingMaterial, - this.digest, - round3PayloadReceived.getMacTag()); - - - /* - * Clear the rest of the fields. - */ - this.gx1 = null; - this.gx2 = null; - this.gx3 = null; - this.gx4 = null; - - this.state = STATE_ROUND_3_VALIDATED; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroup.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroup.java deleted file mode 100644 index 26eb5ef..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroup.java +++ /dev/null @@ -1,122 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.math.BigInteger; - -/** - * A pre-computed prime order group for use during a J-PAKE exchange. - *

    - *

    - * Typically a Schnorr group is used. In general, J-PAKE can use any prime order group - * that is suitable for public key cryptography, including elliptic curve cryptography. - *

    - *

    - * See {@link JPAKEPrimeOrderGroups} for convenient standard groups. - *

    - *

    - * NIST publishes - * many groups that can be used for the desired level of security. - */ -public class JPAKEPrimeOrderGroup -{ - private final BigInteger p; - private final BigInteger q; - private final BigInteger g; - - /** - * Constructs a new {@link JPAKEPrimeOrderGroup}. - *

    - *

    - * In general, you should use one of the pre-approved groups from - * {@link JPAKEPrimeOrderGroups}, rather than manually constructing one. - *

    - *

    - * The following basic checks are performed: - *

      - *
    • p-1 must be evenly divisible by q
    • - *
    • g must be in [2, p-1]
    • - *
    • g^q mod p must equal 1
    • - *
    • p must be prime (within reasonably certainty)
    • - *
    • q must be prime (within reasonably certainty)
    • - *
    - *

    - *

    - * The prime checks are performed using {@link BigInteger#isProbablePrime(int)}, - * and are therefore subject to the same probability guarantees. - *

    - *

    - * These checks prevent trivial mistakes. - * However, due to the small uncertainties if p and q are not prime, - * advanced attacks are not prevented. - * Use it at your own risk. - * - * @throws NullPointerException if any argument is null - * @throws IllegalArgumentException if any of the above validations fail - */ - public JPAKEPrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g) - { - /* - * Don't skip the checks on user-specified groups. - */ - this(p, q, g, false); - } - - /** - * Internal package-private constructor used by the pre-approved - * groups in {@link JPAKEPrimeOrderGroups}. - * These pre-approved groups can avoid the expensive checks. - */ - JPAKEPrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g, boolean skipChecks) - { - JPAKEUtil.validateNotNull(p, "p"); - JPAKEUtil.validateNotNull(q, "q"); - JPAKEUtil.validateNotNull(g, "g"); - - if (!skipChecks) - { - if (!p.subtract(JPAKEUtil.ONE).mod(q).equals(JPAKEUtil.ZERO)) - { - throw new IllegalArgumentException("p-1 must be evenly divisible by q"); - } - if (g.compareTo(BigInteger.valueOf(2)) == -1 || g.compareTo(p.subtract(JPAKEUtil.ONE)) == 1) - { - throw new IllegalArgumentException("g must be in [2, p-1]"); - } - if (!g.modPow(q, p).equals(JPAKEUtil.ONE)) - { - throw new IllegalArgumentException("g^q mod p must equal 1"); - } - /* - * Note that these checks do not guarantee that p and q are prime. - * We just have reasonable certainty that they are prime. - */ - if (!p.isProbablePrime(20)) - { - throw new IllegalArgumentException("p must be prime"); - } - if (!q.isProbablePrime(20)) - { - throw new IllegalArgumentException("q must be prime"); - } - } - - this.p = p; - this.q = q; - this.g = g; - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getQ() - { - return q; - } - - public BigInteger getG() - { - return g; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroups.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroups.java deleted file mode 100644 index 0da99ad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEPrimeOrderGroups.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.math.BigInteger; - -/** - * Standard pre-computed prime order groups for use by J-PAKE. - * (J-PAKE can use pre-computed prime order groups, same as DSA and Diffie-Hellman.) - *

    - *

    - * This class contains some convenient constants for use as input for - * constructing {@link JPAKEParticipant}s. - *

    - *

    - * The prime order groups below are taken from Sun's JDK JavaDoc (docs/guide/security/CryptoSpec.html#AppB), - * and from the prime order groups - * published by NIST. - */ -public class JPAKEPrimeOrderGroups -{ - /** - * From Sun's JDK JavaDoc (docs/guide/security/CryptoSpec.html#AppB) - * 1024-bit p, 160-bit q and 1024-bit g for 80-bit security. - */ - public static final JPAKEPrimeOrderGroup SUN_JCE_1024 = new JPAKEPrimeOrderGroup( - // p - new BigInteger( - "fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669" + - "455d402251fb593d8d58fabfc5f5ba30f6cb9b556cd7813b801d346ff26660b7" + - "6b9950a5a49f9fe8047b1022c24fbba9d7feb7c61bf83b57e7c6a8a6150f04fb" + - "83f6d3c51ec3023554135a169132f675f3ae2b61d72aeff22203199dd14801c7", 16), - // q - new BigInteger( - "9760508f15230bccb292b982a2eb840bf0581cf5", 16), - // g - new BigInteger( - "f7e1a085d69b3ddecbbcab5c36b857b97994afbbfa3aea82f9574c0b3d078267" + - "5159578ebad4594fe67107108180b449167123e84c281613b7cf09328cc8a6e1" + - "3c167a8b547c8d28e0a3ae1e2bb3a675916ea37f0bfa213562f1fb627a01243b" + - "cca4f1bea8519089a883dfe15ae59f06928b665e807b552564014c3bfecf492a", 16), - true - ); - - /** - * From NIST. - * 2048-bit p, 224-bit q and 2048-bit g for 112-bit security. - */ - public static final JPAKEPrimeOrderGroup NIST_2048 = new JPAKEPrimeOrderGroup( - // p - new BigInteger( - "C196BA05AC29E1F9C3C72D56DFFC6154A033F1477AC88EC37F09BE6C5BB95F51" + - "C296DD20D1A28A067CCC4D4316A4BD1DCA55ED1066D438C35AEBAABF57E7DAE4" + - "28782A95ECA1C143DB701FD48533A3C18F0FE23557EA7AE619ECACC7E0B51652" + - "A8776D02A425567DED36EABD90CA33A1E8D988F0BBB92D02D1D20290113BB562" + - "CE1FC856EEB7CDD92D33EEA6F410859B179E7E789A8F75F645FAE2E136D252BF" + - "FAFF89528945C1ABE705A38DBC2D364AADE99BE0D0AAD82E5320121496DC65B3" + - "930E38047294FF877831A16D5228418DE8AB275D7D75651CEFED65F78AFC3EA7" + - "FE4D79B35F62A0402A1117599ADAC7B269A59F353CF450E6982D3B1702D9CA83", 16), - // q - new BigInteger( - "90EAF4D1AF0708B1B612FF35E0A2997EB9E9D263C9CE659528945C0D", 16), - // g - new BigInteger( - "A59A749A11242C58C894E9E5A91804E8FA0AC64B56288F8D47D51B1EDC4D6544" + - "4FECA0111D78F35FC9FDD4CB1F1B79A3BA9CBEE83A3F811012503C8117F98E50" + - "48B089E387AF6949BF8784EBD9EF45876F2E6A5A495BE64B6E770409494B7FEE" + - "1DBB1E4B2BC2A53D4F893D418B7159592E4FFFDF6969E91D770DAEBD0B5CB14C" + - "00AD68EC7DC1E5745EA55C706C4A1C5C88964E34D09DEB753AD418C1AD0F4FDF" + - "D049A955E5D78491C0B7A2F1575A008CCD727AB376DB6E695515B05BD412F5B8" + - "C2F4C77EE10DA48ABD53F5DD498927EE7B692BBBCDA2FB23A516C5B4533D7398" + - "0B2A3B60E384ED200AE21B40D273651AD6060C13D97FD69AA13C5611A51B9085", 16), - true - ); - - /** - * From NIST. - * 3072-bit p, 256-bit q and 3072-bit g for 128-bit security. - */ - public static final JPAKEPrimeOrderGroup NIST_3072 = new JPAKEPrimeOrderGroup( - // p - new BigInteger( - "90066455B5CFC38F9CAA4A48B4281F292C260FEEF01FD61037E56258A7795A1C" + - "7AD46076982CE6BB956936C6AB4DCFE05E6784586940CA544B9B2140E1EB523F" + - "009D20A7E7880E4E5BFA690F1B9004A27811CD9904AF70420EEFD6EA11EF7DA1" + - "29F58835FF56B89FAA637BC9AC2EFAAB903402229F491D8D3485261CD068699B" + - "6BA58A1DDBBEF6DB51E8FE34E8A78E542D7BA351C21EA8D8F1D29F5D5D159394" + - "87E27F4416B0CA632C59EFD1B1EB66511A5A0FBF615B766C5862D0BD8A3FE7A0" + - "E0DA0FB2FE1FCB19E8F9996A8EA0FCCDE538175238FC8B0EE6F29AF7F642773E" + - "BE8CD5402415A01451A840476B2FCEB0E388D30D4B376C37FE401C2A2C2F941D" + - "AD179C540C1C8CE030D460C4D983BE9AB0B20F69144C1AE13F9383EA1C08504F" + - "B0BF321503EFE43488310DD8DC77EC5B8349B8BFE97C2C560EA878DE87C11E3D" + - "597F1FEA742D73EEC7F37BE43949EF1A0D15C3F3E3FC0A8335617055AC91328E" + - "C22B50FC15B941D3D1624CD88BC25F3E941FDDC6200689581BFEC416B4B2CB73", 16), - // q - new BigInteger( - "CFA0478A54717B08CE64805B76E5B14249A77A4838469DF7F7DC987EFCCFB11D", 16), - // g - new BigInteger( - "5E5CBA992E0A680D885EB903AEA78E4A45A469103D448EDE3B7ACCC54D521E37" + - "F84A4BDD5B06B0970CC2D2BBB715F7B82846F9A0C393914C792E6A923E2117AB" + - "805276A975AADB5261D91673EA9AAFFEECBFA6183DFCB5D3B7332AA19275AFA1" + - "F8EC0B60FB6F66CC23AE4870791D5982AAD1AA9485FD8F4A60126FEB2CF05DB8" + - "A7F0F09B3397F3937F2E90B9E5B9C9B6EFEF642BC48351C46FB171B9BFA9EF17" + - "A961CE96C7E7A7CC3D3D03DFAD1078BA21DA425198F07D2481622BCE45969D9C" + - "4D6063D72AB7A0F08B2F49A7CC6AF335E08C4720E31476B67299E231F8BD90B3" + - "9AC3AE3BE0C6B6CACEF8289A2E2873D58E51E029CAFBD55E6841489AB66B5B4B" + - "9BA6E2F784660896AFF387D92844CCB8B69475496DE19DA2E58259B090489AC8" + - "E62363CDF82CFD8EF2A427ABCD65750B506F56DDE3B988567A88126B914D7828" + - "E2B63A6D7ED0747EC59E0E0A23CE7D8A74C1D2C2A7AFB6A29799620F00E11C33" + - "787F7DED3B30E1A22D09F1FBDA1ABBBFBF25CAE05A13F812E34563F99410E73B", 16), - true - ); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound1Payload.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound1Payload.java deleted file mode 100644 index ba53216..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound1Payload.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.io.Serializable; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -/** - * The payload sent/received during the first round of a J-PAKE exchange. - *

    - *

    - * Each {@link JPAKEParticipant} creates and sends an instance - * of this payload to the other {@link JPAKEParticipant}. - * The payload to send should be created via - * {@link JPAKEParticipant#createRound1PayloadToSend()}. - *

    - *

    - * Each {@link JPAKEParticipant} must also validate the payload - * received from the other {@link JPAKEParticipant}. - * The received payload should be validated via - * {@link JPAKEParticipant#validateRound1PayloadReceived(JPAKERound1Payload)}. - *

    - *

    - * This class is {@link Serializable}, so you can send it via Java serialization. - * However, no specific mechanism for sending this payload to the other participant - * is required. It is perfectly safe to decompose the fields of this payload, - * send those fields to the other participant in any format, - * and reconstruct the payload on the other side using - * {@link #JPAKERound1Payload(String, BigInteger, BigInteger, BigInteger[], BigInteger[])}. - */ -public class JPAKERound1Payload - implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** - * The id of the {@link JPAKEParticipant} who created/sent this payload. - */ - private final String participantId; - - /** - * The value of g^x1 - */ - private final BigInteger gx1; - - /** - * The value of g^x2 - */ - private final BigInteger gx2; - - /** - * The zero knowledge proof for x1. - *

    - * This is a two element array, containing {g^v, r} for x1. - */ - private final BigInteger[] knowledgeProofForX1; - - /** - * The zero knowledge proof for x2. - *

    - * This is a two element array, containing {g^v, r} for x2. - */ - private final BigInteger[] knowledgeProofForX2; - - public JPAKERound1Payload( - String participantId, - BigInteger gx1, - BigInteger gx2, - BigInteger[] knowledgeProofForX1, - BigInteger[] knowledgeProofForX2) - { - JPAKEUtil.validateNotNull(participantId, "participantId"); - JPAKEUtil.validateNotNull(gx1, "gx1"); - JPAKEUtil.validateNotNull(gx2, "gx2"); - JPAKEUtil.validateNotNull(knowledgeProofForX1, "knowledgeProofForX1"); - JPAKEUtil.validateNotNull(knowledgeProofForX2, "knowledgeProofForX2"); - - this.participantId = participantId; - this.gx1 = gx1; - this.gx2 = gx2; - this.knowledgeProofForX1 = Arrays.copyOf(knowledgeProofForX1, knowledgeProofForX1.length); - this.knowledgeProofForX2 = Arrays.copyOf(knowledgeProofForX2, knowledgeProofForX2.length); - } - - public String getParticipantId() - { - return participantId; - } - - public BigInteger getGx1() - { - return gx1; - } - - public BigInteger getGx2() - { - return gx2; - } - - public BigInteger[] getKnowledgeProofForX1() - { - return Arrays.copyOf(knowledgeProofForX1, knowledgeProofForX1.length); - } - - public BigInteger[] getKnowledgeProofForX2() - { - return Arrays.copyOf(knowledgeProofForX2, knowledgeProofForX2.length); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound2Payload.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound2Payload.java deleted file mode 100644 index 6e1fea3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound2Payload.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.io.Serializable; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -/** - * The payload sent/received during the second round of a J-PAKE exchange. - *

    - *

    - * Each {@link JPAKEParticipant} creates and sends an instance - * of this payload to the other {@link JPAKEParticipant}. - * The payload to send should be created via - * {@link JPAKEParticipant#createRound2PayloadToSend()} - *

    - *

    - * Each {@link JPAKEParticipant} must also validate the payload - * received from the other {@link JPAKEParticipant}. - * The received payload should be validated via - * {@link JPAKEParticipant#validateRound2PayloadReceived(JPAKERound2Payload)} - *

    - *

    - * This class is {@link Serializable}, so you can send it via Java serialization. - * However, no specific mechanism for sending this payload to the other participant - * is required. It is perfectly safe to decompose the fields of this payload, - * send those fields to the other participant in any format, - * and reconstruct the payload on the other side using - * {@link #JPAKERound2Payload(String, BigInteger, BigInteger[])}. - */ -public class JPAKERound2Payload - implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** - * The id of the {@link JPAKEParticipant} who created/sent this payload. - */ - private final String participantId; - - /** - * The value of A, as computed during round 2. - */ - private final BigInteger a; - - /** - * The zero knowledge proof for x2 * s. - *

    - * This is a two element array, containing {g^v, r} for x2 * s. - */ - private final BigInteger[] knowledgeProofForX2s; - - public JPAKERound2Payload( - String participantId, - BigInteger a, - BigInteger[] knowledgeProofForX2s) - { - JPAKEUtil.validateNotNull(participantId, "participantId"); - JPAKEUtil.validateNotNull(a, "a"); - JPAKEUtil.validateNotNull(knowledgeProofForX2s, "knowledgeProofForX2s"); - - this.participantId = participantId; - this.a = a; - this.knowledgeProofForX2s = Arrays.copyOf(knowledgeProofForX2s, knowledgeProofForX2s.length); - } - - public String getParticipantId() - { - return participantId; - } - - public BigInteger getA() - { - return a; - } - - public BigInteger[] getKnowledgeProofForX2s() - { - return Arrays.copyOf(knowledgeProofForX2s, knowledgeProofForX2s.length); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound3Payload.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound3Payload.java deleted file mode 100644 index 7c3353c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKERound3Payload.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.io.Serializable; -import java.math.BigInteger; - -/** - * The payload sent/received during the optional third round of a J-PAKE exchange, - * which is for explicit key confirmation. - *

    - *

    - * Each {@link JPAKEParticipant} creates and sends an instance - * of this payload to the other {@link JPAKEParticipant}. - * The payload to send should be created via - * {@link JPAKEParticipant#createRound3PayloadToSend(BigInteger)} - *

    - *

    - * Each {@link JPAKEParticipant} must also validate the payload - * received from the other {@link JPAKEParticipant}. - * The received payload should be validated via - * {@link JPAKEParticipant#validateRound3PayloadReceived(JPAKERound3Payload, BigInteger)} - *

    - *

    - * This class is {@link Serializable}, so you can send it via Java serialization. - * However, no specific mechanism for sending this payload to the other participant - * is required. It is perfectly safe to decompose the fields of this payload, - * send those fields to the other participant in any format, - * and reconstruct the payload on the other side using - * {@link #JPAKERound3Payload(String, BigInteger)} - */ -public class JPAKERound3Payload - implements Serializable -{ - private static final long serialVersionUID = 1L; - - /** - * The id of the {@link JPAKEParticipant} who created/sent this payload. - */ - private final String participantId; - - /** - * The value of MacTag, as computed by round 3. - * - * @see JPAKEUtil#calculateMacTag(String, String, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, org.bouncycastle.crypto.Digest) - */ - private final BigInteger macTag; - - public JPAKERound3Payload(String participantId, BigInteger magTag) - { - this.participantId = participantId; - this.macTag = magTag; - } - - public String getParticipantId() - { - return participantId; - } - - public BigInteger getMacTag() - { - return macTag; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEUtil.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEUtil.java deleted file mode 100644 index f7c3787..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/jpake/JPAKEUtil.java +++ /dev/null @@ -1,508 +0,0 @@ -package org.bc.crypto.agreement.jpake; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.crypto.Mac; -import org.bc.crypto.macs.HMac; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Arrays; -import org.bc.util.BigIntegers; -import org.bc.util.Strings; - -/** - * Primitives needed for a J-PAKE exchange. - *

    - *

    - * The recommended way to perform a J-PAKE exchange is by using - * two {@link JPAKEParticipant}s. Internally, those participants - * call these primitive operations in {@link JPAKEUtil}. - *

    - *

    - * The primitives, however, can be used without a {@link JPAKEParticipant} - * if needed. - */ -public class JPAKEUtil -{ - static final BigInteger ZERO = BigInteger.valueOf(0); - static final BigInteger ONE = BigInteger.valueOf(1); - - /** - * Return a value that can be used as x1 or x3 during round 1. - *

    - *

    - * The returned value is a random value in the range [0, q-1]. - */ - public static BigInteger generateX1( - BigInteger q, - SecureRandom random) - { - BigInteger min = ZERO; - BigInteger max = q.subtract(ONE); - return BigIntegers.createRandomInRange(min, max, random); - } - - /** - * Return a value that can be used as x2 or x4 during round 1. - *

    - *

    - * The returned value is a random value in the range [1, q-1]. - */ - public static BigInteger generateX2( - BigInteger q, - SecureRandom random) - { - BigInteger min = ONE; - BigInteger max = q.subtract(ONE); - return BigIntegers.createRandomInRange(min, max, random); - } - - /** - * Converts the given password to a {@link BigInteger} - * for use in arithmetic calculations. - */ - public static BigInteger calculateS(char[] password) - { - return new BigInteger(Strings.toUTF8ByteArray(password)); - } - - /** - * Calculate g^x mod p as done in round 1. - */ - public static BigInteger calculateGx( - BigInteger p, - BigInteger g, - BigInteger x) - { - return g.modPow(x, p); - } - - - /** - * Calculate ga as done in round 2. - */ - public static BigInteger calculateGA( - BigInteger p, - BigInteger gx1, - BigInteger gx3, - BigInteger gx4) - { - // ga = g^(x1+x3+x4) = g^x1 * g^x3 * g^x4 - return gx1.multiply(gx3).multiply(gx4).mod(p); - } - - - /** - * Calculate x2 * s as done in round 2. - */ - public static BigInteger calculateX2s( - BigInteger q, - BigInteger x2, - BigInteger s) - { - return x2.multiply(s).mod(q); - } - - - /** - * Calculate A as done in round 2. - */ - public static BigInteger calculateA( - BigInteger p, - BigInteger q, - BigInteger gA, - BigInteger x2s) - { - // A = ga^(x*s) - return gA.modPow(x2s, p); - } - - /** - * Calculate a zero knowledge proof of x using Schnorr's signature. - * The returned array has two elements {g^v, r = v-x*h} for x. - */ - public static BigInteger[] calculateZeroKnowledgeProof( - BigInteger p, - BigInteger q, - BigInteger g, - BigInteger gx, - BigInteger x, - String participantId, - Digest digest, - SecureRandom random) - { - BigInteger[] zeroKnowledgeProof = new BigInteger[2]; - - /* Generate a random v, and compute g^v */ - BigInteger vMin = ZERO; - BigInteger vMax = q.subtract(ONE); - BigInteger v = BigIntegers.createRandomInRange(vMin, vMax, random); - - BigInteger gv = g.modPow(v, p); - BigInteger h = calculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest); // h - - zeroKnowledgeProof[0] = gv; - zeroKnowledgeProof[1] = v.subtract(x.multiply(h)).mod(q); // r = v-x*h - - return zeroKnowledgeProof; - } - - private static BigInteger calculateHashForZeroKnowledgeProof( - BigInteger g, - BigInteger gr, - BigInteger gx, - String participantId, - Digest digest) - { - digest.reset(); - - updateDigestIncludingSize(digest, g); - - updateDigestIncludingSize(digest, gr); - - updateDigestIncludingSize(digest, gx); - - updateDigestIncludingSize(digest, participantId); - - byte[] output = new byte[digest.getDigestSize()]; - digest.doFinal(output, 0); - - return new BigInteger(output); - } - - /** - * Validates that g^x4 is not 1. - * - * @throws CryptoException if g^x4 is 1 - */ - public static void validateGx4(BigInteger gx4) - throws CryptoException - { - if (gx4.equals(ONE)) - { - throw new CryptoException("g^x validation failed. g^x should not be 1."); - } - } - - /** - * Validates that ga is not 1. - *

    - *

    - * As described by Feng Hao... - *

    - *

    - * Alice could simply check ga != 1 to ensure it is a generator. - * In fact, as we will explain in Section 3, (x1 + x3 + x4 ) is random over Zq even in the face of active attacks. - * Hence, the probability for ga = 1 is extremely small - on the order of 2^160 for 160-bit q. - *
    - * - * @throws CryptoException if ga is 1 - */ - public static void validateGa(BigInteger ga) - throws CryptoException - { - if (ga.equals(ONE)) - { - throw new CryptoException("ga is equal to 1. It should not be. The chances of this happening are on the order of 2^160 for a 160-bit q. Try again."); - } - } - - /** - * Validates the zero knowledge proof (generated by - * {@link #calculateZeroKnowledgeProof(BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, String, Digest, SecureRandom)}) - * is correct. - * - * @throws CryptoException if the zero knowledge proof is not correct - */ - public static void validateZeroKnowledgeProof( - BigInteger p, - BigInteger q, - BigInteger g, - BigInteger gx, - BigInteger[] zeroKnowledgeProof, - String participantId, - Digest digest) - throws CryptoException - { - - /* sig={g^v,r} */ - BigInteger gv = zeroKnowledgeProof[0]; - BigInteger r = zeroKnowledgeProof[1]; - - BigInteger h = calculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest); - if (!(gx.compareTo(ZERO) == 1 && // g^x > 0 - gx.compareTo(p) == -1 && // g^x < p - gx.modPow(q, p).compareTo(ONE) == 0 && // g^x^q mod q = 1 - /* - * Below, I took an straightforward way to compute g^r * g^x^h, - * which needs 2 exp. Using a simultaneous computation technique - * would only need 1 exp. - */ - g.modPow(r, p).multiply(gx.modPow(h, p)).mod(p).compareTo(gv) == 0)) // g^v=g^r * g^x^h - { - throw new CryptoException("Zero-knowledge proof validation failed"); - } - } - - /** - * Calculates the keying material, which can be done after round 2 has completed. - * A session key must be derived from this key material using a secure key derivation function (KDF). - * The KDF used to derive the key is handled externally (i.e. not by {@link JPAKEParticipant}). - *

    - *

    - *

    -     * KeyingMaterial = (B/g^{x2*x4*s})^x2
    -     * 
    - */ - public static BigInteger calculateKeyingMaterial( - BigInteger p, - BigInteger q, - BigInteger gx4, - BigInteger x2, - BigInteger s, - BigInteger B) - { - return gx4.modPow(x2.multiply(s).negate().mod(q), p).multiply(B).modPow(x2, p); - } - - /** - * Validates that the given participant ids are not equal. - * (For the J-PAKE exchange, each participant must use a unique id.) - * - * @throws CryptoException if the participantId strings are equal. - */ - public static void validateParticipantIdsDiffer(String participantId1, String participantId2) - throws CryptoException - { - if (participantId1.equals(participantId2)) - { - throw new CryptoException( - "Both participants are using the same participantId (" - + participantId1 - + "). This is not allowed. " - + "Each participant must use a unique participantId."); - } - } - - /** - * Validates that the given participant ids are equal. - * This is used to ensure that the payloads received from - * each round all come from the same participant. - * - * @throws CryptoException if the participantId strings are equal. - */ - public static void validateParticipantIdsEqual(String expectedParticipantId, String actualParticipantId) - throws CryptoException - { - if (!expectedParticipantId.equals(actualParticipantId)) - { - throw new CryptoException( - "Received payload from incorrect partner (" - + actualParticipantId - + "). Expected to receive payload from " - + expectedParticipantId - + "."); - } - } - - /** - * Validates that the given object is not null. - * - * @param object object in question - * @param description name of the object (to be used in exception message) - * @throws NullPointerException if the object is null. - */ - public static void validateNotNull(Object object, String description) - { - if (object == null) - { - throw new NullPointerException(description + " must not be null"); - } - } - - /** - * Calculates the MacTag (to be used for key confirmation), as defined by - * NIST SP 800-56A Revision 1, - * Section 8.2 Unilateral Key Confirmation for Key Agreement Schemes. - *

    - *

    - *

    -     * MacTag = HMAC(MacKey, MacLen, MacData)
    -     *
    -     * MacKey = H(K || "JPAKE_KC")
    -     *
    -     * MacData = "KC_1_U" || participantId || partnerParticipantId || gx1 || gx2 || gx3 || gx4
    -     *
    -     * Note that both participants use "KC_1_U" because the sender of the round 3 message
    -     * is always the initiator for key confirmation.
    -     *
    -     * HMAC = {@link HMac} used with the given {@link Digest}
    -     * H = The given {@link Digest}
  • - * MacLen = length of MacTag - * - *

    - */ - public static BigInteger calculateMacTag( - String participantId, - String partnerParticipantId, - BigInteger gx1, - BigInteger gx2, - BigInteger gx3, - BigInteger gx4, - BigInteger keyingMaterial, - Digest digest) - { - byte[] macKey = calculateMacKey( - keyingMaterial, - digest); - - HMac mac = new HMac(digest); - byte[] macOutput = new byte[mac.getMacSize()]; - mac.init(new KeyParameter(macKey)); - - /* - * MacData = "KC_1_U" || participantId_Alice || participantId_Bob || gx1 || gx2 || gx3 || gx4. - */ - updateMac(mac, "KC_1_U"); - updateMac(mac, participantId); - updateMac(mac, partnerParticipantId); - updateMac(mac, gx1); - updateMac(mac, gx2); - updateMac(mac, gx3); - updateMac(mac, gx4); - - mac.doFinal(macOutput, 0); - - Arrays.fill(macKey, (byte)0); - - return new BigInteger(macOutput); - - } - - /** - * Calculates the MacKey (i.e. the key to use when calculating the MagTag for key confirmation). - *

    - *

    - *

    -     * MacKey = H(K || "JPAKE_KC")
    -     * 
    - */ - private static byte[] calculateMacKey(BigInteger keyingMaterial, Digest digest) - { - digest.reset(); - - updateDigest(digest, keyingMaterial); - /* - * This constant is used to ensure that the macKey is NOT the same as the derived key. - */ - updateDigest(digest, "JPAKE_KC"); - - byte[] output = new byte[digest.getDigestSize()]; - digest.doFinal(output, 0); - - return output; - } - - /** - * Validates the MacTag received from the partner participant. - *

    - * - * @param partnerMacTag the MacTag received from the partner. - * @throws CryptoException if the participantId strings are equal. - */ - public static void validateMacTag( - String participantId, - String partnerParticipantId, - BigInteger gx1, - BigInteger gx2, - BigInteger gx3, - BigInteger gx4, - BigInteger keyingMaterial, - Digest digest, - BigInteger partnerMacTag) - throws CryptoException - { - /* - * Calculate the expected MacTag using the parameters as the partner - * would have used when the partner called calculateMacTag. - * - * i.e. basically all the parameters are reversed. - * participantId <-> partnerParticipantId - * x1 <-> x3 - * x2 <-> x4 - */ - BigInteger expectedMacTag = calculateMacTag( - partnerParticipantId, - participantId, - gx3, - gx4, - gx1, - gx2, - keyingMaterial, - digest); - - if (!expectedMacTag.equals(partnerMacTag)) - { - throw new CryptoException( - "Partner MacTag validation failed. " - + "Therefore, the password, MAC, or digest algorithm of each participant does not match."); - } - } - - private static void updateDigest(Digest digest, BigInteger bigInteger) - { - byte[] byteArray = BigIntegers.asUnsignedByteArray(bigInteger); - digest.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static void updateDigestIncludingSize(Digest digest, BigInteger bigInteger) - { - byte[] byteArray = BigIntegers.asUnsignedByteArray(bigInteger); - digest.update(intToByteArray(byteArray.length), 0, 4); - digest.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static void updateDigest(Digest digest, String string) - { - byte[] byteArray = Strings.toUTF8ByteArray(string); - digest.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static void updateDigestIncludingSize(Digest digest, String string) - { - byte[] byteArray = Strings.toUTF8ByteArray(string); - digest.update(intToByteArray(byteArray.length), 0, 4); - digest.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static void updateMac(Mac mac, BigInteger bigInteger) - { - byte[] byteArray = BigIntegers.asUnsignedByteArray(bigInteger); - mac.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static void updateMac(Mac mac, String string) - { - byte[] byteArray = Strings.toUTF8ByteArray(string); - mac.update(byteArray, 0, byteArray.length); - Arrays.fill(byteArray, (byte)0); - } - - private static byte[] intToByteArray(int value) - { - return new byte[]{ - (byte)(value >>> 24), - (byte)(value >>> 16), - (byte)(value >>> 8), - (byte)value - }; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKDFParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKDFParameters.java deleted file mode 100644 index 5b1ce16..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKDFParameters.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.crypto.agreement.kdf; - -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.crypto.DerivationParameters; - -public class DHKDFParameters - implements DerivationParameters -{ - private ASN1ObjectIdentifier algorithm; - private int keySize; - private byte[] z; - private byte[] extraInfo; - - public DHKDFParameters( - DERObjectIdentifier algorithm, - int keySize, - byte[] z) - { - this(algorithm, keySize, z, null); - } - - public DHKDFParameters( - DERObjectIdentifier algorithm, - int keySize, - byte[] z, - byte[] extraInfo) - { - this.algorithm = new ASN1ObjectIdentifier(algorithm.getId()); - this.keySize = keySize; - this.z = z; - this.extraInfo = extraInfo; - } - - public ASN1ObjectIdentifier getAlgorithm() - { - return algorithm; - } - - public int getKeySize() - { - return keySize; - } - - public byte[] getZ() - { - return z; - } - - public byte[] getExtraInfo() - { - return extraInfo; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKEKGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKEKGenerator.java deleted file mode 100644 index e39e482..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/DHKEKGenerator.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.bc.crypto.agreement.kdf; - -import java.io.IOException; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.DERObjectIdentifier; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.DerivationParameters; -import org.bc.crypto.Digest; - -/** - * RFC 2631 Diffie-hellman KEK derivation function. - */ -public class DHKEKGenerator - implements DerivationFunction -{ - private final Digest digest; - - private DERObjectIdentifier algorithm; - private int keySize; - private byte[] z; - private byte[] partyAInfo; - - public DHKEKGenerator( - Digest digest) - { - this.digest = digest; - } - - public void init(DerivationParameters param) - { - DHKDFParameters params = (DHKDFParameters)param; - - this.algorithm = params.getAlgorithm(); - this.keySize = params.getKeySize(); - this.z = params.getZ(); - this.partyAInfo = params.getExtraInfo(); - } - - public Digest getDigest() - { - return digest; - } - - public int generateBytes(byte[] out, int outOff, int len) - throws DataLengthException, IllegalArgumentException - { - if ((out.length - len) < outOff) - { - throw new DataLengthException("output buffer too small"); - } - - long oBytes = len; - int outLen = digest.getDigestSize(); - - // - // this is at odds with the standard implementation, the - // maximum value should be hBits * (2^32 - 1) where hBits - // is the digest output size in bits. We can't have an - // array with a long index at the moment... - // - if (oBytes > ((2L << 32) - 1)) - { - throw new IllegalArgumentException("Output length too large"); - } - - int cThreshold = (int)((oBytes + outLen - 1) / outLen); - - byte[] dig = new byte[digest.getDigestSize()]; - - int counter = 1; - - for (int i = 0; i < cThreshold; i++) - { - digest.update(z, 0, z.length); - - // OtherInfo - ASN1EncodableVector v1 = new ASN1EncodableVector(); - // KeySpecificInfo - ASN1EncodableVector v2 = new ASN1EncodableVector(); - - v2.add(algorithm); - v2.add(new DEROctetString(integerToBytes(counter))); - - v1.add(new DERSequence(v2)); - - if (partyAInfo != null) - { - v1.add(new DERTaggedObject(true, 0, new DEROctetString(partyAInfo))); - } - - v1.add(new DERTaggedObject(true, 2, new DEROctetString(integerToBytes(keySize)))); - - try - { - byte[] other = new DERSequence(v1).getEncoded(ASN1Encoding.DER); - - digest.update(other, 0, other.length); - } - catch (IOException e) - { - throw new IllegalArgumentException("unable to encode parameter info: " + e.getMessage()); - } - - digest.doFinal(dig, 0); - - if (len > outLen) - { - System.arraycopy(dig, 0, out, outOff, outLen); - outOff += outLen; - len -= outLen; - } - else - { - System.arraycopy(dig, 0, out, outOff, len); - } - - counter++; - } - - digest.reset(); - - return len; - } - - private byte[] integerToBytes(int keySize) - { - byte[] val = new byte[4]; - - val[0] = (byte)(keySize >> 24); - val[1] = (byte)(keySize >> 16); - val[2] = (byte)(keySize >> 8); - val[3] = (byte)keySize; - - return val; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/ECDHKEKGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/ECDHKEKGenerator.java deleted file mode 100644 index 8cade89..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/kdf/ECDHKEKGenerator.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.bc.crypto.agreement.kdf; - -import java.io.IOException; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERNull; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.DERTaggedObject; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.DerivationParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.generators.KDF2BytesGenerator; -import org.bc.crypto.params.KDFParameters; - -/** - * X9.63 based key derivation function for ECDH CMS. - */ -public class ECDHKEKGenerator - implements DerivationFunction -{ - private DerivationFunction kdf; - - private ASN1ObjectIdentifier algorithm; - private int keySize; - private byte[] z; - - public ECDHKEKGenerator( - Digest digest) - { - this.kdf = new KDF2BytesGenerator(digest); - } - - public void init(DerivationParameters param) - { - DHKDFParameters params = (DHKDFParameters)param; - - this.algorithm = params.getAlgorithm(); - this.keySize = params.getKeySize(); - this.z = params.getZ(); - } - - public Digest getDigest() - { - return kdf.getDigest(); - } - - public int generateBytes(byte[] out, int outOff, int len) - throws DataLengthException, IllegalArgumentException - { - // TODO Create an ASN.1 class for this (RFC3278) - // ECC-CMS-SharedInfo - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new AlgorithmIdentifier(algorithm, DERNull.INSTANCE)); - v.add(new DERTaggedObject(true, 2, new DEROctetString(integerToBytes(keySize)))); - - try - { - kdf.init(new KDFParameters(z, new DERSequence(v).getEncoded(ASN1Encoding.DER))); - } - catch (IOException e) - { - throw new IllegalArgumentException("unable to initialise kdf: " + e.getMessage()); - } - - return kdf.generateBytes(out, outOff, len); - } - - private byte[] integerToBytes(int keySize) - { - byte[] val = new byte[4]; - - val[0] = (byte)(keySize >> 24); - val[1] = (byte)(keySize >> 16); - val[2] = (byte)(keySize >> 8); - val[3] = (byte)keySize; - - return val; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Client.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Client.java deleted file mode 100644 index 7a64ac3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Client.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.bc.crypto.agreement.srp; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; - -/** - * Implements the client side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe. - * This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper - * "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002" - */ -public class SRP6Client -{ - protected BigInteger N; - protected BigInteger g; - - protected BigInteger a; - protected BigInteger A; - - protected BigInteger B; - - protected BigInteger x; - protected BigInteger u; - protected BigInteger S; - - protected Digest digest; - protected SecureRandom random; - - public SRP6Client() - { - } - - /** - * Initialises the client to begin new authentication attempt - * @param N The safe prime associated with the client's verifier - * @param g The group parameter associated with the client's verifier - * @param digest The digest algorithm associated with the client's verifier - * @param random For key generation - */ - public void init(BigInteger N, BigInteger g, Digest digest, SecureRandom random) - { - this.N = N; - this.g = g; - this.digest = digest; - this.random = random; - } - - /** - * Generates client's credentials given the client's salt, identity and password - * @param salt The salt used in the client's verifier. - * @param identity The user's identity (eg. username) - * @param password The user's password - * @return Client's public value to send to server - */ - public BigInteger generateClientCredentials(byte[] salt, byte[] identity, byte[] password) - { - this.x = SRP6Util.calculateX(digest, N, salt, identity, password); - this.a = selectPrivateValue(); - this.A = g.modPow(a, N); - - return A; - } - - /** - * Generates client's verification message given the server's credentials - * @param serverB The server's credentials - * @return Client's verification message for the server - * @throws CryptoException If server's credentials are invalid - */ - public BigInteger calculateSecret(BigInteger serverB) throws CryptoException - { - this.B = SRP6Util.validatePublicValue(N, serverB); - this.u = SRP6Util.calculateU(digest, N, A, B); - this.S = calculateS(); - - return S; - } - - protected BigInteger selectPrivateValue() - { - return SRP6Util.generatePrivateValue(digest, N, g, random); - } - - private BigInteger calculateS() - { - BigInteger k = SRP6Util.calculateK(digest, N, g); - BigInteger exp = u.multiply(x).add(a); - BigInteger tmp = g.modPow(x, N).multiply(k).mod(N); - return B.subtract(tmp).mod(N).modPow(exp, N); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Server.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Server.java deleted file mode 100644 index 7cb1fb2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Server.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bc.crypto.agreement.srp; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; - -/** - * Implements the server side SRP-6a protocol. Note that this class is stateful, and therefore NOT threadsafe. - * This implementation of SRP is based on the optimized message sequence put forth by Thomas Wu in the paper - * "SRP-6: Improvements and Refinements to the Secure Remote Password Protocol, 2002" - */ -public class SRP6Server -{ - protected BigInteger N; - protected BigInteger g; - protected BigInteger v; - - protected SecureRandom random; - protected Digest digest; - - protected BigInteger A; - - protected BigInteger b; - protected BigInteger B; - - protected BigInteger u; - protected BigInteger S; - - public SRP6Server() - { - } - - /** - * Initialises the server to accept a new client authentication attempt - * @param N The safe prime associated with the client's verifier - * @param g The group parameter associated with the client's verifier - * @param v The client's verifier - * @param digest The digest algorithm associated with the client's verifier - * @param random For key generation - */ - public void init(BigInteger N, BigInteger g, BigInteger v, Digest digest, SecureRandom random) - { - this.N = N; - this.g = g; - this.v = v; - - this.random = random; - this.digest = digest; - } - - /** - * Generates the server's credentials that are to be sent to the client. - * @return The server's public value to the client - */ - public BigInteger generateServerCredentials() - { - BigInteger k = SRP6Util.calculateK(digest, N, g); - this.b = selectPrivateValue(); - this.B = k.multiply(v).mod(N).add(g.modPow(b, N)).mod(N); - - return B; - } - - /** - * Processes the client's credentials. If valid the shared secret is generated and returned. - * @param clientA The client's credentials - * @return A shared secret BigInteger - * @throws CryptoException If client's credentials are invalid - */ - public BigInteger calculateSecret(BigInteger clientA) throws CryptoException - { - this.A = SRP6Util.validatePublicValue(N, clientA); - this.u = SRP6Util.calculateU(digest, N, A, B); - this.S = calculateS(); - - return S; - } - - protected BigInteger selectPrivateValue() - { - return SRP6Util.generatePrivateValue(digest, N, g, random); - } - - private BigInteger calculateS() - { - return v.modPow(u, N).multiply(A).mod(N).modPow(b, N); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Util.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Util.java deleted file mode 100644 index 86dc1bb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6Util.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.bc.crypto.agreement.srp; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.util.BigIntegers; - -public class SRP6Util -{ - private static BigInteger ZERO = BigInteger.valueOf(0); - private static BigInteger ONE = BigInteger.valueOf(1); - - public static BigInteger calculateK(Digest digest, BigInteger N, BigInteger g) - { - return hashPaddedPair(digest, N, N, g); - } - - public static BigInteger calculateU(Digest digest, BigInteger N, BigInteger A, BigInteger B) - { - return hashPaddedPair(digest, N, A, B); - } - - public static BigInteger calculateX(Digest digest, BigInteger N, byte[] salt, byte[] identity, byte[] password) - { - byte[] output = new byte[digest.getDigestSize()]; - - digest.update(identity, 0, identity.length); - digest.update((byte)':'); - digest.update(password, 0, password.length); - digest.doFinal(output, 0); - - digest.update(salt, 0, salt.length); - digest.update(output, 0, output.length); - digest.doFinal(output, 0); - - return new BigInteger(1, output); - } - - public static BigInteger generatePrivateValue(Digest digest, BigInteger N, BigInteger g, SecureRandom random) - { - int minBits = Math.min(256, N.bitLength() / 2); - BigInteger min = ONE.shiftLeft(minBits - 1); - BigInteger max = N.subtract(ONE); - - return BigIntegers.createRandomInRange(min, max, random); - } - - public static BigInteger validatePublicValue(BigInteger N, BigInteger val) - throws CryptoException - { - val = val.mod(N); - - // Check that val % N != 0 - if (val.equals(ZERO)) - { - throw new CryptoException("Invalid public value: 0"); - } - - return val; - } - - private static BigInteger hashPaddedPair(Digest digest, BigInteger N, BigInteger n1, BigInteger n2) - { - int padLength = (N.bitLength() + 7) / 8; - - byte[] n1_bytes = getPadded(n1, padLength); - byte[] n2_bytes = getPadded(n2, padLength); - - digest.update(n1_bytes, 0, n1_bytes.length); - digest.update(n2_bytes, 0, n2_bytes.length); - - byte[] output = new byte[digest.getDigestSize()]; - digest.doFinal(output, 0); - - return new BigInteger(1, output); - } - - private static byte[] getPadded(BigInteger n, int length) - { - byte[] bs = BigIntegers.asUnsignedByteArray(n); - if (bs.length < length) - { - byte[] tmp = new byte[length]; - System.arraycopy(bs, 0, tmp, length - bs.length, bs.length); - bs = tmp; - } - return bs; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6VerifierGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6VerifierGenerator.java deleted file mode 100644 index 9925aea..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/agreement/srp/SRP6VerifierGenerator.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.crypto.agreement.srp; - -import java.math.BigInteger; - -import org.bc.crypto.Digest; - -/** - * Generates new SRP verifier for user - */ -public class SRP6VerifierGenerator -{ - protected BigInteger N; - protected BigInteger g; - protected Digest digest; - - public SRP6VerifierGenerator() - { - } - - /** - * Initialises generator to create new verifiers - * @param N The safe prime to use (see DHParametersGenerator) - * @param g The group parameter to use (see DHParametersGenerator) - * @param digest The digest to use. The same digest type will need to be used later for the actual authentication - * attempt. Also note that the final session key size is dependent on the chosen digest. - */ - public void init(BigInteger N, BigInteger g, Digest digest) - { - this.N = N; - this.g = g; - this.digest = digest; - } - - /** - * Creates a new SRP verifier - * @param salt The salt to use, generally should be large and random - * @param identity The user's identifying information (eg. username) - * @param password The user's password - * @return A new verifier for use in future SRP authentication - */ - public BigInteger generateVerifier(byte[] salt, byte[] identity, byte[] password) - { - BigInteger x = SRP6Util.calculateX(digest, N, salt, identity, password); - - return g.modPow(x, N); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GOST3411Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GOST3411Digest.java deleted file mode 100644 index 6a966d8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GOST3411Digest.java +++ /dev/null @@ -1,349 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.ExtendedDigest; -import org.bc.crypto.engines.GOST28147Engine; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithSBox; -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -/** - * implementation of GOST R 34.11-94 - */ -public class GOST3411Digest - implements ExtendedDigest -{ - private static final int DIGEST_LENGTH = 32; - - private byte[] H = new byte[32], L = new byte[32], - M = new byte[32], Sum = new byte[32]; - private byte[][] C = new byte[4][32]; - - private byte[] xBuf = new byte[32]; - private int xBufOff; - private long byteCount; - - private BlockCipher cipher = new GOST28147Engine(); - private byte[] sBox; - - /** - * Standard constructor - */ - public GOST3411Digest() - { - sBox = GOST28147Engine.getSBox("D-A"); - cipher.init(true, new ParametersWithSBox(null, sBox)); - - reset(); - } - - /** - * Constructor to allow use of a particular sbox with GOST28147 - * @see GOST28147Engine#getSBox(String) - */ - public GOST3411Digest(byte[] sBoxParam) - { - sBox = Arrays.clone(sBoxParam); - cipher.init(true, new ParametersWithSBox(null, sBox)); - - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public GOST3411Digest(GOST3411Digest t) - { - this.sBox = t.sBox; - cipher.init(true, new ParametersWithSBox(null, sBox)); - - reset(); - - System.arraycopy(t.H, 0, this.H, 0, t.H.length); - System.arraycopy(t.L, 0, this.L, 0, t.L.length); - System.arraycopy(t.M, 0, this.M, 0, t.M.length); - System.arraycopy(t.Sum, 0, this.Sum, 0, t.Sum.length); - System.arraycopy(t.C[1], 0, this.C[1], 0, t.C[1].length); - System.arraycopy(t.C[2], 0, this.C[2], 0, t.C[2].length); - System.arraycopy(t.C[3], 0, this.C[3], 0, t.C[3].length); - System.arraycopy(t.xBuf, 0, this.xBuf, 0, t.xBuf.length); - - this.xBufOff = t.xBufOff; - this.byteCount = t.byteCount; - } - - public String getAlgorithmName() - { - return "GOST3411"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - public void update(byte in) - { - xBuf[xBufOff++] = in; - if (xBufOff == xBuf.length) - { - sumByteArray(xBuf); // calc sum M - processBlock(xBuf, 0); - xBufOff = 0; - } - byteCount++; - } - - public void update(byte[] in, int inOff, int len) - { - while ((xBufOff != 0) && (len > 0)) - { - update(in[inOff]); - inOff++; - len--; - } - - while (len > xBuf.length) - { - System.arraycopy(in, inOff, xBuf, 0, xBuf.length); - - sumByteArray(xBuf); // calc sum M - processBlock(xBuf, 0); - inOff += xBuf.length; - len -= xBuf.length; - byteCount += xBuf.length; - } - - // load in the remainder. - while (len > 0) - { - update(in[inOff]); - inOff++; - len--; - } - } - - // (i + 1 + 4(k - 1)) = 8i + k i = 0-3, k = 1-8 - private byte[] K = new byte[32]; - - private byte[] P(byte[] in) - { - for(int k = 0; k < 8; k++) - { - K[4*k] = in[k]; - K[1 + 4*k] = in[ 8 + k]; - K[2 + 4*k] = in[16 + k]; - K[3 + 4*k] = in[24 + k]; - } - - return K; - } - - //A (x) = (x0 ^ x1) || x3 || x2 || x1 - byte[] a = new byte[8]; - private byte[] A(byte[] in) - { - for(int j=0; j<8; j++) - { - a[j]=(byte)(in[j] ^ in[j+8]); - } - - System.arraycopy(in, 8, in, 0, 24); - System.arraycopy(a, 0, in, 24, 8); - - return in; - } - - //Encrypt function, ECB mode - private void E(byte[] key, byte[] s, int sOff, byte[] in, int inOff) - { - cipher.init(true, new KeyParameter(key)); - - cipher.processBlock(in, inOff, s, sOff); - } - - // (in:) n16||..||n1 ==> (out:) n1^n2^n3^n4^n13^n16||n16||..||n2 - short[] wS = new short[16], w_S = new short[16]; - - private void fw(byte[] in) - { - cpyBytesToShort(in, wS); - w_S[15] = (short)(wS[0] ^ wS[1] ^ wS[2] ^ wS[3] ^ wS[12] ^ wS[15]); - System.arraycopy(wS, 1, w_S, 0, 15); - cpyShortToBytes(w_S, in); - } - - // block processing - byte[] S = new byte[32]; - byte[] U = new byte[32], V = new byte[32], W = new byte[32]; - - protected void processBlock(byte[] in, int inOff) - { - System.arraycopy(in, inOff, M, 0, 32); - - //key step 1 - - // H = h3 || h2 || h1 || h0 - // S = s3 || s2 || s1 || s0 - System.arraycopy(H, 0, U, 0, 32); - System.arraycopy(M, 0, V, 0, 32); - for (int j=0; j<32; j++) - { - W[j] = (byte)(U[j]^V[j]); - } - // Encrypt gost28147-ECB - E(P(W), S, 0, H, 0); // s0 = EK0 [h0] - - //keys step 2,3,4 - for (int i=1; i<4; i++) - { - byte[] tmpA = A(U); - for (int j=0; j<32; j++) - { - U[j] = (byte)(tmpA[j] ^ C[i][j]); - } - V = A(A(V)); - for (int j=0; j<32; j++) - { - W[j] = (byte)(U[j]^V[j]); - } - // Encrypt gost28147-ECB - E(P(W), S, i * 8, H, i * 8); // si = EKi [hi] - } - - // x(M, H) = y61(H^y(M^y12(S))) - for(int n = 0; n < 12; n++) - { - fw(S); - } - for(int n = 0; n < 32; n++) - { - S[n] = (byte)(S[n] ^ M[n]); - } - - fw(S); - - for(int n = 0; n < 32; n++) - { - S[n] = (byte)(H[n] ^ S[n]); - } - for(int n = 0; n < 61; n++) - { - fw(S); - } - System.arraycopy(S, 0, H, 0, H.length); - } - - private void finish() - { - Pack.longToLittleEndian(byteCount * 8, L, 0); // get length into L (byteCount * 8 = bitCount) - - while (xBufOff != 0) - { - update((byte)0); - } - - processBlock(L, 0); - processBlock(Sum, 0); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - System.arraycopy(H, 0, out, outOff, H.length); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - private static final byte[] C2 = { - 0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF, - (byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00,(byte)0xFF,0x00, - 0x00,(byte)0xFF,(byte)0xFF,0x00,(byte)0xFF,0x00,0x00,(byte)0xFF, - (byte)0xFF,0x00,0x00,0x00,(byte)0xFF,(byte)0xFF,0x00,(byte)0xFF}; - - public void reset() - { - byteCount = 0; - xBufOff = 0; - - for(int i=0; i (Sum + a mod (2^256)) - private void sumByteArray(byte[] in) - { - int carry = 0; - - for (int i = 0; i != Sum.length; i++) - { - int sum = (Sum[i] & 0xff) + (in[i] & 0xff) + carry; - - Sum[i] = (byte)sum; - - carry = sum >>> 8; - } - } - - private void cpyBytesToShort(byte[] S, short[] wS) - { - for(int i=0; i> 8); - S[i*2] = (byte)wS[i]; - } - } - - public int getByteLength() - { - return 32; - } -} - - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GeneralDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GeneralDigest.java deleted file mode 100644 index 925793d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/GeneralDigest.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; - -/** - * base implementation of MD4 family style digest as outlined in - * "Handbook of Applied Cryptography", pages 344 - 347. - */ -public abstract class GeneralDigest - implements ExtendedDigest -{ - private static final int BYTE_LENGTH = 64; - private byte[] xBuf; - private int xBufOff; - - private long byteCount; - - /** - * Standard constructor - */ - protected GeneralDigest() - { - xBuf = new byte[4]; - xBufOff = 0; - } - - /** - * Copy constructor. We are using copy constructors in place - * of the Object.clone() interface as this interface is not - * supported by J2ME. - */ - protected GeneralDigest(GeneralDigest t) - { - xBuf = new byte[t.xBuf.length]; - System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length); - - xBufOff = t.xBufOff; - byteCount = t.byteCount; - } - - public void update( - byte in) - { - xBuf[xBufOff++] = in; - - if (xBufOff == xBuf.length) - { - processWord(xBuf, 0); - xBufOff = 0; - } - - byteCount++; - } - - public void update( - byte[] in, - int inOff, - int len) - { - // - // fill the current word - // - while ((xBufOff != 0) && (len > 0)) - { - update(in[inOff]); - - inOff++; - len--; - } - - // - // process whole words. - // - while (len > xBuf.length) - { - processWord(in, inOff); - - inOff += xBuf.length; - len -= xBuf.length; - byteCount += xBuf.length; - } - - // - // load in the remainder. - // - while (len > 0) - { - update(in[inOff]); - - inOff++; - len--; - } - } - - public void finish() - { - long bitLength = (byteCount << 3); - - // - // add the pad bytes. - // - update((byte)128); - - while (xBufOff != 0) - { - update((byte)0); - } - - processLength(bitLength); - - processBlock(); - } - - public void reset() - { - byteCount = 0; - - xBufOff = 0; - for (int i = 0; i < xBuf.length; i++) - { - xBuf[i] = 0; - } - } - - public int getByteLength() - { - return BYTE_LENGTH; - } - - protected abstract void processWord(byte[] in, int inOff); - - protected abstract void processLength(long bitLength); - - protected abstract void processBlock(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/LongDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/LongDigest.java deleted file mode 100644 index 409daa6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/LongDigest.java +++ /dev/null @@ -1,354 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; -import org.bc.crypto.util.Pack; - -/** - * Base class for SHA-384 and SHA-512. - */ -public abstract class LongDigest - implements ExtendedDigest -{ - private static final int BYTE_LENGTH = 128; - - private byte[] xBuf; - private int xBufOff; - - private long byteCount1; - private long byteCount2; - - protected long H1, H2, H3, H4, H5, H6, H7, H8; - - private long[] W = new long[80]; - private int wOff; - - /** - * Constructor for variable length word - */ - protected LongDigest() - { - xBuf = new byte[8]; - xBufOff = 0; - - reset(); - } - - /** - * Copy constructor. We are using copy constructors in place - * of the Object.clone() interface as this interface is not - * supported by J2ME. - */ - protected LongDigest(LongDigest t) - { - xBuf = new byte[t.xBuf.length]; - System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length); - - xBufOff = t.xBufOff; - byteCount1 = t.byteCount1; - byteCount2 = t.byteCount2; - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - H6 = t.H6; - H7 = t.H7; - H8 = t.H8; - - System.arraycopy(t.W, 0, W, 0, t.W.length); - wOff = t.wOff; - } - - public void update( - byte in) - { - xBuf[xBufOff++] = in; - - if (xBufOff == xBuf.length) - { - processWord(xBuf, 0); - xBufOff = 0; - } - - byteCount1++; - } - - public void update( - byte[] in, - int inOff, - int len) - { - // - // fill the current word - // - while ((xBufOff != 0) && (len > 0)) - { - update(in[inOff]); - - inOff++; - len--; - } - - // - // process whole words. - // - while (len > xBuf.length) - { - processWord(in, inOff); - - inOff += xBuf.length; - len -= xBuf.length; - byteCount1 += xBuf.length; - } - - // - // load in the remainder. - // - while (len > 0) - { - update(in[inOff]); - - inOff++; - len--; - } - } - - public void finish() - { - adjustByteCounts(); - - long lowBitLength = byteCount1 << 3; - long hiBitLength = byteCount2; - - // - // add the pad bytes. - // - update((byte)128); - - while (xBufOff != 0) - { - update((byte)0); - } - - processLength(lowBitLength, hiBitLength); - - processBlock(); - } - - public void reset() - { - byteCount1 = 0; - byteCount2 = 0; - - xBufOff = 0; - for (int i = 0; i < xBuf.length; i++) - { - xBuf[i] = 0; - } - - wOff = 0; - for (int i = 0; i != W.length; i++) - { - W[i] = 0; - } - } - - public int getByteLength() - { - return BYTE_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - W[wOff] = Pack.bigEndianToLong(in, inOff); - - if (++wOff == 16) - { - processBlock(); - } - } - - /** - * adjust the byte counts so that byteCount2 represents the - * upper long (less 3 bits) word of the byte count. - */ - private void adjustByteCounts() - { - if (byteCount1 > 0x1fffffffffffffffL) - { - byteCount2 += (byteCount1 >>> 61); - byteCount1 &= 0x1fffffffffffffffL; - } - } - - protected void processLength( - long lowW, - long hiW) - { - if (wOff > 14) - { - processBlock(); - } - - W[14] = hiW; - W[15] = lowW; - } - - protected void processBlock() - { - adjustByteCounts(); - - // - // expand 16 word block into 80 word blocks. - // - for (int t = 16; t <= 79; t++) - { - W[t] = Sigma1(W[t - 2]) + W[t - 7] + Sigma0(W[t - 15]) + W[t - 16]; - } - - // - // set up working variables. - // - long a = H1; - long b = H2; - long c = H3; - long d = H4; - long e = H5; - long f = H6; - long g = H7; - long h = H8; - - int t = 0; - for(int i = 0; i < 10; i ++) - { - // t = 8 * i - h += Sum1(e) + Ch(e, f, g) + K[t] + W[t++]; - d += h; - h += Sum0(a) + Maj(a, b, c); - - // t = 8 * i + 1 - g += Sum1(d) + Ch(d, e, f) + K[t] + W[t++]; - c += g; - g += Sum0(h) + Maj(h, a, b); - - // t = 8 * i + 2 - f += Sum1(c) + Ch(c, d, e) + K[t] + W[t++]; - b += f; - f += Sum0(g) + Maj(g, h, a); - - // t = 8 * i + 3 - e += Sum1(b) + Ch(b, c, d) + K[t] + W[t++]; - a += e; - e += Sum0(f) + Maj(f, g, h); - - // t = 8 * i + 4 - d += Sum1(a) + Ch(a, b, c) + K[t] + W[t++]; - h += d; - d += Sum0(e) + Maj(e, f, g); - - // t = 8 * i + 5 - c += Sum1(h) + Ch(h, a, b) + K[t] + W[t++]; - g += c; - c += Sum0(d) + Maj(d, e, f); - - // t = 8 * i + 6 - b += Sum1(g) + Ch(g, h, a) + K[t] + W[t++]; - f += b; - b += Sum0(c) + Maj(c, d, e); - - // t = 8 * i + 7 - a += Sum1(f) + Ch(f, g, h) + K[t] + W[t++]; - e += a; - a += Sum0(b) + Maj(b, c, d); - } - - H1 += a; - H2 += b; - H3 += c; - H4 += d; - H5 += e; - H6 += f; - H7 += g; - H8 += h; - - // - // reset the offset and clean out the word buffer. - // - wOff = 0; - for (int i = 0; i < 16; i++) - { - W[i] = 0; - } - } - - /* SHA-384 and SHA-512 functions (as for SHA-256 but for longs) */ - private long Ch( - long x, - long y, - long z) - { - return ((x & y) ^ ((~x) & z)); - } - - private long Maj( - long x, - long y, - long z) - { - return ((x & y) ^ (x & z) ^ (y & z)); - } - - private long Sum0( - long x) - { - return ((x << 36)|(x >>> 28)) ^ ((x << 30)|(x >>> 34)) ^ ((x << 25)|(x >>> 39)); - } - - private long Sum1( - long x) - { - return ((x << 50)|(x >>> 14)) ^ ((x << 46)|(x >>> 18)) ^ ((x << 23)|(x >>> 41)); - } - - private long Sigma0( - long x) - { - return ((x << 63)|(x >>> 1)) ^ ((x << 56)|(x >>> 8)) ^ (x >>> 7); - } - - private long Sigma1( - long x) - { - return ((x << 45)|(x >>> 19)) ^ ((x << 3)|(x >>> 61)) ^ (x >>> 6); - } - - /* SHA-384 and SHA-512 Constants - * (represent the first 64 bits of the fractional parts of the - * cube roots of the first sixty-four prime numbers) - */ - static final long K[] = { -0x428a2f98d728ae22L, 0x7137449123ef65cdL, 0xb5c0fbcfec4d3b2fL, 0xe9b5dba58189dbbcL, -0x3956c25bf348b538L, 0x59f111f1b605d019L, 0x923f82a4af194f9bL, 0xab1c5ed5da6d8118L, -0xd807aa98a3030242L, 0x12835b0145706fbeL, 0x243185be4ee4b28cL, 0x550c7dc3d5ffb4e2L, -0x72be5d74f27b896fL, 0x80deb1fe3b1696b1L, 0x9bdc06a725c71235L, 0xc19bf174cf692694L, -0xe49b69c19ef14ad2L, 0xefbe4786384f25e3L, 0x0fc19dc68b8cd5b5L, 0x240ca1cc77ac9c65L, -0x2de92c6f592b0275L, 0x4a7484aa6ea6e483L, 0x5cb0a9dcbd41fbd4L, 0x76f988da831153b5L, -0x983e5152ee66dfabL, 0xa831c66d2db43210L, 0xb00327c898fb213fL, 0xbf597fc7beef0ee4L, -0xc6e00bf33da88fc2L, 0xd5a79147930aa725L, 0x06ca6351e003826fL, 0x142929670a0e6e70L, -0x27b70a8546d22ffcL, 0x2e1b21385c26c926L, 0x4d2c6dfc5ac42aedL, 0x53380d139d95b3dfL, -0x650a73548baf63deL, 0x766a0abb3c77b2a8L, 0x81c2c92e47edaee6L, 0x92722c851482353bL, -0xa2bfe8a14cf10364L, 0xa81a664bbc423001L, 0xc24b8b70d0f89791L, 0xc76c51a30654be30L, -0xd192e819d6ef5218L, 0xd69906245565a910L, 0xf40e35855771202aL, 0x106aa07032bbd1b8L, -0x19a4c116b8d2d0c8L, 0x1e376c085141ab53L, 0x2748774cdf8eeb99L, 0x34b0bcb5e19b48a8L, -0x391c0cb3c5c95a63L, 0x4ed8aa4ae3418acbL, 0x5b9cca4f7763e373L, 0x682e6ff3d6b2b8a3L, -0x748f82ee5defb2fcL, 0x78a5636f43172f60L, 0x84c87814a1f0ab72L, 0x8cc702081a6439ecL, -0x90befffa23631e28L, 0xa4506cebde82bde9L, 0xbef9a3f7b2c67915L, 0xc67178f2e372532bL, -0xca273eceea26619cL, 0xd186b8c721c0c207L, 0xeada7dd6cde0eb1eL, 0xf57d4f7fee6ed178L, -0x06f067aa72176fbaL, 0x0a637dc5a2c898a6L, 0x113f9804bef90daeL, 0x1b710b35131c471bL, -0x28db77f523047d84L, 0x32caab7b40c72493L, 0x3c9ebe0a15c9bebcL, 0x431d67c49c100d4cL, -0x4cc5d4becb3e42b6L, 0x597f299cfc657e2aL, 0x5fcb6fab3ad6faecL, 0x6c44198c4a475817L - }; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD2Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD2Digest.java deleted file mode 100644 index a832529..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD2Digest.java +++ /dev/null @@ -1,237 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.*; -/** - * implementation of MD2 - * as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992 - */ -public class MD2Digest - implements ExtendedDigest -{ - private static final int DIGEST_LENGTH = 16; - - /* X buffer */ - private byte[] X = new byte[48]; - private int xOff; - /* M buffer */ - private byte[] M = new byte[16]; - private int mOff; - /* check sum */ - private byte[] C = new byte[16]; - private int COff; - - public MD2Digest() - { - reset(); - } - public MD2Digest(MD2Digest t) - { - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - System.arraycopy(t.M, 0, M, 0, t.M.length); - mOff = t.mOff; - System.arraycopy(t.C, 0, C, 0, t.C.length); - COff = t.COff; - } - /** - * return the algorithm name - * - * @return the algorithm name - */ - public String getAlgorithmName() - { - return "MD2"; - } - /** - * return the size, in bytes, of the digest produced by this message digest. - * - * @return the size, in bytes, of the digest produced by this message digest. - */ - public int getDigestSize() - { - return DIGEST_LENGTH; - } - /** - * close the digest, producing the final digest value. The doFinal - * call leaves the digest reset. - * - * @param out the array the digest is to be copied into. - * @param outOff the offset into the out array the digest is to start at. - */ - public int doFinal(byte[] out, int outOff) - { - // add padding - byte paddingByte = (byte)(M.length-mOff); - for (int i=mOff;i 0)) - { - update(in[inOff]); - inOff++; - len--; - } - - // - // process whole words. - // - while (len > 16) - { - System.arraycopy(in,inOff,M,0,16); - processCheckSum(M); - processBlock(M); - len -= 16; - inOff += 16; - } - - // - // load in the remainder. - // - while (len > 0) - { - update(in[inOff]); - inOff++; - len--; - } - } - protected void processCheckSum(byte[] m) - { - int L = C[15]; - for (int i=0;i<16;i++) - { - C[i] ^= S[(m[i] ^ L) & 0xff]; - L = C[i]; - } - } - protected void processBlock(byte[] m) - { - for (int i=0;i<16;i++) - { - X[i+16] = m[i]; - X[i+32] = (byte)(m[i] ^ X[i]); - } - // encrypt block - int t = 0; - - for (int j=0;j<18;j++) - { - for (int k=0;k<48;k++) - { - t = X[k] ^= S[t]; - t = t & 0xff; - } - t = (t + j)%256; - } - } - // 256-byte random permutation constructed from the digits of PI - private static final byte[] S = { - (byte)41,(byte)46,(byte)67,(byte)201,(byte)162,(byte)216,(byte)124, - (byte)1,(byte)61,(byte)54,(byte)84,(byte)161,(byte)236,(byte)240, - (byte)6,(byte)19,(byte)98,(byte)167,(byte)5,(byte)243,(byte)192, - (byte)199,(byte)115,(byte)140,(byte)152,(byte)147,(byte)43,(byte)217, - (byte)188,(byte)76,(byte)130,(byte)202,(byte)30,(byte)155,(byte)87, - (byte)60,(byte)253,(byte)212,(byte)224,(byte)22,(byte)103,(byte)66, - (byte)111,(byte)24,(byte)138,(byte)23,(byte)229,(byte)18,(byte)190, - (byte)78,(byte)196,(byte)214,(byte)218,(byte)158,(byte)222,(byte)73, - (byte)160,(byte)251,(byte)245,(byte)142,(byte)187,(byte)47,(byte)238, - (byte)122,(byte)169,(byte)104,(byte)121,(byte)145,(byte)21,(byte)178, - (byte)7,(byte)63,(byte)148,(byte)194,(byte)16,(byte)137,(byte)11, - (byte)34,(byte)95,(byte)33,(byte)128,(byte)127,(byte)93,(byte)154, - (byte)90,(byte)144,(byte)50,(byte)39,(byte)53,(byte)62,(byte)204, - (byte)231,(byte)191,(byte)247,(byte)151,(byte)3,(byte)255,(byte)25, - (byte)48,(byte)179,(byte)72,(byte)165,(byte)181,(byte)209,(byte)215, - (byte)94,(byte)146,(byte)42,(byte)172,(byte)86,(byte)170,(byte)198, - (byte)79,(byte)184,(byte)56,(byte)210,(byte)150,(byte)164,(byte)125, - (byte)182,(byte)118,(byte)252,(byte)107,(byte)226,(byte)156,(byte)116, - (byte)4,(byte)241,(byte)69,(byte)157,(byte)112,(byte)89,(byte)100, - (byte)113,(byte)135,(byte)32,(byte)134,(byte)91,(byte)207,(byte)101, - (byte)230,(byte)45,(byte)168,(byte)2,(byte)27,(byte)96,(byte)37, - (byte)173,(byte)174,(byte)176,(byte)185,(byte)246,(byte)28,(byte)70, - (byte)97,(byte)105,(byte)52,(byte)64,(byte)126,(byte)15,(byte)85, - (byte)71,(byte)163,(byte)35,(byte)221,(byte)81,(byte)175,(byte)58, - (byte)195,(byte)92,(byte)249,(byte)206,(byte)186,(byte)197,(byte)234, - (byte)38,(byte)44,(byte)83,(byte)13,(byte)110,(byte)133,(byte)40, - (byte)132, 9,(byte)211,(byte)223,(byte)205,(byte)244,(byte)65, - (byte)129,(byte)77,(byte)82,(byte)106,(byte)220,(byte)55,(byte)200, - (byte)108,(byte)193,(byte)171,(byte)250,(byte)36,(byte)225,(byte)123, - (byte)8,(byte)12,(byte)189,(byte)177,(byte)74,(byte)120,(byte)136, - (byte)149,(byte)139,(byte)227,(byte)99,(byte)232,(byte)109,(byte)233, - (byte)203,(byte)213,(byte)254,(byte)59,(byte)0,(byte)29,(byte)57, - (byte)242,(byte)239,(byte)183,(byte)14,(byte)102,(byte)88,(byte)208, - (byte)228,(byte)166,(byte)119,(byte)114,(byte)248,(byte)235,(byte)117, - (byte)75,(byte)10,(byte)49,(byte)68,(byte)80,(byte)180,(byte)143, - (byte)237,(byte)31,(byte)26,(byte)219,(byte)153,(byte)141,(byte)51, - (byte)159,(byte)17,(byte)131,(byte)20 - }; - - public int getByteLength() - { - return 16; - } -} - - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD4Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD4Digest.java deleted file mode 100644 index 69ec8d4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD4Digest.java +++ /dev/null @@ -1,270 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of MD4 as RFC 1320 by R. Rivest, MIT Laboratory for - * Computer Science and RSA Data Security, Inc. - *

    - * NOTE: This algorithm is only included for backwards compatability - * with legacy applications, it's not secure, don't use it for anything new! - */ -public class MD4Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 16; - - private int H1, H2, H3, H4; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public MD4Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public MD4Digest(MD4Digest t) - { - super(t); - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "MD4"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H1, out, outOff); - unpackWord(H2, out, outOff + 4); - unpackWord(H3, out, outOff + 8); - unpackWord(H4, out, outOff + 12); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H1 = 0x67452301; - H2 = 0xefcdab89; - H3 = 0x98badcfe; - H4 = 0x10325476; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - // - // round 1 left rotates - // - private static final int S11 = 3; - private static final int S12 = 7; - private static final int S13 = 11; - private static final int S14 = 19; - - // - // round 2 left rotates - // - private static final int S21 = 3; - private static final int S22 = 5; - private static final int S23 = 9; - private static final int S24 = 13; - - // - // round 3 left rotates - // - private static final int S31 = 3; - private static final int S32 = 9; - private static final int S33 = 11; - private static final int S34 = 15; - - /* - * rotate int x left n bits. - */ - private int rotateLeft( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * F, G, H and I are the basic MD4 functions. - */ - private int F( - int u, - int v, - int w) - { - return (u & v) | (~u & w); - } - - private int G( - int u, - int v, - int w) - { - return (u & v) | (u & w) | (v & w); - } - - private int H( - int u, - int v, - int w) - { - return u ^ v ^ w; - } - - protected void processBlock() - { - int a = H1; - int b = H2; - int c = H3; - int d = H4; - - // - // Round 1 - F cycle, 16 times. - // - a = rotateLeft(a + F(b, c, d) + X[ 0], S11); - d = rotateLeft(d + F(a, b, c) + X[ 1], S12); - c = rotateLeft(c + F(d, a, b) + X[ 2], S13); - b = rotateLeft(b + F(c, d, a) + X[ 3], S14); - a = rotateLeft(a + F(b, c, d) + X[ 4], S11); - d = rotateLeft(d + F(a, b, c) + X[ 5], S12); - c = rotateLeft(c + F(d, a, b) + X[ 6], S13); - b = rotateLeft(b + F(c, d, a) + X[ 7], S14); - a = rotateLeft(a + F(b, c, d) + X[ 8], S11); - d = rotateLeft(d + F(a, b, c) + X[ 9], S12); - c = rotateLeft(c + F(d, a, b) + X[10], S13); - b = rotateLeft(b + F(c, d, a) + X[11], S14); - a = rotateLeft(a + F(b, c, d) + X[12], S11); - d = rotateLeft(d + F(a, b, c) + X[13], S12); - c = rotateLeft(c + F(d, a, b) + X[14], S13); - b = rotateLeft(b + F(c, d, a) + X[15], S14); - - // - // Round 2 - G cycle, 16 times. - // - a = rotateLeft(a + G(b, c, d) + X[ 0] + 0x5a827999, S21); - d = rotateLeft(d + G(a, b, c) + X[ 4] + 0x5a827999, S22); - c = rotateLeft(c + G(d, a, b) + X[ 8] + 0x5a827999, S23); - b = rotateLeft(b + G(c, d, a) + X[12] + 0x5a827999, S24); - a = rotateLeft(a + G(b, c, d) + X[ 1] + 0x5a827999, S21); - d = rotateLeft(d + G(a, b, c) + X[ 5] + 0x5a827999, S22); - c = rotateLeft(c + G(d, a, b) + X[ 9] + 0x5a827999, S23); - b = rotateLeft(b + G(c, d, a) + X[13] + 0x5a827999, S24); - a = rotateLeft(a + G(b, c, d) + X[ 2] + 0x5a827999, S21); - d = rotateLeft(d + G(a, b, c) + X[ 6] + 0x5a827999, S22); - c = rotateLeft(c + G(d, a, b) + X[10] + 0x5a827999, S23); - b = rotateLeft(b + G(c, d, a) + X[14] + 0x5a827999, S24); - a = rotateLeft(a + G(b, c, d) + X[ 3] + 0x5a827999, S21); - d = rotateLeft(d + G(a, b, c) + X[ 7] + 0x5a827999, S22); - c = rotateLeft(c + G(d, a, b) + X[11] + 0x5a827999, S23); - b = rotateLeft(b + G(c, d, a) + X[15] + 0x5a827999, S24); - - // - // Round 3 - H cycle, 16 times. - // - a = rotateLeft(a + H(b, c, d) + X[ 0] + 0x6ed9eba1, S31); - d = rotateLeft(d + H(a, b, c) + X[ 8] + 0x6ed9eba1, S32); - c = rotateLeft(c + H(d, a, b) + X[ 4] + 0x6ed9eba1, S33); - b = rotateLeft(b + H(c, d, a) + X[12] + 0x6ed9eba1, S34); - a = rotateLeft(a + H(b, c, d) + X[ 2] + 0x6ed9eba1, S31); - d = rotateLeft(d + H(a, b, c) + X[10] + 0x6ed9eba1, S32); - c = rotateLeft(c + H(d, a, b) + X[ 6] + 0x6ed9eba1, S33); - b = rotateLeft(b + H(c, d, a) + X[14] + 0x6ed9eba1, S34); - a = rotateLeft(a + H(b, c, d) + X[ 1] + 0x6ed9eba1, S31); - d = rotateLeft(d + H(a, b, c) + X[ 9] + 0x6ed9eba1, S32); - c = rotateLeft(c + H(d, a, b) + X[ 5] + 0x6ed9eba1, S33); - b = rotateLeft(b + H(c, d, a) + X[13] + 0x6ed9eba1, S34); - a = rotateLeft(a + H(b, c, d) + X[ 3] + 0x6ed9eba1, S31); - d = rotateLeft(d + H(a, b, c) + X[11] + 0x6ed9eba1, S32); - c = rotateLeft(c + H(d, a, b) + X[ 7] + 0x6ed9eba1, S33); - b = rotateLeft(b + H(c, d, a) + X[15] + 0x6ed9eba1, S34); - - H1 += a; - H2 += b; - H3 += c; - H4 += d; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD5Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD5Digest.java deleted file mode 100644 index a0d5452..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/MD5Digest.java +++ /dev/null @@ -1,302 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of MD5 as outlined in "Handbook of Applied Cryptography", pages 346 - 347. - */ -public class MD5Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 16; - - private int H1, H2, H3, H4; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public MD5Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public MD5Digest(MD5Digest t) - { - super(t); - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "MD5"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H1, out, outOff); - unpackWord(H2, out, outOff + 4); - unpackWord(H3, out, outOff + 8); - unpackWord(H4, out, outOff + 12); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H1 = 0x67452301; - H2 = 0xefcdab89; - H3 = 0x98badcfe; - H4 = 0x10325476; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - // - // round 1 left rotates - // - private static final int S11 = 7; - private static final int S12 = 12; - private static final int S13 = 17; - private static final int S14 = 22; - - // - // round 2 left rotates - // - private static final int S21 = 5; - private static final int S22 = 9; - private static final int S23 = 14; - private static final int S24 = 20; - - // - // round 3 left rotates - // - private static final int S31 = 4; - private static final int S32 = 11; - private static final int S33 = 16; - private static final int S34 = 23; - - // - // round 4 left rotates - // - private static final int S41 = 6; - private static final int S42 = 10; - private static final int S43 = 15; - private static final int S44 = 21; - - /* - * rotate int x left n bits. - */ - private int rotateLeft( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * F, G, H and I are the basic MD5 functions. - */ - private int F( - int u, - int v, - int w) - { - return (u & v) | (~u & w); - } - - private int G( - int u, - int v, - int w) - { - return (u & w) | (v & ~w); - } - - private int H( - int u, - int v, - int w) - { - return u ^ v ^ w; - } - - private int K( - int u, - int v, - int w) - { - return v ^ (u | ~w); - } - - protected void processBlock() - { - int a = H1; - int b = H2; - int c = H3; - int d = H4; - - // - // Round 1 - F cycle, 16 times. - // - a = rotateLeft(a + F(b, c, d) + X[ 0] + 0xd76aa478, S11) + b; - d = rotateLeft(d + F(a, b, c) + X[ 1] + 0xe8c7b756, S12) + a; - c = rotateLeft(c + F(d, a, b) + X[ 2] + 0x242070db, S13) + d; - b = rotateLeft(b + F(c, d, a) + X[ 3] + 0xc1bdceee, S14) + c; - a = rotateLeft(a + F(b, c, d) + X[ 4] + 0xf57c0faf, S11) + b; - d = rotateLeft(d + F(a, b, c) + X[ 5] + 0x4787c62a, S12) + a; - c = rotateLeft(c + F(d, a, b) + X[ 6] + 0xa8304613, S13) + d; - b = rotateLeft(b + F(c, d, a) + X[ 7] + 0xfd469501, S14) + c; - a = rotateLeft(a + F(b, c, d) + X[ 8] + 0x698098d8, S11) + b; - d = rotateLeft(d + F(a, b, c) + X[ 9] + 0x8b44f7af, S12) + a; - c = rotateLeft(c + F(d, a, b) + X[10] + 0xffff5bb1, S13) + d; - b = rotateLeft(b + F(c, d, a) + X[11] + 0x895cd7be, S14) + c; - a = rotateLeft(a + F(b, c, d) + X[12] + 0x6b901122, S11) + b; - d = rotateLeft(d + F(a, b, c) + X[13] + 0xfd987193, S12) + a; - c = rotateLeft(c + F(d, a, b) + X[14] + 0xa679438e, S13) + d; - b = rotateLeft(b + F(c, d, a) + X[15] + 0x49b40821, S14) + c; - - // - // Round 2 - G cycle, 16 times. - // - a = rotateLeft(a + G(b, c, d) + X[ 1] + 0xf61e2562, S21) + b; - d = rotateLeft(d + G(a, b, c) + X[ 6] + 0xc040b340, S22) + a; - c = rotateLeft(c + G(d, a, b) + X[11] + 0x265e5a51, S23) + d; - b = rotateLeft(b + G(c, d, a) + X[ 0] + 0xe9b6c7aa, S24) + c; - a = rotateLeft(a + G(b, c, d) + X[ 5] + 0xd62f105d, S21) + b; - d = rotateLeft(d + G(a, b, c) + X[10] + 0x02441453, S22) + a; - c = rotateLeft(c + G(d, a, b) + X[15] + 0xd8a1e681, S23) + d; - b = rotateLeft(b + G(c, d, a) + X[ 4] + 0xe7d3fbc8, S24) + c; - a = rotateLeft(a + G(b, c, d) + X[ 9] + 0x21e1cde6, S21) + b; - d = rotateLeft(d + G(a, b, c) + X[14] + 0xc33707d6, S22) + a; - c = rotateLeft(c + G(d, a, b) + X[ 3] + 0xf4d50d87, S23) + d; - b = rotateLeft(b + G(c, d, a) + X[ 8] + 0x455a14ed, S24) + c; - a = rotateLeft(a + G(b, c, d) + X[13] + 0xa9e3e905, S21) + b; - d = rotateLeft(d + G(a, b, c) + X[ 2] + 0xfcefa3f8, S22) + a; - c = rotateLeft(c + G(d, a, b) + X[ 7] + 0x676f02d9, S23) + d; - b = rotateLeft(b + G(c, d, a) + X[12] + 0x8d2a4c8a, S24) + c; - - // - // Round 3 - H cycle, 16 times. - // - a = rotateLeft(a + H(b, c, d) + X[ 5] + 0xfffa3942, S31) + b; - d = rotateLeft(d + H(a, b, c) + X[ 8] + 0x8771f681, S32) + a; - c = rotateLeft(c + H(d, a, b) + X[11] + 0x6d9d6122, S33) + d; - b = rotateLeft(b + H(c, d, a) + X[14] + 0xfde5380c, S34) + c; - a = rotateLeft(a + H(b, c, d) + X[ 1] + 0xa4beea44, S31) + b; - d = rotateLeft(d + H(a, b, c) + X[ 4] + 0x4bdecfa9, S32) + a; - c = rotateLeft(c + H(d, a, b) + X[ 7] + 0xf6bb4b60, S33) + d; - b = rotateLeft(b + H(c, d, a) + X[10] + 0xbebfbc70, S34) + c; - a = rotateLeft(a + H(b, c, d) + X[13] + 0x289b7ec6, S31) + b; - d = rotateLeft(d + H(a, b, c) + X[ 0] + 0xeaa127fa, S32) + a; - c = rotateLeft(c + H(d, a, b) + X[ 3] + 0xd4ef3085, S33) + d; - b = rotateLeft(b + H(c, d, a) + X[ 6] + 0x04881d05, S34) + c; - a = rotateLeft(a + H(b, c, d) + X[ 9] + 0xd9d4d039, S31) + b; - d = rotateLeft(d + H(a, b, c) + X[12] + 0xe6db99e5, S32) + a; - c = rotateLeft(c + H(d, a, b) + X[15] + 0x1fa27cf8, S33) + d; - b = rotateLeft(b + H(c, d, a) + X[ 2] + 0xc4ac5665, S34) + c; - - // - // Round 4 - K cycle, 16 times. - // - a = rotateLeft(a + K(b, c, d) + X[ 0] + 0xf4292244, S41) + b; - d = rotateLeft(d + K(a, b, c) + X[ 7] + 0x432aff97, S42) + a; - c = rotateLeft(c + K(d, a, b) + X[14] + 0xab9423a7, S43) + d; - b = rotateLeft(b + K(c, d, a) + X[ 5] + 0xfc93a039, S44) + c; - a = rotateLeft(a + K(b, c, d) + X[12] + 0x655b59c3, S41) + b; - d = rotateLeft(d + K(a, b, c) + X[ 3] + 0x8f0ccc92, S42) + a; - c = rotateLeft(c + K(d, a, b) + X[10] + 0xffeff47d, S43) + d; - b = rotateLeft(b + K(c, d, a) + X[ 1] + 0x85845dd1, S44) + c; - a = rotateLeft(a + K(b, c, d) + X[ 8] + 0x6fa87e4f, S41) + b; - d = rotateLeft(d + K(a, b, c) + X[15] + 0xfe2ce6e0, S42) + a; - c = rotateLeft(c + K(d, a, b) + X[ 6] + 0xa3014314, S43) + d; - b = rotateLeft(b + K(c, d, a) + X[13] + 0x4e0811a1, S44) + c; - a = rotateLeft(a + K(b, c, d) + X[ 4] + 0xf7537e82, S41) + b; - d = rotateLeft(d + K(a, b, c) + X[11] + 0xbd3af235, S42) + a; - c = rotateLeft(c + K(d, a, b) + X[ 2] + 0x2ad7d2bb, S43) + d; - b = rotateLeft(b + K(c, d, a) + X[ 9] + 0xeb86d391, S44) + c; - - H1 += a; - H2 += b; - H3 += c; - H4 += d; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/NullDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/NullDigest.java deleted file mode 100644 index ef88014..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/NullDigest.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto.digests; - -import java.io.ByteArrayOutputStream; - -import org.bc.crypto.Digest; - - -public class NullDigest - implements Digest -{ - private ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - public String getAlgorithmName() - { - return "NULL"; - } - - public int getDigestSize() - { - return bOut.size(); - } - - public void update(byte in) - { - bOut.write(in); - } - - public void update(byte[] in, int inOff, int len) - { - bOut.write(in, inOff, len); - } - - public int doFinal(byte[] out, int outOff) - { - byte[] res = bOut.toByteArray(); - - System.arraycopy(res, 0, out, outOff, res.length); - - reset(); - - return res.length; - } - - public void reset() - { - bOut.reset(); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD128Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD128Digest.java deleted file mode 100644 index 02903d2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD128Digest.java +++ /dev/null @@ -1,461 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of RIPEMD128 - */ -public class RIPEMD128Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 16; - - private int H0, H1, H2, H3; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public RIPEMD128Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public RIPEMD128Digest(RIPEMD128Digest t) - { - super(t); - - H0 = t.H0; - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "RIPEMD128"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H0, out, outOff); - unpackWord(H1, out, outOff + 4); - unpackWord(H2, out, outOff + 8); - unpackWord(H3, out, outOff + 12); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H0 = 0x67452301; - H1 = 0xefcdab89; - H2 = 0x98badcfe; - H3 = 0x10325476; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - /* - * rotate int x left n bits. - */ - private int RL( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * f1,f2,f3,f4 are the basic RIPEMD128 functions. - */ - - /* - * F - */ - private int f1( - int x, - int y, - int z) - { - return x ^ y ^ z; - } - - /* - * G - */ - private int f2( - int x, - int y, - int z) - { - return (x & y) | (~x & z); - } - - /* - * H - */ - private int f3( - int x, - int y, - int z) - { - return (x | ~y) ^ z; - } - - /* - * I - */ - private int f4( - int x, - int y, - int z) - { - return (x & z) | (y & ~z); - } - - private int F1( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f1(b, c, d) + x, s); - } - - private int F2( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f2(b, c, d) + x + 0x5a827999, s); - } - - private int F3( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f3(b, c, d) + x + 0x6ed9eba1, s); - } - - private int F4( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f4(b, c, d) + x + 0x8f1bbcdc, s); - } - - private int FF1( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f1(b, c, d) + x, s); - } - - private int FF2( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f2(b, c, d) + x + 0x6d703ef3, s); - } - - private int FF3( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f3(b, c, d) + x + 0x5c4dd124, s); - } - - private int FF4( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f4(b, c, d) + x + 0x50a28be6, s); - } - - protected void processBlock() - { - int a, aa; - int b, bb; - int c, cc; - int d, dd; - - a = aa = H0; - b = bb = H1; - c = cc = H2; - d = dd = H3; - - // - // Round 1 - // - a = F1(a, b, c, d, X[ 0], 11); - d = F1(d, a, b, c, X[ 1], 14); - c = F1(c, d, a, b, X[ 2], 15); - b = F1(b, c, d, a, X[ 3], 12); - a = F1(a, b, c, d, X[ 4], 5); - d = F1(d, a, b, c, X[ 5], 8); - c = F1(c, d, a, b, X[ 6], 7); - b = F1(b, c, d, a, X[ 7], 9); - a = F1(a, b, c, d, X[ 8], 11); - d = F1(d, a, b, c, X[ 9], 13); - c = F1(c, d, a, b, X[10], 14); - b = F1(b, c, d, a, X[11], 15); - a = F1(a, b, c, d, X[12], 6); - d = F1(d, a, b, c, X[13], 7); - c = F1(c, d, a, b, X[14], 9); - b = F1(b, c, d, a, X[15], 8); - - // - // Round 2 - // - a = F2(a, b, c, d, X[ 7], 7); - d = F2(d, a, b, c, X[ 4], 6); - c = F2(c, d, a, b, X[13], 8); - b = F2(b, c, d, a, X[ 1], 13); - a = F2(a, b, c, d, X[10], 11); - d = F2(d, a, b, c, X[ 6], 9); - c = F2(c, d, a, b, X[15], 7); - b = F2(b, c, d, a, X[ 3], 15); - a = F2(a, b, c, d, X[12], 7); - d = F2(d, a, b, c, X[ 0], 12); - c = F2(c, d, a, b, X[ 9], 15); - b = F2(b, c, d, a, X[ 5], 9); - a = F2(a, b, c, d, X[ 2], 11); - d = F2(d, a, b, c, X[14], 7); - c = F2(c, d, a, b, X[11], 13); - b = F2(b, c, d, a, X[ 8], 12); - - // - // Round 3 - // - a = F3(a, b, c, d, X[ 3], 11); - d = F3(d, a, b, c, X[10], 13); - c = F3(c, d, a, b, X[14], 6); - b = F3(b, c, d, a, X[ 4], 7); - a = F3(a, b, c, d, X[ 9], 14); - d = F3(d, a, b, c, X[15], 9); - c = F3(c, d, a, b, X[ 8], 13); - b = F3(b, c, d, a, X[ 1], 15); - a = F3(a, b, c, d, X[ 2], 14); - d = F3(d, a, b, c, X[ 7], 8); - c = F3(c, d, a, b, X[ 0], 13); - b = F3(b, c, d, a, X[ 6], 6); - a = F3(a, b, c, d, X[13], 5); - d = F3(d, a, b, c, X[11], 12); - c = F3(c, d, a, b, X[ 5], 7); - b = F3(b, c, d, a, X[12], 5); - - // - // Round 4 - // - a = F4(a, b, c, d, X[ 1], 11); - d = F4(d, a, b, c, X[ 9], 12); - c = F4(c, d, a, b, X[11], 14); - b = F4(b, c, d, a, X[10], 15); - a = F4(a, b, c, d, X[ 0], 14); - d = F4(d, a, b, c, X[ 8], 15); - c = F4(c, d, a, b, X[12], 9); - b = F4(b, c, d, a, X[ 4], 8); - a = F4(a, b, c, d, X[13], 9); - d = F4(d, a, b, c, X[ 3], 14); - c = F4(c, d, a, b, X[ 7], 5); - b = F4(b, c, d, a, X[15], 6); - a = F4(a, b, c, d, X[14], 8); - d = F4(d, a, b, c, X[ 5], 6); - c = F4(c, d, a, b, X[ 6], 5); - b = F4(b, c, d, a, X[ 2], 12); - - // - // Parallel round 1 - // - aa = FF4(aa, bb, cc, dd, X[ 5], 8); - dd = FF4(dd, aa, bb, cc, X[14], 9); - cc = FF4(cc, dd, aa, bb, X[ 7], 9); - bb = FF4(bb, cc, dd, aa, X[ 0], 11); - aa = FF4(aa, bb, cc, dd, X[ 9], 13); - dd = FF4(dd, aa, bb, cc, X[ 2], 15); - cc = FF4(cc, dd, aa, bb, X[11], 15); - bb = FF4(bb, cc, dd, aa, X[ 4], 5); - aa = FF4(aa, bb, cc, dd, X[13], 7); - dd = FF4(dd, aa, bb, cc, X[ 6], 7); - cc = FF4(cc, dd, aa, bb, X[15], 8); - bb = FF4(bb, cc, dd, aa, X[ 8], 11); - aa = FF4(aa, bb, cc, dd, X[ 1], 14); - dd = FF4(dd, aa, bb, cc, X[10], 14); - cc = FF4(cc, dd, aa, bb, X[ 3], 12); - bb = FF4(bb, cc, dd, aa, X[12], 6); - - // - // Parallel round 2 - // - aa = FF3(aa, bb, cc, dd, X[ 6], 9); - dd = FF3(dd, aa, bb, cc, X[11], 13); - cc = FF3(cc, dd, aa, bb, X[ 3], 15); - bb = FF3(bb, cc, dd, aa, X[ 7], 7); - aa = FF3(aa, bb, cc, dd, X[ 0], 12); - dd = FF3(dd, aa, bb, cc, X[13], 8); - cc = FF3(cc, dd, aa, bb, X[ 5], 9); - bb = FF3(bb, cc, dd, aa, X[10], 11); - aa = FF3(aa, bb, cc, dd, X[14], 7); - dd = FF3(dd, aa, bb, cc, X[15], 7); - cc = FF3(cc, dd, aa, bb, X[ 8], 12); - bb = FF3(bb, cc, dd, aa, X[12], 7); - aa = FF3(aa, bb, cc, dd, X[ 4], 6); - dd = FF3(dd, aa, bb, cc, X[ 9], 15); - cc = FF3(cc, dd, aa, bb, X[ 1], 13); - bb = FF3(bb, cc, dd, aa, X[ 2], 11); - - // - // Parallel round 3 - // - aa = FF2(aa, bb, cc, dd, X[15], 9); - dd = FF2(dd, aa, bb, cc, X[ 5], 7); - cc = FF2(cc, dd, aa, bb, X[ 1], 15); - bb = FF2(bb, cc, dd, aa, X[ 3], 11); - aa = FF2(aa, bb, cc, dd, X[ 7], 8); - dd = FF2(dd, aa, bb, cc, X[14], 6); - cc = FF2(cc, dd, aa, bb, X[ 6], 6); - bb = FF2(bb, cc, dd, aa, X[ 9], 14); - aa = FF2(aa, bb, cc, dd, X[11], 12); - dd = FF2(dd, aa, bb, cc, X[ 8], 13); - cc = FF2(cc, dd, aa, bb, X[12], 5); - bb = FF2(bb, cc, dd, aa, X[ 2], 14); - aa = FF2(aa, bb, cc, dd, X[10], 13); - dd = FF2(dd, aa, bb, cc, X[ 0], 13); - cc = FF2(cc, dd, aa, bb, X[ 4], 7); - bb = FF2(bb, cc, dd, aa, X[13], 5); - - // - // Parallel round 4 - // - aa = FF1(aa, bb, cc, dd, X[ 8], 15); - dd = FF1(dd, aa, bb, cc, X[ 6], 5); - cc = FF1(cc, dd, aa, bb, X[ 4], 8); - bb = FF1(bb, cc, dd, aa, X[ 1], 11); - aa = FF1(aa, bb, cc, dd, X[ 3], 14); - dd = FF1(dd, aa, bb, cc, X[11], 14); - cc = FF1(cc, dd, aa, bb, X[15], 6); - bb = FF1(bb, cc, dd, aa, X[ 0], 14); - aa = FF1(aa, bb, cc, dd, X[ 5], 6); - dd = FF1(dd, aa, bb, cc, X[12], 9); - cc = FF1(cc, dd, aa, bb, X[ 2], 12); - bb = FF1(bb, cc, dd, aa, X[13], 9); - aa = FF1(aa, bb, cc, dd, X[ 9], 12); - dd = FF1(dd, aa, bb, cc, X[ 7], 5); - cc = FF1(cc, dd, aa, bb, X[10], 15); - bb = FF1(bb, cc, dd, aa, X[14], 8); - - dd += c + H1; // final result for H0 - - // - // combine the results - // - H1 = H2 + d + aa; - H2 = H3 + a + bb; - H3 = H0 + b + cc; - H0 = dd; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD160Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD160Digest.java deleted file mode 100644 index b0a5144..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD160Digest.java +++ /dev/null @@ -1,422 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of RIPEMD see, - * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html - */ -public class RIPEMD160Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 20; - - private int H0, H1, H2, H3, H4; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public RIPEMD160Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public RIPEMD160Digest(RIPEMD160Digest t) - { - super(t); - - H0 = t.H0; - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "RIPEMD160"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H0, out, outOff); - unpackWord(H1, out, outOff + 4); - unpackWord(H2, out, outOff + 8); - unpackWord(H3, out, outOff + 12); - unpackWord(H4, out, outOff + 16); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H0 = 0x67452301; - H1 = 0xefcdab89; - H2 = 0x98badcfe; - H3 = 0x10325476; - H4 = 0xc3d2e1f0; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - /* - * rotate int x left n bits. - */ - private int RL( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * f1,f2,f3,f4,f5 are the basic RIPEMD160 functions. - */ - - /* - * rounds 0-15 - */ - private int f1( - int x, - int y, - int z) - { - return x ^ y ^ z; - } - - /* - * rounds 16-31 - */ - private int f2( - int x, - int y, - int z) - { - return (x & y) | (~x & z); - } - - /* - * rounds 32-47 - */ - private int f3( - int x, - int y, - int z) - { - return (x | ~y) ^ z; - } - - /* - * rounds 48-63 - */ - private int f4( - int x, - int y, - int z) - { - return (x & z) | (y & ~z); - } - - /* - * rounds 64-79 - */ - private int f5( - int x, - int y, - int z) - { - return x ^ (y | ~z); - } - - protected void processBlock() - { - int a, aa; - int b, bb; - int c, cc; - int d, dd; - int e, ee; - - a = aa = H0; - b = bb = H1; - c = cc = H2; - d = dd = H3; - e = ee = H4; - - // - // Rounds 1 - 16 - // - // left - a = RL(a + f1(b,c,d) + X[ 0], 11) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[ 1], 14) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[ 2], 15) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[ 3], 12) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[ 4], 5) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[ 5], 8) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[ 6], 7) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[ 7], 9) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[ 8], 11) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[ 9], 13) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[10], 14) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[11], 15) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[12], 6) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[13], 7) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[14], 9) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[15], 8) + e; c = RL(c, 10); - - // right - aa = RL(aa + f5(bb,cc,dd) + X[ 5] + 0x50a28be6, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[14] + 0x50a28be6, 9) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 7] + 0x50a28be6, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[ 0] + 0x50a28be6, 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 9] + 0x50a28be6, 13) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[ 2] + 0x50a28be6, 15) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[11] + 0x50a28be6, 15) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 4] + 0x50a28be6, 5) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[13] + 0x50a28be6, 7) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 6] + 0x50a28be6, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[15] + 0x50a28be6, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[ 8] + 0x50a28be6, 11) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 1] + 0x50a28be6, 14) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[10] + 0x50a28be6, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 3] + 0x50a28be6, 12) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[12] + 0x50a28be6, 6) + ee; cc = RL(cc, 10); - - // - // Rounds 16-31 - // - // left - e = RL(e + f2(a,b,c) + X[ 7] + 0x5a827999, 7) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[ 4] + 0x5a827999, 6) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[13] + 0x5a827999, 8) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[ 1] + 0x5a827999, 13) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[10] + 0x5a827999, 11) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 6] + 0x5a827999, 9) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[15] + 0x5a827999, 7) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[ 3] + 0x5a827999, 15) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[12] + 0x5a827999, 7) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[ 0] + 0x5a827999, 12) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 9] + 0x5a827999, 15) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[ 5] + 0x5a827999, 9) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[ 2] + 0x5a827999, 11) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[14] + 0x5a827999, 7) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[11] + 0x5a827999, 13) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 8] + 0x5a827999, 12) + d; b = RL(b, 10); - - // right - ee = RL(ee + f4(aa,bb,cc) + X[ 6] + 0x5c4dd124, 9) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[11] + 0x5c4dd124, 13) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[ 3] + 0x5c4dd124, 15) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[ 7] + 0x5c4dd124, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[ 0] + 0x5c4dd124, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[13] + 0x5c4dd124, 8) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[ 5] + 0x5c4dd124, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[10] + 0x5c4dd124, 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[14] + 0x5c4dd124, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[15] + 0x5c4dd124, 7) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[ 8] + 0x5c4dd124, 12) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[12] + 0x5c4dd124, 7) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[ 4] + 0x5c4dd124, 6) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[ 9] + 0x5c4dd124, 15) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[ 1] + 0x5c4dd124, 13) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[ 2] + 0x5c4dd124, 11) + dd; bb = RL(bb, 10); - - // - // Rounds 32-47 - // - // left - d = RL(d + f3(e,a,b) + X[ 3] + 0x6ed9eba1, 11) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[10] + 0x6ed9eba1, 13) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[14] + 0x6ed9eba1, 6) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[ 4] + 0x6ed9eba1, 7) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 9] + 0x6ed9eba1, 14) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[15] + 0x6ed9eba1, 9) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[ 8] + 0x6ed9eba1, 13) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[ 1] + 0x6ed9eba1, 15) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[ 2] + 0x6ed9eba1, 14) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 7] + 0x6ed9eba1, 8) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[ 0] + 0x6ed9eba1, 13) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[ 6] + 0x6ed9eba1, 6) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[13] + 0x6ed9eba1, 5) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[11] + 0x6ed9eba1, 12) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 5] + 0x6ed9eba1, 7) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[12] + 0x6ed9eba1, 5) + c; a = RL(a, 10); - - // right - dd = RL(dd + f3(ee,aa,bb) + X[15] + 0x6d703ef3, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 5] + 0x6d703ef3, 7) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[ 1] + 0x6d703ef3, 15) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[ 3] + 0x6d703ef3, 11) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 7] + 0x6d703ef3, 8) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[14] + 0x6d703ef3, 6) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 6] + 0x6d703ef3, 6) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[ 9] + 0x6d703ef3, 14) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[11] + 0x6d703ef3, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 8] + 0x6d703ef3, 13) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[12] + 0x6d703ef3, 5) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 2] + 0x6d703ef3, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[10] + 0x6d703ef3, 13) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[ 0] + 0x6d703ef3, 13) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 4] + 0x6d703ef3, 7) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[13] + 0x6d703ef3, 5) + cc; aa = RL(aa, 10); - - // - // Rounds 48-63 - // - // left - c = RL(c + f4(d,e,a) + X[ 1] + 0x8f1bbcdc, 11) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[ 9] + 0x8f1bbcdc, 12) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[11] + 0x8f1bbcdc, 14) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[10] + 0x8f1bbcdc, 15) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 0] + 0x8f1bbcdc, 14) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 8] + 0x8f1bbcdc, 15) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[12] + 0x8f1bbcdc, 9) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[ 4] + 0x8f1bbcdc, 8) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[13] + 0x8f1bbcdc, 9) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 3] + 0x8f1bbcdc, 14) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 7] + 0x8f1bbcdc, 5) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[15] + 0x8f1bbcdc, 6) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[14] + 0x8f1bbcdc, 8) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[ 5] + 0x8f1bbcdc, 6) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 6] + 0x8f1bbcdc, 5) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 2] + 0x8f1bbcdc, 12) + b; e = RL(e, 10); - - // right - cc = RL(cc + f2(dd,ee,aa) + X[ 8] + 0x7a6d76e9, 15) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[ 6] + 0x7a6d76e9, 5) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 4] + 0x7a6d76e9, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 1] + 0x7a6d76e9, 11) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[ 3] + 0x7a6d76e9, 14) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[11] + 0x7a6d76e9, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[15] + 0x7a6d76e9, 6) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 0] + 0x7a6d76e9, 14) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 5] + 0x7a6d76e9, 6) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[12] + 0x7a6d76e9, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[ 2] + 0x7a6d76e9, 12) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[13] + 0x7a6d76e9, 9) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 9] + 0x7a6d76e9, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 7] + 0x7a6d76e9, 5) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[10] + 0x7a6d76e9, 15) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[14] + 0x7a6d76e9, 8) + bb; ee = RL(ee, 10); - - // - // Rounds 64-79 - // - // left - b = RL(b + f5(c,d,e) + X[ 4] + 0xa953fd4e, 9) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 0] + 0xa953fd4e, 15) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[ 5] + 0xa953fd4e, 5) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[ 9] + 0xa953fd4e, 11) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[ 7] + 0xa953fd4e, 6) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[12] + 0xa953fd4e, 8) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 2] + 0xa953fd4e, 13) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[10] + 0xa953fd4e, 12) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[14] + 0xa953fd4e, 5) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[ 1] + 0xa953fd4e, 12) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[ 3] + 0xa953fd4e, 13) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 8] + 0xa953fd4e, 14) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[11] + 0xa953fd4e, 11) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[ 6] + 0xa953fd4e, 8) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[15] + 0xa953fd4e, 5) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[13] + 0xa953fd4e, 6) + a; d = RL(d, 10); - - // right - bb = RL(bb + f1(cc,dd,ee) + X[12], 8) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[15], 5) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[10], 12) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 4], 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 1], 12) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[ 5], 5) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[ 8], 14) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[ 7], 6) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 6], 8) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 2], 13) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[13], 6) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[14], 5) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[ 0], 15) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 3], 13) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 9], 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[11], 11) + aa; dd = RL(dd, 10); - - dd += c + H1; - H1 = H2 + d + ee; - H2 = H3 + e + aa; - H3 = H4 + a + bb; - H4 = H0 + b + cc; - H0 = dd; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD256Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD256Digest.java deleted file mode 100644 index cf91c8b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD256Digest.java +++ /dev/null @@ -1,476 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of RIPEMD256. - *

    - * note: this algorithm offers the same level of security as RIPEMD128. - */ -public class RIPEMD256Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 32; - - private int H0, H1, H2, H3, H4, H5, H6, H7; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public RIPEMD256Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public RIPEMD256Digest(RIPEMD256Digest t) - { - super(t); - - H0 = t.H0; - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - H6 = t.H6; - H7 = t.H7; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "RIPEMD256"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H0, out, outOff); - unpackWord(H1, out, outOff + 4); - unpackWord(H2, out, outOff + 8); - unpackWord(H3, out, outOff + 12); - unpackWord(H4, out, outOff + 16); - unpackWord(H5, out, outOff + 20); - unpackWord(H6, out, outOff + 24); - unpackWord(H7, out, outOff + 28); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H0 = 0x67452301; - H1 = 0xefcdab89; - H2 = 0x98badcfe; - H3 = 0x10325476; - H4 = 0x76543210; - H5 = 0xFEDCBA98; - H6 = 0x89ABCDEF; - H7 = 0x01234567; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - /* - * rotate int x left n bits. - */ - private int RL( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * f1,f2,f3,f4 are the basic RIPEMD128 functions. - */ - - /* - * F - */ - private int f1( - int x, - int y, - int z) - { - return x ^ y ^ z; - } - - /* - * G - */ - private int f2( - int x, - int y, - int z) - { - return (x & y) | (~x & z); - } - - /* - * H - */ - private int f3( - int x, - int y, - int z) - { - return (x | ~y) ^ z; - } - - /* - * I - */ - private int f4( - int x, - int y, - int z) - { - return (x & z) | (y & ~z); - } - - private int F1( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f1(b, c, d) + x, s); - } - - private int F2( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f2(b, c, d) + x + 0x5a827999, s); - } - - private int F3( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f3(b, c, d) + x + 0x6ed9eba1, s); - } - - private int F4( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f4(b, c, d) + x + 0x8f1bbcdc, s); - } - - private int FF1( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f1(b, c, d) + x, s); - } - - private int FF2( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f2(b, c, d) + x + 0x6d703ef3, s); - } - - private int FF3( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f3(b, c, d) + x + 0x5c4dd124, s); - } - - private int FF4( - int a, - int b, - int c, - int d, - int x, - int s) - { - return RL(a + f4(b, c, d) + x + 0x50a28be6, s); - } - - protected void processBlock() - { - int a, aa; - int b, bb; - int c, cc; - int d, dd; - int t; - - a = H0; - b = H1; - c = H2; - d = H3; - aa = H4; - bb = H5; - cc = H6; - dd = H7; - - // - // Round 1 - // - - a = F1(a, b, c, d, X[ 0], 11); - d = F1(d, a, b, c, X[ 1], 14); - c = F1(c, d, a, b, X[ 2], 15); - b = F1(b, c, d, a, X[ 3], 12); - a = F1(a, b, c, d, X[ 4], 5); - d = F1(d, a, b, c, X[ 5], 8); - c = F1(c, d, a, b, X[ 6], 7); - b = F1(b, c, d, a, X[ 7], 9); - a = F1(a, b, c, d, X[ 8], 11); - d = F1(d, a, b, c, X[ 9], 13); - c = F1(c, d, a, b, X[10], 14); - b = F1(b, c, d, a, X[11], 15); - a = F1(a, b, c, d, X[12], 6); - d = F1(d, a, b, c, X[13], 7); - c = F1(c, d, a, b, X[14], 9); - b = F1(b, c, d, a, X[15], 8); - - aa = FF4(aa, bb, cc, dd, X[ 5], 8); - dd = FF4(dd, aa, bb, cc, X[14], 9); - cc = FF4(cc, dd, aa, bb, X[ 7], 9); - bb = FF4(bb, cc, dd, aa, X[ 0], 11); - aa = FF4(aa, bb, cc, dd, X[ 9], 13); - dd = FF4(dd, aa, bb, cc, X[ 2], 15); - cc = FF4(cc, dd, aa, bb, X[11], 15); - bb = FF4(bb, cc, dd, aa, X[ 4], 5); - aa = FF4(aa, bb, cc, dd, X[13], 7); - dd = FF4(dd, aa, bb, cc, X[ 6], 7); - cc = FF4(cc, dd, aa, bb, X[15], 8); - bb = FF4(bb, cc, dd, aa, X[ 8], 11); - aa = FF4(aa, bb, cc, dd, X[ 1], 14); - dd = FF4(dd, aa, bb, cc, X[10], 14); - cc = FF4(cc, dd, aa, bb, X[ 3], 12); - bb = FF4(bb, cc, dd, aa, X[12], 6); - - t = a; a = aa; aa = t; - - // - // Round 2 - // - a = F2(a, b, c, d, X[ 7], 7); - d = F2(d, a, b, c, X[ 4], 6); - c = F2(c, d, a, b, X[13], 8); - b = F2(b, c, d, a, X[ 1], 13); - a = F2(a, b, c, d, X[10], 11); - d = F2(d, a, b, c, X[ 6], 9); - c = F2(c, d, a, b, X[15], 7); - b = F2(b, c, d, a, X[ 3], 15); - a = F2(a, b, c, d, X[12], 7); - d = F2(d, a, b, c, X[ 0], 12); - c = F2(c, d, a, b, X[ 9], 15); - b = F2(b, c, d, a, X[ 5], 9); - a = F2(a, b, c, d, X[ 2], 11); - d = F2(d, a, b, c, X[14], 7); - c = F2(c, d, a, b, X[11], 13); - b = F2(b, c, d, a, X[ 8], 12); - - aa = FF3(aa, bb, cc, dd, X[ 6], 9); - dd = FF3(dd, aa, bb, cc, X[ 11], 13); - cc = FF3(cc, dd, aa, bb, X[3], 15); - bb = FF3(bb, cc, dd, aa, X[ 7], 7); - aa = FF3(aa, bb, cc, dd, X[0], 12); - dd = FF3(dd, aa, bb, cc, X[13], 8); - cc = FF3(cc, dd, aa, bb, X[5], 9); - bb = FF3(bb, cc, dd, aa, X[10], 11); - aa = FF3(aa, bb, cc, dd, X[14], 7); - dd = FF3(dd, aa, bb, cc, X[15], 7); - cc = FF3(cc, dd, aa, bb, X[ 8], 12); - bb = FF3(bb, cc, dd, aa, X[12], 7); - aa = FF3(aa, bb, cc, dd, X[ 4], 6); - dd = FF3(dd, aa, bb, cc, X[ 9], 15); - cc = FF3(cc, dd, aa, bb, X[ 1], 13); - bb = FF3(bb, cc, dd, aa, X[ 2], 11); - - t = b; b = bb; bb = t; - - // - // Round 3 - // - a = F3(a, b, c, d, X[ 3], 11); - d = F3(d, a, b, c, X[10], 13); - c = F3(c, d, a, b, X[14], 6); - b = F3(b, c, d, a, X[ 4], 7); - a = F3(a, b, c, d, X[ 9], 14); - d = F3(d, a, b, c, X[15], 9); - c = F3(c, d, a, b, X[ 8], 13); - b = F3(b, c, d, a, X[ 1], 15); - a = F3(a, b, c, d, X[ 2], 14); - d = F3(d, a, b, c, X[ 7], 8); - c = F3(c, d, a, b, X[ 0], 13); - b = F3(b, c, d, a, X[ 6], 6); - a = F3(a, b, c, d, X[13], 5); - d = F3(d, a, b, c, X[11], 12); - c = F3(c, d, a, b, X[ 5], 7); - b = F3(b, c, d, a, X[12], 5); - - aa = FF2(aa, bb, cc, dd, X[ 15], 9); - dd = FF2(dd, aa, bb, cc, X[5], 7); - cc = FF2(cc, dd, aa, bb, X[1], 15); - bb = FF2(bb, cc, dd, aa, X[ 3], 11); - aa = FF2(aa, bb, cc, dd, X[ 7], 8); - dd = FF2(dd, aa, bb, cc, X[14], 6); - cc = FF2(cc, dd, aa, bb, X[ 6], 6); - bb = FF2(bb, cc, dd, aa, X[ 9], 14); - aa = FF2(aa, bb, cc, dd, X[11], 12); - dd = FF2(dd, aa, bb, cc, X[ 8], 13); - cc = FF2(cc, dd, aa, bb, X[12], 5); - bb = FF2(bb, cc, dd, aa, X[ 2], 14); - aa = FF2(aa, bb, cc, dd, X[10], 13); - dd = FF2(dd, aa, bb, cc, X[ 0], 13); - cc = FF2(cc, dd, aa, bb, X[ 4], 7); - bb = FF2(bb, cc, dd, aa, X[13], 5); - - t = c; c = cc; cc = t; - - // - // Round 4 - // - a = F4(a, b, c, d, X[ 1], 11); - d = F4(d, a, b, c, X[ 9], 12); - c = F4(c, d, a, b, X[11], 14); - b = F4(b, c, d, a, X[10], 15); - a = F4(a, b, c, d, X[ 0], 14); - d = F4(d, a, b, c, X[ 8], 15); - c = F4(c, d, a, b, X[12], 9); - b = F4(b, c, d, a, X[ 4], 8); - a = F4(a, b, c, d, X[13], 9); - d = F4(d, a, b, c, X[ 3], 14); - c = F4(c, d, a, b, X[ 7], 5); - b = F4(b, c, d, a, X[15], 6); - a = F4(a, b, c, d, X[14], 8); - d = F4(d, a, b, c, X[ 5], 6); - c = F4(c, d, a, b, X[ 6], 5); - b = F4(b, c, d, a, X[ 2], 12); - - aa = FF1(aa, bb, cc, dd, X[ 8], 15); - dd = FF1(dd, aa, bb, cc, X[ 6], 5); - cc = FF1(cc, dd, aa, bb, X[ 4], 8); - bb = FF1(bb, cc, dd, aa, X[ 1], 11); - aa = FF1(aa, bb, cc, dd, X[ 3], 14); - dd = FF1(dd, aa, bb, cc, X[11], 14); - cc = FF1(cc, dd, aa, bb, X[15], 6); - bb = FF1(bb, cc, dd, aa, X[ 0], 14); - aa = FF1(aa, bb, cc, dd, X[ 5], 6); - dd = FF1(dd, aa, bb, cc, X[12], 9); - cc = FF1(cc, dd, aa, bb, X[ 2], 12); - bb = FF1(bb, cc, dd, aa, X[13], 9); - aa = FF1(aa, bb, cc, dd, X[ 9], 12); - dd = FF1(dd, aa, bb, cc, X[ 7], 5); - cc = FF1(cc, dd, aa, bb, X[10], 15); - bb = FF1(bb, cc, dd, aa, X[14], 8); - - t = d; d = dd; dd = t; - - H0 += a; - H1 += b; - H2 += c; - H3 += d; - H4 += aa; - H5 += bb; - H6 += cc; - H7 += dd; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD320Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD320Digest.java deleted file mode 100644 index 799bb6a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/RIPEMD320Digest.java +++ /dev/null @@ -1,461 +0,0 @@ -package org.bc.crypto.digests; - - -/** - * implementation of RIPEMD 320. - *

    - * Note: this implementation offers the same level of security - * as RIPEMD 160. - */ -public class RIPEMD320Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 40; - - private int H0, H1, H2, H3, H4, H5, H6, H7, H8, H9; // IV's - - private int[] X = new int[16]; - private int xOff; - - /** - * Standard constructor - */ - public RIPEMD320Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public RIPEMD320Digest(RIPEMD320Digest t) - { - super(t); - - H0 = t.H0; - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - H6 = t.H6; - H7 = t.H7; - H8 = t.H8; - H9 = t.H9; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "RIPEMD320"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) - | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); - - if (xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength & 0xffffffff); - X[15] = (int)(bitLength >>> 32); - } - - private void unpackWord( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)word; - out[outOff + 1] = (byte)(word >>> 8); - out[outOff + 2] = (byte)(word >>> 16); - out[outOff + 3] = (byte)(word >>> 24); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(H0, out, outOff); - unpackWord(H1, out, outOff + 4); - unpackWord(H2, out, outOff + 8); - unpackWord(H3, out, outOff + 12); - unpackWord(H4, out, outOff + 16); - unpackWord(H5, out, outOff + 20); - unpackWord(H6, out, outOff + 24); - unpackWord(H7, out, outOff + 28); - unpackWord(H8, out, outOff + 32); - unpackWord(H9, out, outOff + 36); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables to the IV values. - */ - public void reset() - { - super.reset(); - - H0 = 0x67452301; - H1 = 0xefcdab89; - H2 = 0x98badcfe; - H3 = 0x10325476; - H4 = 0xc3d2e1f0; - H5 = 0x76543210; - H6 = 0xFEDCBA98; - H7 = 0x89ABCDEF; - H8 = 0x01234567; - H9 = 0x3C2D1E0F; - - xOff = 0; - - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - /* - * rotate int x left n bits. - */ - private int RL( - int x, - int n) - { - return (x << n) | (x >>> (32 - n)); - } - - /* - * f1,f2,f3,f4,f5 are the basic RIPEMD160 functions. - */ - - /* - * rounds 0-15 - */ - private int f1( - int x, - int y, - int z) - { - return x ^ y ^ z; - } - - /* - * rounds 16-31 - */ - private int f2( - int x, - int y, - int z) - { - return (x & y) | (~x & z); - } - - /* - * rounds 32-47 - */ - private int f3( - int x, - int y, - int z) - { - return (x | ~y) ^ z; - } - - /* - * rounds 48-63 - */ - private int f4( - int x, - int y, - int z) - { - return (x & z) | (y & ~z); - } - - /* - * rounds 64-79 - */ - private int f5( - int x, - int y, - int z) - { - return x ^ (y | ~z); - } - - protected void processBlock() - { - int a, aa; - int b, bb; - int c, cc; - int d, dd; - int e, ee; - int t; - - a = H0; - b = H1; - c = H2; - d = H3; - e = H4; - aa = H5; - bb = H6; - cc = H7; - dd = H8; - ee = H9; - - // - // Rounds 1 - 16 - // - // left - a = RL(a + f1(b,c,d) + X[ 0], 11) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[ 1], 14) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[ 2], 15) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[ 3], 12) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[ 4], 5) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[ 5], 8) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[ 6], 7) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[ 7], 9) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[ 8], 11) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[ 9], 13) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[10], 14) + e; c = RL(c, 10); - e = RL(e + f1(a,b,c) + X[11], 15) + d; b = RL(b, 10); - d = RL(d + f1(e,a,b) + X[12], 6) + c; a = RL(a, 10); - c = RL(c + f1(d,e,a) + X[13], 7) + b; e = RL(e, 10); - b = RL(b + f1(c,d,e) + X[14], 9) + a; d = RL(d, 10); - a = RL(a + f1(b,c,d) + X[15], 8) + e; c = RL(c, 10); - - // right - aa = RL(aa + f5(bb,cc,dd) + X[ 5] + 0x50a28be6, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[14] + 0x50a28be6, 9) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 7] + 0x50a28be6, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[ 0] + 0x50a28be6, 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 9] + 0x50a28be6, 13) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[ 2] + 0x50a28be6, 15) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[11] + 0x50a28be6, 15) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 4] + 0x50a28be6, 5) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[13] + 0x50a28be6, 7) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 6] + 0x50a28be6, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[15] + 0x50a28be6, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f5(aa,bb,cc) + X[ 8] + 0x50a28be6, 11) + dd; bb = RL(bb, 10); - dd = RL(dd + f5(ee,aa,bb) + X[ 1] + 0x50a28be6, 14) + cc; aa = RL(aa, 10); - cc = RL(cc + f5(dd,ee,aa) + X[10] + 0x50a28be6, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f5(cc,dd,ee) + X[ 3] + 0x50a28be6, 12) + aa; dd = RL(dd, 10); - aa = RL(aa + f5(bb,cc,dd) + X[12] + 0x50a28be6, 6) + ee; cc = RL(cc, 10); - - t = a; a = aa; aa = t; - - // - // Rounds 16-31 - // - // left - e = RL(e + f2(a,b,c) + X[ 7] + 0x5a827999, 7) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[ 4] + 0x5a827999, 6) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[13] + 0x5a827999, 8) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[ 1] + 0x5a827999, 13) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[10] + 0x5a827999, 11) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 6] + 0x5a827999, 9) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[15] + 0x5a827999, 7) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[ 3] + 0x5a827999, 15) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[12] + 0x5a827999, 7) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[ 0] + 0x5a827999, 12) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 9] + 0x5a827999, 15) + d; b = RL(b, 10); - d = RL(d + f2(e,a,b) + X[ 5] + 0x5a827999, 9) + c; a = RL(a, 10); - c = RL(c + f2(d,e,a) + X[ 2] + 0x5a827999, 11) + b; e = RL(e, 10); - b = RL(b + f2(c,d,e) + X[14] + 0x5a827999, 7) + a; d = RL(d, 10); - a = RL(a + f2(b,c,d) + X[11] + 0x5a827999, 13) + e; c = RL(c, 10); - e = RL(e + f2(a,b,c) + X[ 8] + 0x5a827999, 12) + d; b = RL(b, 10); - - // right - ee = RL(ee + f4(aa,bb,cc) + X[ 6] + 0x5c4dd124, 9) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[11] + 0x5c4dd124, 13) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[ 3] + 0x5c4dd124, 15) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[ 7] + 0x5c4dd124, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[ 0] + 0x5c4dd124, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[13] + 0x5c4dd124, 8) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[ 5] + 0x5c4dd124, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[10] + 0x5c4dd124, 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[14] + 0x5c4dd124, 7) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[15] + 0x5c4dd124, 7) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[ 8] + 0x5c4dd124, 12) + dd; bb = RL(bb, 10); - dd = RL(dd + f4(ee,aa,bb) + X[12] + 0x5c4dd124, 7) + cc; aa = RL(aa, 10); - cc = RL(cc + f4(dd,ee,aa) + X[ 4] + 0x5c4dd124, 6) + bb; ee = RL(ee, 10); - bb = RL(bb + f4(cc,dd,ee) + X[ 9] + 0x5c4dd124, 15) + aa; dd = RL(dd, 10); - aa = RL(aa + f4(bb,cc,dd) + X[ 1] + 0x5c4dd124, 13) + ee; cc = RL(cc, 10); - ee = RL(ee + f4(aa,bb,cc) + X[ 2] + 0x5c4dd124, 11) + dd; bb = RL(bb, 10); - - t = b; b = bb; bb = t; - - // - // Rounds 32-47 - // - // left - d = RL(d + f3(e,a,b) + X[ 3] + 0x6ed9eba1, 11) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[10] + 0x6ed9eba1, 13) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[14] + 0x6ed9eba1, 6) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[ 4] + 0x6ed9eba1, 7) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 9] + 0x6ed9eba1, 14) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[15] + 0x6ed9eba1, 9) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[ 8] + 0x6ed9eba1, 13) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[ 1] + 0x6ed9eba1, 15) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[ 2] + 0x6ed9eba1, 14) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 7] + 0x6ed9eba1, 8) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[ 0] + 0x6ed9eba1, 13) + c; a = RL(a, 10); - c = RL(c + f3(d,e,a) + X[ 6] + 0x6ed9eba1, 6) + b; e = RL(e, 10); - b = RL(b + f3(c,d,e) + X[13] + 0x6ed9eba1, 5) + a; d = RL(d, 10); - a = RL(a + f3(b,c,d) + X[11] + 0x6ed9eba1, 12) + e; c = RL(c, 10); - e = RL(e + f3(a,b,c) + X[ 5] + 0x6ed9eba1, 7) + d; b = RL(b, 10); - d = RL(d + f3(e,a,b) + X[12] + 0x6ed9eba1, 5) + c; a = RL(a, 10); - - // right - dd = RL(dd + f3(ee,aa,bb) + X[15] + 0x6d703ef3, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 5] + 0x6d703ef3, 7) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[ 1] + 0x6d703ef3, 15) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[ 3] + 0x6d703ef3, 11) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 7] + 0x6d703ef3, 8) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[14] + 0x6d703ef3, 6) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 6] + 0x6d703ef3, 6) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[ 9] + 0x6d703ef3, 14) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[11] + 0x6d703ef3, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 8] + 0x6d703ef3, 13) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[12] + 0x6d703ef3, 5) + cc; aa = RL(aa, 10); - cc = RL(cc + f3(dd,ee,aa) + X[ 2] + 0x6d703ef3, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f3(cc,dd,ee) + X[10] + 0x6d703ef3, 13) + aa; dd = RL(dd, 10); - aa = RL(aa + f3(bb,cc,dd) + X[ 0] + 0x6d703ef3, 13) + ee; cc = RL(cc, 10); - ee = RL(ee + f3(aa,bb,cc) + X[ 4] + 0x6d703ef3, 7) + dd; bb = RL(bb, 10); - dd = RL(dd + f3(ee,aa,bb) + X[13] + 0x6d703ef3, 5) + cc; aa = RL(aa, 10); - - t = c; c = cc; cc = t; - - // - // Rounds 48-63 - // - // left - c = RL(c + f4(d,e,a) + X[ 1] + 0x8f1bbcdc, 11) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[ 9] + 0x8f1bbcdc, 12) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[11] + 0x8f1bbcdc, 14) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[10] + 0x8f1bbcdc, 15) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 0] + 0x8f1bbcdc, 14) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 8] + 0x8f1bbcdc, 15) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[12] + 0x8f1bbcdc, 9) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[ 4] + 0x8f1bbcdc, 8) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[13] + 0x8f1bbcdc, 9) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 3] + 0x8f1bbcdc, 14) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 7] + 0x8f1bbcdc, 5) + b; e = RL(e, 10); - b = RL(b + f4(c,d,e) + X[15] + 0x8f1bbcdc, 6) + a; d = RL(d, 10); - a = RL(a + f4(b,c,d) + X[14] + 0x8f1bbcdc, 8) + e; c = RL(c, 10); - e = RL(e + f4(a,b,c) + X[ 5] + 0x8f1bbcdc, 6) + d; b = RL(b, 10); - d = RL(d + f4(e,a,b) + X[ 6] + 0x8f1bbcdc, 5) + c; a = RL(a, 10); - c = RL(c + f4(d,e,a) + X[ 2] + 0x8f1bbcdc, 12) + b; e = RL(e, 10); - - // right - cc = RL(cc + f2(dd,ee,aa) + X[ 8] + 0x7a6d76e9, 15) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[ 6] + 0x7a6d76e9, 5) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 4] + 0x7a6d76e9, 8) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 1] + 0x7a6d76e9, 11) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[ 3] + 0x7a6d76e9, 14) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[11] + 0x7a6d76e9, 14) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[15] + 0x7a6d76e9, 6) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 0] + 0x7a6d76e9, 14) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 5] + 0x7a6d76e9, 6) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[12] + 0x7a6d76e9, 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[ 2] + 0x7a6d76e9, 12) + bb; ee = RL(ee, 10); - bb = RL(bb + f2(cc,dd,ee) + X[13] + 0x7a6d76e9, 9) + aa; dd = RL(dd, 10); - aa = RL(aa + f2(bb,cc,dd) + X[ 9] + 0x7a6d76e9, 12) + ee; cc = RL(cc, 10); - ee = RL(ee + f2(aa,bb,cc) + X[ 7] + 0x7a6d76e9, 5) + dd; bb = RL(bb, 10); - dd = RL(dd + f2(ee,aa,bb) + X[10] + 0x7a6d76e9, 15) + cc; aa = RL(aa, 10); - cc = RL(cc + f2(dd,ee,aa) + X[14] + 0x7a6d76e9, 8) + bb; ee = RL(ee, 10); - - t = d; d = dd; dd = t; - - // - // Rounds 64-79 - // - // left - b = RL(b + f5(c,d,e) + X[ 4] + 0xa953fd4e, 9) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 0] + 0xa953fd4e, 15) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[ 5] + 0xa953fd4e, 5) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[ 9] + 0xa953fd4e, 11) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[ 7] + 0xa953fd4e, 6) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[12] + 0xa953fd4e, 8) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 2] + 0xa953fd4e, 13) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[10] + 0xa953fd4e, 12) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[14] + 0xa953fd4e, 5) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[ 1] + 0xa953fd4e, 12) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[ 3] + 0xa953fd4e, 13) + a; d = RL(d, 10); - a = RL(a + f5(b,c,d) + X[ 8] + 0xa953fd4e, 14) + e; c = RL(c, 10); - e = RL(e + f5(a,b,c) + X[11] + 0xa953fd4e, 11) + d; b = RL(b, 10); - d = RL(d + f5(e,a,b) + X[ 6] + 0xa953fd4e, 8) + c; a = RL(a, 10); - c = RL(c + f5(d,e,a) + X[15] + 0xa953fd4e, 5) + b; e = RL(e, 10); - b = RL(b + f5(c,d,e) + X[13] + 0xa953fd4e, 6) + a; d = RL(d, 10); - - // right - bb = RL(bb + f1(cc,dd,ee) + X[12], 8) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[15], 5) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[10], 12) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 4], 9) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 1], 12) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[ 5], 5) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[ 8], 14) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[ 7], 6) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 6], 8) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 2], 13) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[13], 6) + aa; dd = RL(dd, 10); - aa = RL(aa + f1(bb,cc,dd) + X[14], 5) + ee; cc = RL(cc, 10); - ee = RL(ee + f1(aa,bb,cc) + X[ 0], 15) + dd; bb = RL(bb, 10); - dd = RL(dd + f1(ee,aa,bb) + X[ 3], 13) + cc; aa = RL(aa, 10); - cc = RL(cc + f1(dd,ee,aa) + X[ 9], 11) + bb; ee = RL(ee, 10); - bb = RL(bb + f1(cc,dd,ee) + X[11], 11) + aa; dd = RL(dd, 10); - - // - // do (e, ee) swap as part of assignment. - // - - H0 += a; - H1 += b; - H2 += c; - H3 += d; - H4 += ee; - H5 += aa; - H6 += bb; - H7 += cc; - H8 += dd; - H9 += e; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA1Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA1Digest.java deleted file mode 100644 index 273e541..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA1Digest.java +++ /dev/null @@ -1,290 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.util.Pack; - -/** - * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349. - * - * It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5 - * is the "endienness" of the word processing! - */ -public class SHA1Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 20; - - private int H1, H2, H3, H4, H5; - - private int[] X = new int[80]; - private int xOff; - - /** - * Standard constructor - */ - public SHA1Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public SHA1Digest(SHA1Digest t) - { - super(t); - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "SHA-1"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - // Note: Inlined for performance -// X[xOff] = Pack.bigEndianToInt(in, inOff); - int n = in[ inOff] << 24; - n |= (in[++inOff] & 0xff) << 16; - n |= (in[++inOff] & 0xff) << 8; - n |= (in[++inOff] & 0xff); - X[xOff] = n; - - if (++xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength >>> 32); - X[15] = (int)(bitLength & 0xffffffff); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - Pack.intToBigEndian(H1, out, outOff); - Pack.intToBigEndian(H2, out, outOff + 4); - Pack.intToBigEndian(H3, out, outOff + 8); - Pack.intToBigEndian(H4, out, outOff + 12); - Pack.intToBigEndian(H5, out, outOff + 16); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - super.reset(); - - H1 = 0x67452301; - H2 = 0xefcdab89; - H3 = 0x98badcfe; - H4 = 0x10325476; - H5 = 0xc3d2e1f0; - - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - // - // Additive constants - // - private static final int Y1 = 0x5a827999; - private static final int Y2 = 0x6ed9eba1; - private static final int Y3 = 0x8f1bbcdc; - private static final int Y4 = 0xca62c1d6; - - private int f( - int u, - int v, - int w) - { - return ((u & v) | ((~u) & w)); - } - - private int h( - int u, - int v, - int w) - { - return (u ^ v ^ w); - } - - private int g( - int u, - int v, - int w) - { - return ((u & v) | (u & w) | (v & w)); - } - - protected void processBlock() - { - // - // expand 16 word block into 80 word block. - // - for (int i = 16; i < 80; i++) - { - int t = X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]; - X[i] = t << 1 | t >>> 31; - } - - // - // set up working variables. - // - int A = H1; - int B = H2; - int C = H3; - int D = H4; - int E = H5; - - // - // round 1 - // - int idx = 0; - - for (int j = 0; j < 4; j++) - { - // E = rotateLeft(A, 5) + f(B, C, D) + E + X[idx++] + Y1 - // B = rotateLeft(B, 30) - E += (A << 5 | A >>> 27) + f(B, C, D) + X[idx++] + Y1; - B = B << 30 | B >>> 2; - - D += (E << 5 | E >>> 27) + f(A, B, C) + X[idx++] + Y1; - A = A << 30 | A >>> 2; - - C += (D << 5 | D >>> 27) + f(E, A, B) + X[idx++] + Y1; - E = E << 30 | E >>> 2; - - B += (C << 5 | C >>> 27) + f(D, E, A) + X[idx++] + Y1; - D = D << 30 | D >>> 2; - - A += (B << 5 | B >>> 27) + f(C, D, E) + X[idx++] + Y1; - C = C << 30 | C >>> 2; - } - - // - // round 2 - // - for (int j = 0; j < 4; j++) - { - // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y2 - // B = rotateLeft(B, 30) - E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y2; - B = B << 30 | B >>> 2; - - D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y2; - A = A << 30 | A >>> 2; - - C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y2; - E = E << 30 | E >>> 2; - - B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y2; - D = D << 30 | D >>> 2; - - A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y2; - C = C << 30 | C >>> 2; - } - - // - // round 3 - // - for (int j = 0; j < 4; j++) - { - // E = rotateLeft(A, 5) + g(B, C, D) + E + X[idx++] + Y3 - // B = rotateLeft(B, 30) - E += (A << 5 | A >>> 27) + g(B, C, D) + X[idx++] + Y3; - B = B << 30 | B >>> 2; - - D += (E << 5 | E >>> 27) + g(A, B, C) + X[idx++] + Y3; - A = A << 30 | A >>> 2; - - C += (D << 5 | D >>> 27) + g(E, A, B) + X[idx++] + Y3; - E = E << 30 | E >>> 2; - - B += (C << 5 | C >>> 27) + g(D, E, A) + X[idx++] + Y3; - D = D << 30 | D >>> 2; - - A += (B << 5 | B >>> 27) + g(C, D, E) + X[idx++] + Y3; - C = C << 30 | C >>> 2; - } - - // - // round 4 - // - for (int j = 0; j <= 3; j++) - { - // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y4 - // B = rotateLeft(B, 30) - E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y4; - B = B << 30 | B >>> 2; - - D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y4; - A = A << 30 | A >>> 2; - - C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y4; - E = E << 30 | E >>> 2; - - B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y4; - D = D << 30 | D >>> 2; - - A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y4; - C = C << 30 | C >>> 2; - } - - - H1 += A; - H2 += B; - H3 += C; - H4 += D; - H5 += E; - - // - // reset start of the buffer. - // - xOff = 0; - for (int i = 0; i < 16; i++) - { - X[i] = 0; - } - } -} - - - - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA224Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA224Digest.java deleted file mode 100644 index 6877f83..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA224Digest.java +++ /dev/null @@ -1,292 +0,0 @@ -package org.bc.crypto.digests; - - -import org.bc.crypto.digests.GeneralDigest; -import org.bc.crypto.util.Pack; - - -/** - * SHA-224 as described in RFC 3874 - *

    - *         block  word  digest
    - * SHA-1   512    32    160
    - * SHA-224 512    32    224
    - * SHA-256 512    32    256
    - * SHA-384 1024   64    384
    - * SHA-512 1024   64    512
    - * 
    - */ -public class SHA224Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 28; - - private int H1, H2, H3, H4, H5, H6, H7, H8; - - private int[] X = new int[64]; - private int xOff; - - /** - * Standard constructor - */ - public SHA224Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public SHA224Digest(SHA224Digest t) - { - super(t); - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - H6 = t.H6; - H7 = t.H7; - H8 = t.H8; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "SHA-224"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - // Note: Inlined for performance -// X[xOff] = Pack.bigEndianToInt(in, inOff); - int n = in[ inOff] << 24; - n |= (in[++inOff] & 0xff) << 16; - n |= (in[++inOff] & 0xff) << 8; - n |= (in[++inOff] & 0xff); - X[xOff] = n; - - if (++xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength >>> 32); - X[15] = (int)(bitLength & 0xffffffff); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - Pack.intToBigEndian(H1, out, outOff); - Pack.intToBigEndian(H2, out, outOff + 4); - Pack.intToBigEndian(H3, out, outOff + 8); - Pack.intToBigEndian(H4, out, outOff + 12); - Pack.intToBigEndian(H5, out, outOff + 16); - Pack.intToBigEndian(H6, out, outOff + 20); - Pack.intToBigEndian(H7, out, outOff + 24); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - super.reset(); - - /* SHA-224 initial hash value - */ - - H1 = 0xc1059ed8; - H2 = 0x367cd507; - H3 = 0x3070dd17; - H4 = 0xf70e5939; - H5 = 0xffc00b31; - H6 = 0x68581511; - H7 = 0x64f98fa7; - H8 = 0xbefa4fa4; - - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - protected void processBlock() - { - // - // expand 16 word block into 64 word blocks. - // - for (int t = 16; t <= 63; t++) - { - X[t] = Theta1(X[t - 2]) + X[t - 7] + Theta0(X[t - 15]) + X[t - 16]; - } - - // - // set up working variables. - // - int a = H1; - int b = H2; - int c = H3; - int d = H4; - int e = H5; - int f = H6; - int g = H7; - int h = H8; - - - int t = 0; - for(int i = 0; i < 8; i ++) - { - // t = 8 * i - h += Sum1(e) + Ch(e, f, g) + K[t] + X[t]; - d += h; - h += Sum0(a) + Maj(a, b, c); - ++t; - - // t = 8 * i + 1 - g += Sum1(d) + Ch(d, e, f) + K[t] + X[t]; - c += g; - g += Sum0(h) + Maj(h, a, b); - ++t; - - // t = 8 * i + 2 - f += Sum1(c) + Ch(c, d, e) + K[t] + X[t]; - b += f; - f += Sum0(g) + Maj(g, h, a); - ++t; - - // t = 8 * i + 3 - e += Sum1(b) + Ch(b, c, d) + K[t] + X[t]; - a += e; - e += Sum0(f) + Maj(f, g, h); - ++t; - - // t = 8 * i + 4 - d += Sum1(a) + Ch(a, b, c) + K[t] + X[t]; - h += d; - d += Sum0(e) + Maj(e, f, g); - ++t; - - // t = 8 * i + 5 - c += Sum1(h) + Ch(h, a, b) + K[t] + X[t]; - g += c; - c += Sum0(d) + Maj(d, e, f); - ++t; - - // t = 8 * i + 6 - b += Sum1(g) + Ch(g, h, a) + K[t] + X[t]; - f += b; - b += Sum0(c) + Maj(c, d, e); - ++t; - - // t = 8 * i + 7 - a += Sum1(f) + Ch(f, g, h) + K[t] + X[t]; - e += a; - a += Sum0(b) + Maj(b, c, d); - ++t; - } - - H1 += a; - H2 += b; - H3 += c; - H4 += d; - H5 += e; - H6 += f; - H7 += g; - H8 += h; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i < 16; i++) - { - X[i] = 0; - } - } - - /* SHA-224 functions */ - private int Ch( - int x, - int y, - int z) - { - return ((x & y) ^ ((~x) & z)); - } - - private int Maj( - int x, - int y, - int z) - { - return ((x & y) ^ (x & z) ^ (y & z)); - } - - private int Sum0( - int x) - { - return ((x >>> 2) | (x << 30)) ^ ((x >>> 13) | (x << 19)) ^ ((x >>> 22) | (x << 10)); - } - - private int Sum1( - int x) - { - return ((x >>> 6) | (x << 26)) ^ ((x >>> 11) | (x << 21)) ^ ((x >>> 25) | (x << 7)); - } - - private int Theta0( - int x) - { - return ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3); - } - - private int Theta1( - int x) - { - return ((x >>> 17) | (x << 15)) ^ ((x >>> 19) | (x << 13)) ^ (x >>> 10); - } - - /* SHA-224 Constants - * (represent the first 32 bits of the fractional parts of the - * cube roots of the first sixty-four prime numbers) - */ - static final int K[] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - }; -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA256Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA256Digest.java deleted file mode 100644 index ccf6ef3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA256Digest.java +++ /dev/null @@ -1,295 +0,0 @@ -package org.bc.crypto.digests; - - -import org.bc.crypto.digests.GeneralDigest; -import org.bc.crypto.util.Pack; - - -/** - * FIPS 180-2 implementation of SHA-256. - * - *
    - *         block  word  digest
    - * SHA-1   512    32    160
    - * SHA-256 512    32    256
    - * SHA-384 1024   64    384
    - * SHA-512 1024   64    512
    - * 
    - */ -public class SHA256Digest - extends GeneralDigest -{ - private static final int DIGEST_LENGTH = 32; - - private int H1, H2, H3, H4, H5, H6, H7, H8; - - private int[] X = new int[64]; - private int xOff; - - /** - * Standard constructor - */ - public SHA256Digest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public SHA256Digest(SHA256Digest t) - { - super(t); - - H1 = t.H1; - H2 = t.H2; - H3 = t.H3; - H4 = t.H4; - H5 = t.H5; - H6 = t.H6; - H7 = t.H7; - H8 = t.H8; - - System.arraycopy(t.X, 0, X, 0, t.X.length); - xOff = t.xOff; - } - - public String getAlgorithmName() - { - return "SHA-256"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - protected void processWord( - byte[] in, - int inOff) - { - // Note: Inlined for performance -// X[xOff] = Pack.bigEndianToInt(in, inOff); - int n = in[inOff] << 24; - n |= (in[++inOff] & 0xff) << 16; - n |= (in[++inOff] & 0xff) << 8; - n |= (in[++inOff] & 0xff); - X[xOff] = n; - - if (++xOff == 16) - { - processBlock(); - } - } - - protected void processLength( - long bitLength) - { - if (xOff > 14) - { - processBlock(); - } - - X[14] = (int)(bitLength >>> 32); - X[15] = (int)(bitLength & 0xffffffff); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - Pack.intToBigEndian(H1, out, outOff); - Pack.intToBigEndian(H2, out, outOff + 4); - Pack.intToBigEndian(H3, out, outOff + 8); - Pack.intToBigEndian(H4, out, outOff + 12); - Pack.intToBigEndian(H5, out, outOff + 16); - Pack.intToBigEndian(H6, out, outOff + 20); - Pack.intToBigEndian(H7, out, outOff + 24); - Pack.intToBigEndian(H8, out, outOff + 28); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - super.reset(); - - /* SHA-256 initial hash value - * The first 32 bits of the fractional parts of the square roots - * of the first eight prime numbers - */ - - H1 = 0x6a09e667; - H2 = 0xbb67ae85; - H3 = 0x3c6ef372; - H4 = 0xa54ff53a; - H5 = 0x510e527f; - H6 = 0x9b05688c; - H7 = 0x1f83d9ab; - H8 = 0x5be0cd19; - - xOff = 0; - for (int i = 0; i != X.length; i++) - { - X[i] = 0; - } - } - - protected void processBlock() - { - // - // expand 16 word block into 64 word blocks. - // - for (int t = 16; t <= 63; t++) - { - X[t] = Theta1(X[t - 2]) + X[t - 7] + Theta0(X[t - 15]) + X[t - 16]; - } - - // - // set up working variables. - // - int a = H1; - int b = H2; - int c = H3; - int d = H4; - int e = H5; - int f = H6; - int g = H7; - int h = H8; - - int t = 0; - for(int i = 0; i < 8; i ++) - { - // t = 8 * i - h += Sum1(e) + Ch(e, f, g) + K[t] + X[t]; - d += h; - h += Sum0(a) + Maj(a, b, c); - ++t; - - // t = 8 * i + 1 - g += Sum1(d) + Ch(d, e, f) + K[t] + X[t]; - c += g; - g += Sum0(h) + Maj(h, a, b); - ++t; - - // t = 8 * i + 2 - f += Sum1(c) + Ch(c, d, e) + K[t] + X[t]; - b += f; - f += Sum0(g) + Maj(g, h, a); - ++t; - - // t = 8 * i + 3 - e += Sum1(b) + Ch(b, c, d) + K[t] + X[t]; - a += e; - e += Sum0(f) + Maj(f, g, h); - ++t; - - // t = 8 * i + 4 - d += Sum1(a) + Ch(a, b, c) + K[t] + X[t]; - h += d; - d += Sum0(e) + Maj(e, f, g); - ++t; - - // t = 8 * i + 5 - c += Sum1(h) + Ch(h, a, b) + K[t] + X[t]; - g += c; - c += Sum0(d) + Maj(d, e, f); - ++t; - - // t = 8 * i + 6 - b += Sum1(g) + Ch(g, h, a) + K[t] + X[t]; - f += b; - b += Sum0(c) + Maj(c, d, e); - ++t; - - // t = 8 * i + 7 - a += Sum1(f) + Ch(f, g, h) + K[t] + X[t]; - e += a; - a += Sum0(b) + Maj(b, c, d); - ++t; - } - - H1 += a; - H2 += b; - H3 += c; - H4 += d; - H5 += e; - H6 += f; - H7 += g; - H8 += h; - - // - // reset the offset and clean out the word buffer. - // - xOff = 0; - for (int i = 0; i < 16; i++) - { - X[i] = 0; - } - } - - /* SHA-256 functions */ - private int Ch( - int x, - int y, - int z) - { - return (x & y) ^ ((~x) & z); - } - - private int Maj( - int x, - int y, - int z) - { - return (x & y) ^ (x & z) ^ (y & z); - } - - private int Sum0( - int x) - { - return ((x >>> 2) | (x << 30)) ^ ((x >>> 13) | (x << 19)) ^ ((x >>> 22) | (x << 10)); - } - - private int Sum1( - int x) - { - return ((x >>> 6) | (x << 26)) ^ ((x >>> 11) | (x << 21)) ^ ((x >>> 25) | (x << 7)); - } - - private int Theta0( - int x) - { - return ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3); - } - - private int Theta1( - int x) - { - return ((x >>> 17) | (x << 15)) ^ ((x >>> 19) | (x << 13)) ^ (x >>> 10); - } - - /* SHA-256 Constants - * (represent the first 32 bits of the fractional parts of the - * cube roots of the first sixty-four prime numbers) - */ - static final int K[] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - }; -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA384Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA384Digest.java deleted file mode 100644 index 9db972e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA384Digest.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.util.Pack; - - -/** - * FIPS 180-2 implementation of SHA-384. - * - *
    - *         block  word  digest
    - * SHA-1   512    32    160
    - * SHA-256 512    32    256
    - * SHA-384 1024   64    384
    - * SHA-512 1024   64    512
    - * 
    - */ -public class SHA384Digest - extends LongDigest -{ - - private static final int DIGEST_LENGTH = 48; - - /** - * Standard constructor - */ - public SHA384Digest() - { - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public SHA384Digest(SHA384Digest t) - { - super(t); - } - - public String getAlgorithmName() - { - return "SHA-384"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - Pack.longToBigEndian(H1, out, outOff); - Pack.longToBigEndian(H2, out, outOff + 8); - Pack.longToBigEndian(H3, out, outOff + 16); - Pack.longToBigEndian(H4, out, outOff + 24); - Pack.longToBigEndian(H5, out, outOff + 32); - Pack.longToBigEndian(H6, out, outOff + 40); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - super.reset(); - - /* SHA-384 initial hash value - * The first 64 bits of the fractional parts of the square roots - * of the 9th through 16th prime numbers - */ - H1 = 0xcbbb9d5dc1059ed8l; - H2 = 0x629a292a367cd507l; - H3 = 0x9159015a3070dd17l; - H4 = 0x152fecd8f70e5939l; - H5 = 0x67332667ffc00b31l; - H6 = 0x8eb44a8768581511l; - H7 = 0xdb0c2e0d64f98fa7l; - H8 = 0x47b5481dbefa4fa4l; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA3Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA3Digest.java deleted file mode 100644 index 559cd59..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA3Digest.java +++ /dev/null @@ -1,547 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; -import org.bc.util.Arrays; - -/** - * implementation of SHA-3 based on following KeccakNISTInterface.c from http://keccak.noekeon.org/ - *

    - * Following the naming conventions used in the C source code to enable easy review of the implementation. - */ -public class SHA3Digest - implements ExtendedDigest -{ - private static long[] KeccakRoundConstants = keccakInitializeRoundConstants(); - - private static int[] KeccakRhoOffsets = keccakInitializeRhoOffsets(); - - private static long[] keccakInitializeRoundConstants() - { - long[] keccakRoundConstants = new long[24]; - byte[] LFSRstate = new byte[1]; - - LFSRstate[0] = 0x01; - int i, j, bitPosition; - - for (i = 0; i < 24; i++) - { - keccakRoundConstants[i] = 0; - for (j = 0; j < 7; j++) - { - bitPosition = (1 << j) - 1; - if (LFSR86540(LFSRstate)) - { - keccakRoundConstants[i] ^= 1L << bitPosition; - } - } - } - - return keccakRoundConstants; - } - - private static boolean LFSR86540(byte[] LFSR) - { - boolean result = (((LFSR[0]) & 0x01) != 0); - if (((LFSR[0]) & 0x80) != 0) - { - LFSR[0] = (byte)(((LFSR[0]) << 1) ^ 0x71); - } - else - { - LFSR[0] <<= 1; - } - - return result; - } - - private static int[] keccakInitializeRhoOffsets() - { - int[] keccakRhoOffsets = new int[25]; - int x, y, t, newX, newY; - - keccakRhoOffsets[(((0) % 5) + 5 * ((0) % 5))] = 0; - x = 1; - y = 0; - for (t = 0; t < 24; t++) - { - keccakRhoOffsets[(((x) % 5) + 5 * ((y) % 5))] = ((t + 1) * (t + 2) / 2) % 64; - newX = (0 * x + 1 * y) % 5; - newY = (2 * x + 3 * y) % 5; - x = newX; - y = newY; - } - - return keccakRhoOffsets; - } - - private byte[] state = new byte[(1600 / 8)]; - private byte[] dataQueue = new byte[(1536 / 8)]; - private int rate; - private int bitsInQueue; - private int fixedOutputLength; - private boolean squeezing; - private int bitsAvailableForSqueezing; - private byte[] chunk; - private byte[] oneByte; - - private void clearDataQueueSection(int off, int len) - { - for (int i = off; i != off + len; i++) - { - dataQueue[i] = 0; - } - } - - public SHA3Digest() - { - init(0); - } - - public SHA3Digest(int bitLength) - { - init(bitLength); - } - - public SHA3Digest(SHA3Digest source) { - System.arraycopy(source.state, 0, this.state, 0, source.state.length); - System.arraycopy(source.dataQueue, 0, this.dataQueue, 0, source.dataQueue.length); - this.rate = source.rate; - this.bitsInQueue = source.bitsInQueue; - this.fixedOutputLength = source.fixedOutputLength; - this.squeezing = source.squeezing; - this.bitsAvailableForSqueezing = source.bitsAvailableForSqueezing; - this.chunk = Arrays.clone(source.chunk); - this.oneByte = Arrays.clone(source.oneByte); - } - - public String getAlgorithmName() - { - return "SHA3-" + fixedOutputLength; - } - - public int getDigestSize() - { - return fixedOutputLength / 8; - } - - public void update(byte in) - { - oneByte[0] = in; - - doUpdate(oneByte, 0, 8L); - } - - public void update(byte[] in, int inOff, int len) - { - doUpdate(in, inOff, len * 8L); - } - - public int doFinal(byte[] out, int outOff) - { - squeeze(out, outOff, fixedOutputLength); - - reset(); - - return getDigestSize(); - } - - public void reset() - { - init(fixedOutputLength); - } - - /** - * Return the size of block that the compression function is applied to in bytes. - * - * @return internal byte length of a block. - */ - public int getByteLength() - { - return rate / 8; - } - - private void init(int bitLength) - { - switch (bitLength) - { - case 0: - case 288: - initSponge(1024, 576); - break; - case 224: - initSponge(1152, 448); - break; - case 256: - initSponge(1088, 512); - break; - case 384: - initSponge(832, 768); - break; - case 512: - initSponge(576, 1024); - break; - default: - throw new IllegalArgumentException("bitLength must be one of 224, 256, 384, or 512."); - } - } - - private void doUpdate(byte[] data, int off, long databitlen) - { - if ((databitlen % 8) == 0) - { - absorb(data, off, databitlen); - } - else - { - absorb(data, off, databitlen - (databitlen % 8)); - - byte[] lastByte = new byte[1]; - - lastByte[0] = (byte)(data[off + (int)(databitlen / 8)] >> (8 - (databitlen % 8))); - absorb(lastByte, off, databitlen % 8); - } - } - - private void initSponge(int rate, int capacity) - { - if (rate + capacity != 1600) - { - throw new IllegalStateException("rate + capacity != 1600"); - } - if ((rate <= 0) || (rate >= 1600) || ((rate % 64) != 0)) - { - throw new IllegalStateException("invalid rate value"); - } - - this.rate = rate; - // this is never read, need to check to see why we want to save it - // this.capacity = capacity; - this.fixedOutputLength = 0; - Arrays.fill(this.state, (byte)0); - Arrays.fill(this.dataQueue, (byte)0); - this.bitsInQueue = 0; - this.squeezing = false; - this.bitsAvailableForSqueezing = 0; - this.fixedOutputLength = capacity / 2; - this.chunk = new byte[rate / 8]; - this.oneByte = new byte[1]; - } - - private void absorbQueue() - { - KeccakAbsorb(state, dataQueue, rate / 8); - - bitsInQueue = 0; - } - - private void absorb(byte[] data, int off, long databitlen) - { - long i, j, wholeBlocks; - - if ((bitsInQueue % 8) != 0) - { - throw new IllegalStateException("attempt to absorb with odd length queue."); - } - if (squeezing) - { - throw new IllegalStateException("attempt to absorb while squeezing."); - } - - i = 0; - while (i < databitlen) - { - if ((bitsInQueue == 0) && (databitlen >= rate) && (i <= (databitlen - rate))) - { - wholeBlocks = (databitlen - i) / rate; - - for (j = 0; j < wholeBlocks; j++) - { - System.arraycopy(data, (int)(off + (i / 8) + (j * chunk.length)), chunk, 0, chunk.length); - -// displayIntermediateValues.displayBytes(1, "Block to be absorbed", curData, rate / 8); - - KeccakAbsorb(state, chunk, chunk.length); - } - - i += wholeBlocks * rate; - } - else - { - int partialBlock = (int)(databitlen - i); - if (partialBlock + bitsInQueue > rate) - { - partialBlock = rate - bitsInQueue; - } - int partialByte = partialBlock % 8; - partialBlock -= partialByte; - System.arraycopy(data, off + (int)(i / 8), dataQueue, bitsInQueue / 8, partialBlock / 8); - - bitsInQueue += partialBlock; - i += partialBlock; - if (bitsInQueue == rate) - { - absorbQueue(); - } - if (partialByte > 0) - { - int mask = (1 << partialByte) - 1; - dataQueue[bitsInQueue / 8] = (byte)(data[off + ((int)(i / 8))] & mask); - bitsInQueue += partialByte; - i += partialByte; - } - } - } - } - - private void padAndSwitchToSqueezingPhase() - { - if (bitsInQueue + 1 == rate) - { - dataQueue[bitsInQueue / 8] |= 1 << (bitsInQueue % 8); - absorbQueue(); - clearDataQueueSection(0, rate / 8); - } - else - { - clearDataQueueSection((bitsInQueue + 7) / 8, rate / 8 - (bitsInQueue + 7) / 8); - dataQueue[bitsInQueue / 8] |= 1 << (bitsInQueue % 8); - } - dataQueue[(rate - 1) / 8] |= 1 << ((rate - 1) % 8); - absorbQueue(); - - -// displayIntermediateValues.displayText(1, "--- Switching to squeezing phase ---"); - - - if (rate == 1024) - { - KeccakExtract1024bits(state, dataQueue); - bitsAvailableForSqueezing = 1024; - } - else - - { - KeccakExtract(state, dataQueue, rate / 64); - bitsAvailableForSqueezing = rate; - } - -// displayIntermediateValues.displayBytes(1, "Block available for squeezing", dataQueue, bitsAvailableForSqueezing / 8); - - squeezing = true; - } - - private void squeeze(byte[] output, int offset, long outputLength) - { - long i; - int partialBlock; - - if (!squeezing) - { - padAndSwitchToSqueezingPhase(); - } - if ((outputLength % 8) != 0) - { - throw new IllegalStateException("outputLength not a multiple of 8"); - } - - i = 0; - while (i < outputLength) - { - if (bitsAvailableForSqueezing == 0) - { - keccakPermutation(state); - - if (rate == 1024) - { - KeccakExtract1024bits(state, dataQueue); - bitsAvailableForSqueezing = 1024; - } - else - - { - KeccakExtract(state, dataQueue, rate / 64); - bitsAvailableForSqueezing = rate; - } - -// displayIntermediateValues.displayBytes(1, "Block available for squeezing", dataQueue, bitsAvailableForSqueezing / 8); - - } - partialBlock = bitsAvailableForSqueezing; - if ((long)partialBlock > outputLength - i) - { - partialBlock = (int)(outputLength - i); - } - - System.arraycopy(dataQueue, (rate - bitsAvailableForSqueezing) / 8, output, offset + (int)(i / 8), partialBlock / 8); - bitsAvailableForSqueezing -= partialBlock; - i += partialBlock; - } - } - - private void fromBytesToWords(long[] stateAsWords, byte[] state) - { - for (int i = 0; i < (1600 / 64); i++) - { - stateAsWords[i] = 0; - int index = i * (64 / 8); - for (int j = 0; j < (64 / 8); j++) - { - stateAsWords[i] |= ((long)state[index + j] & 0xff) << ((8 * j)); - } - } - } - - private void fromWordsToBytes(byte[] state, long[] stateAsWords) - { - for (int i = 0; i < (1600 / 64); i++) - { - int index = i * (64 / 8); - for (int j = 0; j < (64 / 8); j++) - { - state[index + j] = (byte)((stateAsWords[i] >>> ((8 * j))) & 0xFF); - } - } - } - - private void keccakPermutation(byte[] state) - { - long[] longState = new long[state.length / 8]; - - fromBytesToWords(longState, state); - -// displayIntermediateValues.displayStateAsBytes(1, "Input of permutation", longState); - - keccakPermutationOnWords(longState); - -// displayIntermediateValues.displayStateAsBytes(1, "State after permutation", longState); - - fromWordsToBytes(state, longState); - } - - private void keccakPermutationAfterXor(byte[] state, byte[] data, int dataLengthInBytes) - { - int i; - - for (i = 0; i < dataLengthInBytes; i++) - { - state[i] ^= data[i]; - } - - keccakPermutation(state); - } - - private void keccakPermutationOnWords(long[] state) - { - int i; - -// displayIntermediateValues.displayStateAs64bitWords(3, "Same, with lanes as 64-bit words", state); - - for (i = 0; i < 24; i++) - { -// displayIntermediateValues.displayRoundNumber(3, i); - - theta(state); -// displayIntermediateValues.displayStateAs64bitWords(3, "After theta", state); - - rho(state); -// displayIntermediateValues.displayStateAs64bitWords(3, "After rho", state); - - pi(state); -// displayIntermediateValues.displayStateAs64bitWords(3, "After pi", state); - - chi(state); -// displayIntermediateValues.displayStateAs64bitWords(3, "After chi", state); - - iota(state, i); -// displayIntermediateValues.displayStateAs64bitWords(3, "After iota", state); - } - } - - long[] C = new long[5]; - - private void theta(long[] A) - { - for (int x = 0; x < 5; x++) - { - C[x] = 0; - for (int y = 0; y < 5; y++) - { - C[x] ^= A[x + 5 * y]; - } - } - for (int x = 0; x < 5; x++) - { - long dX = ((((C[(x + 1) % 5]) << 1) ^ ((C[(x + 1) % 5]) >>> (64 - 1)))) ^ C[(x + 4) % 5]; - for (int y = 0; y < 5; y++) - { - A[x + 5 * y] ^= dX; - } - } - } - - private void rho(long[] A) - { - for (int x = 0; x < 5; x++) - { - for (int y = 0; y < 5; y++) - { - int index = x + 5 * y; - A[index] = ((KeccakRhoOffsets[index] != 0) ? (((A[index]) << KeccakRhoOffsets[index]) ^ ((A[index]) >>> (64 - KeccakRhoOffsets[index]))) : A[index]); - } - } - } - - long[] tempA = new long[25]; - - private void pi(long[] A) - { - System.arraycopy(A, 0, tempA, 0, tempA.length); - - for (int x = 0; x < 5; x++) - { - for (int y = 0; y < 5; y++) - { - A[y + 5 * ((2 * x + 3 * y) % 5)] = tempA[x + 5 * y]; - } - } - } - - long[] chiC = new long[5]; - - private void chi(long[] A) - { - for (int y = 0; y < 5; y++) - { - for (int x = 0; x < 5; x++) - { - chiC[x] = A[x + 5 * y] ^ ((~A[(((x + 1) % 5) + 5 * y)]) & A[(((x + 2) % 5) + 5 * y)]); - } - for (int x = 0; x < 5; x++) - { - A[x + 5 * y] = chiC[x]; - } - } - } - - private void iota(long[] A, int indexRound) - { - A[(((0) % 5) + 5 * ((0) % 5))] ^= KeccakRoundConstants[indexRound]; - } - - private void KeccakAbsorb(byte[] byteState, byte[] data, int dataInBytes) - { - keccakPermutationAfterXor(byteState, data, dataInBytes); - } - - - private void KeccakExtract1024bits(byte[] byteState, byte[] data) - { - System.arraycopy(byteState, 0, data, 0, 128); - } - - - private void KeccakExtract(byte[] byteState, byte[] data, int laneCount) - { - System.arraycopy(byteState, 0, data, 0, laneCount * 8); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA512Digest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA512Digest.java deleted file mode 100644 index c9e2479..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/SHA512Digest.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.util.Pack; - - -/** - * FIPS 180-2 implementation of SHA-512. - * - *

    - *         block  word  digest
    - * SHA-1   512    32    160
    - * SHA-256 512    32    256
    - * SHA-384 1024   64    384
    - * SHA-512 1024   64    512
    - * 
    - */ -public class SHA512Digest - extends LongDigest -{ - private static final int DIGEST_LENGTH = 64; - - /** - * Standard constructor - */ - public SHA512Digest() - { - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public SHA512Digest(SHA512Digest t) - { - super(t); - } - - public String getAlgorithmName() - { - return "SHA-512"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - Pack.longToBigEndian(H1, out, outOff); - Pack.longToBigEndian(H2, out, outOff + 8); - Pack.longToBigEndian(H3, out, outOff + 16); - Pack.longToBigEndian(H4, out, outOff + 24); - Pack.longToBigEndian(H5, out, outOff + 32); - Pack.longToBigEndian(H6, out, outOff + 40); - Pack.longToBigEndian(H7, out, outOff + 48); - Pack.longToBigEndian(H8, out, outOff + 56); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - super.reset(); - - /* SHA-512 initial hash value - * The first 64 bits of the fractional parts of the square roots - * of the first eight prime numbers - */ - H1 = 0x6a09e667f3bcc908L; - H2 = 0xbb67ae8584caa73bL; - H3 = 0x3c6ef372fe94f82bL; - H4 = 0xa54ff53a5f1d36f1L; - H5 = 0x510e527fade682d1L; - H6 = 0x9b05688c2b3e6c1fL; - H7 = 0x1f83d9abfb41bd6bL; - H8 = 0x5be0cd19137e2179L; - } -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/ShortenedDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/ShortenedDigest.java deleted file mode 100644 index c211244..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/ShortenedDigest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; - -/** - * Wrapper class that reduces the output length of a particular digest to - * only the first n bytes of the digest function. - */ -public class ShortenedDigest - implements ExtendedDigest -{ - private ExtendedDigest baseDigest; - private int length; - - /** - * Base constructor. - * - * @param baseDigest underlying digest to use. - * @param length length in bytes of the output of doFinal. - * @exception IllegalArgumentException if baseDigest is null, or length is greater than baseDigest.getDigestSize(). - */ - public ShortenedDigest( - ExtendedDigest baseDigest, - int length) - { - if (baseDigest == null) - { - throw new IllegalArgumentException("baseDigest must not be null"); - } - - if (length > baseDigest.getDigestSize()) - { - throw new IllegalArgumentException("baseDigest output not large enough to support length"); - } - - this.baseDigest = baseDigest; - this.length = length; - } - - public String getAlgorithmName() - { - return baseDigest.getAlgorithmName() + "(" + length * 8 + ")"; - } - - public int getDigestSize() - { - return length; - } - - public void update(byte in) - { - baseDigest.update(in); - } - - public void update(byte[] in, int inOff, int len) - { - baseDigest.update(in, inOff, len); - } - - public int doFinal(byte[] out, int outOff) - { - byte[] tmp = new byte[baseDigest.getDigestSize()]; - - baseDigest.doFinal(tmp, 0); - - System.arraycopy(tmp, 0, out, outOff, length); - - return length; - } - - public void reset() - { - baseDigest.reset(); - } - - public int getByteLength() - { - return baseDigest.getByteLength(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/TigerDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/TigerDigest.java deleted file mode 100644 index 247bd62..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/TigerDigest.java +++ /dev/null @@ -1,866 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; - -/** - * implementation of Tiger based on: - * - * http://www.cs.technion.ac.il/~biham/Reports/Tiger - */ -public class TigerDigest - implements ExtendedDigest -{ - private static final int BYTE_LENGTH = 64; - - /* - * S-Boxes. - */ - private static final long[] t1 = { - 0x02AAB17CF7E90C5EL /* 0 */, 0xAC424B03E243A8ECL /* 1 */, - 0x72CD5BE30DD5FCD3L /* 2 */, 0x6D019B93F6F97F3AL /* 3 */, - 0xCD9978FFD21F9193L /* 4 */, 0x7573A1C9708029E2L /* 5 */, - 0xB164326B922A83C3L /* 6 */, 0x46883EEE04915870L /* 7 */, - 0xEAACE3057103ECE6L /* 8 */, 0xC54169B808A3535CL /* 9 */, - 0x4CE754918DDEC47CL /* 10 */, 0x0AA2F4DFDC0DF40CL /* 11 */, - 0x10B76F18A74DBEFAL /* 12 */, 0xC6CCB6235AD1AB6AL /* 13 */, - 0x13726121572FE2FFL /* 14 */, 0x1A488C6F199D921EL /* 15 */, - 0x4BC9F9F4DA0007CAL /* 16 */, 0x26F5E6F6E85241C7L /* 17 */, - 0x859079DBEA5947B6L /* 18 */, 0x4F1885C5C99E8C92L /* 19 */, - 0xD78E761EA96F864BL /* 20 */, 0x8E36428C52B5C17DL /* 21 */, - 0x69CF6827373063C1L /* 22 */, 0xB607C93D9BB4C56EL /* 23 */, - 0x7D820E760E76B5EAL /* 24 */, 0x645C9CC6F07FDC42L /* 25 */, - 0xBF38A078243342E0L /* 26 */, 0x5F6B343C9D2E7D04L /* 27 */, - 0xF2C28AEB600B0EC6L /* 28 */, 0x6C0ED85F7254BCACL /* 29 */, - 0x71592281A4DB4FE5L /* 30 */, 0x1967FA69CE0FED9FL /* 31 */, - 0xFD5293F8B96545DBL /* 32 */, 0xC879E9D7F2A7600BL /* 33 */, - 0x860248920193194EL /* 34 */, 0xA4F9533B2D9CC0B3L /* 35 */, - 0x9053836C15957613L /* 36 */, 0xDB6DCF8AFC357BF1L /* 37 */, - 0x18BEEA7A7A370F57L /* 38 */, 0x037117CA50B99066L /* 39 */, - 0x6AB30A9774424A35L /* 40 */, 0xF4E92F02E325249BL /* 41 */, - 0x7739DB07061CCAE1L /* 42 */, 0xD8F3B49CECA42A05L /* 43 */, - 0xBD56BE3F51382F73L /* 44 */, 0x45FAED5843B0BB28L /* 45 */, - 0x1C813D5C11BF1F83L /* 46 */, 0x8AF0E4B6D75FA169L /* 47 */, - 0x33EE18A487AD9999L /* 48 */, 0x3C26E8EAB1C94410L /* 49 */, - 0xB510102BC0A822F9L /* 50 */, 0x141EEF310CE6123BL /* 51 */, - 0xFC65B90059DDB154L /* 52 */, 0xE0158640C5E0E607L /* 53 */, - 0x884E079826C3A3CFL /* 54 */, 0x930D0D9523C535FDL /* 55 */, - 0x35638D754E9A2B00L /* 56 */, 0x4085FCCF40469DD5L /* 57 */, - 0xC4B17AD28BE23A4CL /* 58 */, 0xCAB2F0FC6A3E6A2EL /* 59 */, - 0x2860971A6B943FCDL /* 60 */, 0x3DDE6EE212E30446L /* 61 */, - 0x6222F32AE01765AEL /* 62 */, 0x5D550BB5478308FEL /* 63 */, - 0xA9EFA98DA0EDA22AL /* 64 */, 0xC351A71686C40DA7L /* 65 */, - 0x1105586D9C867C84L /* 66 */, 0xDCFFEE85FDA22853L /* 67 */, - 0xCCFBD0262C5EEF76L /* 68 */, 0xBAF294CB8990D201L /* 69 */, - 0xE69464F52AFAD975L /* 70 */, 0x94B013AFDF133E14L /* 71 */, - 0x06A7D1A32823C958L /* 72 */, 0x6F95FE5130F61119L /* 73 */, - 0xD92AB34E462C06C0L /* 74 */, 0xED7BDE33887C71D2L /* 75 */, - 0x79746D6E6518393EL /* 76 */, 0x5BA419385D713329L /* 77 */, - 0x7C1BA6B948A97564L /* 78 */, 0x31987C197BFDAC67L /* 79 */, - 0xDE6C23C44B053D02L /* 80 */, 0x581C49FED002D64DL /* 81 */, - 0xDD474D6338261571L /* 82 */, 0xAA4546C3E473D062L /* 83 */, - 0x928FCE349455F860L /* 84 */, 0x48161BBACAAB94D9L /* 85 */, - 0x63912430770E6F68L /* 86 */, 0x6EC8A5E602C6641CL /* 87 */, - 0x87282515337DDD2BL /* 88 */, 0x2CDA6B42034B701BL /* 89 */, - 0xB03D37C181CB096DL /* 90 */, 0xE108438266C71C6FL /* 91 */, - 0x2B3180C7EB51B255L /* 92 */, 0xDF92B82F96C08BBCL /* 93 */, - 0x5C68C8C0A632F3BAL /* 94 */, 0x5504CC861C3D0556L /* 95 */, - 0xABBFA4E55FB26B8FL /* 96 */, 0x41848B0AB3BACEB4L /* 97 */, - 0xB334A273AA445D32L /* 98 */, 0xBCA696F0A85AD881L /* 99 */, - 0x24F6EC65B528D56CL /* 100 */, 0x0CE1512E90F4524AL /* 101 */, - 0x4E9DD79D5506D35AL /* 102 */, 0x258905FAC6CE9779L /* 103 */, - 0x2019295B3E109B33L /* 104 */, 0xF8A9478B73A054CCL /* 105 */, - 0x2924F2F934417EB0L /* 106 */, 0x3993357D536D1BC4L /* 107 */, - 0x38A81AC21DB6FF8BL /* 108 */, 0x47C4FBF17D6016BFL /* 109 */, - 0x1E0FAADD7667E3F5L /* 110 */, 0x7ABCFF62938BEB96L /* 111 */, - 0xA78DAD948FC179C9L /* 112 */, 0x8F1F98B72911E50DL /* 113 */, - 0x61E48EAE27121A91L /* 114 */, 0x4D62F7AD31859808L /* 115 */, - 0xECEBA345EF5CEAEBL /* 116 */, 0xF5CEB25EBC9684CEL /* 117 */, - 0xF633E20CB7F76221L /* 118 */, 0xA32CDF06AB8293E4L /* 119 */, - 0x985A202CA5EE2CA4L /* 120 */, 0xCF0B8447CC8A8FB1L /* 121 */, - 0x9F765244979859A3L /* 122 */, 0xA8D516B1A1240017L /* 123 */, - 0x0BD7BA3EBB5DC726L /* 124 */, 0xE54BCA55B86ADB39L /* 125 */, - 0x1D7A3AFD6C478063L /* 126 */, 0x519EC608E7669EDDL /* 127 */, - 0x0E5715A2D149AA23L /* 128 */, 0x177D4571848FF194L /* 129 */, - 0xEEB55F3241014C22L /* 130 */, 0x0F5E5CA13A6E2EC2L /* 131 */, - 0x8029927B75F5C361L /* 132 */, 0xAD139FABC3D6E436L /* 133 */, - 0x0D5DF1A94CCF402FL /* 134 */, 0x3E8BD948BEA5DFC8L /* 135 */, - 0xA5A0D357BD3FF77EL /* 136 */, 0xA2D12E251F74F645L /* 137 */, - 0x66FD9E525E81A082L /* 138 */, 0x2E0C90CE7F687A49L /* 139 */, - 0xC2E8BCBEBA973BC5L /* 140 */, 0x000001BCE509745FL /* 141 */, - 0x423777BBE6DAB3D6L /* 142 */, 0xD1661C7EAEF06EB5L /* 143 */, - 0xA1781F354DAACFD8L /* 144 */, 0x2D11284A2B16AFFCL /* 145 */, - 0xF1FC4F67FA891D1FL /* 146 */, 0x73ECC25DCB920ADAL /* 147 */, - 0xAE610C22C2A12651L /* 148 */, 0x96E0A810D356B78AL /* 149 */, - 0x5A9A381F2FE7870FL /* 150 */, 0xD5AD62EDE94E5530L /* 151 */, - 0xD225E5E8368D1427L /* 152 */, 0x65977B70C7AF4631L /* 153 */, - 0x99F889B2DE39D74FL /* 154 */, 0x233F30BF54E1D143L /* 155 */, - 0x9A9675D3D9A63C97L /* 156 */, 0x5470554FF334F9A8L /* 157 */, - 0x166ACB744A4F5688L /* 158 */, 0x70C74CAAB2E4AEADL /* 159 */, - 0xF0D091646F294D12L /* 160 */, 0x57B82A89684031D1L /* 161 */, - 0xEFD95A5A61BE0B6BL /* 162 */, 0x2FBD12E969F2F29AL /* 163 */, - 0x9BD37013FEFF9FE8L /* 164 */, 0x3F9B0404D6085A06L /* 165 */, - 0x4940C1F3166CFE15L /* 166 */, 0x09542C4DCDF3DEFBL /* 167 */, - 0xB4C5218385CD5CE3L /* 168 */, 0xC935B7DC4462A641L /* 169 */, - 0x3417F8A68ED3B63FL /* 170 */, 0xB80959295B215B40L /* 171 */, - 0xF99CDAEF3B8C8572L /* 172 */, 0x018C0614F8FCB95DL /* 173 */, - 0x1B14ACCD1A3ACDF3L /* 174 */, 0x84D471F200BB732DL /* 175 */, - 0xC1A3110E95E8DA16L /* 176 */, 0x430A7220BF1A82B8L /* 177 */, - 0xB77E090D39DF210EL /* 178 */, 0x5EF4BD9F3CD05E9DL /* 179 */, - 0x9D4FF6DA7E57A444L /* 180 */, 0xDA1D60E183D4A5F8L /* 181 */, - 0xB287C38417998E47L /* 182 */, 0xFE3EDC121BB31886L /* 183 */, - 0xC7FE3CCC980CCBEFL /* 184 */, 0xE46FB590189BFD03L /* 185 */, - 0x3732FD469A4C57DCL /* 186 */, 0x7EF700A07CF1AD65L /* 187 */, - 0x59C64468A31D8859L /* 188 */, 0x762FB0B4D45B61F6L /* 189 */, - 0x155BAED099047718L /* 190 */, 0x68755E4C3D50BAA6L /* 191 */, - 0xE9214E7F22D8B4DFL /* 192 */, 0x2ADDBF532EAC95F4L /* 193 */, - 0x32AE3909B4BD0109L /* 194 */, 0x834DF537B08E3450L /* 195 */, - 0xFA209DA84220728DL /* 196 */, 0x9E691D9B9EFE23F7L /* 197 */, - 0x0446D288C4AE8D7FL /* 198 */, 0x7B4CC524E169785BL /* 199 */, - 0x21D87F0135CA1385L /* 200 */, 0xCEBB400F137B8AA5L /* 201 */, - 0x272E2B66580796BEL /* 202 */, 0x3612264125C2B0DEL /* 203 */, - 0x057702BDAD1EFBB2L /* 204 */, 0xD4BABB8EACF84BE9L /* 205 */, - 0x91583139641BC67BL /* 206 */, 0x8BDC2DE08036E024L /* 207 */, - 0x603C8156F49F68EDL /* 208 */, 0xF7D236F7DBEF5111L /* 209 */, - 0x9727C4598AD21E80L /* 210 */, 0xA08A0896670A5FD7L /* 211 */, - 0xCB4A8F4309EBA9CBL /* 212 */, 0x81AF564B0F7036A1L /* 213 */, - 0xC0B99AA778199ABDL /* 214 */, 0x959F1EC83FC8E952L /* 215 */, - 0x8C505077794A81B9L /* 216 */, 0x3ACAAF8F056338F0L /* 217 */, - 0x07B43F50627A6778L /* 218 */, 0x4A44AB49F5ECCC77L /* 219 */, - 0x3BC3D6E4B679EE98L /* 220 */, 0x9CC0D4D1CF14108CL /* 221 */, - 0x4406C00B206BC8A0L /* 222 */, 0x82A18854C8D72D89L /* 223 */, - 0x67E366B35C3C432CL /* 224 */, 0xB923DD61102B37F2L /* 225 */, - 0x56AB2779D884271DL /* 226 */, 0xBE83E1B0FF1525AFL /* 227 */, - 0xFB7C65D4217E49A9L /* 228 */, 0x6BDBE0E76D48E7D4L /* 229 */, - 0x08DF828745D9179EL /* 230 */, 0x22EA6A9ADD53BD34L /* 231 */, - 0xE36E141C5622200AL /* 232 */, 0x7F805D1B8CB750EEL /* 233 */, - 0xAFE5C7A59F58E837L /* 234 */, 0xE27F996A4FB1C23CL /* 235 */, - 0xD3867DFB0775F0D0L /* 236 */, 0xD0E673DE6E88891AL /* 237 */, - 0x123AEB9EAFB86C25L /* 238 */, 0x30F1D5D5C145B895L /* 239 */, - 0xBB434A2DEE7269E7L /* 240 */, 0x78CB67ECF931FA38L /* 241 */, - 0xF33B0372323BBF9CL /* 242 */, 0x52D66336FB279C74L /* 243 */, - 0x505F33AC0AFB4EAAL /* 244 */, 0xE8A5CD99A2CCE187L /* 245 */, - 0x534974801E2D30BBL /* 246 */, 0x8D2D5711D5876D90L /* 247 */, - 0x1F1A412891BC038EL /* 248 */, 0xD6E2E71D82E56648L /* 249 */, - 0x74036C3A497732B7L /* 250 */, 0x89B67ED96361F5ABL /* 251 */, - 0xFFED95D8F1EA02A2L /* 252 */, 0xE72B3BD61464D43DL /* 253 */, - 0xA6300F170BDC4820L /* 254 */, 0xEBC18760ED78A77AL /* 255 */, - }; - - private static final long[] t2 = { - 0xE6A6BE5A05A12138L /* 256 */, 0xB5A122A5B4F87C98L /* 257 */, - 0x563C6089140B6990L /* 258 */, 0x4C46CB2E391F5DD5L /* 259 */, - 0xD932ADDBC9B79434L /* 260 */, 0x08EA70E42015AFF5L /* 261 */, - 0xD765A6673E478CF1L /* 262 */, 0xC4FB757EAB278D99L /* 263 */, - 0xDF11C6862D6E0692L /* 264 */, 0xDDEB84F10D7F3B16L /* 265 */, - 0x6F2EF604A665EA04L /* 266 */, 0x4A8E0F0FF0E0DFB3L /* 267 */, - 0xA5EDEEF83DBCBA51L /* 268 */, 0xFC4F0A2A0EA4371EL /* 269 */, - 0xE83E1DA85CB38429L /* 270 */, 0xDC8FF882BA1B1CE2L /* 271 */, - 0xCD45505E8353E80DL /* 272 */, 0x18D19A00D4DB0717L /* 273 */, - 0x34A0CFEDA5F38101L /* 274 */, 0x0BE77E518887CAF2L /* 275 */, - 0x1E341438B3C45136L /* 276 */, 0xE05797F49089CCF9L /* 277 */, - 0xFFD23F9DF2591D14L /* 278 */, 0x543DDA228595C5CDL /* 279 */, - 0x661F81FD99052A33L /* 280 */, 0x8736E641DB0F7B76L /* 281 */, - 0x15227725418E5307L /* 282 */, 0xE25F7F46162EB2FAL /* 283 */, - 0x48A8B2126C13D9FEL /* 284 */, 0xAFDC541792E76EEAL /* 285 */, - 0x03D912BFC6D1898FL /* 286 */, 0x31B1AAFA1B83F51BL /* 287 */, - 0xF1AC2796E42AB7D9L /* 288 */, 0x40A3A7D7FCD2EBACL /* 289 */, - 0x1056136D0AFBBCC5L /* 290 */, 0x7889E1DD9A6D0C85L /* 291 */, - 0xD33525782A7974AAL /* 292 */, 0xA7E25D09078AC09BL /* 293 */, - 0xBD4138B3EAC6EDD0L /* 294 */, 0x920ABFBE71EB9E70L /* 295 */, - 0xA2A5D0F54FC2625CL /* 296 */, 0xC054E36B0B1290A3L /* 297 */, - 0xF6DD59FF62FE932BL /* 298 */, 0x3537354511A8AC7DL /* 299 */, - 0xCA845E9172FADCD4L /* 300 */, 0x84F82B60329D20DCL /* 301 */, - 0x79C62CE1CD672F18L /* 302 */, 0x8B09A2ADD124642CL /* 303 */, - 0xD0C1E96A19D9E726L /* 304 */, 0x5A786A9B4BA9500CL /* 305 */, - 0x0E020336634C43F3L /* 306 */, 0xC17B474AEB66D822L /* 307 */, - 0x6A731AE3EC9BAAC2L /* 308 */, 0x8226667AE0840258L /* 309 */, - 0x67D4567691CAECA5L /* 310 */, 0x1D94155C4875ADB5L /* 311 */, - 0x6D00FD985B813FDFL /* 312 */, 0x51286EFCB774CD06L /* 313 */, - 0x5E8834471FA744AFL /* 314 */, 0xF72CA0AEE761AE2EL /* 315 */, - 0xBE40E4CDAEE8E09AL /* 316 */, 0xE9970BBB5118F665L /* 317 */, - 0x726E4BEB33DF1964L /* 318 */, 0x703B000729199762L /* 319 */, - 0x4631D816F5EF30A7L /* 320 */, 0xB880B5B51504A6BEL /* 321 */, - 0x641793C37ED84B6CL /* 322 */, 0x7B21ED77F6E97D96L /* 323 */, - 0x776306312EF96B73L /* 324 */, 0xAE528948E86FF3F4L /* 325 */, - 0x53DBD7F286A3F8F8L /* 326 */, 0x16CADCE74CFC1063L /* 327 */, - 0x005C19BDFA52C6DDL /* 328 */, 0x68868F5D64D46AD3L /* 329 */, - 0x3A9D512CCF1E186AL /* 330 */, 0x367E62C2385660AEL /* 331 */, - 0xE359E7EA77DCB1D7L /* 332 */, 0x526C0773749ABE6EL /* 333 */, - 0x735AE5F9D09F734BL /* 334 */, 0x493FC7CC8A558BA8L /* 335 */, - 0xB0B9C1533041AB45L /* 336 */, 0x321958BA470A59BDL /* 337 */, - 0x852DB00B5F46C393L /* 338 */, 0x91209B2BD336B0E5L /* 339 */, - 0x6E604F7D659EF19FL /* 340 */, 0xB99A8AE2782CCB24L /* 341 */, - 0xCCF52AB6C814C4C7L /* 342 */, 0x4727D9AFBE11727BL /* 343 */, - 0x7E950D0C0121B34DL /* 344 */, 0x756F435670AD471FL /* 345 */, - 0xF5ADD442615A6849L /* 346 */, 0x4E87E09980B9957AL /* 347 */, - 0x2ACFA1DF50AEE355L /* 348 */, 0xD898263AFD2FD556L /* 349 */, - 0xC8F4924DD80C8FD6L /* 350 */, 0xCF99CA3D754A173AL /* 351 */, - 0xFE477BACAF91BF3CL /* 352 */, 0xED5371F6D690C12DL /* 353 */, - 0x831A5C285E687094L /* 354 */, 0xC5D3C90A3708A0A4L /* 355 */, - 0x0F7F903717D06580L /* 356 */, 0x19F9BB13B8FDF27FL /* 357 */, - 0xB1BD6F1B4D502843L /* 358 */, 0x1C761BA38FFF4012L /* 359 */, - 0x0D1530C4E2E21F3BL /* 360 */, 0x8943CE69A7372C8AL /* 361 */, - 0xE5184E11FEB5CE66L /* 362 */, 0x618BDB80BD736621L /* 363 */, - 0x7D29BAD68B574D0BL /* 364 */, 0x81BB613E25E6FE5BL /* 365 */, - 0x071C9C10BC07913FL /* 366 */, 0xC7BEEB7909AC2D97L /* 367 */, - 0xC3E58D353BC5D757L /* 368 */, 0xEB017892F38F61E8L /* 369 */, - 0xD4EFFB9C9B1CC21AL /* 370 */, 0x99727D26F494F7ABL /* 371 */, - 0xA3E063A2956B3E03L /* 372 */, 0x9D4A8B9A4AA09C30L /* 373 */, - 0x3F6AB7D500090FB4L /* 374 */, 0x9CC0F2A057268AC0L /* 375 */, - 0x3DEE9D2DEDBF42D1L /* 376 */, 0x330F49C87960A972L /* 377 */, - 0xC6B2720287421B41L /* 378 */, 0x0AC59EC07C00369CL /* 379 */, - 0xEF4EAC49CB353425L /* 380 */, 0xF450244EEF0129D8L /* 381 */, - 0x8ACC46E5CAF4DEB6L /* 382 */, 0x2FFEAB63989263F7L /* 383 */, - 0x8F7CB9FE5D7A4578L /* 384 */, 0x5BD8F7644E634635L /* 385 */, - 0x427A7315BF2DC900L /* 386 */, 0x17D0C4AA2125261CL /* 387 */, - 0x3992486C93518E50L /* 388 */, 0xB4CBFEE0A2D7D4C3L /* 389 */, - 0x7C75D6202C5DDD8DL /* 390 */, 0xDBC295D8E35B6C61L /* 391 */, - 0x60B369D302032B19L /* 392 */, 0xCE42685FDCE44132L /* 393 */, - 0x06F3DDB9DDF65610L /* 394 */, 0x8EA4D21DB5E148F0L /* 395 */, - 0x20B0FCE62FCD496FL /* 396 */, 0x2C1B912358B0EE31L /* 397 */, - 0xB28317B818F5A308L /* 398 */, 0xA89C1E189CA6D2CFL /* 399 */, - 0x0C6B18576AAADBC8L /* 400 */, 0xB65DEAA91299FAE3L /* 401 */, - 0xFB2B794B7F1027E7L /* 402 */, 0x04E4317F443B5BEBL /* 403 */, - 0x4B852D325939D0A6L /* 404 */, 0xD5AE6BEEFB207FFCL /* 405 */, - 0x309682B281C7D374L /* 406 */, 0xBAE309A194C3B475L /* 407 */, - 0x8CC3F97B13B49F05L /* 408 */, 0x98A9422FF8293967L /* 409 */, - 0x244B16B01076FF7CL /* 410 */, 0xF8BF571C663D67EEL /* 411 */, - 0x1F0D6758EEE30DA1L /* 412 */, 0xC9B611D97ADEB9B7L /* 413 */, - 0xB7AFD5887B6C57A2L /* 414 */, 0x6290AE846B984FE1L /* 415 */, - 0x94DF4CDEACC1A5FDL /* 416 */, 0x058A5BD1C5483AFFL /* 417 */, - 0x63166CC142BA3C37L /* 418 */, 0x8DB8526EB2F76F40L /* 419 */, - 0xE10880036F0D6D4EL /* 420 */, 0x9E0523C9971D311DL /* 421 */, - 0x45EC2824CC7CD691L /* 422 */, 0x575B8359E62382C9L /* 423 */, - 0xFA9E400DC4889995L /* 424 */, 0xD1823ECB45721568L /* 425 */, - 0xDAFD983B8206082FL /* 426 */, 0xAA7D29082386A8CBL /* 427 */, - 0x269FCD4403B87588L /* 428 */, 0x1B91F5F728BDD1E0L /* 429 */, - 0xE4669F39040201F6L /* 430 */, 0x7A1D7C218CF04ADEL /* 431 */, - 0x65623C29D79CE5CEL /* 432 */, 0x2368449096C00BB1L /* 433 */, - 0xAB9BF1879DA503BAL /* 434 */, 0xBC23ECB1A458058EL /* 435 */, - 0x9A58DF01BB401ECCL /* 436 */, 0xA070E868A85F143DL /* 437 */, - 0x4FF188307DF2239EL /* 438 */, 0x14D565B41A641183L /* 439 */, - 0xEE13337452701602L /* 440 */, 0x950E3DCF3F285E09L /* 441 */, - 0x59930254B9C80953L /* 442 */, 0x3BF299408930DA6DL /* 443 */, - 0xA955943F53691387L /* 444 */, 0xA15EDECAA9CB8784L /* 445 */, - 0x29142127352BE9A0L /* 446 */, 0x76F0371FFF4E7AFBL /* 447 */, - 0x0239F450274F2228L /* 448 */, 0xBB073AF01D5E868BL /* 449 */, - 0xBFC80571C10E96C1L /* 450 */, 0xD267088568222E23L /* 451 */, - 0x9671A3D48E80B5B0L /* 452 */, 0x55B5D38AE193BB81L /* 453 */, - 0x693AE2D0A18B04B8L /* 454 */, 0x5C48B4ECADD5335FL /* 455 */, - 0xFD743B194916A1CAL /* 456 */, 0x2577018134BE98C4L /* 457 */, - 0xE77987E83C54A4ADL /* 458 */, 0x28E11014DA33E1B9L /* 459 */, - 0x270CC59E226AA213L /* 460 */, 0x71495F756D1A5F60L /* 461 */, - 0x9BE853FB60AFEF77L /* 462 */, 0xADC786A7F7443DBFL /* 463 */, - 0x0904456173B29A82L /* 464 */, 0x58BC7A66C232BD5EL /* 465 */, - 0xF306558C673AC8B2L /* 466 */, 0x41F639C6B6C9772AL /* 467 */, - 0x216DEFE99FDA35DAL /* 468 */, 0x11640CC71C7BE615L /* 469 */, - 0x93C43694565C5527L /* 470 */, 0xEA038E6246777839L /* 471 */, - 0xF9ABF3CE5A3E2469L /* 472 */, 0x741E768D0FD312D2L /* 473 */, - 0x0144B883CED652C6L /* 474 */, 0xC20B5A5BA33F8552L /* 475 */, - 0x1AE69633C3435A9DL /* 476 */, 0x97A28CA4088CFDECL /* 477 */, - 0x8824A43C1E96F420L /* 478 */, 0x37612FA66EEEA746L /* 479 */, - 0x6B4CB165F9CF0E5AL /* 480 */, 0x43AA1C06A0ABFB4AL /* 481 */, - 0x7F4DC26FF162796BL /* 482 */, 0x6CBACC8E54ED9B0FL /* 483 */, - 0xA6B7FFEFD2BB253EL /* 484 */, 0x2E25BC95B0A29D4FL /* 485 */, - 0x86D6A58BDEF1388CL /* 486 */, 0xDED74AC576B6F054L /* 487 */, - 0x8030BDBC2B45805DL /* 488 */, 0x3C81AF70E94D9289L /* 489 */, - 0x3EFF6DDA9E3100DBL /* 490 */, 0xB38DC39FDFCC8847L /* 491 */, - 0x123885528D17B87EL /* 492 */, 0xF2DA0ED240B1B642L /* 493 */, - 0x44CEFADCD54BF9A9L /* 494 */, 0x1312200E433C7EE6L /* 495 */, - 0x9FFCC84F3A78C748L /* 496 */, 0xF0CD1F72248576BBL /* 497 */, - 0xEC6974053638CFE4L /* 498 */, 0x2BA7B67C0CEC4E4CL /* 499 */, - 0xAC2F4DF3E5CE32EDL /* 500 */, 0xCB33D14326EA4C11L /* 501 */, - 0xA4E9044CC77E58BCL /* 502 */, 0x5F513293D934FCEFL /* 503 */, - 0x5DC9645506E55444L /* 504 */, 0x50DE418F317DE40AL /* 505 */, - 0x388CB31A69DDE259L /* 506 */, 0x2DB4A83455820A86L /* 507 */, - 0x9010A91E84711AE9L /* 508 */, 0x4DF7F0B7B1498371L /* 509 */, - 0xD62A2EABC0977179L /* 510 */, 0x22FAC097AA8D5C0EL /* 511 */, - }; - - private static final long[] t3 = { - 0xF49FCC2FF1DAF39BL /* 512 */, 0x487FD5C66FF29281L /* 513 */, - 0xE8A30667FCDCA83FL /* 514 */, 0x2C9B4BE3D2FCCE63L /* 515 */, - 0xDA3FF74B93FBBBC2L /* 516 */, 0x2FA165D2FE70BA66L /* 517 */, - 0xA103E279970E93D4L /* 518 */, 0xBECDEC77B0E45E71L /* 519 */, - 0xCFB41E723985E497L /* 520 */, 0xB70AAA025EF75017L /* 521 */, - 0xD42309F03840B8E0L /* 522 */, 0x8EFC1AD035898579L /* 523 */, - 0x96C6920BE2B2ABC5L /* 524 */, 0x66AF4163375A9172L /* 525 */, - 0x2174ABDCCA7127FBL /* 526 */, 0xB33CCEA64A72FF41L /* 527 */, - 0xF04A4933083066A5L /* 528 */, 0x8D970ACDD7289AF5L /* 529 */, - 0x8F96E8E031C8C25EL /* 530 */, 0xF3FEC02276875D47L /* 531 */, - 0xEC7BF310056190DDL /* 532 */, 0xF5ADB0AEBB0F1491L /* 533 */, - 0x9B50F8850FD58892L /* 534 */, 0x4975488358B74DE8L /* 535 */, - 0xA3354FF691531C61L /* 536 */, 0x0702BBE481D2C6EEL /* 537 */, - 0x89FB24057DEDED98L /* 538 */, 0xAC3075138596E902L /* 539 */, - 0x1D2D3580172772EDL /* 540 */, 0xEB738FC28E6BC30DL /* 541 */, - 0x5854EF8F63044326L /* 542 */, 0x9E5C52325ADD3BBEL /* 543 */, - 0x90AA53CF325C4623L /* 544 */, 0xC1D24D51349DD067L /* 545 */, - 0x2051CFEEA69EA624L /* 546 */, 0x13220F0A862E7E4FL /* 547 */, - 0xCE39399404E04864L /* 548 */, 0xD9C42CA47086FCB7L /* 549 */, - 0x685AD2238A03E7CCL /* 550 */, 0x066484B2AB2FF1DBL /* 551 */, - 0xFE9D5D70EFBF79ECL /* 552 */, 0x5B13B9DD9C481854L /* 553 */, - 0x15F0D475ED1509ADL /* 554 */, 0x0BEBCD060EC79851L /* 555 */, - 0xD58C6791183AB7F8L /* 556 */, 0xD1187C5052F3EEE4L /* 557 */, - 0xC95D1192E54E82FFL /* 558 */, 0x86EEA14CB9AC6CA2L /* 559 */, - 0x3485BEB153677D5DL /* 560 */, 0xDD191D781F8C492AL /* 561 */, - 0xF60866BAA784EBF9L /* 562 */, 0x518F643BA2D08C74L /* 563 */, - 0x8852E956E1087C22L /* 564 */, 0xA768CB8DC410AE8DL /* 565 */, - 0x38047726BFEC8E1AL /* 566 */, 0xA67738B4CD3B45AAL /* 567 */, - 0xAD16691CEC0DDE19L /* 568 */, 0xC6D4319380462E07L /* 569 */, - 0xC5A5876D0BA61938L /* 570 */, 0x16B9FA1FA58FD840L /* 571 */, - 0x188AB1173CA74F18L /* 572 */, 0xABDA2F98C99C021FL /* 573 */, - 0x3E0580AB134AE816L /* 574 */, 0x5F3B05B773645ABBL /* 575 */, - 0x2501A2BE5575F2F6L /* 576 */, 0x1B2F74004E7E8BA9L /* 577 */, - 0x1CD7580371E8D953L /* 578 */, 0x7F6ED89562764E30L /* 579 */, - 0xB15926FF596F003DL /* 580 */, 0x9F65293DA8C5D6B9L /* 581 */, - 0x6ECEF04DD690F84CL /* 582 */, 0x4782275FFF33AF88L /* 583 */, - 0xE41433083F820801L /* 584 */, 0xFD0DFE409A1AF9B5L /* 585 */, - 0x4325A3342CDB396BL /* 586 */, 0x8AE77E62B301B252L /* 587 */, - 0xC36F9E9F6655615AL /* 588 */, 0x85455A2D92D32C09L /* 589 */, - 0xF2C7DEA949477485L /* 590 */, 0x63CFB4C133A39EBAL /* 591 */, - 0x83B040CC6EBC5462L /* 592 */, 0x3B9454C8FDB326B0L /* 593 */, - 0x56F56A9E87FFD78CL /* 594 */, 0x2DC2940D99F42BC6L /* 595 */, - 0x98F7DF096B096E2DL /* 596 */, 0x19A6E01E3AD852BFL /* 597 */, - 0x42A99CCBDBD4B40BL /* 598 */, 0xA59998AF45E9C559L /* 599 */, - 0x366295E807D93186L /* 600 */, 0x6B48181BFAA1F773L /* 601 */, - 0x1FEC57E2157A0A1DL /* 602 */, 0x4667446AF6201AD5L /* 603 */, - 0xE615EBCACFB0F075L /* 604 */, 0xB8F31F4F68290778L /* 605 */, - 0x22713ED6CE22D11EL /* 606 */, 0x3057C1A72EC3C93BL /* 607 */, - 0xCB46ACC37C3F1F2FL /* 608 */, 0xDBB893FD02AAF50EL /* 609 */, - 0x331FD92E600B9FCFL /* 610 */, 0xA498F96148EA3AD6L /* 611 */, - 0xA8D8426E8B6A83EAL /* 612 */, 0xA089B274B7735CDCL /* 613 */, - 0x87F6B3731E524A11L /* 614 */, 0x118808E5CBC96749L /* 615 */, - 0x9906E4C7B19BD394L /* 616 */, 0xAFED7F7E9B24A20CL /* 617 */, - 0x6509EADEEB3644A7L /* 618 */, 0x6C1EF1D3E8EF0EDEL /* 619 */, - 0xB9C97D43E9798FB4L /* 620 */, 0xA2F2D784740C28A3L /* 621 */, - 0x7B8496476197566FL /* 622 */, 0x7A5BE3E6B65F069DL /* 623 */, - 0xF96330ED78BE6F10L /* 624 */, 0xEEE60DE77A076A15L /* 625 */, - 0x2B4BEE4AA08B9BD0L /* 626 */, 0x6A56A63EC7B8894EL /* 627 */, - 0x02121359BA34FEF4L /* 628 */, 0x4CBF99F8283703FCL /* 629 */, - 0x398071350CAF30C8L /* 630 */, 0xD0A77A89F017687AL /* 631 */, - 0xF1C1A9EB9E423569L /* 632 */, 0x8C7976282DEE8199L /* 633 */, - 0x5D1737A5DD1F7ABDL /* 634 */, 0x4F53433C09A9FA80L /* 635 */, - 0xFA8B0C53DF7CA1D9L /* 636 */, 0x3FD9DCBC886CCB77L /* 637 */, - 0xC040917CA91B4720L /* 638 */, 0x7DD00142F9D1DCDFL /* 639 */, - 0x8476FC1D4F387B58L /* 640 */, 0x23F8E7C5F3316503L /* 641 */, - 0x032A2244E7E37339L /* 642 */, 0x5C87A5D750F5A74BL /* 643 */, - 0x082B4CC43698992EL /* 644 */, 0xDF917BECB858F63CL /* 645 */, - 0x3270B8FC5BF86DDAL /* 646 */, 0x10AE72BB29B5DD76L /* 647 */, - 0x576AC94E7700362BL /* 648 */, 0x1AD112DAC61EFB8FL /* 649 */, - 0x691BC30EC5FAA427L /* 650 */, 0xFF246311CC327143L /* 651 */, - 0x3142368E30E53206L /* 652 */, 0x71380E31E02CA396L /* 653 */, - 0x958D5C960AAD76F1L /* 654 */, 0xF8D6F430C16DA536L /* 655 */, - 0xC8FFD13F1BE7E1D2L /* 656 */, 0x7578AE66004DDBE1L /* 657 */, - 0x05833F01067BE646L /* 658 */, 0xBB34B5AD3BFE586DL /* 659 */, - 0x095F34C9A12B97F0L /* 660 */, 0x247AB64525D60CA8L /* 661 */, - 0xDCDBC6F3017477D1L /* 662 */, 0x4A2E14D4DECAD24DL /* 663 */, - 0xBDB5E6D9BE0A1EEBL /* 664 */, 0x2A7E70F7794301ABL /* 665 */, - 0xDEF42D8A270540FDL /* 666 */, 0x01078EC0A34C22C1L /* 667 */, - 0xE5DE511AF4C16387L /* 668 */, 0x7EBB3A52BD9A330AL /* 669 */, - 0x77697857AA7D6435L /* 670 */, 0x004E831603AE4C32L /* 671 */, - 0xE7A21020AD78E312L /* 672 */, 0x9D41A70C6AB420F2L /* 673 */, - 0x28E06C18EA1141E6L /* 674 */, 0xD2B28CBD984F6B28L /* 675 */, - 0x26B75F6C446E9D83L /* 676 */, 0xBA47568C4D418D7FL /* 677 */, - 0xD80BADBFE6183D8EL /* 678 */, 0x0E206D7F5F166044L /* 679 */, - 0xE258A43911CBCA3EL /* 680 */, 0x723A1746B21DC0BCL /* 681 */, - 0xC7CAA854F5D7CDD3L /* 682 */, 0x7CAC32883D261D9CL /* 683 */, - 0x7690C26423BA942CL /* 684 */, 0x17E55524478042B8L /* 685 */, - 0xE0BE477656A2389FL /* 686 */, 0x4D289B5E67AB2DA0L /* 687 */, - 0x44862B9C8FBBFD31L /* 688 */, 0xB47CC8049D141365L /* 689 */, - 0x822C1B362B91C793L /* 690 */, 0x4EB14655FB13DFD8L /* 691 */, - 0x1ECBBA0714E2A97BL /* 692 */, 0x6143459D5CDE5F14L /* 693 */, - 0x53A8FBF1D5F0AC89L /* 694 */, 0x97EA04D81C5E5B00L /* 695 */, - 0x622181A8D4FDB3F3L /* 696 */, 0xE9BCD341572A1208L /* 697 */, - 0x1411258643CCE58AL /* 698 */, 0x9144C5FEA4C6E0A4L /* 699 */, - 0x0D33D06565CF620FL /* 700 */, 0x54A48D489F219CA1L /* 701 */, - 0xC43E5EAC6D63C821L /* 702 */, 0xA9728B3A72770DAFL /* 703 */, - 0xD7934E7B20DF87EFL /* 704 */, 0xE35503B61A3E86E5L /* 705 */, - 0xCAE321FBC819D504L /* 706 */, 0x129A50B3AC60BFA6L /* 707 */, - 0xCD5E68EA7E9FB6C3L /* 708 */, 0xB01C90199483B1C7L /* 709 */, - 0x3DE93CD5C295376CL /* 710 */, 0xAED52EDF2AB9AD13L /* 711 */, - 0x2E60F512C0A07884L /* 712 */, 0xBC3D86A3E36210C9L /* 713 */, - 0x35269D9B163951CEL /* 714 */, 0x0C7D6E2AD0CDB5FAL /* 715 */, - 0x59E86297D87F5733L /* 716 */, 0x298EF221898DB0E7L /* 717 */, - 0x55000029D1A5AA7EL /* 718 */, 0x8BC08AE1B5061B45L /* 719 */, - 0xC2C31C2B6C92703AL /* 720 */, 0x94CC596BAF25EF42L /* 721 */, - 0x0A1D73DB22540456L /* 722 */, 0x04B6A0F9D9C4179AL /* 723 */, - 0xEFFDAFA2AE3D3C60L /* 724 */, 0xF7C8075BB49496C4L /* 725 */, - 0x9CC5C7141D1CD4E3L /* 726 */, 0x78BD1638218E5534L /* 727 */, - 0xB2F11568F850246AL /* 728 */, 0xEDFABCFA9502BC29L /* 729 */, - 0x796CE5F2DA23051BL /* 730 */, 0xAAE128B0DC93537CL /* 731 */, - 0x3A493DA0EE4B29AEL /* 732 */, 0xB5DF6B2C416895D7L /* 733 */, - 0xFCABBD25122D7F37L /* 734 */, 0x70810B58105DC4B1L /* 735 */, - 0xE10FDD37F7882A90L /* 736 */, 0x524DCAB5518A3F5CL /* 737 */, - 0x3C9E85878451255BL /* 738 */, 0x4029828119BD34E2L /* 739 */, - 0x74A05B6F5D3CECCBL /* 740 */, 0xB610021542E13ECAL /* 741 */, - 0x0FF979D12F59E2ACL /* 742 */, 0x6037DA27E4F9CC50L /* 743 */, - 0x5E92975A0DF1847DL /* 744 */, 0xD66DE190D3E623FEL /* 745 */, - 0x5032D6B87B568048L /* 746 */, 0x9A36B7CE8235216EL /* 747 */, - 0x80272A7A24F64B4AL /* 748 */, 0x93EFED8B8C6916F7L /* 749 */, - 0x37DDBFF44CCE1555L /* 750 */, 0x4B95DB5D4B99BD25L /* 751 */, - 0x92D3FDA169812FC0L /* 752 */, 0xFB1A4A9A90660BB6L /* 753 */, - 0x730C196946A4B9B2L /* 754 */, 0x81E289AA7F49DA68L /* 755 */, - 0x64669A0F83B1A05FL /* 756 */, 0x27B3FF7D9644F48BL /* 757 */, - 0xCC6B615C8DB675B3L /* 758 */, 0x674F20B9BCEBBE95L /* 759 */, - 0x6F31238275655982L /* 760 */, 0x5AE488713E45CF05L /* 761 */, - 0xBF619F9954C21157L /* 762 */, 0xEABAC46040A8EAE9L /* 763 */, - 0x454C6FE9F2C0C1CDL /* 764 */, 0x419CF6496412691CL /* 765 */, - 0xD3DC3BEF265B0F70L /* 766 */, 0x6D0E60F5C3578A9EL /* 767 */, - }; - - private static final long[] t4 = { - 0x5B0E608526323C55L /* 768 */, 0x1A46C1A9FA1B59F5L /* 769 */, - 0xA9E245A17C4C8FFAL /* 770 */, 0x65CA5159DB2955D7L /* 771 */, - 0x05DB0A76CE35AFC2L /* 772 */, 0x81EAC77EA9113D45L /* 773 */, - 0x528EF88AB6AC0A0DL /* 774 */, 0xA09EA253597BE3FFL /* 775 */, - 0x430DDFB3AC48CD56L /* 776 */, 0xC4B3A67AF45CE46FL /* 777 */, - 0x4ECECFD8FBE2D05EL /* 778 */, 0x3EF56F10B39935F0L /* 779 */, - 0x0B22D6829CD619C6L /* 780 */, 0x17FD460A74DF2069L /* 781 */, - 0x6CF8CC8E8510ED40L /* 782 */, 0xD6C824BF3A6ECAA7L /* 783 */, - 0x61243D581A817049L /* 784 */, 0x048BACB6BBC163A2L /* 785 */, - 0xD9A38AC27D44CC32L /* 786 */, 0x7FDDFF5BAAF410ABL /* 787 */, - 0xAD6D495AA804824BL /* 788 */, 0xE1A6A74F2D8C9F94L /* 789 */, - 0xD4F7851235DEE8E3L /* 790 */, 0xFD4B7F886540D893L /* 791 */, - 0x247C20042AA4BFDAL /* 792 */, 0x096EA1C517D1327CL /* 793 */, - 0xD56966B4361A6685L /* 794 */, 0x277DA5C31221057DL /* 795 */, - 0x94D59893A43ACFF7L /* 796 */, 0x64F0C51CCDC02281L /* 797 */, - 0x3D33BCC4FF6189DBL /* 798 */, 0xE005CB184CE66AF1L /* 799 */, - 0xFF5CCD1D1DB99BEAL /* 800 */, 0xB0B854A7FE42980FL /* 801 */, - 0x7BD46A6A718D4B9FL /* 802 */, 0xD10FA8CC22A5FD8CL /* 803 */, - 0xD31484952BE4BD31L /* 804 */, 0xC7FA975FCB243847L /* 805 */, - 0x4886ED1E5846C407L /* 806 */, 0x28CDDB791EB70B04L /* 807 */, - 0xC2B00BE2F573417FL /* 808 */, 0x5C9590452180F877L /* 809 */, - 0x7A6BDDFFF370EB00L /* 810 */, 0xCE509E38D6D9D6A4L /* 811 */, - 0xEBEB0F00647FA702L /* 812 */, 0x1DCC06CF76606F06L /* 813 */, - 0xE4D9F28BA286FF0AL /* 814 */, 0xD85A305DC918C262L /* 815 */, - 0x475B1D8732225F54L /* 816 */, 0x2D4FB51668CCB5FEL /* 817 */, - 0xA679B9D9D72BBA20L /* 818 */, 0x53841C0D912D43A5L /* 819 */, - 0x3B7EAA48BF12A4E8L /* 820 */, 0x781E0E47F22F1DDFL /* 821 */, - 0xEFF20CE60AB50973L /* 822 */, 0x20D261D19DFFB742L /* 823 */, - 0x16A12B03062A2E39L /* 824 */, 0x1960EB2239650495L /* 825 */, - 0x251C16FED50EB8B8L /* 826 */, 0x9AC0C330F826016EL /* 827 */, - 0xED152665953E7671L /* 828 */, 0x02D63194A6369570L /* 829 */, - 0x5074F08394B1C987L /* 830 */, 0x70BA598C90B25CE1L /* 831 */, - 0x794A15810B9742F6L /* 832 */, 0x0D5925E9FCAF8C6CL /* 833 */, - 0x3067716CD868744EL /* 834 */, 0x910AB077E8D7731BL /* 835 */, - 0x6A61BBDB5AC42F61L /* 836 */, 0x93513EFBF0851567L /* 837 */, - 0xF494724B9E83E9D5L /* 838 */, 0xE887E1985C09648DL /* 839 */, - 0x34B1D3C675370CFDL /* 840 */, 0xDC35E433BC0D255DL /* 841 */, - 0xD0AAB84234131BE0L /* 842 */, 0x08042A50B48B7EAFL /* 843 */, - 0x9997C4EE44A3AB35L /* 844 */, 0x829A7B49201799D0L /* 845 */, - 0x263B8307B7C54441L /* 846 */, 0x752F95F4FD6A6CA6L /* 847 */, - 0x927217402C08C6E5L /* 848 */, 0x2A8AB754A795D9EEL /* 849 */, - 0xA442F7552F72943DL /* 850 */, 0x2C31334E19781208L /* 851 */, - 0x4FA98D7CEAEE6291L /* 852 */, 0x55C3862F665DB309L /* 853 */, - 0xBD0610175D53B1F3L /* 854 */, 0x46FE6CB840413F27L /* 855 */, - 0x3FE03792DF0CFA59L /* 856 */, 0xCFE700372EB85E8FL /* 857 */, - 0xA7BE29E7ADBCE118L /* 858 */, 0xE544EE5CDE8431DDL /* 859 */, - 0x8A781B1B41F1873EL /* 860 */, 0xA5C94C78A0D2F0E7L /* 861 */, - 0x39412E2877B60728L /* 862 */, 0xA1265EF3AFC9A62CL /* 863 */, - 0xBCC2770C6A2506C5L /* 864 */, 0x3AB66DD5DCE1CE12L /* 865 */, - 0xE65499D04A675B37L /* 866 */, 0x7D8F523481BFD216L /* 867 */, - 0x0F6F64FCEC15F389L /* 868 */, 0x74EFBE618B5B13C8L /* 869 */, - 0xACDC82B714273E1DL /* 870 */, 0xDD40BFE003199D17L /* 871 */, - 0x37E99257E7E061F8L /* 872 */, 0xFA52626904775AAAL /* 873 */, - 0x8BBBF63A463D56F9L /* 874 */, 0xF0013F1543A26E64L /* 875 */, - 0xA8307E9F879EC898L /* 876 */, 0xCC4C27A4150177CCL /* 877 */, - 0x1B432F2CCA1D3348L /* 878 */, 0xDE1D1F8F9F6FA013L /* 879 */, - 0x606602A047A7DDD6L /* 880 */, 0xD237AB64CC1CB2C7L /* 881 */, - 0x9B938E7225FCD1D3L /* 882 */, 0xEC4E03708E0FF476L /* 883 */, - 0xFEB2FBDA3D03C12DL /* 884 */, 0xAE0BCED2EE43889AL /* 885 */, - 0x22CB8923EBFB4F43L /* 886 */, 0x69360D013CF7396DL /* 887 */, - 0x855E3602D2D4E022L /* 888 */, 0x073805BAD01F784CL /* 889 */, - 0x33E17A133852F546L /* 890 */, 0xDF4874058AC7B638L /* 891 */, - 0xBA92B29C678AA14AL /* 892 */, 0x0CE89FC76CFAADCDL /* 893 */, - 0x5F9D4E0908339E34L /* 894 */, 0xF1AFE9291F5923B9L /* 895 */, - 0x6E3480F60F4A265FL /* 896 */, 0xEEBF3A2AB29B841CL /* 897 */, - 0xE21938A88F91B4ADL /* 898 */, 0x57DFEFF845C6D3C3L /* 899 */, - 0x2F006B0BF62CAAF2L /* 900 */, 0x62F479EF6F75EE78L /* 901 */, - 0x11A55AD41C8916A9L /* 902 */, 0xF229D29084FED453L /* 903 */, - 0x42F1C27B16B000E6L /* 904 */, 0x2B1F76749823C074L /* 905 */, - 0x4B76ECA3C2745360L /* 906 */, 0x8C98F463B91691BDL /* 907 */, - 0x14BCC93CF1ADE66AL /* 908 */, 0x8885213E6D458397L /* 909 */, - 0x8E177DF0274D4711L /* 910 */, 0xB49B73B5503F2951L /* 911 */, - 0x10168168C3F96B6BL /* 912 */, 0x0E3D963B63CAB0AEL /* 913 */, - 0x8DFC4B5655A1DB14L /* 914 */, 0xF789F1356E14DE5CL /* 915 */, - 0x683E68AF4E51DAC1L /* 916 */, 0xC9A84F9D8D4B0FD9L /* 917 */, - 0x3691E03F52A0F9D1L /* 918 */, 0x5ED86E46E1878E80L /* 919 */, - 0x3C711A0E99D07150L /* 920 */, 0x5A0865B20C4E9310L /* 921 */, - 0x56FBFC1FE4F0682EL /* 922 */, 0xEA8D5DE3105EDF9BL /* 923 */, - 0x71ABFDB12379187AL /* 924 */, 0x2EB99DE1BEE77B9CL /* 925 */, - 0x21ECC0EA33CF4523L /* 926 */, 0x59A4D7521805C7A1L /* 927 */, - 0x3896F5EB56AE7C72L /* 928 */, 0xAA638F3DB18F75DCL /* 929 */, - 0x9F39358DABE9808EL /* 930 */, 0xB7DEFA91C00B72ACL /* 931 */, - 0x6B5541FD62492D92L /* 932 */, 0x6DC6DEE8F92E4D5BL /* 933 */, - 0x353F57ABC4BEEA7EL /* 934 */, 0x735769D6DA5690CEL /* 935 */, - 0x0A234AA642391484L /* 936 */, 0xF6F9508028F80D9DL /* 937 */, - 0xB8E319A27AB3F215L /* 938 */, 0x31AD9C1151341A4DL /* 939 */, - 0x773C22A57BEF5805L /* 940 */, 0x45C7561A07968633L /* 941 */, - 0xF913DA9E249DBE36L /* 942 */, 0xDA652D9B78A64C68L /* 943 */, - 0x4C27A97F3BC334EFL /* 944 */, 0x76621220E66B17F4L /* 945 */, - 0x967743899ACD7D0BL /* 946 */, 0xF3EE5BCAE0ED6782L /* 947 */, - 0x409F753600C879FCL /* 948 */, 0x06D09A39B5926DB6L /* 949 */, - 0x6F83AEB0317AC588L /* 950 */, 0x01E6CA4A86381F21L /* 951 */, - 0x66FF3462D19F3025L /* 952 */, 0x72207C24DDFD3BFBL /* 953 */, - 0x4AF6B6D3E2ECE2EBL /* 954 */, 0x9C994DBEC7EA08DEL /* 955 */, - 0x49ACE597B09A8BC4L /* 956 */, 0xB38C4766CF0797BAL /* 957 */, - 0x131B9373C57C2A75L /* 958 */, 0xB1822CCE61931E58L /* 959 */, - 0x9D7555B909BA1C0CL /* 960 */, 0x127FAFDD937D11D2L /* 961 */, - 0x29DA3BADC66D92E4L /* 962 */, 0xA2C1D57154C2ECBCL /* 963 */, - 0x58C5134D82F6FE24L /* 964 */, 0x1C3AE3515B62274FL /* 965 */, - 0xE907C82E01CB8126L /* 966 */, 0xF8ED091913E37FCBL /* 967 */, - 0x3249D8F9C80046C9L /* 968 */, 0x80CF9BEDE388FB63L /* 969 */, - 0x1881539A116CF19EL /* 970 */, 0x5103F3F76BD52457L /* 971 */, - 0x15B7E6F5AE47F7A8L /* 972 */, 0xDBD7C6DED47E9CCFL /* 973 */, - 0x44E55C410228BB1AL /* 974 */, 0xB647D4255EDB4E99L /* 975 */, - 0x5D11882BB8AAFC30L /* 976 */, 0xF5098BBB29D3212AL /* 977 */, - 0x8FB5EA14E90296B3L /* 978 */, 0x677B942157DD025AL /* 979 */, - 0xFB58E7C0A390ACB5L /* 980 */, 0x89D3674C83BD4A01L /* 981 */, - 0x9E2DA4DF4BF3B93BL /* 982 */, 0xFCC41E328CAB4829L /* 983 */, - 0x03F38C96BA582C52L /* 984 */, 0xCAD1BDBD7FD85DB2L /* 985 */, - 0xBBB442C16082AE83L /* 986 */, 0xB95FE86BA5DA9AB0L /* 987 */, - 0xB22E04673771A93FL /* 988 */, 0x845358C9493152D8L /* 989 */, - 0xBE2A488697B4541EL /* 990 */, 0x95A2DC2DD38E6966L /* 991 */, - 0xC02C11AC923C852BL /* 992 */, 0x2388B1990DF2A87BL /* 993 */, - 0x7C8008FA1B4F37BEL /* 994 */, 0x1F70D0C84D54E503L /* 995 */, - 0x5490ADEC7ECE57D4L /* 996 */, 0x002B3C27D9063A3AL /* 997 */, - 0x7EAEA3848030A2BFL /* 998 */, 0xC602326DED2003C0L /* 999 */, - 0x83A7287D69A94086L /* 1000 */, 0xC57A5FCB30F57A8AL /* 1001 */, - 0xB56844E479EBE779L /* 1002 */, 0xA373B40F05DCBCE9L /* 1003 */, - 0xD71A786E88570EE2L /* 1004 */, 0x879CBACDBDE8F6A0L /* 1005 */, - 0x976AD1BCC164A32FL /* 1006 */, 0xAB21E25E9666D78BL /* 1007 */, - 0x901063AAE5E5C33CL /* 1008 */, 0x9818B34448698D90L /* 1009 */, - 0xE36487AE3E1E8ABBL /* 1010 */, 0xAFBDF931893BDCB4L /* 1011 */, - 0x6345A0DC5FBBD519L /* 1012 */, 0x8628FE269B9465CAL /* 1013 */, - 0x1E5D01603F9C51ECL /* 1014 */, 0x4DE44006A15049B7L /* 1015 */, - 0xBF6C70E5F776CBB1L /* 1016 */, 0x411218F2EF552BEDL /* 1017 */, - 0xCB0C0708705A36A3L /* 1018 */, 0xE74D14754F986044L /* 1019 */, - 0xCD56D9430EA8280EL /* 1020 */, 0xC12591D7535F5065L /* 1021 */, - 0xC83223F1720AEF96L /* 1022 */, 0xC3A0396F7363A51FL /* 1023 */ - }; - - private static final int DIGEST_LENGTH = 24; - - // - // registers - // - private long a, b, c; - private long byteCount; - - // - // buffers - // - private byte[] buf = new byte[8]; - private int bOff = 0; - - private long[] x = new long[8]; - private int xOff = 0; - - /** - * Standard constructor - */ - public TigerDigest() - { - reset(); - } - - /** - * Copy constructor. This will copy the state of the provided - * message digest. - */ - public TigerDigest(TigerDigest t) - { - a = t.a; - b = t.b; - c = t.c; - - System.arraycopy(t.x, 0, x, 0, t.x.length); - xOff = t.xOff; - - System.arraycopy(t.buf, 0, buf, 0, t.buf.length); - bOff = t.bOff; - - byteCount = t.byteCount; - } - - public String getAlgorithmName() - { - return "Tiger"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH; - } - - private void processWord( - byte[] b, - int off) - { - x[xOff++] = ((long)(b[off + 7] & 0xff) << 56) - | ((long)(b[off + 6] & 0xff) << 48) - | ((long)(b[off + 5] & 0xff) << 40) - | ((long)(b[off + 4] & 0xff) << 32) - | ((long)(b[off + 3] & 0xff) << 24) - | ((long)(b[off + 2] & 0xff) << 16) - | ((long)(b[off + 1] & 0xff) << 8) - | ((b[off + 0] & 0xff)); - - if (xOff == x.length) - { - processBlock(); - } - - bOff = 0; - } - - public void update( - byte in) - { - buf[bOff++] = in; - - if (bOff == buf.length) - { - processWord(buf, 0); - } - - byteCount++; - } - - public void update( - byte[] in, - int inOff, - int len) - { - // - // fill the current word - // - while ((bOff != 0) && (len > 0)) - { - update(in[inOff]); - - inOff++; - len--; - } - - // - // process whole words. - // - while (len > 8) - { - processWord(in, inOff); - - inOff += 8; - len -= 8; - byteCount += 8; - } - - // - // load in the remainder. - // - while (len > 0) - { - update(in[inOff]); - - inOff++; - len--; - } - } - - private void roundABC( - long x, - long mul) - { - c ^= x ; - a -= t1[(int)c & 0xff] ^ t2[(int)(c >> 16) & 0xff] - ^ t3[(int)(c >> 32) & 0xff] ^ t4[(int)(c >> 48) & 0xff]; - b += t4[(int)(c >> 8) & 0xff] ^ t3[(int)(c >> 24) & 0xff] - ^ t2[(int)(c >> 40) & 0xff] ^ t1[(int)(c >> 56) & 0xff]; - b *= mul; - } - - private void roundBCA( - long x, - long mul) - { - a ^= x ; - b -= t1[(int)a & 0xff] ^ t2[(int)(a >> 16) & 0xff] - ^ t3[(int)(a >> 32) & 0xff] ^ t4[(int)(a >> 48) & 0xff]; - c += t4[(int)(a >> 8) & 0xff] ^ t3[(int)(a >> 24) & 0xff] - ^ t2[(int)(a >> 40) & 0xff] ^ t1[(int)(a >> 56) & 0xff]; - c *= mul; - } - - private void roundCAB( - long x, - long mul) - { - b ^= x ; - c -= t1[(int)b & 0xff] ^ t2[(int)(b >> 16) & 0xff] - ^ t3[(int)(b >> 32) & 0xff] ^ t4[(int)(b >> 48) & 0xff]; - a += t4[(int)(b >> 8) & 0xff] ^ t3[(int)(b >> 24) & 0xff] - ^ t2[(int)(b >> 40) & 0xff] ^ t1[(int)(b >> 56) & 0xff]; - a *= mul; - } - - private void keySchedule() - { - x[0] -= x[7] ^ 0xA5A5A5A5A5A5A5A5L; - x[1] ^= x[0]; - x[2] += x[1]; - x[3] -= x[2] ^ ((~x[1]) << 19); - x[4] ^= x[3]; - x[5] += x[4]; - x[6] -= x[5] ^ ((~x[4]) >>> 23); - x[7] ^= x[6]; - x[0] += x[7]; - x[1] -= x[0] ^ ((~x[7]) << 19); - x[2] ^= x[1]; - x[3] += x[2]; - x[4] -= x[3] ^ ((~x[2]) >>> 23); - x[5] ^= x[4]; - x[6] += x[5]; - x[7] -= x[6] ^ 0x0123456789ABCDEFL; - } - - private void processBlock() - { - // - // save abc - // - long aa = a; - long bb = b; - long cc = c; - - // - // rounds and schedule - // - roundABC(x[0], 5); - roundBCA(x[1], 5); - roundCAB(x[2], 5); - roundABC(x[3], 5); - roundBCA(x[4], 5); - roundCAB(x[5], 5); - roundABC(x[6], 5); - roundBCA(x[7], 5); - - keySchedule(); - - roundCAB(x[0], 7); - roundABC(x[1], 7); - roundBCA(x[2], 7); - roundCAB(x[3], 7); - roundABC(x[4], 7); - roundBCA(x[5], 7); - roundCAB(x[6], 7); - roundABC(x[7], 7); - - keySchedule(); - - roundBCA(x[0], 9); - roundCAB(x[1], 9); - roundABC(x[2], 9); - roundBCA(x[3], 9); - roundCAB(x[4], 9); - roundABC(x[5], 9); - roundBCA(x[6], 9); - roundCAB(x[7], 9); - - // - // feed forward - // - a ^= aa; - b -= bb; - c += cc; - - // - // clear the x buffer - // - xOff = 0; - for (int i = 0; i != x.length; i++) - { - x[i] = 0; - } - } - - public void unpackWord( - long r, - byte[] out, - int outOff) - { - out[outOff + 7] = (byte)(r >> 56); - out[outOff + 6] = (byte)(r >> 48); - out[outOff + 5] = (byte)(r >> 40); - out[outOff + 4] = (byte)(r >> 32); - out[outOff + 3] = (byte)(r >> 24); - out[outOff + 2] = (byte)(r >> 16); - out[outOff + 1] = (byte)(r >> 8); - out[outOff] = (byte)r; - } - - private void processLength( - long bitLength) - { - x[7] = bitLength; - } - - private void finish() - { - long bitLength = (byteCount << 3); - - update((byte)0x01); - - while (bOff != 0) - { - update((byte)0); - } - - processLength(bitLength); - - processBlock(); - } - - public int doFinal( - byte[] out, - int outOff) - { - finish(); - - unpackWord(a, out, outOff); - unpackWord(b, out, outOff + 8); - unpackWord(c, out, outOff + 16); - - reset(); - - return DIGEST_LENGTH; - } - - /** - * reset the chaining variables - */ - public void reset() - { - a = 0x0123456789ABCDEFL; - b = 0xFEDCBA9876543210L; - c = 0xF096A5B4C3B2E187L; - - xOff = 0; - for (int i = 0; i != x.length; i++) - { - x[i] = 0; - } - - bOff = 0; - for (int i = 0; i != buf.length; i++) - { - buf[i] = 0; - } - - byteCount = 0; - } - - public int getByteLength() - { - return BYTE_LENGTH; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/WhirlpoolDigest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/WhirlpoolDigest.java deleted file mode 100644 index 2acd250..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/digests/WhirlpoolDigest.java +++ /dev/null @@ -1,396 +0,0 @@ -package org.bc.crypto.digests; - -import org.bc.crypto.ExtendedDigest; -import org.bc.util.Arrays; - - -/** - * Implementation of WhirlpoolDigest, based on Java source published by Barreto - * and Rijmen. - * - */ -public final class WhirlpoolDigest - implements ExtendedDigest -{ - private static final int BYTE_LENGTH = 64; - - private static final int DIGEST_LENGTH_BYTES = 512 / 8; - private static final int ROUNDS = 10; - private static final int REDUCTION_POLYNOMIAL = 0x011d; // 2^8 + 2^4 + 2^3 + 2 + 1; - - private static final int[] SBOX = { - 0x18, 0x23, 0xc6, 0xe8, 0x87, 0xb8, 0x01, 0x4f, 0x36, 0xa6, 0xd2, 0xf5, 0x79, 0x6f, 0x91, 0x52, - 0x60, 0xbc, 0x9b, 0x8e, 0xa3, 0x0c, 0x7b, 0x35, 0x1d, 0xe0, 0xd7, 0xc2, 0x2e, 0x4b, 0xfe, 0x57, - 0x15, 0x77, 0x37, 0xe5, 0x9f, 0xf0, 0x4a, 0xda, 0x58, 0xc9, 0x29, 0x0a, 0xb1, 0xa0, 0x6b, 0x85, - 0xbd, 0x5d, 0x10, 0xf4, 0xcb, 0x3e, 0x05, 0x67, 0xe4, 0x27, 0x41, 0x8b, 0xa7, 0x7d, 0x95, 0xd8, - 0xfb, 0xee, 0x7c, 0x66, 0xdd, 0x17, 0x47, 0x9e, 0xca, 0x2d, 0xbf, 0x07, 0xad, 0x5a, 0x83, 0x33, - 0x63, 0x02, 0xaa, 0x71, 0xc8, 0x19, 0x49, 0xd9, 0xf2, 0xe3, 0x5b, 0x88, 0x9a, 0x26, 0x32, 0xb0, - 0xe9, 0x0f, 0xd5, 0x80, 0xbe, 0xcd, 0x34, 0x48, 0xff, 0x7a, 0x90, 0x5f, 0x20, 0x68, 0x1a, 0xae, - 0xb4, 0x54, 0x93, 0x22, 0x64, 0xf1, 0x73, 0x12, 0x40, 0x08, 0xc3, 0xec, 0xdb, 0xa1, 0x8d, 0x3d, - 0x97, 0x00, 0xcf, 0x2b, 0x76, 0x82, 0xd6, 0x1b, 0xb5, 0xaf, 0x6a, 0x50, 0x45, 0xf3, 0x30, 0xef, - 0x3f, 0x55, 0xa2, 0xea, 0x65, 0xba, 0x2f, 0xc0, 0xde, 0x1c, 0xfd, 0x4d, 0x92, 0x75, 0x06, 0x8a, - 0xb2, 0xe6, 0x0e, 0x1f, 0x62, 0xd4, 0xa8, 0x96, 0xf9, 0xc5, 0x25, 0x59, 0x84, 0x72, 0x39, 0x4c, - 0x5e, 0x78, 0x38, 0x8c, 0xd1, 0xa5, 0xe2, 0x61, 0xb3, 0x21, 0x9c, 0x1e, 0x43, 0xc7, 0xfc, 0x04, - 0x51, 0x99, 0x6d, 0x0d, 0xfa, 0xdf, 0x7e, 0x24, 0x3b, 0xab, 0xce, 0x11, 0x8f, 0x4e, 0xb7, 0xeb, - 0x3c, 0x81, 0x94, 0xf7, 0xb9, 0x13, 0x2c, 0xd3, 0xe7, 0x6e, 0xc4, 0x03, 0x56, 0x44, 0x7f, 0xa9, - 0x2a, 0xbb, 0xc1, 0x53, 0xdc, 0x0b, 0x9d, 0x6c, 0x31, 0x74, 0xf6, 0x46, 0xac, 0x89, 0x14, 0xe1, - 0x16, 0x3a, 0x69, 0x09, 0x70, 0xb6, 0xd0, 0xed, 0xcc, 0x42, 0x98, 0xa4, 0x28, 0x5c, 0xf8, 0x86 - }; - - private static final long[] C0 = new long[256]; - private static final long[] C1 = new long[256]; - private static final long[] C2 = new long[256]; - private static final long[] C3 = new long[256]; - private static final long[] C4 = new long[256]; - private static final long[] C5 = new long[256]; - private static final long[] C6 = new long[256]; - private static final long[] C7 = new long[256]; - - private final long[] _rc = new long[ROUNDS + 1]; - - public WhirlpoolDigest() - { - for (int i = 0; i < 256; i++) - { - int v1 = SBOX[i]; - int v2 = maskWithReductionPolynomial(v1 << 1); - int v4 = maskWithReductionPolynomial(v2 << 1); - int v5 = v4 ^ v1; - int v8 = maskWithReductionPolynomial(v4 << 1); - int v9 = v8 ^ v1; - - C0[i] = packIntoLong(v1, v1, v4, v1, v8, v5, v2, v9); - C1[i] = packIntoLong(v9, v1, v1, v4, v1, v8, v5, v2); - C2[i] = packIntoLong(v2, v9, v1, v1, v4, v1, v8, v5); - C3[i] = packIntoLong(v5, v2, v9, v1, v1, v4, v1, v8); - C4[i] = packIntoLong(v8, v5, v2, v9, v1, v1, v4, v1); - C5[i] = packIntoLong(v1, v8, v5, v2, v9, v1, v1, v4); - C6[i] = packIntoLong(v4, v1, v8, v5, v2, v9, v1, v1); - C7[i] = packIntoLong(v1, v4, v1, v8, v5, v2, v9, v1); - - } - - _rc[0] = 0L; - for (int r = 1; r <= ROUNDS; r++) - { - int i = 8 * (r - 1); - _rc[r] = (C0[i ] & 0xff00000000000000L) ^ - (C1[i + 1] & 0x00ff000000000000L) ^ - (C2[i + 2] & 0x0000ff0000000000L) ^ - (C3[i + 3] & 0x000000ff00000000L) ^ - (C4[i + 4] & 0x00000000ff000000L) ^ - (C5[i + 5] & 0x0000000000ff0000L) ^ - (C6[i + 6] & 0x000000000000ff00L) ^ - (C7[i + 7] & 0x00000000000000ffL); - } - - } - - private long packIntoLong(int b7, int b6, int b5, int b4, int b3, int b2, int b1, int b0) - { - return - ((long)b7 << 56) ^ - ((long)b6 << 48) ^ - ((long)b5 << 40) ^ - ((long)b4 << 32) ^ - ((long)b3 << 24) ^ - ((long)b2 << 16) ^ - ((long)b1 << 8) ^ - b0; - } - - /* - * int's are used to prevent sign extension. The values that are really being used are - * actually just 0..255 - */ - private int maskWithReductionPolynomial(int input) - { - int rv = input; - if (rv >= 0x100L) // high bit set - { - rv ^= REDUCTION_POLYNOMIAL; // reduced by the polynomial - } - return rv; - } - - // --------------------------------------------------------------------------------------// - - // -- buffer information -- - private static final int BITCOUNT_ARRAY_SIZE = 32; - private byte[] _buffer = new byte[64]; - private int _bufferPos = 0; - private short[] _bitCount = new short[BITCOUNT_ARRAY_SIZE]; - - // -- internal hash state -- - private long[] _hash = new long[8]; - private long[] _K = new long[8]; // the round key - private long[] _L = new long[8]; - private long[] _block = new long[8]; // mu (buffer) - private long[] _state = new long[8]; // the current "cipher" state - - - - /** - * Copy constructor. This will copy the state of the provided message - * digest. - */ - public WhirlpoolDigest(WhirlpoolDigest originalDigest) - { - System.arraycopy(originalDigest._rc, 0, _rc, 0, _rc.length); - - System.arraycopy(originalDigest._buffer, 0, _buffer, 0, _buffer.length); - - this._bufferPos = originalDigest._bufferPos; - System.arraycopy(originalDigest._bitCount, 0, _bitCount, 0, _bitCount.length); - - // -- internal hash state -- - System.arraycopy(originalDigest._hash, 0, _hash, 0, _hash.length); - System.arraycopy(originalDigest._K, 0, _K, 0, _K.length); - System.arraycopy(originalDigest._L, 0, _L, 0, _L.length); - System.arraycopy(originalDigest._block, 0, _block, 0, _block.length); - System.arraycopy(originalDigest._state, 0, _state, 0, _state.length); - } - - public String getAlgorithmName() - { - return "Whirlpool"; - } - - public int getDigestSize() - { - return DIGEST_LENGTH_BYTES; - } - - public int doFinal(byte[] out, int outOff) - { - // sets out[outOff] .. out[outOff+DIGEST_LENGTH_BYTES] - finish(); - - for (int i = 0; i < 8; i++) - { - convertLongToByteArray(_hash[i], out, outOff + (i * 8)); - } - - reset(); - return getDigestSize(); - } - - /** - * reset the chaining variables - */ - public void reset() - { - // set variables to null, blank, whatever - _bufferPos = 0; - Arrays.fill(_bitCount, (short)0); - Arrays.fill(_buffer, (byte)0); - Arrays.fill(_hash, 0); - Arrays.fill(_K, 0); - Arrays.fill(_L, 0); - Arrays.fill(_block, 0); - Arrays.fill(_state, 0); - } - - // this takes a buffer of information and fills the block - private void processFilledBuffer(byte[] in, int inOff) - { - // copies into the block... - for (int i = 0; i < _state.length; i++) - { - _block[i] = bytesToLongFromBuffer(_buffer, i * 8); - } - processBlock(); - _bufferPos = 0; - Arrays.fill(_buffer, (byte)0); - } - - private long bytesToLongFromBuffer(byte[] buffer, int startPos) - { - long rv = (((buffer[startPos + 0] & 0xffL) << 56) | - ((buffer[startPos + 1] & 0xffL) << 48) | - ((buffer[startPos + 2] & 0xffL) << 40) | - ((buffer[startPos + 3] & 0xffL) << 32) | - ((buffer[startPos + 4] & 0xffL) << 24) | - ((buffer[startPos + 5] & 0xffL) << 16) | - ((buffer[startPos + 6] & 0xffL) << 8) | - ((buffer[startPos + 7]) & 0xffL)); - - return rv; - } - - private void convertLongToByteArray(long inputLong, byte[] outputArray, int offSet) - { - for (int i = 0; i < 8; i++) - { - outputArray[offSet + i] = (byte)((inputLong >> (56 - (i * 8))) & 0xff); - } - } - - protected void processBlock() - { - // buffer contents have been transferred to the _block[] array via - // processFilledBuffer - - // compute and apply K^0 - for (int i = 0; i < 8; i++) - { - _state[i] = _block[i] ^ (_K[i] = _hash[i]); - } - - // iterate over the rounds - for (int round = 1; round <= ROUNDS; round++) - { - for (int i = 0; i < 8; i++) - { - _L[i] = 0; - _L[i] ^= C0[(int)(_K[(i - 0) & 7] >>> 56) & 0xff]; - _L[i] ^= C1[(int)(_K[(i - 1) & 7] >>> 48) & 0xff]; - _L[i] ^= C2[(int)(_K[(i - 2) & 7] >>> 40) & 0xff]; - _L[i] ^= C3[(int)(_K[(i - 3) & 7] >>> 32) & 0xff]; - _L[i] ^= C4[(int)(_K[(i - 4) & 7] >>> 24) & 0xff]; - _L[i] ^= C5[(int)(_K[(i - 5) & 7] >>> 16) & 0xff]; - _L[i] ^= C6[(int)(_K[(i - 6) & 7] >>> 8) & 0xff]; - _L[i] ^= C7[(int)(_K[(i - 7) & 7]) & 0xff]; - } - - System.arraycopy(_L, 0, _K, 0, _K.length); - - _K[0] ^= _rc[round]; - - // apply the round transformation - for (int i = 0; i < 8; i++) - { - _L[i] = _K[i]; - - _L[i] ^= C0[(int)(_state[(i - 0) & 7] >>> 56) & 0xff]; - _L[i] ^= C1[(int)(_state[(i - 1) & 7] >>> 48) & 0xff]; - _L[i] ^= C2[(int)(_state[(i - 2) & 7] >>> 40) & 0xff]; - _L[i] ^= C3[(int)(_state[(i - 3) & 7] >>> 32) & 0xff]; - _L[i] ^= C4[(int)(_state[(i - 4) & 7] >>> 24) & 0xff]; - _L[i] ^= C5[(int)(_state[(i - 5) & 7] >>> 16) & 0xff]; - _L[i] ^= C6[(int)(_state[(i - 6) & 7] >>> 8) & 0xff]; - _L[i] ^= C7[(int)(_state[(i - 7) & 7]) & 0xff]; - } - - // save the current state - System.arraycopy(_L, 0, _state, 0, _state.length); - } - - // apply Miuaguchi-Preneel compression - for (int i = 0; i < 8; i++) - { - _hash[i] ^= _state[i] ^ _block[i]; - } - - } - - public void update(byte in) - { - _buffer[_bufferPos] = in; - - //System.out.println("adding to buffer = "+_buffer[_bufferPos]); - - ++_bufferPos; - - if (_bufferPos == _buffer.length) - { - processFilledBuffer(_buffer, 0); - } - - increment(); - } - - /* - * increment() can be implemented in this way using 2 arrays or - * by having some temporary variables that are used to set the - * value provided by EIGHT[i] and carry within the loop. - * - * not having done any timing, this seems likely to be faster - * at the slight expense of 32*(sizeof short) bytes - */ - private static final short[] EIGHT = new short[BITCOUNT_ARRAY_SIZE]; - static - { - EIGHT[BITCOUNT_ARRAY_SIZE - 1] = 8; - } - - private void increment() - { - int carry = 0; - for (int i = _bitCount.length - 1; i >= 0; i--) - { - int sum = (_bitCount[i] & 0xff) + EIGHT[i] + carry; - - carry = sum >>> 8; - _bitCount[i] = (short)(sum & 0xff); - } - } - - public void update(byte[] in, int inOff, int len) - { - while (len > 0) - { - update(in[inOff]); - ++inOff; - --len; - } - - } - - private void finish() - { - /* - * this makes a copy of the current bit length. at the expense of an - * object creation of 32 bytes rather than providing a _stopCounting - * boolean which was the alternative I could think of. - */ - byte[] bitLength = copyBitLength(); - - _buffer[_bufferPos++] |= 0x80; - - if (_bufferPos == _buffer.length) - { - processFilledBuffer(_buffer, 0); - } - - /* - * Final block contains - * [ ... data .... ][0][0][0][ length ] - * - * if [ length ] cannot fit. Need to create a new block. - */ - if (_bufferPos > 32) - { - while (_bufferPos != 0) - { - update((byte)0); - } - } - - while (_bufferPos <= 32) - { - update((byte)0); - } - - // copy the length information to the final 32 bytes of the - // 64 byte block.... - System.arraycopy(bitLength, 0, _buffer, 32, bitLength.length); - - processFilledBuffer(_buffer, 0); - } - - private byte[] copyBitLength() - { - byte[] rv = new byte[BITCOUNT_ARRAY_SIZE]; - for (int i = 0; i < rv.length; i++) - { - rv[i] = (byte)(_bitCount[i] & 0xff); - } - return rv; - } - - public int getByteLength() - { - return BYTE_LENGTH; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/ISO9796d1Encoding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/ISO9796d1Encoding.java deleted file mode 100644 index aa9131c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/ISO9796d1Encoding.java +++ /dev/null @@ -1,287 +0,0 @@ -package org.bc.crypto.encodings; - -import java.math.BigInteger; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; - -/** - * ISO 9796-1 padding. Note in the light of recent results you should - * only use this with RSA (rather than the "simpler" Rabin keys) and you - * should never use it with anything other than a hash (ie. even if the - * message is small don't sign the message, sign it's hash) or some "random" - * value. See your favorite search engine for details. - */ -public class ISO9796d1Encoding - implements AsymmetricBlockCipher -{ - private static final BigInteger SIXTEEN = BigInteger.valueOf(16L); - private static final BigInteger SIX = BigInteger.valueOf(6L); - - private static byte[] shadows = { 0xe, 0x3, 0x5, 0x8, 0x9, 0x4, 0x2, 0xf, - 0x0, 0xd, 0xb, 0x6, 0x7, 0xa, 0xc, 0x1 }; - private static byte[] inverse = { 0x8, 0xf, 0x6, 0x1, 0x5, 0x2, 0xb, 0xc, - 0x3, 0x4, 0xd, 0xa, 0xe, 0x9, 0x0, 0x7 }; - - private AsymmetricBlockCipher engine; - private boolean forEncryption; - private int bitSize; - private int padBits = 0; - private BigInteger modulus; - - public ISO9796d1Encoding( - AsymmetricBlockCipher cipher) - { - this.engine = cipher; - } - - public AsymmetricBlockCipher getUnderlyingCipher() - { - return engine; - } - - public void init( - boolean forEncryption, - CipherParameters param) - { - RSAKeyParameters kParam = null; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - kParam = (RSAKeyParameters)rParam.getParameters(); - } - else - { - kParam = (RSAKeyParameters)param; - } - - engine.init(forEncryption, param); - - modulus = kParam.getModulus(); - bitSize = modulus.bitLength(); - - this.forEncryption = forEncryption; - } - - /** - * return the input block size. The largest message we can process - * is (key_size_in_bits + 3)/16, which in our world comes to - * key_size_in_bytes / 2. - */ - public int getInputBlockSize() - { - int baseBlockSize = engine.getInputBlockSize(); - - if (forEncryption) - { - return (baseBlockSize + 1) / 2; - } - else - { - return baseBlockSize; - } - } - - /** - * return the maximum possible size for the output. - */ - public int getOutputBlockSize() - { - int baseBlockSize = engine.getOutputBlockSize(); - - if (forEncryption) - { - return baseBlockSize; - } - else - { - return (baseBlockSize + 1) / 2; - } - } - - /** - * set the number of bits in the next message to be treated as - * pad bits. - */ - public void setPadBits( - int padBits) - { - if (padBits > 7) - { - throw new IllegalArgumentException("padBits > 7"); - } - - this.padBits = padBits; - } - - /** - * retrieve the number of pad bits in the last decoded message. - */ - public int getPadBits() - { - return padBits; - } - - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forEncryption) - { - return encodeBlock(in, inOff, inLen); - } - else - { - return decodeBlock(in, inOff, inLen); - } - } - - private byte[] encodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] block = new byte[(bitSize + 7) / 8]; - int r = padBits + 1; - int z = inLen; - int t = (bitSize + 13) / 16; - - for (int i = 0; i < t; i += z) - { - if (i > t - z) - { - System.arraycopy(in, inOff + inLen - (t - i), - block, block.length - t, t - i); - } - else - { - System.arraycopy(in, inOff, block, block.length - (i + z), z); - } - } - - for (int i = block.length - 2 * t; i != block.length; i += 2) - { - byte val = block[block.length - t + i / 2]; - - block[i] = (byte)((shadows[(val & 0xff) >>> 4] << 4) - | shadows[val & 0x0f]); - block[i + 1] = val; - } - - block[block.length - 2 * z] ^= r; - block[block.length - 1] = (byte)((block[block.length - 1] << 4) | 0x06); - - int maxBit = (8 - (bitSize - 1) % 8); - int offSet = 0; - - if (maxBit != 8) - { - block[0] &= 0xff >>> maxBit; - block[0] |= 0x80 >>> maxBit; - } - else - { - block[0] = 0x00; - block[1] |= 0x80; - offSet = 1; - } - - return engine.processBlock(block, offSet, block.length - offSet); - } - - /** - * @exception InvalidCipherTextException if the decrypted block is not a valid ISO 9796 bit string - */ - private byte[] decodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] block = engine.processBlock(in, inOff, inLen); - int r = 1; - int t = (bitSize + 13) / 16; - - BigInteger iS = new BigInteger(1, block); - BigInteger iR; - if (iS.mod(SIXTEEN).equals(SIX)) - { - iR = iS; - } - else if ((modulus.subtract(iS)).mod(SIXTEEN).equals(SIX)) - { - iR = modulus.subtract(iS); - } - else - { - throw new InvalidCipherTextException("resulting integer iS or (modulus - iS) is not congruent to 6 mod 16"); - } - - block = convertOutputDecryptOnly(iR); - - if ((block[block.length - 1] & 0x0f) != 0x6 ) - { - throw new InvalidCipherTextException("invalid forcing byte in block"); - } - - block[block.length - 1] = (byte)(((block[block.length - 1] & 0xff) >>> 4) | ((inverse[(block[block.length - 2] & 0xff) >> 4]) << 4)); - block[0] = (byte)((shadows[(block[1] & 0xff) >>> 4] << 4) - | shadows[block[1] & 0x0f]); - - boolean boundaryFound = false; - int boundary = 0; - - for (int i = block.length - 1; i >= block.length - 2 * t; i -= 2) - { - int val = ((shadows[(block[i] & 0xff) >>> 4] << 4) - | shadows[block[i] & 0x0f]); - - if (((block[i - 1] ^ val) & 0xff) != 0) - { - if (!boundaryFound) - { - boundaryFound = true; - r = (block[i - 1] ^ val) & 0xff; - boundary = i - 1; - } - else - { - throw new InvalidCipherTextException("invalid tsums in block"); - } - } - } - - block[boundary] = 0; - - byte[] nblock = new byte[(block.length - boundary) / 2]; - - for (int i = 0; i < nblock.length; i++) - { - nblock[i] = block[2 * i + boundary + 1]; - } - - padBits = r - 1; - - return nblock; - } - - private static byte[] convertOutputDecryptOnly(BigInteger result) - { - byte[] output = result.toByteArray(); - if (output[0] == 0) // have ended up with an extra zero byte, copy down. - { - byte[] tmp = new byte[output.length - 1]; - System.arraycopy(output, 1, tmp, 0, tmp.length); - return tmp; - } - return output; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/OAEPEncoding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/OAEPEncoding.java deleted file mode 100644 index 218a9e4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/OAEPEncoding.java +++ /dev/null @@ -1,348 +0,0 @@ -package org.bc.crypto.encodings; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.ParametersWithRandom; - -import java.security.SecureRandom; - -/** - * Optimal Asymmetric Encryption Padding (OAEP) - see PKCS 1 V 2. - */ -public class OAEPEncoding - implements AsymmetricBlockCipher -{ - private byte[] defHash; - private Digest hash; - private Digest mgf1Hash; - - private AsymmetricBlockCipher engine; - private SecureRandom random; - private boolean forEncryption; - - public OAEPEncoding( - AsymmetricBlockCipher cipher) - { - this(cipher, new SHA1Digest(), null); - } - - public OAEPEncoding( - AsymmetricBlockCipher cipher, - Digest hash) - { - this(cipher, hash, null); - } - - public OAEPEncoding( - AsymmetricBlockCipher cipher, - Digest hash, - byte[] encodingParams) - { - this(cipher, hash, hash, encodingParams); - } - - public OAEPEncoding( - AsymmetricBlockCipher cipher, - Digest hash, - Digest mgf1Hash, - byte[] encodingParams) - { - this.engine = cipher; - this.hash = hash; - this.mgf1Hash = mgf1Hash; - this.defHash = new byte[hash.getDigestSize()]; - - if (encodingParams != null) - { - hash.update(encodingParams, 0, encodingParams.length); - } - - hash.doFinal(defHash, 0); - } - - public AsymmetricBlockCipher getUnderlyingCipher() - { - return engine; - } - - public void init( - boolean forEncryption, - CipherParameters param) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - } - else - { - this.random = new SecureRandom(); - } - - engine.init(forEncryption, param); - - this.forEncryption = forEncryption; - } - - public int getInputBlockSize() - { - int baseBlockSize = engine.getInputBlockSize(); - - if (forEncryption) - { - return baseBlockSize - 1 - 2 * defHash.length; - } - else - { - return baseBlockSize; - } - } - - public int getOutputBlockSize() - { - int baseBlockSize = engine.getOutputBlockSize(); - - if (forEncryption) - { - return baseBlockSize; - } - else - { - return baseBlockSize - 1 - 2 * defHash.length; - } - } - - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forEncryption) - { - return encodeBlock(in, inOff, inLen); - } - else - { - return decodeBlock(in, inOff, inLen); - } - } - - public byte[] encodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] block = new byte[getInputBlockSize() + 1 + 2 * defHash.length]; - - // - // copy in the message - // - System.arraycopy(in, inOff, block, block.length - inLen, inLen); - - // - // add sentinel - // - block[block.length - inLen - 1] = 0x01; - - // - // as the block is already zeroed - there's no need to add PS (the >= 0 pad of 0) - // - - // - // add the hash of the encoding params. - // - System.arraycopy(defHash, 0, block, defHash.length, defHash.length); - - // - // generate the seed. - // - byte[] seed = new byte[defHash.length]; - - random.nextBytes(seed); - - // - // mask the message block. - // - byte[] mask = maskGeneratorFunction1(seed, 0, seed.length, block.length - defHash.length); - - for (int i = defHash.length; i != block.length; i++) - { - block[i] ^= mask[i - defHash.length]; - } - - // - // add in the seed - // - System.arraycopy(seed, 0, block, 0, defHash.length); - - // - // mask the seed. - // - mask = maskGeneratorFunction1( - block, defHash.length, block.length - defHash.length, defHash.length); - - for (int i = 0; i != defHash.length; i++) - { - block[i] ^= mask[i]; - } - - return engine.processBlock(block, 0, block.length); - } - - /** - * @exception InvalidCipherTextException if the decrypted block turns out to - * be badly formatted. - */ - public byte[] decodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] data = engine.processBlock(in, inOff, inLen); - byte[] block; - - // - // as we may have zeros in our leading bytes for the block we produced - // on encryption, we need to make sure our decrypted block comes back - // the same size. - // - if (data.length < engine.getOutputBlockSize()) - { - block = new byte[engine.getOutputBlockSize()]; - - System.arraycopy(data, 0, block, block.length - data.length, data.length); - } - else - { - block = data; - } - - if (block.length < (2 * defHash.length) + 1) - { - throw new InvalidCipherTextException("data too short"); - } - - // - // unmask the seed. - // - byte[] mask = maskGeneratorFunction1( - block, defHash.length, block.length - defHash.length, defHash.length); - - for (int i = 0; i != defHash.length; i++) - { - block[i] ^= mask[i]; - } - - // - // unmask the message block. - // - mask = maskGeneratorFunction1(block, 0, defHash.length, block.length - defHash.length); - - for (int i = defHash.length; i != block.length; i++) - { - block[i] ^= mask[i - defHash.length]; - } - - // - // check the hash of the encoding params. - // - for (int i = 0; i != defHash.length; i++) - { - if (defHash[i] != block[defHash.length + i]) - { - throw new InvalidCipherTextException("data hash wrong"); - } - } - - // - // find the data block - // - int start; - - for (start = 2 * defHash.length; start != block.length; start++) - { - if (block[start] != 0) - { - break; - } - } - - if (start >= (block.length - 1) || block[start] != 1) - { - throw new InvalidCipherTextException("data start wrong " + start); - } - - start++; - - // - // extract the data block - // - byte[] output = new byte[block.length - start]; - - System.arraycopy(block, start, output, 0, output.length); - - return output; - } - - /** - * int to octet string. - */ - private void ItoOSP( - int i, - byte[] sp) - { - sp[0] = (byte)(i >>> 24); - sp[1] = (byte)(i >>> 16); - sp[2] = (byte)(i >>> 8); - sp[3] = (byte)(i >>> 0); - } - - /** - * mask generator function, as described in PKCS1v2. - */ - private byte[] maskGeneratorFunction1( - byte[] Z, - int zOff, - int zLen, - int length) - { - byte[] mask = new byte[length]; - byte[] hashBuf = new byte[mgf1Hash.getDigestSize()]; - byte[] C = new byte[4]; - int counter = 0; - - hash.reset(); - - do - { - ItoOSP(counter, C); - - mgf1Hash.update(Z, zOff, zLen); - mgf1Hash.update(C, 0, C.length); - mgf1Hash.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * hashBuf.length, hashBuf.length); - } - while (++counter < (length / hashBuf.length)); - - if ((counter * hashBuf.length) < length) - { - ItoOSP(counter, C); - - mgf1Hash.update(Z, zOff, zLen); - mgf1Hash.update(C, 0, C.length); - mgf1Hash.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * hashBuf.length, mask.length - (counter * hashBuf.length)); - } - - return mask; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/PKCS1Encoding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/PKCS1Encoding.java deleted file mode 100644 index ce54a15..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/encodings/PKCS1Encoding.java +++ /dev/null @@ -1,257 +0,0 @@ -package org.bc.crypto.encodings; - -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; - -/** - * this does your basic PKCS 1 v1.5 padding - whether or not you should be using this - * depends on your application - see PKCS1 Version 2 for details. - */ -public class PKCS1Encoding - implements AsymmetricBlockCipher -{ - /** - * some providers fail to include the leading zero in PKCS1 encoded blocks. If you need to - * work with one of these set the system property org.bouncycastle.pkcs1.strict to false. - *

    - * The system property is checked during construction of the encoding object, it is set to - * true by default. - *

    - */ - public static final String STRICT_LENGTH_ENABLED_PROPERTY = "org.bouncycastle.pkcs1.strict"; - - private static final int HEADER_LENGTH = 10; - - private SecureRandom random; - private AsymmetricBlockCipher engine; - private boolean forEncryption; - private boolean forPrivateKey; - private boolean useStrictLength; - - /** - * Basic constructor. - * @param cipher - */ - public PKCS1Encoding( - AsymmetricBlockCipher cipher) - { - this.engine = cipher; - this.useStrictLength = useStrict(); - } - - // - // for J2ME compatibility - // - private boolean useStrict() - { - // required if security manager has been installed. - String strict = (String)AccessController.doPrivileged(new PrivilegedAction() - { - public Object run() - { - return System.getProperty(STRICT_LENGTH_ENABLED_PROPERTY); - } - }); - - return strict == null || strict.equals("true"); - } - - public AsymmetricBlockCipher getUnderlyingCipher() - { - return engine; - } - - public void init( - boolean forEncryption, - CipherParameters param) - { - AsymmetricKeyParameter kParam; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - kParam = (AsymmetricKeyParameter)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - kParam = (AsymmetricKeyParameter)param; - } - - engine.init(forEncryption, param); - - this.forPrivateKey = kParam.isPrivate(); - this.forEncryption = forEncryption; - } - - public int getInputBlockSize() - { - int baseBlockSize = engine.getInputBlockSize(); - - if (forEncryption) - { - return baseBlockSize - HEADER_LENGTH; - } - else - { - return baseBlockSize; - } - } - - public int getOutputBlockSize() - { - int baseBlockSize = engine.getOutputBlockSize(); - - if (forEncryption) - { - return baseBlockSize; - } - else - { - return baseBlockSize - HEADER_LENGTH; - } - } - - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forEncryption) - { - return encodeBlock(in, inOff, inLen); - } - else - { - return decodeBlock(in, inOff, inLen); - } - } - - private byte[] encodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (inLen > getInputBlockSize()) - { - throw new IllegalArgumentException("input data too large"); - } - - byte[] block = new byte[engine.getInputBlockSize()]; - - if (forPrivateKey) - { - block[0] = 0x01; // type code 1 - - for (int i = 1; i != block.length - inLen - 1; i++) - { - block[i] = (byte)0xFF; - } - } - else - { - random.nextBytes(block); // random fill - - block[0] = 0x02; // type code 2 - - // - // a zero byte marks the end of the padding, so all - // the pad bytes must be non-zero. - // - for (int i = 1; i != block.length - inLen - 1; i++) - { - while (block[i] == 0) - { - block[i] = (byte)random.nextInt(); - } - } - } - - block[block.length - inLen - 1] = 0x00; // mark the end of the padding - System.arraycopy(in, inOff, block, block.length - inLen, inLen); - - return engine.processBlock(block, 0, block.length); - } - - /** - * @exception InvalidCipherTextException if the decrypted block is not in PKCS1 format. - */ - private byte[] decodeBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] block = engine.processBlock(in, inOff, inLen); - - if (block.length < getOutputBlockSize()) - { - throw new InvalidCipherTextException("block truncated"); - } - - byte type = block[0]; - - if (forPrivateKey) - { - if (type != 2) - { - throw new InvalidCipherTextException("unknown block type"); - } - } - else - { - if (type != 1) - { - throw new InvalidCipherTextException("unknown block type"); - } - } - - if (useStrictLength && block.length != engine.getOutputBlockSize()) - { - throw new InvalidCipherTextException("block incorrect size"); - } - - // - // find and extract the message block. - // - int start; - - for (start = 1; start != block.length; start++) - { - byte pad = block[start]; - - if (pad == 0) - { - break; - } - if (type == 1 && pad != (byte)0xff) - { - throw new InvalidCipherTextException("block padding incorrect"); - } - } - - start++; // data should start at the next byte - - if (start > block.length || start < HEADER_LENGTH) - { - throw new InvalidCipherTextException("no data in block"); - } - - byte[] result = new byte[block.length - start]; - - System.arraycopy(block, start, result, 0, result.length); - - return result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESEngine.java deleted file mode 100644 index f9fa7f4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESEngine.java +++ /dev/null @@ -1,545 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * an implementation of the AES (Rijndael), from FIPS-197. - *

    - * For further details see: http://csrc.nist.gov/encryption/aes/. - * - * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at - * http://fp.gladman.plus.com/cryptography_technology/rijndael/ - * - * There are three levels of tradeoff of speed vs memory - * Because java has no preprocessor, they are written as three separate classes from which to choose - * - * The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption - * and 4 for decryption. - * - * The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, - * adding 12 rotate operations per round to compute the values contained in the other tables from - * the contents of the first. - * - * The slowest version uses no static tables at all and computes the values in each round. - *

    - * This file contains the middle performance version with 2Kbytes of static tables for round precomputation. - * - */ -public class AESEngine - implements BlockCipher -{ - // The S box - private static final byte[] S = { - (byte)99, (byte)124, (byte)119, (byte)123, (byte)242, (byte)107, (byte)111, (byte)197, - (byte)48, (byte)1, (byte)103, (byte)43, (byte)254, (byte)215, (byte)171, (byte)118, - (byte)202, (byte)130, (byte)201, (byte)125, (byte)250, (byte)89, (byte)71, (byte)240, - (byte)173, (byte)212, (byte)162, (byte)175, (byte)156, (byte)164, (byte)114, (byte)192, - (byte)183, (byte)253, (byte)147, (byte)38, (byte)54, (byte)63, (byte)247, (byte)204, - (byte)52, (byte)165, (byte)229, (byte)241, (byte)113, (byte)216, (byte)49, (byte)21, - (byte)4, (byte)199, (byte)35, (byte)195, (byte)24, (byte)150, (byte)5, (byte)154, - (byte)7, (byte)18, (byte)128, (byte)226, (byte)235, (byte)39, (byte)178, (byte)117, - (byte)9, (byte)131, (byte)44, (byte)26, (byte)27, (byte)110, (byte)90, (byte)160, - (byte)82, (byte)59, (byte)214, (byte)179, (byte)41, (byte)227, (byte)47, (byte)132, - (byte)83, (byte)209, (byte)0, (byte)237, (byte)32, (byte)252, (byte)177, (byte)91, - (byte)106, (byte)203, (byte)190, (byte)57, (byte)74, (byte)76, (byte)88, (byte)207, - (byte)208, (byte)239, (byte)170, (byte)251, (byte)67, (byte)77, (byte)51, (byte)133, - (byte)69, (byte)249, (byte)2, (byte)127, (byte)80, (byte)60, (byte)159, (byte)168, - (byte)81, (byte)163, (byte)64, (byte)143, (byte)146, (byte)157, (byte)56, (byte)245, - (byte)188, (byte)182, (byte)218, (byte)33, (byte)16, (byte)255, (byte)243, (byte)210, - (byte)205, (byte)12, (byte)19, (byte)236, (byte)95, (byte)151, (byte)68, (byte)23, - (byte)196, (byte)167, (byte)126, (byte)61, (byte)100, (byte)93, (byte)25, (byte)115, - (byte)96, (byte)129, (byte)79, (byte)220, (byte)34, (byte)42, (byte)144, (byte)136, - (byte)70, (byte)238, (byte)184, (byte)20, (byte)222, (byte)94, (byte)11, (byte)219, - (byte)224, (byte)50, (byte)58, (byte)10, (byte)73, (byte)6, (byte)36, (byte)92, - (byte)194, (byte)211, (byte)172, (byte)98, (byte)145, (byte)149, (byte)228, (byte)121, - (byte)231, (byte)200, (byte)55, (byte)109, (byte)141, (byte)213, (byte)78, (byte)169, - (byte)108, (byte)86, (byte)244, (byte)234, (byte)101, (byte)122, (byte)174, (byte)8, - (byte)186, (byte)120, (byte)37, (byte)46, (byte)28, (byte)166, (byte)180, (byte)198, - (byte)232, (byte)221, (byte)116, (byte)31, (byte)75, (byte)189, (byte)139, (byte)138, - (byte)112, (byte)62, (byte)181, (byte)102, (byte)72, (byte)3, (byte)246, (byte)14, - (byte)97, (byte)53, (byte)87, (byte)185, (byte)134, (byte)193, (byte)29, (byte)158, - (byte)225, (byte)248, (byte)152, (byte)17, (byte)105, (byte)217, (byte)142, (byte)148, - (byte)155, (byte)30, (byte)135, (byte)233, (byte)206, (byte)85, (byte)40, (byte)223, - (byte)140, (byte)161, (byte)137, (byte)13, (byte)191, (byte)230, (byte)66, (byte)104, - (byte)65, (byte)153, (byte)45, (byte)15, (byte)176, (byte)84, (byte)187, (byte)22, - }; - - // The inverse S-box - private static final byte[] Si = { - (byte)82, (byte)9, (byte)106, (byte)213, (byte)48, (byte)54, (byte)165, (byte)56, - (byte)191, (byte)64, (byte)163, (byte)158, (byte)129, (byte)243, (byte)215, (byte)251, - (byte)124, (byte)227, (byte)57, (byte)130, (byte)155, (byte)47, (byte)255, (byte)135, - (byte)52, (byte)142, (byte)67, (byte)68, (byte)196, (byte)222, (byte)233, (byte)203, - (byte)84, (byte)123, (byte)148, (byte)50, (byte)166, (byte)194, (byte)35, (byte)61, - (byte)238, (byte)76, (byte)149, (byte)11, (byte)66, (byte)250, (byte)195, (byte)78, - (byte)8, (byte)46, (byte)161, (byte)102, (byte)40, (byte)217, (byte)36, (byte)178, - (byte)118, (byte)91, (byte)162, (byte)73, (byte)109, (byte)139, (byte)209, (byte)37, - (byte)114, (byte)248, (byte)246, (byte)100, (byte)134, (byte)104, (byte)152, (byte)22, - (byte)212, (byte)164, (byte)92, (byte)204, (byte)93, (byte)101, (byte)182, (byte)146, - (byte)108, (byte)112, (byte)72, (byte)80, (byte)253, (byte)237, (byte)185, (byte)218, - (byte)94, (byte)21, (byte)70, (byte)87, (byte)167, (byte)141, (byte)157, (byte)132, - (byte)144, (byte)216, (byte)171, (byte)0, (byte)140, (byte)188, (byte)211, (byte)10, - (byte)247, (byte)228, (byte)88, (byte)5, (byte)184, (byte)179, (byte)69, (byte)6, - (byte)208, (byte)44, (byte)30, (byte)143, (byte)202, (byte)63, (byte)15, (byte)2, - (byte)193, (byte)175, (byte)189, (byte)3, (byte)1, (byte)19, (byte)138, (byte)107, - (byte)58, (byte)145, (byte)17, (byte)65, (byte)79, (byte)103, (byte)220, (byte)234, - (byte)151, (byte)242, (byte)207, (byte)206, (byte)240, (byte)180, (byte)230, (byte)115, - (byte)150, (byte)172, (byte)116, (byte)34, (byte)231, (byte)173, (byte)53, (byte)133, - (byte)226, (byte)249, (byte)55, (byte)232, (byte)28, (byte)117, (byte)223, (byte)110, - (byte)71, (byte)241, (byte)26, (byte)113, (byte)29, (byte)41, (byte)197, (byte)137, - (byte)111, (byte)183, (byte)98, (byte)14, (byte)170, (byte)24, (byte)190, (byte)27, - (byte)252, (byte)86, (byte)62, (byte)75, (byte)198, (byte)210, (byte)121, (byte)32, - (byte)154, (byte)219, (byte)192, (byte)254, (byte)120, (byte)205, (byte)90, (byte)244, - (byte)31, (byte)221, (byte)168, (byte)51, (byte)136, (byte)7, (byte)199, (byte)49, - (byte)177, (byte)18, (byte)16, (byte)89, (byte)39, (byte)128, (byte)236, (byte)95, - (byte)96, (byte)81, (byte)127, (byte)169, (byte)25, (byte)181, (byte)74, (byte)13, - (byte)45, (byte)229, (byte)122, (byte)159, (byte)147, (byte)201, (byte)156, (byte)239, - (byte)160, (byte)224, (byte)59, (byte)77, (byte)174, (byte)42, (byte)245, (byte)176, - (byte)200, (byte)235, (byte)187, (byte)60, (byte)131, (byte)83, (byte)153, (byte)97, - (byte)23, (byte)43, (byte)4, (byte)126, (byte)186, (byte)119, (byte)214, (byte)38, - (byte)225, (byte)105, (byte)20, (byte)99, (byte)85, (byte)33, (byte)12, (byte)125, - }; - - // vector used in calculating key schedule (powers of x in GF(256)) - private static final int[] rcon = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, - 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; - - // precomputation tables of calculations for rounds - private static final int[] T0 = - { - 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, - 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102, - 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, - 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, - 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41, - 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, - 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d, - 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, - 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2, - 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795, - 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, - 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, - 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, - 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, - 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, - 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, - 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, - 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, - 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, - 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, - 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a, - 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, - 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080, - 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, - 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, - 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, - 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, - 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, - 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, - 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, - 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, - 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, - 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, - 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd, - 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, - 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, - 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, - 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, - 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a, - 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, - 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, - 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, - 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7, - 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, - 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, - 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, - 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, - 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, - 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, - 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929, - 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, - 0x3a16162c}; - -private static final int[] Tinv0 = - { - 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, - 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad, - 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, - 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, - 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03, - 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, - 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899, - 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, - 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1, - 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f, - 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, - 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3, - 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a, - 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506, - 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05, - 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd, - 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, - 0x055dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6, - 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, - 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, - 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd, - 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, - 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793, 0xd296eeb4, - 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, - 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e, - 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af, - 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644, - 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, - 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85, - 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc, - 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411, - 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, - 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, - 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0x0d927850, - 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, - 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, - 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd, - 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, - 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea, - 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, - 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1, - 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43, - 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, - 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, - 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a, - 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, - 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418, - 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, - 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, - 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08, - 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, - 0x4257b8d0}; - - private static int shift(int r, int shift) - { - return (r >>> shift) | (r << -shift); - } - - /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ - - private static final int m1 = 0x80808080; - private static final int m2 = 0x7f7f7f7f; - private static final int m3 = 0x0000001b; - - private static int FFmulX(int x) - { - return (((x & m2) << 1) ^ (((x & m1) >>> 7) * m3)); - } - - /* - The following defines provide alternative definitions of FFmulX that might - give improved performance if a fast 32-bit multiply is not available. - - private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } - private static final int m4 = 0x1b1b1b1b; - private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } - - */ - - private static int inv_mcol(int x) - { - int f2 = FFmulX(x); - int f4 = FFmulX(f2); - int f8 = FFmulX(f4); - int f9 = x ^ f8; - - return f2 ^ f4 ^ f8 ^ shift(f2 ^ f9, 8) ^ shift(f4 ^ f9, 16) ^ shift(f9, 24); - } - - private static int subWord(int x) - { - return (S[x&255]&255 | ((S[(x>>8)&255]&255)<<8) | ((S[(x>>16)&255]&255)<<16) | S[(x>>24)&255]<<24); - } - - /** - * Calculate the necessary round keys - * The number of calculations depends on key size and block size - * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits - * This code is written assuming those are the only possible values - */ - private int[][] generateWorkingKey( - byte[] key, - boolean forEncryption) - { - int KC = key.length / 4; // key length in words - int t; - - if (((KC != 4) && (KC != 6) && (KC != 8)) || ((KC * 4) != key.length)) - { - throw new IllegalArgumentException("Key length not 128/192/256 bits."); - } - - ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes - int[][] W = new int[ROUNDS+1][4]; // 4 words in a block - - // - // copy the key into the round key array - // - - t = 0; - int i = 0; - while (i < key.length) - { - W[t >> 2][t & 3] = (key[i]&0xff) | ((key[i+1]&0xff) << 8) | ((key[i+2]&0xff) << 16) | (key[i+3] << 24); - i+=4; - t++; - } - - // - // while not enough round key material calculated - // calculate new values - // - int k = (ROUNDS + 1) << 2; - for (i = KC; (i < k); i++) - { - int temp = W[(i-1)>>2][(i-1)&3]; - if ((i % KC) == 0) - { - temp = subWord(shift(temp, 8)) ^ rcon[(i / KC)-1]; - } - else if ((KC > 6) && ((i % KC) == 4)) - { - temp = subWord(temp); - } - - W[i>>2][i&3] = W[(i - KC)>>2][(i-KC)&3] ^ temp; - } - - if (!forEncryption) - { - for (int j = 1; j < ROUNDS; j++) - { - for (i = 0; i < 4; i++) - { - W[j][i] = inv_mcol(W[j][i]); - } - } - } - - return W; - } - - private int ROUNDS; - private int[][] WorkingKey = null; - private int C0, C1, C2, C3; - private boolean forEncryption; - - private static final int BLOCK_SIZE = 16; - - /** - * default constructor - 128 bit block size. - */ - public AESEngine() - { - } - - /** - * initialise an AES cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - WorkingKey = generateWorkingKey(((KeyParameter)params).getKey(), forEncryption); - this.forEncryption = forEncryption; - return; - } - - throw new IllegalArgumentException("invalid parameter passed to AES init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "AES"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (WorkingKey == null) - { - throw new IllegalStateException("AES engine not initialised"); - } - - if ((inOff + (32 / 2)) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + (32 / 2)) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (forEncryption) - { - unpackBlock(in, inOff); - encryptBlock(WorkingKey); - packBlock(out, outOff); - } - else - { - unpackBlock(in, inOff); - decryptBlock(WorkingKey); - packBlock(out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private void unpackBlock( - byte[] bytes, - int off) - { - int index = off; - - C0 = (bytes[index++] & 0xff); - C0 |= (bytes[index++] & 0xff) << 8; - C0 |= (bytes[index++] & 0xff) << 16; - C0 |= bytes[index++] << 24; - - C1 = (bytes[index++] & 0xff); - C1 |= (bytes[index++] & 0xff) << 8; - C1 |= (bytes[index++] & 0xff) << 16; - C1 |= bytes[index++] << 24; - - C2 = (bytes[index++] & 0xff); - C2 |= (bytes[index++] & 0xff) << 8; - C2 |= (bytes[index++] & 0xff) << 16; - C2 |= bytes[index++] << 24; - - C3 = (bytes[index++] & 0xff); - C3 |= (bytes[index++] & 0xff) << 8; - C3 |= (bytes[index++] & 0xff) << 16; - C3 |= bytes[index++] << 24; - } - - private void packBlock( - byte[] bytes, - int off) - { - int index = off; - - bytes[index++] = (byte)C0; - bytes[index++] = (byte)(C0 >> 8); - bytes[index++] = (byte)(C0 >> 16); - bytes[index++] = (byte)(C0 >> 24); - - bytes[index++] = (byte)C1; - bytes[index++] = (byte)(C1 >> 8); - bytes[index++] = (byte)(C1 >> 16); - bytes[index++] = (byte)(C1 >> 24); - - bytes[index++] = (byte)C2; - bytes[index++] = (byte)(C2 >> 8); - bytes[index++] = (byte)(C2 >> 16); - bytes[index++] = (byte)(C2 >> 24); - - bytes[index++] = (byte)C3; - bytes[index++] = (byte)(C3 >> 8); - bytes[index++] = (byte)(C3 >> 16); - bytes[index++] = (byte)(C3 >> 24); - } - - - private void encryptBlock(int[][] KW) - { - int r, r0, r1, r2, r3; - - C0 ^= KW[0][0]; - C1 ^= KW[0][1]; - C2 ^= KW[0][2]; - C3 ^= KW[0][3]; - - r = 1; - - while (r < ROUNDS - 1) - { - r0 = T0[C0&255] ^ shift(T0[(C1>>8)&255], 24) ^ shift(T0[(C2>>16)&255],16) ^ shift(T0[(C3>>24)&255],8) ^ KW[r][0]; - r1 = T0[C1&255] ^ shift(T0[(C2>>8)&255], 24) ^ shift(T0[(C3>>16)&255], 16) ^ shift(T0[(C0>>24)&255], 8) ^ KW[r][1]; - r2 = T0[C2&255] ^ shift(T0[(C3>>8)&255], 24) ^ shift(T0[(C0>>16)&255], 16) ^ shift(T0[(C1>>24)&255], 8) ^ KW[r][2]; - r3 = T0[C3&255] ^ shift(T0[(C0>>8)&255], 24) ^ shift(T0[(C1>>16)&255], 16) ^ shift(T0[(C2>>24)&255], 8) ^ KW[r++][3]; - C0 = T0[r0&255] ^ shift(T0[(r1>>8)&255], 24) ^ shift(T0[(r2>>16)&255], 16) ^ shift(T0[(r3>>24)&255], 8) ^ KW[r][0]; - C1 = T0[r1&255] ^ shift(T0[(r2>>8)&255], 24) ^ shift(T0[(r3>>16)&255], 16) ^ shift(T0[(r0>>24)&255], 8) ^ KW[r][1]; - C2 = T0[r2&255] ^ shift(T0[(r3>>8)&255], 24) ^ shift(T0[(r0>>16)&255], 16) ^ shift(T0[(r1>>24)&255], 8) ^ KW[r][2]; - C3 = T0[r3&255] ^ shift(T0[(r0>>8)&255], 24) ^ shift(T0[(r1>>16)&255], 16) ^ shift(T0[(r2>>24)&255], 8) ^ KW[r++][3]; - } - - r0 = T0[C0&255] ^ shift(T0[(C1>>8)&255], 24) ^ shift(T0[(C2>>16)&255], 16) ^ shift(T0[(C3>>24)&255], 8) ^ KW[r][0]; - r1 = T0[C1&255] ^ shift(T0[(C2>>8)&255], 24) ^ shift(T0[(C3>>16)&255], 16) ^ shift(T0[(C0>>24)&255], 8) ^ KW[r][1]; - r2 = T0[C2&255] ^ shift(T0[(C3>>8)&255], 24) ^ shift(T0[(C0>>16)&255], 16) ^ shift(T0[(C1>>24)&255], 8) ^ KW[r][2]; - r3 = T0[C3&255] ^ shift(T0[(C0>>8)&255], 24) ^ shift(T0[(C1>>16)&255], 16) ^ shift(T0[(C2>>24)&255], 8) ^ KW[r++][3]; - - // the final round's table is a simple function of S so we don't use a whole other four tables for it - - C0 = (S[r0&255]&255) ^ ((S[(r1>>8)&255]&255)<<8) ^ ((S[(r2>>16)&255]&255)<<16) ^ (S[(r3>>24)&255]<<24) ^ KW[r][0]; - C1 = (S[r1&255]&255) ^ ((S[(r2>>8)&255]&255)<<8) ^ ((S[(r3>>16)&255]&255)<<16) ^ (S[(r0>>24)&255]<<24) ^ KW[r][1]; - C2 = (S[r2&255]&255) ^ ((S[(r3>>8)&255]&255)<<8) ^ ((S[(r0>>16)&255]&255)<<16) ^ (S[(r1>>24)&255]<<24) ^ KW[r][2]; - C3 = (S[r3&255]&255) ^ ((S[(r0>>8)&255]&255)<<8) ^ ((S[(r1>>16)&255]&255)<<16) ^ (S[(r2>>24)&255]<<24) ^ KW[r][3]; - - } - - private void decryptBlock(int[][] KW) - { - int r, r0, r1, r2, r3; - - C0 ^= KW[ROUNDS][0]; - C1 ^= KW[ROUNDS][1]; - C2 ^= KW[ROUNDS][2]; - C3 ^= KW[ROUNDS][3]; - - r = ROUNDS-1; - - while (r>1) - { - r0 = Tinv0[C0&255] ^ shift(Tinv0[(C3>>8)&255], 24) ^ shift(Tinv0[(C2>>16)&255], 16) ^ shift(Tinv0[(C1>>24)&255], 8) ^ KW[r][0]; - r1 = Tinv0[C1&255] ^ shift(Tinv0[(C0>>8)&255], 24) ^ shift(Tinv0[(C3>>16)&255], 16) ^ shift(Tinv0[(C2>>24)&255], 8) ^ KW[r][1]; - r2 = Tinv0[C2&255] ^ shift(Tinv0[(C1>>8)&255], 24) ^ shift(Tinv0[(C0>>16)&255], 16) ^ shift(Tinv0[(C3>>24)&255], 8) ^ KW[r][2]; - r3 = Tinv0[C3&255] ^ shift(Tinv0[(C2>>8)&255], 24) ^ shift(Tinv0[(C1>>16)&255], 16) ^ shift(Tinv0[(C0>>24)&255], 8) ^ KW[r--][3]; - C0 = Tinv0[r0&255] ^ shift(Tinv0[(r3>>8)&255], 24) ^ shift(Tinv0[(r2>>16)&255], 16) ^ shift(Tinv0[(r1>>24)&255], 8) ^ KW[r][0]; - C1 = Tinv0[r1&255] ^ shift(Tinv0[(r0>>8)&255], 24) ^ shift(Tinv0[(r3>>16)&255], 16) ^ shift(Tinv0[(r2>>24)&255], 8) ^ KW[r][1]; - C2 = Tinv0[r2&255] ^ shift(Tinv0[(r1>>8)&255], 24) ^ shift(Tinv0[(r0>>16)&255], 16) ^ shift(Tinv0[(r3>>24)&255], 8) ^ KW[r][2]; - C3 = Tinv0[r3&255] ^ shift(Tinv0[(r2>>8)&255], 24) ^ shift(Tinv0[(r1>>16)&255], 16) ^ shift(Tinv0[(r0>>24)&255], 8) ^ KW[r--][3]; - } - - r0 = Tinv0[C0&255] ^ shift(Tinv0[(C3>>8)&255], 24) ^ shift(Tinv0[(C2>>16)&255], 16) ^ shift(Tinv0[(C1>>24)&255], 8) ^ KW[r][0]; - r1 = Tinv0[C1&255] ^ shift(Tinv0[(C0>>8)&255], 24) ^ shift(Tinv0[(C3>>16)&255], 16) ^ shift(Tinv0[(C2>>24)&255], 8) ^ KW[r][1]; - r2 = Tinv0[C2&255] ^ shift(Tinv0[(C1>>8)&255], 24) ^ shift(Tinv0[(C0>>16)&255], 16) ^ shift(Tinv0[(C3>>24)&255], 8) ^ KW[r][2]; - r3 = Tinv0[C3&255] ^ shift(Tinv0[(C2>>8)&255], 24) ^ shift(Tinv0[(C1>>16)&255], 16) ^ shift(Tinv0[(C0>>24)&255], 8) ^ KW[r][3]; - - // the final round's table is a simple function of Si so we don't use a whole other four tables for it - - C0 = (Si[r0&255]&255) ^ ((Si[(r3>>8)&255]&255)<<8) ^ ((Si[(r2>>16)&255]&255)<<16) ^ (Si[(r1>>24)&255]<<24) ^ KW[0][0]; - C1 = (Si[r1&255]&255) ^ ((Si[(r0>>8)&255]&255)<<8) ^ ((Si[(r3>>16)&255]&255)<<16) ^ (Si[(r2>>24)&255]<<24) ^ KW[0][1]; - C2 = (Si[r2&255]&255) ^ ((Si[(r1>>8)&255]&255)<<8) ^ ((Si[(r0>>16)&255]&255)<<16) ^ (Si[(r3>>24)&255]<<24) ^ KW[0][2]; - C3 = (Si[r3&255]&255) ^ ((Si[(r2>>8)&255]&255)<<8) ^ ((Si[(r1>>16)&255]&255)<<16) ^ (Si[(r0>>24)&255]<<24) ^ KW[0][3]; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESFastEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESFastEngine.java deleted file mode 100644 index d2547de..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESFastEngine.java +++ /dev/null @@ -1,874 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * an implementation of the AES (Rijndael), from FIPS-197. - *

    - * For further details see: http://csrc.nist.gov/encryption/aes/. - * - * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at - * http://fp.gladman.plus.com/cryptography_technology/rijndael/ - * - * There are three levels of tradeoff of speed vs memory - * Because java has no preprocessor, they are written as three separate classes from which to choose - * - * The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption - * and 4 for decryption. - * - * The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, - * adding 12 rotate operations per round to compute the values contained in the other tables from - * the contents of the first - * - * The slowest version uses no static tables at all and computes the values in each round - *

    - * This file contains the fast version with 8Kbytes of static tables for round precomputation - * - */ -public class AESFastEngine - implements BlockCipher -{ - // The S box - private static final byte[] S = { - (byte)99, (byte)124, (byte)119, (byte)123, (byte)242, (byte)107, (byte)111, (byte)197, - (byte)48, (byte)1, (byte)103, (byte)43, (byte)254, (byte)215, (byte)171, (byte)118, - (byte)202, (byte)130, (byte)201, (byte)125, (byte)250, (byte)89, (byte)71, (byte)240, - (byte)173, (byte)212, (byte)162, (byte)175, (byte)156, (byte)164, (byte)114, (byte)192, - (byte)183, (byte)253, (byte)147, (byte)38, (byte)54, (byte)63, (byte)247, (byte)204, - (byte)52, (byte)165, (byte)229, (byte)241, (byte)113, (byte)216, (byte)49, (byte)21, - (byte)4, (byte)199, (byte)35, (byte)195, (byte)24, (byte)150, (byte)5, (byte)154, - (byte)7, (byte)18, (byte)128, (byte)226, (byte)235, (byte)39, (byte)178, (byte)117, - (byte)9, (byte)131, (byte)44, (byte)26, (byte)27, (byte)110, (byte)90, (byte)160, - (byte)82, (byte)59, (byte)214, (byte)179, (byte)41, (byte)227, (byte)47, (byte)132, - (byte)83, (byte)209, (byte)0, (byte)237, (byte)32, (byte)252, (byte)177, (byte)91, - (byte)106, (byte)203, (byte)190, (byte)57, (byte)74, (byte)76, (byte)88, (byte)207, - (byte)208, (byte)239, (byte)170, (byte)251, (byte)67, (byte)77, (byte)51, (byte)133, - (byte)69, (byte)249, (byte)2, (byte)127, (byte)80, (byte)60, (byte)159, (byte)168, - (byte)81, (byte)163, (byte)64, (byte)143, (byte)146, (byte)157, (byte)56, (byte)245, - (byte)188, (byte)182, (byte)218, (byte)33, (byte)16, (byte)255, (byte)243, (byte)210, - (byte)205, (byte)12, (byte)19, (byte)236, (byte)95, (byte)151, (byte)68, (byte)23, - (byte)196, (byte)167, (byte)126, (byte)61, (byte)100, (byte)93, (byte)25, (byte)115, - (byte)96, (byte)129, (byte)79, (byte)220, (byte)34, (byte)42, (byte)144, (byte)136, - (byte)70, (byte)238, (byte)184, (byte)20, (byte)222, (byte)94, (byte)11, (byte)219, - (byte)224, (byte)50, (byte)58, (byte)10, (byte)73, (byte)6, (byte)36, (byte)92, - (byte)194, (byte)211, (byte)172, (byte)98, (byte)145, (byte)149, (byte)228, (byte)121, - (byte)231, (byte)200, (byte)55, (byte)109, (byte)141, (byte)213, (byte)78, (byte)169, - (byte)108, (byte)86, (byte)244, (byte)234, (byte)101, (byte)122, (byte)174, (byte)8, - (byte)186, (byte)120, (byte)37, (byte)46, (byte)28, (byte)166, (byte)180, (byte)198, - (byte)232, (byte)221, (byte)116, (byte)31, (byte)75, (byte)189, (byte)139, (byte)138, - (byte)112, (byte)62, (byte)181, (byte)102, (byte)72, (byte)3, (byte)246, (byte)14, - (byte)97, (byte)53, (byte)87, (byte)185, (byte)134, (byte)193, (byte)29, (byte)158, - (byte)225, (byte)248, (byte)152, (byte)17, (byte)105, (byte)217, (byte)142, (byte)148, - (byte)155, (byte)30, (byte)135, (byte)233, (byte)206, (byte)85, (byte)40, (byte)223, - (byte)140, (byte)161, (byte)137, (byte)13, (byte)191, (byte)230, (byte)66, (byte)104, - (byte)65, (byte)153, (byte)45, (byte)15, (byte)176, (byte)84, (byte)187, (byte)22, - }; - - // The inverse S-box - private static final byte[] Si = { - (byte)82, (byte)9, (byte)106, (byte)213, (byte)48, (byte)54, (byte)165, (byte)56, - (byte)191, (byte)64, (byte)163, (byte)158, (byte)129, (byte)243, (byte)215, (byte)251, - (byte)124, (byte)227, (byte)57, (byte)130, (byte)155, (byte)47, (byte)255, (byte)135, - (byte)52, (byte)142, (byte)67, (byte)68, (byte)196, (byte)222, (byte)233, (byte)203, - (byte)84, (byte)123, (byte)148, (byte)50, (byte)166, (byte)194, (byte)35, (byte)61, - (byte)238, (byte)76, (byte)149, (byte)11, (byte)66, (byte)250, (byte)195, (byte)78, - (byte)8, (byte)46, (byte)161, (byte)102, (byte)40, (byte)217, (byte)36, (byte)178, - (byte)118, (byte)91, (byte)162, (byte)73, (byte)109, (byte)139, (byte)209, (byte)37, - (byte)114, (byte)248, (byte)246, (byte)100, (byte)134, (byte)104, (byte)152, (byte)22, - (byte)212, (byte)164, (byte)92, (byte)204, (byte)93, (byte)101, (byte)182, (byte)146, - (byte)108, (byte)112, (byte)72, (byte)80, (byte)253, (byte)237, (byte)185, (byte)218, - (byte)94, (byte)21, (byte)70, (byte)87, (byte)167, (byte)141, (byte)157, (byte)132, - (byte)144, (byte)216, (byte)171, (byte)0, (byte)140, (byte)188, (byte)211, (byte)10, - (byte)247, (byte)228, (byte)88, (byte)5, (byte)184, (byte)179, (byte)69, (byte)6, - (byte)208, (byte)44, (byte)30, (byte)143, (byte)202, (byte)63, (byte)15, (byte)2, - (byte)193, (byte)175, (byte)189, (byte)3, (byte)1, (byte)19, (byte)138, (byte)107, - (byte)58, (byte)145, (byte)17, (byte)65, (byte)79, (byte)103, (byte)220, (byte)234, - (byte)151, (byte)242, (byte)207, (byte)206, (byte)240, (byte)180, (byte)230, (byte)115, - (byte)150, (byte)172, (byte)116, (byte)34, (byte)231, (byte)173, (byte)53, (byte)133, - (byte)226, (byte)249, (byte)55, (byte)232, (byte)28, (byte)117, (byte)223, (byte)110, - (byte)71, (byte)241, (byte)26, (byte)113, (byte)29, (byte)41, (byte)197, (byte)137, - (byte)111, (byte)183, (byte)98, (byte)14, (byte)170, (byte)24, (byte)190, (byte)27, - (byte)252, (byte)86, (byte)62, (byte)75, (byte)198, (byte)210, (byte)121, (byte)32, - (byte)154, (byte)219, (byte)192, (byte)254, (byte)120, (byte)205, (byte)90, (byte)244, - (byte)31, (byte)221, (byte)168, (byte)51, (byte)136, (byte)7, (byte)199, (byte)49, - (byte)177, (byte)18, (byte)16, (byte)89, (byte)39, (byte)128, (byte)236, (byte)95, - (byte)96, (byte)81, (byte)127, (byte)169, (byte)25, (byte)181, (byte)74, (byte)13, - (byte)45, (byte)229, (byte)122, (byte)159, (byte)147, (byte)201, (byte)156, (byte)239, - (byte)160, (byte)224, (byte)59, (byte)77, (byte)174, (byte)42, (byte)245, (byte)176, - (byte)200, (byte)235, (byte)187, (byte)60, (byte)131, (byte)83, (byte)153, (byte)97, - (byte)23, (byte)43, (byte)4, (byte)126, (byte)186, (byte)119, (byte)214, (byte)38, - (byte)225, (byte)105, (byte)20, (byte)99, (byte)85, (byte)33, (byte)12, (byte)125, - }; - - // vector used in calculating key schedule (powers of x in GF(256)) - private static final int[] rcon = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, - 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; - - // precomputation tables of calculations for rounds - private static final int[] T0 = - { - 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, - 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102, - 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, - 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, - 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, 0xecadad41, - 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, - 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d, - 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, - 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, 0x937171e2, - 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795, - 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, - 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, - 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, - 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, - 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, - 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, - 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, - 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, - 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, - 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, - 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a, - 0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, - 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080, - 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, - 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, - 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, - 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, - 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, - 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, - 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, - 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, - 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, - 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, - 0x0a06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd, - 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, - 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, - 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, - 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, - 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a, - 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, - 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, - 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, - 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x05030306, 0x01f6f6f7, - 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, - 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, - 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, - 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, - 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, - 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, - 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929, - 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, - 0x3a16162c}; - - private static final int[] T1 = - { - 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, - 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, 0x30306050, 0x01010203, - 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6, - 0x7676ec9a, 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, - 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, 0xadad41ec, - 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7, - 0x7272e496, 0xc0c09b5b, 0xb7b775c2, 0xfdfde11c, 0x93933dae, - 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, - 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 0x7171e293, - 0xd8d8ab73, 0x31316253, 0x15152a3f, 0x0404080c, 0xc7c79552, - 0x23234665, 0xc3c39d5e, 0x18183028, 0x969637a1, 0x05050a0f, - 0x9a9a2fb5, 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, - 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 0x0909121b, - 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d, 0x6e6edcb2, - 0x5a5ab4ee, 0xa0a05bfb, 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, - 0xb3b37dce, 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, - 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 0x20204060, - 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, 0x6a6ad4be, 0xcbcb8d46, - 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, - 0xcfcf854a, 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, - 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 0x45458acf, - 0xf9f9e910, 0x02020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844, - 0x9f9f25ba, 0xa8a84be3, 0x5151a2f3, 0xa3a35dfe, 0x404080c0, - 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, - 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 0x10102030, - 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 0xcdcd814c, 0x0c0c1814, - 0x13132635, 0xececc32f, 0x5f5fbee1, 0x979735a2, 0x444488cc, - 0x17172e39, 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, - 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, 0x6060c0a0, - 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e, - 0x90903bab, 0x88880b83, 0x46468cca, 0xeeeec729, 0xb8b86bd3, - 0x1414283c, 0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76, - 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, 0x494992db, - 0x06060c0a, 0x2424486c, 0x5c5cb8e4, 0xc2c29f5d, 0xd3d3bd6e, - 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337, - 0x7979f28b, 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, - 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 0x6c6cd8b4, - 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e, - 0xaeae47e9, 0x08081018, 0xbaba6fd5, 0x7878f088, 0x25254a6f, - 0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, - 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 0x4b4b96dd, - 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 0x7070e090, 0x3e3e7c42, - 0xb5b571c4, 0x6666ccaa, 0x484890d8, 0x03030605, 0xf6f6f701, - 0x0e0e1c12, 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, - 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, 0xe1e1d938, - 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970, - 0x8e8e0789, 0x949433a7, 0x9b9b2db6, 0x1e1e3c22, 0x87871592, - 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, - 0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, 0xbfbf65da, - 0xe6e6d731, 0x424284c6, 0x6868d0b8, 0x414182c3, 0x999929b0, - 0x2d2d5a77, 0x0f0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, - 0x16162c3a}; - - private static final int[] T2 = - { - 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2, - 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, 0x30605030, 0x01020301, - 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab, - 0x76ec9a76, 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, - 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, 0xad41ecad, - 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4, - 0x72e49672, 0xc09b5bc0, 0xb775c2b7, 0xfde11cfd, 0x933dae93, - 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, - 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 0x71e29371, - 0xd8ab73d8, 0x31625331, 0x152a3f15, 0x04080c04, 0xc79552c7, - 0x23466523, 0xc39d5ec3, 0x18302818, 0x9637a196, 0x050a0f05, - 0x9a2fb59a, 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, - 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 0x09121b09, - 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b, 0x6edcb26e, - 0x5ab4ee5a, 0xa05bfba0, 0x52a4f652, 0x3b764d3b, 0xd6b761d6, - 0xb37dceb3, 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, - 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, 0x20406020, - 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, 0x6ad4be6a, 0xcb8d46cb, - 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858, - 0xcf854acf, 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, - 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 0x458acf45, - 0xf9e910f9, 0x02040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c, - 0x9f25ba9f, 0xa84be3a8, 0x51a2f351, 0xa35dfea3, 0x4080c040, - 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, - 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 0x10203010, - 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 0xcd814ccd, 0x0c18140c, - 0x13263513, 0xecc32fec, 0x5fbee15f, 0x9735a297, 0x4488cc44, - 0x172e3917, 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, - 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, 0x60c0a060, - 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a, - 0x903bab90, 0x880b8388, 0x468cca46, 0xeec729ee, 0xb86bd3b8, - 0x14283c14, 0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db, - 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, 0x4992db49, - 0x060c0a06, 0x24486c24, 0x5cb8e45c, 0xc29f5dc2, 0xd3bd6ed3, - 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4, - 0x79f28b79, 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, - 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 0x6cd8b46c, - 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a, - 0xae47e9ae, 0x08101808, 0xba6fd5ba, 0x78f08878, 0x254a6f25, - 0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, - 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 0x4b96dd4b, - 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 0x70e09070, 0x3e7c423e, - 0xb571c4b5, 0x66ccaa66, 0x4890d848, 0x03060503, 0xf6f701f6, - 0x0e1c120e, 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, - 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, 0xe1d938e1, - 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9, - 0x8e07898e, 0x9433a794, 0x9b2db69b, 0x1e3c221e, 0x87159287, - 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, - 0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, 0xbf65dabf, - 0xe6d731e6, 0x4284c642, 0x68d0b868, 0x4182c341, 0x9929b099, - 0x2d5a772d, 0x0f1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, - 0x162c3a16}; - - private static final int[] T3 = - { - 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2, - 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, 0x60503030, 0x02030101, - 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab, - 0xec9a7676, 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, - 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, 0x41ecadad, - 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4, - 0xe4967272, 0x9b5bc0c0, 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, - 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, - 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 0xe2937171, - 0xab73d8d8, 0x62533131, 0x2a3f1515, 0x080c0404, 0x9552c7c7, - 0x46652323, 0x9d5ec3c3, 0x30281818, 0x37a19696, 0x0a0f0505, - 0x2fb59a9a, 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, - 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 0x121b0909, - 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b, 0xdcb26e6e, - 0xb4ee5a5a, 0x5bfba0a0, 0xa4f65252, 0x764d3b3b, 0xb761d6d6, - 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, - 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, 0x40602020, - 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, 0xd4be6a6a, 0x8d46cbcb, - 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858, - 0x854acfcf, 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, - 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 0x8acf4545, - 0xe910f9f9, 0x04060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c, - 0x25ba9f9f, 0x4be3a8a8, 0xa2f35151, 0x5dfea3a3, 0x80c04040, - 0x058a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, - 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 0x20301010, - 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 0x814ccdcd, 0x18140c0c, - 0x26351313, 0xc32fecec, 0xbee15f5f, 0x35a29797, 0x88cc4444, - 0x2e391717, 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, - 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, 0xc0a06060, - 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a, - 0x3bab9090, 0x0b838888, 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, - 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, - 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949, - 0x0c0a0606, 0x486c2424, 0xb8e45c5c, 0x9f5dc2c2, 0xbd6ed3d3, - 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4, - 0xf28b7979, 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, - 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 0xd8b46c6c, - 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a, - 0x47e9aeae, 0x10180808, 0x6fd5baba, 0xf0887878, 0x4a6f2525, - 0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, - 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 0x96dd4b4b, - 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, 0xe0907070, 0x7c423e3e, - 0x71c4b5b5, 0xccaa6666, 0x90d84848, 0x06050303, 0xf701f6f6, - 0x1c120e0e, 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, - 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, 0xd938e1e1, - 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9, - 0x07898e8e, 0x33a79494, 0x2db69b9b, 0x3c221e1e, 0x15928787, - 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, - 0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, 0x65dabfbf, - 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141, 0x29b09999, - 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, - 0x2c3a1616}; - - private static final int[] Tinv0 = - { - 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, - 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad, - 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, - 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, - 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03, - 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, - 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899, - 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, - 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1, - 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f, - 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, - 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3, - 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a, - 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506, - 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05, - 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd, - 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, - 0x055dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6, - 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, - 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, - 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd, - 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, - 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793, 0xd296eeb4, - 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, - 0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0x0b0d090e, - 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af, - 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644, - 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, - 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85, - 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc, - 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411, - 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, - 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, - 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0x0d927850, - 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, - 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, - 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd, - 0xf418596e, 0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, - 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea, - 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, - 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1, - 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43, - 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, - 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, - 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a, - 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, - 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418, - 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, - 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, - 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08, - 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, - 0x4257b8d0}; - - private static final int[] Tinv1 = - { - 0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb, - 0x459d1ff1, 0x58faacab, 0x03e34b93, 0xfa302055, 0x6d76adf6, - 0x76cc8891, 0x4c02f525, 0xd7e54ffc, 0xcb2ac5d7, 0x44352680, - 0xa362b58f, 0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1, - 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6, 0x5f8f03e7, - 0x9c921595, 0x7a6dbfeb, 0x595295da, 0x83bed42d, 0x217458d3, - 0x69e04929, 0xc8c98e44, 0x89c2756a, 0x798ef478, 0x3e58996b, - 0x71b927dd, 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4, - 0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245, 0x7764b1e0, - 0xae6bbb84, 0xa081fe1c, 0x2b08f994, 0x68487058, 0xfd458f19, - 0x6cde9487, 0xf87b52b7, 0xd373ab23, 0x024b72e2, 0x8f1fe357, - 0xab55662a, 0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5, - 0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c, 0x1ccf8a2b, - 0xb479a792, 0xf207f3f0, 0xe2694ea1, 0xf4da65cd, 0xbe0506d5, - 0x6234d11f, 0xfea6c48a, 0x532e349d, 0x55f3a2a0, 0xe18a0532, - 0xebf6a475, 0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51, - 0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46, 0x8d5491b5, - 0x5dc47105, 0xd406046f, 0x155060ff, 0xfb981924, 0xe9bdd697, - 0x434089cc, 0x9ed96777, 0x42e8b0bd, 0x8b890788, 0x5b19e738, - 0xeec879db, 0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000, - 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e, 0xff0efdfb, - 0x38850f56, 0xd5ae3d1e, 0x392d3627, 0xd90f0a64, 0xa65c6821, - 0x545b9bd1, 0x2e36243a, 0x670a0cb1, 0xe757930f, 0x96eeb4d2, - 0x919b1b9e, 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16, - 0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d, 0x0d090e0b, - 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8, 0x19f15785, 0x0775af4c, - 0xdd99eebb, 0x607fa3fd, 0x2601f79f, 0xf5725cbc, 0x3b6644c5, - 0x7efb5b34, 0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863, - 0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420, 0x244a857d, - 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 0x2f9e1d4b, 0x30b2dcf3, - 0x52860dec, 0xe3c177d0, 0x16b32b6c, 0xb970a999, 0x489411fa, - 0x64e94722, 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef, - 0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836, 0x81f5a6cf, - 0xde7aa528, 0x8eb7da26, 0xbfad3fa4, 0x9d3a2ce4, 0x9278500d, - 0xcc5f6a9b, 0x467e5462, 0x138df6c2, 0xb8d890e8, 0xf7392e5e, - 0xafc382f5, 0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3, - 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b, 0x7826cd09, - 0x18596ef4, 0xb79aec01, 0x9a4f83a8, 0x6e95e665, 0xe6ffaa7e, - 0xcfbc2108, 0xe815efe6, 0x9be7bad9, 0x366f4ace, 0x099fead4, - 0x7cb029d6, 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0, - 0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315, 0x9804f14a, - 0xdaec41f7, 0x50cd7f0e, 0xf691172f, 0xd64d768d, 0xb0ef434d, - 0x4daacc54, 0x0496e4df, 0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, - 0x5165467f, 0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e, - 0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13, 0x61d79a8c, - 0x0ca1377a, 0x14f8598e, 0x3c13eb89, 0x27a9ceee, 0xc961b735, - 0xe51ce1ed, 0xb1477a3c, 0xdfd29c59, 0x73f2553f, 0xce141879, - 0x37c773bf, 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886, - 0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 0xc31d1672, - 0x25e2bc0c, 0x493c288b, 0x950dff41, 0x01a83971, 0xb30c08de, - 0xe4b4d89c, 0xc1566490, 0x84cb7b61, 0xb632d570, 0x5c6c4874, - 0x57b8d042}; - - private static final int[] Tinv2 = - { - 0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 0xab3bcb6b, - 0x9d1ff145, 0xfaacab58, 0xe34b9303, 0x302055fa, 0x76adf66d, - 0xcc889176, 0x02f5254c, 0xe54ffcd7, 0x2ac5d7cb, 0x35268044, - 0x62b58fa3, 0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0, - 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9, 0x8f03e75f, - 0x9215959c, 0x6dbfeb7a, 0x5295da59, 0xbed42d83, 0x7458d321, - 0xe0492969, 0xc98e44c8, 0xc2756a89, 0x8ef47879, 0x58996b3e, - 0xb927dd71, 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a, - 0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f, 0x64b1e077, - 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b, 0x48705868, 0x458f19fd, - 0xde94876c, 0x7b52b7f8, 0x73ab23d3, 0x4b72e202, 0x1fe3578f, - 0x55662aab, 0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508, - 0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82, 0xcf8a2b1c, - 0x79a792b4, 0x07f3f0f2, 0x694ea1e2, 0xda65cdf4, 0x0506d5be, - 0x34d11f62, 0xa6c48afe, 0x2e349d53, 0xf3a2a055, 0x8a0532e1, - 0xf6a475eb, 0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110, - 0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 0x5491b58d, - 0xc471055d, 0x06046fd4, 0x5060ff15, 0x981924fb, 0xbdd697e9, - 0x4089cc43, 0xd967779e, 0xe8b0bd42, 0x8907888b, 0x19e7385b, - 0xc879dbee, 0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000, - 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72, 0x0efdfbff, - 0x850f5638, 0xae3d1ed5, 0x2d362739, 0x0f0a64d9, 0x5c6821a6, - 0x5b9bd154, 0x36243a2e, 0x0a0cb167, 0x57930fe7, 0xeeb4d296, - 0x9b1b9e91, 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a, - 0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17, 0x090e0b0d, - 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9, 0xf1578519, 0x75af4c07, - 0x99eebbdd, 0x7fa3fd60, 0x01f79f26, 0x725cbcf5, 0x6644c53b, - 0xfb5b347e, 0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1, - 0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011, 0x4a857d24, - 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 0x9e1d4b2f, 0xb2dcf330, - 0x860dec52, 0xc177d0e3, 0xb32b6c16, 0x70a999b9, 0x9411fa48, - 0xe9472264, 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90, - 0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 0xf5a6cf81, - 0x7aa528de, 0xb7da268e, 0xad3fa4bf, 0x3a2ce49d, 0x78500d92, - 0x5f6a9bcc, 0x7e546246, 0x8df6c213, 0xd890e8b8, 0x392e5ef7, - 0xc382f5af, 0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312, - 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb, 0x26cd0978, - 0x596ef418, 0x9aec01b7, 0x4f83a89a, 0x95e6656e, 0xffaa7ee6, - 0xbc2108cf, 0x15efe6e8, 0xe7bad99b, 0x6f4ace36, 0x9fead409, - 0xb029d67c, 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066, - 0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8, 0x04f14a98, - 0xec41f7da, 0xcd7f0e50, 0x91172ff6, 0x4d768dd6, 0xef434db0, - 0xaacc544d, 0x96e4df04, 0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, - 0x65467f51, 0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41, - 0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347, 0xd79a8c61, - 0xa1377a0c, 0xf8598e14, 0x13eb893c, 0xa9ceee27, 0x61b735c9, - 0x1ce1ede5, 0x477a3cb1, 0xd29c59df, 0xf2553f73, 0x141879ce, - 0xc773bf37, 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db, - 0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 0x1d1672c3, - 0xe2bc0c25, 0x3c288b49, 0x0dff4195, 0xa8397101, 0x0c08deb3, - 0xb4d89ce4, 0x566490c1, 0xcb7b6184, 0x32d570b6, 0x6c48745c, - 0xb8d04257}; - - private static final int[] Tinv3 = - { - 0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab, - 0x1ff1459d, 0xacab58fa, 0x4b9303e3, 0x2055fa30, 0xadf66d76, - 0x889176cc, 0xf5254c02, 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, - 0xb58fa362, 0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe, - 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3, 0x03e75f8f, - 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174, - 0x492969e0, 0x8e44c8c9, 0x756a89c2, 0xf478798e, 0x996b3e58, - 0x27dd71b9, 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace, - 0x63184adf, 0xe582311a, 0x97603351, 0x62457f53, 0xb1e07764, - 0xbb84ae6b, 0xfe1ca081, 0xf9942b08, 0x70586848, 0x8f19fd45, - 0x94876cde, 0x52b7f87b, 0xab23d373, 0x72e2024b, 0xe3578f1f, - 0x662aab55, 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837, - 0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216, 0x8a2b1ccf, - 0xa792b479, 0xf3f0f207, 0x4ea1e269, 0x65cdf4da, 0x06d5be05, - 0xd11f6234, 0xc48afea6, 0x349d532e, 0xa2a055f3, 0x0532e18a, - 0xa475ebf6, 0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e, - 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 0x91b58d54, - 0x71055dc4, 0x046fd406, 0x60ff1550, 0x1924fb98, 0xd697e9bd, - 0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x07888b89, 0xe7385b19, - 0x79dbeec8, 0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000, - 0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a, 0xfdfbff0e, - 0x0f563885, 0x3d1ed5ae, 0x3627392d, 0x0a64d90f, 0x6821a65c, - 0x9bd1545b, 0x243a2e36, 0x0cb1670a, 0x930fe757, 0xb4d296ee, - 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12, - 0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 0x0e0b0d09, - 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e, 0x578519f1, 0xaf4c0775, - 0xeebbdd99, 0xa3fd607f, 0xf79f2601, 0x5cbcf572, 0x44c53b66, - 0x5b347efb, 0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4, - 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6, 0x857d244a, - 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2, - 0x0dec5286, 0x77d0e3c1, 0x2b6c16b3, 0xa999b970, 0x11fa4894, - 0x472264e9, 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033, - 0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 0xa6cf81f5, - 0xa528de7a, 0xda268eb7, 0x3fa4bfad, 0x2ce49d3a, 0x500d9278, - 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, - 0x82f5afc3, 0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225, - 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 0xcd097826, - 0x6ef41859, 0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff, - 0x2108cfbc, 0xefe6e815, 0xbad99be7, 0x4ace366f, 0xead4099f, - 0x29d67cb0, 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2, - 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7, 0xf14a9804, - 0x41f7daec, 0x7f0e50cd, 0x172ff691, 0x768dd64d, 0x434db0ef, - 0xcc544daa, 0xe4df0496, 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, - 0x467f5165, 0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b, - 0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6, 0x9a8c61d7, - 0x377a0ca1, 0x598e14f8, 0xeb893c13, 0xceee27a9, 0xb735c961, - 0xe1ede51c, 0x7a3cb147, 0x9c59dfd2, 0x553f73f2, 0x1879ce14, - 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44, - 0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d, - 0xbc0c25e2, 0x288b493c, 0xff41950d, 0x397101a8, 0x08deb30c, - 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c, - 0xd04257b8}; - - private static int shift(int r, int shift) - { - return (r >>> shift) | (r << -shift); - } - - /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ - - private static final int m1 = 0x80808080; - private static final int m2 = 0x7f7f7f7f; - private static final int m3 = 0x0000001b; - - private static int FFmulX(int x) - { - return (((x & m2) << 1) ^ (((x & m1) >>> 7) * m3)); - } - - /* - The following defines provide alternative definitions of FFmulX that might - give improved performance if a fast 32-bit multiply is not available. - - private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } - private static final int m4 = 0x1b1b1b1b; - private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } - - */ - - private static int inv_mcol(int x) - { - int f2 = FFmulX(x); - int f4 = FFmulX(f2); - int f8 = FFmulX(f4); - int f9 = x ^ f8; - - return f2 ^ f4 ^ f8 ^ shift(f2 ^ f9, 8) ^ shift(f4 ^ f9, 16) ^ shift(f9, 24); - } - - - private static int subWord(int x) - { - return (S[x&255]&255 | ((S[(x>>8)&255]&255)<<8) | ((S[(x>>16)&255]&255)<<16) | S[(x>>24)&255]<<24); - } - - /** - * Calculate the necessary round keys - * The number of calculations depends on key size and block size - * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits - * This code is written assuming those are the only possible values - */ - private int[][] generateWorkingKey( - byte[] key, - boolean forEncryption) - { - int KC = key.length / 4; // key length in words - int t; - - if (((KC != 4) && (KC != 6) && (KC != 8)) || ((KC * 4) != key.length)) - { - throw new IllegalArgumentException("Key length not 128/192/256 bits."); - } - - ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes - int[][] W = new int[ROUNDS+1][4]; // 4 words in a block - - // - // copy the key into the round key array - // - - t = 0; - int i = 0; - while (i < key.length) - { - W[t >> 2][t & 3] = (key[i]&0xff) | ((key[i+1]&0xff) << 8) | ((key[i+2]&0xff) << 16) | (key[i+3] << 24); - i+=4; - t++; - } - - // - // while not enough round key material calculated - // calculate new values - // - int k = (ROUNDS + 1) << 2; - for (i = KC; (i < k); i++) - { - int temp = W[(i - 1) >> 2][(i - 1) & 3]; - if ((i % KC) == 0) - { - temp = subWord(shift(temp, 8)) ^ rcon[(i / KC) - 1]; - } - else if ((KC > 6) && ((i % KC) == 4)) - { - temp = subWord(temp); - } - - W[i >> 2][i & 3] = W[(i - KC) >> 2][(i - KC) & 3] ^ temp; - } - - if (!forEncryption) - { - for (int j = 1; j < ROUNDS; j++) - { - for (i = 0; i < 4; i++) - { - W[j][i] = inv_mcol(W[j][i]); - } - } - } - - return W; - } - - private int ROUNDS; - private int[][] WorkingKey = null; - private int C0, C1, C2, C3; - private boolean forEncryption; - - private static final int BLOCK_SIZE = 16; - - /** - * default constructor - 128 bit block size. - */ - public AESFastEngine() - { - } - - /** - * initialise an AES cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - WorkingKey = generateWorkingKey(((KeyParameter)params).getKey(), forEncryption); - this.forEncryption = forEncryption; - return; - } - - throw new IllegalArgumentException("invalid parameter passed to AES init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "AES"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (WorkingKey == null) - { - throw new IllegalStateException("AES engine not initialised"); - } - - if ((inOff + (32 / 2)) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + (32 / 2)) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (forEncryption) - { - unpackBlock(in, inOff); - encryptBlock(WorkingKey); - packBlock(out, outOff); - } - else - { - unpackBlock(in, inOff); - decryptBlock(WorkingKey); - packBlock(out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private void unpackBlock( - byte[] bytes, - int off) - { - int index = off; - - C0 = (bytes[index++] & 0xff); - C0 |= (bytes[index++] & 0xff) << 8; - C0 |= (bytes[index++] & 0xff) << 16; - C0 |= bytes[index++] << 24; - - C1 = (bytes[index++] & 0xff); - C1 |= (bytes[index++] & 0xff) << 8; - C1 |= (bytes[index++] & 0xff) << 16; - C1 |= bytes[index++] << 24; - - C2 = (bytes[index++] & 0xff); - C2 |= (bytes[index++] & 0xff) << 8; - C2 |= (bytes[index++] & 0xff) << 16; - C2 |= bytes[index++] << 24; - - C3 = (bytes[index++] & 0xff); - C3 |= (bytes[index++] & 0xff) << 8; - C3 |= (bytes[index++] & 0xff) << 16; - C3 |= bytes[index++] << 24; - } - - private void packBlock( - byte[] bytes, - int off) - { - int index = off; - - bytes[index++] = (byte)C0; - bytes[index++] = (byte)(C0 >> 8); - bytes[index++] = (byte)(C0 >> 16); - bytes[index++] = (byte)(C0 >> 24); - - bytes[index++] = (byte)C1; - bytes[index++] = (byte)(C1 >> 8); - bytes[index++] = (byte)(C1 >> 16); - bytes[index++] = (byte)(C1 >> 24); - - bytes[index++] = (byte)C2; - bytes[index++] = (byte)(C2 >> 8); - bytes[index++] = (byte)(C2 >> 16); - bytes[index++] = (byte)(C2 >> 24); - - bytes[index++] = (byte)C3; - bytes[index++] = (byte)(C3 >> 8); - bytes[index++] = (byte)(C3 >> 16); - bytes[index++] = (byte)(C3 >> 24); - } - - private void encryptBlock(int[][] KW) - { - int r, r0, r1, r2, r3; - - C0 ^= KW[0][0]; - C1 ^= KW[0][1]; - C2 ^= KW[0][2]; - C3 ^= KW[0][3]; - - r = 1; - while (r < ROUNDS - 1) - { - r0 = T0[C0&255] ^ T1[(C1>>8)&255] ^ T2[(C2>>16)&255] ^ T3[(C3>>24)&255] ^ KW[r][0]; - r1 = T0[C1&255] ^ T1[(C2>>8)&255] ^ T2[(C3>>16)&255] ^ T3[(C0>>24)&255] ^ KW[r][1]; - r2 = T0[C2&255] ^ T1[(C3>>8)&255] ^ T2[(C0>>16)&255] ^ T3[(C1>>24)&255] ^ KW[r][2]; - r3 = T0[C3&255] ^ T1[(C0>>8)&255] ^ T2[(C1>>16)&255] ^ T3[(C2>>24)&255] ^ KW[r++][3]; - C0 = T0[r0&255] ^ T1[(r1>>8)&255] ^ T2[(r2>>16)&255] ^ T3[(r3>>24)&255] ^ KW[r][0]; - C1 = T0[r1&255] ^ T1[(r2>>8)&255] ^ T2[(r3>>16)&255] ^ T3[(r0>>24)&255] ^ KW[r][1]; - C2 = T0[r2&255] ^ T1[(r3>>8)&255] ^ T2[(r0>>16)&255] ^ T3[(r1>>24)&255] ^ KW[r][2]; - C3 = T0[r3&255] ^ T1[(r0>>8)&255] ^ T2[(r1>>16)&255] ^ T3[(r2>>24)&255] ^ KW[r++][3]; - } - - r0 = T0[C0&255] ^ T1[(C1>>8)&255] ^ T2[(C2>>16)&255] ^ T3[(C3>>24)&255] ^ KW[r][0]; - r1 = T0[C1&255] ^ T1[(C2>>8)&255] ^ T2[(C3>>16)&255] ^ T3[(C0>>24)&255] ^ KW[r][1]; - r2 = T0[C2&255] ^ T1[(C3>>8)&255] ^ T2[(C0>>16)&255] ^ T3[(C1>>24)&255] ^ KW[r][2]; - r3 = T0[C3&255] ^ T1[(C0>>8)&255] ^ T2[(C1>>16)&255] ^ T3[(C2>>24)&255] ^ KW[r++][3]; - - // the final round's table is a simple function of S so we don't use a whole other four tables for it - - C0 = (S[r0&255]&255) ^ ((S[(r1>>8)&255]&255)<<8) ^ ((S[(r2>>16)&255]&255)<<16) ^ (S[(r3>>24)&255]<<24) ^ KW[r][0]; - C1 = (S[r1&255]&255) ^ ((S[(r2>>8)&255]&255)<<8) ^ ((S[(r3>>16)&255]&255)<<16) ^ (S[(r0>>24)&255]<<24) ^ KW[r][1]; - C2 = (S[r2&255]&255) ^ ((S[(r3>>8)&255]&255)<<8) ^ ((S[(r0>>16)&255]&255)<<16) ^ (S[(r1>>24)&255]<<24) ^ KW[r][2]; - C3 = (S[r3&255]&255) ^ ((S[(r0>>8)&255]&255)<<8) ^ ((S[(r1>>16)&255]&255)<<16) ^ (S[(r2>>24)&255]<<24) ^ KW[r][3]; - - } - - private void decryptBlock(int[][] KW) - { - int r0, r1, r2, r3; - - C0 ^= KW[ROUNDS][0]; - C1 ^= KW[ROUNDS][1]; - C2 ^= KW[ROUNDS][2]; - C3 ^= KW[ROUNDS][3]; - - int r = ROUNDS-1; - - while (r>1) - { - r0 = Tinv0[C0&255] ^ Tinv1[(C3>>8)&255] ^ Tinv2[(C2>>16)&255] ^ Tinv3[(C1>>24)&255] ^ KW[r][0]; - r1 = Tinv0[C1&255] ^ Tinv1[(C0>>8)&255] ^ Tinv2[(C3>>16)&255] ^ Tinv3[(C2>>24)&255] ^ KW[r][1]; - r2 = Tinv0[C2&255] ^ Tinv1[(C1>>8)&255] ^ Tinv2[(C0>>16)&255] ^ Tinv3[(C3>>24)&255] ^ KW[r][2]; - r3 = Tinv0[C3&255] ^ Tinv1[(C2>>8)&255] ^ Tinv2[(C1>>16)&255] ^ Tinv3[(C0>>24)&255] ^ KW[r--][3]; - C0 = Tinv0[r0&255] ^ Tinv1[(r3>>8)&255] ^ Tinv2[(r2>>16)&255] ^ Tinv3[(r1>>24)&255] ^ KW[r][0]; - C1 = Tinv0[r1&255] ^ Tinv1[(r0>>8)&255] ^ Tinv2[(r3>>16)&255] ^ Tinv3[(r2>>24)&255] ^ KW[r][1]; - C2 = Tinv0[r2&255] ^ Tinv1[(r1>>8)&255] ^ Tinv2[(r0>>16)&255] ^ Tinv3[(r3>>24)&255] ^ KW[r][2]; - C3 = Tinv0[r3&255] ^ Tinv1[(r2>>8)&255] ^ Tinv2[(r1>>16)&255] ^ Tinv3[(r0>>24)&255] ^ KW[r--][3]; - } - - r0 = Tinv0[C0&255] ^ Tinv1[(C3>>8)&255] ^ Tinv2[(C2>>16)&255] ^ Tinv3[(C1>>24)&255] ^ KW[r][0]; - r1 = Tinv0[C1&255] ^ Tinv1[(C0>>8)&255] ^ Tinv2[(C3>>16)&255] ^ Tinv3[(C2>>24)&255] ^ KW[r][1]; - r2 = Tinv0[C2&255] ^ Tinv1[(C1>>8)&255] ^ Tinv2[(C0>>16)&255] ^ Tinv3[(C3>>24)&255] ^ KW[r][2]; - r3 = Tinv0[C3&255] ^ Tinv1[(C2>>8)&255] ^ Tinv2[(C1>>16)&255] ^ Tinv3[(C0>>24)&255] ^ KW[r][3]; - - // the final round's table is a simple function of Si so we don't use a whole other four tables for it - - C0 = (Si[r0&255]&255) ^ ((Si[(r3>>8)&255]&255)<<8) ^ ((Si[(r2>>16)&255]&255)<<16) ^ (Si[(r1>>24)&255]<<24) ^ KW[0][0]; - C1 = (Si[r1&255]&255) ^ ((Si[(r0>>8)&255]&255)<<8) ^ ((Si[(r3>>16)&255]&255)<<16) ^ (Si[(r2>>24)&255]<<24) ^ KW[0][1]; - C2 = (Si[r2&255]&255) ^ ((Si[(r1>>8)&255]&255)<<8) ^ ((Si[(r0>>16)&255]&255)<<16) ^ (Si[(r3>>24)&255]<<24) ^ KW[0][2]; - C3 = (Si[r3&255]&255) ^ ((Si[(r2>>8)&255]&255)<<8) ^ ((Si[(r1>>16)&255]&255)<<16) ^ (Si[(r0>>24)&255]<<24) ^ KW[0][3]; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESLightEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESLightEngine.java deleted file mode 100644 index 9b43a81..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESLightEngine.java +++ /dev/null @@ -1,438 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * an implementation of the AES (Rijndael), from FIPS-197. - *

    - * For further details see: http://csrc.nist.gov/encryption/aes/. - * - * This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at - * http://fp.gladman.plus.com/cryptography_technology/rijndael/ - * - * There are three levels of tradeoff of speed vs memory - * Because java has no preprocessor, they are written as three separate classes from which to choose - * - * The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption - * and 4 for decryption. - * - * The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, - * adding 12 rotate operations per round to compute the values contained in the other tables from - * the contents of the first - * - * The slowest version uses no static tables at all and computes the values - * in each round. - *

    - * This file contains the slowest performance version with no static tables - * for round precomputation, but it has the smallest foot print. - * - */ -public class AESLightEngine - implements BlockCipher -{ - // The S box - private static final byte[] S = { - (byte)99, (byte)124, (byte)119, (byte)123, (byte)242, (byte)107, (byte)111, (byte)197, - (byte)48, (byte)1, (byte)103, (byte)43, (byte)254, (byte)215, (byte)171, (byte)118, - (byte)202, (byte)130, (byte)201, (byte)125, (byte)250, (byte)89, (byte)71, (byte)240, - (byte)173, (byte)212, (byte)162, (byte)175, (byte)156, (byte)164, (byte)114, (byte)192, - (byte)183, (byte)253, (byte)147, (byte)38, (byte)54, (byte)63, (byte)247, (byte)204, - (byte)52, (byte)165, (byte)229, (byte)241, (byte)113, (byte)216, (byte)49, (byte)21, - (byte)4, (byte)199, (byte)35, (byte)195, (byte)24, (byte)150, (byte)5, (byte)154, - (byte)7, (byte)18, (byte)128, (byte)226, (byte)235, (byte)39, (byte)178, (byte)117, - (byte)9, (byte)131, (byte)44, (byte)26, (byte)27, (byte)110, (byte)90, (byte)160, - (byte)82, (byte)59, (byte)214, (byte)179, (byte)41, (byte)227, (byte)47, (byte)132, - (byte)83, (byte)209, (byte)0, (byte)237, (byte)32, (byte)252, (byte)177, (byte)91, - (byte)106, (byte)203, (byte)190, (byte)57, (byte)74, (byte)76, (byte)88, (byte)207, - (byte)208, (byte)239, (byte)170, (byte)251, (byte)67, (byte)77, (byte)51, (byte)133, - (byte)69, (byte)249, (byte)2, (byte)127, (byte)80, (byte)60, (byte)159, (byte)168, - (byte)81, (byte)163, (byte)64, (byte)143, (byte)146, (byte)157, (byte)56, (byte)245, - (byte)188, (byte)182, (byte)218, (byte)33, (byte)16, (byte)255, (byte)243, (byte)210, - (byte)205, (byte)12, (byte)19, (byte)236, (byte)95, (byte)151, (byte)68, (byte)23, - (byte)196, (byte)167, (byte)126, (byte)61, (byte)100, (byte)93, (byte)25, (byte)115, - (byte)96, (byte)129, (byte)79, (byte)220, (byte)34, (byte)42, (byte)144, (byte)136, - (byte)70, (byte)238, (byte)184, (byte)20, (byte)222, (byte)94, (byte)11, (byte)219, - (byte)224, (byte)50, (byte)58, (byte)10, (byte)73, (byte)6, (byte)36, (byte)92, - (byte)194, (byte)211, (byte)172, (byte)98, (byte)145, (byte)149, (byte)228, (byte)121, - (byte)231, (byte)200, (byte)55, (byte)109, (byte)141, (byte)213, (byte)78, (byte)169, - (byte)108, (byte)86, (byte)244, (byte)234, (byte)101, (byte)122, (byte)174, (byte)8, - (byte)186, (byte)120, (byte)37, (byte)46, (byte)28, (byte)166, (byte)180, (byte)198, - (byte)232, (byte)221, (byte)116, (byte)31, (byte)75, (byte)189, (byte)139, (byte)138, - (byte)112, (byte)62, (byte)181, (byte)102, (byte)72, (byte)3, (byte)246, (byte)14, - (byte)97, (byte)53, (byte)87, (byte)185, (byte)134, (byte)193, (byte)29, (byte)158, - (byte)225, (byte)248, (byte)152, (byte)17, (byte)105, (byte)217, (byte)142, (byte)148, - (byte)155, (byte)30, (byte)135, (byte)233, (byte)206, (byte)85, (byte)40, (byte)223, - (byte)140, (byte)161, (byte)137, (byte)13, (byte)191, (byte)230, (byte)66, (byte)104, - (byte)65, (byte)153, (byte)45, (byte)15, (byte)176, (byte)84, (byte)187, (byte)22, - }; - - // The inverse S-box - private static final byte[] Si = { - (byte)82, (byte)9, (byte)106, (byte)213, (byte)48, (byte)54, (byte)165, (byte)56, - (byte)191, (byte)64, (byte)163, (byte)158, (byte)129, (byte)243, (byte)215, (byte)251, - (byte)124, (byte)227, (byte)57, (byte)130, (byte)155, (byte)47, (byte)255, (byte)135, - (byte)52, (byte)142, (byte)67, (byte)68, (byte)196, (byte)222, (byte)233, (byte)203, - (byte)84, (byte)123, (byte)148, (byte)50, (byte)166, (byte)194, (byte)35, (byte)61, - (byte)238, (byte)76, (byte)149, (byte)11, (byte)66, (byte)250, (byte)195, (byte)78, - (byte)8, (byte)46, (byte)161, (byte)102, (byte)40, (byte)217, (byte)36, (byte)178, - (byte)118, (byte)91, (byte)162, (byte)73, (byte)109, (byte)139, (byte)209, (byte)37, - (byte)114, (byte)248, (byte)246, (byte)100, (byte)134, (byte)104, (byte)152, (byte)22, - (byte)212, (byte)164, (byte)92, (byte)204, (byte)93, (byte)101, (byte)182, (byte)146, - (byte)108, (byte)112, (byte)72, (byte)80, (byte)253, (byte)237, (byte)185, (byte)218, - (byte)94, (byte)21, (byte)70, (byte)87, (byte)167, (byte)141, (byte)157, (byte)132, - (byte)144, (byte)216, (byte)171, (byte)0, (byte)140, (byte)188, (byte)211, (byte)10, - (byte)247, (byte)228, (byte)88, (byte)5, (byte)184, (byte)179, (byte)69, (byte)6, - (byte)208, (byte)44, (byte)30, (byte)143, (byte)202, (byte)63, (byte)15, (byte)2, - (byte)193, (byte)175, (byte)189, (byte)3, (byte)1, (byte)19, (byte)138, (byte)107, - (byte)58, (byte)145, (byte)17, (byte)65, (byte)79, (byte)103, (byte)220, (byte)234, - (byte)151, (byte)242, (byte)207, (byte)206, (byte)240, (byte)180, (byte)230, (byte)115, - (byte)150, (byte)172, (byte)116, (byte)34, (byte)231, (byte)173, (byte)53, (byte)133, - (byte)226, (byte)249, (byte)55, (byte)232, (byte)28, (byte)117, (byte)223, (byte)110, - (byte)71, (byte)241, (byte)26, (byte)113, (byte)29, (byte)41, (byte)197, (byte)137, - (byte)111, (byte)183, (byte)98, (byte)14, (byte)170, (byte)24, (byte)190, (byte)27, - (byte)252, (byte)86, (byte)62, (byte)75, (byte)198, (byte)210, (byte)121, (byte)32, - (byte)154, (byte)219, (byte)192, (byte)254, (byte)120, (byte)205, (byte)90, (byte)244, - (byte)31, (byte)221, (byte)168, (byte)51, (byte)136, (byte)7, (byte)199, (byte)49, - (byte)177, (byte)18, (byte)16, (byte)89, (byte)39, (byte)128, (byte)236, (byte)95, - (byte)96, (byte)81, (byte)127, (byte)169, (byte)25, (byte)181, (byte)74, (byte)13, - (byte)45, (byte)229, (byte)122, (byte)159, (byte)147, (byte)201, (byte)156, (byte)239, - (byte)160, (byte)224, (byte)59, (byte)77, (byte)174, (byte)42, (byte)245, (byte)176, - (byte)200, (byte)235, (byte)187, (byte)60, (byte)131, (byte)83, (byte)153, (byte)97, - (byte)23, (byte)43, (byte)4, (byte)126, (byte)186, (byte)119, (byte)214, (byte)38, - (byte)225, (byte)105, (byte)20, (byte)99, (byte)85, (byte)33, (byte)12, (byte)125, - }; - - // vector used in calculating key schedule (powers of x in GF(256)) - private static final int[] rcon = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, - 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; - - private static int shift(int r, int shift) - { - return (r >>> shift) | (r << -shift); - } - - /* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ - - private static final int m1 = 0x80808080; - private static final int m2 = 0x7f7f7f7f; - private static final int m3 = 0x0000001b; - - private static int FFmulX(int x) - { - return (((x & m2) << 1) ^ (((x & m1) >>> 7) * m3)); - } - - /* - The following defines provide alternative definitions of FFmulX that might - give improved performance if a fast 32-bit multiply is not available. - - private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); } - private static final int m4 = 0x1b1b1b1b; - private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); } - - */ - - private static int mcol(int x) - { - int f2 = FFmulX(x); - return f2 ^ shift(x ^ f2, 8) ^ shift(x, 16) ^ shift(x, 24); - } - - private static int inv_mcol(int x) - { - int f2 = FFmulX(x); - int f4 = FFmulX(f2); - int f8 = FFmulX(f4); - int f9 = x ^ f8; - - return f2 ^ f4 ^ f8 ^ shift(f2 ^ f9, 8) ^ shift(f4 ^ f9, 16) ^ shift(f9, 24); - } - - - private static int subWord(int x) - { - return (S[x&255]&255 | ((S[(x>>8)&255]&255)<<8) | ((S[(x>>16)&255]&255)<<16) | S[(x>>24)&255]<<24); - } - - /** - * Calculate the necessary round keys - * The number of calculations depends on key size and block size - * AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits - * This code is written assuming those are the only possible values - */ - private int[][] generateWorkingKey( - byte[] key, - boolean forEncryption) - { - int KC = key.length / 4; // key length in words - int t; - - if (((KC != 4) && (KC != 6) && (KC != 8)) || ((KC * 4) != key.length)) - { - throw new IllegalArgumentException("Key length not 128/192/256 bits."); - } - - ROUNDS = KC + 6; // This is not always true for the generalized Rijndael that allows larger block sizes - int[][] W = new int[ROUNDS+1][4]; // 4 words in a block - - // - // copy the key into the round key array - // - - t = 0; - int i = 0; - while (i < key.length) - { - W[t >> 2][t & 3] = (key[i]&0xff) | ((key[i+1]&0xff) << 8) | ((key[i+2]&0xff) << 16) | (key[i+3] << 24); - i+=4; - t++; - } - - // - // while not enough round key material calculated - // calculate new values - // - int k = (ROUNDS + 1) << 2; - for (i = KC; (i < k); i++) - { - int temp = W[(i-1)>>2][(i-1)&3]; - if ((i % KC) == 0) - { - temp = subWord(shift(temp, 8)) ^ rcon[(i / KC)-1]; - } - else if ((KC > 6) && ((i % KC) == 4)) - { - temp = subWord(temp); - } - - W[i>>2][i&3] = W[(i - KC)>>2][(i-KC)&3] ^ temp; - } - - if (!forEncryption) - { - for (int j = 1; j < ROUNDS; j++) - { - for (i = 0; i < 4; i++) - { - W[j][i] = inv_mcol(W[j][i]); - } - } - } - - return W; - } - - private int ROUNDS; - private int[][] WorkingKey = null; - private int C0, C1, C2, C3; - private boolean forEncryption; - - private static final int BLOCK_SIZE = 16; - - /** - * default constructor - 128 bit block size. - */ - public AESLightEngine() - { - } - - /** - * initialise an AES cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - WorkingKey = generateWorkingKey(((KeyParameter)params).getKey(), forEncryption); - this.forEncryption = forEncryption; - return; - } - - throw new IllegalArgumentException("invalid parameter passed to AES init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "AES"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (WorkingKey == null) - { - throw new IllegalStateException("AES engine not initialised"); - } - - if ((inOff + (32 / 2)) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + (32 / 2)) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (forEncryption) - { - unpackBlock(in, inOff); - encryptBlock(WorkingKey); - packBlock(out, outOff); - } - else - { - unpackBlock(in, inOff); - decryptBlock(WorkingKey); - packBlock(out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private void unpackBlock( - byte[] bytes, - int off) - { - int index = off; - - C0 = (bytes[index++] & 0xff); - C0 |= (bytes[index++] & 0xff) << 8; - C0 |= (bytes[index++] & 0xff) << 16; - C0 |= bytes[index++] << 24; - - C1 = (bytes[index++] & 0xff); - C1 |= (bytes[index++] & 0xff) << 8; - C1 |= (bytes[index++] & 0xff) << 16; - C1 |= bytes[index++] << 24; - - C2 = (bytes[index++] & 0xff); - C2 |= (bytes[index++] & 0xff) << 8; - C2 |= (bytes[index++] & 0xff) << 16; - C2 |= bytes[index++] << 24; - - C3 = (bytes[index++] & 0xff); - C3 |= (bytes[index++] & 0xff) << 8; - C3 |= (bytes[index++] & 0xff) << 16; - C3 |= bytes[index++] << 24; - } - - private void packBlock( - byte[] bytes, - int off) - { - int index = off; - - bytes[index++] = (byte)C0; - bytes[index++] = (byte)(C0 >> 8); - bytes[index++] = (byte)(C0 >> 16); - bytes[index++] = (byte)(C0 >> 24); - - bytes[index++] = (byte)C1; - bytes[index++] = (byte)(C1 >> 8); - bytes[index++] = (byte)(C1 >> 16); - bytes[index++] = (byte)(C1 >> 24); - - bytes[index++] = (byte)C2; - bytes[index++] = (byte)(C2 >> 8); - bytes[index++] = (byte)(C2 >> 16); - bytes[index++] = (byte)(C2 >> 24); - - bytes[index++] = (byte)C3; - bytes[index++] = (byte)(C3 >> 8); - bytes[index++] = (byte)(C3 >> 16); - bytes[index++] = (byte)(C3 >> 24); - } - - private void encryptBlock(int[][] KW) - { - int r, r0, r1, r2, r3; - - C0 ^= KW[0][0]; - C1 ^= KW[0][1]; - C2 ^= KW[0][2]; - C3 ^= KW[0][3]; - - for (r = 1; r < ROUNDS - 1;) - { - r0 = mcol((S[C0&255]&255) ^ ((S[(C1>>8)&255]&255)<<8) ^ ((S[(C2>>16)&255]&255)<<16) ^ (S[(C3>>24)&255]<<24)) ^ KW[r][0]; - r1 = mcol((S[C1&255]&255) ^ ((S[(C2>>8)&255]&255)<<8) ^ ((S[(C3>>16)&255]&255)<<16) ^ (S[(C0>>24)&255]<<24)) ^ KW[r][1]; - r2 = mcol((S[C2&255]&255) ^ ((S[(C3>>8)&255]&255)<<8) ^ ((S[(C0>>16)&255]&255)<<16) ^ (S[(C1>>24)&255]<<24)) ^ KW[r][2]; - r3 = mcol((S[C3&255]&255) ^ ((S[(C0>>8)&255]&255)<<8) ^ ((S[(C1>>16)&255]&255)<<16) ^ (S[(C2>>24)&255]<<24)) ^ KW[r++][3]; - C0 = mcol((S[r0&255]&255) ^ ((S[(r1>>8)&255]&255)<<8) ^ ((S[(r2>>16)&255]&255)<<16) ^ (S[(r3>>24)&255]<<24)) ^ KW[r][0]; - C1 = mcol((S[r1&255]&255) ^ ((S[(r2>>8)&255]&255)<<8) ^ ((S[(r3>>16)&255]&255)<<16) ^ (S[(r0>>24)&255]<<24)) ^ KW[r][1]; - C2 = mcol((S[r2&255]&255) ^ ((S[(r3>>8)&255]&255)<<8) ^ ((S[(r0>>16)&255]&255)<<16) ^ (S[(r1>>24)&255]<<24)) ^ KW[r][2]; - C3 = mcol((S[r3&255]&255) ^ ((S[(r0>>8)&255]&255)<<8) ^ ((S[(r1>>16)&255]&255)<<16) ^ (S[(r2>>24)&255]<<24)) ^ KW[r++][3]; - } - - r0 = mcol((S[C0&255]&255) ^ ((S[(C1>>8)&255]&255)<<8) ^ ((S[(C2>>16)&255]&255)<<16) ^ (S[(C3>>24)&255]<<24)) ^ KW[r][0]; - r1 = mcol((S[C1&255]&255) ^ ((S[(C2>>8)&255]&255)<<8) ^ ((S[(C3>>16)&255]&255)<<16) ^ (S[(C0>>24)&255]<<24)) ^ KW[r][1]; - r2 = mcol((S[C2&255]&255) ^ ((S[(C3>>8)&255]&255)<<8) ^ ((S[(C0>>16)&255]&255)<<16) ^ (S[(C1>>24)&255]<<24)) ^ KW[r][2]; - r3 = mcol((S[C3&255]&255) ^ ((S[(C0>>8)&255]&255)<<8) ^ ((S[(C1>>16)&255]&255)<<16) ^ (S[(C2>>24)&255]<<24)) ^ KW[r++][3]; - - // the final round is a simple function of S - - C0 = (S[r0&255]&255) ^ ((S[(r1>>8)&255]&255)<<8) ^ ((S[(r2>>16)&255]&255)<<16) ^ (S[(r3>>24)&255]<<24) ^ KW[r][0]; - C1 = (S[r1&255]&255) ^ ((S[(r2>>8)&255]&255)<<8) ^ ((S[(r3>>16)&255]&255)<<16) ^ (S[(r0>>24)&255]<<24) ^ KW[r][1]; - C2 = (S[r2&255]&255) ^ ((S[(r3>>8)&255]&255)<<8) ^ ((S[(r0>>16)&255]&255)<<16) ^ (S[(r1>>24)&255]<<24) ^ KW[r][2]; - C3 = (S[r3&255]&255) ^ ((S[(r0>>8)&255]&255)<<8) ^ ((S[(r1>>16)&255]&255)<<16) ^ (S[(r2>>24)&255]<<24) ^ KW[r][3]; - - } - - private void decryptBlock(int[][] KW) - { - int r, r0, r1, r2, r3; - - C0 ^= KW[ROUNDS][0]; - C1 ^= KW[ROUNDS][1]; - C2 ^= KW[ROUNDS][2]; - C3 ^= KW[ROUNDS][3]; - - for (r = ROUNDS-1; r>1;) - { - r0 = inv_mcol((Si[C0&255]&255) ^ ((Si[(C3>>8)&255]&255)<<8) ^ ((Si[(C2>>16)&255]&255)<<16) ^ (Si[(C1>>24)&255]<<24)) ^ KW[r][0]; - r1 = inv_mcol((Si[C1&255]&255) ^ ((Si[(C0>>8)&255]&255)<<8) ^ ((Si[(C3>>16)&255]&255)<<16) ^ (Si[(C2>>24)&255]<<24)) ^ KW[r][1]; - r2 = inv_mcol((Si[C2&255]&255) ^ ((Si[(C1>>8)&255]&255)<<8) ^ ((Si[(C0>>16)&255]&255)<<16) ^ (Si[(C3>>24)&255]<<24)) ^ KW[r][2]; - r3 = inv_mcol((Si[C3&255]&255) ^ ((Si[(C2>>8)&255]&255)<<8) ^ ((Si[(C1>>16)&255]&255)<<16) ^ (Si[(C0>>24)&255]<<24)) ^ KW[r--][3]; - C0 = inv_mcol((Si[r0&255]&255) ^ ((Si[(r3>>8)&255]&255)<<8) ^ ((Si[(r2>>16)&255]&255)<<16) ^ (Si[(r1>>24)&255]<<24)) ^ KW[r][0]; - C1 = inv_mcol((Si[r1&255]&255) ^ ((Si[(r0>>8)&255]&255)<<8) ^ ((Si[(r3>>16)&255]&255)<<16) ^ (Si[(r2>>24)&255]<<24)) ^ KW[r][1]; - C2 = inv_mcol((Si[r2&255]&255) ^ ((Si[(r1>>8)&255]&255)<<8) ^ ((Si[(r0>>16)&255]&255)<<16) ^ (Si[(r3>>24)&255]<<24)) ^ KW[r][2]; - C3 = inv_mcol((Si[r3&255]&255) ^ ((Si[(r2>>8)&255]&255)<<8) ^ ((Si[(r1>>16)&255]&255)<<16) ^ (Si[(r0>>24)&255]<<24)) ^ KW[r--][3]; - } - - r0 = inv_mcol((Si[C0&255]&255) ^ ((Si[(C3>>8)&255]&255)<<8) ^ ((Si[(C2>>16)&255]&255)<<16) ^ (Si[(C1>>24)&255]<<24)) ^ KW[r][0]; - r1 = inv_mcol((Si[C1&255]&255) ^ ((Si[(C0>>8)&255]&255)<<8) ^ ((Si[(C3>>16)&255]&255)<<16) ^ (Si[(C2>>24)&255]<<24)) ^ KW[r][1]; - r2 = inv_mcol((Si[C2&255]&255) ^ ((Si[(C1>>8)&255]&255)<<8) ^ ((Si[(C0>>16)&255]&255)<<16) ^ (Si[(C3>>24)&255]<<24)) ^ KW[r][2]; - r3 = inv_mcol((Si[C3&255]&255) ^ ((Si[(C2>>8)&255]&255)<<8) ^ ((Si[(C1>>16)&255]&255)<<16) ^ (Si[(C0>>24)&255]<<24)) ^ KW[r][3]; - - // the final round's table is a simple function of Si - - C0 = (Si[r0&255]&255) ^ ((Si[(r3>>8)&255]&255)<<8) ^ ((Si[(r2>>16)&255]&255)<<16) ^ (Si[(r1>>24)&255]<<24) ^ KW[0][0]; - C1 = (Si[r1&255]&255) ^ ((Si[(r0>>8)&255]&255)<<8) ^ ((Si[(r3>>16)&255]&255)<<16) ^ (Si[(r2>>24)&255]<<24) ^ KW[0][1]; - C2 = (Si[r2&255]&255) ^ ((Si[(r1>>8)&255]&255)<<8) ^ ((Si[(r0>>16)&255]&255)<<16) ^ (Si[(r3>>24)&255]<<24) ^ KW[0][2]; - C3 = (Si[r3&255]&255) ^ ((Si[(r2>>8)&255]&255)<<8) ^ ((Si[(r1>>16)&255]&255)<<16) ^ (Si[(r0>>24)&255]<<24) ^ KW[0][3]; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESWrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESWrapEngine.java deleted file mode 100644 index f4cd8ee..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/AESWrapEngine.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.crypto.engines; - -/** - * an implementation of the AES Key Wrapper from the NIST Key Wrap - * Specification. - *

    - * For further details see: http://csrc.nist.gov/encryption/kms/key-wrap.pdf. - */ -public class AESWrapEngine - extends RFC3394WrapEngine -{ - public AESWrapEngine() - { - super(new AESEngine()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/BlowfishEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/BlowfishEngine.java deleted file mode 100644 index 4018a38..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/BlowfishEngine.java +++ /dev/null @@ -1,576 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * A class that provides Blowfish key encryption operations, - * such as encoding data and generating keys. - * All the algorithms herein are from Applied Cryptography - * and implement a simplified cryptography interface. - */ -public final class BlowfishEngine -implements BlockCipher -{ - private final static int[] - KP = { - 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, - 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, - 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, - 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, - 0x9216D5D9, 0x8979FB1B - }, - - KS0 = { - 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, - 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, - 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, - 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, - 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, - 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, - 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, - 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, - 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, - 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, - 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, - 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, - 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, - 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, - 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, - 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, - 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, - 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, - 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, - 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, - 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, - 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, - 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, - 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, - 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, - 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, - 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, - 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, - 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, - 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, - 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, - 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, - 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, - 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, - 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, - 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, - 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, - 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, - 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, - 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, - 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, - 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, - 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, - 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, - 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, - 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, - 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, - 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, - 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, - 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, - 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, - 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, - 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, - 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, - 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, - 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, - 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, - 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, - 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, - 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, - 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, - 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, - 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, - 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A - }, - - KS1 = { - 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, - 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, - 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, - 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, - 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, - 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, - 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, - 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, - 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, - 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, - 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, - 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, - 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, - 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, - 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, - 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, - 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, - 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, - 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, - 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, - 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, - 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, - 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, - 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, - 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, - 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, - 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, - 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, - 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, - 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, - 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, - 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, - 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, - 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, - 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, - 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, - 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, - 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, - 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, - 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, - 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, - 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, - 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, - 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, - 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, - 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, - 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, - 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, - 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, - 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, - 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, - 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, - 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, - 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, - 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, - 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, - 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, - 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, - 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, - 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, - 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, - 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, - 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, - 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 - }, - - KS2 = { - 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, - 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, - 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, - 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, - 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, - 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, - 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, - 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, - 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, - 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, - 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, - 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, - 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, - 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, - 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, - 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, - 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, - 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, - 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, - 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, - 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, - 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, - 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, - 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, - 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, - 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, - 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, - 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, - 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, - 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, - 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, - 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, - 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, - 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, - 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, - 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, - 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, - 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, - 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, - 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, - 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, - 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, - 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, - 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, - 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, - 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, - 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, - 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, - 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, - 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, - 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, - 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, - 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, - 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, - 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, - 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, - 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, - 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, - 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, - 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, - 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, - 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, - 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, - 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 - }, - - KS3 = { - 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, - 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, - 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, - 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, - 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, - 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, - 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, - 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, - 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, - 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, - 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, - 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, - 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, - 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, - 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, - 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, - 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, - 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, - 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, - 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, - 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, - 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, - 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, - 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, - 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, - 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, - 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, - 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, - 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, - 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, - 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, - 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, - 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, - 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, - 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, - 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, - 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, - 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, - 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, - 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, - 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, - 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, - 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, - 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, - 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, - 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, - 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, - 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, - 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, - 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, - 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, - 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, - 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, - 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, - 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, - 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, - 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, - 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, - 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, - 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, - 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, - 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, - 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, - 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 - }; - - //==================================== - // Useful constants - //==================================== - - private static final int ROUNDS = 16; - private static final int BLOCK_SIZE = 8; // bytes = 64 bits - private static final int SBOX_SK = 256; - private static final int P_SZ = ROUNDS+2; - - private final int[] S0, S1, S2, S3; // the s-boxes - private final int[] P; // the p-array - - private boolean encrypting = false; - - private byte[] workingKey = null; - - public BlowfishEngine() - { - S0 = new int[SBOX_SK]; - S1 = new int[SBOX_SK]; - S2 = new int[SBOX_SK]; - S3 = new int[SBOX_SK]; - P = new int[P_SZ]; - } - - /** - * initialise a Blowfish cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - this.encrypting = encrypting; - this.workingKey = ((KeyParameter)params).getKey(); - setKey(this.workingKey); - - return; - } - - throw new IllegalArgumentException("invalid parameter passed to Blowfish init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "Blowfish"; - } - - public final int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("Blowfish not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (encrypting) - { - encryptBlock(in, inOff, out, outOff); - } - else - { - decryptBlock(in, inOff, out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - //================================== - // Private Implementation - //================================== - - private int F(int x) - { - return (((S0[(x >>> 24)] + S1[(x >>> 16) & 0xff]) - ^ S2[(x >>> 8) & 0xff]) + S3[x & 0xff]); - } - - /** - * apply the encryption cycle to each value pair in the table. - */ - private void processTable( - int xl, - int xr, - int[] table) - { - int size = table.length; - - for (int s = 0; s < size; s += 2) - { - xl ^= P[0]; - - for (int i = 1; i < ROUNDS; i += 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i + 1]; - } - - xr ^= P[ROUNDS + 1]; - - table[s] = xr; - table[s + 1] = xl; - - xr = xl; // end of cycle swap - xl = table[s]; - } - } - - private void setKey(byte[] key) - { - /* - * - comments are from _Applied Crypto_, Schneier, p338 - * please be careful comparing the two, AC numbers the - * arrays from 1, the enclosed code from 0. - * - * (1) - * Initialise the S-boxes and the P-array, with a fixed string - * This string contains the hexadecimal digits of pi (3.141...) - */ - System.arraycopy(KS0, 0, S0, 0, SBOX_SK); - System.arraycopy(KS1, 0, S1, 0, SBOX_SK); - System.arraycopy(KS2, 0, S2, 0, SBOX_SK); - System.arraycopy(KS3, 0, S3, 0, SBOX_SK); - - System.arraycopy(KP, 0, P, 0, P_SZ); - - /* - * (2) - * Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with the - * second 32-bits of the key, and so on for all bits of the key - * (up to P[17]). Repeatedly cycle through the key bits until the - * entire P-array has been XOR-ed with the key bits - */ - int keyLength = key.length; - int keyIndex = 0; - - for (int i=0; i < P_SZ; i++) - { - // get the 32 bits of the key, in 4 * 8 bit chunks - int data = 0x0000000; - for (int j=0; j < 4; j++) - { - // create a 32 bit block - data = (data << 8) | (key[keyIndex++] & 0xff); - - // wrap when we get to the end of the key - if (keyIndex >= keyLength) - { - keyIndex = 0; - } - } - // XOR the newly created 32 bit chunk onto the P-array - P[i] ^= data; - } - - /* - * (3) - * Encrypt the all-zero string with the Blowfish algorithm, using - * the subkeys described in (1) and (2) - * - * (4) - * Replace P1 and P2 with the output of step (3) - * - * (5) - * Encrypt the output of step(3) using the Blowfish algorithm, - * with the modified subkeys. - * - * (6) - * Replace P3 and P4 with the output of step (5) - * - * (7) - * Continue the process, replacing all elements of the P-array - * and then all four S-boxes in order, with the output of the - * continuously changing Blowfish algorithm - */ - - processTable(0, 0, P); - processTable(P[P_SZ - 2], P[P_SZ - 1], S0); - processTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1); - processTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2); - processTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3); - } - - /** - * Encrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * The input will be an exact multiple of our blocksize. - */ - private void encryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - int xl = BytesTo32bits(src, srcIndex); - int xr = BytesTo32bits(src, srcIndex+4); - - xl ^= P[0]; - - for (int i = 1; i < ROUNDS; i += 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i + 1]; - } - - xr ^= P[ROUNDS + 1]; - - Bits32ToBytes(xr, dst, dstIndex); - Bits32ToBytes(xl, dst, dstIndex + 4); - } - - /** - * Decrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * The input will be an exact multiple of our blocksize. - */ - private void decryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - int xl = BytesTo32bits(src, srcIndex); - int xr = BytesTo32bits(src, srcIndex + 4); - - xl ^= P[ROUNDS + 1]; - - for (int i = ROUNDS; i > 0 ; i -= 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i - 1]; - } - - xr ^= P[0]; - - Bits32ToBytes(xr, dst, dstIndex); - Bits32ToBytes(xl, dst, dstIndex+4); - } - - private int BytesTo32bits(byte[] b, int i) - { - return ((b[i] & 0xff) << 24) | - ((b[i+1] & 0xff) << 16) | - ((b[i+2] & 0xff) << 8) | - ((b[i+3] & 0xff)); - } - - private void Bits32ToBytes(int in, byte[] b, int offset) - { - b[offset + 3] = (byte)in; - b[offset + 2] = (byte)(in >> 8); - b[offset + 1] = (byte)(in >> 16); - b[offset] = (byte)(in >> 24); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST5Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST5Engine.java deleted file mode 100644 index d37a712..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST5Engine.java +++ /dev/null @@ -1,830 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * A class that provides CAST key encryption operations, - * such as encoding data and generating keys. - * - * All the algorithms herein are from the Internet RFC's - * - * RFC2144 - CAST5 (64bit block, 40-128bit key) - * RFC2612 - CAST6 (128bit block, 128-256bit key) - * - * and implement a simplified cryptography interface. - */ -public class CAST5Engine - implements BlockCipher -{ - protected final static int M32 = 0xffffffff; - - protected final static int[] - S1 = { -0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, -0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, -0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, -0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, -0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, -0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, -0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, -0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, -0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, -0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, -0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, -0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, -0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, -0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, -0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, -0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, -0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, -0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, -0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, -0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, -0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, -0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, -0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, -0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, -0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, -0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, -0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, -0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, -0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, -0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, -0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, -0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf - }, - S2 = { -0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, -0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, -0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, -0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, -0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, -0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, -0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, -0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, -0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, -0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, -0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, -0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, -0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, -0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, -0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, -0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, -0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, -0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, -0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, -0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, -0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, -0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, -0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, -0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, -0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, -0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, -0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, -0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, -0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, -0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, -0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, -0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1 - }, - S3 = { -0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, -0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, -0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, -0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, -0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, -0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, -0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, -0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, -0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, -0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, -0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, -0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, -0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, -0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, -0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, -0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, -0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, -0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, -0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, -0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, -0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, -0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, -0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, -0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, -0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, -0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, -0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, -0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, -0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, -0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, -0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, -0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783 - }, - S4 = { -0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, -0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, -0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, -0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, -0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, -0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, -0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, -0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, -0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, -0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, -0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, -0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, -0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, -0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, -0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, -0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, -0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, -0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, -0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, -0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, -0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, -0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, -0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, -0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, -0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, -0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, -0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, -0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, -0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, -0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, -0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, -0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 - }, - S5 = { -0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, -0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, -0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, -0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, -0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, -0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, -0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, -0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, -0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, -0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, -0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, -0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, -0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, -0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, -0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, -0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, -0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, -0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, -0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, -0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, -0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, -0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, -0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, -0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, -0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, -0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, -0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, -0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, -0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, -0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, -0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, -0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4 - }, - S6 = { -0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, -0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, -0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, -0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, -0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, -0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, -0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, -0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, -0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, -0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, -0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, -0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, -0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, -0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, -0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, -0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, -0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, -0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, -0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, -0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, -0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, -0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, -0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, -0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, -0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, -0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, -0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, -0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, -0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, -0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, -0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, -0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f - }, - S7 = { -0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, -0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, -0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, -0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, -0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, -0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, -0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, -0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, -0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, -0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, -0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, -0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, -0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, -0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, -0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, -0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, -0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, -0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, -0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, -0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, -0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, -0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, -0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, -0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, -0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, -0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, -0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, -0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, -0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, -0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, -0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, -0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3 - }, - S8 = { -0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, -0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, -0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, -0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, -0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, -0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, -0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, -0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, -0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, -0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, -0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, -0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, -0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, -0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, -0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, -0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, -0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, -0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, -0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, -0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, -0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, -0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, -0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, -0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, -0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, -0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, -0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, -0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, -0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, -0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, -0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, -0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e - }; - - //==================================== - // Useful constants - //==================================== - - protected static final int MAX_ROUNDS = 16; - protected static final int RED_ROUNDS = 12; - - protected static final int BLOCK_SIZE = 8; // bytes = 64 bits - - protected int _Kr[] = new int[17]; // the rotating round key - protected int _Km[] = new int[17]; // the masking round key - - private boolean _encrypting = false; - - private byte[] _workingKey = null; - private int _rounds = MAX_ROUNDS; - - public CAST5Engine() - { - } - - /** - * initialise a CAST cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - _encrypting = encrypting; - _workingKey = ((KeyParameter)params).getKey(); - - setKey(_workingKey); - - return; - } - - throw new IllegalArgumentException("Invalid parameter passed to "+getAlgorithmName()+" init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "CAST5"; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (_workingKey == null) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - int blockSize = getBlockSize(); - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("Input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("Output buffer too short"); - } - - if (_encrypting) - { - return encryptBlock(in, inOff, out, outOff); - } - else - { - return decryptBlock(in, inOff, out, outOff); - } - } - - public void reset() - { - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - //================================== - // Private Implementation - //================================== - - /* - * Creates the subkeys using the same nomenclature - * as described in RFC2144. - * - * See section 2.4 - */ - protected void setKey(byte[] key) - { - /* - * Determine the key size here, if required - * - * if keysize <= 80bits, use 12 rounds instead of 16 - * if keysize < 128bits, pad with 0 - * - * Typical key sizes => 40, 64, 80, 128 - */ - - if (key.length < 11) - { - _rounds = RED_ROUNDS; - } - - int z[] = new int[16]; - int x[] = new int[16]; - - int z03, z47, z8B, zCF; - int x03, x47, x8B, xCF; - - /* copy the key into x */ - for (int i=0; i< key.length; i++) - { - x[i] = key[i] & 0xff; - } - - /* - * This will look different because the selection of - * bytes from the input key I've already chosen the - * correct int. - */ - x03 = IntsTo32bits(x, 0x0); - x47 = IntsTo32bits(x, 0x4); - x8B = IntsTo32bits(x, 0x8); - xCF = IntsTo32bits(x, 0xC); - - z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]]; - - Bits32ToInts(z03, z, 0x0); - z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]]; - Bits32ToInts(z47, z, 0x4); - z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]]; - Bits32ToInts(z8B, z, 0x8); - zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]]; - Bits32ToInts(zCF, z, 0xC); - _Km[ 1]= S5[z[0x8]] ^ S6[z[0x9]] ^ S7[z[0x7]] ^ S8[z[0x6]] ^ S5[z[0x2]]; - _Km[ 2]= S5[z[0xA]] ^ S6[z[0xB]] ^ S7[z[0x5]] ^ S8[z[0x4]] ^ S6[z[0x6]]; - _Km[ 3]= S5[z[0xC]] ^ S6[z[0xD]] ^ S7[z[0x3]] ^ S8[z[0x2]] ^ S7[z[0x9]]; - _Km[ 4]= S5[z[0xE]] ^ S6[z[0xF]] ^ S7[z[0x1]] ^ S8[z[0x0]] ^ S8[z[0xC]]; - - z03 = IntsTo32bits(z, 0x0); - z47 = IntsTo32bits(z, 0x4); - z8B = IntsTo32bits(z, 0x8); - zCF = IntsTo32bits(z, 0xC); - x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]]; - Bits32ToInts(x03, x, 0x0); - x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]]; - Bits32ToInts(x47, x, 0x4); - x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]]; - Bits32ToInts(x8B, x, 0x8); - xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]]; - Bits32ToInts(xCF, x, 0xC); - _Km[ 5]= S5[x[0x3]] ^ S6[x[0x2]] ^ S7[x[0xC]] ^ S8[x[0xD]] ^ S5[x[0x8]]; - _Km[ 6]= S5[x[0x1]] ^ S6[x[0x0]] ^ S7[x[0xE]] ^ S8[x[0xF]] ^ S6[x[0xD]]; - _Km[ 7]= S5[x[0x7]] ^ S6[x[0x6]] ^ S7[x[0x8]] ^ S8[x[0x9]] ^ S7[x[0x3]]; - _Km[ 8]= S5[x[0x5]] ^ S6[x[0x4]] ^ S7[x[0xA]] ^ S8[x[0xB]] ^ S8[x[0x7]]; - - x03 = IntsTo32bits(x, 0x0); - x47 = IntsTo32bits(x, 0x4); - x8B = IntsTo32bits(x, 0x8); - xCF = IntsTo32bits(x, 0xC); - z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]]; - Bits32ToInts(z03, z, 0x0); - z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]]; - Bits32ToInts(z47, z, 0x4); - z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]]; - Bits32ToInts(z8B, z, 0x8); - zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]]; - Bits32ToInts(zCF, z, 0xC); - _Km[ 9]= S5[z[0x3]] ^ S6[z[0x2]] ^ S7[z[0xC]] ^ S8[z[0xD]] ^ S5[z[0x9]]; - _Km[10]= S5[z[0x1]] ^ S6[z[0x0]] ^ S7[z[0xE]] ^ S8[z[0xF]] ^ S6[z[0xc]]; - _Km[11]= S5[z[0x7]] ^ S6[z[0x6]] ^ S7[z[0x8]] ^ S8[z[0x9]] ^ S7[z[0x2]]; - _Km[12]= S5[z[0x5]] ^ S6[z[0x4]] ^ S7[z[0xA]] ^ S8[z[0xB]] ^ S8[z[0x6]]; - - z03 = IntsTo32bits(z, 0x0); - z47 = IntsTo32bits(z, 0x4); - z8B = IntsTo32bits(z, 0x8); - zCF = IntsTo32bits(z, 0xC); - x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]]; - Bits32ToInts(x03, x, 0x0); - x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]]; - Bits32ToInts(x47, x, 0x4); - x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]]; - Bits32ToInts(x8B, x, 0x8); - xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]]; - Bits32ToInts(xCF, x, 0xC); - _Km[13]= S5[x[0x8]] ^ S6[x[0x9]] ^ S7[x[0x7]] ^ S8[x[0x6]] ^ S5[x[0x3]]; - _Km[14]= S5[x[0xA]] ^ S6[x[0xB]] ^ S7[x[0x5]] ^ S8[x[0x4]] ^ S6[x[0x7]]; - _Km[15]= S5[x[0xC]] ^ S6[x[0xD]] ^ S7[x[0x3]] ^ S8[x[0x2]] ^ S7[x[0x8]]; - _Km[16]= S5[x[0xE]] ^ S6[x[0xF]] ^ S7[x[0x1]] ^ S8[x[0x0]] ^ S8[x[0xD]]; - - x03 = IntsTo32bits(x, 0x0); - x47 = IntsTo32bits(x, 0x4); - x8B = IntsTo32bits(x, 0x8); - xCF = IntsTo32bits(x, 0xC); - z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]]; - Bits32ToInts(z03, z, 0x0); - z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]]; - Bits32ToInts(z47, z, 0x4); - z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]]; - Bits32ToInts(z8B, z, 0x8); - zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]]; - Bits32ToInts(zCF, z, 0xC); - _Kr[ 1]=(S5[z[0x8]]^S6[z[0x9]]^S7[z[0x7]]^S8[z[0x6]] ^ S5[z[0x2]])&0x1f; - _Kr[ 2]=(S5[z[0xA]]^S6[z[0xB]]^S7[z[0x5]]^S8[z[0x4]] ^ S6[z[0x6]])&0x1f; - _Kr[ 3]=(S5[z[0xC]]^S6[z[0xD]]^S7[z[0x3]]^S8[z[0x2]] ^ S7[z[0x9]])&0x1f; - _Kr[ 4]=(S5[z[0xE]]^S6[z[0xF]]^S7[z[0x1]]^S8[z[0x0]] ^ S8[z[0xC]])&0x1f; - - z03 = IntsTo32bits(z, 0x0); - z47 = IntsTo32bits(z, 0x4); - z8B = IntsTo32bits(z, 0x8); - zCF = IntsTo32bits(z, 0xC); - x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]]; - Bits32ToInts(x03, x, 0x0); - x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]]; - Bits32ToInts(x47, x, 0x4); - x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]]; - Bits32ToInts(x8B, x, 0x8); - xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]]; - Bits32ToInts(xCF, x, 0xC); - _Kr[ 5]=(S5[x[0x3]]^S6[x[0x2]]^S7[x[0xC]]^S8[x[0xD]]^S5[x[0x8]])&0x1f; - _Kr[ 6]=(S5[x[0x1]]^S6[x[0x0]]^S7[x[0xE]]^S8[x[0xF]]^S6[x[0xD]])&0x1f; - _Kr[ 7]=(S5[x[0x7]]^S6[x[0x6]]^S7[x[0x8]]^S8[x[0x9]]^S7[x[0x3]])&0x1f; - _Kr[ 8]=(S5[x[0x5]]^S6[x[0x4]]^S7[x[0xA]]^S8[x[0xB]]^S8[x[0x7]])&0x1f; - - x03 = IntsTo32bits(x, 0x0); - x47 = IntsTo32bits(x, 0x4); - x8B = IntsTo32bits(x, 0x8); - xCF = IntsTo32bits(x, 0xC); - z03 = x03 ^S5[x[0xD]] ^S6[x[0xF]] ^S7[x[0xC]] ^S8[x[0xE]] ^S7[x[0x8]]; - Bits32ToInts(z03, z, 0x0); - z47 = x8B ^S5[z[0x0]] ^S6[z[0x2]] ^S7[z[0x1]] ^S8[z[0x3]] ^S8[x[0xA]]; - Bits32ToInts(z47, z, 0x4); - z8B = xCF ^S5[z[0x7]] ^S6[z[0x6]] ^S7[z[0x5]] ^S8[z[0x4]] ^S5[x[0x9]]; - Bits32ToInts(z8B, z, 0x8); - zCF = x47 ^S5[z[0xA]] ^S6[z[0x9]] ^S7[z[0xB]] ^S8[z[0x8]] ^S6[x[0xB]]; - Bits32ToInts(zCF, z, 0xC); - _Kr[ 9]=(S5[z[0x3]]^S6[z[0x2]]^S7[z[0xC]]^S8[z[0xD]]^S5[z[0x9]])&0x1f; - _Kr[10]=(S5[z[0x1]]^S6[z[0x0]]^S7[z[0xE]]^S8[z[0xF]]^S6[z[0xc]])&0x1f; - _Kr[11]=(S5[z[0x7]]^S6[z[0x6]]^S7[z[0x8]]^S8[z[0x9]]^S7[z[0x2]])&0x1f; - _Kr[12]=(S5[z[0x5]]^S6[z[0x4]]^S7[z[0xA]]^S8[z[0xB]]^S8[z[0x6]])&0x1f; - - z03 = IntsTo32bits(z, 0x0); - z47 = IntsTo32bits(z, 0x4); - z8B = IntsTo32bits(z, 0x8); - zCF = IntsTo32bits(z, 0xC); - x03 = z8B ^S5[z[0x5]] ^S6[z[0x7]] ^S7[z[0x4]] ^S8[z[0x6]] ^S7[z[0x0]]; - Bits32ToInts(x03, x, 0x0); - x47 = z03 ^S5[x[0x0]] ^S6[x[0x2]] ^S7[x[0x1]] ^S8[x[0x3]] ^S8[z[0x2]]; - Bits32ToInts(x47, x, 0x4); - x8B = z47 ^S5[x[0x7]] ^S6[x[0x6]] ^S7[x[0x5]] ^S8[x[0x4]] ^S5[z[0x1]]; - Bits32ToInts(x8B, x, 0x8); - xCF = zCF ^S5[x[0xA]] ^S6[x[0x9]] ^S7[x[0xB]] ^S8[x[0x8]] ^S6[z[0x3]]; - Bits32ToInts(xCF, x, 0xC); - _Kr[13]=(S5[x[0x8]]^S6[x[0x9]]^S7[x[0x7]]^S8[x[0x6]]^S5[x[0x3]])&0x1f; - _Kr[14]=(S5[x[0xA]]^S6[x[0xB]]^S7[x[0x5]]^S8[x[0x4]]^S6[x[0x7]])&0x1f; - _Kr[15]=(S5[x[0xC]]^S6[x[0xD]]^S7[x[0x3]]^S8[x[0x2]]^S7[x[0x8]])&0x1f; - _Kr[16]=(S5[x[0xE]]^S6[x[0xF]]^S7[x[0x1]]^S8[x[0x0]]^S8[x[0xD]])&0x1f; - } - - /** - * Encrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * - * @param src The plaintext buffer - * @param srcIndex An offset into src - * @param dst The ciphertext buffer - * @param dstIndex An offset into dst - */ - protected int encryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - - int result[] = new int[2]; - - // process the input block - // batch the units up into a 32 bit chunk and go for it - // the array is in bytes, the increment is 8x8 bits = 64 - - int L0 = BytesTo32bits(src, srcIndex); - int R0 = BytesTo32bits(src, srcIndex + 4); - - CAST_Encipher(L0, R0, result); - - // now stuff them into the destination block - Bits32ToBytes(result[0], dst, dstIndex); - Bits32ToBytes(result[1], dst, dstIndex + 4); - - return BLOCK_SIZE; - } - - /** - * Decrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * - * @param src The plaintext buffer - * @param srcIndex An offset into src - * @param dst The ciphertext buffer - * @param dstIndex An offset into dst - */ - protected int decryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - int result[] = new int[2]; - - // process the input block - // batch the units up into a 32 bit chunk and go for it - // the array is in bytes, the increment is 8x8 bits = 64 - int L16 = BytesTo32bits(src, srcIndex); - int R16 = BytesTo32bits(src, srcIndex+4); - - CAST_Decipher(L16, R16, result); - - // now stuff them into the destination block - Bits32ToBytes(result[0], dst, dstIndex); - Bits32ToBytes(result[1], dst, dstIndex+4); - - return BLOCK_SIZE; - } - - /** - * The first of the three processing functions for the - * encryption and decryption. - * - * @param D the input to be processed - * @param Kmi the mask to be used from Km[n] - * @param Kri the rotation value to be used - * - */ - protected final int F1(int D, int Kmi, int Kri) - { - int I = Kmi + D; - I = I << Kri | I >>> (32-Kri); - return ((S1[(I>>>24)&0xff]^S2[(I>>>16)&0xff])-S3[(I>>> 8)&0xff])+ - S4[I & 0xff]; - } - - /** - * The second of the three processing functions for the - * encryption and decryption. - * - * @param D the input to be processed - * @param Kmi the mask to be used from Km[n] - * @param Kri the rotation value to be used - * - */ - protected final int F2(int D, int Kmi, int Kri) - { - int I = Kmi ^ D; - I = I << Kri | I >>> (32-Kri); - return ((S1[(I>>>24)&0xff]-S2[(I>>>16)&0xff])+S3[(I>>> 8)&0xff])^ - S4[I & 0xff]; - } - - /** - * The third of the three processing functions for the - * encryption and decryption. - * - * @param D the input to be processed - * @param Kmi the mask to be used from Km[n] - * @param Kri the rotation value to be used - * - */ - protected final int F3(int D, int Kmi, int Kri) - { - int I = Kmi - D; - I = I << Kri | I >>> (32-Kri); - return ((S1[(I>>>24)&0xff]+S2[(I>>>16)&0xff])^S3[(I>>> 8)&0xff])- - S4[I & 0xff]; - } - - /** - * Does the 16 rounds to encrypt the block. - * - * @param L0 the LH-32bits of the plaintext block - * @param R0 the RH-32bits of the plaintext block - */ - protected final void CAST_Encipher(int L0, int R0, int result[]) - { - int Lp = L0; // the previous value, equiv to L[i-1] - int Rp = R0; // equivalent to R[i-1] - - /* - * numbering consistent with paper to make - * checking and validating easier - */ - int Li = L0, Ri = R0; - - for (int i = 1; i<=_rounds ; i++) - { - Lp = Li; - Rp = Ri; - - Li = Rp; - switch (i) - { - case 1: - case 4: - case 7: - case 10: - case 13: - case 16: - Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]); - break; - case 2: - case 5: - case 8: - case 11: - case 14: - Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]); - break; - case 3: - case 6: - case 9: - case 12: - case 15: - Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]); - break; - } - } - - result[0] = Ri; - result[1] = Li; - - return; - } - - protected final void CAST_Decipher(int L16, int R16, int result[]) - { - int Lp = L16; // the previous value, equiv to L[i-1] - int Rp = R16; // equivalent to R[i-1] - - /* - * numbering consistent with paper to make - * checking and validating easier - */ - int Li = L16, Ri = R16; - - for (int i = _rounds; i > 0; i--) - { - Lp = Li; - Rp = Ri; - - Li = Rp; - switch (i) - { - case 1: - case 4: - case 7: - case 10: - case 13: - case 16: - Ri = Lp ^ F1(Rp, _Km[i], _Kr[i]); - break; - case 2: - case 5: - case 8: - case 11: - case 14: - Ri = Lp ^ F2(Rp, _Km[i], _Kr[i]); - break; - case 3: - case 6: - case 9: - case 12: - case 15: - Ri = Lp ^ F3(Rp, _Km[i], _Kr[i]); - break; - } - } - - result[0] = Ri; - result[1] = Li; - - return; - } - - protected final void Bits32ToInts(int in, int[] b, int offset) - { - b[offset + 3] = (in & 0xff); - b[offset + 2] = ((in >>> 8) & 0xff); - b[offset + 1] = ((in >>> 16) & 0xff); - b[offset] = ((in >>> 24) & 0xff); - } - - protected final int IntsTo32bits(int[] b, int i) - { - int rv = 0; - - rv = ((b[i] & 0xff) << 24) | - ((b[i+1] & 0xff) << 16) | - ((b[i+2] & 0xff) << 8) | - ((b[i+3] & 0xff)); - - return rv; - } - - protected final void Bits32ToBytes(int in, byte[] b, int offset) - { - b[offset + 3] = (byte)in; - b[offset + 2] = (byte)(in >>> 8); - b[offset + 1] = (byte)(in >>> 16); - b[offset] = (byte)(in >>> 24); - } - - protected final int BytesTo32bits(byte[] b, int i) - { - return ((b[i] & 0xff) << 24) | - ((b[i+1] & 0xff) << 16) | - ((b[i+2] & 0xff) << 8) | - ((b[i+3] & 0xff)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST6Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST6Engine.java deleted file mode 100644 index 2a3773e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CAST6Engine.java +++ /dev/null @@ -1,296 +0,0 @@ -package org.bc.crypto.engines; - - -/** - * A class that provides CAST6 key encryption operations, - * such as encoding data and generating keys. - * - * All the algorithms herein are from the Internet RFC - * - * RFC2612 - CAST6 (128bit block, 128-256bit key) - * - * and implement a simplified cryptography interface. - */ -public final class CAST6Engine extends CAST5Engine -{ - //==================================== - // Useful constants - //==================================== - - protected static final int ROUNDS = 12; - - protected static final int BLOCK_SIZE = 16; // bytes = 128 bits - - /* - * Put the round and mask keys into an array. - * Kr0[i] => _Kr[i*4 + 0] - */ - protected int _Kr[] = new int[ROUNDS*4]; // the rotating round key(s) - protected int _Km[] = new int[ROUNDS*4]; // the masking round key(s) - - /* - * Key setup - */ - protected int _Tr[] = new int[24 * 8]; - protected int _Tm[] = new int[24 * 8]; - - private int[] _workingKey = new int[8]; - - public CAST6Engine() - { - } - - public String getAlgorithmName() - { - return "CAST6"; - } - - public void reset() - { - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - //================================== - // Private Implementation - //================================== - - /* - * Creates the subkeys using the same nomenclature - * as described in RFC2612. - * - * See section 2.4 - */ - protected void setKey(byte[] key) - { - int Cm = 0x5a827999; - int Mm = 0x6ed9eba1; - int Cr = 19; - int Mr = 17; - - /* - * Determine the key size here, if required - * - * if keysize < 256 bytes, pad with 0 - * - * Typical key sizes => 128, 160, 192, 224, 256 - */ - for (int i=0; i< 24; i++) - { - for (int j=0; j< 8; j++) - { - _Tm[i*8 + j] = Cm; - Cm = (Cm + Mm); // mod 2^32; - - _Tr[i*8 + j] = Cr; - Cr = (Cr + Mr) & 0x1f; // mod 32 - } - } - - byte[] tmpKey = new byte[64]; - int length = key.length; - System.arraycopy(key, 0, tmpKey, 0, length); - - // now create ABCDEFGH - for (int i=0; i< 8; i++) - { - _workingKey[i] = BytesTo32bits(tmpKey, i*4); - } - - // Generate the key schedule - for (int i=0; i< 12; i++) - { - // KAPPA <- W2i(KAPPA) - int i2 = i*2 *8; - _workingKey[6] ^= F1(_workingKey[7], _Tm[i2 ], _Tr[i2 ]); - _workingKey[5] ^= F2(_workingKey[6], _Tm[i2+1], _Tr[i2+1]); - _workingKey[4] ^= F3(_workingKey[5], _Tm[i2+2], _Tr[i2+2]); - _workingKey[3] ^= F1(_workingKey[4], _Tm[i2+3], _Tr[i2+3]); - _workingKey[2] ^= F2(_workingKey[3], _Tm[i2+4], _Tr[i2+4]); - _workingKey[1] ^= F3(_workingKey[2], _Tm[i2+5], _Tr[i2+5]); - _workingKey[0] ^= F1(_workingKey[1], _Tm[i2+6], _Tr[i2+6]); - _workingKey[7] ^= F2(_workingKey[0], _Tm[i2+7], _Tr[i2+7]); - - // KAPPA <- W2i+1(KAPPA) - i2 = (i*2 + 1)*8; - _workingKey[6] ^= F1(_workingKey[7], _Tm[i2 ], _Tr[i2 ]); - _workingKey[5] ^= F2(_workingKey[6], _Tm[i2+1], _Tr[i2+1]); - _workingKey[4] ^= F3(_workingKey[5], _Tm[i2+2], _Tr[i2+2]); - _workingKey[3] ^= F1(_workingKey[4], _Tm[i2+3], _Tr[i2+3]); - _workingKey[2] ^= F2(_workingKey[3], _Tm[i2+4], _Tr[i2+4]); - _workingKey[1] ^= F3(_workingKey[2], _Tm[i2+5], _Tr[i2+5]); - _workingKey[0] ^= F1(_workingKey[1], _Tm[i2+6], _Tr[i2+6]); - _workingKey[7] ^= F2(_workingKey[0], _Tm[i2+7], _Tr[i2+7]); - - // Kr_(i) <- KAPPA - _Kr[i*4 ] = _workingKey[0] & 0x1f; - _Kr[i*4 + 1] = _workingKey[2] & 0x1f; - _Kr[i*4 + 2] = _workingKey[4] & 0x1f; - _Kr[i*4 + 3] = _workingKey[6] & 0x1f; - - - // Km_(i) <- KAPPA - _Km[i*4 ] = _workingKey[7]; - _Km[i*4 + 1] = _workingKey[5]; - _Km[i*4 + 2] = _workingKey[3]; - _Km[i*4 + 3] = _workingKey[1]; - } - - } - - /** - * Encrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * - * @param src The plaintext buffer - * @param srcIndex An offset into src - * @param dst The ciphertext buffer - * @param dstIndex An offset into dst - */ - protected int encryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - - int result[] = new int[4]; - - // process the input block - // batch the units up into 4x32 bit chunks and go for it - - int A = BytesTo32bits(src, srcIndex); - int B = BytesTo32bits(src, srcIndex + 4); - int C = BytesTo32bits(src, srcIndex + 8); - int D = BytesTo32bits(src, srcIndex + 12); - - CAST_Encipher(A, B, C, D, result); - - // now stuff them into the destination block - Bits32ToBytes(result[0], dst, dstIndex); - Bits32ToBytes(result[1], dst, dstIndex + 4); - Bits32ToBytes(result[2], dst, dstIndex + 8); - Bits32ToBytes(result[3], dst, dstIndex + 12); - - return BLOCK_SIZE; - } - - /** - * Decrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * - * @param src The plaintext buffer - * @param srcIndex An offset into src - * @param dst The ciphertext buffer - * @param dstIndex An offset into dst - */ - protected int decryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - int result[] = new int[4]; - - // process the input block - // batch the units up into 4x32 bit chunks and go for it - int A = BytesTo32bits(src, srcIndex); - int B = BytesTo32bits(src, srcIndex + 4); - int C = BytesTo32bits(src, srcIndex + 8); - int D = BytesTo32bits(src, srcIndex + 12); - - CAST_Decipher(A, B, C, D, result); - - // now stuff them into the destination block - Bits32ToBytes(result[0], dst, dstIndex); - Bits32ToBytes(result[1], dst, dstIndex + 4); - Bits32ToBytes(result[2], dst, dstIndex + 8); - Bits32ToBytes(result[3], dst, dstIndex + 12); - - return BLOCK_SIZE; - } - - /** - * Does the 12 quad rounds rounds to encrypt the block. - * - * @param A the 00-31 bits of the plaintext block - * @param B the 32-63 bits of the plaintext block - * @param C the 64-95 bits of the plaintext block - * @param D the 96-127 bits of the plaintext block - * @param result the resulting ciphertext - */ - protected final void CAST_Encipher(int A, int B, int C, int D,int result[]) - { - int x; - for (int i=0; i< 6; i++) - { - x = i*4; - // BETA <- Qi(BETA) - C ^= F1(D, _Km[x], _Kr[x]); - B ^= F2(C, _Km[x + 1], _Kr[x + 1]); - A ^= F3(B, _Km[x + 2], _Kr[x + 2]); - D ^= F1(A, _Km[x + 3], _Kr[x + 3]); - - } - - for (int i=6; i<12; i++) - { - x = i*4; - // BETA <- QBARi(BETA) - D ^= F1(A, _Km[x + 3], _Kr[x + 3]); - A ^= F3(B, _Km[x + 2], _Kr[x + 2]); - B ^= F2(C, _Km[x + 1], _Kr[x + 1]); - C ^= F1(D, _Km[x], _Kr[x]); - - } - - result[0] = A; - result[1] = B; - result[2] = C; - result[3] = D; - } - - /** - * Does the 12 quad rounds rounds to decrypt the block. - * - * @param A the 00-31 bits of the ciphertext block - * @param B the 32-63 bits of the ciphertext block - * @param C the 64-95 bits of the ciphertext block - * @param D the 96-127 bits of the ciphertext block - * @param result the resulting plaintext - */ - protected final void CAST_Decipher(int A, int B, int C, int D,int result[]) - { - int x; - for (int i=0; i< 6; i++) - { - x = (11-i)*4; - // BETA <- Qi(BETA) - C ^= F1(D, _Km[x], _Kr[x]); - B ^= F2(C, _Km[x + 1], _Kr[x + 1]); - A ^= F3(B, _Km[x + 2], _Kr[x + 2]); - D ^= F1(A, _Km[x + 3], _Kr[x + 3]); - - } - - for (int i=6; i<12; i++) - { - x = (11-i)*4; - // BETA <- QBARi(BETA) - D ^= F1(A, _Km[x + 3], _Kr[x + 3]); - A ^= F3(B, _Km[x + 2], _Kr[x + 2]); - B ^= F2(C, _Km[x + 1], _Kr[x + 1]); - C ^= F1(D, _Km[x], _Kr[x]); - - } - - result[0] = A; - result[1] = B; - result[2] = C; - result[3] = D; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaEngine.java deleted file mode 100644 index abc063c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaEngine.java +++ /dev/null @@ -1,683 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * Camellia - based on RFC 3713. - */ -public class CamelliaEngine - implements BlockCipher -{ - private boolean initialised = false; - private boolean _keyIs128; - - private static final int BLOCK_SIZE = 16; - private static final int MASK8 = 0xff; - - private int[] subkey = new int[24 * 4]; - private int[] kw = new int[4 * 2]; // for whitening - private int[] ke = new int[6 * 2]; // for FL and FL^(-1) - private int[] state = new int[4]; // for encryption and decryption - - private static final int SIGMA[] = { - 0xa09e667f, 0x3bcc908b, - 0xb67ae858, 0x4caa73b2, - 0xc6ef372f, 0xe94f82be, - 0x54ff53a5, 0xf1d36f1c, - 0x10e527fa, 0xde682d1d, - 0xb05688c2, 0xb3e6c1fd - }; - - /* - * - * S-box data - * - */ - private static final int SBOX1_1110[] = { - 0x70707000, 0x82828200, 0x2c2c2c00, 0xececec00, 0xb3b3b300, 0x27272700, - 0xc0c0c000, 0xe5e5e500, 0xe4e4e400, 0x85858500, 0x57575700, 0x35353500, - 0xeaeaea00, 0x0c0c0c00, 0xaeaeae00, 0x41414100, 0x23232300, 0xefefef00, - 0x6b6b6b00, 0x93939300, 0x45454500, 0x19191900, 0xa5a5a500, 0x21212100, - 0xededed00, 0x0e0e0e00, 0x4f4f4f00, 0x4e4e4e00, 0x1d1d1d00, 0x65656500, - 0x92929200, 0xbdbdbd00, 0x86868600, 0xb8b8b800, 0xafafaf00, 0x8f8f8f00, - 0x7c7c7c00, 0xebebeb00, 0x1f1f1f00, 0xcecece00, 0x3e3e3e00, 0x30303000, - 0xdcdcdc00, 0x5f5f5f00, 0x5e5e5e00, 0xc5c5c500, 0x0b0b0b00, 0x1a1a1a00, - 0xa6a6a600, 0xe1e1e100, 0x39393900, 0xcacaca00, 0xd5d5d500, 0x47474700, - 0x5d5d5d00, 0x3d3d3d00, 0xd9d9d900, 0x01010100, 0x5a5a5a00, 0xd6d6d600, - 0x51515100, 0x56565600, 0x6c6c6c00, 0x4d4d4d00, 0x8b8b8b00, 0x0d0d0d00, - 0x9a9a9a00, 0x66666600, 0xfbfbfb00, 0xcccccc00, 0xb0b0b000, 0x2d2d2d00, - 0x74747400, 0x12121200, 0x2b2b2b00, 0x20202000, 0xf0f0f000, 0xb1b1b100, - 0x84848400, 0x99999900, 0xdfdfdf00, 0x4c4c4c00, 0xcbcbcb00, 0xc2c2c200, - 0x34343400, 0x7e7e7e00, 0x76767600, 0x05050500, 0x6d6d6d00, 0xb7b7b700, - 0xa9a9a900, 0x31313100, 0xd1d1d100, 0x17171700, 0x04040400, 0xd7d7d700, - 0x14141400, 0x58585800, 0x3a3a3a00, 0x61616100, 0xdedede00, 0x1b1b1b00, - 0x11111100, 0x1c1c1c00, 0x32323200, 0x0f0f0f00, 0x9c9c9c00, 0x16161600, - 0x53535300, 0x18181800, 0xf2f2f200, 0x22222200, 0xfefefe00, 0x44444400, - 0xcfcfcf00, 0xb2b2b200, 0xc3c3c300, 0xb5b5b500, 0x7a7a7a00, 0x91919100, - 0x24242400, 0x08080800, 0xe8e8e800, 0xa8a8a800, 0x60606000, 0xfcfcfc00, - 0x69696900, 0x50505000, 0xaaaaaa00, 0xd0d0d000, 0xa0a0a000, 0x7d7d7d00, - 0xa1a1a100, 0x89898900, 0x62626200, 0x97979700, 0x54545400, 0x5b5b5b00, - 0x1e1e1e00, 0x95959500, 0xe0e0e000, 0xffffff00, 0x64646400, 0xd2d2d200, - 0x10101000, 0xc4c4c400, 0x00000000, 0x48484800, 0xa3a3a300, 0xf7f7f700, - 0x75757500, 0xdbdbdb00, 0x8a8a8a00, 0x03030300, 0xe6e6e600, 0xdadada00, - 0x09090900, 0x3f3f3f00, 0xdddddd00, 0x94949400, 0x87878700, 0x5c5c5c00, - 0x83838300, 0x02020200, 0xcdcdcd00, 0x4a4a4a00, 0x90909000, 0x33333300, - 0x73737300, 0x67676700, 0xf6f6f600, 0xf3f3f300, 0x9d9d9d00, 0x7f7f7f00, - 0xbfbfbf00, 0xe2e2e200, 0x52525200, 0x9b9b9b00, 0xd8d8d800, 0x26262600, - 0xc8c8c800, 0x37373700, 0xc6c6c600, 0x3b3b3b00, 0x81818100, 0x96969600, - 0x6f6f6f00, 0x4b4b4b00, 0x13131300, 0xbebebe00, 0x63636300, 0x2e2e2e00, - 0xe9e9e900, 0x79797900, 0xa7a7a700, 0x8c8c8c00, 0x9f9f9f00, 0x6e6e6e00, - 0xbcbcbc00, 0x8e8e8e00, 0x29292900, 0xf5f5f500, 0xf9f9f900, 0xb6b6b600, - 0x2f2f2f00, 0xfdfdfd00, 0xb4b4b400, 0x59595900, 0x78787800, 0x98989800, - 0x06060600, 0x6a6a6a00, 0xe7e7e700, 0x46464600, 0x71717100, 0xbababa00, - 0xd4d4d400, 0x25252500, 0xababab00, 0x42424200, 0x88888800, 0xa2a2a200, - 0x8d8d8d00, 0xfafafa00, 0x72727200, 0x07070700, 0xb9b9b900, 0x55555500, - 0xf8f8f800, 0xeeeeee00, 0xacacac00, 0x0a0a0a00, 0x36363600, 0x49494900, - 0x2a2a2a00, 0x68686800, 0x3c3c3c00, 0x38383800, 0xf1f1f100, 0xa4a4a400, - 0x40404000, 0x28282800, 0xd3d3d300, 0x7b7b7b00, 0xbbbbbb00, 0xc9c9c900, - 0x43434300, 0xc1c1c100, 0x15151500, 0xe3e3e300, 0xadadad00, 0xf4f4f400, - 0x77777700, 0xc7c7c700, 0x80808000, 0x9e9e9e00 - }; - - private static final int SBOX4_4404[] = { - 0x70700070, 0x2c2c002c, 0xb3b300b3, 0xc0c000c0, 0xe4e400e4, 0x57570057, - 0xeaea00ea, 0xaeae00ae, 0x23230023, 0x6b6b006b, 0x45450045, 0xa5a500a5, - 0xeded00ed, 0x4f4f004f, 0x1d1d001d, 0x92920092, 0x86860086, 0xafaf00af, - 0x7c7c007c, 0x1f1f001f, 0x3e3e003e, 0xdcdc00dc, 0x5e5e005e, 0x0b0b000b, - 0xa6a600a6, 0x39390039, 0xd5d500d5, 0x5d5d005d, 0xd9d900d9, 0x5a5a005a, - 0x51510051, 0x6c6c006c, 0x8b8b008b, 0x9a9a009a, 0xfbfb00fb, 0xb0b000b0, - 0x74740074, 0x2b2b002b, 0xf0f000f0, 0x84840084, 0xdfdf00df, 0xcbcb00cb, - 0x34340034, 0x76760076, 0x6d6d006d, 0xa9a900a9, 0xd1d100d1, 0x04040004, - 0x14140014, 0x3a3a003a, 0xdede00de, 0x11110011, 0x32320032, 0x9c9c009c, - 0x53530053, 0xf2f200f2, 0xfefe00fe, 0xcfcf00cf, 0xc3c300c3, 0x7a7a007a, - 0x24240024, 0xe8e800e8, 0x60600060, 0x69690069, 0xaaaa00aa, 0xa0a000a0, - 0xa1a100a1, 0x62620062, 0x54540054, 0x1e1e001e, 0xe0e000e0, 0x64640064, - 0x10100010, 0x00000000, 0xa3a300a3, 0x75750075, 0x8a8a008a, 0xe6e600e6, - 0x09090009, 0xdddd00dd, 0x87870087, 0x83830083, 0xcdcd00cd, 0x90900090, - 0x73730073, 0xf6f600f6, 0x9d9d009d, 0xbfbf00bf, 0x52520052, 0xd8d800d8, - 0xc8c800c8, 0xc6c600c6, 0x81810081, 0x6f6f006f, 0x13130013, 0x63630063, - 0xe9e900e9, 0xa7a700a7, 0x9f9f009f, 0xbcbc00bc, 0x29290029, 0xf9f900f9, - 0x2f2f002f, 0xb4b400b4, 0x78780078, 0x06060006, 0xe7e700e7, 0x71710071, - 0xd4d400d4, 0xabab00ab, 0x88880088, 0x8d8d008d, 0x72720072, 0xb9b900b9, - 0xf8f800f8, 0xacac00ac, 0x36360036, 0x2a2a002a, 0x3c3c003c, 0xf1f100f1, - 0x40400040, 0xd3d300d3, 0xbbbb00bb, 0x43430043, 0x15150015, 0xadad00ad, - 0x77770077, 0x80800080, 0x82820082, 0xecec00ec, 0x27270027, 0xe5e500e5, - 0x85850085, 0x35350035, 0x0c0c000c, 0x41410041, 0xefef00ef, 0x93930093, - 0x19190019, 0x21210021, 0x0e0e000e, 0x4e4e004e, 0x65650065, 0xbdbd00bd, - 0xb8b800b8, 0x8f8f008f, 0xebeb00eb, 0xcece00ce, 0x30300030, 0x5f5f005f, - 0xc5c500c5, 0x1a1a001a, 0xe1e100e1, 0xcaca00ca, 0x47470047, 0x3d3d003d, - 0x01010001, 0xd6d600d6, 0x56560056, 0x4d4d004d, 0x0d0d000d, 0x66660066, - 0xcccc00cc, 0x2d2d002d, 0x12120012, 0x20200020, 0xb1b100b1, 0x99990099, - 0x4c4c004c, 0xc2c200c2, 0x7e7e007e, 0x05050005, 0xb7b700b7, 0x31310031, - 0x17170017, 0xd7d700d7, 0x58580058, 0x61610061, 0x1b1b001b, 0x1c1c001c, - 0x0f0f000f, 0x16160016, 0x18180018, 0x22220022, 0x44440044, 0xb2b200b2, - 0xb5b500b5, 0x91910091, 0x08080008, 0xa8a800a8, 0xfcfc00fc, 0x50500050, - 0xd0d000d0, 0x7d7d007d, 0x89890089, 0x97970097, 0x5b5b005b, 0x95950095, - 0xffff00ff, 0xd2d200d2, 0xc4c400c4, 0x48480048, 0xf7f700f7, 0xdbdb00db, - 0x03030003, 0xdada00da, 0x3f3f003f, 0x94940094, 0x5c5c005c, 0x02020002, - 0x4a4a004a, 0x33330033, 0x67670067, 0xf3f300f3, 0x7f7f007f, 0xe2e200e2, - 0x9b9b009b, 0x26260026, 0x37370037, 0x3b3b003b, 0x96960096, 0x4b4b004b, - 0xbebe00be, 0x2e2e002e, 0x79790079, 0x8c8c008c, 0x6e6e006e, 0x8e8e008e, - 0xf5f500f5, 0xb6b600b6, 0xfdfd00fd, 0x59590059, 0x98980098, 0x6a6a006a, - 0x46460046, 0xbaba00ba, 0x25250025, 0x42420042, 0xa2a200a2, 0xfafa00fa, - 0x07070007, 0x55550055, 0xeeee00ee, 0x0a0a000a, 0x49490049, 0x68680068, - 0x38380038, 0xa4a400a4, 0x28280028, 0x7b7b007b, 0xc9c900c9, 0xc1c100c1, - 0xe3e300e3, 0xf4f400f4, 0xc7c700c7, 0x9e9e009e - }; - - private static final int SBOX2_0222[] = { - 0x00e0e0e0, 0x00050505, 0x00585858, 0x00d9d9d9, 0x00676767, 0x004e4e4e, - 0x00818181, 0x00cbcbcb, 0x00c9c9c9, 0x000b0b0b, 0x00aeaeae, 0x006a6a6a, - 0x00d5d5d5, 0x00181818, 0x005d5d5d, 0x00828282, 0x00464646, 0x00dfdfdf, - 0x00d6d6d6, 0x00272727, 0x008a8a8a, 0x00323232, 0x004b4b4b, 0x00424242, - 0x00dbdbdb, 0x001c1c1c, 0x009e9e9e, 0x009c9c9c, 0x003a3a3a, 0x00cacaca, - 0x00252525, 0x007b7b7b, 0x000d0d0d, 0x00717171, 0x005f5f5f, 0x001f1f1f, - 0x00f8f8f8, 0x00d7d7d7, 0x003e3e3e, 0x009d9d9d, 0x007c7c7c, 0x00606060, - 0x00b9b9b9, 0x00bebebe, 0x00bcbcbc, 0x008b8b8b, 0x00161616, 0x00343434, - 0x004d4d4d, 0x00c3c3c3, 0x00727272, 0x00959595, 0x00ababab, 0x008e8e8e, - 0x00bababa, 0x007a7a7a, 0x00b3b3b3, 0x00020202, 0x00b4b4b4, 0x00adadad, - 0x00a2a2a2, 0x00acacac, 0x00d8d8d8, 0x009a9a9a, 0x00171717, 0x001a1a1a, - 0x00353535, 0x00cccccc, 0x00f7f7f7, 0x00999999, 0x00616161, 0x005a5a5a, - 0x00e8e8e8, 0x00242424, 0x00565656, 0x00404040, 0x00e1e1e1, 0x00636363, - 0x00090909, 0x00333333, 0x00bfbfbf, 0x00989898, 0x00979797, 0x00858585, - 0x00686868, 0x00fcfcfc, 0x00ececec, 0x000a0a0a, 0x00dadada, 0x006f6f6f, - 0x00535353, 0x00626262, 0x00a3a3a3, 0x002e2e2e, 0x00080808, 0x00afafaf, - 0x00282828, 0x00b0b0b0, 0x00747474, 0x00c2c2c2, 0x00bdbdbd, 0x00363636, - 0x00222222, 0x00383838, 0x00646464, 0x001e1e1e, 0x00393939, 0x002c2c2c, - 0x00a6a6a6, 0x00303030, 0x00e5e5e5, 0x00444444, 0x00fdfdfd, 0x00888888, - 0x009f9f9f, 0x00656565, 0x00878787, 0x006b6b6b, 0x00f4f4f4, 0x00232323, - 0x00484848, 0x00101010, 0x00d1d1d1, 0x00515151, 0x00c0c0c0, 0x00f9f9f9, - 0x00d2d2d2, 0x00a0a0a0, 0x00555555, 0x00a1a1a1, 0x00414141, 0x00fafafa, - 0x00434343, 0x00131313, 0x00c4c4c4, 0x002f2f2f, 0x00a8a8a8, 0x00b6b6b6, - 0x003c3c3c, 0x002b2b2b, 0x00c1c1c1, 0x00ffffff, 0x00c8c8c8, 0x00a5a5a5, - 0x00202020, 0x00898989, 0x00000000, 0x00909090, 0x00474747, 0x00efefef, - 0x00eaeaea, 0x00b7b7b7, 0x00151515, 0x00060606, 0x00cdcdcd, 0x00b5b5b5, - 0x00121212, 0x007e7e7e, 0x00bbbbbb, 0x00292929, 0x000f0f0f, 0x00b8b8b8, - 0x00070707, 0x00040404, 0x009b9b9b, 0x00949494, 0x00212121, 0x00666666, - 0x00e6e6e6, 0x00cecece, 0x00ededed, 0x00e7e7e7, 0x003b3b3b, 0x00fefefe, - 0x007f7f7f, 0x00c5c5c5, 0x00a4a4a4, 0x00373737, 0x00b1b1b1, 0x004c4c4c, - 0x00919191, 0x006e6e6e, 0x008d8d8d, 0x00767676, 0x00030303, 0x002d2d2d, - 0x00dedede, 0x00969696, 0x00262626, 0x007d7d7d, 0x00c6c6c6, 0x005c5c5c, - 0x00d3d3d3, 0x00f2f2f2, 0x004f4f4f, 0x00191919, 0x003f3f3f, 0x00dcdcdc, - 0x00797979, 0x001d1d1d, 0x00525252, 0x00ebebeb, 0x00f3f3f3, 0x006d6d6d, - 0x005e5e5e, 0x00fbfbfb, 0x00696969, 0x00b2b2b2, 0x00f0f0f0, 0x00313131, - 0x000c0c0c, 0x00d4d4d4, 0x00cfcfcf, 0x008c8c8c, 0x00e2e2e2, 0x00757575, - 0x00a9a9a9, 0x004a4a4a, 0x00575757, 0x00848484, 0x00111111, 0x00454545, - 0x001b1b1b, 0x00f5f5f5, 0x00e4e4e4, 0x000e0e0e, 0x00737373, 0x00aaaaaa, - 0x00f1f1f1, 0x00dddddd, 0x00595959, 0x00141414, 0x006c6c6c, 0x00929292, - 0x00545454, 0x00d0d0d0, 0x00787878, 0x00707070, 0x00e3e3e3, 0x00494949, - 0x00808080, 0x00505050, 0x00a7a7a7, 0x00f6f6f6, 0x00777777, 0x00939393, - 0x00868686, 0x00838383, 0x002a2a2a, 0x00c7c7c7, 0x005b5b5b, 0x00e9e9e9, - 0x00eeeeee, 0x008f8f8f, 0x00010101, 0x003d3d3d - }; - - private static final int SBOX3_3033[] = { - 0x38003838, 0x41004141, 0x16001616, 0x76007676, 0xd900d9d9, 0x93009393, - 0x60006060, 0xf200f2f2, 0x72007272, 0xc200c2c2, 0xab00abab, 0x9a009a9a, - 0x75007575, 0x06000606, 0x57005757, 0xa000a0a0, 0x91009191, 0xf700f7f7, - 0xb500b5b5, 0xc900c9c9, 0xa200a2a2, 0x8c008c8c, 0xd200d2d2, 0x90009090, - 0xf600f6f6, 0x07000707, 0xa700a7a7, 0x27002727, 0x8e008e8e, 0xb200b2b2, - 0x49004949, 0xde00dede, 0x43004343, 0x5c005c5c, 0xd700d7d7, 0xc700c7c7, - 0x3e003e3e, 0xf500f5f5, 0x8f008f8f, 0x67006767, 0x1f001f1f, 0x18001818, - 0x6e006e6e, 0xaf00afaf, 0x2f002f2f, 0xe200e2e2, 0x85008585, 0x0d000d0d, - 0x53005353, 0xf000f0f0, 0x9c009c9c, 0x65006565, 0xea00eaea, 0xa300a3a3, - 0xae00aeae, 0x9e009e9e, 0xec00ecec, 0x80008080, 0x2d002d2d, 0x6b006b6b, - 0xa800a8a8, 0x2b002b2b, 0x36003636, 0xa600a6a6, 0xc500c5c5, 0x86008686, - 0x4d004d4d, 0x33003333, 0xfd00fdfd, 0x66006666, 0x58005858, 0x96009696, - 0x3a003a3a, 0x09000909, 0x95009595, 0x10001010, 0x78007878, 0xd800d8d8, - 0x42004242, 0xcc00cccc, 0xef00efef, 0x26002626, 0xe500e5e5, 0x61006161, - 0x1a001a1a, 0x3f003f3f, 0x3b003b3b, 0x82008282, 0xb600b6b6, 0xdb00dbdb, - 0xd400d4d4, 0x98009898, 0xe800e8e8, 0x8b008b8b, 0x02000202, 0xeb00ebeb, - 0x0a000a0a, 0x2c002c2c, 0x1d001d1d, 0xb000b0b0, 0x6f006f6f, 0x8d008d8d, - 0x88008888, 0x0e000e0e, 0x19001919, 0x87008787, 0x4e004e4e, 0x0b000b0b, - 0xa900a9a9, 0x0c000c0c, 0x79007979, 0x11001111, 0x7f007f7f, 0x22002222, - 0xe700e7e7, 0x59005959, 0xe100e1e1, 0xda00dada, 0x3d003d3d, 0xc800c8c8, - 0x12001212, 0x04000404, 0x74007474, 0x54005454, 0x30003030, 0x7e007e7e, - 0xb400b4b4, 0x28002828, 0x55005555, 0x68006868, 0x50005050, 0xbe00bebe, - 0xd000d0d0, 0xc400c4c4, 0x31003131, 0xcb00cbcb, 0x2a002a2a, 0xad00adad, - 0x0f000f0f, 0xca00caca, 0x70007070, 0xff00ffff, 0x32003232, 0x69006969, - 0x08000808, 0x62006262, 0x00000000, 0x24002424, 0xd100d1d1, 0xfb00fbfb, - 0xba00baba, 0xed00eded, 0x45004545, 0x81008181, 0x73007373, 0x6d006d6d, - 0x84008484, 0x9f009f9f, 0xee00eeee, 0x4a004a4a, 0xc300c3c3, 0x2e002e2e, - 0xc100c1c1, 0x01000101, 0xe600e6e6, 0x25002525, 0x48004848, 0x99009999, - 0xb900b9b9, 0xb300b3b3, 0x7b007b7b, 0xf900f9f9, 0xce00cece, 0xbf00bfbf, - 0xdf00dfdf, 0x71007171, 0x29002929, 0xcd00cdcd, 0x6c006c6c, 0x13001313, - 0x64006464, 0x9b009b9b, 0x63006363, 0x9d009d9d, 0xc000c0c0, 0x4b004b4b, - 0xb700b7b7, 0xa500a5a5, 0x89008989, 0x5f005f5f, 0xb100b1b1, 0x17001717, - 0xf400f4f4, 0xbc00bcbc, 0xd300d3d3, 0x46004646, 0xcf00cfcf, 0x37003737, - 0x5e005e5e, 0x47004747, 0x94009494, 0xfa00fafa, 0xfc00fcfc, 0x5b005b5b, - 0x97009797, 0xfe00fefe, 0x5a005a5a, 0xac00acac, 0x3c003c3c, 0x4c004c4c, - 0x03000303, 0x35003535, 0xf300f3f3, 0x23002323, 0xb800b8b8, 0x5d005d5d, - 0x6a006a6a, 0x92009292, 0xd500d5d5, 0x21002121, 0x44004444, 0x51005151, - 0xc600c6c6, 0x7d007d7d, 0x39003939, 0x83008383, 0xdc00dcdc, 0xaa00aaaa, - 0x7c007c7c, 0x77007777, 0x56005656, 0x05000505, 0x1b001b1b, 0xa400a4a4, - 0x15001515, 0x34003434, 0x1e001e1e, 0x1c001c1c, 0xf800f8f8, 0x52005252, - 0x20002020, 0x14001414, 0xe900e9e9, 0xbd00bdbd, 0xdd00dddd, 0xe400e4e4, - 0xa100a1a1, 0xe000e0e0, 0x8a008a8a, 0xf100f1f1, 0xd600d6d6, 0x7a007a7a, - 0xbb00bbbb, 0xe300e3e3, 0x40004040, 0x4f004f4f - }; - - private static int rightRotate(int x, int s) - { - return (((x) >>> (s)) + ((x) << (32 - s))); - } - - private static int leftRotate(int x, int s) - { - return ((x) << (s)) + ((x) >>> (32 - s)); - } - - private static void roldq(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[0 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >>> (32 - rot)); - ko[1 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >>> (32 - rot)); - ko[2 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >>> (32 - rot)); - ko[3 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >>> (32 - rot)); - ki[0 + ioff] = ko[0 + ooff]; - ki[1 + ioff] = ko[1 + ooff]; - ki[2 + ioff] = ko[2 + ooff]; - ki[3 + ioff] = ko[3 + ooff]; - } - - private static void decroldq(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[2 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >>> (32 - rot)); - ko[3 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >>> (32 - rot)); - ko[0 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >>> (32 - rot)); - ko[1 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >>> (32 - rot)); - ki[0 + ioff] = ko[2 + ooff]; - ki[1 + ioff] = ko[3 + ooff]; - ki[2 + ioff] = ko[0 + ooff]; - ki[3 + ioff] = ko[1 + ooff]; - } - - private static void roldqo32(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[0 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >>> (64 - rot)); - ko[1 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >>> (64 - rot)); - ko[2 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >>> (64 - rot)); - ko[3 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >>> (64 - rot)); - ki[0 + ioff] = ko[0 + ooff]; - ki[1 + ioff] = ko[1 + ooff]; - ki[2 + ioff] = ko[2 + ooff]; - ki[3 + ioff] = ko[3 + ooff]; - } - - private static void decroldqo32(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[2 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >>> (64 - rot)); - ko[3 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >>> (64 - rot)); - ko[0 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >>> (64 - rot)); - ko[1 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >>> (64 - rot)); - ki[0 + ioff] = ko[2 + ooff]; - ki[1 + ioff] = ko[3 + ooff]; - ki[2 + ioff] = ko[0 + ooff]; - ki[3 + ioff] = ko[1 + ooff]; - } - - private int bytes2int(byte[] src, int offset) - { - int word = 0; - - for (int i = 0; i < 4; i++) - { - word = (word << 8) + (src[i + offset] & MASK8); - } - return word; - } - - private void int2bytes(int word, byte[] dst, int offset) - { - for (int i = 0; i < 4; i++) - { - dst[(3 - i) + offset] = (byte)word; - word >>>= 8; - } - } - - private void camelliaF2(int[] s, int[] skey, int keyoff) - { - int t1, t2, u, v; - - t1 = s[0] ^ skey[0 + keyoff]; - u = SBOX4_4404[t1 & MASK8]; - u ^= SBOX3_3033[(t1 >>> 8) & MASK8]; - u ^= SBOX2_0222[(t1 >>> 16) & MASK8]; - u ^= SBOX1_1110[(t1 >>> 24) & MASK8]; - t2 = s[1] ^ skey[1 + keyoff]; - v = SBOX1_1110[t2 & MASK8]; - v ^= SBOX4_4404[(t2 >>> 8) & MASK8]; - v ^= SBOX3_3033[(t2 >>> 16) & MASK8]; - v ^= SBOX2_0222[(t2 >>> 24) & MASK8]; - - s[2] ^= u ^ v; - s[3] ^= u ^ v ^ rightRotate(u, 8); - - t1 = s[2] ^ skey[2 + keyoff]; - u = SBOX4_4404[t1 & MASK8]; - u ^= SBOX3_3033[(t1 >>> 8) & MASK8]; - u ^= SBOX2_0222[(t1 >>> 16) & MASK8]; - u ^= SBOX1_1110[(t1 >>> 24) & MASK8]; - t2 = s[3] ^ skey[3 + keyoff]; - v = SBOX1_1110[t2 & MASK8]; - v ^= SBOX4_4404[(t2 >>> 8) & MASK8]; - v ^= SBOX3_3033[(t2 >>> 16) & MASK8]; - v ^= SBOX2_0222[(t2 >>> 24) & MASK8]; - - s[0] ^= u ^ v; - s[1] ^= u ^ v ^ rightRotate(u, 8); - } - - private void camelliaFLs(int[] s, int[] fkey, int keyoff) - { - - s[1] ^= leftRotate(s[0] & fkey[0 + keyoff], 1); - s[0] ^= fkey[1 + keyoff] | s[1]; - - s[2] ^= fkey[3 + keyoff] | s[3]; - s[3] ^= leftRotate(fkey[2 + keyoff] & s[2], 1); - } - - private void setKey(boolean forEncryption, byte[] key) - { - int[] k = new int[8]; - int[] ka = new int[4]; - int[] kb = new int[4]; - int[] t = new int[4]; - - switch (key.length) - { - case 16: - _keyIs128 = true; - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = k[5] = k[6] = k[7] = 0; - break; - case 24: - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = bytes2int(key, 16); - k[5] = bytes2int(key, 20); - k[6] = ~k[4]; - k[7] = ~k[5]; - _keyIs128 = false; - break; - case 32: - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = bytes2int(key, 16); - k[5] = bytes2int(key, 20); - k[6] = bytes2int(key, 24); - k[7] = bytes2int(key, 28); - _keyIs128 = false; - break; - default: - throw new - IllegalArgumentException("key sizes are only 16/24/32 bytes."); - } - - for (int i = 0; i < 4; i++) - { - ka[i] = k[i] ^ k[i + 4]; - } - /* compute KA */ - camelliaF2(ka, SIGMA, 0); - for (int i = 0; i < 4; i++) - { - ka[i] ^= k[i]; - } - camelliaF2(ka, SIGMA, 4); - - if (_keyIs128) - { - if (forEncryption) - { - /* KL dependant keys */ - kw[0] = k[0]; - kw[1] = k[1]; - kw[2] = k[2]; - kw[3] = k[3]; - roldq(15, k, 0, subkey, 4); - roldq(30, k, 0, subkey, 12); - roldq(15, k, 0, t, 0); - subkey[18] = t[2]; - subkey[19] = t[3]; - roldq(17, k, 0, ke, 4); - roldq(17, k, 0, subkey, 24); - roldq(17, k, 0, subkey, 32); - /* KA dependant keys */ - subkey[0] = ka[0]; - subkey[1] = ka[1]; - subkey[2] = ka[2]; - subkey[3] = ka[3]; - roldq(15, ka, 0, subkey, 8); - roldq(15, ka, 0, ke, 0); - roldq(15, ka, 0, t, 0); - subkey[16] = t[0]; - subkey[17] = t[1]; - roldq(15, ka, 0, subkey, 20); - roldqo32(34, ka, 0, subkey, 28); - roldq(17, ka, 0, kw, 4); - - } - else - { // decryption - /* KL dependant keys */ - kw[4] = k[0]; - kw[5] = k[1]; - kw[6] = k[2]; - kw[7] = k[3]; - decroldq(15, k, 0, subkey, 28); - decroldq(30, k, 0, subkey, 20); - decroldq(15, k, 0, t, 0); - subkey[16] = t[0]; - subkey[17] = t[1]; - decroldq(17, k, 0, ke, 0); - decroldq(17, k, 0, subkey, 8); - decroldq(17, k, 0, subkey, 0); - /* KA dependant keys */ - subkey[34] = ka[0]; - subkey[35] = ka[1]; - subkey[32] = ka[2]; - subkey[33] = ka[3]; - decroldq(15, ka, 0, subkey, 24); - decroldq(15, ka, 0, ke, 4); - decroldq(15, ka, 0, t, 0); - subkey[18] = t[2]; - subkey[19] = t[3]; - decroldq(15, ka, 0, subkey, 12); - decroldqo32(34, ka, 0, subkey, 4); - roldq(17, ka, 0, kw, 0); - } - } - else - { // 192bit or 256bit - /* compute KB */ - for (int i = 0; i < 4; i++) - { - kb[i] = ka[i] ^ k[i + 4]; - } - camelliaF2(kb, SIGMA, 8); - - if (forEncryption) - { - /* KL dependant keys */ - kw[0] = k[0]; - kw[1] = k[1]; - kw[2] = k[2]; - kw[3] = k[3]; - roldqo32(45, k, 0, subkey, 16); - roldq(15, k, 0, ke, 4); - roldq(17, k, 0, subkey, 32); - roldqo32(34, k, 0, subkey, 44); - /* KR dependant keys */ - roldq(15, k, 4, subkey, 4); - roldq(15, k, 4, ke, 0); - roldq(30, k, 4, subkey, 24); - roldqo32(34, k, 4, subkey, 36); - /* KA dependant keys */ - roldq(15, ka, 0, subkey, 8); - roldq(30, ka, 0, subkey, 20); - /* 32bit rotation */ - ke[8] = ka[1]; - ke[9] = ka[2]; - ke[10] = ka[3]; - ke[11] = ka[0]; - roldqo32(49, ka, 0, subkey, 40); - - /* KB dependant keys */ - subkey[0] = kb[0]; - subkey[1] = kb[1]; - subkey[2] = kb[2]; - subkey[3] = kb[3]; - roldq(30, kb, 0, subkey, 12); - roldq(30, kb, 0, subkey, 28); - roldqo32(51, kb, 0, kw, 4); - - } - else - { // decryption - /* KL dependant keys */ - kw[4] = k[0]; - kw[5] = k[1]; - kw[6] = k[2]; - kw[7] = k[3]; - decroldqo32(45, k, 0, subkey, 28); - decroldq(15, k, 0, ke, 4); - decroldq(17, k, 0, subkey, 12); - decroldqo32(34, k, 0, subkey, 0); - /* KR dependant keys */ - decroldq(15, k, 4, subkey, 40); - decroldq(15, k, 4, ke, 8); - decroldq(30, k, 4, subkey, 20); - decroldqo32(34, k, 4, subkey, 8); - /* KA dependant keys */ - decroldq(15, ka, 0, subkey, 36); - decroldq(30, ka, 0, subkey, 24); - /* 32bit rotation */ - ke[2] = ka[1]; - ke[3] = ka[2]; - ke[0] = ka[3]; - ke[1] = ka[0]; - decroldqo32(49, ka, 0, subkey, 4); - - /* KB dependant keys */ - subkey[46] = kb[0]; - subkey[47] = kb[1]; - subkey[44] = kb[2]; - subkey[45] = kb[3]; - decroldq(30, kb, 0, subkey, 32); - decroldq(30, kb, 0, subkey, 16); - roldqo32(51, kb, 0, kw, 0); - } - } - } - - private int processBlock128(byte[] in, int inOff, - byte[] out, int outOff) - { - for (int i = 0; i < 4; i++) - { - state[i] = bytes2int(in, inOff + (i * 4)); - state[i] ^= kw[i]; - } - - camelliaF2(state, subkey, 0); - camelliaF2(state, subkey, 4); - camelliaF2(state, subkey, 8); - camelliaFLs(state, ke, 0); - camelliaF2(state, subkey, 12); - camelliaF2(state, subkey, 16); - camelliaF2(state, subkey, 20); - camelliaFLs(state, ke, 4); - camelliaF2(state, subkey, 24); - camelliaF2(state, subkey, 28); - camelliaF2(state, subkey, 32); - - state[2] ^= kw[4]; - state[3] ^= kw[5]; - state[0] ^= kw[6]; - state[1] ^= kw[7]; - - int2bytes(state[2], out, outOff); - int2bytes(state[3], out, outOff + 4); - int2bytes(state[0], out, outOff + 8); - int2bytes(state[1], out, outOff + 12); - - return BLOCK_SIZE; - } - - private int processBlock192or256(byte[] in, int inOff, - byte[] out, int outOff) - { - for (int i = 0; i < 4; i++) - { - state[i] = bytes2int(in, inOff + (i * 4)); - state[i] ^= kw[i]; - } - - camelliaF2(state, subkey, 0); - camelliaF2(state, subkey, 4); - camelliaF2(state, subkey, 8); - camelliaFLs(state, ke, 0); - camelliaF2(state, subkey, 12); - camelliaF2(state, subkey, 16); - camelliaF2(state, subkey, 20); - camelliaFLs(state, ke, 4); - camelliaF2(state, subkey, 24); - camelliaF2(state, subkey, 28); - camelliaF2(state, subkey, 32); - camelliaFLs(state, ke, 8); - camelliaF2(state, subkey, 36); - camelliaF2(state, subkey, 40); - camelliaF2(state, subkey, 44); - - state[2] ^= kw[4]; - state[3] ^= kw[5]; - state[0] ^= kw[6]; - state[1] ^= kw[7]; - - int2bytes(state[2], out, outOff); - int2bytes(state[3], out, outOff + 4); - int2bytes(state[0], out, outOff + 8); - int2bytes(state[1], out, outOff + 12); - return BLOCK_SIZE; - } - - public CamelliaEngine() - { - } - - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("only simple KeyParameter expected."); - } - - setKey(forEncryption, ((KeyParameter)params).getKey()); - initialised = true; - } - - public String getAlgorithmName() - { - return "Camellia"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (!initialised) - { - throw new IllegalStateException("Camellia engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (_keyIs128) - { - return processBlock128(in, inOff, out, outOff); - } - else - { - return processBlock192or256(in, inOff, out, outOff); - } - } - - public void reset() - { - // nothing - - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaLightEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaLightEngine.java deleted file mode 100644 index f24f950..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaLightEngine.java +++ /dev/null @@ -1,591 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * Camellia - based on RFC 3713, smaller implementation, about half the size of CamelliaEngine. - */ - -public class CamelliaLightEngine - implements BlockCipher -{ - private static final int BLOCK_SIZE = 16; - private static final int MASK8 = 0xff; - private boolean initialized; - private boolean _keyis128; - - private int[] subkey = new int[24 * 4]; - private int[] kw = new int[4 * 2]; // for whitening - private int[] ke = new int[6 * 2]; // for FL and FL^(-1) - private int[] state = new int[4]; // for encryption and decryption - - private static final int SIGMA[] = { - 0xa09e667f, 0x3bcc908b, - 0xb67ae858, 0x4caa73b2, - 0xc6ef372f, 0xe94f82be, - 0x54ff53a5, 0xf1d36f1c, - 0x10e527fa, 0xde682d1d, - 0xb05688c2, 0xb3e6c1fd - }; - - /* - * - * S-box data - * - */ - private static final byte SBOX1[] = { - (byte)112, (byte)130, (byte)44, (byte)236, - (byte)179, (byte)39, (byte)192, (byte)229, - (byte)228, (byte)133, (byte)87, (byte)53, - (byte)234, (byte)12, (byte)174, (byte)65, - (byte)35, (byte)239, (byte)107, (byte)147, - (byte)69, (byte)25, (byte)165, (byte)33, - (byte)237, (byte)14, (byte)79, (byte)78, - (byte)29, (byte)101, (byte)146, (byte)189, - (byte)134, (byte)184, (byte)175, (byte)143, - (byte)124, (byte)235, (byte)31, (byte)206, - (byte)62, (byte)48, (byte)220, (byte)95, - (byte)94, (byte)197, (byte)11, (byte)26, - (byte)166, (byte)225, (byte)57, (byte)202, - (byte)213, (byte)71, (byte)93, (byte)61, - (byte)217, (byte)1, (byte)90, (byte)214, - (byte)81, (byte)86, (byte)108, (byte)77, - (byte)139, (byte)13, (byte)154, (byte)102, - (byte)251, (byte)204, (byte)176, (byte)45, - (byte)116, (byte)18, (byte)43, (byte)32, - (byte)240, (byte)177, (byte)132, (byte)153, - (byte)223, (byte)76, (byte)203, (byte)194, - (byte)52, (byte)126, (byte)118, (byte)5, - (byte)109, (byte)183, (byte)169, (byte)49, - (byte)209, (byte)23, (byte)4, (byte)215, - (byte)20, (byte)88, (byte)58, (byte)97, - (byte)222, (byte)27, (byte)17, (byte)28, - (byte)50, (byte)15, (byte)156, (byte)22, - (byte)83, (byte)24, (byte)242, (byte)34, - (byte)254, (byte)68, (byte)207, (byte)178, - (byte)195, (byte)181, (byte)122, (byte)145, - (byte)36, (byte)8, (byte)232, (byte)168, - (byte)96, (byte)252, (byte)105, (byte)80, - (byte)170, (byte)208, (byte)160, (byte)125, - (byte)161, (byte)137, (byte)98, (byte)151, - (byte)84, (byte)91, (byte)30, (byte)149, - (byte)224, (byte)255, (byte)100, (byte)210, - (byte)16, (byte)196, (byte)0, (byte)72, - (byte)163, (byte)247, (byte)117, (byte)219, - (byte)138, (byte)3, (byte)230, (byte)218, - (byte)9, (byte)63, (byte)221, (byte)148, - (byte)135, (byte)92, (byte)131, (byte)2, - (byte)205, (byte)74, (byte)144, (byte)51, - (byte)115, (byte)103, (byte)246, (byte)243, - (byte)157, (byte)127, (byte)191, (byte)226, - (byte)82, (byte)155, (byte)216, (byte)38, - (byte)200, (byte)55, (byte)198, (byte)59, - (byte)129, (byte)150, (byte)111, (byte)75, - (byte)19, (byte)190, (byte)99, (byte)46, - (byte)233, (byte)121, (byte)167, (byte)140, - (byte)159, (byte)110, (byte)188, (byte)142, - (byte)41, (byte)245, (byte)249, (byte)182, - (byte)47, (byte)253, (byte)180, (byte)89, - (byte)120, (byte)152, (byte)6, (byte)106, - (byte)231, (byte)70, (byte)113, (byte)186, - (byte)212, (byte)37, (byte)171, (byte)66, - (byte)136, (byte)162, (byte)141, (byte)250, - (byte)114, (byte)7, (byte)185, (byte)85, - (byte)248, (byte)238, (byte)172, (byte)10, - (byte)54, (byte)73, (byte)42, (byte)104, - (byte)60, (byte)56, (byte)241, (byte)164, - (byte)64, (byte)40, (byte)211, (byte)123, - (byte)187, (byte)201, (byte)67, (byte)193, - (byte)21, (byte)227, (byte)173, (byte)244, - (byte)119, (byte)199, (byte)128, (byte)158 - }; - - private static int rightRotate(int x, int s) - { - return (((x) >>> (s)) + ((x) << (32 - s))); - } - - private static int leftRotate(int x, int s) - { - return ((x) << (s)) + ((x) >>> (32 - s)); - } - - private static void roldq(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[0 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >>> (32 - rot)); - ko[1 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >>> (32 - rot)); - ko[2 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >>> (32 - rot)); - ko[3 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >>> (32 - rot)); - ki[0 + ioff] = ko[0 + ooff]; - ki[1 + ioff] = ko[1 + ooff]; - ki[2 + ioff] = ko[2 + ooff]; - ki[3 + ioff] = ko[3 + ooff]; - } - - private static void decroldq(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[2 + ooff] = (ki[0 + ioff] << rot) | (ki[1 + ioff] >>> (32 - rot)); - ko[3 + ooff] = (ki[1 + ioff] << rot) | (ki[2 + ioff] >>> (32 - rot)); - ko[0 + ooff] = (ki[2 + ioff] << rot) | (ki[3 + ioff] >>> (32 - rot)); - ko[1 + ooff] = (ki[3 + ioff] << rot) | (ki[0 + ioff] >>> (32 - rot)); - ki[0 + ioff] = ko[2 + ooff]; - ki[1 + ioff] = ko[3 + ooff]; - ki[2 + ioff] = ko[0 + ooff]; - ki[3 + ioff] = ko[1 + ooff]; - } - - private static void roldqo32(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[0 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >>> (64 - rot)); - ko[1 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >>> (64 - rot)); - ko[2 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >>> (64 - rot)); - ko[3 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >>> (64 - rot)); - ki[0 + ioff] = ko[0 + ooff]; - ki[1 + ioff] = ko[1 + ooff]; - ki[2 + ioff] = ko[2 + ooff]; - ki[3 + ioff] = ko[3 + ooff]; - } - - private static void decroldqo32(int rot, int[] ki, int ioff, - int[] ko, int ooff) - { - ko[2 + ooff] = (ki[1 + ioff] << (rot - 32)) | (ki[2 + ioff] >>> (64 - rot)); - ko[3 + ooff] = (ki[2 + ioff] << (rot - 32)) | (ki[3 + ioff] >>> (64 - rot)); - ko[0 + ooff] = (ki[3 + ioff] << (rot - 32)) | (ki[0 + ioff] >>> (64 - rot)); - ko[1 + ooff] = (ki[0 + ioff] << (rot - 32)) | (ki[1 + ioff] >>> (64 - rot)); - ki[0 + ioff] = ko[2 + ooff]; - ki[1 + ioff] = ko[3 + ooff]; - ki[2 + ioff] = ko[0 + ooff]; - ki[3 + ioff] = ko[1 + ooff]; - } - - private int bytes2int(byte[] src, int offset) - { - int word = 0; - - for (int i = 0; i < 4; i++) - { - word = (word << 8) + (src[i + offset] & MASK8); - } - return word; - } - - private void int2bytes(int word, byte[] dst, int offset) - { - for (int i = 0; i < 4; i++) - { - dst[(3 - i) + offset] = (byte)word; - word >>>= 8; - } - } - - private byte lRot8(byte v, int rot) - { - return (byte)((v << rot) | ((v & 0xff) >>> (8 - rot))); - } - - private int sbox2(int x) - { - return (lRot8(SBOX1[x], 1) & MASK8); - } - - private int sbox3(int x) - { - return (lRot8(SBOX1[x], 7) & MASK8); - } - - private int sbox4(int x) - { - return (SBOX1[((int)lRot8((byte)x, 1) & MASK8)] & MASK8); - } - - private void camelliaF2(int[] s, int[] skey, int keyoff) - { - int t1, t2, u, v; - - t1 = s[0] ^ skey[0 + keyoff]; - u = sbox4((t1 & MASK8)); - u |= (sbox3(((t1 >>> 8) & MASK8)) << 8); - u |= (sbox2(((t1 >>> 16) & MASK8)) << 16); - u |= ((int)(SBOX1[((t1 >>> 24) & MASK8)] & MASK8) << 24); - - t2 = s[1] ^ skey[1 + keyoff]; - v = (int)SBOX1[(t2 & MASK8)] & MASK8; - v |= (sbox4(((t2 >>> 8) & MASK8)) << 8); - v |= (sbox3(((t2 >>> 16) & MASK8)) << 16); - v |= (sbox2(((t2 >>> 24) & MASK8)) << 24); - - v = leftRotate(v, 8); - u ^= v; - v = leftRotate(v, 8) ^ u; - u = rightRotate(u, 8) ^ v; - s[2] ^= leftRotate(v, 16) ^ u; - s[3] ^= leftRotate(u, 8); - - t1 = s[2] ^ skey[2 + keyoff]; - u = sbox4((t1 & MASK8)); - u |= sbox3(((t1 >>> 8) & MASK8)) << 8; - u |= sbox2(((t1 >>> 16) & MASK8)) << 16; - u |= ((int)SBOX1[((t1 >>> 24) & MASK8)] & MASK8) << 24; - - t2 = s[3] ^ skey[3 + keyoff]; - v = ((int)SBOX1[(t2 & MASK8)] & MASK8); - v |= sbox4(((t2 >>> 8) & MASK8)) << 8; - v |= sbox3(((t2 >>> 16) & MASK8)) << 16; - v |= sbox2(((t2 >>> 24) & MASK8)) << 24; - - v = leftRotate(v, 8); - u ^= v; - v = leftRotate(v, 8) ^ u; - u = rightRotate(u, 8) ^ v; - s[0] ^= leftRotate(v, 16) ^ u; - s[1] ^= leftRotate(u, 8); - } - - private void camelliaFLs(int[] s, int[] fkey, int keyoff) - { - - s[1] ^= leftRotate(s[0] & fkey[0 + keyoff], 1); - s[0] ^= fkey[1 + keyoff] | s[1]; - - s[2] ^= fkey[3 + keyoff] | s[3]; - s[3] ^= leftRotate(fkey[2 + keyoff] & s[2], 1); - } - - private void setKey(boolean forEncryption, byte[] key) - { - int[] k = new int[8]; - int[] ka = new int[4]; - int[] kb = new int[4]; - int[] t = new int[4]; - - switch (key.length) - { - case 16: - _keyis128 = true; - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = k[5] = k[6] = k[7] = 0; - break; - case 24: - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = bytes2int(key, 16); - k[5] = bytes2int(key, 20); - k[6] = ~k[4]; - k[7] = ~k[5]; - _keyis128 = false; - break; - case 32: - k[0] = bytes2int(key, 0); - k[1] = bytes2int(key, 4); - k[2] = bytes2int(key, 8); - k[3] = bytes2int(key, 12); - k[4] = bytes2int(key, 16); - k[5] = bytes2int(key, 20); - k[6] = bytes2int(key, 24); - k[7] = bytes2int(key, 28); - _keyis128 = false; - break; - default: - throw new - IllegalArgumentException("key sizes are only 16/24/32 bytes."); - } - - for (int i = 0; i < 4; i++) - { - ka[i] = k[i] ^ k[i + 4]; - } - /* compute KA */ - camelliaF2(ka, SIGMA, 0); - for (int i = 0; i < 4; i++) - { - ka[i] ^= k[i]; - } - camelliaF2(ka, SIGMA, 4); - - if (_keyis128) - { - if (forEncryption) - { - /* KL dependant keys */ - kw[0] = k[0]; - kw[1] = k[1]; - kw[2] = k[2]; - kw[3] = k[3]; - roldq(15, k, 0, subkey, 4); - roldq(30, k, 0, subkey, 12); - roldq(15, k, 0, t, 0); - subkey[18] = t[2]; - subkey[19] = t[3]; - roldq(17, k, 0, ke, 4); - roldq(17, k, 0, subkey, 24); - roldq(17, k, 0, subkey, 32); - /* KA dependant keys */ - subkey[0] = ka[0]; - subkey[1] = ka[1]; - subkey[2] = ka[2]; - subkey[3] = ka[3]; - roldq(15, ka, 0, subkey, 8); - roldq(15, ka, 0, ke, 0); - roldq(15, ka, 0, t, 0); - subkey[16] = t[0]; - subkey[17] = t[1]; - roldq(15, ka, 0, subkey, 20); - roldqo32(34, ka, 0, subkey, 28); - roldq(17, ka, 0, kw, 4); - - } - else - { // decryption - /* KL dependant keys */ - kw[4] = k[0]; - kw[5] = k[1]; - kw[6] = k[2]; - kw[7] = k[3]; - decroldq(15, k, 0, subkey, 28); - decroldq(30, k, 0, subkey, 20); - decroldq(15, k, 0, t, 0); - subkey[16] = t[0]; - subkey[17] = t[1]; - decroldq(17, k, 0, ke, 0); - decroldq(17, k, 0, subkey, 8); - decroldq(17, k, 0, subkey, 0); - /* KA dependant keys */ - subkey[34] = ka[0]; - subkey[35] = ka[1]; - subkey[32] = ka[2]; - subkey[33] = ka[3]; - decroldq(15, ka, 0, subkey, 24); - decroldq(15, ka, 0, ke, 4); - decroldq(15, ka, 0, t, 0); - subkey[18] = t[2]; - subkey[19] = t[3]; - decroldq(15, ka, 0, subkey, 12); - decroldqo32(34, ka, 0, subkey, 4); - roldq(17, ka, 0, kw, 0); - } - } - else - { // 192bit or 256bit - /* compute KB */ - for (int i = 0; i < 4; i++) - { - kb[i] = ka[i] ^ k[i + 4]; - } - camelliaF2(kb, SIGMA, 8); - - if (forEncryption) - { - /* KL dependant keys */ - kw[0] = k[0]; - kw[1] = k[1]; - kw[2] = k[2]; - kw[3] = k[3]; - roldqo32(45, k, 0, subkey, 16); - roldq(15, k, 0, ke, 4); - roldq(17, k, 0, subkey, 32); - roldqo32(34, k, 0, subkey, 44); - /* KR dependant keys */ - roldq(15, k, 4, subkey, 4); - roldq(15, k, 4, ke, 0); - roldq(30, k, 4, subkey, 24); - roldqo32(34, k, 4, subkey, 36); - /* KA dependant keys */ - roldq(15, ka, 0, subkey, 8); - roldq(30, ka, 0, subkey, 20); - /* 32bit rotation */ - ke[8] = ka[1]; - ke[9] = ka[2]; - ke[10] = ka[3]; - ke[11] = ka[0]; - roldqo32(49, ka, 0, subkey, 40); - - /* KB dependant keys */ - subkey[0] = kb[0]; - subkey[1] = kb[1]; - subkey[2] = kb[2]; - subkey[3] = kb[3]; - roldq(30, kb, 0, subkey, 12); - roldq(30, kb, 0, subkey, 28); - roldqo32(51, kb, 0, kw, 4); - - } - else - { // decryption - /* KL dependant keys */ - kw[4] = k[0]; - kw[5] = k[1]; - kw[6] = k[2]; - kw[7] = k[3]; - decroldqo32(45, k, 0, subkey, 28); - decroldq(15, k, 0, ke, 4); - decroldq(17, k, 0, subkey, 12); - decroldqo32(34, k, 0, subkey, 0); - /* KR dependant keys */ - decroldq(15, k, 4, subkey, 40); - decroldq(15, k, 4, ke, 8); - decroldq(30, k, 4, subkey, 20); - decroldqo32(34, k, 4, subkey, 8); - /* KA dependant keys */ - decroldq(15, ka, 0, subkey, 36); - decroldq(30, ka, 0, subkey, 24); - /* 32bit rotation */ - ke[2] = ka[1]; - ke[3] = ka[2]; - ke[0] = ka[3]; - ke[1] = ka[0]; - decroldqo32(49, ka, 0, subkey, 4); - - /* KB dependant keys */ - subkey[46] = kb[0]; - subkey[47] = kb[1]; - subkey[44] = kb[2]; - subkey[45] = kb[3]; - decroldq(30, kb, 0, subkey, 32); - decroldq(30, kb, 0, subkey, 16); - roldqo32(51, kb, 0, kw, 0); - } - } - } - - private int processBlock128(byte[] in, int inOff, - byte[] out, int outOff) - { - for (int i = 0; i < 4; i++) - { - state[i] = bytes2int(in, inOff + (i * 4)); - state[i] ^= kw[i]; - } - - camelliaF2(state, subkey, 0); - camelliaF2(state, subkey, 4); - camelliaF2(state, subkey, 8); - camelliaFLs(state, ke, 0); - camelliaF2(state, subkey, 12); - camelliaF2(state, subkey, 16); - camelliaF2(state, subkey, 20); - camelliaFLs(state, ke, 4); - camelliaF2(state, subkey, 24); - camelliaF2(state, subkey, 28); - camelliaF2(state, subkey, 32); - - state[2] ^= kw[4]; - state[3] ^= kw[5]; - state[0] ^= kw[6]; - state[1] ^= kw[7]; - - int2bytes(state[2], out, outOff); - int2bytes(state[3], out, outOff + 4); - int2bytes(state[0], out, outOff + 8); - int2bytes(state[1], out, outOff + 12); - - return BLOCK_SIZE; - } - - private int processBlock192or256(byte[] in, int inOff, - byte[] out, int outOff) - { - for (int i = 0; i < 4; i++) - { - state[i] = bytes2int(in, inOff + (i * 4)); - state[i] ^= kw[i]; - } - - camelliaF2(state, subkey, 0); - camelliaF2(state, subkey, 4); - camelliaF2(state, subkey, 8); - camelliaFLs(state, ke, 0); - camelliaF2(state, subkey, 12); - camelliaF2(state, subkey, 16); - camelliaF2(state, subkey, 20); - camelliaFLs(state, ke, 4); - camelliaF2(state, subkey, 24); - camelliaF2(state, subkey, 28); - camelliaF2(state, subkey, 32); - camelliaFLs(state, ke, 8); - camelliaF2(state, subkey, 36); - camelliaF2(state, subkey, 40); - camelliaF2(state, subkey, 44); - - state[2] ^= kw[4]; - state[3] ^= kw[5]; - state[0] ^= kw[6]; - state[1] ^= kw[7]; - - int2bytes(state[2], out, outOff); - int2bytes(state[3], out, outOff + 4); - int2bytes(state[0], out, outOff + 8); - int2bytes(state[1], out, outOff + 12); - return BLOCK_SIZE; - } - - public CamelliaLightEngine() - { - } - - public String getAlgorithmName() - { - return "Camellia"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public void init(boolean forEncryption, CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("only simple KeyParameter expected."); - } - - setKey(forEncryption, ((KeyParameter)params).getKey()); - initialized = true; - } - - public int processBlock(byte[] in, int inOff, - byte[] out, int outOff) - throws IllegalStateException - { - - if (!initialized) - { - throw new IllegalStateException("Camellia is not initialized"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (_keyis128) - { - return processBlock128(in, inOff, out, outOff); - } - else - { - return processBlock192or256(in, inOff, out, outOff); - } - } - - public void reset() - { - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaWrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaWrapEngine.java deleted file mode 100644 index d60444b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/CamelliaWrapEngine.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.crypto.engines; - -/** - * An implementation of the Camellia key wrapper based on RFC 3657/RFC 3394. - *

    - * For further details see: http://www.ietf.org/rfc/rfc3657.txt. - */ -public class CamelliaWrapEngine - extends RFC3394WrapEngine -{ - public CamelliaWrapEngine() - { - super(new CamelliaEngine()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESEngine.java deleted file mode 100644 index 40641d5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESEngine.java +++ /dev/null @@ -1,494 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * a class that provides a basic DES engine. - */ -public class DESEngine - implements BlockCipher -{ - protected static final int BLOCK_SIZE = 8; - - private int[] workingKey = null; - - /** - * standard constructor. - */ - public DESEngine() - { - } - - /** - * initialise a DES cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - if (((KeyParameter)params).getKey().length > 8) - { - throw new IllegalArgumentException("DES key too long - should be 8 bytes"); - } - - workingKey = generateWorkingKey(encrypting, - ((KeyParameter)params).getKey()); - - return; - } - - throw new IllegalArgumentException("invalid parameter passed to DES init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "DES"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("DES engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - desFunc(workingKey, in, inOff, out, outOff); - - return BLOCK_SIZE; - } - - public void reset() - { - } - - /** - * what follows is mainly taken from "Applied Cryptography", by - * Bruce Schneier, however it also bears great resemblance to Richard - * Outerbridge's D3DES... - */ - -// private static final short[] Df_Key = -// { -// 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, -// 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10, -// 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 -// }; - - private static final short[] bytebit = - { - 0200, 0100, 040, 020, 010, 04, 02, 01 - }; - - private static final int[] bigbyte = - { - 0x800000, 0x400000, 0x200000, 0x100000, - 0x80000, 0x40000, 0x20000, 0x10000, - 0x8000, 0x4000, 0x2000, 0x1000, - 0x800, 0x400, 0x200, 0x100, - 0x80, 0x40, 0x20, 0x10, - 0x8, 0x4, 0x2, 0x1 - }; - - /* - * Use the key schedule specified in the Standard (ANSI X3.92-1981). - */ - - private static final byte[] pc1 = - { - 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, - 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, - 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, - 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 - }; - - private static final byte[] totrot = - { - 1, 2, 4, 6, 8, 10, 12, 14, - 15, 17, 19, 21, 23, 25, 27, 28 - }; - - private static final byte[] pc2 = - { - 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, - 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, - 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, - 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 - }; - - private static final int[] SP1 = { - 0x01010400, 0x00000000, 0x00010000, 0x01010404, - 0x01010004, 0x00010404, 0x00000004, 0x00010000, - 0x00000400, 0x01010400, 0x01010404, 0x00000400, - 0x01000404, 0x01010004, 0x01000000, 0x00000004, - 0x00000404, 0x01000400, 0x01000400, 0x00010400, - 0x00010400, 0x01010000, 0x01010000, 0x01000404, - 0x00010004, 0x01000004, 0x01000004, 0x00010004, - 0x00000000, 0x00000404, 0x00010404, 0x01000000, - 0x00010000, 0x01010404, 0x00000004, 0x01010000, - 0x01010400, 0x01000000, 0x01000000, 0x00000400, - 0x01010004, 0x00010000, 0x00010400, 0x01000004, - 0x00000400, 0x00000004, 0x01000404, 0x00010404, - 0x01010404, 0x00010004, 0x01010000, 0x01000404, - 0x01000004, 0x00000404, 0x00010404, 0x01010400, - 0x00000404, 0x01000400, 0x01000400, 0x00000000, - 0x00010004, 0x00010400, 0x00000000, 0x01010004 - }; - - private static final int[] SP2 = { - 0x80108020, 0x80008000, 0x00008000, 0x00108020, - 0x00100000, 0x00000020, 0x80100020, 0x80008020, - 0x80000020, 0x80108020, 0x80108000, 0x80000000, - 0x80008000, 0x00100000, 0x00000020, 0x80100020, - 0x00108000, 0x00100020, 0x80008020, 0x00000000, - 0x80000000, 0x00008000, 0x00108020, 0x80100000, - 0x00100020, 0x80000020, 0x00000000, 0x00108000, - 0x00008020, 0x80108000, 0x80100000, 0x00008020, - 0x00000000, 0x00108020, 0x80100020, 0x00100000, - 0x80008020, 0x80100000, 0x80108000, 0x00008000, - 0x80100000, 0x80008000, 0x00000020, 0x80108020, - 0x00108020, 0x00000020, 0x00008000, 0x80000000, - 0x00008020, 0x80108000, 0x00100000, 0x80000020, - 0x00100020, 0x80008020, 0x80000020, 0x00100020, - 0x00108000, 0x00000000, 0x80008000, 0x00008020, - 0x80000000, 0x80100020, 0x80108020, 0x00108000 - }; - - private static final int[] SP3 = { - 0x00000208, 0x08020200, 0x00000000, 0x08020008, - 0x08000200, 0x00000000, 0x00020208, 0x08000200, - 0x00020008, 0x08000008, 0x08000008, 0x00020000, - 0x08020208, 0x00020008, 0x08020000, 0x00000208, - 0x08000000, 0x00000008, 0x08020200, 0x00000200, - 0x00020200, 0x08020000, 0x08020008, 0x00020208, - 0x08000208, 0x00020200, 0x00020000, 0x08000208, - 0x00000008, 0x08020208, 0x00000200, 0x08000000, - 0x08020200, 0x08000000, 0x00020008, 0x00000208, - 0x00020000, 0x08020200, 0x08000200, 0x00000000, - 0x00000200, 0x00020008, 0x08020208, 0x08000200, - 0x08000008, 0x00000200, 0x00000000, 0x08020008, - 0x08000208, 0x00020000, 0x08000000, 0x08020208, - 0x00000008, 0x00020208, 0x00020200, 0x08000008, - 0x08020000, 0x08000208, 0x00000208, 0x08020000, - 0x00020208, 0x00000008, 0x08020008, 0x00020200 - }; - - private static final int[] SP4 = { - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802080, 0x00800081, 0x00800001, 0x00002001, - 0x00000000, 0x00802000, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00800080, 0x00800001, - 0x00000001, 0x00002000, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002001, 0x00002080, - 0x00800081, 0x00000001, 0x00002080, 0x00800080, - 0x00002000, 0x00802080, 0x00802081, 0x00000081, - 0x00800080, 0x00800001, 0x00802000, 0x00802081, - 0x00000081, 0x00000000, 0x00000000, 0x00802000, - 0x00002080, 0x00800080, 0x00800081, 0x00000001, - 0x00802001, 0x00002081, 0x00002081, 0x00000080, - 0x00802081, 0x00000081, 0x00000001, 0x00002000, - 0x00800001, 0x00002001, 0x00802080, 0x00800081, - 0x00002001, 0x00002080, 0x00800000, 0x00802001, - 0x00000080, 0x00800000, 0x00002000, 0x00802080 - }; - - private static final int[] SP5 = { - 0x00000100, 0x02080100, 0x02080000, 0x42000100, - 0x00080000, 0x00000100, 0x40000000, 0x02080000, - 0x40080100, 0x00080000, 0x02000100, 0x40080100, - 0x42000100, 0x42080000, 0x00080100, 0x40000000, - 0x02000000, 0x40080000, 0x40080000, 0x00000000, - 0x40000100, 0x42080100, 0x42080100, 0x02000100, - 0x42080000, 0x40000100, 0x00000000, 0x42000000, - 0x02080100, 0x02000000, 0x42000000, 0x00080100, - 0x00080000, 0x42000100, 0x00000100, 0x02000000, - 0x40000000, 0x02080000, 0x42000100, 0x40080100, - 0x02000100, 0x40000000, 0x42080000, 0x02080100, - 0x40080100, 0x00000100, 0x02000000, 0x42080000, - 0x42080100, 0x00080100, 0x42000000, 0x42080100, - 0x02080000, 0x00000000, 0x40080000, 0x42000000, - 0x00080100, 0x02000100, 0x40000100, 0x00080000, - 0x00000000, 0x40080000, 0x02080100, 0x40000100 - }; - - private static final int[] SP6 = { - 0x20000010, 0x20400000, 0x00004000, 0x20404010, - 0x20400000, 0x00000010, 0x20404010, 0x00400000, - 0x20004000, 0x00404010, 0x00400000, 0x20000010, - 0x00400010, 0x20004000, 0x20000000, 0x00004010, - 0x00000000, 0x00400010, 0x20004010, 0x00004000, - 0x00404000, 0x20004010, 0x00000010, 0x20400010, - 0x20400010, 0x00000000, 0x00404010, 0x20404000, - 0x00004010, 0x00404000, 0x20404000, 0x20000000, - 0x20004000, 0x00000010, 0x20400010, 0x00404000, - 0x20404010, 0x00400000, 0x00004010, 0x20000010, - 0x00400000, 0x20004000, 0x20000000, 0x00004010, - 0x20000010, 0x20404010, 0x00404000, 0x20400000, - 0x00404010, 0x20404000, 0x00000000, 0x20400010, - 0x00000010, 0x00004000, 0x20400000, 0x00404010, - 0x00004000, 0x00400010, 0x20004010, 0x00000000, - 0x20404000, 0x20000000, 0x00400010, 0x20004010 - }; - - private static final int[] SP7 = { - 0x00200000, 0x04200002, 0x04000802, 0x00000000, - 0x00000800, 0x04000802, 0x00200802, 0x04200800, - 0x04200802, 0x00200000, 0x00000000, 0x04000002, - 0x00000002, 0x04000000, 0x04200002, 0x00000802, - 0x04000800, 0x00200802, 0x00200002, 0x04000800, - 0x04000002, 0x04200000, 0x04200800, 0x00200002, - 0x04200000, 0x00000800, 0x00000802, 0x04200802, - 0x00200800, 0x00000002, 0x04000000, 0x00200800, - 0x04000000, 0x00200800, 0x00200000, 0x04000802, - 0x04000802, 0x04200002, 0x04200002, 0x00000002, - 0x00200002, 0x04000000, 0x04000800, 0x00200000, - 0x04200800, 0x00000802, 0x00200802, 0x04200800, - 0x00000802, 0x04000002, 0x04200802, 0x04200000, - 0x00200800, 0x00000000, 0x00000002, 0x04200802, - 0x00000000, 0x00200802, 0x04200000, 0x00000800, - 0x04000002, 0x04000800, 0x00000800, 0x00200002 - }; - - private static final int[] SP8 = { - 0x10001040, 0x00001000, 0x00040000, 0x10041040, - 0x10000000, 0x10001040, 0x00000040, 0x10000000, - 0x00040040, 0x10040000, 0x10041040, 0x00041000, - 0x10041000, 0x00041040, 0x00001000, 0x00000040, - 0x10040000, 0x10000040, 0x10001000, 0x00001040, - 0x00041000, 0x00040040, 0x10040040, 0x10041000, - 0x00001040, 0x00000000, 0x00000000, 0x10040040, - 0x10000040, 0x10001000, 0x00041040, 0x00040000, - 0x00041040, 0x00040000, 0x10041000, 0x00001000, - 0x00000040, 0x10040040, 0x00001000, 0x00041040, - 0x10001000, 0x00000040, 0x10000040, 0x10040000, - 0x10040040, 0x10000000, 0x00040000, 0x10001040, - 0x00000000, 0x10041040, 0x00040040, 0x10000040, - 0x10040000, 0x10001000, 0x10001040, 0x00000000, - 0x10041040, 0x00041000, 0x00041000, 0x00001040, - 0x00001040, 0x00040040, 0x10000000, 0x10041000 - }; - - /** - * generate an integer based working key based on our secret key - * and what we processing we are planning to do. - * - * Acknowledgements for this routine go to James Gillogly & Phil Karn. - * (whoever, and wherever they are!). - */ - protected int[] generateWorkingKey( - boolean encrypting, - byte[] key) - { - int[] newKey = new int[32]; - boolean[] pc1m = new boolean[56], - pcr = new boolean[56]; - - for (int j = 0; j < 56; j++) - { - int l = pc1[j]; - - pc1m[j] = ((key[l >>> 3] & bytebit[l & 07]) != 0); - } - - for (int i = 0; i < 16; i++) - { - int l, m, n; - - if (encrypting) - { - m = i << 1; - } - else - { - m = (15 - i) << 1; - } - - n = m + 1; - newKey[m] = newKey[n] = 0; - - for (int j = 0; j < 28; j++) - { - l = j + totrot[i]; - if (l < 28) - { - pcr[j] = pc1m[l]; - } - else - { - pcr[j] = pc1m[l - 28]; - } - } - - for (int j = 28; j < 56; j++) - { - l = j + totrot[i]; - if (l < 56) - { - pcr[j] = pc1m[l]; - } - else - { - pcr[j] = pc1m[l - 28]; - } - } - - for (int j = 0; j < 24; j++) - { - if (pcr[pc2[j]]) - { - newKey[m] |= bigbyte[j]; - } - - if (pcr[pc2[j + 24]]) - { - newKey[n] |= bigbyte[j]; - } - } - } - - // - // store the processed key - // - for (int i = 0; i != 32; i += 2) - { - int i1, i2; - - i1 = newKey[i]; - i2 = newKey[i + 1]; - - newKey[i] = ((i1 & 0x00fc0000) << 6) | ((i1 & 0x00000fc0) << 10) - | ((i2 & 0x00fc0000) >>> 10) | ((i2 & 0x00000fc0) >>> 6); - - newKey[i + 1] = ((i1 & 0x0003f000) << 12) | ((i1 & 0x0000003f) << 16) - | ((i2 & 0x0003f000) >>> 4) | (i2 & 0x0000003f); - } - - return newKey; - } - - /** - * the DES engine. - */ - protected void desFunc( - int[] wKey, - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int work, right, left; - - left = (in[inOff + 0] & 0xff) << 24; - left |= (in[inOff + 1] & 0xff) << 16; - left |= (in[inOff + 2] & 0xff) << 8; - left |= (in[inOff + 3] & 0xff); - - right = (in[inOff + 4] & 0xff) << 24; - right |= (in[inOff + 5] & 0xff) << 16; - right |= (in[inOff + 6] & 0xff) << 8; - right |= (in[inOff + 7] & 0xff); - - work = ((left >>> 4) ^ right) & 0x0f0f0f0f; - right ^= work; - left ^= (work << 4); - work = ((left >>> 16) ^ right) & 0x0000ffff; - right ^= work; - left ^= (work << 16); - work = ((right >>> 2) ^ left) & 0x33333333; - left ^= work; - right ^= (work << 2); - work = ((right >>> 8) ^ left) & 0x00ff00ff; - left ^= work; - right ^= (work << 8); - right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff; - work = (left ^ right) & 0xaaaaaaaa; - left ^= work; - right ^= work; - left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff; - - for (int round = 0; round < 8; round++) - { - int fval; - - work = (right << 28) | (right >>> 4); - work ^= wKey[round * 4 + 0]; - fval = SP7[ work & 0x3f]; - fval |= SP5[(work >>> 8) & 0x3f]; - fval |= SP3[(work >>> 16) & 0x3f]; - fval |= SP1[(work >>> 24) & 0x3f]; - work = right ^ wKey[round * 4 + 1]; - fval |= SP8[ work & 0x3f]; - fval |= SP6[(work >>> 8) & 0x3f]; - fval |= SP4[(work >>> 16) & 0x3f]; - fval |= SP2[(work >>> 24) & 0x3f]; - left ^= fval; - work = (left << 28) | (left >>> 4); - work ^= wKey[round * 4 + 2]; - fval = SP7[ work & 0x3f]; - fval |= SP5[(work >>> 8) & 0x3f]; - fval |= SP3[(work >>> 16) & 0x3f]; - fval |= SP1[(work >>> 24) & 0x3f]; - work = left ^ wKey[round * 4 + 3]; - fval |= SP8[ work & 0x3f]; - fval |= SP6[(work >>> 8) & 0x3f]; - fval |= SP4[(work >>> 16) & 0x3f]; - fval |= SP2[(work >>> 24) & 0x3f]; - right ^= fval; - } - - right = (right << 31) | (right >>> 1); - work = (left ^ right) & 0xaaaaaaaa; - left ^= work; - right ^= work; - left = (left << 31) | (left >>> 1); - work = ((left >>> 8) ^ right) & 0x00ff00ff; - right ^= work; - left ^= (work << 8); - work = ((left >>> 2) ^ right) & 0x33333333; - right ^= work; - left ^= (work << 2); - work = ((right >>> 16) ^ left) & 0x0000ffff; - left ^= work; - right ^= (work << 16); - work = ((right >>> 4) ^ left) & 0x0f0f0f0f; - left ^= work; - right ^= (work << 4); - - out[outOff + 0] = (byte)((right >>> 24) & 0xff); - out[outOff + 1] = (byte)((right >>> 16) & 0xff); - out[outOff + 2] = (byte)((right >>> 8) & 0xff); - out[outOff + 3] = (byte)(right & 0xff); - out[outOff + 4] = (byte)((left >>> 24) & 0xff); - out[outOff + 5] = (byte)((left >>> 16) & 0xff); - out[outOff + 6] = (byte)((left >>> 8) & 0xff); - out[outOff + 7] = (byte)(left & 0xff); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeEngine.java deleted file mode 100644 index c3d789c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeEngine.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * a class that provides a basic DESede (or Triple DES) engine. - */ -public class DESedeEngine - extends DESEngine -{ - protected static final int BLOCK_SIZE = 8; - - private int[] workingKey1 = null; - private int[] workingKey2 = null; - private int[] workingKey3 = null; - - private boolean forEncryption; - - /** - * standard constructor. - */ - public DESedeEngine() - { - } - - /** - * initialise a DESede cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to DESede init - " + params.getClass().getName()); - } - - byte[] keyMaster = ((KeyParameter)params).getKey(); - - if (keyMaster.length != 24 && keyMaster.length != 16) - { - throw new IllegalArgumentException("key size must be 16 or 24 bytes."); - } - - this.forEncryption = encrypting; - - byte[] key1 = new byte[8]; - System.arraycopy(keyMaster, 0, key1, 0, key1.length); - workingKey1 = generateWorkingKey(encrypting, key1); - - byte[] key2 = new byte[8]; - System.arraycopy(keyMaster, 8, key2, 0, key2.length); - workingKey2 = generateWorkingKey(!encrypting, key2); - - if (keyMaster.length == 24) - { - byte[] key3 = new byte[8]; - System.arraycopy(keyMaster, 16, key3, 0, key3.length); - workingKey3 = generateWorkingKey(encrypting, key3); - } - else // 16 byte key - { - workingKey3 = workingKey1; - } - } - - public String getAlgorithmName() - { - return "DESede"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey1 == null) - { - throw new IllegalStateException("DESede engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - byte[] temp = new byte[BLOCK_SIZE]; - - if (forEncryption) - { - desFunc(workingKey1, in, inOff, temp, 0); - desFunc(workingKey2, temp, 0, temp, 0); - desFunc(workingKey3, temp, 0, out, outOff); - } - else - { - desFunc(workingKey3, in, inOff, temp, 0); - desFunc(workingKey2, temp, 0, temp, 0); - desFunc(workingKey1, temp, 0, out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeWrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeWrapEngine.java deleted file mode 100644 index ccbf7d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/DESedeWrapEngine.java +++ /dev/null @@ -1,348 +0,0 @@ -package org.bc.crypto.engines; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Wrapper; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - -/** - * Wrap keys according to - * - * draft-ietf-smime-key-wrap-01.txt. - *

    - * Note: - *

      - *
    • this is based on a draft, and as such is subject to change - don't use this class for anything requiring long term storage. - *
    • if you are using this to wrap triple-des keys you need to set the - * parity bits on the key and, if it's a two-key triple-des key, pad it - * yourself. - *
    - */ -public class DESedeWrapEngine - implements Wrapper -{ - /** Field engine */ - private CBCBlockCipher engine; - - /** Field param */ - private KeyParameter param; - - /** Field paramPlusIV */ - private ParametersWithIV paramPlusIV; - - /** Field iv */ - private byte[] iv; - - /** Field forWrapping */ - private boolean forWrapping; - - /** Field IV2 */ - private static final byte[] IV2 = { (byte) 0x4a, (byte) 0xdd, (byte) 0xa2, - (byte) 0x2c, (byte) 0x79, (byte) 0xe8, - (byte) 0x21, (byte) 0x05 }; - - // - // checksum digest - // - Digest sha1 = new SHA1Digest(); - byte[] digest = new byte[20]; - - /** - * Method init - * - * @param forWrapping - * @param param - */ - public void init(boolean forWrapping, CipherParameters param) - { - - this.forWrapping = forWrapping; - this.engine = new CBCBlockCipher(new DESedeEngine()); - - SecureRandom sr; - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom pr = (ParametersWithRandom) param; - param = pr.getParameters(); - sr = pr.getRandom(); - } - else - { - sr = new SecureRandom(); - } - - if (param instanceof KeyParameter) - { - this.param = (KeyParameter)param; - - if (this.forWrapping) - { - - // Hm, we have no IV but we want to wrap ?!? - // well, then we have to create our own IV. - this.iv = new byte[8]; - sr.nextBytes(iv); - - this.paramPlusIV = new ParametersWithIV(this.param, this.iv); - } - } - else if (param instanceof ParametersWithIV) - { - this.paramPlusIV = (ParametersWithIV)param; - this.iv = this.paramPlusIV.getIV(); - this.param = (KeyParameter)this.paramPlusIV.getParameters(); - - if (this.forWrapping) - { - if ((this.iv == null) || (this.iv.length != 8)) - { - throw new IllegalArgumentException("IV is not 8 octets"); - } - } - else - { - throw new IllegalArgumentException( - "You should not supply an IV for unwrapping"); - } - } - } - - /** - * Method getAlgorithmName - * - * @return the algorithm name "DESede". - */ - public String getAlgorithmName() - { - return "DESede"; - } - - /** - * Method wrap - * - * @param in - * @param inOff - * @param inLen - * @return the wrapped bytes. - */ - public byte[] wrap(byte[] in, int inOff, int inLen) - { - if (!forWrapping) - { - throw new IllegalStateException("Not initialized for wrapping"); - } - - byte keyToBeWrapped[] = new byte[inLen]; - - System.arraycopy(in, inOff, keyToBeWrapped, 0, inLen); - - // Compute the CMS Key Checksum, (section 5.6.1), call this CKS. - byte[] CKS = calculateCMSKeyChecksum(keyToBeWrapped); - - // Let WKCKS = WK || CKS where || is concatenation. - byte[] WKCKS = new byte[keyToBeWrapped.length + CKS.length]; - - System.arraycopy(keyToBeWrapped, 0, WKCKS, 0, keyToBeWrapped.length); - System.arraycopy(CKS, 0, WKCKS, keyToBeWrapped.length, CKS.length); - - // Encrypt WKCKS in CBC mode using KEK as the key and IV as the - // initialization vector. Call the results TEMP1. - - int blockSize = engine.getBlockSize(); - - if (WKCKS.length % blockSize != 0) - { - throw new IllegalStateException("Not multiple of block length"); - } - - engine.init(true, paramPlusIV); - - byte TEMP1[] = new byte[WKCKS.length]; - - for (int currentBytePos = 0; currentBytePos != WKCKS.length; currentBytePos += blockSize) - { - engine.processBlock(WKCKS, currentBytePos, TEMP1, currentBytePos); - } - - // Let TEMP2 = IV || TEMP1. - byte[] TEMP2 = new byte[this.iv.length + TEMP1.length]; - - System.arraycopy(this.iv, 0, TEMP2, 0, this.iv.length); - System.arraycopy(TEMP1, 0, TEMP2, this.iv.length, TEMP1.length); - - // Reverse the order of the octets in TEMP2 and call the result TEMP3. - byte[] TEMP3 = reverse(TEMP2); - - // Encrypt TEMP3 in CBC mode using the KEK and an initialization vector - // of 0x 4a dd a2 2c 79 e8 21 05. The resulting cipher text is the desired - // result. It is 40 octets long if a 168 bit key is being wrapped. - ParametersWithIV param2 = new ParametersWithIV(this.param, IV2); - - this.engine.init(true, param2); - - for (int currentBytePos = 0; currentBytePos != TEMP3.length; currentBytePos += blockSize) - { - engine.processBlock(TEMP3, currentBytePos, TEMP3, currentBytePos); - } - - return TEMP3; - } - - /** - * Method unwrap - * - * @param in - * @param inOff - * @param inLen - * @return the unwrapped bytes. - * @throws InvalidCipherTextException - */ - public byte[] unwrap(byte[] in, int inOff, int inLen) - throws InvalidCipherTextException - { - if (forWrapping) - { - throw new IllegalStateException("Not set for unwrapping"); - } - - if (in == null) - { - throw new InvalidCipherTextException("Null pointer as ciphertext"); - } - - final int blockSize = engine.getBlockSize(); - if (inLen % blockSize != 0) - { - throw new InvalidCipherTextException("Ciphertext not multiple of " + blockSize); - } - - /* - // Check if the length of the cipher text is reasonable given the key - // type. It must be 40 bytes for a 168 bit key and either 32, 40, or - // 48 bytes for a 128, 192, or 256 bit key. If the length is not supported - // or inconsistent with the algorithm for which the key is intended, - // return error. - // - // we do not accept 168 bit keys. it has to be 192 bit. - int lengthA = (estimatedKeyLengthInBit / 8) + 16; - int lengthB = estimatedKeyLengthInBit % 8; - - if ((lengthA != keyToBeUnwrapped.length) || (lengthB != 0)) { - throw new XMLSecurityException("empty"); - } - */ - - // Decrypt the cipher text with TRIPLedeS in CBC mode using the KEK - // and an initialization vector (IV) of 0x4adda22c79e82105. Call the output TEMP3. - ParametersWithIV param2 = new ParametersWithIV(this.param, IV2); - - this.engine.init(false, param2); - - byte TEMP3[] = new byte[inLen]; - - for (int currentBytePos = 0; currentBytePos != inLen; currentBytePos += blockSize) - { - engine.processBlock(in, inOff + currentBytePos, TEMP3, currentBytePos); - } - - // Reverse the order of the octets in TEMP3 and call the result TEMP2. - byte[] TEMP2 = reverse(TEMP3); - - // Decompose TEMP2 into IV, the first 8 octets, and TEMP1, the remaining octets. - this.iv = new byte[8]; - - byte[] TEMP1 = new byte[TEMP2.length - 8]; - - System.arraycopy(TEMP2, 0, this.iv, 0, 8); - System.arraycopy(TEMP2, 8, TEMP1, 0, TEMP2.length - 8); - - // Decrypt TEMP1 using TRIPLedeS in CBC mode using the KEK and the IV - // found in the previous step. Call the result WKCKS. - this.paramPlusIV = new ParametersWithIV(this.param, this.iv); - - this.engine.init(false, this.paramPlusIV); - - byte[] WKCKS = new byte[TEMP1.length]; - - for (int currentBytePos = 0; currentBytePos != WKCKS.length; currentBytePos += blockSize) - { - engine.processBlock(TEMP1, currentBytePos, WKCKS, currentBytePos); - } - - // Decompose WKCKS. CKS is the last 8 octets and WK, the wrapped key, are - // those octets before the CKS. - byte[] result = new byte[WKCKS.length - 8]; - byte[] CKStoBeVerified = new byte[8]; - - System.arraycopy(WKCKS, 0, result, 0, WKCKS.length - 8); - System.arraycopy(WKCKS, WKCKS.length - 8, CKStoBeVerified, 0, 8); - - // Calculate a CMS Key Checksum, (section 5.6.1), over the WK and compare - // with the CKS extracted in the above step. If they are not equal, return error. - if (!checkCMSKeyChecksum(result, CKStoBeVerified)) - { - throw new InvalidCipherTextException( - "Checksum inside ciphertext is corrupted"); - } - - // WK is the wrapped key, now extracted for use in data decryption. - return result; - } - - /** - * Some key wrap algorithms make use of the Key Checksum defined - * in CMS [CMS-Algorithms]. This is used to provide an integrity - * check value for the key being wrapped. The algorithm is - * - * - Compute the 20 octet SHA-1 hash on the key being wrapped. - * - Use the first 8 octets of this hash as the checksum value. - * - * @param key - * @return the CMS checksum. - * @throws RuntimeException - * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum - */ - private byte[] calculateCMSKeyChecksum( - byte[] key) - { - byte[] result = new byte[8]; - - sha1.update(key, 0, key.length); - sha1.doFinal(digest, 0); - - System.arraycopy(digest, 0, result, 0, 8); - - return result; - } - - /** - * @param key - * @param checksum - * @return true if okay, false otherwise. - * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum - */ - private boolean checkCMSKeyChecksum( - byte[] key, - byte[] checksum) - { - return Arrays.constantTimeAreEqual(calculateCMSKeyChecksum(key), checksum); - } - - private static byte[] reverse(byte[] bs) - { - byte[] result = new byte[bs.length]; - for (int i = 0; i < bs.length; i++) - { - result[i] = bs[bs.length - (i + 1)]; - } - return result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ElGamalEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ElGamalEngine.java deleted file mode 100644 index 914ba46..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ElGamalEngine.java +++ /dev/null @@ -1,217 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ElGamalKeyParameters; -import org.bc.crypto.params.ElGamalPrivateKeyParameters; -import org.bc.crypto.params.ElGamalPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.BigIntegers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * this does your basic ElGamal algorithm. - */ -public class ElGamalEngine - implements AsymmetricBlockCipher -{ - private ElGamalKeyParameters key; - private SecureRandom random; - private boolean forEncryption; - private int bitSize; - - private static final BigInteger ZERO = BigInteger.valueOf(0); - private static final BigInteger ONE = BigInteger.valueOf(1); - private static final BigInteger TWO = BigInteger.valueOf(2); - - /** - * initialise the ElGamal engine. - * - * @param forEncryption true if we are encrypting, false otherwise. - * @param param the necessary ElGamal key parameters. - */ - public void init( - boolean forEncryption, - CipherParameters param) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)param; - - this.key = (ElGamalKeyParameters)p.getParameters(); - this.random = p.getRandom(); - } - else - { - this.key = (ElGamalKeyParameters)param; - this.random = new SecureRandom(); - } - - this.forEncryption = forEncryption; - - BigInteger p = key.getParameters().getP(); - - bitSize = p.bitLength(); - - if (forEncryption) - { - if (!(key instanceof ElGamalPublicKeyParameters)) - { - throw new IllegalArgumentException("ElGamalPublicKeyParameters are required for encryption."); - } - } - else - { - if (!(key instanceof ElGamalPrivateKeyParameters)) - { - throw new IllegalArgumentException("ElGamalPrivateKeyParameters are required for decryption."); - } - } - } - - /** - * Return the maximum size for an input block to this engine. - * For ElGamal this is always one byte less than the size of P on - * encryption, and twice the length as the size of P on decryption. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - if (forEncryption) - { - return (bitSize - 1) / 8; - } - - return 2 * ((bitSize + 7) / 8); - } - - /** - * Return the maximum size for an output block to this engine. - * For ElGamal this is always one byte less than the size of P on - * decryption, and twice the length as the size of P on encryption. - * - * @return maximum size for an output block. - */ - public int getOutputBlockSize() - { - if (forEncryption) - { - return 2 * ((bitSize + 7) / 8); - } - - return (bitSize - 1) / 8; - } - - /** - * Process a single block using the basic ElGamal algorithm. - * - * @param in the input array. - * @param inOff the offset into the input buffer where the data starts. - * @param inLen the length of the data to be processed. - * @return the result of the ElGamal process. - * @exception DataLengthException the input block is too large. - */ - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - { - if (key == null) - { - throw new IllegalStateException("ElGamal engine not initialised"); - } - - int maxLength = forEncryption - ? (bitSize - 1 + 7) / 8 - : getInputBlockSize(); - - if (inLen > maxLength) - { - throw new DataLengthException("input too large for ElGamal cipher.\n"); - } - - BigInteger p = key.getParameters().getP(); - - if (key instanceof ElGamalPrivateKeyParameters) // decryption - { - byte[] in1 = new byte[inLen / 2]; - byte[] in2 = new byte[inLen / 2]; - - System.arraycopy(in, inOff, in1, 0, in1.length); - System.arraycopy(in, inOff + in1.length, in2, 0, in2.length); - - BigInteger gamma = new BigInteger(1, in1); - BigInteger phi = new BigInteger(1, in2); - - ElGamalPrivateKeyParameters priv = (ElGamalPrivateKeyParameters)key; - // a shortcut, which generally relies on p being prime amongst other things. - // if a problem with this shows up, check the p and g values! - BigInteger m = gamma.modPow(p.subtract(ONE).subtract(priv.getX()), p).multiply(phi).mod(p); - - return BigIntegers.asUnsignedByteArray(m); - } - else // encryption - { - byte[] block; - if (inOff != 0 || inLen != in.length) - { - block = new byte[inLen]; - - System.arraycopy(in, inOff, block, 0, inLen); - } - else - { - block = in; - } - - BigInteger input = new BigInteger(1, block); - - if (input.bitLength() >= p.bitLength()) - { - throw new DataLengthException("input too large for ElGamal cipher.\n"); - } - - ElGamalPublicKeyParameters pub = (ElGamalPublicKeyParameters)key; - - int pBitLength = p.bitLength(); - BigInteger k = new BigInteger(pBitLength, random); - - while (k.equals(ZERO) || (k.compareTo(p.subtract(TWO)) > 0)) - { - k = new BigInteger(pBitLength, random); - } - - BigInteger g = key.getParameters().getG(); - BigInteger gamma = g.modPow(k, p); - BigInteger phi = input.multiply(pub.getY().modPow(k, p)).mod(p); - - byte[] out1 = gamma.toByteArray(); - byte[] out2 = phi.toByteArray(); - byte[] output = new byte[this.getOutputBlockSize()]; - - if (out1.length > output.length / 2) - { - System.arraycopy(out1, 1, output, output.length / 2 - (out1.length - 1), out1.length - 1); - } - else - { - System.arraycopy(out1, 0, output, output.length / 2 - out1.length, out1.length); - } - - if (out2.length > output.length / 2) - { - System.arraycopy(out2, 1, output, output.length - (out2.length - 1), out2.length - 1); - } - else - { - System.arraycopy(out2, 0, output, output.length - out2.length, out2.length); - } - - return output; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/GOST28147Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/GOST28147Engine.java deleted file mode 100644 index 28131da..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/GOST28147Engine.java +++ /dev/null @@ -1,371 +0,0 @@ -package org.bc.crypto.engines; - -import java.util.Hashtable; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithSBox; -import org.bc.util.Arrays; -import org.bc.util.Strings; - -/** - * implementation of GOST 28147-89 - */ -public class GOST28147Engine - implements BlockCipher -{ - protected static final int BLOCK_SIZE = 8; - private int[] workingKey = null; - private boolean forEncryption; - - private byte[] S = Sbox_Default; - - // these are the S-boxes given in Applied Cryptography 2nd Ed., p. 333 - // This is default S-box! - private static byte Sbox_Default[] = { - 0x4,0xA,0x9,0x2,0xD,0x8,0x0,0xE,0x6,0xB,0x1,0xC,0x7,0xF,0x5,0x3, - 0xE,0xB,0x4,0xC,0x6,0xD,0xF,0xA,0x2,0x3,0x8,0x1,0x0,0x7,0x5,0x9, - 0x5,0x8,0x1,0xD,0xA,0x3,0x4,0x2,0xE,0xF,0xC,0x7,0x6,0x0,0x9,0xB, - 0x7,0xD,0xA,0x1,0x0,0x8,0x9,0xF,0xE,0x4,0x6,0xC,0xB,0x2,0x5,0x3, - 0x6,0xC,0x7,0x1,0x5,0xF,0xD,0x8,0x4,0xA,0x9,0xE,0x0,0x3,0xB,0x2, - 0x4,0xB,0xA,0x0,0x7,0x2,0x1,0xD,0x3,0x6,0x8,0x5,0x9,0xC,0xF,0xE, - 0xD,0xB,0x4,0x1,0x3,0xF,0x5,0x9,0x0,0xA,0xE,0x7,0x6,0x8,0x2,0xC, - 0x1,0xF,0xD,0x0,0x5,0x7,0xA,0x4,0x9,0x2,0x3,0xE,0x6,0xB,0x8,0xC - }; - - /* - * class content S-box parameters for encrypting - * getting from, see: http://tools.ietf.org/id/draft-popov-cryptopro-cpalgs-01.txt - * http://tools.ietf.org/id/draft-popov-cryptopro-cpalgs-02.txt - */ - private static byte[] ESbox_Test = { - 0x4,0x2,0xF,0x5,0x9,0x1,0x0,0x8,0xE,0x3,0xB,0xC,0xD,0x7,0xA,0x6, - 0xC,0x9,0xF,0xE,0x8,0x1,0x3,0xA,0x2,0x7,0x4,0xD,0x6,0x0,0xB,0x5, - 0xD,0x8,0xE,0xC,0x7,0x3,0x9,0xA,0x1,0x5,0x2,0x4,0x6,0xF,0x0,0xB, - 0xE,0x9,0xB,0x2,0x5,0xF,0x7,0x1,0x0,0xD,0xC,0x6,0xA,0x4,0x3,0x8, - 0x3,0xE,0x5,0x9,0x6,0x8,0x0,0xD,0xA,0xB,0x7,0xC,0x2,0x1,0xF,0x4, - 0x8,0xF,0x6,0xB,0x1,0x9,0xC,0x5,0xD,0x3,0x7,0xA,0x0,0xE,0x2,0x4, - 0x9,0xB,0xC,0x0,0x3,0x6,0x7,0x5,0x4,0x8,0xE,0xF,0x1,0xA,0x2,0xD, - 0xC,0x6,0x5,0x2,0xB,0x0,0x9,0xD,0x3,0xE,0x7,0xA,0xF,0x4,0x1,0x8 - }; - - private static byte[] ESbox_A = { - 0x9,0x6,0x3,0x2,0x8,0xB,0x1,0x7,0xA,0x4,0xE,0xF,0xC,0x0,0xD,0x5, - 0x3,0x7,0xE,0x9,0x8,0xA,0xF,0x0,0x5,0x2,0x6,0xC,0xB,0x4,0xD,0x1, - 0xE,0x4,0x6,0x2,0xB,0x3,0xD,0x8,0xC,0xF,0x5,0xA,0x0,0x7,0x1,0x9, - 0xE,0x7,0xA,0xC,0xD,0x1,0x3,0x9,0x0,0x2,0xB,0x4,0xF,0x8,0x5,0x6, - 0xB,0x5,0x1,0x9,0x8,0xD,0xF,0x0,0xE,0x4,0x2,0x3,0xC,0x7,0xA,0x6, - 0x3,0xA,0xD,0xC,0x1,0x2,0x0,0xB,0x7,0x5,0x9,0x4,0x8,0xF,0xE,0x6, - 0x1,0xD,0x2,0x9,0x7,0xA,0x6,0x0,0x8,0xC,0x4,0x5,0xF,0x3,0xB,0xE, - 0xB,0xA,0xF,0x5,0x0,0xC,0xE,0x8,0x6,0x2,0x3,0x9,0x1,0x7,0xD,0x4 - }; - - private static byte[] ESbox_B = { - 0x8,0x4,0xB,0x1,0x3,0x5,0x0,0x9,0x2,0xE,0xA,0xC,0xD,0x6,0x7,0xF, - 0x0,0x1,0x2,0xA,0x4,0xD,0x5,0xC,0x9,0x7,0x3,0xF,0xB,0x8,0x6,0xE, - 0xE,0xC,0x0,0xA,0x9,0x2,0xD,0xB,0x7,0x5,0x8,0xF,0x3,0x6,0x1,0x4, - 0x7,0x5,0x0,0xD,0xB,0x6,0x1,0x2,0x3,0xA,0xC,0xF,0x4,0xE,0x9,0x8, - 0x2,0x7,0xC,0xF,0x9,0x5,0xA,0xB,0x1,0x4,0x0,0xD,0x6,0x8,0xE,0x3, - 0x8,0x3,0x2,0x6,0x4,0xD,0xE,0xB,0xC,0x1,0x7,0xF,0xA,0x0,0x9,0x5, - 0x5,0x2,0xA,0xB,0x9,0x1,0xC,0x3,0x7,0x4,0xD,0x0,0x6,0xF,0x8,0xE, - 0x0,0x4,0xB,0xE,0x8,0x3,0x7,0x1,0xA,0x2,0x9,0x6,0xF,0xD,0x5,0xC - }; - - private static byte[] ESbox_C = { - 0x1,0xB,0xC,0x2,0x9,0xD,0x0,0xF,0x4,0x5,0x8,0xE,0xA,0x7,0x6,0x3, - 0x0,0x1,0x7,0xD,0xB,0x4,0x5,0x2,0x8,0xE,0xF,0xC,0x9,0xA,0x6,0x3, - 0x8,0x2,0x5,0x0,0x4,0x9,0xF,0xA,0x3,0x7,0xC,0xD,0x6,0xE,0x1,0xB, - 0x3,0x6,0x0,0x1,0x5,0xD,0xA,0x8,0xB,0x2,0x9,0x7,0xE,0xF,0xC,0x4, - 0x8,0xD,0xB,0x0,0x4,0x5,0x1,0x2,0x9,0x3,0xC,0xE,0x6,0xF,0xA,0x7, - 0xC,0x9,0xB,0x1,0x8,0xE,0x2,0x4,0x7,0x3,0x6,0x5,0xA,0x0,0xF,0xD, - 0xA,0x9,0x6,0x8,0xD,0xE,0x2,0x0,0xF,0x3,0x5,0xB,0x4,0x1,0xC,0x7, - 0x7,0x4,0x0,0x5,0xA,0x2,0xF,0xE,0xC,0x6,0x1,0xB,0xD,0x9,0x3,0x8 - }; - - private static byte[] ESbox_D = { - 0xF,0xC,0x2,0xA,0x6,0x4,0x5,0x0,0x7,0x9,0xE,0xD,0x1,0xB,0x8,0x3, - 0xB,0x6,0x3,0x4,0xC,0xF,0xE,0x2,0x7,0xD,0x8,0x0,0x5,0xA,0x9,0x1, - 0x1,0xC,0xB,0x0,0xF,0xE,0x6,0x5,0xA,0xD,0x4,0x8,0x9,0x3,0x7,0x2, - 0x1,0x5,0xE,0xC,0xA,0x7,0x0,0xD,0x6,0x2,0xB,0x4,0x9,0x3,0xF,0x8, - 0x0,0xC,0x8,0x9,0xD,0x2,0xA,0xB,0x7,0x3,0x6,0x5,0x4,0xE,0xF,0x1, - 0x8,0x0,0xF,0x3,0x2,0x5,0xE,0xB,0x1,0xA,0x4,0x7,0xC,0x9,0xD,0x6, - 0x3,0x0,0x6,0xF,0x1,0xE,0x9,0x2,0xD,0x8,0xC,0x4,0xB,0xA,0x5,0x7, - 0x1,0xA,0x6,0x8,0xF,0xB,0x0,0x4,0xC,0x3,0x5,0x9,0x7,0xD,0x2,0xE - }; - - //S-box for digest - private static byte DSbox_Test[] = { - 0x4,0xA,0x9,0x2,0xD,0x8,0x0,0xE,0x6,0xB,0x1,0xC,0x7,0xF,0x5,0x3, - 0xE,0xB,0x4,0xC,0x6,0xD,0xF,0xA,0x2,0x3,0x8,0x1,0x0,0x7,0x5,0x9, - 0x5,0x8,0x1,0xD,0xA,0x3,0x4,0x2,0xE,0xF,0xC,0x7,0x6,0x0,0x9,0xB, - 0x7,0xD,0xA,0x1,0x0,0x8,0x9,0xF,0xE,0x4,0x6,0xC,0xB,0x2,0x5,0x3, - 0x6,0xC,0x7,0x1,0x5,0xF,0xD,0x8,0x4,0xA,0x9,0xE,0x0,0x3,0xB,0x2, - 0x4,0xB,0xA,0x0,0x7,0x2,0x1,0xD,0x3,0x6,0x8,0x5,0x9,0xC,0xF,0xE, - 0xD,0xB,0x4,0x1,0x3,0xF,0x5,0x9,0x0,0xA,0xE,0x7,0x6,0x8,0x2,0xC, - 0x1,0xF,0xD,0x0,0x5,0x7,0xA,0x4,0x9,0x2,0x3,0xE,0x6,0xB,0x8,0xC - }; - - private static byte DSbox_A[] = { - 0xA,0x4,0x5,0x6,0x8,0x1,0x3,0x7,0xD,0xC,0xE,0x0,0x9,0x2,0xB,0xF, - 0x5,0xF,0x4,0x0,0x2,0xD,0xB,0x9,0x1,0x7,0x6,0x3,0xC,0xE,0xA,0x8, - 0x7,0xF,0xC,0xE,0x9,0x4,0x1,0x0,0x3,0xB,0x5,0x2,0x6,0xA,0x8,0xD, - 0x4,0xA,0x7,0xC,0x0,0xF,0x2,0x8,0xE,0x1,0x6,0x5,0xD,0xB,0x9,0x3, - 0x7,0x6,0x4,0xB,0x9,0xC,0x2,0xA,0x1,0x8,0x0,0xE,0xF,0xD,0x3,0x5, - 0x7,0x6,0x2,0x4,0xD,0x9,0xF,0x0,0xA,0x1,0x5,0xB,0x8,0xE,0xC,0x3, - 0xD,0xE,0x4,0x1,0x7,0x0,0x5,0xA,0x3,0xC,0x8,0xF,0x6,0x2,0x9,0xB, - 0x1,0x3,0xA,0x9,0x5,0xB,0x4,0xF,0x8,0x6,0x7,0xE,0xD,0x0,0x2,0xC - }; - - // - // pre-defined sbox table - // - private static Hashtable sBoxes = new Hashtable(); - - static - { - addSBox("Default", Sbox_Default); - addSBox("E-TEST", ESbox_Test); - addSBox("E-A", ESbox_A); - addSBox("E-B", ESbox_B); - addSBox("E-C", ESbox_C); - addSBox("E-D", ESbox_D); - addSBox("D-TEST", DSbox_Test); - addSBox("D-A", DSbox_A); - } - - private static void addSBox(String sBoxName, byte[] sBox) - { - sBoxes.put(Strings.toUpperCase(sBoxName), sBox); - } - - /** - * standard constructor. - */ - public GOST28147Engine() - { - } - - /** - * initialise an GOST28147 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof ParametersWithSBox) - { - ParametersWithSBox param = (ParametersWithSBox)params; - - // - // Set the S-Box - // - byte[] sBox = param.getSBox(); - if (sBox.length != Sbox_Default.length) - { - throw new IllegalArgumentException("invalid S-box passed to GOST28147 init"); - } - this.S = Arrays.clone(sBox); - - // - // set key if there is one - // - if (param.getParameters() != null) - { - workingKey = generateWorkingKey(forEncryption, - ((KeyParameter)param.getParameters()).getKey()); - } - } - else if (params instanceof KeyParameter) - { - workingKey = generateWorkingKey(forEncryption, - ((KeyParameter)params).getKey()); - } - else if (params != null) - { - throw new IllegalArgumentException("invalid parameter passed to GOST28147 init - " + params.getClass().getName()); - } - } - - public String getAlgorithmName() - { - return "GOST28147"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("GOST28147 engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - GOST28147Func(workingKey, in, inOff, out, outOff); - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private int[] generateWorkingKey( - boolean forEncryption, - byte[] userKey) - { - this.forEncryption = forEncryption; - - if (userKey.length != 32) - { - throw new IllegalArgumentException("Key length invalid. Key needs to be 32 byte - 256 bit!!!"); - } - - int key[] = new int[8]; - for(int i=0; i!=8; i++) - { - key[i] = bytesToint(userKey,i*4); - } - - return key; - } - - private int GOST28147_mainStep(int n1, int key) - { - int cm = (key + n1); // CM1 - - // S-box replacing - - int om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4); - om += S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4); - om += S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4); - om += S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4); - om += S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4); - om += S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4); - om += S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4); - om += S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4); - - return om << 11 | om >>> (32-11); // 11-leftshift - } - - private void GOST28147Func( - int[] workingKey, - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int N1, N2, tmp; //tmp -> for saving N1 - N1 = bytesToint(in, inOff); - N2 = bytesToint(in, inOff + 4); - - if (this.forEncryption) - { - for(int k = 0; k < 3; k++) // 1-24 steps - { - for(int j = 0; j < 8; j++) - { - tmp = N1; - N1 = N2 ^ GOST28147_mainStep(N1, workingKey[j]); // CM2 - N2 = tmp; - } - } - for(int j = 7; j > 0; j--) // 25-31 steps - { - tmp = N1; - N1 = N2 ^ GOST28147_mainStep(N1, workingKey[j]); // CM2 - N2 = tmp; - } - } - else //decrypt - { - for(int j = 0; j < 8; j++) // 1-8 steps - { - tmp = N1; - N1 = N2 ^ GOST28147_mainStep(N1, workingKey[j]); // CM2 - N2 = tmp; - } - for(int k = 0; k < 3; k++) //9-31 steps - { - for(int j = 7; j >= 0; j--) - { - if ((k == 2) && (j==0)) - { - break; // break 32 step - } - tmp = N1; - N1 = N2 ^ GOST28147_mainStep(N1, workingKey[j]); // CM2 - N2 = tmp; - } - } - } - - N2 = N2 ^ GOST28147_mainStep(N1, workingKey[0]); // 32 step (N1=N1) - - intTobytes(N1, out, outOff); - intTobytes(N2, out, outOff + 4); - } - - //array of bytes to type int - private int bytesToint( - byte[] in, - int inOff) - { - return ((in[inOff + 3] << 24) & 0xff000000) + ((in[inOff + 2] << 16) & 0xff0000) + - ((in[inOff + 1] << 8) & 0xff00) + (in[inOff] & 0xff); - } - - //int to array of bytes - private void intTobytes( - int num, - byte[] out, - int outOff) - { - out[outOff + 3] = (byte)(num >>> 24); - out[outOff + 2] = (byte)(num >>> 16); - out[outOff + 1] = (byte)(num >>> 8); - out[outOff] = (byte)num; - } - - /** - * Return the S-Box associated with SBoxName - * @param sBoxName name of the S-Box - * @return byte array representing the S-Box - */ - public static byte[] getSBox( - String sBoxName) - { - byte[] sBox = (byte[])sBoxes.get(Strings.toUpperCase(sBoxName)); - - if (sBox == null) - { - throw new IllegalArgumentException("Unknown S-Box - possible types: " - + "\"Default\", \"E-Test\", \"E-A\", \"E-B\", \"E-C\", \"E-D\", \"D-Test\", \"D-A\"."); - } - - return Arrays.clone(sBox); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grain128Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grain128Engine.java deleted file mode 100644 index 52a8e74..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grain128Engine.java +++ /dev/null @@ -1,302 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Implementation of Martin Hell's, Thomas Johansson's and Willi Meier's stream - * cipher, Grain-128. - */ -public class Grain128Engine - implements StreamCipher -{ - - /** - * Constants - */ - private static final int STATE_SIZE = 4; - - /** - * Variables to hold the state of the engine during encryption and - * decryption - */ - private byte[] workingKey; - private byte[] workingIV; - private byte[] out; - private int[] lfsr; - private int[] nfsr; - private int output; - private int index = 4; - - private boolean initialised = false; - - public String getAlgorithmName() - { - return "Grain-128"; - } - - /** - * Initialize a Grain-128 cipher. - * - * @param forEncryption Whether or not we are for encryption. - * @param params The parameters required to set up the cipher. - * @throws IllegalArgumentException If the params argument is inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - /** - * Grain encryption and decryption is completely symmetrical, so the - * 'forEncryption' is irrelevant. - */ - if (!(params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException( - "Grain-128 Init parameters must include an IV"); - } - - ParametersWithIV ivParams = (ParametersWithIV)params; - - byte[] iv = ivParams.getIV(); - - if (iv == null || iv.length != 12) - { - throw new IllegalArgumentException( - "Grain-128 requires exactly 12 bytes of IV"); - } - - if (!(ivParams.getParameters() instanceof KeyParameter)) - { - throw new IllegalArgumentException( - "Grain-128 Init parameters must include a key"); - } - - KeyParameter key = (KeyParameter)ivParams.getParameters(); - - /** - * Initialize variables. - */ - workingIV = new byte[key.getKey().length]; - workingKey = new byte[key.getKey().length]; - lfsr = new int[STATE_SIZE]; - nfsr = new int[STATE_SIZE]; - out = new byte[4]; - - System.arraycopy(iv, 0, workingIV, 0, iv.length); - System.arraycopy(key.getKey(), 0, workingKey, 0, key.getKey().length); - - setKey(workingKey, workingIV); - initGrain(); - } - - /** - * 256 clocks initialization phase. - */ - private void initGrain() - { - for (int i = 0; i < 8; i++) - { - output = getOutput(); - nfsr = shift(nfsr, getOutputNFSR() ^ lfsr[0] ^ output); - lfsr = shift(lfsr, getOutputLFSR() ^ output); - } - initialised = true; - } - - /** - * Get output from non-linear function g(x). - * - * @return Output from NFSR. - */ - private int getOutputNFSR() - { - int b0 = nfsr[0]; - int b3 = nfsr[0] >>> 3 | nfsr[1] << 29; - int b11 = nfsr[0] >>> 11 | nfsr[1] << 21; - int b13 = nfsr[0] >>> 13 | nfsr[1] << 19; - int b17 = nfsr[0] >>> 17 | nfsr[1] << 15; - int b18 = nfsr[0] >>> 18 | nfsr[1] << 14; - int b26 = nfsr[0] >>> 26 | nfsr[1] << 6; - int b27 = nfsr[0] >>> 27 | nfsr[1] << 5; - int b40 = nfsr[1] >>> 8 | nfsr[2] << 24; - int b48 = nfsr[1] >>> 16 | nfsr[2] << 16; - int b56 = nfsr[1] >>> 24 | nfsr[2] << 8; - int b59 = nfsr[1] >>> 27 | nfsr[2] << 5; - int b61 = nfsr[1] >>> 29 | nfsr[2] << 3; - int b65 = nfsr[2] >>> 1 | nfsr[3] << 31; - int b67 = nfsr[2] >>> 3 | nfsr[3] << 29; - int b68 = nfsr[2] >>> 4 | nfsr[3] << 28; - int b84 = nfsr[2] >>> 20 | nfsr[3] << 12; - int b91 = nfsr[2] >>> 27 | nfsr[3] << 5; - int b96 = nfsr[3]; - - return b0 ^ b26 ^ b56 ^ b91 ^ b96 ^ b3 & b67 ^ b11 & b13 ^ b17 & b18 - ^ b27 & b59 ^ b40 & b48 ^ b61 & b65 ^ b68 & b84; - } - - /** - * Get output from linear function f(x). - * - * @return Output from LFSR. - */ - private int getOutputLFSR() - { - int s0 = lfsr[0]; - int s7 = lfsr[0] >>> 7 | lfsr[1] << 25; - int s38 = lfsr[1] >>> 6 | lfsr[2] << 26; - int s70 = lfsr[2] >>> 6 | lfsr[3] << 26; - int s81 = lfsr[2] >>> 17 | lfsr[3] << 15; - int s96 = lfsr[3]; - - return s0 ^ s7 ^ s38 ^ s70 ^ s81 ^ s96; - } - - /** - * Get output from output function h(x). - * - * @return Output from h(x). - */ - private int getOutput() - { - int b2 = nfsr[0] >>> 2 | nfsr[1] << 30; - int b12 = nfsr[0] >>> 12 | nfsr[1] << 20; - int b15 = nfsr[0] >>> 15 | nfsr[1] << 17; - int b36 = nfsr[1] >>> 4 | nfsr[2] << 28; - int b45 = nfsr[1] >>> 13 | nfsr[2] << 19; - int b64 = nfsr[2]; - int b73 = nfsr[2] >>> 9 | nfsr[3] << 23; - int b89 = nfsr[2] >>> 25 | nfsr[3] << 7; - int b95 = nfsr[2] >>> 31 | nfsr[3] << 1; - int s8 = lfsr[0] >>> 8 | lfsr[1] << 24; - int s13 = lfsr[0] >>> 13 | lfsr[1] << 19; - int s20 = lfsr[0] >>> 20 | lfsr[1] << 12; - int s42 = lfsr[1] >>> 10 | lfsr[2] << 22; - int s60 = lfsr[1] >>> 28 | lfsr[2] << 4; - int s79 = lfsr[2] >>> 15 | lfsr[3] << 17; - int s93 = lfsr[2] >>> 29 | lfsr[3] << 3; - int s95 = lfsr[2] >>> 31 | lfsr[3] << 1; - - return b12 & s8 ^ s13 & s20 ^ b95 & s42 ^ s60 & s79 ^ b12 & b95 & s95 ^ s93 - ^ b2 ^ b15 ^ b36 ^ b45 ^ b64 ^ b73 ^ b89; - } - - /** - * Shift array 32 bits and add val to index.length - 1. - * - * @param array The array to shift. - * @param val The value to shift in. - * @return The shifted array with val added to index.length - 1. - */ - private int[] shift(int[] array, int val) - { - array[0] = array[1]; - array[1] = array[2]; - array[2] = array[3]; - array[3] = val; - - return array; - } - - /** - * Set keys, reset cipher. - * - * @param keyBytes The key. - * @param ivBytes The IV. - */ - private void setKey(byte[] keyBytes, byte[] ivBytes) - { - ivBytes[12] = (byte)0xFF; - ivBytes[13] = (byte)0xFF; - ivBytes[14] = (byte)0xFF; - ivBytes[15] = (byte)0xFF; - workingKey = keyBytes; - workingIV = ivBytes; - - /** - * Load NFSR and LFSR - */ - int j = 0; - for (int i = 0; i < nfsr.length; i++) - { - nfsr[i] = ((workingKey[j + 3]) << 24) | ((workingKey[j + 2]) << 16) - & 0x00FF0000 | ((workingKey[j + 1]) << 8) & 0x0000FF00 - | ((workingKey[j]) & 0x000000FF); - - lfsr[i] = ((workingIV[j + 3]) << 24) | ((workingIV[j + 2]) << 16) - & 0x00FF0000 | ((workingIV[j + 1]) << 8) & 0x0000FF00 - | ((workingIV[j]) & 0x000000FF); - j += 4; - } - } - - public void processBytes(byte[] in, int inOff, int len, byte[] out, - int outOff) - throws DataLengthException - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - out[outOff + i] = (byte)(in[inOff + i] ^ getKeyStream()); - } - } - - public void reset() - { - index = 4; - setKey(workingKey, workingIV); - initGrain(); - } - - /** - * Run Grain one round(i.e. 32 bits). - */ - private void oneRound() - { - output = getOutput(); - out[0] = (byte)output; - out[1] = (byte)(output >> 8); - out[2] = (byte)(output >> 16); - out[3] = (byte)(output >> 24); - - nfsr = shift(nfsr, getOutputNFSR() ^ lfsr[0]); - lfsr = shift(lfsr, getOutputLFSR()); - } - - public byte returnByte(byte in) - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - return (byte)(in ^ getKeyStream()); - } - - private byte getKeyStream() - { - if (index > 3) - { - oneRound(); - index = 0; - } - return out[index++]; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grainv1Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grainv1Engine.java deleted file mode 100644 index 638111d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Grainv1Engine.java +++ /dev/null @@ -1,288 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Implementation of Martin Hell's, Thomas Johansson's and Willi Meier's stream - * cipher, Grain v1. - */ -public class Grainv1Engine - implements StreamCipher -{ - - /** - * Constants - */ - private static final int STATE_SIZE = 5; - - /** - * Variables to hold the state of the engine during encryption and - * decryption - */ - private byte[] workingKey; - private byte[] workingIV; - private byte[] out; - private int[] lfsr; - private int[] nfsr; - private int output; - private int index = 2; - - private boolean initialised = false; - - public String getAlgorithmName() - { - return "Grain v1"; - } - - /** - * Initialize a Grain v1 cipher. - * - * @param forEncryption Whether or not we are for encryption. - * @param params The parameters required to set up the cipher. - * @throws IllegalArgumentException If the params argument is inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - /** - * Grain encryption and decryption is completely symmetrical, so the - * 'forEncryption' is irrelevant. - */ - if (!(params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException( - "Grain v1 Init parameters must include an IV"); - } - - ParametersWithIV ivParams = (ParametersWithIV)params; - - byte[] iv = ivParams.getIV(); - - if (iv == null || iv.length != 8) - { - throw new IllegalArgumentException( - "Grain v1 requires exactly 8 bytes of IV"); - } - - if (!(ivParams.getParameters() instanceof KeyParameter)) - { - throw new IllegalArgumentException( - "Grain v1 Init parameters must include a key"); - } - - KeyParameter key = (KeyParameter)ivParams.getParameters(); - - /** - * Initialize variables. - */ - workingIV = new byte[key.getKey().length]; - workingKey = new byte[key.getKey().length]; - lfsr = new int[STATE_SIZE]; - nfsr = new int[STATE_SIZE]; - out = new byte[2]; - - System.arraycopy(iv, 0, workingIV, 0, iv.length); - System.arraycopy(key.getKey(), 0, workingKey, 0, key.getKey().length); - - setKey(workingKey, workingIV); - initGrain(); - } - - /** - * 160 clocks initialization phase. - */ - private void initGrain() - { - for (int i = 0; i < 10; i++) - { - output = getOutput(); - nfsr = shift(nfsr, getOutputNFSR() ^ lfsr[0] ^ output); - lfsr = shift(lfsr, getOutputLFSR() ^ output); - } - initialised = true; - } - - /** - * Get output from non-linear function g(x). - * - * @return Output from NFSR. - */ - private int getOutputNFSR() - { - int b0 = nfsr[0]; - int b9 = nfsr[0] >>> 9 | nfsr[1] << 7; - int b14 = nfsr[0] >>> 14 | nfsr[1] << 2; - int b15 = nfsr[0] >>> 15 | nfsr[1] << 1; - int b21 = nfsr[1] >>> 5 | nfsr[2] << 11; - int b28 = nfsr[1] >>> 12 | nfsr[2] << 4; - int b33 = nfsr[2] >>> 1 | nfsr[3] << 15; - int b37 = nfsr[2] >>> 5 | nfsr[3] << 11; - int b45 = nfsr[2] >>> 13 | nfsr[3] << 3; - int b52 = nfsr[3] >>> 4 | nfsr[4] << 12; - int b60 = nfsr[3] >>> 12 | nfsr[4] << 4; - int b62 = nfsr[3] >>> 14 | nfsr[4] << 2; - int b63 = nfsr[3] >>> 15 | nfsr[4] << 1; - - return (b62 ^ b60 ^ b52 ^ b45 ^ b37 ^ b33 ^ b28 ^ b21 ^ b14 - ^ b9 ^ b0 ^ b63 & b60 ^ b37 & b33 ^ b15 & b9 ^ b60 & b52 & b45 - ^ b33 & b28 & b21 ^ b63 & b45 & b28 & b9 ^ b60 & b52 & b37 - & b33 ^ b63 & b60 & b21 & b15 ^ b63 & b60 & b52 & b45 & b37 - ^ b33 & b28 & b21 & b15 & b9 ^ b52 & b45 & b37 & b33 & b28 - & b21) & 0x0000FFFF; - } - - /** - * Get output from linear function f(x). - * - * @return Output from LFSR. - */ - private int getOutputLFSR() - { - int s0 = lfsr[0]; - int s13 = lfsr[0] >>> 13 | lfsr[1] << 3; - int s23 = lfsr[1] >>> 7 | lfsr[2] << 9; - int s38 = lfsr[2] >>> 6 | lfsr[3] << 10; - int s51 = lfsr[3] >>> 3 | lfsr[4] << 13; - int s62 = lfsr[3] >>> 14 | lfsr[4] << 2; - - return (s0 ^ s13 ^ s23 ^ s38 ^ s51 ^ s62) & 0x0000FFFF; - } - - /** - * Get output from output function h(x). - * - * @return Output from h(x). - */ - private int getOutput() - { - int b1 = nfsr[0] >>> 1 | nfsr[1] << 15; - int b2 = nfsr[0] >>> 2 | nfsr[1] << 14; - int b4 = nfsr[0] >>> 4 | nfsr[1] << 12; - int b10 = nfsr[0] >>> 10 | nfsr[1] << 6; - int b31 = nfsr[1] >>> 15 | nfsr[2] << 1; - int b43 = nfsr[2] >>> 11 | nfsr[3] << 5; - int b56 = nfsr[3] >>> 8 | nfsr[4] << 8; - int b63 = nfsr[3] >>> 15 | nfsr[4] << 1; - int s3 = lfsr[0] >>> 3 | lfsr[1] << 13; - int s25 = lfsr[1] >>> 9 | lfsr[2] << 7; - int s46 = lfsr[2] >>> 14 | lfsr[3] << 2; - int s64 = lfsr[4]; - - return (s25 ^ b63 ^ s3 & s64 ^ s46 & s64 ^ s64 & b63 ^ s3 - & s25 & s46 ^ s3 & s46 & s64 ^ s3 & s46 & b63 ^ s25 & s46 & b63 ^ s46 - & s64 & b63 ^ b1 ^ b2 ^ b4 ^ b10 ^ b31 ^ b43 ^ b56) & 0x0000FFFF; - } - - /** - * Shift array 16 bits and add val to index.length - 1. - * - * @param array The array to shift. - * @param val The value to shift in. - * @return The shifted array with val added to index.length - 1. - */ - private int[] shift(int[] array, int val) - { - array[0] = array[1]; - array[1] = array[2]; - array[2] = array[3]; - array[3] = array[4]; - array[4] = val; - - return array; - } - - /** - * Set keys, reset cipher. - * - * @param keyBytes The key. - * @param ivBytes The IV. - */ - private void setKey(byte[] keyBytes, byte[] ivBytes) - { - ivBytes[8] = (byte)0xFF; - ivBytes[9] = (byte)0xFF; - workingKey = keyBytes; - workingIV = ivBytes; - - /** - * Load NFSR and LFSR - */ - int j = 0; - for (int i = 0; i < nfsr.length; i++) - { - nfsr[i] = (workingKey[j + 1] << 8 | workingKey[j] & 0xFF) & 0x0000FFFF; - lfsr[i] = (workingIV[j + 1] << 8 | workingIV[j] & 0xFF) & 0x0000FFFF; - j += 2; - } - } - - public void processBytes(byte[] in, int inOff, int len, byte[] out, - int outOff) - throws DataLengthException - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - out[outOff + i] = (byte)(in[inOff + i] ^ getKeyStream()); - } - } - - public void reset() - { - index = 2; - setKey(workingKey, workingIV); - initGrain(); - } - - /** - * Run Grain one round(i.e. 16 bits). - */ - private void oneRound() - { - output = getOutput(); - out[0] = (byte)output; - out[1] = (byte)(output >> 8); - - nfsr = shift(nfsr, getOutputNFSR() ^ lfsr[0]); - lfsr = shift(lfsr, getOutputLFSR()); - } - - public byte returnByte(byte in) - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - return (byte)(in ^ getKeyStream()); - } - - private byte getKeyStream() - { - if (index > 1) - { - oneRound(); - index = 0; - } - return out[index++]; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC128Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC128Engine.java deleted file mode 100644 index 1feade2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC128Engine.java +++ /dev/null @@ -1,256 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * HC-128 is a software-efficient stream cipher created by Hongjun Wu. It - * generates keystream from a 128-bit secret key and a 128-bit initialization - * vector. - *

    - * http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc128_p3.pdf - *

    - * It is a third phase candidate in the eStream contest, and is patent-free. - * No attacks are known as of today (April 2007). See - * - * http://www.ecrypt.eu.org/stream/hcp3.html - *

    - */ -public class HC128Engine - implements StreamCipher -{ - private int[] p = new int[512]; - private int[] q = new int[512]; - private int cnt = 0; - - private static int f1(int x) - { - return rotateRight(x, 7) ^ rotateRight(x, 18) - ^ (x >>> 3); - } - - private static int f2(int x) - { - return rotateRight(x, 17) ^ rotateRight(x, 19) - ^ (x >>> 10); - } - - private int g1(int x, int y, int z) - { - return (rotateRight(x, 10) ^ rotateRight(z, 23)) - + rotateRight(y, 8); - } - - private int g2(int x, int y, int z) - { - return (rotateLeft(x, 10) ^ rotateLeft(z, 23)) + rotateLeft(y, 8); - } - - private static int rotateLeft( - int x, - int bits) - { - return (x << bits) | (x >>> -bits); - } - - private static int rotateRight( - int x, - int bits) - { - return (x >>> bits) | (x << -bits); - } - - private int h1(int x) - { - return q[x & 0xFF] + q[((x >> 16) & 0xFF) + 256]; - } - - private int h2(int x) - { - return p[x & 0xFF] + p[((x >> 16) & 0xFF) + 256]; - } - - private static int mod1024(int x) - { - return x & 0x3FF; - } - - private static int mod512(int x) - { - return x & 0x1FF; - } - - private static int dim(int x, int y) - { - return mod512(x - y); - } - - private int step() - { - int j = mod512(cnt); - int ret; - if (cnt < 512) - { - p[j] += g1(p[dim(j, 3)], p[dim(j, 10)], p[dim(j, 511)]); - ret = h1(p[dim(j, 12)]) ^ p[j]; - } - else - { - q[j] += g2(q[dim(j, 3)], q[dim(j, 10)], q[dim(j, 511)]); - ret = h2(q[dim(j, 12)]) ^ q[j]; - } - cnt = mod1024(cnt + 1); - return ret; - } - - private byte[] key, iv; - private boolean initialised; - - private void init() - { - if (key.length != 16) - { - throw new java.lang.IllegalArgumentException( - "The key must be 128 bits long"); - } - - cnt = 0; - - int[] w = new int[1280]; - - for (int i = 0; i < 16; i++) - { - w[i >> 2] |= (key[i] & 0xff) << (8 * (i & 0x3)); - } - System.arraycopy(w, 0, w, 4, 4); - - for (int i = 0; i < iv.length && i < 16; i++) - { - w[(i >> 2) + 8] |= (iv[i] & 0xff) << (8 * (i & 0x3)); - } - System.arraycopy(w, 8, w, 12, 4); - - for (int i = 16; i < 1280; i++) - { - w[i] = f2(w[i - 2]) + w[i - 7] + f1(w[i - 15]) + w[i - 16] + i; - } - - System.arraycopy(w, 256, p, 0, 512); - System.arraycopy(w, 768, q, 0, 512); - - for (int i = 0; i < 512; i++) - { - p[i] = step(); - } - for (int i = 0; i < 512; i++) - { - q[i] = step(); - } - - cnt = 0; - } - - public String getAlgorithmName() - { - return "HC-128"; - } - - /** - * Initialise a HC-128 cipher. - * - * @param forEncryption whether or not we are for encryption. Irrelevant, as - * encryption and decryption are the same. - * @param params the parameters required to set up the cipher. - * @throws IllegalArgumentException if the params argument is - * inappropriate (ie. the key is not 128 bit long). - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - CipherParameters keyParam = params; - - if (params instanceof ParametersWithIV) - { - iv = ((ParametersWithIV)params).getIV(); - keyParam = ((ParametersWithIV)params).getParameters(); - } - else - { - iv = new byte[0]; - } - - if (keyParam instanceof KeyParameter) - { - key = ((KeyParameter)keyParam).getKey(); - init(); - } - else - { - throw new IllegalArgumentException( - "Invalid parameter passed to HC128 init - " - + params.getClass().getName()); - } - - initialised = true; - } - - private byte[] buf = new byte[4]; - private int idx = 0; - - private byte getByte() - { - if (idx == 0) - { - int step = step(); - buf[0] = (byte)(step & 0xFF); - step >>= 8; - buf[1] = (byte)(step & 0xFF); - step >>= 8; - buf[2] = (byte)(step & 0xFF); - step >>= 8; - buf[3] = (byte)(step & 0xFF); - } - byte ret = buf[idx]; - idx = idx + 1 & 0x3; - return ret; - } - - public void processBytes(byte[] in, int inOff, int len, byte[] out, - int outOff) throws DataLengthException - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - out[outOff + i] = (byte)(in[inOff + i] ^ getByte()); - } - } - - public void reset() - { - idx = 0; - init(); - } - - public byte returnByte(byte in) - { - return (byte)(in ^ getByte()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC256Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC256Engine.java deleted file mode 100644 index 5a7470c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/HC256Engine.java +++ /dev/null @@ -1,243 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * HC-256 is a software-efficient stream cipher created by Hongjun Wu. It - * generates keystream from a 256-bit secret key and a 256-bit initialization - * vector. - *

    - * http://www.ecrypt.eu.org/stream/p3ciphers/hc/hc256_p3.pdf - *

    - * Its brother, HC-128, is a third phase candidate in the eStream contest. - * The algorithm is patent-free. No attacks are known as of today (April 2007). - * See - * - * http://www.ecrypt.eu.org/stream/hcp3.html - *

    - */ -public class HC256Engine - implements StreamCipher -{ - private int[] p = new int[1024]; - private int[] q = new int[1024]; - private int cnt = 0; - - private int step() - { - int j = cnt & 0x3FF; - int ret; - if (cnt < 1024) - { - int x = p[(j - 3 & 0x3FF)]; - int y = p[(j - 1023 & 0x3FF)]; - p[j] += p[(j - 10 & 0x3FF)] - + (rotateRight(x, 10) ^ rotateRight(y, 23)) - + q[((x ^ y) & 0x3FF)]; - - x = p[(j - 12 & 0x3FF)]; - ret = (q[x & 0xFF] + q[((x >> 8) & 0xFF) + 256] - + q[((x >> 16) & 0xFF) + 512] + q[((x >> 24) & 0xFF) + 768]) - ^ p[j]; - } - else - { - int x = q[(j - 3 & 0x3FF)]; - int y = q[(j - 1023 & 0x3FF)]; - q[j] += q[(j - 10 & 0x3FF)] - + (rotateRight(x, 10) ^ rotateRight(y, 23)) - + p[((x ^ y) & 0x3FF)]; - - x = q[(j - 12 & 0x3FF)]; - ret = (p[x & 0xFF] + p[((x >> 8) & 0xFF) + 256] - + p[((x >> 16) & 0xFF) + 512] + p[((x >> 24) & 0xFF) + 768]) - ^ q[j]; - } - cnt = cnt + 1 & 0x7FF; - return ret; - } - - private byte[] key, iv; - private boolean initialised; - - private void init() - { - if (key.length != 32 && key.length != 16) - { - throw new IllegalArgumentException( - "The key must be 128/256 bits long"); - } - - if (iv.length < 16) - { - throw new IllegalArgumentException( - "The IV must be at least 128 bits long"); - } - - if (key.length != 32) - { - byte[] k = new byte[32]; - - System.arraycopy(key, 0, k, 0, key.length); - System.arraycopy(key, 0, k, 16, key.length); - - key = k; - } - - if (iv.length < 32) - { - byte[] newIV = new byte[32]; - - System.arraycopy(iv, 0, newIV, 0, iv.length); - System.arraycopy(iv, 0, newIV, iv.length, newIV.length - iv.length); - - iv = newIV; - } - - cnt = 0; - - int[] w = new int[2560]; - - for (int i = 0; i < 32; i++) - { - w[i >> 2] |= (key[i] & 0xff) << (8 * (i & 0x3)); - } - - for (int i = 0; i < 32; i++) - { - w[(i >> 2) + 8] |= (iv[i] & 0xff) << (8 * (i & 0x3)); - } - - for (int i = 16; i < 2560; i++) - { - int x = w[i - 2]; - int y = w[i - 15]; - w[i] = (rotateRight(x, 17) ^ rotateRight(x, 19) ^ (x >>> 10)) - + w[i - 7] - + (rotateRight(y, 7) ^ rotateRight(y, 18) ^ (y >>> 3)) - + w[i - 16] + i; - } - - System.arraycopy(w, 512, p, 0, 1024); - System.arraycopy(w, 1536, q, 0, 1024); - - for (int i = 0; i < 4096; i++) - { - step(); - } - - cnt = 0; - } - - public String getAlgorithmName() - { - return "HC-256"; - } - - /** - * Initialise a HC-256 cipher. - * - * @param forEncryption whether or not we are for encryption. Irrelevant, as - * encryption and decryption are the same. - * @param params the parameters required to set up the cipher. - * @throws IllegalArgumentException if the params argument is - * inappropriate (ie. the key is not 256 bit long). - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - CipherParameters keyParam = params; - - if (params instanceof ParametersWithIV) - { - iv = ((ParametersWithIV)params).getIV(); - keyParam = ((ParametersWithIV)params).getParameters(); - } - else - { - iv = new byte[0]; - } - - if (keyParam instanceof KeyParameter) - { - key = ((KeyParameter)keyParam).getKey(); - init(); - } - else - { - throw new IllegalArgumentException( - "Invalid parameter passed to HC256 init - " - + params.getClass().getName()); - } - - initialised = true; - } - - private byte[] buf = new byte[4]; - private int idx = 0; - - private byte getByte() - { - if (idx == 0) - { - int step = step(); - buf[0] = (byte)(step & 0xFF); - step >>= 8; - buf[1] = (byte)(step & 0xFF); - step >>= 8; - buf[2] = (byte)(step & 0xFF); - step >>= 8; - buf[3] = (byte)(step & 0xFF); - } - byte ret = buf[idx]; - idx = idx + 1 & 0x3; - return ret; - } - - public void processBytes(byte[] in, int inOff, int len, byte[] out, - int outOff) throws DataLengthException - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName() - + " not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - out[outOff + i] = (byte)(in[inOff + i] ^ getByte()); - } - } - - public void reset() - { - idx = 0; - init(); - } - - public byte returnByte(byte in) - { - return (byte)(in ^ getByte()); - } - - private static int rotateRight( - int x, - int bits) - { - return (x >>> bits) | (x << -bits); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IDEAEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IDEAEngine.java deleted file mode 100644 index df5108d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IDEAEngine.java +++ /dev/null @@ -1,366 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * A class that provides a basic International Data Encryption Algorithm (IDEA) engine. - *

    - * This implementation is based on the "HOWTO: INTERNATIONAL DATA ENCRYPTION ALGORITHM" - * implementation summary by Fauzan Mirza (F.U.Mirza@sheffield.ac.uk). (baring 1 typo at the - * end of the mulinv function!). - *

    - * It can be found at ftp://ftp.funet.fi/pub/crypt/cryptography/symmetric/idea/ - *

    - * Note 1: This algorithm is patented in the USA, Japan, and Europe including - * at least Austria, France, Germany, Italy, Netherlands, Spain, Sweden, Switzerland - * and the United Kingdom. Non-commercial use is free, however any commercial - * products are liable for royalties. Please see - * www.mediacrypt.com for - * further details. This announcement has been included at the request of - * the patent holders. - *

    - * Note 2: Due to the requests concerning the above, this algorithm is now only - * included in the extended Bouncy Castle provider and JCE signed jars. It is - * not included in the default distributions. - */ -public class IDEAEngine - implements BlockCipher -{ - protected static final int BLOCK_SIZE = 8; - - private int[] workingKey = null; - - /** - * standard constructor. - */ - public IDEAEngine() - { - } - - /** - * initialise an IDEA cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - workingKey = generateWorkingKey(forEncryption, - ((KeyParameter)params).getKey()); - return; - } - - throw new IllegalArgumentException("invalid parameter passed to IDEA init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "IDEA"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("IDEA engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - ideaFunc(workingKey, in, inOff, out, outOff); - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private static final int MASK = 0xffff; - private static final int BASE = 0x10001; - - private int bytesToWord( - byte[] in, - int inOff) - { - return ((in[inOff] << 8) & 0xff00) + (in[inOff + 1] & 0xff); - } - - private void wordToBytes( - int word, - byte[] out, - int outOff) - { - out[outOff] = (byte)(word >>> 8); - out[outOff + 1] = (byte)word; - } - - /** - * return x = x * y where the multiplication is done modulo - * 65537 (0x10001) (as defined in the IDEA specification) and - * a zero input is taken to be 65536 (0x10000). - * - * @param x the x value - * @param y the y value - * @return x = x * y - */ - private int mul( - int x, - int y) - { - if (x == 0) - { - x = (BASE - y); - } - else if (y == 0) - { - x = (BASE - x); - } - else - { - int p = x * y; - - y = p & MASK; - x = p >>> 16; - x = y - x + ((y < x) ? 1 : 0); - } - - return x & MASK; - } - - private void ideaFunc( - int[] workingKey, - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int x0, x1, x2, x3, t0, t1; - int keyOff = 0; - - x0 = bytesToWord(in, inOff); - x1 = bytesToWord(in, inOff + 2); - x2 = bytesToWord(in, inOff + 4); - x3 = bytesToWord(in, inOff + 6); - - for (int round = 0; round < 8; round++) - { - x0 = mul(x0, workingKey[keyOff++]); - x1 += workingKey[keyOff++]; - x1 &= MASK; - x2 += workingKey[keyOff++]; - x2 &= MASK; - x3 = mul(x3, workingKey[keyOff++]); - - t0 = x1; - t1 = x2; - x2 ^= x0; - x1 ^= x3; - - x2 = mul(x2, workingKey[keyOff++]); - x1 += x2; - x1 &= MASK; - - x1 = mul(x1, workingKey[keyOff++]); - x2 += x1; - x2 &= MASK; - - x0 ^= x1; - x3 ^= x2; - x1 ^= t1; - x2 ^= t0; - } - - wordToBytes(mul(x0, workingKey[keyOff++]), out, outOff); - wordToBytes(x2 + workingKey[keyOff++], out, outOff + 2); /* NB: Order */ - wordToBytes(x1 + workingKey[keyOff++], out, outOff + 4); - wordToBytes(mul(x3, workingKey[keyOff]), out, outOff + 6); - } - - /** - * The following function is used to expand the user key to the encryption - * subkey. The first 16 bytes are the user key, and the rest of the subkey - * is calculated by rotating the previous 16 bytes by 25 bits to the left, - * and so on until the subkey is completed. - */ - private int[] expandKey( - byte[] uKey) - { - int[] key = new int[52]; - - if (uKey.length < 16) - { - byte[] tmp = new byte[16]; - - System.arraycopy(uKey, 0, tmp, tmp.length - uKey.length, uKey.length); - - uKey = tmp; - } - - for (int i = 0; i < 8; i++) - { - key[i] = bytesToWord(uKey, i * 2); - } - - for (int i = 8; i < 52; i++) - { - if ((i & 7) < 6) - { - key[i] = ((key[i - 7] & 127) << 9 | key[i - 6] >> 7) & MASK; - } - else if ((i & 7) == 6) - { - key[i] = ((key[i - 7] & 127) << 9 | key[i - 14] >> 7) & MASK; - } - else - { - key[i] = ((key[i - 15] & 127) << 9 | key[i - 14] >> 7) & MASK; - } - } - - return key; - } - - /** - * This function computes multiplicative inverse using Euclid's Greatest - * Common Divisor algorithm. Zero and one are self inverse. - *

    - * i.e. x * mulInv(x) == 1 (modulo BASE) - */ - private int mulInv( - int x) - { - int t0, t1, q, y; - - if (x < 2) - { - return x; - } - - t0 = 1; - t1 = BASE / x; - y = BASE % x; - - while (y != 1) - { - q = x / y; - x = x % y; - t0 = (t0 + (t1 * q)) & MASK; - if (x == 1) - { - return t0; - } - q = y / x; - y = y % x; - t1 = (t1 + (t0 * q)) & MASK; - } - - return (1 - t1) & MASK; - } - - /** - * Return the additive inverse of x. - *

    - * i.e. x + addInv(x) == 0 - */ - int addInv( - int x) - { - return (0 - x) & MASK; - } - - /** - * The function to invert the encryption subkey to the decryption subkey. - * It also involves the multiplicative inverse and the additive inverse functions. - */ - private int[] invertKey( - int[] inKey) - { - int t1, t2, t3, t4; - int p = 52; /* We work backwards */ - int[] key = new int[52]; - int inOff = 0; - - t1 = mulInv(inKey[inOff++]); - t2 = addInv(inKey[inOff++]); - t3 = addInv(inKey[inOff++]); - t4 = mulInv(inKey[inOff++]); - key[--p] = t4; - key[--p] = t3; - key[--p] = t2; - key[--p] = t1; - - for (int round = 1; round < 8; round++) - { - t1 = inKey[inOff++]; - t2 = inKey[inOff++]; - key[--p] = t2; - key[--p] = t1; - - t1 = mulInv(inKey[inOff++]); - t2 = addInv(inKey[inOff++]); - t3 = addInv(inKey[inOff++]); - t4 = mulInv(inKey[inOff++]); - key[--p] = t4; - key[--p] = t2; /* NB: Order */ - key[--p] = t3; - key[--p] = t1; - } - - t1 = inKey[inOff++]; - t2 = inKey[inOff++]; - key[--p] = t2; - key[--p] = t1; - - t1 = mulInv(inKey[inOff++]); - t2 = addInv(inKey[inOff++]); - t3 = addInv(inKey[inOff++]); - t4 = mulInv(inKey[inOff]); - key[--p] = t4; - key[--p] = t3; - key[--p] = t2; - key[--p] = t1; - - return key; - } - - private int[] generateWorkingKey( - boolean forEncryption, - byte[] userKey) - { - if (forEncryption) - { - return expandKey(userKey); - } - else - { - return invertKey(expandKey(userKey)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IESEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IESEngine.java deleted file mode 100644 index 6a0fa80..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IESEngine.java +++ /dev/null @@ -1,421 +0,0 @@ -package org.bc.crypto.engines; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.EphemeralKeyPair; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.KeyParser; -import org.bc.crypto.Mac; -import org.bc.crypto.generators.EphemeralKeyPairGenerator; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.IESParameters; -import org.bc.crypto.params.IESWithCipherParameters; -import org.bc.crypto.params.KDFParameters; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; -import org.bc.util.BigIntegers; - -/** - * Support class for constructing integrated encryption ciphers - * for doing basic message exchanges on top of key agreement ciphers. - * Follows the description given in IEEE Std 1363a. - */ -public class IESEngine -{ - BasicAgreement agree; - DerivationFunction kdf; - Mac mac; - BufferedBlockCipher cipher; - byte[] macBuf; - - boolean forEncryption; - CipherParameters privParam, pubParam; - IESParameters param; - - byte[] V; - private EphemeralKeyPairGenerator keyPairGenerator; - private KeyParser keyParser; - - - /** - * set up for use with stream mode, where the key derivation function - * is used to provide a stream of bytes to xor with the message. - * - * @param agree the key agreement used as the basis for the encryption - * @param kdf the key derivation function used for byte generation - * @param mac the message authentication code generator for the message - */ - public IESEngine( - BasicAgreement agree, - DerivationFunction kdf, - Mac mac) - { - this.agree = agree; - this.kdf = kdf; - this.mac = mac; - this.macBuf = new byte[mac.getMacSize()]; - this.cipher = null; - } - - - /** - * set up for use in conjunction with a block cipher to handle the - * message. - * - * @param agree the key agreement used as the basis for the encryption - * @param kdf the key derivation function used for byte generation - * @param mac the message authentication code generator for the message - * @param cipher the cipher to used for encrypting the message - */ - public IESEngine( - BasicAgreement agree, - DerivationFunction kdf, - Mac mac, - BufferedBlockCipher cipher) - { - this.agree = agree; - this.kdf = kdf; - this.mac = mac; - this.macBuf = new byte[mac.getMacSize()]; - this.cipher = cipher; - } - - - /** - * Initialise the encryptor. - * - * @param forEncryption whether or not this is encryption/decryption. - * @param privParam our private key parameters - * @param pubParam the recipient's/sender's public key parameters - * @param param encoding and derivation parameters. - */ - public void init( - boolean forEncryption, - CipherParameters privParam, - CipherParameters pubParam, - CipherParameters param) - { - this.forEncryption = forEncryption; - this.privParam = privParam; - this.pubParam = pubParam; - this.param = (IESParameters)param; - this.V = new byte[0]; - } - - - /** - * Initialise the encryptor. - * - * @param publicKey the recipient's/sender's public key parameters - * @param params encoding and derivation parameters. - * @param ephemeralKeyPairGenerator the ephemeral key pair generator to use. - */ - public void init(AsymmetricKeyParameter publicKey, CipherParameters params, EphemeralKeyPairGenerator ephemeralKeyPairGenerator) - { - this.forEncryption = true; - this.pubParam = publicKey; - this.param = (IESParameters)params; - this.keyPairGenerator = ephemeralKeyPairGenerator; - } - - /** - * Initialise the encryptor. - * - * @param privateKey the recipient's private key. - * @param params encoding and derivation parameters. - * @param publicKeyParser the parser for reading the ephemeral public key. - */ - public void init(AsymmetricKeyParameter privateKey, CipherParameters params, KeyParser publicKeyParser) - { - this.forEncryption = false; - this.privParam = privateKey; - this.param = (IESParameters)params; - this.keyParser = publicKeyParser; - } - - public BufferedBlockCipher getCipher() - { - return cipher; - } - - public Mac getMac() - { - return mac; - } - - private byte[] encryptBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] C = null, K = null, K1 = null, K2 = null; - int len; - - if (cipher == null) - { - // Streaming mode. - K1 = new byte[inLen]; - K2 = new byte[param.getMacKeySize() / 8]; - K = new byte[K1.length + K2.length]; - - kdf.generateBytes(K, 0, K.length); - - if (V.length != 0) - { - System.arraycopy(K, 0, K2, 0, K2.length); - System.arraycopy(K, K2.length, K1, 0, K1.length); - } - else - { - System.arraycopy(K, 0, K1, 0, K1.length); - System.arraycopy(K, inLen, K2, 0, K2.length); - } - - C = new byte[inLen]; - - for (int i = 0; i != inLen; i++) - { - C[i] = (byte)(in[inOff + i] ^ K1[i]); - } - len = inLen; - - } - else - { - // Block cipher mode. - K1 = new byte[((IESWithCipherParameters)param).getCipherKeySize() / 8]; - K2 = new byte[param.getMacKeySize() / 8]; - K = new byte[K1.length + K2.length]; - - kdf.generateBytes(K, 0, K.length); - System.arraycopy(K, 0, K1, 0, K1.length); - System.arraycopy(K, K1.length, K2, 0, K2.length); - - cipher.init(true, new KeyParameter(K1)); - C = new byte[cipher.getOutputSize(inLen)]; - len = cipher.processBytes(in, inOff, inLen, C, 0); - len += cipher.doFinal(C, len); - } - - - // Convert the length of the encoding vector into a byte array. - byte[] P2 = param.getEncodingV(); - byte[] L2 = new byte[4]; - if (V.length != 0) - { - if (P2 == null) - { - Pack.intToBigEndian(0, L2, 0); - } - else - { - Pack.intToBigEndian(P2.length * 8, L2, 0); - } - } - - - // Apply the MAC. - byte[] T = new byte[mac.getMacSize()]; - - mac.init(new KeyParameter(K2)); - mac.update(C, 0, C.length); - if (P2 != null) - { - mac.update(P2, 0, P2.length); - } - if (V.length != 0) - { - mac.update(L2, 0, L2.length); - } - mac.doFinal(T, 0); - - - // Output the triple (V,C,T). - byte[] Output = new byte[V.length + len + T.length]; - System.arraycopy(V, 0, Output, 0, V.length); - System.arraycopy(C, 0, Output, V.length, len); - System.arraycopy(T, 0, Output, V.length + len, T.length); - return Output; - } - - private byte[] decryptBlock( - byte[] in_enc, - int inOff, - int inLen) - throws InvalidCipherTextException - { - byte[] M = null, K = null, K1 = null, K2 = null; - int len; - - if (cipher == null) - { - // Streaming mode. - K1 = new byte[inLen - V.length - mac.getMacSize()]; - K2 = new byte[param.getMacKeySize() / 8]; - K = new byte[K1.length + K2.length]; - - kdf.generateBytes(K, 0, K.length); - - if (V.length != 0) - { - System.arraycopy(K, 0, K2, 0, K2.length); - System.arraycopy(K, K2.length, K1, 0, K1.length); - } - else - { - System.arraycopy(K, 0, K1, 0, K1.length); - System.arraycopy(K, K1.length, K2, 0, K2.length); - } - - M = new byte[K1.length]; - - for (int i = 0; i != K1.length; i++) - { - M[i] = (byte)(in_enc[inOff + V.length + i] ^ K1[i]); - } - - - len = K1.length; - - } - else - { - // Block cipher mode. - K1 = new byte[((IESWithCipherParameters)param).getCipherKeySize() / 8]; - K2 = new byte[param.getMacKeySize() / 8]; - K = new byte[K1.length + K2.length]; - - kdf.generateBytes(K, 0, K.length); - System.arraycopy(K, 0, K1, 0, K1.length); - System.arraycopy(K, K1.length, K2, 0, K2.length); - - cipher.init(false, new KeyParameter(K1)); - - M = new byte[cipher.getOutputSize(inLen - V.length - mac.getMacSize())]; - len = cipher.processBytes(in_enc, inOff + V.length, inLen - V.length - mac.getMacSize(), M, 0); - len += cipher.doFinal(M, len); - - } - - - // Convert the length of the encoding vector into a byte array. - byte[] P2 = param.getEncodingV(); - byte[] L2 = new byte[4]; - if (V.length != 0) - { - if (P2 != null) - { - Pack.intToBigEndian(P2.length * 8, L2, 0); - } - else - { - Pack.intToBigEndian(0, L2, 0); - } - } - - - // Verify the MAC. - byte[] T1 = new byte[mac.getMacSize()]; - System.arraycopy(in_enc, inOff + inLen - T1.length, T1, 0, T1.length); - - byte[] T2 = new byte[T1.length]; - mac.init(new KeyParameter(K2)); - mac.update(in_enc, inOff + V.length, inLen - V.length - T2.length); - - if (P2 != null) - { - mac.update(P2, 0, P2.length); - } - if (V.length != 0) - { - mac.update(L2, 0, L2.length); - } - mac.doFinal(T2, 0); - - if (!Arrays.areEqual(T1, T2)) - { - throw new InvalidCipherTextException("Invalid MAC."); - } - - - // Output the message. - byte[] Output = new byte[len]; - System.arraycopy(M, 0, Output, 0, len); - return Output; - } - - - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forEncryption) - { - if (keyPairGenerator != null) - { - EphemeralKeyPair ephKeyPair = keyPairGenerator.generate(); - - this.privParam = ephKeyPair.getKeyPair().getPrivate(); - this.V = ephKeyPair.getEncodedPublicKey(); - } - } - else - { - if (keyParser != null) - { - ByteArrayInputStream bIn = new ByteArrayInputStream(in, inOff, inLen); - - try - { - this.pubParam = keyParser.readKey(bIn); - } - catch (IOException e) - { - throw new InvalidCipherTextException("unable to recover ephemeral public key: " + e.getMessage(), e); - } - - int encLength = (inLen - bIn.available()); - - this.V = new byte[encLength]; - System.arraycopy(in, inOff, V, 0, V.length); - } - } - - // Compute the common value and convert to byte array. - agree.init(privParam); - BigInteger z = agree.calculateAgreement(pubParam); - byte[] Z = BigIntegers.asUnsignedByteArray(agree.getFieldSize(), z); - - // Create input to KDF. - byte[] VZ = null; - - if (V.length != 0) - { - VZ = new byte[V.length + Z.length]; - System.arraycopy(V, 0, VZ, 0, V.length); - System.arraycopy(Z, 0, VZ, V.length, Z.length); - } - else - { - VZ = Z; - } - - // Initialise the KDF. - KDFParameters kdfParam = new KDFParameters(VZ, param.getDerivationV()); - kdf.init(kdfParam); - - return forEncryption - ? encryptBlock(in, inOff, inLen) - : decryptBlock(in, inOff, inLen); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ISAACEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ISAACEngine.java deleted file mode 100644 index 168e1bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/ISAACEngine.java +++ /dev/null @@ -1,245 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; - -/** - * Implementation of Bob Jenkin's ISAAC (Indirection Shift Accumulate Add and Count). - * see: http://www.burtleburtle.net/bob/rand/isaacafa.html -*/ -public class ISAACEngine - implements StreamCipher -{ - // Constants - private final int sizeL = 8, - stateArraySize = sizeL<<5; // 256 - - // Cipher's internal state - private int[] engineState = null, // mm - results = null; // randrsl - private int a = 0, b = 0, c = 0; - - // Engine state - private int index = 0; - private byte[] keyStream = new byte[stateArraySize<<2], // results expanded into bytes - workingKey = null; - private boolean initialised = false; - - /** - * initialise an ISAAC cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to ISAAC init - " + params.getClass().getName()); - } - /* - * ISAAC encryption and decryption is completely - * symmetrical, so the 'forEncryption' is - * irrelevant. - */ - KeyParameter p = (KeyParameter)params; - setKey(p.getKey()); - - return; - } - - public byte returnByte(byte in) - { - if (index == 0) - { - isaac(); - keyStream = intToByteLittle(results); - } - byte out = (byte)(keyStream[index]^in); - index = (index + 1) & 1023; - - return out; - } - - public void processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - if (index == 0) - { - isaac(); - keyStream = intToByteLittle(results); - } - out[i+outOff] = (byte)(keyStream[index]^in[i+inOff]); - index = (index + 1) & 1023; - } - } - - public String getAlgorithmName() - { - return "ISAAC"; - } - - public void reset() - { - setKey(workingKey); - } - - // Private implementation - private void setKey(byte[] keyBytes) - { - workingKey = keyBytes; - - if (engineState == null) - { - engineState = new int[stateArraySize]; - } - - if (results == null) - { - results = new int[stateArraySize]; - } - - int i, j, k; - - // Reset state - for (i = 0; i < stateArraySize; i++) - { - engineState[i] = results[i] = 0; - } - a = b = c = 0; - - // Reset index counter for output - index = 0; - - // Convert the key bytes to ints and put them into results[] for initialization - byte[] t = new byte[keyBytes.length + (keyBytes.length & 3)]; - System.arraycopy(keyBytes, 0, t, 0, keyBytes.length); - for (i = 0; i < t.length; i+=4) - { - results[i>>2] = byteToIntLittle(t, i); - } - - // It has begun? - int[] abcdefgh = new int[sizeL]; - - for (i = 0; i < sizeL; i++) - { - abcdefgh[i] = 0x9e3779b9; // Phi (golden ratio) - } - - for (i = 0; i < 4; i++) - { - mix(abcdefgh); - } - - for (i = 0; i < 2; i++) - { - for (j = 0; j < stateArraySize; j+=sizeL) - { - for (k = 0; k < sizeL; k++) - { - abcdefgh[k] += (i<1) ? results[j+k] : engineState[j+k]; - } - - mix(abcdefgh); - - for (k = 0; k < sizeL; k++) - { - engineState[j+k] = abcdefgh[k]; - } - } - } - - isaac(); - - initialised = true; - } - - private void isaac() - { - int i, x, y; - - b += ++c; - for (i = 0; i < stateArraySize; i++) - { - x = engineState[i]; - switch (i & 3) - { - case 0: a ^= (a << 13); break; - case 1: a ^= (a >>> 6); break; - case 2: a ^= (a << 2); break; - case 3: a ^= (a >>> 16); break; - } - a += engineState[(i+128) & 0xFF]; - engineState[i] = y = engineState[(x >>> 2) & 0xFF] + a + b; - results[i] = b = engineState[(y >>> 10) & 0xFF] + x; - } - } - - private void mix(int[] x) - { - x[0]^=x[1]<< 11; x[3]+=x[0]; x[1]+=x[2]; - x[1]^=x[2]>>> 2; x[4]+=x[1]; x[2]+=x[3]; - x[2]^=x[3]<< 8; x[5]+=x[2]; x[3]+=x[4]; - x[3]^=x[4]>>>16; x[6]+=x[3]; x[4]+=x[5]; - x[4]^=x[5]<< 10; x[7]+=x[4]; x[5]+=x[6]; - x[5]^=x[6]>>> 4; x[0]+=x[5]; x[6]+=x[7]; - x[6]^=x[7]<< 8; x[1]+=x[6]; x[7]+=x[0]; - x[7]^=x[0]>>> 9; x[2]+=x[7]; x[0]+=x[1]; - } - - private int byteToIntLittle(byte[] x, int offset) - { - return (int)(x[offset++] & 0xFF) | - ((x[offset++] & 0xFF) << 8) | - ((x[offset++] & 0xFF) << 16) | - (x[offset++] << 24); - } - - private byte[] intToByteLittle(int x) - { - byte[] out = new byte[4]; - out[3] = (byte)x; - out[2] = (byte)(x >>> 8); - out[1] = (byte)(x >>> 16); - out[0] = (byte)(x >>> 24); - return out; - } - - private byte[] intToByteLittle(int[] x) - { - byte[] out = new byte[4*x.length]; - for (int i = 0, j = 0; i < x.length; i++,j+=4) - { - System.arraycopy(intToByteLittle(x[i]), 0, out, j, 4); - } - return out; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IndexGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IndexGenerator.java deleted file mode 100644 index c507a2d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/IndexGenerator.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.Digest; -import org.bc.crypto.params.NTRUEncryptionParameters; -import org.bc.util.Arrays; - -/** - * An implementation of the Index Generation Function in IEEE P1363.1. - */ -public class IndexGenerator -{ - private byte[] seed; - private int N; - private int c; - private int minCallsR; - private int totLen; - private int remLen; - private BitString buf; - private int counter; - private boolean initialized; - private Digest hashAlg; - private int hLen; - - /** - * Constructs a new index generator. - * - * @param seed a seed of arbitrary length to initialize the index generator with - * @param params NtruEncrypt parameters - */ - IndexGenerator(byte[] seed, NTRUEncryptionParameters params) - { - this.seed = seed; - N = params.N; - c = params.c; - minCallsR = params.minCallsR; - - totLen = 0; - remLen = 0; - counter = 0; - hashAlg = params.hashAlg; - - hLen = hashAlg.getDigestSize(); // hash length - initialized = false; - } - - /** - * Returns a number i such that 0 <= i < N. - * - * @return - */ - int nextIndex() - { - if (!initialized) - { - buf = new BitString(); - byte[] hash = new byte[hashAlg.getDigestSize()]; - while (counter < minCallsR) - { - appendHash(buf, hash); - counter++; - } - totLen = minCallsR * 8 * hLen; - remLen = totLen; - initialized = true; - } - - while (true) - { - totLen += c; - BitString M = buf.getTrailing(remLen); - if (remLen < c) - { - int tmpLen = c - remLen; - int cThreshold = counter + (tmpLen + hLen - 1) / hLen; - byte[] hash = new byte[hashAlg.getDigestSize()]; - while (counter < cThreshold) - { - appendHash(M, hash); - counter++; - if (tmpLen > 8 * hLen) - { - tmpLen -= 8 * hLen; - } - } - remLen = 8 * hLen - tmpLen; - buf = new BitString(); - buf.appendBits(hash); - } - else - { - remLen -= c; - } - - int i = M.getLeadingAsInt(c); // assume c<32 - if (i < (1 << c) - ((1 << c) % N)) - { - return i % N; - } - } - } - - private void appendHash(BitString m, byte[] hash) - { - hashAlg.update(seed, 0, seed.length); - - putInt(hashAlg, counter); - - hashAlg.doFinal(hash, 0); - - m.appendBits(hash); - } - - private void putInt(Digest hashAlg, int counter) - { - hashAlg.update((byte)(counter >> 24)); - hashAlg.update((byte)(counter >> 16)); - hashAlg.update((byte)(counter >> 8)); - hashAlg.update((byte)counter); - } - - /** - * Represents a string of bits and supports appending, reading the head, and reading the tail. - */ - public static class BitString - { - byte[] bytes = new byte[4]; - int numBytes; // includes the last byte even if only some of its bits are used - int lastByteBits; // lastByteBits <= 8 - - /** - * Appends all bits in a byte array to the end of the bit string. - * - * @param bytes a byte array - */ - void appendBits(byte[] bytes) - { - for (int i = 0; i != bytes.length; i++) - { - appendBits(bytes[i]); - } - } - - /** - * Appends all bits in a byte to the end of the bit string. - * - * @param b a byte - */ - public void appendBits(byte b) - { - if (numBytes == bytes.length) - { - bytes = copyOf(bytes, 2 * bytes.length); - } - - if (numBytes == 0) - { - numBytes = 1; - bytes[0] = b; - lastByteBits = 8; - } - else if (lastByteBits == 8) - { - bytes[numBytes++] = b; - } - else - { - int s = 8 - lastByteBits; - bytes[numBytes - 1] |= (b & 0xFF) << lastByteBits; - bytes[numBytes++] = (byte)((b & 0xFF) >> s); - } - } - - /** - * Returns the last numBits bits from the end of the bit string. - * - * @param numBits number of bits - * @return a new BitString of length numBits - */ - public BitString getTrailing(int numBits) - { - BitString newStr = new BitString(); - newStr.numBytes = (numBits + 7) / 8; - newStr.bytes = new byte[newStr.numBytes]; - for (int i = 0; i < newStr.numBytes; i++) - { - newStr.bytes[i] = bytes[i]; - } - - newStr.lastByteBits = numBits % 8; - if (newStr.lastByteBits == 0) - { - newStr.lastByteBits = 8; - } - else - { - int s = 32 - newStr.lastByteBits; - newStr.bytes[newStr.numBytes - 1] = (byte)(newStr.bytes[newStr.numBytes - 1] << s >>> s); - } - - return newStr; - } - - /** - * Returns up to 32 bits from the beginning of the bit string. - * - * @param numBits number of bits - * @return an int whose lower numBits bits are the beginning of the bit string - */ - public int getLeadingAsInt(int numBits) - { - int startBit = (numBytes - 1) * 8 + lastByteBits - numBits; - int startByte = startBit / 8; - - int startBitInStartByte = startBit % 8; - int sum = (bytes[startByte] & 0xFF) >>> startBitInStartByte; - int shift = 8 - startBitInStartByte; - for (int i = startByte + 1; i < numBytes; i++) - { - sum |= (bytes[i] & 0xFF) << shift; - shift += 8; - } - - return sum; - } - - public byte[] getBytes() - { - return Arrays.clone(bytes); - } - } - - private static byte[] copyOf(byte[] src, int len) - { - byte[] tmp = new byte[len]; - - System.arraycopy(src, 0, tmp, 0, len < src.length ? len : src.length); - - return tmp; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NTRUEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NTRUEngine.java deleted file mode 100644 index ce13395..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NTRUEngine.java +++ /dev/null @@ -1,499 +0,0 @@ -package org.bc.crypto.engines; - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.params.NTRUEncryptionParameters; -import org.bc.crypto.params.NTRUEncryptionPrivateKeyParameters; -import org.bc.crypto.params.NTRUEncryptionPublicKeyParameters; -import org.bc.crypto.params.NTRUParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; -import org.bc.math.ntru.polynomial.ProductFormPolynomial; -import org.bc.math.ntru.polynomial.SparseTernaryPolynomial; -import org.bc.math.ntru.polynomial.TernaryPolynomial; -import org.bc.util.Arrays; - -/** - * Encrypts, decrypts data and generates key pairs.
    - * The parameter p is hardcoded to 3. - */ -public class NTRUEngine - implements AsymmetricBlockCipher -{ - private boolean forEncryption; - private NTRUEncryptionParameters params; - private NTRUEncryptionPublicKeyParameters pubKey; - private NTRUEncryptionPrivateKeyParameters privKey; - private SecureRandom random; - - /** - * Constructs a new instance with a set of encryption parameters. - * - */ - public NTRUEngine() - { - } - - public void init(boolean forEncryption, CipherParameters parameters) - { - this.forEncryption = forEncryption; - if (forEncryption) - { - if (parameters instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)parameters; - - this.random = p.getRandom(); - this.pubKey = (NTRUEncryptionPublicKeyParameters)p.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.pubKey = (NTRUEncryptionPublicKeyParameters)parameters; - } - - this.params = pubKey.getParameters(); - } - else - { - this.privKey = (NTRUEncryptionPrivateKeyParameters)parameters; - this.params = privKey.getParameters(); - } - } - - public int getInputBlockSize() - { - return params.maxMsgLenBytes; - } - - public int getOutputBlockSize() - { - return ((params.N * log2(params.q)) + 7) / 8; - } - - public byte[] processBlock(byte[] in, int inOff, int len) - throws InvalidCipherTextException - { - byte[] tmp = new byte[len]; - - System.arraycopy(in, inOff, tmp, 0, len); - - if (forEncryption) - { - return encrypt(tmp, pubKey); - } - else - { - return decrypt(tmp, privKey); - } - } - - /** - * Encrypts a message.
    - * See P1363.1 section 9.2.2. - * - * @param m The message to encrypt - * @param pubKey the public key to encrypt the message with - * @return the encrypted message - */ - private byte[] encrypt(byte[] m, NTRUEncryptionPublicKeyParameters pubKey) - { - IntegerPolynomial pub = pubKey.h; - int N = params.N; - int q = params.q; - - int maxLenBytes = params.maxMsgLenBytes; - int db = params.db; - int bufferLenBits = params.bufferLenBits; - int dm0 = params.dm0; - int pkLen = params.pkLen; - int minCallsMask = params.minCallsMask; - boolean hashSeed = params.hashSeed; - byte[] oid = params.oid; - - int l = m.length; - if (maxLenBytes > 255) - { - throw new IllegalArgumentException("llen values bigger than 1 are not supported"); - } - if (l > maxLenBytes) - { - throw new DataLengthException("Message too long: " + l + ">" + maxLenBytes); - } - - while (true) - { - // M = b|octL|m|p0 - byte[] b = new byte[db / 8]; - random.nextBytes(b); - byte[] p0 = new byte[maxLenBytes + 1 - l]; - byte[] M = new byte[bufferLenBits / 8]; - - System.arraycopy(b, 0, M, 0, b.length); - M[b.length] = (byte)l; - System.arraycopy(m, 0, M, b.length + 1, m.length); - System.arraycopy(p0, 0, M, b.length + 1 + m.length, p0.length); - - IntegerPolynomial mTrin = IntegerPolynomial.fromBinary3Sves(M, N); - - // sData = OID|m|b|hTrunc - byte[] bh = pub.toBinary(q); - byte[] hTrunc = copyOf(bh, pkLen / 8); - byte[] sData = buildSData(oid, m, l, b, hTrunc); - - Polynomial r = generateBlindingPoly(sData, M); - IntegerPolynomial R = r.mult(pub, q); - IntegerPolynomial R4 = (IntegerPolynomial)R.clone(); - R4.modPositive(4); - byte[] oR4 = R4.toBinary(4); - IntegerPolynomial mask = MGF(oR4, N, minCallsMask, hashSeed); - mTrin.add(mask); - mTrin.mod3(); - - if (mTrin.count(-1) < dm0) - { - continue; - } - if (mTrin.count(0) < dm0) - { - continue; - } - if (mTrin.count(1) < dm0) - { - continue; - } - - R.add(mTrin, q); - R.ensurePositive(q); - return R.toBinary(q); - } - } - - private byte[] buildSData(byte[] oid, byte[] m, int l, byte[] b, byte[] hTrunc) - { - byte[] sData = new byte[oid.length + l + b.length + hTrunc.length]; - - System.arraycopy(oid, 0, sData, 0, oid.length); - System.arraycopy(m, 0, sData, oid.length, m.length); - System.arraycopy(b, 0, sData, oid.length + m.length, b.length); - System.arraycopy(hTrunc, 0, sData, oid.length + m.length + b.length, hTrunc.length); - return sData; - } - - protected IntegerPolynomial encrypt(IntegerPolynomial m, TernaryPolynomial r, IntegerPolynomial pubKey) - { - IntegerPolynomial e = r.mult(pubKey, params.q); - e.add(m, params.q); - e.ensurePositive(params.q); - return e; - } - - /** - * Deterministically generates a blinding polynomial from a seed and a message representative. - * - * @param seed - * @param M message representative - * @return a blinding polynomial - */ - private Polynomial generateBlindingPoly(byte[] seed, byte[] M) - { - IndexGenerator ig = new IndexGenerator(seed, params); - - if (params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT) - { - SparseTernaryPolynomial r1 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr1)); - SparseTernaryPolynomial r2 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr2)); - SparseTernaryPolynomial r3 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr3)); - return new ProductFormPolynomial(r1, r2, r3); - } - else - { - int dr = params.dr; - boolean sparse = params.sparse; - int[] r = generateBlindingCoeffs(ig, dr); - if (sparse) - { - return new SparseTernaryPolynomial(r); - } - else - { - return new DenseTernaryPolynomial(r); - } - } - } - - /** - * Generates an int array containing dr elements equal to 1 - * and dr elements equal to -1 using an index generator. - * - * @param ig an index generator - * @param dr number of ones / negative ones - * @return an array containing numbers between -1 and 1 - */ - private int[] generateBlindingCoeffs(IndexGenerator ig, int dr) - { - int N = params.N; - - int[] r = new int[N]; - for (int coeff = -1; coeff <= 1; coeff += 2) - { - int t = 0; - while (t < dr) - { - int i = ig.nextIndex(); - if (r[i] == 0) - { - r[i] = coeff; - t++; - } - } - } - - return r; - } - - /** - * An implementation of MGF-TP-1 from P1363.1 section 8.4.1.1. - * - * @param seed - * @param N - * @param minCallsR - * @param hashSeed whether to hash the seed - * @return - */ - private IntegerPolynomial MGF(byte[] seed, int N, int minCallsR, boolean hashSeed) - { - Digest hashAlg = params.hashAlg; - int hashLen = hashAlg.getDigestSize(); - byte[] buf = new byte[minCallsR * hashLen]; - byte[] Z = hashSeed ? calcHash(hashAlg, seed) : seed; - int counter = 0; - while (counter < minCallsR) - { - hashAlg.update(Z, 0, Z.length); - putInt(hashAlg, counter); - - byte[] hash = calcHash(hashAlg); - System.arraycopy(hash, 0, buf, counter * hashLen, hashLen); - counter++; - } - - IntegerPolynomial i = new IntegerPolynomial(N); - while (true) - { - int cur = 0; - for (int index = 0; index != buf.length; index++) - { - int O = (int)buf[index] & 0xFF; - if (O >= 243) // 243 = 3^5 - { - continue; - } - - for (int terIdx = 0; terIdx < 4; terIdx++) - { - int rem3 = O % 3; - i.coeffs[cur] = rem3 - 1; - cur++; - if (cur == N) - { - return i; - } - O = (O - rem3) / 3; - } - - i.coeffs[cur] = O - 1; - cur++; - if (cur == N) - { - return i; - } - } - - if (cur >= N) - { - return i; - } - - hashAlg.update(Z, 0, Z.length); - putInt(hashAlg, counter); - - byte[] hash = calcHash(hashAlg); - - buf = hash; - - counter++; - } - } - - private void putInt(Digest hashAlg, int counter) - { - hashAlg.update((byte)(counter >> 24)); - hashAlg.update((byte)(counter >> 16)); - hashAlg.update((byte)(counter >> 8)); - hashAlg.update((byte)counter); - } - - private byte[] calcHash(Digest hashAlg) - { - byte[] tmp = new byte[hashAlg.getDigestSize()]; - - hashAlg.doFinal(tmp, 0); - - return tmp; - } - - private byte[] calcHash(Digest hashAlg, byte[] input) - { - byte[] tmp = new byte[hashAlg.getDigestSize()]; - - hashAlg.update(input, 0, input.length); - hashAlg.doFinal(tmp, 0); - - return tmp; - } - /** - * Decrypts a message.
    - * See P1363.1 section 9.2.3. - * - * @param data The message to decrypt - * @param privKey the corresponding private key - * @return the decrypted message - * @throws InvalidCipherTextException if the encrypted data is invalid, or maxLenBytes is greater than 255 - */ - private byte[] decrypt(byte[] data, NTRUEncryptionPrivateKeyParameters privKey) - throws InvalidCipherTextException - { - Polynomial priv_t = privKey.t; - IntegerPolynomial priv_fp = privKey.fp; - IntegerPolynomial pub = privKey.h; - int N = params.N; - int q = params.q; - int db = params.db; - int maxMsgLenBytes = params.maxMsgLenBytes; - int dm0 = params.dm0; - int pkLen = params.pkLen; - int minCallsMask = params.minCallsMask; - boolean hashSeed = params.hashSeed; - byte[] oid = params.oid; - - if (maxMsgLenBytes > 255) - { - throw new DataLengthException("maxMsgLenBytes values bigger than 255 are not supported"); - } - - int bLen = db / 8; - - IntegerPolynomial e = IntegerPolynomial.fromBinary(data, N, q); - IntegerPolynomial ci = decrypt(e, priv_t, priv_fp); - - if (ci.count(-1) < dm0) - { - throw new InvalidCipherTextException("Less than dm0 coefficients equal -1"); - } - if (ci.count(0) < dm0) - { - throw new InvalidCipherTextException("Less than dm0 coefficients equal 0"); - } - if (ci.count(1) < dm0) - { - throw new InvalidCipherTextException("Less than dm0 coefficients equal 1"); - } - - IntegerPolynomial cR = (IntegerPolynomial)e.clone(); - cR.sub(ci); - cR.modPositive(q); - IntegerPolynomial cR4 = (IntegerPolynomial)cR.clone(); - cR4.modPositive(4); - byte[] coR4 = cR4.toBinary(4); - IntegerPolynomial mask = MGF(coR4, N, minCallsMask, hashSeed); - IntegerPolynomial cMTrin = ci; - cMTrin.sub(mask); - cMTrin.mod3(); - byte[] cM = cMTrin.toBinary3Sves(); - - byte[] cb = new byte[bLen]; - System.arraycopy(cM, 0, cb, 0, bLen); - int cl = cM[bLen] & 0xFF; // llen=1, so read one byte - if (cl > maxMsgLenBytes) - { - throw new InvalidCipherTextException("Message too long: " + cl + ">" + maxMsgLenBytes); - } - byte[] cm = new byte[cl]; - System.arraycopy(cM, bLen + 1, cm, 0, cl); - byte[] p0 = new byte[cM.length - (bLen + 1 + cl)]; - System.arraycopy(cM, bLen + 1 + cl, p0, 0, p0.length); - if (!Arrays.areEqual(p0, new byte[p0.length])) - { - throw new InvalidCipherTextException("The message is not followed by zeroes"); - } - - // sData = OID|m|b|hTrunc - byte[] bh = pub.toBinary(q); - byte[] hTrunc = copyOf(bh, pkLen / 8); - byte[] sData = buildSData(oid, cm, cl, cb, hTrunc); - - Polynomial cr = generateBlindingPoly(sData, cm); - IntegerPolynomial cRPrime = cr.mult(pub); - cRPrime.modPositive(q); - if (!cRPrime.equals(cR)) - { - throw new InvalidCipherTextException("Invalid message encoding"); - } - - return cm; - } - - /** - * @param e - * @param priv_t a polynomial such that if fastFp=true, f=1+3*priv_t; otherwise, f=priv_t - * @param priv_fp - * @return - */ - protected IntegerPolynomial decrypt(IntegerPolynomial e, Polynomial priv_t, IntegerPolynomial priv_fp) - { - IntegerPolynomial a; - if (params.fastFp) - { - a = priv_t.mult(e, params.q); - a.mult(3); - a.add(e); - } - else - { - a = priv_t.mult(e, params.q); - } - a.center0(params.q); - a.mod3(); - - IntegerPolynomial c = params.fastFp ? a : new DenseTernaryPolynomial(a).mult(priv_fp, 3); - c.center0(3); - return c; - } - - private byte[] copyOf(byte[] src, int len) - { - byte[] tmp = new byte[len]; - - System.arraycopy(src, 0, tmp, 0, len < src.length ? len : src.length); - - return tmp; - } - - private int log2(int value) - { - if (value == 2048) - { - return 11; - } - - throw new IllegalStateException("log2 not fully implemented"); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NaccacheSternEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NaccacheSternEngine.java deleted file mode 100644 index 6e6033a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NaccacheSternEngine.java +++ /dev/null @@ -1,438 +0,0 @@ -package org.bc.crypto.engines; - -import java.math.BigInteger; -import java.util.Vector; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.params.NaccacheSternKeyParameters; -import org.bc.crypto.params.NaccacheSternPrivateKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - - -/** - * NaccacheStern Engine. For details on this cipher, please see - * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf - */ -public class NaccacheSternEngine - implements AsymmetricBlockCipher -{ - private boolean forEncryption; - - private NaccacheSternKeyParameters key; - - private Vector[] lookup = null; - - private boolean debug = false; - - private static BigInteger ZERO = BigInteger.valueOf(0); - private static BigInteger ONE = BigInteger.valueOf(1); - - /** - * Initializes this algorithm. Must be called before all other Functions. - * - * @see org.bc.crypto.AsymmetricBlockCipher#init(boolean, - * org.bc.crypto.CipherParameters) - */ - public void init(boolean forEncryption, CipherParameters param) - { - this.forEncryption = forEncryption; - - if (param instanceof ParametersWithRandom) - { - param = ((ParametersWithRandom) param).getParameters(); - } - - key = (NaccacheSternKeyParameters)param; - - // construct lookup table for faster decryption if necessary - if (!this.forEncryption) - { - if (debug) - { - System.out.println("Constructing lookup Array"); - } - NaccacheSternPrivateKeyParameters priv = (NaccacheSternPrivateKeyParameters)key; - Vector primes = priv.getSmallPrimes(); - lookup = new Vector[primes.size()]; - for (int i = 0; i < primes.size(); i++) - { - BigInteger actualPrime = (BigInteger)primes.elementAt(i); - int actualPrimeValue = actualPrime.intValue(); - - lookup[i] = new Vector(); - lookup[i].addElement(ONE); - - if (debug) - { - System.out.println("Constructing lookup ArrayList for " + actualPrimeValue); - } - - BigInteger accJ = ZERO; - - for (int j = 1; j < actualPrimeValue; j++) - { - accJ = accJ.add(priv.getPhi_n()); - BigInteger comp = accJ.divide(actualPrime); - lookup[i].addElement(priv.getG().modPow(comp, priv.getModulus())); - } - } - } - } - - public void setDebug(boolean debug) - { - this.debug = debug; - } - - /** - * Returns the input block size of this algorithm. - * - * @see org.bc.crypto.AsymmetricBlockCipher#getInputBlockSize() - */ - public int getInputBlockSize() - { - if (forEncryption) - { - // We can only encrypt values up to lowerSigmaBound - return (key.getLowerSigmaBound() + 7) / 8 - 1; - } - else - { - // We pad to modulus-size bytes for easier decryption. - return key.getModulus().toByteArray().length; - } - } - - /** - * Returns the output block size of this algorithm. - * - * @see org.bc.crypto.AsymmetricBlockCipher#getOutputBlockSize() - */ - public int getOutputBlockSize() - { - if (forEncryption) - { - // encrypted Data is always padded up to modulus size - return key.getModulus().toByteArray().length; - } - else - { - // decrypted Data has upper limit lowerSigmaBound - return (key.getLowerSigmaBound() + 7) / 8 - 1; - } - } - - /** - * Process a single Block using the Naccache-Stern algorithm. - * - * @see org.bc.crypto.AsymmetricBlockCipher#processBlock(byte[], - * int, int) - */ - public byte[] processBlock(byte[] in, int inOff, int len) throws InvalidCipherTextException - { - if (key == null) - { - throw new IllegalStateException("NaccacheStern engine not initialised"); - } - if (len > (getInputBlockSize() + 1)) - { - throw new DataLengthException("input too large for Naccache-Stern cipher.\n"); - } - - if (!forEncryption) - { - // At decryption make sure that we receive padded data blocks - if (len < getInputBlockSize()) - { - throw new InvalidCipherTextException("BlockLength does not match modulus for Naccache-Stern cipher.\n"); - } - } - - byte[] block; - - if (inOff != 0 || len != in.length) - { - block = new byte[len]; - System.arraycopy(in, inOff, block, 0, len); - } - else - { - block = in; - } - - // transform input into BigInteger - BigInteger input = new BigInteger(1, block); - if (debug) - { - System.out.println("input as BigInteger: " + input); - } - byte[] output; - if (forEncryption) - { - output = encrypt(input); - } - else - { - Vector plain = new Vector(); - NaccacheSternPrivateKeyParameters priv = (NaccacheSternPrivateKeyParameters)key; - Vector primes = priv.getSmallPrimes(); - // Get Chinese Remainders of CipherText - for (int i = 0; i < primes.size(); i++) - { - BigInteger exp = input.modPow(priv.getPhi_n().divide((BigInteger)primes.elementAt(i)), priv.getModulus()); - Vector al = lookup[i]; - if (lookup[i].size() != ((BigInteger)primes.elementAt(i)).intValue()) - { - if (debug) - { - System.out.println("Prime is " + primes.elementAt(i) + ", lookup table has size " + al.size()); - } - throw new InvalidCipherTextException("Error in lookup Array for " - + ((BigInteger)primes.elementAt(i)).intValue() - + ": Size mismatch. Expected ArrayList with length " - + ((BigInteger)primes.elementAt(i)).intValue() + " but found ArrayList of length " - + lookup[i].size()); - } - int lookedup = al.indexOf(exp); - - if (lookedup == -1) - { - if (debug) - { - System.out.println("Actual prime is " + primes.elementAt(i)); - System.out.println("Decrypted value is " + exp); - - System.out.println("LookupList for " + primes.elementAt(i) + " with size " + lookup[i].size() - + " is: "); - for (int j = 0; j < lookup[i].size(); j++) - { - System.out.println(lookup[i].elementAt(j)); - } - } - throw new InvalidCipherTextException("Lookup failed"); - } - plain.addElement(BigInteger.valueOf(lookedup)); - } - BigInteger test = chineseRemainder(plain, primes); - - // Should not be used as an oracle, so reencrypt output to see - // if it corresponds to input - - // this breaks probabilisic encryption, so disable it. Anyway, we do - // use the first n primes for key generation, so it is pretty easy - // to guess them. But as stated in the paper, this is not a security - // breach. So we can just work with the correct sigma. - - // if (debug) { - // System.out.println("Decryption is " + test); - // } - // if ((key.getG().modPow(test, key.getModulus())).equals(input)) { - // output = test.toByteArray(); - // } else { - // if(debug){ - // System.out.println("Engine seems to be used as an oracle, - // returning null"); - // } - // output = null; - // } - - output = test.toByteArray(); - - } - - return output; - } - - /** - * Encrypts a BigInteger aka Plaintext with the public key. - * - * @param plain - * The BigInteger to encrypt - * @return The byte[] representation of the encrypted BigInteger (i.e. - * crypted.toByteArray()) - */ - public byte[] encrypt(BigInteger plain) - { - // Always return modulus size values 0-padded at the beginning - // 0-padding at the beginning is correctly parsed by BigInteger :) - byte[] output = key.getModulus().toByteArray(); - Arrays.fill(output, (byte)0); - byte[] tmp = key.getG().modPow(plain, key.getModulus()).toByteArray(); - System - .arraycopy(tmp, 0, output, output.length - tmp.length, - tmp.length); - if (debug) - { - System.out - .println("Encrypted value is: " + new BigInteger(output)); - } - return output; - } - - /** - * Adds the contents of two encrypted blocks mod sigma - * - * @param block1 - * the first encrypted block - * @param block2 - * the second encrypted block - * @return encrypt((block1 + block2) mod sigma) - * @throws InvalidCipherTextException - */ - public byte[] addCryptedBlocks(byte[] block1, byte[] block2) - throws InvalidCipherTextException - { - // check for correct blocksize - if (forEncryption) - { - if ((block1.length > getOutputBlockSize()) - || (block2.length > getOutputBlockSize())) - { - throw new InvalidCipherTextException( - "BlockLength too large for simple addition.\n"); - } - } - else - { - if ((block1.length > getInputBlockSize()) - || (block2.length > getInputBlockSize())) - { - throw new InvalidCipherTextException( - "BlockLength too large for simple addition.\n"); - } - } - - // calculate resulting block - BigInteger m1Crypt = new BigInteger(1, block1); - BigInteger m2Crypt = new BigInteger(1, block2); - BigInteger m1m2Crypt = m1Crypt.multiply(m2Crypt); - m1m2Crypt = m1m2Crypt.mod(key.getModulus()); - if (debug) - { - System.out.println("c(m1) as BigInteger:....... " + m1Crypt); - System.out.println("c(m2) as BigInteger:....... " + m2Crypt); - System.out.println("c(m1)*c(m2)%n = c(m1+m2)%n: " + m1m2Crypt); - } - - byte[] output = key.getModulus().toByteArray(); - Arrays.fill(output, (byte)0); - System.arraycopy(m1m2Crypt.toByteArray(), 0, output, output.length - - m1m2Crypt.toByteArray().length, - m1m2Crypt.toByteArray().length); - - return output; - } - - /** - * Convenience Method for data exchange with the cipher. - * - * Determines blocksize and splits data to blocksize. - * - * @param data the data to be processed - * @return the data after it went through the NaccacheSternEngine. - * @throws InvalidCipherTextException - */ - public byte[] processData(byte[] data) throws InvalidCipherTextException - { - if (debug) - { - System.out.println(); - } - if (data.length > getInputBlockSize()) - { - int inBlocksize = getInputBlockSize(); - int outBlocksize = getOutputBlockSize(); - if (debug) - { - System.out.println("Input blocksize is: " + inBlocksize + " bytes"); - System.out.println("Output blocksize is: " + outBlocksize + " bytes"); - System.out.println("Data has length:.... " + data.length + " bytes"); - } - int datapos = 0; - int retpos = 0; - byte[] retval = new byte[(data.length / inBlocksize + 1) * outBlocksize]; - while (datapos < data.length) - { - byte[] tmp; - if (datapos + inBlocksize < data.length) - { - tmp = processBlock(data, datapos, inBlocksize); - datapos += inBlocksize; - } - else - { - tmp = processBlock(data, datapos, data.length - datapos); - datapos += data.length - datapos; - } - if (debug) - { - System.out.println("new datapos is " + datapos); - } - if (tmp != null) - { - System.arraycopy(tmp, 0, retval, retpos, tmp.length); - - retpos += tmp.length; - } - else - { - if (debug) - { - System.out.println("cipher returned null"); - } - throw new InvalidCipherTextException("cipher returned null"); - } - } - byte[] ret = new byte[retpos]; - System.arraycopy(retval, 0, ret, 0, retpos); - if (debug) - { - System.out.println("returning " + ret.length + " bytes"); - } - return ret; - } - else - { - if (debug) - { - System.out.println("data size is less then input block size, processing directly"); - } - return processBlock(data, 0, data.length); - } - } - - /** - * Computes the integer x that is expressed through the given primes and the - * congruences with the chinese remainder theorem (CRT). - * - * @param congruences - * the congruences c_i - * @param primes - * the primes p_i - * @return an integer x for that x % p_i == c_i - */ - private static BigInteger chineseRemainder(Vector congruences, Vector primes) - { - BigInteger retval = ZERO; - BigInteger all = ONE; - for (int i = 0; i < primes.size(); i++) - { - all = all.multiply((BigInteger)primes.elementAt(i)); - } - for (int i = 0; i < primes.size(); i++) - { - BigInteger a = (BigInteger)primes.elementAt(i); - BigInteger b = all.divide(a); - BigInteger b_ = b.modInverse(a); - BigInteger tmp = b.multiply(b_); - tmp = tmp.multiply((BigInteger)congruences.elementAt(i)); - retval = retval.add(tmp); - } - - return retval.mod(all); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NoekeonEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NoekeonEngine.java deleted file mode 100644 index 52019e0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NoekeonEngine.java +++ /dev/null @@ -1,262 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * A Noekeon engine, using direct-key mode. - */ - -public class NoekeonEngine - implements BlockCipher -{ - private static final int genericSize = 16; // Block and key size, as well as the amount of rounds. - - private static final int[] nullVector = - { - 0x00, 0x00, 0x00, 0x00 // Used in decryption - }, - - roundConstants = - { - 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, - 0x2f, 0x5e, 0xbc, 0x63, - 0xc6, 0x97, 0x35, 0x6a, - 0xd4 - }; - - private int[] state = new int[4], // a - subKeys = new int[4], // k - decryptKeys = new int[4]; - - private boolean _initialised, - _forEncryption; - - /** - * Create an instance of the Noekeon encryption algorithm - * and set some defaults - */ - public NoekeonEngine() - { - _initialised = false; - } - - public String getAlgorithmName() - { - return "Noekeon"; - } - - public int getBlockSize() - { - return genericSize; - } - - /** - * initialise - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to Noekeon init - " + params.getClass().getName()); - } - - _forEncryption = forEncryption; - _initialised = true; - - KeyParameter p = (KeyParameter)params; - - setKey(p.getKey()); - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (!_initialised) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - if ((inOff + genericSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + genericSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - return (_forEncryption) ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param key the key to be used - */ - private void setKey( - byte[] key) - { - subKeys[0] = bytesToIntBig(key, 0); - subKeys[1] = bytesToIntBig(key, 4); - subKeys[2] = bytesToIntBig(key, 8); - subKeys[3] = bytesToIntBig(key, 12); - } - - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - state[0] = bytesToIntBig(in, inOff); - state[1] = bytesToIntBig(in, inOff+4); - state[2] = bytesToIntBig(in, inOff+8); - state[3] = bytesToIntBig(in, inOff+12); - - int i; - for (i = 0; i < genericSize; i++) - { - state[0] ^= roundConstants[i]; - theta(state, subKeys); - pi1(state); - gamma(state); - pi2(state); - } - - state[0] ^= roundConstants[i]; - theta(state, subKeys); - - intToBytesBig(state[0], out, outOff); - intToBytesBig(state[1], out, outOff+4); - intToBytesBig(state[2], out, outOff+8); - intToBytesBig(state[3], out, outOff+12); - - return genericSize; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - state[0] = bytesToIntBig(in, inOff); - state[1] = bytesToIntBig(in, inOff+4); - state[2] = bytesToIntBig(in, inOff+8); - state[3] = bytesToIntBig(in, inOff+12); - - System.arraycopy(subKeys, 0, decryptKeys, 0, subKeys.length); - theta(decryptKeys, nullVector); - - int i; - for (i = genericSize; i > 0; i--) - { - theta(state, decryptKeys); - state[0] ^= roundConstants[i]; - pi1(state); - gamma(state); - pi2(state); - } - - theta(state, decryptKeys); - state[0] ^= roundConstants[i]; - - intToBytesBig(state[0], out, outOff); - intToBytesBig(state[1], out, outOff+4); - intToBytesBig(state[2], out, outOff+8); - intToBytesBig(state[3], out, outOff+12); - - return genericSize; - } - - private void gamma(int[] a) - { - a[1] ^= ~a[3] & ~a[2]; - a[0] ^= a[2] & a[1]; - - int tmp = a[3]; - a[3] = a[0]; - a[0] = tmp; - a[2] ^= a[0]^a[1]^a[3]; - - a[1] ^= ~a[3] & ~a[2]; - a[0] ^= a[2] & a[1]; - } - - private void theta(int[] a, int[] k) - { - int tmp; - - tmp = a[0]^a[2]; - tmp ^= rotl(tmp,8)^rotl(tmp,24); - a[1] ^= tmp; - a[3] ^= tmp; - - for (int i = 0; i < 4; i++) - { - a[i] ^= k[i]; - } - - tmp = a[1]^a[3]; - tmp ^= rotl(tmp,8)^rotl(tmp,24); - a[0] ^= tmp; - a[2] ^= tmp; - } - - private void pi1(int[] a) - { - a[1] = rotl(a[1], 1); - a[2] = rotl(a[2], 5); - a[3] = rotl(a[3], 2); - } - - private void pi2(int[] a) - { - a[1] = rotl(a[1], 31); - a[2] = rotl(a[2], 27); - a[3] = rotl(a[3], 30); - } - - // Helpers - - private int bytesToIntBig(byte[] in, int off) - { - return ((in[off++]) << 24) | - ((in[off++] & 0xff) << 16) | - ((in[off++] & 0xff) << 8) | - (in[off ] & 0xff); - } - - private void intToBytesBig(int x, byte[] out, int off) - { - out[off++] = (byte)(x >>> 24); - out[off++] = (byte)(x >>> 16); - out[off++] = (byte)(x >>> 8); - out[off ] = (byte)x; - } - - private int rotl(int x, int y) - { - return (x << y) | (x >>> (32-y)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NullEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NullEngine.java deleted file mode 100644 index a89909e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/NullEngine.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; - -/** - * The no-op engine that just copies bytes through, irrespective of whether encrypting and decrypting. - * Provided for the sake of completeness. - */ -public class NullEngine implements BlockCipher -{ - private boolean initialised; - protected static final int BLOCK_SIZE = 1; - - /** - * Standard constructor. - */ - public NullEngine() - { - super(); - } - - /* (non-Javadoc) - * @see org.bouncycastle.crypto.BlockCipher#init(boolean, org.bouncycastle.crypto.CipherParameters) - */ - public void init(boolean forEncryption, CipherParameters params) throws IllegalArgumentException - { - // we don't mind any parameters that may come in - this.initialised = true; - } - - /* (non-Javadoc) - * @see org.bouncycastle.crypto.BlockCipher#getAlgorithmName() - */ - public String getAlgorithmName() - { - return "Null"; - } - - /* (non-Javadoc) - * @see org.bouncycastle.crypto.BlockCipher#getBlockSize() - */ - public int getBlockSize() - { - return BLOCK_SIZE; - } - - /* (non-Javadoc) - * @see org.bouncycastle.crypto.BlockCipher#processBlock(byte[], int, byte[], int) - */ - public int processBlock(byte[] in, int inOff, byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - if (!initialised) - { - throw new IllegalStateException("Null engine not initialised"); - } - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < BLOCK_SIZE; ++i) - { - out[outOff + i] = in[inOff + i]; - } - - return BLOCK_SIZE; - } - - /* (non-Javadoc) - * @see org.bouncycastle.crypto.BlockCipher#reset() - */ - public void reset() - { - // nothing needs to be done - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2Engine.java deleted file mode 100644 index 5b0aae4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2Engine.java +++ /dev/null @@ -1,316 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.RC2Parameters; - -/** - * an implementation of RC2 as described in RFC 2268 - * "A Description of the RC2(r) Encryption Algorithm" R. Rivest. - */ -public class RC2Engine - implements BlockCipher -{ - // - // the values we use for key expansion (based on the digits of PI) - // - private static byte[] piTable = - { - (byte)0xd9, (byte)0x78, (byte)0xf9, (byte)0xc4, (byte)0x19, (byte)0xdd, (byte)0xb5, (byte)0xed, - (byte)0x28, (byte)0xe9, (byte)0xfd, (byte)0x79, (byte)0x4a, (byte)0xa0, (byte)0xd8, (byte)0x9d, - (byte)0xc6, (byte)0x7e, (byte)0x37, (byte)0x83, (byte)0x2b, (byte)0x76, (byte)0x53, (byte)0x8e, - (byte)0x62, (byte)0x4c, (byte)0x64, (byte)0x88, (byte)0x44, (byte)0x8b, (byte)0xfb, (byte)0xa2, - (byte)0x17, (byte)0x9a, (byte)0x59, (byte)0xf5, (byte)0x87, (byte)0xb3, (byte)0x4f, (byte)0x13, - (byte)0x61, (byte)0x45, (byte)0x6d, (byte)0x8d, (byte)0x9, (byte)0x81, (byte)0x7d, (byte)0x32, - (byte)0xbd, (byte)0x8f, (byte)0x40, (byte)0xeb, (byte)0x86, (byte)0xb7, (byte)0x7b, (byte)0xb, - (byte)0xf0, (byte)0x95, (byte)0x21, (byte)0x22, (byte)0x5c, (byte)0x6b, (byte)0x4e, (byte)0x82, - (byte)0x54, (byte)0xd6, (byte)0x65, (byte)0x93, (byte)0xce, (byte)0x60, (byte)0xb2, (byte)0x1c, - (byte)0x73, (byte)0x56, (byte)0xc0, (byte)0x14, (byte)0xa7, (byte)0x8c, (byte)0xf1, (byte)0xdc, - (byte)0x12, (byte)0x75, (byte)0xca, (byte)0x1f, (byte)0x3b, (byte)0xbe, (byte)0xe4, (byte)0xd1, - (byte)0x42, (byte)0x3d, (byte)0xd4, (byte)0x30, (byte)0xa3, (byte)0x3c, (byte)0xb6, (byte)0x26, - (byte)0x6f, (byte)0xbf, (byte)0xe, (byte)0xda, (byte)0x46, (byte)0x69, (byte)0x7, (byte)0x57, - (byte)0x27, (byte)0xf2, (byte)0x1d, (byte)0x9b, (byte)0xbc, (byte)0x94, (byte)0x43, (byte)0x3, - (byte)0xf8, (byte)0x11, (byte)0xc7, (byte)0xf6, (byte)0x90, (byte)0xef, (byte)0x3e, (byte)0xe7, - (byte)0x6, (byte)0xc3, (byte)0xd5, (byte)0x2f, (byte)0xc8, (byte)0x66, (byte)0x1e, (byte)0xd7, - (byte)0x8, (byte)0xe8, (byte)0xea, (byte)0xde, (byte)0x80, (byte)0x52, (byte)0xee, (byte)0xf7, - (byte)0x84, (byte)0xaa, (byte)0x72, (byte)0xac, (byte)0x35, (byte)0x4d, (byte)0x6a, (byte)0x2a, - (byte)0x96, (byte)0x1a, (byte)0xd2, (byte)0x71, (byte)0x5a, (byte)0x15, (byte)0x49, (byte)0x74, - (byte)0x4b, (byte)0x9f, (byte)0xd0, (byte)0x5e, (byte)0x4, (byte)0x18, (byte)0xa4, (byte)0xec, - (byte)0xc2, (byte)0xe0, (byte)0x41, (byte)0x6e, (byte)0xf, (byte)0x51, (byte)0xcb, (byte)0xcc, - (byte)0x24, (byte)0x91, (byte)0xaf, (byte)0x50, (byte)0xa1, (byte)0xf4, (byte)0x70, (byte)0x39, - (byte)0x99, (byte)0x7c, (byte)0x3a, (byte)0x85, (byte)0x23, (byte)0xb8, (byte)0xb4, (byte)0x7a, - (byte)0xfc, (byte)0x2, (byte)0x36, (byte)0x5b, (byte)0x25, (byte)0x55, (byte)0x97, (byte)0x31, - (byte)0x2d, (byte)0x5d, (byte)0xfa, (byte)0x98, (byte)0xe3, (byte)0x8a, (byte)0x92, (byte)0xae, - (byte)0x5, (byte)0xdf, (byte)0x29, (byte)0x10, (byte)0x67, (byte)0x6c, (byte)0xba, (byte)0xc9, - (byte)0xd3, (byte)0x0, (byte)0xe6, (byte)0xcf, (byte)0xe1, (byte)0x9e, (byte)0xa8, (byte)0x2c, - (byte)0x63, (byte)0x16, (byte)0x1, (byte)0x3f, (byte)0x58, (byte)0xe2, (byte)0x89, (byte)0xa9, - (byte)0xd, (byte)0x38, (byte)0x34, (byte)0x1b, (byte)0xab, (byte)0x33, (byte)0xff, (byte)0xb0, - (byte)0xbb, (byte)0x48, (byte)0xc, (byte)0x5f, (byte)0xb9, (byte)0xb1, (byte)0xcd, (byte)0x2e, - (byte)0xc5, (byte)0xf3, (byte)0xdb, (byte)0x47, (byte)0xe5, (byte)0xa5, (byte)0x9c, (byte)0x77, - (byte)0xa, (byte)0xa6, (byte)0x20, (byte)0x68, (byte)0xfe, (byte)0x7f, (byte)0xc1, (byte)0xad - }; - - private static final int BLOCK_SIZE = 8; - - private int[] workingKey; - private boolean encrypting; - - private int[] generateWorkingKey( - byte[] key, - int bits) - { - int x; - int[] xKey = new int[128]; - - for (int i = 0; i != key.length; i++) - { - xKey[i] = key[i] & 0xff; - } - - // Phase 1: Expand input key to 128 bytes - int len = key.length; - - if (len < 128) - { - int index = 0; - - x = xKey[len - 1]; - - do - { - x = piTable[(x + xKey[index++]) & 255] & 0xff; - xKey[len++] = x; - } - while (len < 128); - } - - // Phase 2 - reduce effective key size to "bits" - len = (bits + 7) >> 3; - x = piTable[xKey[128 - len] & (255 >> (7 & -bits))] & 0xff; - xKey[128 - len] = x; - - for (int i = 128 - len - 1; i >= 0; i--) - { - x = piTable[x ^ xKey[i + len]] & 0xff; - xKey[i] = x; - } - - // Phase 3 - copy to newKey in little-endian order - int[] newKey = new int[64]; - - for (int i = 0; i != newKey.length; i++) - { - newKey[i] = (xKey[2 * i] + (xKey[2 * i + 1] << 8)); - } - - return newKey; - } - - /** - * initialise a RC2 cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - this.encrypting = encrypting; - - if (params instanceof RC2Parameters) - { - RC2Parameters param = (RC2Parameters)params; - - workingKey = generateWorkingKey(param.getKey(), - param.getEffectiveKeyBits()); - } - else if (params instanceof KeyParameter) - { - byte[] key = ((KeyParameter)params).getKey(); - - workingKey = generateWorkingKey(key, key.length * 8); - } - else - { - throw new IllegalArgumentException("invalid parameter passed to RC2 init - " + params.getClass().getName()); - } - - } - - public void reset() - { - } - - public String getAlgorithmName() - { - return "RC2"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public final int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("RC2 engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (encrypting) - { - encryptBlock(in, inOff, out, outOff); - } - else - { - decryptBlock(in, inOff, out, outOff); - } - - return BLOCK_SIZE; - } - - /** - * return the result rotating the 16 bit number in x left by y - */ - private int rotateWordLeft( - int x, - int y) - { - x &= 0xffff; - return (x << y) | (x >> (16 - y)); - } - - private void encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int x76, x54, x32, x10; - - x76 = ((in[inOff + 7] & 0xff) << 8) + (in[inOff + 6] & 0xff); - x54 = ((in[inOff + 5] & 0xff) << 8) + (in[inOff + 4] & 0xff); - x32 = ((in[inOff + 3] & 0xff) << 8) + (in[inOff + 2] & 0xff); - x10 = ((in[inOff + 1] & 0xff) << 8) + (in[inOff + 0] & 0xff); - - for (int i = 0; i <= 16; i += 4) - { - x10 = rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1); - x32 = rotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2); - x54 = rotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3); - x76 = rotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5); - } - - x10 += workingKey[x76 & 63]; - x32 += workingKey[x10 & 63]; - x54 += workingKey[x32 & 63]; - x76 += workingKey[x54 & 63]; - - for (int i = 20; i <= 40; i += 4) - { - x10 = rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1); - x32 = rotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2); - x54 = rotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3); - x76 = rotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5); - } - - x10 += workingKey[x76 & 63]; - x32 += workingKey[x10 & 63]; - x54 += workingKey[x32 & 63]; - x76 += workingKey[x54 & 63]; - - for (int i = 44; i < 64; i += 4) - { - x10 = rotateWordLeft(x10 + (x32 & ~x76) + (x54 & x76) + workingKey[i ], 1); - x32 = rotateWordLeft(x32 + (x54 & ~x10) + (x76 & x10) + workingKey[i+1], 2); - x54 = rotateWordLeft(x54 + (x76 & ~x32) + (x10 & x32) + workingKey[i+2], 3); - x76 = rotateWordLeft(x76 + (x10 & ~x54) + (x32 & x54) + workingKey[i+3], 5); - } - - out[outOff + 0] = (byte)x10; - out[outOff + 1] = (byte)(x10 >> 8); - out[outOff + 2] = (byte)x32; - out[outOff + 3] = (byte)(x32 >> 8); - out[outOff + 4] = (byte)x54; - out[outOff + 5] = (byte)(x54 >> 8); - out[outOff + 6] = (byte)x76; - out[outOff + 7] = (byte)(x76 >> 8); - } - - private void decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int x76, x54, x32, x10; - - x76 = ((in[inOff + 7] & 0xff) << 8) + (in[inOff + 6] & 0xff); - x54 = ((in[inOff + 5] & 0xff) << 8) + (in[inOff + 4] & 0xff); - x32 = ((in[inOff + 3] & 0xff) << 8) + (in[inOff + 2] & 0xff); - x10 = ((in[inOff + 1] & 0xff) << 8) + (in[inOff + 0] & 0xff); - - for (int i = 60; i >= 44; i -= 4) - { - x76 = rotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]); - x54 = rotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]); - x32 = rotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]); - x10 = rotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]); - } - - x76 -= workingKey[x54 & 63]; - x54 -= workingKey[x32 & 63]; - x32 -= workingKey[x10 & 63]; - x10 -= workingKey[x76 & 63]; - - for (int i = 40; i >= 20; i -= 4) - { - x76 = rotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]); - x54 = rotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]); - x32 = rotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]); - x10 = rotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]); - } - - x76 -= workingKey[x54 & 63]; - x54 -= workingKey[x32 & 63]; - x32 -= workingKey[x10 & 63]; - x10 -= workingKey[x76 & 63]; - - for (int i = 16; i >= 0; i -= 4) - { - x76 = rotateWordLeft(x76, 11) - ((x10 & ~x54) + (x32 & x54) + workingKey[i+3]); - x54 = rotateWordLeft(x54, 13) - ((x76 & ~x32) + (x10 & x32) + workingKey[i+2]); - x32 = rotateWordLeft(x32, 14) - ((x54 & ~x10) + (x76 & x10) + workingKey[i+1]); - x10 = rotateWordLeft(x10, 15) - ((x32 & ~x76) + (x54 & x76) + workingKey[i ]); - } - - out[outOff + 0] = (byte)x10; - out[outOff + 1] = (byte)(x10 >> 8); - out[outOff + 2] = (byte)x32; - out[outOff + 3] = (byte)(x32 >> 8); - out[outOff + 4] = (byte)x54; - out[outOff + 5] = (byte)(x54 >> 8); - out[outOff + 6] = (byte)x76; - out[outOff + 7] = (byte)(x76 >> 8); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2WrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2WrapEngine.java deleted file mode 100644 index 27ff9ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC2WrapEngine.java +++ /dev/null @@ -1,383 +0,0 @@ -package org.bc.crypto.engines; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Wrapper; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - -/** - * Wrap keys according to RFC 3217 - RC2 mechanism - */ -public class RC2WrapEngine - implements Wrapper -{ - /** Field engine */ - private CBCBlockCipher engine; - - /** Field param */ - private CipherParameters param; - - /** Field paramPlusIV */ - private ParametersWithIV paramPlusIV; - - /** Field iv */ - private byte[] iv; - - /** Field forWrapping */ - private boolean forWrapping; - - private SecureRandom sr; - - /** Field IV2 */ - private static final byte[] IV2 = { (byte) 0x4a, (byte) 0xdd, (byte) 0xa2, - (byte) 0x2c, (byte) 0x79, (byte) 0xe8, - (byte) 0x21, (byte) 0x05 }; - - // - // checksum digest - // - Digest sha1 = new SHA1Digest(); - byte[] digest = new byte[20]; - - /** - * Method init - * - * @param forWrapping - * @param param - */ - public void init(boolean forWrapping, CipherParameters param) - { - this.forWrapping = forWrapping; - this.engine = new CBCBlockCipher(new RC2Engine()); - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom pWithR = (ParametersWithRandom)param; - sr = pWithR.getRandom(); - param = pWithR.getParameters(); - } - else - { - sr = new SecureRandom(); - } - - if (param instanceof ParametersWithIV) - { - this.paramPlusIV = (ParametersWithIV)param; - this.iv = this.paramPlusIV.getIV(); - this.param = this.paramPlusIV.getParameters(); - - if (this.forWrapping) - { - if ((this.iv == null) || (this.iv.length != 8)) - { - throw new IllegalArgumentException("IV is not 8 octets"); - } - } - else - { - throw new IllegalArgumentException( - "You should not supply an IV for unwrapping"); - } - } - else - { - this.param = param; - - if (this.forWrapping) - { - - // Hm, we have no IV but we want to wrap ?!? - // well, then we have to create our own IV. - this.iv = new byte[8]; - - sr.nextBytes(iv); - - this.paramPlusIV = new ParametersWithIV(this.param, this.iv); - } - } - - } - - /** - * Method getAlgorithmName - * - * @return the algorithm name "RC2". - */ - public String getAlgorithmName() - { - return "RC2"; - } - - /** - * Method wrap - * - * @param in - * @param inOff - * @param inLen - * @return the wrapped bytes. - */ - public byte[] wrap(byte[] in, int inOff, int inLen) - { - - if (!forWrapping) - { - throw new IllegalStateException("Not initialized for wrapping"); - } - - int length = inLen + 1; - if ((length % 8) != 0) - { - length += 8 - (length % 8); - } - - byte keyToBeWrapped[] = new byte[length]; - - keyToBeWrapped[0] = (byte)inLen; - System.arraycopy(in, inOff, keyToBeWrapped, 1, inLen); - - byte[] pad = new byte[keyToBeWrapped.length - inLen - 1]; - - if (pad.length > 0) - { - sr.nextBytes(pad); - System.arraycopy(pad, 0, keyToBeWrapped, inLen + 1, pad.length); - } - - // Compute the CMS Key Checksum, (section 5.6.1), call this CKS. - byte[] CKS = calculateCMSKeyChecksum(keyToBeWrapped); - - // Let WKCKS = WK || CKS where || is concatenation. - byte[] WKCKS = new byte[keyToBeWrapped.length + CKS.length]; - - System.arraycopy(keyToBeWrapped, 0, WKCKS, 0, keyToBeWrapped.length); - System.arraycopy(CKS, 0, WKCKS, keyToBeWrapped.length, CKS.length); - - // Encrypt WKCKS in CBC mode using KEK as the key and IV as the - // initialization vector. Call the results TEMP1. - byte TEMP1[] = new byte[WKCKS.length]; - - System.arraycopy(WKCKS, 0, TEMP1, 0, WKCKS.length); - - int noOfBlocks = WKCKS.length / engine.getBlockSize(); - int extraBytes = WKCKS.length % engine.getBlockSize(); - - if (extraBytes != 0) - { - throw new IllegalStateException("Not multiple of block length"); - } - - engine.init(true, paramPlusIV); - - for (int i = 0; i < noOfBlocks; i++) - { - int currentBytePos = i * engine.getBlockSize(); - - engine.processBlock(TEMP1, currentBytePos, TEMP1, currentBytePos); - } - - // Left TEMP2 = IV || TEMP1. - byte[] TEMP2 = new byte[this.iv.length + TEMP1.length]; - - System.arraycopy(this.iv, 0, TEMP2, 0, this.iv.length); - System.arraycopy(TEMP1, 0, TEMP2, this.iv.length, TEMP1.length); - - // Reverse the order of the octets in TEMP2 and call the result TEMP3. - byte[] TEMP3 = new byte[TEMP2.length]; - - for (int i = 0; i < TEMP2.length; i++) - { - TEMP3[i] = TEMP2[TEMP2.length - (i + 1)]; - } - - // Encrypt TEMP3 in CBC mode using the KEK and an initialization vector - // of 0x 4a dd a2 2c 79 e8 21 05. The resulting cipher text is the - // desired - // result. It is 40 octets long if a 168 bit key is being wrapped. - ParametersWithIV param2 = new ParametersWithIV(this.param, IV2); - - this.engine.init(true, param2); - - for (int i = 0; i < noOfBlocks + 1; i++) - { - int currentBytePos = i * engine.getBlockSize(); - - engine.processBlock(TEMP3, currentBytePos, TEMP3, currentBytePos); - } - - return TEMP3; - } - - /** - * Method unwrap - * - * @param in - * @param inOff - * @param inLen - * @return the unwrapped bytes. - * @throws InvalidCipherTextException - */ - public byte[] unwrap(byte[] in, int inOff, int inLen) - throws InvalidCipherTextException - { - - if (forWrapping) - { - throw new IllegalStateException("Not set for unwrapping"); - } - - if (in == null) - { - throw new InvalidCipherTextException("Null pointer as ciphertext"); - } - - if (inLen % engine.getBlockSize() != 0) - { - throw new InvalidCipherTextException("Ciphertext not multiple of " - + engine.getBlockSize()); - } - - /* - * // Check if the length of the cipher text is reasonable given the key // - * type. It must be 40 bytes for a 168 bit key and either 32, 40, or // - * 48 bytes for a 128, 192, or 256 bit key. If the length is not - * supported // or inconsistent with the algorithm for which the key is - * intended, // return error. // // we do not accept 168 bit keys. it - * has to be 192 bit. int lengthA = (estimatedKeyLengthInBit / 8) + 16; - * int lengthB = estimatedKeyLengthInBit % 8; - * - * if ((lengthA != keyToBeUnwrapped.length) || (lengthB != 0)) { throw - * new XMLSecurityException("empty"); } - */ - - // Decrypt the cipher text with TRIPLedeS in CBC mode using the KEK - // and an initialization vector (IV) of 0x4adda22c79e82105. Call the - // output TEMP3. - ParametersWithIV param2 = new ParametersWithIV(this.param, IV2); - - this.engine.init(false, param2); - - byte TEMP3[] = new byte[inLen]; - - System.arraycopy(in, inOff, TEMP3, 0, inLen); - - for (int i = 0; i < (TEMP3.length / engine.getBlockSize()); i++) - { - int currentBytePos = i * engine.getBlockSize(); - - engine.processBlock(TEMP3, currentBytePos, TEMP3, currentBytePos); - } - - // Reverse the order of the octets in TEMP3 and call the result TEMP2. - byte[] TEMP2 = new byte[TEMP3.length]; - - for (int i = 0; i < TEMP3.length; i++) - { - TEMP2[i] = TEMP3[TEMP3.length - (i + 1)]; - } - - // Decompose TEMP2 into IV, the first 8 octets, and TEMP1, the remaining - // octets. - this.iv = new byte[8]; - - byte[] TEMP1 = new byte[TEMP2.length - 8]; - - System.arraycopy(TEMP2, 0, this.iv, 0, 8); - System.arraycopy(TEMP2, 8, TEMP1, 0, TEMP2.length - 8); - - // Decrypt TEMP1 using TRIPLedeS in CBC mode using the KEK and the IV - // found in the previous step. Call the result WKCKS. - this.paramPlusIV = new ParametersWithIV(this.param, this.iv); - - this.engine.init(false, this.paramPlusIV); - - byte[] LCEKPADICV = new byte[TEMP1.length]; - - System.arraycopy(TEMP1, 0, LCEKPADICV, 0, TEMP1.length); - - for (int i = 0; i < (LCEKPADICV.length / engine.getBlockSize()); i++) - { - int currentBytePos = i * engine.getBlockSize(); - - engine.processBlock(LCEKPADICV, currentBytePos, LCEKPADICV, - currentBytePos); - } - - // Decompose LCEKPADICV. CKS is the last 8 octets and WK, the wrapped - // key, are - // those octets before the CKS. - byte[] result = new byte[LCEKPADICV.length - 8]; - byte[] CKStoBeVerified = new byte[8]; - - System.arraycopy(LCEKPADICV, 0, result, 0, LCEKPADICV.length - 8); - System.arraycopy(LCEKPADICV, LCEKPADICV.length - 8, CKStoBeVerified, 0, - 8); - - // Calculate a CMS Key Checksum, (section 5.6.1), over the WK and - // compare - // with the CKS extracted in the above step. If they are not equal, - // return error. - if (!checkCMSKeyChecksum(result, CKStoBeVerified)) - { - throw new InvalidCipherTextException( - "Checksum inside ciphertext is corrupted"); - } - - if ((result.length - ((result[0] & 0xff) + 1)) > 7) - { - throw new InvalidCipherTextException("too many pad bytes (" - + (result.length - ((result[0] & 0xff) + 1)) + ")"); - } - - // CEK is the wrapped key, now extracted for use in data decryption. - byte[] CEK = new byte[result[0]]; - System.arraycopy(result, 1, CEK, 0, CEK.length); - return CEK; - } - - /** - * Some key wrap algorithms make use of the Key Checksum defined - * in CMS [CMS-Algorithms]. This is used to provide an integrity - * check value for the key being wrapped. The algorithm is - * - * - Compute the 20 octet SHA-1 hash on the key being wrapped. - * - Use the first 8 octets of this hash as the checksum value. - * - * @param key - * @return - * @throws RuntimeException - * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum - */ - private byte[] calculateCMSKeyChecksum( - byte[] key) - { - byte[] result = new byte[8]; - - sha1.update(key, 0, key.length); - sha1.doFinal(digest, 0); - - System.arraycopy(digest, 0, result, 0, 8); - - return result; - } - - /** - * @param key - * @param checksum - * @return - * @see http://www.w3.org/TR/xmlenc-core/#sec-CMSKeyChecksum - */ - private boolean checkCMSKeyChecksum( - byte[] key, - byte[] checksum) - { - return Arrays.constantTimeAreEqual(calculateCMSKeyChecksum(key), checksum); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC4Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC4Engine.java deleted file mode 100644 index 3684ef4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC4Engine.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; - -public class RC4Engine implements StreamCipher -{ - private final static int STATE_LENGTH = 256; - - /* - * variables to hold the state of the RC4 engine - * during encryption and decryption - */ - - private byte[] engineState = null; - private int x = 0; - private int y = 0; - private byte[] workingKey = null; - - /** - * initialise a RC4 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params - ) - { - if (params instanceof KeyParameter) - { - /* - * RC4 encryption and decryption is completely - * symmetrical, so the 'forEncryption' is - * irrelevant. - */ - workingKey = ((KeyParameter)params).getKey(); - setKey(workingKey); - - return; - } - - throw new IllegalArgumentException("invalid parameter passed to RC4 init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "RC4"; - } - - public byte returnByte(byte in) - { - x = (x + 1) & 0xff; - y = (engineState[x] + y) & 0xff; - - // swap - byte tmp = engineState[x]; - engineState[x] = engineState[y]; - engineState[y] = tmp; - - // xor - return (byte)(in ^ engineState[(engineState[x] + engineState[y]) & 0xff]); - } - - public void processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - { - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len ; i++) - { - x = (x + 1) & 0xff; - y = (engineState[x] + y) & 0xff; - - // swap - byte tmp = engineState[x]; - engineState[x] = engineState[y]; - engineState[y] = tmp; - - // xor - out[i+outOff] = (byte)(in[i + inOff] - ^ engineState[(engineState[x] + engineState[y]) & 0xff]); - } - } - - public void reset() - { - setKey(workingKey); - } - - // Private implementation - - private void setKey(byte[] keyBytes) - { - workingKey = keyBytes; - - // System.out.println("the key length is ; "+ workingKey.length); - - x = 0; - y = 0; - - if (engineState == null) - { - engineState = new byte[STATE_LENGTH]; - } - - // reset the state of the engine - for (int i=0; i < STATE_LENGTH; i++) - { - engineState[i] = (byte)i; - } - - int i1 = 0; - int i2 = 0; - - for (int i=0; i < STATE_LENGTH; i++) - { - i2 = ((keyBytes[i1] & 0xff) + engineState[i] + i2) & 0xff; - // do the byte-swap inline - byte tmp = engineState[i]; - engineState[i] = engineState[i2]; - engineState[i2] = tmp; - i1 = (i1+1) % keyBytes.length; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC532Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC532Engine.java deleted file mode 100644 index 12a2ee7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC532Engine.java +++ /dev/null @@ -1,287 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.RC5Parameters; - -/** - * The specification for RC5 came from the RC5 Encryption Algorithm - * publication in RSA CryptoBytes, Spring of 1995. - * http://www.rsasecurity.com/rsalabs/cryptobytes. - *

    - * This implementation has a word size of 32 bits. - *

    - * Implementation courtesy of Tito Pena. - */ -public class RC532Engine - implements BlockCipher -{ - /* - * the number of rounds to perform - */ - private int _noRounds; - - /* - * the expanded key array of size 2*(rounds + 1) - */ - private int _S[]; - - /* - * our "magic constants" for 32 32 - * - * Pw = Odd((e-2) * 2^wordsize) - * Qw = Odd((o-2) * 2^wordsize) - * - * where e is the base of natural logarithms (2.718281828...) - * and o is the golden ratio (1.61803398...) - */ - private static final int P32 = 0xb7e15163; - private static final int Q32 = 0x9e3779b9; - - private boolean forEncryption; - - /** - * Create an instance of the RC5 encryption algorithm - * and set some defaults - */ - public RC532Engine() - { - _noRounds = 12; // the default - _S = null; - } - - public String getAlgorithmName() - { - return "RC5-32"; - } - - public int getBlockSize() - { - return 2 * 4; - } - - /** - * initialise a RC5-32 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof RC5Parameters) - { - RC5Parameters p = (RC5Parameters)params; - - _noRounds = p.getRounds(); - - setKey(p.getKey()); - } - else if (params instanceof KeyParameter) - { - KeyParameter p = (KeyParameter)params; - - setKey(p.getKey()); - } - else - { - throw new IllegalArgumentException("invalid parameter passed to RC532 init - " + params.getClass().getName()); - } - - this.forEncryption = forEncryption; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - return (forEncryption) ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param key the key to be used - */ - private void setKey( - byte[] key) - { - // - // KEY EXPANSION: - // - // There are 3 phases to the key expansion. - // - // Phase 1: - // Copy the secret key K[0...b-1] into an array L[0..c-1] of - // c = ceil(b/u), where u = 32/8 in little-endian order. - // In other words, we fill up L using u consecutive key bytes - // of K. Any unfilled byte positions in L are zeroed. In the - // case that b = c = 0, set c = 1 and L[0] = 0. - // - int[] L = new int[(key.length + (4 - 1)) / 4]; - - for (int i = 0; i != key.length; i++) - { - L[i / 4] += (key[i] & 0xff) << (8 * (i % 4)); - } - - // - // Phase 2: - // Initialize S to a particular fixed pseudo-random bit pattern - // using an arithmetic progression modulo 2^wordsize determined - // by the magic numbers, Pw & Qw. - // - _S = new int[2*(_noRounds + 1)]; - - _S[0] = P32; - for (int i=1; i < _S.length; i++) - { - _S[i] = (_S[i-1] + Q32); - } - - // - // Phase 3: - // Mix in the user's secret key in 3 passes over the arrays S & L. - // The max of the arrays sizes is used as the loop control - // - int iter; - - if (L.length > _S.length) - { - iter = 3 * L.length; - } - else - { - iter = 3 * _S.length; - } - - int A = 0, B = 0; - int i = 0, j = 0; - - for (int k = 0; k < iter; k++) - { - A = _S[i] = rotateLeft(_S[i] + A + B, 3); - B = L[j] = rotateLeft(L[j] + A + B, A+B); - i = (i+1) % _S.length; - j = (j+1) % L.length; - } - } - - /** - * Encrypt the given block starting at the given offset and place - * the result in the provided buffer starting at the given offset. - *

    - * @param in in byte buffer containing data to encrypt - * @param inOff offset into src buffer - * @param out out buffer where encrypted data is written - * @param outOff offset into out buffer - */ - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int A = bytesToWord(in, inOff) + _S[0]; - int B = bytesToWord(in, inOff + 4) + _S[1]; - - for (int i = 1; i <= _noRounds; i++) - { - A = rotateLeft(A ^ B, B) + _S[2*i]; - B = rotateLeft(B ^ A, A) + _S[2*i+1]; - } - - wordToBytes(A, out, outOff); - wordToBytes(B, out, outOff + 4); - - return 2 * 4; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int A = bytesToWord(in, inOff); - int B = bytesToWord(in, inOff + 4); - - for (int i = _noRounds; i >= 1; i--) - { - B = rotateRight(B - _S[2*i+1], A) ^ A; - A = rotateRight(A - _S[2*i], B) ^ B; - } - - wordToBytes(A - _S[0], out, outOff); - wordToBytes(B - _S[1], out, outOff + 4); - - return 2 * 4; - } - - - ////////////////////////////////////////////////////////////// - // - // PRIVATE Helper Methods - // - ////////////////////////////////////////////////////////////// - - /** - * Perform a left "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(32) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is a power of 2. - *

    - * @param x word to rotate - * @param y number of bits to rotate % 32 - */ - private int rotateLeft(int x, int y) - { - return ((x << (y & (32-1))) | (x >>> (32 - (y & (32-1))))); - } - - /** - * Perform a right "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(32) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is a power of 2. - *

    - * @param x word to rotate - * @param y number of bits to rotate % 32 - */ - private int rotateRight(int x, int y) - { - return ((x >>> (y & (32-1))) | (x << (32 - (y & (32-1))))); - } - - private int bytesToWord( - byte[] src, - int srcOff) - { - return (src[srcOff] & 0xff) | ((src[srcOff + 1] & 0xff) << 8) - | ((src[srcOff + 2] & 0xff) << 16) | ((src[srcOff + 3] & 0xff) << 24); - } - - private void wordToBytes( - int word, - byte[] dst, - int dstOff) - { - dst[dstOff] = (byte)word; - dst[dstOff + 1] = (byte)(word >> 8); - dst[dstOff + 2] = (byte)(word >> 16); - dst[dstOff + 3] = (byte)(word >> 24); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC564Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC564Engine.java deleted file mode 100644 index 50a5e12..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC564Engine.java +++ /dev/null @@ -1,288 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.RC5Parameters; - -/** - * The specification for RC5 came from the RC5 Encryption Algorithm - * publication in RSA CryptoBytes, Spring of 1995. - * http://www.rsasecurity.com/rsalabs/cryptobytes. - *

    - * This implementation is set to work with a 64 bit word size. - *

    - * Implementation courtesy of Tito Pena. - */ -public class RC564Engine - implements BlockCipher -{ - private static final int wordSize = 64; - private static final int bytesPerWord = wordSize / 8; - - /* - * the number of rounds to perform - */ - private int _noRounds; - - /* - * the expanded key array of size 2*(rounds + 1) - */ - private long _S[]; - - /* - * our "magic constants" for wordSize 62 - * - * Pw = Odd((e-2) * 2^wordsize) - * Qw = Odd((o-2) * 2^wordsize) - * - * where e is the base of natural logarithms (2.718281828...) - * and o is the golden ratio (1.61803398...) - */ - private static final long P64 = 0xb7e151628aed2a6bL; - private static final long Q64 = 0x9e3779b97f4a7c15L; - - private boolean forEncryption; - - /** - * Create an instance of the RC5 encryption algorithm - * and set some defaults - */ - public RC564Engine() - { - _noRounds = 12; - _S = null; - } - - public String getAlgorithmName() - { - return "RC5-64"; - } - - public int getBlockSize() - { - return 2 * bytesPerWord; - } - - /** - * initialise a RC5-64 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof RC5Parameters)) - { - throw new IllegalArgumentException("invalid parameter passed to RC564 init - " + params.getClass().getName()); - } - - RC5Parameters p = (RC5Parameters)params; - - this.forEncryption = forEncryption; - - _noRounds = p.getRounds(); - - setKey(p.getKey()); - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - return (forEncryption) ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param key the key to be used - */ - private void setKey( - byte[] key) - { - // - // KEY EXPANSION: - // - // There are 3 phases to the key expansion. - // - // Phase 1: - // Copy the secret key K[0...b-1] into an array L[0..c-1] of - // c = ceil(b/u), where u = wordSize/8 in little-endian order. - // In other words, we fill up L using u consecutive key bytes - // of K. Any unfilled byte positions in L are zeroed. In the - // case that b = c = 0, set c = 1 and L[0] = 0. - // - long[] L = new long[(key.length + (bytesPerWord - 1)) / bytesPerWord]; - - for (int i = 0; i != key.length; i++) - { - L[i / bytesPerWord] += (long)(key[i] & 0xff) << (8 * (i % bytesPerWord)); - } - - // - // Phase 2: - // Initialize S to a particular fixed pseudo-random bit pattern - // using an arithmetic progression modulo 2^wordsize determined - // by the magic numbers, Pw & Qw. - // - _S = new long[2*(_noRounds + 1)]; - - _S[0] = P64; - for (int i=1; i < _S.length; i++) - { - _S[i] = (_S[i-1] + Q64); - } - - // - // Phase 3: - // Mix in the user's secret key in 3 passes over the arrays S & L. - // The max of the arrays sizes is used as the loop control - // - int iter; - - if (L.length > _S.length) - { - iter = 3 * L.length; - } - else - { - iter = 3 * _S.length; - } - - long A = 0, B = 0; - int i = 0, j = 0; - - for (int k = 0; k < iter; k++) - { - A = _S[i] = rotateLeft(_S[i] + A + B, 3); - B = L[j] = rotateLeft(L[j] + A + B, A+B); - i = (i+1) % _S.length; - j = (j+1) % L.length; - } - } - - /** - * Encrypt the given block starting at the given offset and place - * the result in the provided buffer starting at the given offset. - *

    - * @param in in byte buffer containing data to encrypt - * @param inOff offset into src buffer - * @param out out buffer where encrypted data is written - * @param outOff offset into out buffer - */ - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - long A = bytesToWord(in, inOff) + _S[0]; - long B = bytesToWord(in, inOff + bytesPerWord) + _S[1]; - - for (int i = 1; i <= _noRounds; i++) - { - A = rotateLeft(A ^ B, B) + _S[2*i]; - B = rotateLeft(B ^ A, A) + _S[2*i+1]; - } - - wordToBytes(A, out, outOff); - wordToBytes(B, out, outOff + bytesPerWord); - - return 2 * bytesPerWord; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - long A = bytesToWord(in, inOff); - long B = bytesToWord(in, inOff + bytesPerWord); - - for (int i = _noRounds; i >= 1; i--) - { - B = rotateRight(B - _S[2*i+1], A) ^ A; - A = rotateRight(A - _S[2*i], B) ^ B; - } - - wordToBytes(A - _S[0], out, outOff); - wordToBytes(B - _S[1], out, outOff + bytesPerWord); - - return 2 * bytesPerWord; - } - - - ////////////////////////////////////////////////////////////// - // - // PRIVATE Helper Methods - // - ////////////////////////////////////////////////////////////// - - /** - * Perform a left "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(wordSize) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is a power of 2. - *

    - * @param x word to rotate - * @param y number of bits to rotate % wordSize - */ - private long rotateLeft(long x, long y) - { - return ((x << (y & (wordSize-1))) | (x >>> (wordSize - (y & (wordSize-1))))); - } - - /** - * Perform a right "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(wordSize) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is a power of 2. - *

    - * @param x word to rotate - * @param y number of bits to rotate % wordSize - */ - private long rotateRight(long x, long y) - { - return ((x >>> (y & (wordSize-1))) | (x << (wordSize - (y & (wordSize-1))))); - } - - private long bytesToWord( - byte[] src, - int srcOff) - { - long word = 0; - - for (int i = bytesPerWord - 1; i >= 0; i--) - { - word = (word << 8) + (src[i + srcOff] & 0xff); - } - - return word; - } - - private void wordToBytes( - long word, - byte[] dst, - int dstOff) - { - for (int i = 0; i < bytesPerWord; i++) - { - dst[i + dstOff] = (byte)word; - word >>>= 8; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC6Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC6Engine.java deleted file mode 100644 index e2634f9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RC6Engine.java +++ /dev/null @@ -1,362 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * An RC6 engine. - */ -public class RC6Engine - implements BlockCipher -{ - private static final int wordSize = 32; - private static final int bytesPerWord = wordSize / 8; - - /* - * the number of rounds to perform - */ - private static final int _noRounds = 20; - - /* - * the expanded key array of size 2*(rounds + 1) - */ - private int _S[]; - - /* - * our "magic constants" for wordSize 32 - * - * Pw = Odd((e-2) * 2^wordsize) - * Qw = Odd((o-2) * 2^wordsize) - * - * where e is the base of natural logarithms (2.718281828...) - * and o is the golden ratio (1.61803398...) - */ - private static final int P32 = 0xb7e15163; - private static final int Q32 = 0x9e3779b9; - - private static final int LGW = 5; // log2(32) - - private boolean forEncryption; - - /** - * Create an instance of the RC6 encryption algorithm - * and set some defaults - */ - public RC6Engine() - { - _S = null; - } - - public String getAlgorithmName() - { - return "RC6"; - } - - public int getBlockSize() - { - return 4 * bytesPerWord; - } - - /** - * initialise a RC5-32 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to RC6 init - " + params.getClass().getName()); - } - - KeyParameter p = (KeyParameter)params; - this.forEncryption = forEncryption; - setKey(p.getKey()); - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int blockSize = getBlockSize(); - if (_S == null) - { - throw new IllegalStateException("RC6 engine not initialised"); - } - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - return (forEncryption) - ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param inKey the key to be used - */ - private void setKey( - byte[] key) - { - - // - // KEY EXPANSION: - // - // There are 3 phases to the key expansion. - // - // Phase 1: - // Copy the secret key K[0...b-1] into an array L[0..c-1] of - // c = ceil(b/u), where u = wordSize/8 in little-endian order. - // In other words, we fill up L using u consecutive key bytes - // of K. Any unfilled byte positions in L are zeroed. In the - // case that b = c = 0, set c = 1 and L[0] = 0. - // - // compute number of dwords - int c = (key.length + (bytesPerWord - 1)) / bytesPerWord; - if (c == 0) - { - c = 1; - } - int[] L = new int[(key.length + bytesPerWord - 1) / bytesPerWord]; - - // load all key bytes into array of key dwords - for (int i = key.length - 1; i >= 0; i--) - { - L[i / bytesPerWord] = (L[i / bytesPerWord] << 8) + (key[i] & 0xff); - } - - // - // Phase 2: - // Key schedule is placed in a array of 2+2*ROUNDS+2 = 44 dwords. - // Initialize S to a particular fixed pseudo-random bit pattern - // using an arithmetic progression modulo 2^wordsize determined - // by the magic numbers, Pw & Qw. - // - _S = new int[2+2*_noRounds+2]; - - _S[0] = P32; - for (int i=1; i < _S.length; i++) - { - _S[i] = (_S[i-1] + Q32); - } - - // - // Phase 3: - // Mix in the user's secret key in 3 passes over the arrays S & L. - // The max of the arrays sizes is used as the loop control - // - int iter; - - if (L.length > _S.length) - { - iter = 3 * L.length; - } - else - { - iter = 3 * _S.length; - } - - int A = 0; - int B = 0; - int i = 0, j = 0; - - for (int k = 0; k < iter; k++) - { - A = _S[i] = rotateLeft(_S[i] + A + B, 3); - B = L[j] = rotateLeft(L[j] + A + B, A+B); - i = (i+1) % _S.length; - j = (j+1) % L.length; - } - } - - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // load A,B,C and D registers from in. - int A = bytesToWord(in, inOff); - int B = bytesToWord(in, inOff + bytesPerWord); - int C = bytesToWord(in, inOff + bytesPerWord*2); - int D = bytesToWord(in, inOff + bytesPerWord*3); - - // Do pseudo-round #0: pre-whitening of B and D - B += _S[0]; - D += _S[1]; - - // perform round #1,#2 ... #ROUNDS of encryption - for (int i = 1; i <= _noRounds; i++) - { - int t = 0,u = 0; - - t = B*(2*B+1); - t = rotateLeft(t,5); - - u = D*(2*D+1); - u = rotateLeft(u,5); - - A ^= t; - A = rotateLeft(A,u); - A += _S[2*i]; - - C ^= u; - C = rotateLeft(C,t); - C += _S[2*i+1]; - - int temp = A; - A = B; - B = C; - C = D; - D = temp; - } - // do pseudo-round #(ROUNDS+1) : post-whitening of A and C - A += _S[2*_noRounds+2]; - C += _S[2*_noRounds+3]; - - // store A, B, C and D registers to out - wordToBytes(A, out, outOff); - wordToBytes(B, out, outOff + bytesPerWord); - wordToBytes(C, out, outOff + bytesPerWord*2); - wordToBytes(D, out, outOff + bytesPerWord*3); - - return 4 * bytesPerWord; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // load A,B,C and D registers from out. - int A = bytesToWord(in, inOff); - int B = bytesToWord(in, inOff + bytesPerWord); - int C = bytesToWord(in, inOff + bytesPerWord*2); - int D = bytesToWord(in, inOff + bytesPerWord*3); - - // Undo pseudo-round #(ROUNDS+1) : post whitening of A and C - C -= _S[2*_noRounds+3]; - A -= _S[2*_noRounds+2]; - - // Undo round #ROUNDS, .., #2,#1 of encryption - for (int i = _noRounds; i >= 1; i--) - { - int t=0,u = 0; - - int temp = D; - D = C; - C = B; - B = A; - A = temp; - - t = B*(2*B+1); - t = rotateLeft(t, LGW); - - u = D*(2*D+1); - u = rotateLeft(u, LGW); - - C -= _S[2*i+1]; - C = rotateRight(C,t); - C ^= u; - - A -= _S[2*i]; - A = rotateRight(A,u); - A ^= t; - - } - // Undo pseudo-round #0: pre-whitening of B and D - D -= _S[1]; - B -= _S[0]; - - wordToBytes(A, out, outOff); - wordToBytes(B, out, outOff + bytesPerWord); - wordToBytes(C, out, outOff + bytesPerWord*2); - wordToBytes(D, out, outOff + bytesPerWord*3); - - return 4 * bytesPerWord; - } - - - ////////////////////////////////////////////////////////////// - // - // PRIVATE Helper Methods - // - ////////////////////////////////////////////////////////////// - - /** - * Perform a left "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(wordSize) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is 32. - *

    - * @param x word to rotate - * @param y number of bits to rotate % wordSize - */ - private int rotateLeft(int x, int y) - { - return (x << y) | (x >>> -y); - } - - /** - * Perform a right "spin" of the word. The rotation of the given - * word x is rotated left by y bits. - * Only the lg(wordSize) low-order bits of y - * are used to determine the rotation amount. Here it is - * assumed that the wordsize used is a power of 2. - *

    - * @param x word to rotate - * @param y number of bits to rotate % wordSize - */ - private int rotateRight(int x, int y) - { - return (x >>> y) | (x << -y); - } - - private int bytesToWord( - byte[] src, - int srcOff) - { - int word = 0; - - for (int i = bytesPerWord - 1; i >= 0; i--) - { - word = (word << 8) + (src[i + srcOff] & 0xff); - } - - return word; - } - - private void wordToBytes( - int word, - byte[] dst, - int dstOff) - { - for (int i = 0; i < bytesPerWord; i++) - { - dst[i + dstOff] = (byte)word; - word >>>= 8; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3211WrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3211WrapEngine.java deleted file mode 100644 index 8eee7aa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3211WrapEngine.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Wrapper; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.params.ParametersWithRandom; - -import java.security.SecureRandom; - -/** - * an implementation of the RFC 3211 Key Wrap - * Specification. - */ -public class RFC3211WrapEngine - implements Wrapper -{ - private CBCBlockCipher engine; - private ParametersWithIV param; - private boolean forWrapping; - private SecureRandom rand; - - public RFC3211WrapEngine(BlockCipher engine) - { - this.engine = new CBCBlockCipher(engine); - } - - public void init( - boolean forWrapping, - CipherParameters param) - { - this.forWrapping = forWrapping; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)param; - - rand = p.getRandom(); - this.param = (ParametersWithIV)p.getParameters(); - } - else - { - if (forWrapping) - { - rand = new SecureRandom(); - } - - this.param = (ParametersWithIV)param; - } - } - - public String getAlgorithmName() - { - return engine.getUnderlyingCipher().getAlgorithmName() + "/RFC3211Wrap"; - } - - public byte[] wrap( - byte[] in, - int inOff, - int inLen) - { - if (!forWrapping) - { - throw new IllegalStateException("not set for wrapping"); - } - - engine.init(true, param); - - int blockSize = engine.getBlockSize(); - byte[] cekBlock; - - if (inLen + 4 < blockSize * 2) - { - cekBlock = new byte[blockSize * 2]; - } - else - { - cekBlock = new byte[(inLen + 4) % blockSize == 0 ? inLen + 4 : ((inLen + 4) / blockSize + 1) * blockSize]; - } - - cekBlock[0] = (byte)inLen; - cekBlock[1] = (byte)~in[inOff]; - cekBlock[2] = (byte)~in[inOff + 1]; - cekBlock[3] = (byte)~in[inOff + 2]; - - System.arraycopy(in, inOff, cekBlock, 4, inLen); - - for (int i = inLen + 4; i < cekBlock.length; i++) - { - cekBlock[i] = (byte)rand.nextInt(); - } - - for (int i = 0; i < cekBlock.length; i += blockSize) - { - engine.processBlock(cekBlock, i, cekBlock, i); - } - - for (int i = 0; i < cekBlock.length; i += blockSize) - { - engine.processBlock(cekBlock, i, cekBlock, i); - } - - return cekBlock; - } - - public byte[] unwrap( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forWrapping) - { - throw new IllegalStateException("not set for unwrapping"); - } - - int blockSize = engine.getBlockSize(); - - if (inLen < 2 * blockSize) - { - throw new InvalidCipherTextException("input too short"); - } - - byte[] cekBlock = new byte[inLen]; - byte[] iv = new byte[blockSize]; - - System.arraycopy(in, inOff, cekBlock, 0, inLen); - System.arraycopy(in, inOff, iv, 0, iv.length); - - engine.init(false, new ParametersWithIV(param.getParameters(), iv)); - - for (int i = blockSize; i < cekBlock.length; i += blockSize) - { - engine.processBlock(cekBlock, i, cekBlock, i); - } - - System.arraycopy(cekBlock, cekBlock.length - iv.length, iv, 0, iv.length); - - engine.init(false, new ParametersWithIV(param.getParameters(), iv)); - - engine.processBlock(cekBlock, 0, cekBlock, 0); - - engine.init(false, param); - - for (int i = 0; i < cekBlock.length; i += blockSize) - { - engine.processBlock(cekBlock, i, cekBlock, i); - } - - if ((cekBlock[0] & 0xff) > cekBlock.length - 4) - { - throw new InvalidCipherTextException("wrapped key corrupted"); - } - - byte[] key = new byte[cekBlock[0] & 0xff]; - - System.arraycopy(cekBlock, 4, key, 0, cekBlock[0]); - - // Note: Using constant time comparison - int nonEqual = 0; - for (int i = 0; i != 3; i++) - { - byte check = (byte)~cekBlock[1 + i]; - nonEqual |= (check ^ key[i]); - } - if (nonEqual != 0) - { - throw new InvalidCipherTextException("wrapped key fails checksum"); - } - - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3394WrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3394WrapEngine.java deleted file mode 100644 index b29db11..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RFC3394WrapEngine.java +++ /dev/null @@ -1,177 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Wrapper; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - -/** - * an implementation of the AES Key Wrapper from the NIST Key Wrap - * Specification as described in RFC 3394. - *

    - * For further details see: http://www.ietf.org/rfc/rfc3394.txt - * and http://csrc.nist.gov/encryption/kms/key-wrap.pdf. - */ -public class RFC3394WrapEngine - implements Wrapper -{ - private BlockCipher engine; - private KeyParameter param; - private boolean forWrapping; - - private byte[] iv = { - (byte)0xa6, (byte)0xa6, (byte)0xa6, (byte)0xa6, - (byte)0xa6, (byte)0xa6, (byte)0xa6, (byte)0xa6 }; - - public RFC3394WrapEngine(BlockCipher engine) - { - this.engine = engine; - } - - public void init( - boolean forWrapping, - CipherParameters param) - { - this.forWrapping = forWrapping; - - if (param instanceof ParametersWithRandom) - { - param = ((ParametersWithRandom) param).getParameters(); - } - - if (param instanceof KeyParameter) - { - this.param = (KeyParameter)param; - } - else if (param instanceof ParametersWithIV) - { - this.iv = ((ParametersWithIV)param).getIV(); - this.param = (KeyParameter)((ParametersWithIV) param).getParameters(); - if (this.iv.length != 8) - { - throw new IllegalArgumentException("IV not equal to 8"); - } - } - } - - public String getAlgorithmName() - { - return engine.getAlgorithmName(); - } - - public byte[] wrap( - byte[] in, - int inOff, - int inLen) - { - if (!forWrapping) - { - throw new IllegalStateException("not set for wrapping"); - } - - int n = inLen / 8; - - if ((n * 8) != inLen) - { - throw new DataLengthException("wrap data must be a multiple of 8 bytes"); - } - - byte[] block = new byte[inLen + iv.length]; - byte[] buf = new byte[8 + iv.length]; - - System.arraycopy(iv, 0, block, 0, iv.length); - System.arraycopy(in, 0, block, iv.length, inLen); - - engine.init(true, param); - - for (int j = 0; j != 6; j++) - { - for (int i = 1; i <= n; i++) - { - System.arraycopy(block, 0, buf, 0, iv.length); - System.arraycopy(block, 8 * i, buf, iv.length, 8); - engine.processBlock(buf, 0, buf, 0); - - int t = n * j + i; - for (int k = 1; t != 0; k++) - { - byte v = (byte)t; - - buf[iv.length - k] ^= v; - - t >>>= 8; - } - - System.arraycopy(buf, 0, block, 0, 8); - System.arraycopy(buf, 8, block, 8 * i, 8); - } - } - - return block; - } - - public byte[] unwrap( - byte[] in, - int inOff, - int inLen) - throws InvalidCipherTextException - { - if (forWrapping) - { - throw new IllegalStateException("not set for unwrapping"); - } - - int n = inLen / 8; - - if ((n * 8) != inLen) - { - throw new InvalidCipherTextException("unwrap data must be a multiple of 8 bytes"); - } - - byte[] block = new byte[inLen - iv.length]; - byte[] a = new byte[iv.length]; - byte[] buf = new byte[8 + iv.length]; - - System.arraycopy(in, 0, a, 0, iv.length); - System.arraycopy(in, iv.length, block, 0, inLen - iv.length); - - engine.init(false, param); - - n = n - 1; - - for (int j = 5; j >= 0; j--) - { - for (int i = n; i >= 1; i--) - { - System.arraycopy(a, 0, buf, 0, iv.length); - System.arraycopy(block, 8 * (i - 1), buf, iv.length, 8); - - int t = n * j + i; - for (int k = 1; t != 0; k++) - { - byte v = (byte)t; - - buf[iv.length - k] ^= v; - - t >>>= 8; - } - - engine.processBlock(buf, 0, buf, 0); - System.arraycopy(buf, 0, a, 0, 8); - System.arraycopy(buf, 8, block, 8 * (i - 1), 8); - } - } - - if (!Arrays.constantTimeAreEqual(a, iv)) - { - throw new InvalidCipherTextException("checksum failed"); - } - - return block; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindedEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindedEngine.java deleted file mode 100644 index ef04335..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindedEngine.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; -import org.bc.util.BigIntegers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * this does your basic RSA algorithm with blinding - */ -public class RSABlindedEngine - implements AsymmetricBlockCipher -{ - private static BigInteger ONE = BigInteger.valueOf(1); - - private RSACoreEngine core = new RSACoreEngine(); - private RSAKeyParameters key; - private SecureRandom random; - - /** - * initialise the RSA engine. - * - * @param forEncryption true if we are encrypting, false otherwise. - * @param param the necessary RSA key parameters. - */ - public void init( - boolean forEncryption, - CipherParameters param) - { - core.init(forEncryption, param); - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - key = (RSAKeyParameters)rParam.getParameters(); - random = rParam.getRandom(); - } - else - { - key = (RSAKeyParameters)param; - random = new SecureRandom(); - } - } - - /** - * Return the maximum size for an input block to this engine. - * For RSA this is always one byte less than the key size on - * encryption, and the same length as the key size on decryption. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - return core.getInputBlockSize(); - } - - /** - * Return the maximum size for an output block to this engine. - * For RSA this is always one byte less than the key size on - * decryption, and the same length as the key size on encryption. - * - * @return maximum size for an output block. - */ - public int getOutputBlockSize() - { - return core.getOutputBlockSize(); - } - - /** - * Process a single block using the basic RSA algorithm. - * - * @param in the input array. - * @param inOff the offset into the input buffer where the data starts. - * @param inLen the length of the data to be processed. - * @return the result of the RSA process. - * @exception DataLengthException the input block is too large. - */ - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - { - if (key == null) - { - throw new IllegalStateException("RSA engine not initialised"); - } - - BigInteger input = core.convertInput(in, inOff, inLen); - - BigInteger result; - if (key instanceof RSAPrivateCrtKeyParameters) - { - RSAPrivateCrtKeyParameters k = (RSAPrivateCrtKeyParameters)key; - - BigInteger e = k.getPublicExponent(); - if (e != null) // can't do blinding without a public exponent - { - BigInteger m = k.getModulus(); - BigInteger r = BigIntegers.createRandomInRange(ONE, m.subtract(ONE), random); - - BigInteger blindedInput = r.modPow(e, m).multiply(input).mod(m); - BigInteger blindedResult = core.processBlock(blindedInput); - - BigInteger rInv = r.modInverse(m); - result = blindedResult.multiply(rInv).mod(m); - } - else - { - result = core.processBlock(input); - } - } - else - { - result = core.processBlock(input); - } - - return core.convertOutput(result); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindingEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindingEngine.java deleted file mode 100644 index 04805bf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSABlindingEngine.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSABlindingParameters; -import org.bc.crypto.params.RSAKeyParameters; - -import java.math.BigInteger; - -/** - * This does your basic RSA Chaum's blinding and unblinding as outlined in - * "Handbook of Applied Cryptography", page 475. You need to use this if you are - * trying to get another party to generate signatures without them being aware - * of the message they are signing. - */ -public class RSABlindingEngine - implements AsymmetricBlockCipher -{ - private RSACoreEngine core = new RSACoreEngine(); - - private RSAKeyParameters key; - private BigInteger blindingFactor; - - private boolean forEncryption; - - /** - * Initialise the blinding engine. - * - * @param forEncryption true if we are encrypting (blinding), false otherwise. - * @param param the necessary RSA key parameters. - */ - public void init( - boolean forEncryption, - CipherParameters param) - { - RSABlindingParameters p; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - p = (RSABlindingParameters)rParam.getParameters(); - } - else - { - p = (RSABlindingParameters)param; - } - - core.init(forEncryption, p.getPublicKey()); - - this.forEncryption = forEncryption; - this.key = p.getPublicKey(); - this.blindingFactor = p.getBlindingFactor(); - } - - /** - * Return the maximum size for an input block to this engine. - * For RSA this is always one byte less than the key size on - * encryption, and the same length as the key size on decryption. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - return core.getInputBlockSize(); - } - - /** - * Return the maximum size for an output block to this engine. - * For RSA this is always one byte less than the key size on - * decryption, and the same length as the key size on encryption. - * - * @return maximum size for an output block. - */ - public int getOutputBlockSize() - { - return core.getOutputBlockSize(); - } - - /** - * Process a single block using the RSA blinding algorithm. - * - * @param in the input array. - * @param inOff the offset into the input buffer where the data starts. - * @param inLen the length of the data to be processed. - * @return the result of the RSA process. - * @throws DataLengthException the input block is too large. - */ - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - { - BigInteger msg = core.convertInput(in, inOff, inLen); - - if (forEncryption) - { - msg = blindMessage(msg); - } - else - { - msg = unblindMessage(msg); - } - - return core.convertOutput(msg); - } - - /* - * Blind message with the blind factor. - */ - private BigInteger blindMessage( - BigInteger msg) - { - BigInteger blindMsg = blindingFactor; - blindMsg = msg.multiply(blindMsg.modPow(key.getExponent(), key.getModulus())); - blindMsg = blindMsg.mod(key.getModulus()); - - return blindMsg; - } - - /* - * Unblind the message blinded with the blind factor. - */ - private BigInteger unblindMessage( - BigInteger blindedMsg) - { - BigInteger m = key.getModulus(); - BigInteger msg = blindedMsg; - BigInteger blindFactorInverse = blindingFactor.modInverse(m); - msg = msg.multiply(blindFactorInverse); - msg = msg.mod(m); - - return msg; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSACoreEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSACoreEngine.java deleted file mode 100644 index 98b7c0a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSACoreEngine.java +++ /dev/null @@ -1,203 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; - -import java.math.BigInteger; - -/** - * this does your basic RSA algorithm. - */ -class RSACoreEngine -{ - private RSAKeyParameters key; - private boolean forEncryption; - - /** - * initialise the RSA engine. - * - * @param forEncryption true if we are encrypting, false otherwise. - * @param param the necessary RSA key parameters. - */ - public void init( - boolean forEncryption, - CipherParameters param) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - key = (RSAKeyParameters)rParam.getParameters(); - } - else - { - key = (RSAKeyParameters)param; - } - - this.forEncryption = forEncryption; - } - - /** - * Return the maximum size for an input block to this engine. - * For RSA this is always one byte less than the key size on - * encryption, and the same length as the key size on decryption. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - int bitSize = key.getModulus().bitLength(); - - if (forEncryption) - { - return (bitSize + 7) / 8 - 1; - } - else - { - return (bitSize + 7) / 8; - } - } - - /** - * Return the maximum size for an output block to this engine. - * For RSA this is always one byte less than the key size on - * decryption, and the same length as the key size on encryption. - * - * @return maximum size for an output block. - */ - public int getOutputBlockSize() - { - int bitSize = key.getModulus().bitLength(); - - if (forEncryption) - { - return (bitSize + 7) / 8; - } - else - { - return (bitSize + 7) / 8 - 1; - } - } - - public BigInteger convertInput( - byte[] in, - int inOff, - int inLen) - { - if (inLen > (getInputBlockSize() + 1)) - { - throw new DataLengthException("input too large for RSA cipher."); - } - else if (inLen == (getInputBlockSize() + 1) && !forEncryption) - { - throw new DataLengthException("input too large for RSA cipher."); - } - - byte[] block; - - if (inOff != 0 || inLen != in.length) - { - block = new byte[inLen]; - - System.arraycopy(in, inOff, block, 0, inLen); - } - else - { - block = in; - } - - BigInteger res = new BigInteger(1, block); - if (res.compareTo(key.getModulus()) >= 0) - { - throw new DataLengthException("input too large for RSA cipher."); - } - - return res; - } - - public byte[] convertOutput( - BigInteger result) - { - byte[] output = result.toByteArray(); - - if (forEncryption) - { - if (output[0] == 0 && output.length > getOutputBlockSize()) // have ended up with an extra zero byte, copy down. - { - byte[] tmp = new byte[output.length - 1]; - - System.arraycopy(output, 1, tmp, 0, tmp.length); - - return tmp; - } - - if (output.length < getOutputBlockSize()) // have ended up with less bytes than normal, lengthen - { - byte[] tmp = new byte[getOutputBlockSize()]; - - System.arraycopy(output, 0, tmp, tmp.length - output.length, output.length); - - return tmp; - } - } - else - { - if (output[0] == 0) // have ended up with an extra zero byte, copy down. - { - byte[] tmp = new byte[output.length - 1]; - - System.arraycopy(output, 1, tmp, 0, tmp.length); - - return tmp; - } - } - - return output; - } - - public BigInteger processBlock(BigInteger input) - { - if (key instanceof RSAPrivateCrtKeyParameters) - { - // - // we have the extra factors, use the Chinese Remainder Theorem - the author - // wishes to express his thanks to Dirk Bonekaemper at rtsffm.com for - // advice regarding the expression of this. - // - RSAPrivateCrtKeyParameters crtKey = (RSAPrivateCrtKeyParameters)key; - - BigInteger p = crtKey.getP(); - BigInteger q = crtKey.getQ(); - BigInteger dP = crtKey.getDP(); - BigInteger dQ = crtKey.getDQ(); - BigInteger qInv = crtKey.getQInv(); - - BigInteger mP, mQ, h, m; - - // mP = ((input mod p) ^ dP)) mod p - mP = (input.remainder(p)).modPow(dP, p); - - // mQ = ((input mod q) ^ dQ)) mod q - mQ = (input.remainder(q)).modPow(dQ, q); - - // h = qInv * (mP - mQ) mod p - h = mP.subtract(mQ); - h = h.multiply(qInv); - h = h.mod(p); // mod (in Java) returns the positive residual - - // m = h * q + mQ - m = h.multiply(q); - m = m.add(mQ); - - return m; - } - else - { - return input.modPow( - key.getExponent(), key.getModulus()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSAEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSAEngine.java deleted file mode 100644 index c96d86a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RSAEngine.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; - -/** - * this does your basic RSA algorithm. - */ -public class RSAEngine - implements AsymmetricBlockCipher -{ - private RSACoreEngine core; - - /** - * initialise the RSA engine. - * - * @param forEncryption true if we are encrypting, false otherwise. - * @param param the necessary RSA key parameters. - */ - public void init( - boolean forEncryption, - CipherParameters param) - { - if (core == null) - { - core = new RSACoreEngine(); - } - - core.init(forEncryption, param); - } - - /** - * Return the maximum size for an input block to this engine. - * For RSA this is always one byte less than the key size on - * encryption, and the same length as the key size on decryption. - * - * @return maximum size for an input block. - */ - public int getInputBlockSize() - { - return core.getInputBlockSize(); - } - - /** - * Return the maximum size for an output block to this engine. - * For RSA this is always one byte less than the key size on - * decryption, and the same length as the key size on encryption. - * - * @return maximum size for an output block. - */ - public int getOutputBlockSize() - { - return core.getOutputBlockSize(); - } - - /** - * Process a single block using the basic RSA algorithm. - * - * @param in the input array. - * @param inOff the offset into the input buffer where the data starts. - * @param inLen the length of the data to be processed. - * @return the result of the RSA process. - * @exception DataLengthException the input block is too large. - */ - public byte[] processBlock( - byte[] in, - int inOff, - int inLen) - { - if (core == null) - { - throw new IllegalStateException("RSA engine not initialised"); - } - - return core.convertOutput(core.processBlock(core.convertInput(in, inOff, inLen))); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RijndaelEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RijndaelEngine.java deleted file mode 100644 index 53a1142..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/RijndaelEngine.java +++ /dev/null @@ -1,724 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * an implementation of Rijndael, based on the documentation and reference implementation - * by Paulo Barreto, Vincent Rijmen, for v2.0 August '99. - *

    - * Note: this implementation is based on information prior to final NIST publication. - */ -public class RijndaelEngine - implements BlockCipher -{ - private static final int MAXROUNDS = 14; - - private static final int MAXKC = (256/4); - - private static final byte[] logtable = { - (byte)0, (byte)0, (byte)25, (byte)1, (byte)50, (byte)2, (byte)26, (byte)198, - (byte)75, (byte)199, (byte)27, (byte)104, (byte)51, (byte)238, (byte)223, (byte)3, - (byte)100, (byte)4, (byte)224, (byte)14, (byte)52, (byte)141, (byte)129, (byte)239, - (byte)76, (byte)113, (byte)8, (byte)200, (byte)248, (byte)105, (byte)28, (byte)193, - (byte)125, (byte)194, (byte)29, (byte)181, (byte)249, (byte)185, (byte)39, (byte)106, - (byte)77, (byte)228, (byte)166, (byte)114, (byte)154, (byte)201, (byte)9, (byte)120, - (byte)101, (byte)47, (byte)138, (byte)5, (byte)33, (byte)15, (byte)225, (byte)36, - (byte)18, (byte)240, (byte)130, (byte)69, (byte)53, (byte)147, (byte)218, (byte)142, - (byte)150, (byte)143, (byte)219, (byte)189, (byte)54, (byte)208, (byte)206, (byte)148, - (byte)19, (byte)92, (byte)210, (byte)241, (byte)64, (byte)70, (byte)131, (byte)56, - (byte)102, (byte)221, (byte)253, (byte)48, (byte)191, (byte)6, (byte)139, (byte)98, - (byte)179, (byte)37, (byte)226, (byte)152, (byte)34, (byte)136, (byte)145, (byte)16, - (byte)126, (byte)110, (byte)72, (byte)195, (byte)163, (byte)182, (byte)30, (byte)66, - (byte)58, (byte)107, (byte)40, (byte)84, (byte)250, (byte)133, (byte)61, (byte)186, - (byte)43, (byte)121, (byte)10, (byte)21, (byte)155, (byte)159, (byte)94, (byte)202, - (byte)78, (byte)212, (byte)172, (byte)229, (byte)243, (byte)115, (byte)167, (byte)87, - (byte)175, (byte)88, (byte)168, (byte)80, (byte)244, (byte)234, (byte)214, (byte)116, - (byte)79, (byte)174, (byte)233, (byte)213, (byte)231, (byte)230, (byte)173, (byte)232, - (byte)44, (byte)215, (byte)117, (byte)122, (byte)235, (byte)22, (byte)11, (byte)245, - (byte)89, (byte)203, (byte)95, (byte)176, (byte)156, (byte)169, (byte)81, (byte)160, - (byte)127, (byte)12, (byte)246, (byte)111, (byte)23, (byte)196, (byte)73, (byte)236, - (byte)216, (byte)67, (byte)31, (byte)45, (byte)164, (byte)118, (byte)123, (byte)183, - (byte)204, (byte)187, (byte)62, (byte)90, (byte)251, (byte)96, (byte)177, (byte)134, - (byte)59, (byte)82, (byte)161, (byte)108, (byte)170, (byte)85, (byte)41, (byte)157, - (byte)151, (byte)178, (byte)135, (byte)144, (byte)97, (byte)190, (byte)220, (byte)252, - (byte)188, (byte)149, (byte)207, (byte)205, (byte)55, (byte)63, (byte)91, (byte)209, - (byte)83, (byte)57, (byte)132, (byte)60, (byte)65, (byte)162, (byte)109, (byte)71, - (byte)20, (byte)42, (byte)158, (byte)93, (byte)86, (byte)242, (byte)211, (byte)171, - (byte)68, (byte)17, (byte)146, (byte)217, (byte)35, (byte)32, (byte)46, (byte)137, - (byte)180, (byte)124, (byte)184, (byte)38, (byte)119, (byte)153, (byte)227, (byte)165, - (byte)103, (byte)74, (byte)237, (byte)222, (byte)197, (byte)49, (byte)254, (byte)24, - (byte)13, (byte)99, (byte)140, (byte)128, (byte)192, (byte)247, (byte)112, (byte)7 - }; - - private static final byte[] aLogtable = { - (byte)0, (byte)3, (byte)5, (byte)15, (byte)17, (byte)51, (byte)85, (byte)255, (byte)26, (byte)46, (byte)114, (byte)150, (byte)161, (byte)248, (byte)19, (byte)53, - (byte)95, (byte)225, (byte)56, (byte)72, (byte)216, (byte)115, (byte)149, (byte)164, (byte)247, (byte)2, (byte)6, (byte)10, (byte)30, (byte)34, (byte)102, (byte)170, - (byte)229, (byte)52, (byte)92, (byte)228, (byte)55, (byte)89, (byte)235, (byte)38, (byte)106, (byte)190, (byte)217, (byte)112, (byte)144, (byte)171, (byte)230, (byte)49, - (byte)83, (byte)245, (byte)4, (byte)12, (byte)20, (byte)60, (byte)68, (byte)204, (byte)79, (byte)209, (byte)104, (byte)184, (byte)211, (byte)110, (byte)178, (byte)205, - (byte)76, (byte)212, (byte)103, (byte)169, (byte)224, (byte)59, (byte)77, (byte)215, (byte)98, (byte)166, (byte)241, (byte)8, (byte)24, (byte)40, (byte)120, (byte)136, - (byte)131, (byte)158, (byte)185, (byte)208, (byte)107, (byte)189, (byte)220, (byte)127, (byte)129, (byte)152, (byte)179, (byte)206, (byte)73, (byte)219, (byte)118, (byte)154, - (byte)181, (byte)196, (byte)87, (byte)249, (byte)16, (byte)48, (byte)80, (byte)240, (byte)11, (byte)29, (byte)39, (byte)105, (byte)187, (byte)214, (byte)97, (byte)163, - (byte)254, (byte)25, (byte)43, (byte)125, (byte)135, (byte)146, (byte)173, (byte)236, (byte)47, (byte)113, (byte)147, (byte)174, (byte)233, (byte)32, (byte)96, (byte)160, - (byte)251, (byte)22, (byte)58, (byte)78, (byte)210, (byte)109, (byte)183, (byte)194, (byte)93, (byte)231, (byte)50, (byte)86, (byte)250, (byte)21, (byte)63, (byte)65, - (byte)195, (byte)94, (byte)226, (byte)61, (byte)71, (byte)201, (byte)64, (byte)192, (byte)91, (byte)237, (byte)44, (byte)116, (byte)156, (byte)191, (byte)218, (byte)117, - (byte)159, (byte)186, (byte)213, (byte)100, (byte)172, (byte)239, (byte)42, (byte)126, (byte)130, (byte)157, (byte)188, (byte)223, (byte)122, (byte)142, (byte)137, (byte)128, - (byte)155, (byte)182, (byte)193, (byte)88, (byte)232, (byte)35, (byte)101, (byte)175, (byte)234, (byte)37, (byte)111, (byte)177, (byte)200, (byte)67, (byte)197, (byte)84, - (byte)252, (byte)31, (byte)33, (byte)99, (byte)165, (byte)244, (byte)7, (byte)9, (byte)27, (byte)45, (byte)119, (byte)153, (byte)176, (byte)203, (byte)70, (byte)202, - (byte)69, (byte)207, (byte)74, (byte)222, (byte)121, (byte)139, (byte)134, (byte)145, (byte)168, (byte)227, (byte)62, (byte)66, (byte)198, (byte)81, (byte)243, (byte)14, - (byte)18, (byte)54, (byte)90, (byte)238, (byte)41, (byte)123, (byte)141, (byte)140, (byte)143, (byte)138, (byte)133, (byte)148, (byte)167, (byte)242, (byte)13, (byte)23, - (byte)57, (byte)75, (byte)221, (byte)124, (byte)132, (byte)151, (byte)162, (byte)253, (byte)28, (byte)36, (byte)108, (byte)180, (byte)199, (byte)82, (byte)246, (byte)1, - (byte)3, (byte)5, (byte)15, (byte)17, (byte)51, (byte)85, (byte)255, (byte)26, (byte)46, (byte)114, (byte)150, (byte)161, (byte)248, (byte)19, (byte)53, - (byte)95, (byte)225, (byte)56, (byte)72, (byte)216, (byte)115, (byte)149, (byte)164, (byte)247, (byte)2, (byte)6, (byte)10, (byte)30, (byte)34, (byte)102, (byte)170, - (byte)229, (byte)52, (byte)92, (byte)228, (byte)55, (byte)89, (byte)235, (byte)38, (byte)106, (byte)190, (byte)217, (byte)112, (byte)144, (byte)171, (byte)230, (byte)49, - (byte)83, (byte)245, (byte)4, (byte)12, (byte)20, (byte)60, (byte)68, (byte)204, (byte)79, (byte)209, (byte)104, (byte)184, (byte)211, (byte)110, (byte)178, (byte)205, - (byte)76, (byte)212, (byte)103, (byte)169, (byte)224, (byte)59, (byte)77, (byte)215, (byte)98, (byte)166, (byte)241, (byte)8, (byte)24, (byte)40, (byte)120, (byte)136, - (byte)131, (byte)158, (byte)185, (byte)208, (byte)107, (byte)189, (byte)220, (byte)127, (byte)129, (byte)152, (byte)179, (byte)206, (byte)73, (byte)219, (byte)118, (byte)154, - (byte)181, (byte)196, (byte)87, (byte)249, (byte)16, (byte)48, (byte)80, (byte)240, (byte)11, (byte)29, (byte)39, (byte)105, (byte)187, (byte)214, (byte)97, (byte)163, - (byte)254, (byte)25, (byte)43, (byte)125, (byte)135, (byte)146, (byte)173, (byte)236, (byte)47, (byte)113, (byte)147, (byte)174, (byte)233, (byte)32, (byte)96, (byte)160, - (byte)251, (byte)22, (byte)58, (byte)78, (byte)210, (byte)109, (byte)183, (byte)194, (byte)93, (byte)231, (byte)50, (byte)86, (byte)250, (byte)21, (byte)63, (byte)65, - (byte)195, (byte)94, (byte)226, (byte)61, (byte)71, (byte)201, (byte)64, (byte)192, (byte)91, (byte)237, (byte)44, (byte)116, (byte)156, (byte)191, (byte)218, (byte)117, - (byte)159, (byte)186, (byte)213, (byte)100, (byte)172, (byte)239, (byte)42, (byte)126, (byte)130, (byte)157, (byte)188, (byte)223, (byte)122, (byte)142, (byte)137, (byte)128, - (byte)155, (byte)182, (byte)193, (byte)88, (byte)232, (byte)35, (byte)101, (byte)175, (byte)234, (byte)37, (byte)111, (byte)177, (byte)200, (byte)67, (byte)197, (byte)84, - (byte)252, (byte)31, (byte)33, (byte)99, (byte)165, (byte)244, (byte)7, (byte)9, (byte)27, (byte)45, (byte)119, (byte)153, (byte)176, (byte)203, (byte)70, (byte)202, - (byte)69, (byte)207, (byte)74, (byte)222, (byte)121, (byte)139, (byte)134, (byte)145, (byte)168, (byte)227, (byte)62, (byte)66, (byte)198, (byte)81, (byte)243, (byte)14, - (byte)18, (byte)54, (byte)90, (byte)238, (byte)41, (byte)123, (byte)141, (byte)140, (byte)143, (byte)138, (byte)133, (byte)148, (byte)167, (byte)242, (byte)13, (byte)23, - (byte)57, (byte)75, (byte)221, (byte)124, (byte)132, (byte)151, (byte)162, (byte)253, (byte)28, (byte)36, (byte)108, (byte)180, (byte)199, (byte)82, (byte)246, (byte)1, - }; - - private static final byte[] S = { - (byte)99, (byte)124, (byte)119, (byte)123, (byte)242, (byte)107, (byte)111, (byte)197, (byte)48, (byte)1, (byte)103, (byte)43, (byte)254, (byte)215, (byte)171, (byte)118, - (byte)202, (byte)130, (byte)201, (byte)125, (byte)250, (byte)89, (byte)71, (byte)240, (byte)173, (byte)212, (byte)162, (byte)175, (byte)156, (byte)164, (byte)114, (byte)192, - (byte)183, (byte)253, (byte)147, (byte)38, (byte)54, (byte)63, (byte)247, (byte)204, (byte)52, (byte)165, (byte)229, (byte)241, (byte)113, (byte)216, (byte)49, (byte)21, - (byte)4, (byte)199, (byte)35, (byte)195, (byte)24, (byte)150, (byte)5, (byte)154, (byte)7, (byte)18, (byte)128, (byte)226, (byte)235, (byte)39, (byte)178, (byte)117, - (byte)9, (byte)131, (byte)44, (byte)26, (byte)27, (byte)110, (byte)90, (byte)160, (byte)82, (byte)59, (byte)214, (byte)179, (byte)41, (byte)227, (byte)47, (byte)132, - (byte)83, (byte)209, (byte)0, (byte)237, (byte)32, (byte)252, (byte)177, (byte)91, (byte)106, (byte)203, (byte)190, (byte)57, (byte)74, (byte)76, (byte)88, (byte)207, - (byte)208, (byte)239, (byte)170, (byte)251, (byte)67, (byte)77, (byte)51, (byte)133, (byte)69, (byte)249, (byte)2, (byte)127, (byte)80, (byte)60, (byte)159, (byte)168, - (byte)81, (byte)163, (byte)64, (byte)143, (byte)146, (byte)157, (byte)56, (byte)245, (byte)188, (byte)182, (byte)218, (byte)33, (byte)16, (byte)255, (byte)243, (byte)210, - (byte)205, (byte)12, (byte)19, (byte)236, (byte)95, (byte)151, (byte)68, (byte)23, (byte)196, (byte)167, (byte)126, (byte)61, (byte)100, (byte)93, (byte)25, (byte)115, - (byte)96, (byte)129, (byte)79, (byte)220, (byte)34, (byte)42, (byte)144, (byte)136, (byte)70, (byte)238, (byte)184, (byte)20, (byte)222, (byte)94, (byte)11, (byte)219, - (byte)224, (byte)50, (byte)58, (byte)10, (byte)73, (byte)6, (byte)36, (byte)92, (byte)194, (byte)211, (byte)172, (byte)98, (byte)145, (byte)149, (byte)228, (byte)121, - (byte)231, (byte)200, (byte)55, (byte)109, (byte)141, (byte)213, (byte)78, (byte)169, (byte)108, (byte)86, (byte)244, (byte)234, (byte)101, (byte)122, (byte)174, (byte)8, - (byte)186, (byte)120, (byte)37, (byte)46, (byte)28, (byte)166, (byte)180, (byte)198, (byte)232, (byte)221, (byte)116, (byte)31, (byte)75, (byte)189, (byte)139, (byte)138, - (byte)112, (byte)62, (byte)181, (byte)102, (byte)72, (byte)3, (byte)246, (byte)14, (byte)97, (byte)53, (byte)87, (byte)185, (byte)134, (byte)193, (byte)29, (byte)158, - (byte)225, (byte)248, (byte)152, (byte)17, (byte)105, (byte)217, (byte)142, (byte)148, (byte)155, (byte)30, (byte)135, (byte)233, (byte)206, (byte)85, (byte)40, (byte)223, - (byte)140, (byte)161, (byte)137, (byte)13, (byte)191, (byte)230, (byte)66, (byte)104, (byte)65, (byte)153, (byte)45, (byte)15, (byte)176, (byte)84, (byte)187, (byte)22, - }; - - private static final byte[] Si = { - (byte)82, (byte)9, (byte)106, (byte)213, (byte)48, (byte)54, (byte)165, (byte)56, (byte)191, (byte)64, (byte)163, (byte)158, (byte)129, (byte)243, (byte)215, (byte)251, - (byte)124, (byte)227, (byte)57, (byte)130, (byte)155, (byte)47, (byte)255, (byte)135, (byte)52, (byte)142, (byte)67, (byte)68, (byte)196, (byte)222, (byte)233, (byte)203, - (byte)84, (byte)123, (byte)148, (byte)50, (byte)166, (byte)194, (byte)35, (byte)61, (byte)238, (byte)76, (byte)149, (byte)11, (byte)66, (byte)250, (byte)195, (byte)78, - (byte)8, (byte)46, (byte)161, (byte)102, (byte)40, (byte)217, (byte)36, (byte)178, (byte)118, (byte)91, (byte)162, (byte)73, (byte)109, (byte)139, (byte)209, (byte)37, - (byte)114, (byte)248, (byte)246, (byte)100, (byte)134, (byte)104, (byte)152, (byte)22, (byte)212, (byte)164, (byte)92, (byte)204, (byte)93, (byte)101, (byte)182, (byte)146, - (byte)108, (byte)112, (byte)72, (byte)80, (byte)253, (byte)237, (byte)185, (byte)218, (byte)94, (byte)21, (byte)70, (byte)87, (byte)167, (byte)141, (byte)157, (byte)132, - (byte)144, (byte)216, (byte)171, (byte)0, (byte)140, (byte)188, (byte)211, (byte)10, (byte)247, (byte)228, (byte)88, (byte)5, (byte)184, (byte)179, (byte)69, (byte)6, - (byte)208, (byte)44, (byte)30, (byte)143, (byte)202, (byte)63, (byte)15, (byte)2, (byte)193, (byte)175, (byte)189, (byte)3, (byte)1, (byte)19, (byte)138, (byte)107, - (byte)58, (byte)145, (byte)17, (byte)65, (byte)79, (byte)103, (byte)220, (byte)234, (byte)151, (byte)242, (byte)207, (byte)206, (byte)240, (byte)180, (byte)230, (byte)115, - (byte)150, (byte)172, (byte)116, (byte)34, (byte)231, (byte)173, (byte)53, (byte)133, (byte)226, (byte)249, (byte)55, (byte)232, (byte)28, (byte)117, (byte)223, (byte)110, - (byte)71, (byte)241, (byte)26, (byte)113, (byte)29, (byte)41, (byte)197, (byte)137, (byte)111, (byte)183, (byte)98, (byte)14, (byte)170, (byte)24, (byte)190, (byte)27, - (byte)252, (byte)86, (byte)62, (byte)75, (byte)198, (byte)210, (byte)121, (byte)32, (byte)154, (byte)219, (byte)192, (byte)254, (byte)120, (byte)205, (byte)90, (byte)244, - (byte)31, (byte)221, (byte)168, (byte)51, (byte)136, (byte)7, (byte)199, (byte)49, (byte)177, (byte)18, (byte)16, (byte)89, (byte)39, (byte)128, (byte)236, (byte)95, - (byte)96, (byte)81, (byte)127, (byte)169, (byte)25, (byte)181, (byte)74, (byte)13, (byte)45, (byte)229, (byte)122, (byte)159, (byte)147, (byte)201, (byte)156, (byte)239, - (byte)160, (byte)224, (byte)59, (byte)77, (byte)174, (byte)42, (byte)245, (byte)176, (byte)200, (byte)235, (byte)187, (byte)60, (byte)131, (byte)83, (byte)153, (byte)97, - (byte)23, (byte)43, (byte)4, (byte)126, (byte)186, (byte)119, (byte)214, (byte)38, (byte)225, (byte)105, (byte)20, (byte)99, (byte)85, (byte)33, (byte)12, (byte)125, - }; - - private static final int[] rcon = { - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 }; - - static byte[][] shifts0 = - { - { 0, 8, 16, 24 }, - { 0, 8, 16, 24 }, - { 0, 8, 16, 24 }, - { 0, 8, 16, 32 }, - { 0, 8, 24, 32 } - }; - - static byte[][] shifts1 = - { - { 0, 24, 16, 8 }, - { 0, 32, 24, 16 }, - { 0, 40, 32, 24 }, - { 0, 48, 40, 24 }, - { 0, 56, 40, 32 } - }; - - /** - * multiply two elements of GF(2^m) - * needed for MixColumn and InvMixColumn - */ - private byte mul0x2( - int b) - { - if (b != 0) - { - return aLogtable[25 + (logtable[b] & 0xff)]; - } - else - { - return 0; - } - } - - private byte mul0x3( - int b) - { - if (b != 0) - { - return aLogtable[1 + (logtable[b] & 0xff)]; - } - else - { - return 0; - } - } - - private byte mul0x9( - int b) - { - if (b >= 0) - { - return aLogtable[199 + b]; - } - else - { - return 0; - } - } - - private byte mul0xb( - int b) - { - if (b >= 0) - { - return aLogtable[104 + b]; - } - else - { - return 0; - } - } - - private byte mul0xd( - int b) - { - if (b >= 0) - { - return aLogtable[238 + b]; - } - else - { - return 0; - } - } - - private byte mul0xe( - int b) - { - if (b >= 0) - { - return aLogtable[223 + b]; - } - else - { - return 0; - } - } - - /** - * xor corresponding text input and round key input bytes - */ - private void KeyAddition( - long[] rk) - { - A0 ^= rk[0]; - A1 ^= rk[1]; - A2 ^= rk[2]; - A3 ^= rk[3]; - } - - private long shift( - long r, - int shift) - { - return (((r >>> shift) | (r << (BC - shift)))) & BC_MASK; - } - - /** - * Row 0 remains unchanged - * The other three rows are shifted a variable amount - */ - private void ShiftRow( - byte[] shiftsSC) - { - A1 = shift(A1, shiftsSC[1]); - A2 = shift(A2, shiftsSC[2]); - A3 = shift(A3, shiftsSC[3]); - } - - private long applyS( - long r, - byte[] box) - { - long res = 0; - - for (int j = 0; j < BC; j += 8) - { - res |= (long)(box[(int)((r >> j) & 0xff)] & 0xff) << j; - } - - return res; - } - - /** - * Replace every byte of the input by the byte at that place - * in the nonlinear S-box - */ - private void Substitution( - byte[] box) - { - A0 = applyS(A0, box); - A1 = applyS(A1, box); - A2 = applyS(A2, box); - A3 = applyS(A3, box); - } - - /** - * Mix the bytes of every column in a linear way - */ - private void MixColumn() - { - long r0, r1, r2, r3; - - r0 = r1 = r2 = r3 = 0; - - for (int j = 0; j < BC; j += 8) - { - int a0 = (int)((A0 >> j) & 0xff); - int a1 = (int)((A1 >> j) & 0xff); - int a2 = (int)((A2 >> j) & 0xff); - int a3 = (int)((A3 >> j) & 0xff); - - r0 |= (long)((mul0x2(a0) ^ mul0x3(a1) ^ a2 ^ a3) & 0xff) << j; - - r1 |= (long)((mul0x2(a1) ^ mul0x3(a2) ^ a3 ^ a0) & 0xff) << j; - - r2 |= (long)((mul0x2(a2) ^ mul0x3(a3) ^ a0 ^ a1) & 0xff) << j; - - r3 |= (long)((mul0x2(a3) ^ mul0x3(a0) ^ a1 ^ a2) & 0xff) << j; - } - - A0 = r0; - A1 = r1; - A2 = r2; - A3 = r3; - } - - /** - * Mix the bytes of every column in a linear way - * This is the opposite operation of Mixcolumn - */ - private void InvMixColumn() - { - long r0, r1, r2, r3; - - r0 = r1 = r2 = r3 = 0; - for (int j = 0; j < BC; j += 8) - { - int a0 = (int)((A0 >> j) & 0xff); - int a1 = (int)((A1 >> j) & 0xff); - int a2 = (int)((A2 >> j) & 0xff); - int a3 = (int)((A3 >> j) & 0xff); - - // - // pre-lookup the log table - // - a0 = (a0 != 0) ? (logtable[a0 & 0xff] & 0xff) : -1; - a1 = (a1 != 0) ? (logtable[a1 & 0xff] & 0xff) : -1; - a2 = (a2 != 0) ? (logtable[a2 & 0xff] & 0xff) : -1; - a3 = (a3 != 0) ? (logtable[a3 & 0xff] & 0xff) : -1; - - r0 |= (long)((mul0xe(a0) ^ mul0xb(a1) ^ mul0xd(a2) ^ mul0x9(a3)) & 0xff) << j; - - r1 |= (long)((mul0xe(a1) ^ mul0xb(a2) ^ mul0xd(a3) ^ mul0x9(a0)) & 0xff) << j; - - r2 |= (long)((mul0xe(a2) ^ mul0xb(a3) ^ mul0xd(a0) ^ mul0x9(a1)) & 0xff) << j; - - r3 |= (long)((mul0xe(a3) ^ mul0xb(a0) ^ mul0xd(a1) ^ mul0x9(a2)) & 0xff) << j; - } - - A0 = r0; - A1 = r1; - A2 = r2; - A3 = r3; - } - - /** - * Calculate the necessary round keys - * The number of calculations depends on keyBits and blockBits - */ - private long[][] generateWorkingKey( - byte[] key) - { - int KC; - int t, rconpointer = 0; - int keyBits = key.length * 8; - byte[][] tk = new byte[4][MAXKC]; - long[][] W = new long[MAXROUNDS+1][4]; - - switch (keyBits) - { - case 128: - KC = 4; - break; - case 160: - KC = 5; - break; - case 192: - KC = 6; - break; - case 224: - KC = 7; - break; - case 256: - KC = 8; - break; - default : - throw new IllegalArgumentException("Key length not 128/160/192/224/256 bits."); - } - - if (keyBits >= blockBits) - { - ROUNDS = KC + 6; - } - else - { - ROUNDS = (BC / 8) + 6; - } - - // - // copy the key into the processing area - // - int index = 0; - - for (int i = 0; i < key.length; i++) - { - tk[i % 4][i / 4] = key[index++]; - } - - t = 0; - - // - // copy values into round key array - // - for (int j = 0; (j < KC) && (t < (ROUNDS+1)*(BC / 8)); j++, t++) - { - for (int i = 0; i < 4; i++) - { - W[t / (BC / 8)][i] |= (long)(tk[i][j] & 0xff) << ((t * 8) % BC); - } - } - - // - // while not enough round key material calculated - // calculate new values - // - while (t < (ROUNDS+1)*(BC/8)) - { - for (int i = 0; i < 4; i++) - { - tk[i][0] ^= S[tk[(i+1)%4][KC-1] & 0xff]; - } - tk[0][0] ^= rcon[rconpointer++]; - - if (KC <= 6) - { - for (int j = 1; j < KC; j++) - { - for (int i = 0; i < 4; i++) - { - tk[i][j] ^= tk[i][j-1]; - } - } - } - else - { - for (int j = 1; j < 4; j++) - { - for (int i = 0; i < 4; i++) - { - tk[i][j] ^= tk[i][j-1]; - } - } - for (int i = 0; i < 4; i++) - { - tk[i][4] ^= S[tk[i][3] & 0xff]; - } - for (int j = 5; j < KC; j++) - { - for (int i = 0; i < 4; i++) - { - tk[i][j] ^= tk[i][j-1]; - } - } - } - - // - // copy values into round key array - // - for (int j = 0; (j < KC) && (t < (ROUNDS+1)*(BC/8)); j++, t++) - { - for (int i = 0; i < 4; i++) - { - W[t / (BC/8)][i] |= (long)(tk[i][j] & 0xff) << ((t * 8) % (BC)); - } - } - } - - return W; - } - - private int BC; - private long BC_MASK; - private int ROUNDS; - private int blockBits; - private long[][] workingKey; - private long A0, A1, A2, A3; - private boolean forEncryption; - private byte[] shifts0SC; - private byte[] shifts1SC; - - /** - * default constructor - 128 bit block size. - */ - public RijndaelEngine() - { - this(128); - } - - /** - * basic constructor - set the cipher up for a given blocksize - * - * @param blockBits the blocksize in bits, must be 128, 192, or 256. - */ - public RijndaelEngine( - int blockBits) - { - switch (blockBits) - { - case 128: - BC = 32; - BC_MASK = 0xffffffffL; - shifts0SC = shifts0[0]; - shifts1SC = shifts1[0]; - break; - case 160: - BC = 40; - BC_MASK = 0xffffffffffL; - shifts0SC = shifts0[1]; - shifts1SC = shifts1[1]; - break; - case 192: - BC = 48; - BC_MASK = 0xffffffffffffL; - shifts0SC = shifts0[2]; - shifts1SC = shifts1[2]; - break; - case 224: - BC = 56; - BC_MASK = 0xffffffffffffffL; - shifts0SC = shifts0[3]; - shifts1SC = shifts1[3]; - break; - case 256: - BC = 64; - BC_MASK = 0xffffffffffffffffL; - shifts0SC = shifts0[4]; - shifts1SC = shifts1[4]; - break; - default: - throw new IllegalArgumentException("unknown blocksize to Rijndael"); - } - - this.blockBits = blockBits; - } - - /** - * initialise a Rijndael cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - workingKey = generateWorkingKey(((KeyParameter)params).getKey()); - this.forEncryption = forEncryption; - return; - } - - throw new IllegalArgumentException("invalid parameter passed to Rijndael init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "Rijndael"; - } - - public int getBlockSize() - { - return BC / 2; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("Rijndael engine not initialised"); - } - - if ((inOff + (BC / 2)) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + (BC / 2)) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (forEncryption) - { - unpackBlock(in, inOff); - encryptBlock(workingKey); - packBlock(out, outOff); - } - else - { - unpackBlock(in, inOff); - decryptBlock(workingKey); - packBlock(out, outOff); - } - - return BC / 2; - } - - public void reset() - { - } - - private void unpackBlock( - byte[] bytes, - int off) - { - int index = off; - - A0 = (bytes[index++] & 0xff); - A1 = (bytes[index++] & 0xff); - A2 = (bytes[index++] & 0xff); - A3 = (bytes[index++] & 0xff); - - for (int j = 8; j != BC; j += 8) - { - A0 |= (long)(bytes[index++] & 0xff) << j; - A1 |= (long)(bytes[index++] & 0xff) << j; - A2 |= (long)(bytes[index++] & 0xff) << j; - A3 |= (long)(bytes[index++] & 0xff) << j; - } - } - - private void packBlock( - byte[] bytes, - int off) - { - int index = off; - - for (int j = 0; j != BC; j += 8) - { - bytes[index++] = (byte)(A0 >> j); - bytes[index++] = (byte)(A1 >> j); - bytes[index++] = (byte)(A2 >> j); - bytes[index++] = (byte)(A3 >> j); - } - } - - private void encryptBlock( - long[][] rk) - { - int r; - - // - // begin with a key addition - // - KeyAddition(rk[0]); - - // - // ROUNDS-1 ordinary rounds - // - for (r = 1; r < ROUNDS; r++) - { - Substitution(S); - ShiftRow(shifts0SC); - MixColumn(); - KeyAddition(rk[r]); - } - - // - // Last round is special: there is no MixColumn - // - Substitution(S); - ShiftRow(shifts0SC); - KeyAddition(rk[ROUNDS]); - } - - private void decryptBlock( - long[][] rk) - { - int r; - - // To decrypt: apply the inverse operations of the encrypt routine, - // in opposite order - // - // (KeyAddition is an involution: it 's equal to its inverse) - // (the inverse of Substitution with table S is Substitution with the inverse table of S) - // (the inverse of Shiftrow is Shiftrow over a suitable distance) - // - - // First the special round: - // without InvMixColumn - // with extra KeyAddition - // - KeyAddition(rk[ROUNDS]); - Substitution(Si); - ShiftRow(shifts1SC); - - // - // ROUNDS-1 ordinary rounds - // - for (r = ROUNDS-1; r > 0; r--) - { - KeyAddition(rk[r]); - InvMixColumn(); - Substitution(Si); - ShiftRow(shifts1SC); - } - - // - // End with the extra key addition - // - KeyAddition(rk[0]); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDEngine.java deleted file mode 100644 index 0d45e92..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDEngine.java +++ /dev/null @@ -1,345 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * Implementation of the SEED algorithm as described in RFC 4009 - */ -public class SEEDEngine - implements BlockCipher -{ - private final int BLOCK_SIZE = 16; - - private static final int[] SS0 = - { - 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124, - 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360, - 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314, - 0x2585a1a4, 0x0f8f838c, 0x03030300, 0x3b4b7378, 0x3b8bb3b8, 0x13031310, 0x12c2d2d0, 0x2ecee2ec, - 0x30407070, 0x0c8c808c, 0x3f0f333c, 0x2888a0a8, 0x32023230, 0x1dcdd1dc, 0x36c6f2f4, 0x34447074, - 0x2ccce0ec, 0x15859194, 0x0b0b0308, 0x17475354, 0x1c4c505c, 0x1b4b5358, 0x3d8db1bc, 0x01010100, - 0x24042024, 0x1c0c101c, 0x33437370, 0x18889098, 0x10001010, 0x0cccc0cc, 0x32c2f2f0, 0x19c9d1d8, - 0x2c0c202c, 0x27c7e3e4, 0x32427270, 0x03838380, 0x1b8b9398, 0x11c1d1d0, 0x06868284, 0x09c9c1c8, - 0x20406060, 0x10405050, 0x2383a3a0, 0x2bcbe3e8, 0x0d0d010c, 0x3686b2b4, 0x1e8e929c, 0x0f4f434c, - 0x3787b3b4, 0x1a4a5258, 0x06c6c2c4, 0x38487078, 0x2686a2a4, 0x12021210, 0x2f8fa3ac, 0x15c5d1d4, - 0x21416160, 0x03c3c3c0, 0x3484b0b4, 0x01414140, 0x12425250, 0x3d4d717c, 0x0d8d818c, 0x08080008, - 0x1f0f131c, 0x19899198, 0x00000000, 0x19091118, 0x04040004, 0x13435350, 0x37c7f3f4, 0x21c1e1e0, - 0x3dcdf1fc, 0x36467274, 0x2f0f232c, 0x27072324, 0x3080b0b0, 0x0b8b8388, 0x0e0e020c, 0x2b8ba3a8, - 0x2282a2a0, 0x2e4e626c, 0x13839390, 0x0d4d414c, 0x29496168, 0x3c4c707c, 0x09090108, 0x0a0a0208, - 0x3f8fb3bc, 0x2fcfe3ec, 0x33c3f3f0, 0x05c5c1c4, 0x07878384, 0x14041014, 0x3ecef2fc, 0x24446064, - 0x1eced2dc, 0x2e0e222c, 0x0b4b4348, 0x1a0a1218, 0x06060204, 0x21012120, 0x2b4b6368, 0x26466264, - 0x02020200, 0x35c5f1f4, 0x12829290, 0x0a8a8288, 0x0c0c000c, 0x3383b3b0, 0x3e4e727c, 0x10c0d0d0, - 0x3a4a7278, 0x07474344, 0x16869294, 0x25c5e1e4, 0x26062224, 0x00808080, 0x2d8da1ac, 0x1fcfd3dc, - 0x2181a1a0, 0x30003030, 0x37073334, 0x2e8ea2ac, 0x36063234, 0x15051114, 0x22022220, 0x38083038, - 0x34c4f0f4, 0x2787a3a4, 0x05454144, 0x0c4c404c, 0x01818180, 0x29c9e1e8, 0x04848084, 0x17879394, - 0x35053134, 0x0bcbc3c8, 0x0ecec2cc, 0x3c0c303c, 0x31417170, 0x11011110, 0x07c7c3c4, 0x09898188, - 0x35457174, 0x3bcbf3f8, 0x1acad2d8, 0x38c8f0f8, 0x14849094, 0x19495158, 0x02828280, 0x04c4c0c4, - 0x3fcff3fc, 0x09494148, 0x39093138, 0x27476364, 0x00c0c0c0, 0x0fcfc3cc, 0x17c7d3d4, 0x3888b0b8, - 0x0f0f030c, 0x0e8e828c, 0x02424240, 0x23032320, 0x11819190, 0x2c4c606c, 0x1bcbd3d8, 0x2484a0a4, - 0x34043034, 0x31c1f1f0, 0x08484048, 0x02c2c2c0, 0x2f4f636c, 0x3d0d313c, 0x2d0d212c, 0x00404040, - 0x3e8eb2bc, 0x3e0e323c, 0x3c8cb0bc, 0x01c1c1c0, 0x2a8aa2a8, 0x3a8ab2b8, 0x0e4e424c, 0x15455154, - 0x3b0b3338, 0x1cccd0dc, 0x28486068, 0x3f4f737c, 0x1c8c909c, 0x18c8d0d8, 0x0a4a4248, 0x16465254, - 0x37477374, 0x2080a0a0, 0x2dcde1ec, 0x06464244, 0x3585b1b4, 0x2b0b2328, 0x25456164, 0x3acaf2f8, - 0x23c3e3e0, 0x3989b1b8, 0x3181b1b0, 0x1f8f939c, 0x1e4e525c, 0x39c9f1f8, 0x26c6e2e4, 0x3282b2b0, - 0x31013130, 0x2acae2e8, 0x2d4d616c, 0x1f4f535c, 0x24c4e0e4, 0x30c0f0f0, 0x0dcdc1cc, 0x08888088, - 0x16061214, 0x3a0a3238, 0x18485058, 0x14c4d0d4, 0x22426260, 0x29092128, 0x07070304, 0x33033330, - 0x28c8e0e8, 0x1b0b1318, 0x05050104, 0x39497178, 0x10809090, 0x2a4a6268, 0x2a0a2228, 0x1a8a9298 - }; - - private static final int[] SS1 = - { - - 0x38380830, 0xe828c8e0, 0x2c2d0d21, 0xa42686a2, 0xcc0fcfc3, 0xdc1eced2, 0xb03383b3, 0xb83888b0, - 0xac2f8fa3, 0x60204060, 0x54154551, 0xc407c7c3, 0x44044440, 0x6c2f4f63, 0x682b4b63, 0x581b4b53, - 0xc003c3c3, 0x60224262, 0x30330333, 0xb43585b1, 0x28290921, 0xa02080a0, 0xe022c2e2, 0xa42787a3, - 0xd013c3d3, 0x90118191, 0x10110111, 0x04060602, 0x1c1c0c10, 0xbc3c8cb0, 0x34360632, 0x480b4b43, - 0xec2fcfe3, 0x88088880, 0x6c2c4c60, 0xa82888a0, 0x14170713, 0xc404c4c0, 0x14160612, 0xf434c4f0, - 0xc002c2c2, 0x44054541, 0xe021c1e1, 0xd416c6d2, 0x3c3f0f33, 0x3c3d0d31, 0x8c0e8e82, 0x98188890, - 0x28280820, 0x4c0e4e42, 0xf436c6f2, 0x3c3e0e32, 0xa42585a1, 0xf839c9f1, 0x0c0d0d01, 0xdc1fcfd3, - 0xd818c8d0, 0x282b0b23, 0x64264662, 0x783a4a72, 0x24270723, 0x2c2f0f23, 0xf031c1f1, 0x70324272, - 0x40024242, 0xd414c4d0, 0x40014141, 0xc000c0c0, 0x70334373, 0x64274763, 0xac2c8ca0, 0x880b8b83, - 0xf437c7f3, 0xac2d8da1, 0x80008080, 0x1c1f0f13, 0xc80acac2, 0x2c2c0c20, 0xa82a8aa2, 0x34340430, - 0xd012c2d2, 0x080b0b03, 0xec2ecee2, 0xe829c9e1, 0x5c1d4d51, 0x94148490, 0x18180810, 0xf838c8f0, - 0x54174753, 0xac2e8ea2, 0x08080800, 0xc405c5c1, 0x10130313, 0xcc0dcdc1, 0x84068682, 0xb83989b1, - 0xfc3fcff3, 0x7c3d4d71, 0xc001c1c1, 0x30310131, 0xf435c5f1, 0x880a8a82, 0x682a4a62, 0xb03181b1, - 0xd011c1d1, 0x20200020, 0xd417c7d3, 0x00020202, 0x20220222, 0x04040400, 0x68284860, 0x70314171, - 0x04070703, 0xd81bcbd3, 0x9c1d8d91, 0x98198991, 0x60214161, 0xbc3e8eb2, 0xe426c6e2, 0x58194951, - 0xdc1dcdd1, 0x50114151, 0x90108090, 0xdc1cccd0, 0x981a8a92, 0xa02383a3, 0xa82b8ba3, 0xd010c0d0, - 0x80018181, 0x0c0f0f03, 0x44074743, 0x181a0a12, 0xe023c3e3, 0xec2ccce0, 0x8c0d8d81, 0xbc3f8fb3, - 0x94168692, 0x783b4b73, 0x5c1c4c50, 0xa02282a2, 0xa02181a1, 0x60234363, 0x20230323, 0x4c0d4d41, - 0xc808c8c0, 0x9c1e8e92, 0x9c1c8c90, 0x383a0a32, 0x0c0c0c00, 0x2c2e0e22, 0xb83a8ab2, 0x6c2e4e62, - 0x9c1f8f93, 0x581a4a52, 0xf032c2f2, 0x90128292, 0xf033c3f3, 0x48094941, 0x78384870, 0xcc0cccc0, - 0x14150511, 0xf83bcbf3, 0x70304070, 0x74354571, 0x7c3f4f73, 0x34350531, 0x10100010, 0x00030303, - 0x64244460, 0x6c2d4d61, 0xc406c6c2, 0x74344470, 0xd415c5d1, 0xb43484b0, 0xe82acae2, 0x08090901, - 0x74364672, 0x18190911, 0xfc3ecef2, 0x40004040, 0x10120212, 0xe020c0e0, 0xbc3d8db1, 0x04050501, - 0xf83acaf2, 0x00010101, 0xf030c0f0, 0x282a0a22, 0x5c1e4e52, 0xa82989a1, 0x54164652, 0x40034343, - 0x84058581, 0x14140410, 0x88098981, 0x981b8b93, 0xb03080b0, 0xe425c5e1, 0x48084840, 0x78394971, - 0x94178793, 0xfc3cccf0, 0x1c1e0e12, 0x80028282, 0x20210121, 0x8c0c8c80, 0x181b0b13, 0x5c1f4f53, - 0x74374773, 0x54144450, 0xb03282b2, 0x1c1d0d11, 0x24250521, 0x4c0f4f43, 0x00000000, 0x44064642, - 0xec2dcde1, 0x58184850, 0x50124252, 0xe82bcbe3, 0x7c3e4e72, 0xd81acad2, 0xc809c9c1, 0xfc3dcdf1, - 0x30300030, 0x94158591, 0x64254561, 0x3c3c0c30, 0xb43686b2, 0xe424c4e0, 0xb83b8bb3, 0x7c3c4c70, - 0x0c0e0e02, 0x50104050, 0x38390931, 0x24260622, 0x30320232, 0x84048480, 0x68294961, 0x90138393, - 0x34370733, 0xe427c7e3, 0x24240420, 0xa42484a0, 0xc80bcbc3, 0x50134353, 0x080a0a02, 0x84078783, - 0xd819c9d1, 0x4c0c4c40, 0x80038383, 0x8c0f8f83, 0xcc0ecec2, 0x383b0b33, 0x480a4a42, 0xb43787b3 - }; - - private static final int[] SS2 = - { - - 0xa1a82989, 0x81840585, 0xd2d416c6, 0xd3d013c3, 0x50541444, 0x111c1d0d, 0xa0ac2c8c, 0x21242505, - 0x515c1d4d, 0x43400343, 0x10181808, 0x121c1e0e, 0x51501141, 0xf0fc3ccc, 0xc2c80aca, 0x63602343, - 0x20282808, 0x40440444, 0x20202000, 0x919c1d8d, 0xe0e020c0, 0xe2e022c2, 0xc0c808c8, 0x13141707, - 0xa1a42585, 0x838c0f8f, 0x03000303, 0x73783b4b, 0xb3b83b8b, 0x13101303, 0xd2d012c2, 0xe2ec2ece, - 0x70703040, 0x808c0c8c, 0x333c3f0f, 0xa0a82888, 0x32303202, 0xd1dc1dcd, 0xf2f436c6, 0x70743444, - 0xe0ec2ccc, 0x91941585, 0x03080b0b, 0x53541747, 0x505c1c4c, 0x53581b4b, 0xb1bc3d8d, 0x01000101, - 0x20242404, 0x101c1c0c, 0x73703343, 0x90981888, 0x10101000, 0xc0cc0ccc, 0xf2f032c2, 0xd1d819c9, - 0x202c2c0c, 0xe3e427c7, 0x72703242, 0x83800383, 0x93981b8b, 0xd1d011c1, 0x82840686, 0xc1c809c9, - 0x60602040, 0x50501040, 0xa3a02383, 0xe3e82bcb, 0x010c0d0d, 0xb2b43686, 0x929c1e8e, 0x434c0f4f, - 0xb3b43787, 0x52581a4a, 0xc2c406c6, 0x70783848, 0xa2a42686, 0x12101202, 0xa3ac2f8f, 0xd1d415c5, - 0x61602141, 0xc3c003c3, 0xb0b43484, 0x41400141, 0x52501242, 0x717c3d4d, 0x818c0d8d, 0x00080808, - 0x131c1f0f, 0x91981989, 0x00000000, 0x11181909, 0x00040404, 0x53501343, 0xf3f437c7, 0xe1e021c1, - 0xf1fc3dcd, 0x72743646, 0x232c2f0f, 0x23242707, 0xb0b03080, 0x83880b8b, 0x020c0e0e, 0xa3a82b8b, - 0xa2a02282, 0x626c2e4e, 0x93901383, 0x414c0d4d, 0x61682949, 0x707c3c4c, 0x01080909, 0x02080a0a, - 0xb3bc3f8f, 0xe3ec2fcf, 0xf3f033c3, 0xc1c405c5, 0x83840787, 0x10141404, 0xf2fc3ece, 0x60642444, - 0xd2dc1ece, 0x222c2e0e, 0x43480b4b, 0x12181a0a, 0x02040606, 0x21202101, 0x63682b4b, 0x62642646, - 0x02000202, 0xf1f435c5, 0x92901282, 0x82880a8a, 0x000c0c0c, 0xb3b03383, 0x727c3e4e, 0xd0d010c0, - 0x72783a4a, 0x43440747, 0x92941686, 0xe1e425c5, 0x22242606, 0x80800080, 0xa1ac2d8d, 0xd3dc1fcf, - 0xa1a02181, 0x30303000, 0x33343707, 0xa2ac2e8e, 0x32343606, 0x11141505, 0x22202202, 0x30383808, - 0xf0f434c4, 0xa3a42787, 0x41440545, 0x404c0c4c, 0x81800181, 0xe1e829c9, 0x80840484, 0x93941787, - 0x31343505, 0xc3c80bcb, 0xc2cc0ece, 0x303c3c0c, 0x71703141, 0x11101101, 0xc3c407c7, 0x81880989, - 0x71743545, 0xf3f83bcb, 0xd2d81aca, 0xf0f838c8, 0x90941484, 0x51581949, 0x82800282, 0xc0c404c4, - 0xf3fc3fcf, 0x41480949, 0x31383909, 0x63642747, 0xc0c000c0, 0xc3cc0fcf, 0xd3d417c7, 0xb0b83888, - 0x030c0f0f, 0x828c0e8e, 0x42400242, 0x23202303, 0x91901181, 0x606c2c4c, 0xd3d81bcb, 0xa0a42484, - 0x30343404, 0xf1f031c1, 0x40480848, 0xc2c002c2, 0x636c2f4f, 0x313c3d0d, 0x212c2d0d, 0x40400040, - 0xb2bc3e8e, 0x323c3e0e, 0xb0bc3c8c, 0xc1c001c1, 0xa2a82a8a, 0xb2b83a8a, 0x424c0e4e, 0x51541545, - 0x33383b0b, 0xd0dc1ccc, 0x60682848, 0x737c3f4f, 0x909c1c8c, 0xd0d818c8, 0x42480a4a, 0x52541646, - 0x73743747, 0xa0a02080, 0xe1ec2dcd, 0x42440646, 0xb1b43585, 0x23282b0b, 0x61642545, 0xf2f83aca, - 0xe3e023c3, 0xb1b83989, 0xb1b03181, 0x939c1f8f, 0x525c1e4e, 0xf1f839c9, 0xe2e426c6, 0xb2b03282, - 0x31303101, 0xe2e82aca, 0x616c2d4d, 0x535c1f4f, 0xe0e424c4, 0xf0f030c0, 0xc1cc0dcd, 0x80880888, - 0x12141606, 0x32383a0a, 0x50581848, 0xd0d414c4, 0x62602242, 0x21282909, 0x03040707, 0x33303303, - 0xe0e828c8, 0x13181b0b, 0x01040505, 0x71783949, 0x90901080, 0x62682a4a, 0x22282a0a, 0x92981a8a - }; - - - private static final int[] SS3 = - { - - 0x08303838, 0xc8e0e828, 0x0d212c2d, 0x86a2a426, 0xcfc3cc0f, 0xced2dc1e, 0x83b3b033, 0x88b0b838, - 0x8fa3ac2f, 0x40606020, 0x45515415, 0xc7c3c407, 0x44404404, 0x4f636c2f, 0x4b63682b, 0x4b53581b, - 0xc3c3c003, 0x42626022, 0x03333033, 0x85b1b435, 0x09212829, 0x80a0a020, 0xc2e2e022, 0x87a3a427, - 0xc3d3d013, 0x81919011, 0x01111011, 0x06020406, 0x0c101c1c, 0x8cb0bc3c, 0x06323436, 0x4b43480b, - 0xcfe3ec2f, 0x88808808, 0x4c606c2c, 0x88a0a828, 0x07131417, 0xc4c0c404, 0x06121416, 0xc4f0f434, - 0xc2c2c002, 0x45414405, 0xc1e1e021, 0xc6d2d416, 0x0f333c3f, 0x0d313c3d, 0x8e828c0e, 0x88909818, - 0x08202828, 0x4e424c0e, 0xc6f2f436, 0x0e323c3e, 0x85a1a425, 0xc9f1f839, 0x0d010c0d, 0xcfd3dc1f, - 0xc8d0d818, 0x0b23282b, 0x46626426, 0x4a72783a, 0x07232427, 0x0f232c2f, 0xc1f1f031, 0x42727032, - 0x42424002, 0xc4d0d414, 0x41414001, 0xc0c0c000, 0x43737033, 0x47636427, 0x8ca0ac2c, 0x8b83880b, - 0xc7f3f437, 0x8da1ac2d, 0x80808000, 0x0f131c1f, 0xcac2c80a, 0x0c202c2c, 0x8aa2a82a, 0x04303434, - 0xc2d2d012, 0x0b03080b, 0xcee2ec2e, 0xc9e1e829, 0x4d515c1d, 0x84909414, 0x08101818, 0xc8f0f838, - 0x47535417, 0x8ea2ac2e, 0x08000808, 0xc5c1c405, 0x03131013, 0xcdc1cc0d, 0x86828406, 0x89b1b839, - 0xcff3fc3f, 0x4d717c3d, 0xc1c1c001, 0x01313031, 0xc5f1f435, 0x8a82880a, 0x4a62682a, 0x81b1b031, - 0xc1d1d011, 0x00202020, 0xc7d3d417, 0x02020002, 0x02222022, 0x04000404, 0x48606828, 0x41717031, - 0x07030407, 0xcbd3d81b, 0x8d919c1d, 0x89919819, 0x41616021, 0x8eb2bc3e, 0xc6e2e426, 0x49515819, - 0xcdd1dc1d, 0x41515011, 0x80909010, 0xccd0dc1c, 0x8a92981a, 0x83a3a023, 0x8ba3a82b, 0xc0d0d010, - 0x81818001, 0x0f030c0f, 0x47434407, 0x0a12181a, 0xc3e3e023, 0xcce0ec2c, 0x8d818c0d, 0x8fb3bc3f, - 0x86929416, 0x4b73783b, 0x4c505c1c, 0x82a2a022, 0x81a1a021, 0x43636023, 0x03232023, 0x4d414c0d, - 0xc8c0c808, 0x8e929c1e, 0x8c909c1c, 0x0a32383a, 0x0c000c0c, 0x0e222c2e, 0x8ab2b83a, 0x4e626c2e, - 0x8f939c1f, 0x4a52581a, 0xc2f2f032, 0x82929012, 0xc3f3f033, 0x49414809, 0x48707838, 0xccc0cc0c, - 0x05111415, 0xcbf3f83b, 0x40707030, 0x45717435, 0x4f737c3f, 0x05313435, 0x00101010, 0x03030003, - 0x44606424, 0x4d616c2d, 0xc6c2c406, 0x44707434, 0xc5d1d415, 0x84b0b434, 0xcae2e82a, 0x09010809, - 0x46727436, 0x09111819, 0xcef2fc3e, 0x40404000, 0x02121012, 0xc0e0e020, 0x8db1bc3d, 0x05010405, - 0xcaf2f83a, 0x01010001, 0xc0f0f030, 0x0a22282a, 0x4e525c1e, 0x89a1a829, 0x46525416, 0x43434003, - 0x85818405, 0x04101414, 0x89818809, 0x8b93981b, 0x80b0b030, 0xc5e1e425, 0x48404808, 0x49717839, - 0x87939417, 0xccf0fc3c, 0x0e121c1e, 0x82828002, 0x01212021, 0x8c808c0c, 0x0b13181b, 0x4f535c1f, - 0x47737437, 0x44505414, 0x82b2b032, 0x0d111c1d, 0x05212425, 0x4f434c0f, 0x00000000, 0x46424406, - 0xcde1ec2d, 0x48505818, 0x42525012, 0xcbe3e82b, 0x4e727c3e, 0xcad2d81a, 0xc9c1c809, 0xcdf1fc3d, - 0x00303030, 0x85919415, 0x45616425, 0x0c303c3c, 0x86b2b436, 0xc4e0e424, 0x8bb3b83b, 0x4c707c3c, - 0x0e020c0e, 0x40505010, 0x09313839, 0x06222426, 0x02323032, 0x84808404, 0x49616829, 0x83939013, - 0x07333437, 0xc7e3e427, 0x04202424, 0x84a0a424, 0xcbc3c80b, 0x43535013, 0x0a02080a, 0x87838407, - 0xc9d1d819, 0x4c404c0c, 0x83838003, 0x8f838c0f, 0xcec2cc0e, 0x0b33383b, 0x4a42480a, 0x87b3b437 - }; - - - private static final int[] KC = - { - 0x9e3779b9, 0x3c6ef373, 0x78dde6e6, 0xf1bbcdcc, - 0xe3779b99, 0xc6ef3733, 0x8dde6e67, 0x1bbcdccf, - 0x3779b99e, 0x6ef3733c, 0xdde6e678, 0xbbcdccf1, - 0x779b99e3, 0xef3733c6, 0xde6e678d, 0xbcdccf1b - }; - - private int[] wKey; - private boolean forEncryption; - - public void init(boolean forEncryption, CipherParameters params) throws IllegalArgumentException - { - this.forEncryption = forEncryption; - wKey = createWorkingKey(((KeyParameter)params).getKey()); - } - - public String getAlgorithmName() - { - return "SEED"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock(byte[] in, int inOff, byte[] out, int outOff) throws DataLengthException, IllegalStateException - { - if (wKey == null) - { - throw new IllegalStateException("SEED engine not initialised"); - } - - if (inOff + BLOCK_SIZE > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if (outOff + BLOCK_SIZE > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - long l = bytesToLong(in, inOff + 0); - long r = bytesToLong(in, inOff + 8); - - if (forEncryption) - { - for (int i = 0; i < 16; i++) - { - long nl = r; - - r = l ^ F(wKey[2 * i], wKey[(2 * i) + 1], r); - l = nl; - } - } - else - { - for (int i = 15; i >= 0; i--) - { - long nl = r; - - r = l ^ F(wKey[2 * i], wKey[(2 * i) + 1], r); - l = nl; - } - } - - longToBytes(out, outOff + 0, r); - longToBytes(out, outOff + 8, l); - - return BLOCK_SIZE; - } - - public void reset() - { - } - - private int[] createWorkingKey(byte[] inKey) - { - int[] key = new int[32]; - long lower = bytesToLong(inKey, 0); - long upper = bytesToLong(inKey, 8); - - int key0 = extractW0(lower); - int key1 = extractW1(lower); - int key2 = extractW0(upper); - int key3 = extractW1(upper); - - for (int i = 0; i < 16; i++) - { - key[2 * i] = G(key0 + key2 - KC[i]); - key[2 * i + 1] = G(key1 - key3 + KC[i]); - - if (i % 2 == 0) - { - lower = rotateRight8(lower); - key0 = extractW0(lower); - key1 = extractW1(lower); - } - else - { - upper = rotateLeft8(upper); - key2 = extractW0(upper); - key3 = extractW1(upper); - } - } - - return key; - } - - private int extractW1(long lVal) - { - return (int)lVal; - } - - private int extractW0(long lVal) - { - return (int)(lVal >> 32); - } - - private long rotateLeft8(long x) - { - return (x << 8) | (x >>> 56); - } - - private long rotateRight8(long x) - { - return (x >>> 8) | (x << 56); - } - - private long bytesToLong( - byte[] src, - int srcOff) - { - long word = 0; - - for (int i = 0; i <= 7; i++) - { - word = (word << 8) + (src[i + srcOff] & 0xff); - } - - return word; - } - - private void longToBytes( - byte[] dest, - int destOff, - long value) - { - for (int i = 0; i < 8; i++) - { - dest[i + destOff] = (byte)(value >> ((7 - i) * 8)); - } - } - - private int G(int x) - { - return SS0[x & 0xff] ^ SS1[(x >> 8) & 0xff] ^ SS2[(x >> 16) & 0xff] ^ SS3[(x >> 24) & 0xff]; - } - - private long F(int ki0, int ki1, long r) - { - int r0 = (int)(r >> 32); - int r1 = (int)r; - int rd1 = phaseCalc2(r0, ki0, r1, ki1); - int rd0 = rd1 + phaseCalc1(r0, ki0, r1, ki1); - - return ((long)rd0 << 32) | (rd1 & 0xffffffffL); - } - - private int phaseCalc1(int r0, int ki0, int r1, int ki1) - { - return G(G((r0 ^ ki0) ^ (r1 ^ ki1)) + (r0 ^ ki0)); - } - - private int phaseCalc2(int r0, int ki0, int r1, int ki1) - { - return G(phaseCalc1(r0, ki0, r1, ki1) + G((r0 ^ ki0) ^ (r1 ^ ki1))); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDWrapEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDWrapEngine.java deleted file mode 100644 index 3b3adb9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SEEDWrapEngine.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.crypto.engines; - -/** - * An implementation of the SEED key wrapper based on RFC 4010/RFC 3394. - *

    - * For further details see: http://www.ietf.org/rfc/rfc4010.txt. - */ -public class SEEDWrapEngine - extends RFC3394WrapEngine -{ - public SEEDWrapEngine() - { - super(new SEEDEngine()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Salsa20Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Salsa20Engine.java deleted file mode 100644 index ef3143f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/Salsa20Engine.java +++ /dev/null @@ -1,320 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.MaxBytesExceededException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.util.Pack; -import org.bc.util.Strings; - -/** - * Implementation of Daniel J. Bernstein's Salsa20 stream cipher, Snuffle 2005 - */ - -public class Salsa20Engine - implements StreamCipher -{ - /** Constants */ - private final static int STATE_SIZE = 16; // 16, 32 bit ints = 64 bytes - - private final static byte[] - sigma = Strings.toByteArray("expand 32-byte k"), - tau = Strings.toByteArray("expand 16-byte k"); - - /* - * variables to hold the state of the engine - * during encryption and decryption - */ - private int index = 0; - private int[] engineState = new int[STATE_SIZE]; // state - private int[] x = new int[STATE_SIZE] ; // internal buffer - private byte[] keyStream = new byte[STATE_SIZE * 4], // expanded state, 64 bytes - workingKey = null, - workingIV = null; - private boolean initialised = false; - - /* - * internal counter - */ - private int cW0, cW1, cW2; - - /** - * initialise a Salsa20 cipher. - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - /* - * Salsa20 encryption and decryption is completely - * symmetrical, so the 'forEncryption' is - * irrelevant. (Like 90% of stream ciphers) - */ - - if (!(params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException("Salsa20 Init parameters must include an IV"); - } - - ParametersWithIV ivParams = (ParametersWithIV) params; - - byte[] iv = ivParams.getIV(); - - if (iv == null || iv.length != 8) - { - throw new IllegalArgumentException("Salsa20 requires exactly 8 bytes of IV"); - } - - if (!(ivParams.getParameters() instanceof KeyParameter)) - { - throw new IllegalArgumentException("Salsa20 Init parameters must include a key"); - } - - KeyParameter key = (KeyParameter) ivParams.getParameters(); - - workingKey = key.getKey(); - workingIV = iv; - - setKey(workingKey, workingIV); - } - - public String getAlgorithmName() - { - return "Salsa20"; - } - - public byte returnByte(byte in) - { - if (limitExceeded()) - { - throw new MaxBytesExceededException("2^70 byte limit per IV; Change IV"); - } - - if (index == 0) - { - generateKeyStream(keyStream); - - if (++engineState[8] == 0) - { - ++engineState[9]; - } - } - - byte out = (byte)(keyStream[index]^in); - index = (index + 1) & 63; - - return out; - } - - public void processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - { - if (!initialised) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (limitExceeded(len)) - { - throw new MaxBytesExceededException("2^70 byte limit per IV would be exceeded; Change IV"); - } - - for (int i = 0; i < len; i++) - { - if (index == 0) - { - generateKeyStream(keyStream); - - if (++engineState[8] == 0) - { - ++engineState[9]; - } - } - - out[i+outOff] = (byte)(keyStream[index]^in[i+inOff]); - index = (index + 1) & 63; - } - } - - public void reset() - { - setKey(workingKey, workingIV); - } - - // Private implementation - - private void setKey(byte[] keyBytes, byte[] ivBytes) - { - workingKey = keyBytes; - workingIV = ivBytes; - - index = 0; - resetCounter(); - int offset = 0; - byte[] constants; - - // Key - engineState[1] = Pack.littleEndianToInt(workingKey, 0); - engineState[2] = Pack.littleEndianToInt(workingKey, 4); - engineState[3] = Pack.littleEndianToInt(workingKey, 8); - engineState[4] = Pack.littleEndianToInt(workingKey, 12); - - if (workingKey.length == 32) - { - constants = sigma; - offset = 16; - } - else - { - constants = tau; - } - - engineState[11] = Pack.littleEndianToInt(workingKey, offset); - engineState[12] = Pack.littleEndianToInt(workingKey, offset+4); - engineState[13] = Pack.littleEndianToInt(workingKey, offset+8); - engineState[14] = Pack.littleEndianToInt(workingKey, offset+12); - engineState[0 ] = Pack.littleEndianToInt(constants, 0); - engineState[5 ] = Pack.littleEndianToInt(constants, 4); - engineState[10] = Pack.littleEndianToInt(constants, 8); - engineState[15] = Pack.littleEndianToInt(constants, 12); - - // IV - engineState[6] = Pack.littleEndianToInt(workingIV, 0); - engineState[7] = Pack.littleEndianToInt(workingIV, 4); - engineState[8] = engineState[9] = 0; - - initialised = true; - } - - private void generateKeyStream(byte[] output) - { - salsaCore(20, engineState, x); - Pack.intToLittleEndian(x, output, 0); - } - - /** - * Salsa20 function - * - * @param input input data - * - * @return keystream - */ - public static void salsaCore(int rounds, int[] input, int[] x) - { - // TODO Exception if rounds odd? - - System.arraycopy(input, 0, x, 0, input.length); - - for (int i = rounds; i > 0; i -= 2) - { - x[ 4] ^= rotl((x[ 0]+x[12]), 7); - x[ 8] ^= rotl((x[ 4]+x[ 0]), 9); - x[12] ^= rotl((x[ 8]+x[ 4]),13); - x[ 0] ^= rotl((x[12]+x[ 8]),18); - x[ 9] ^= rotl((x[ 5]+x[ 1]), 7); - x[13] ^= rotl((x[ 9]+x[ 5]), 9); - x[ 1] ^= rotl((x[13]+x[ 9]),13); - x[ 5] ^= rotl((x[ 1]+x[13]),18); - x[14] ^= rotl((x[10]+x[ 6]), 7); - x[ 2] ^= rotl((x[14]+x[10]), 9); - x[ 6] ^= rotl((x[ 2]+x[14]),13); - x[10] ^= rotl((x[ 6]+x[ 2]),18); - x[ 3] ^= rotl((x[15]+x[11]), 7); - x[ 7] ^= rotl((x[ 3]+x[15]), 9); - x[11] ^= rotl((x[ 7]+x[ 3]),13); - x[15] ^= rotl((x[11]+x[ 7]),18); - x[ 1] ^= rotl((x[ 0]+x[ 3]), 7); - x[ 2] ^= rotl((x[ 1]+x[ 0]), 9); - x[ 3] ^= rotl((x[ 2]+x[ 1]),13); - x[ 0] ^= rotl((x[ 3]+x[ 2]),18); - x[ 6] ^= rotl((x[ 5]+x[ 4]), 7); - x[ 7] ^= rotl((x[ 6]+x[ 5]), 9); - x[ 4] ^= rotl((x[ 7]+x[ 6]),13); - x[ 5] ^= rotl((x[ 4]+x[ 7]),18); - x[11] ^= rotl((x[10]+x[ 9]), 7); - x[ 8] ^= rotl((x[11]+x[10]), 9); - x[ 9] ^= rotl((x[ 8]+x[11]),13); - x[10] ^= rotl((x[ 9]+x[ 8]),18); - x[12] ^= rotl((x[15]+x[14]), 7); - x[13] ^= rotl((x[12]+x[15]), 9); - x[14] ^= rotl((x[13]+x[12]),13); - x[15] ^= rotl((x[14]+x[13]),18); - } - - for (int i = 0; i < STATE_SIZE; ++i) - { - x[i] += input[i]; - } - } - - /** - * Rotate left - * - * @param x value to rotate - * @param y amount to rotate x - * - * @return rotated x - */ - private static int rotl(int x, int y) - { - return (x << y) | (x >>> -y); - } - - private void resetCounter() - { - cW0 = 0; - cW1 = 0; - cW2 = 0; - } - - private boolean limitExceeded() - { - if (++cW0 == 0) - { - if (++cW1 == 0) - { - return (++cW2 & 0x20) != 0; // 2^(32 + 32 + 6) - } - } - - return false; - } - - /* - * this relies on the fact len will always be positive. - */ - private boolean limitExceeded(int len) - { - cW0 += len; - if (cW0 < len && cW0 >= 0) - { - if (++cW1 == 0) - { - return (++cW2 & 0x20) != 0; // 2^(32 + 32 + 6) - } - } - - return false; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SerpentEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SerpentEngine.java deleted file mode 100644 index d38d076..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SerpentEngine.java +++ /dev/null @@ -1,782 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * Serpent is a 128-bit 32-round block cipher with variable key lengths, - * including 128, 192 and 256 bit keys conjectured to be at least as - * secure as three-key triple-DES. - *

    - * Serpent was designed by Ross Anderson, Eli Biham and Lars Knudsen as a - * candidate algorithm for the NIST AES Quest.> - *

    - * For full details see the The Serpent home page - */ -public class SerpentEngine - implements BlockCipher -{ - private static final int BLOCK_SIZE = 16; - - static final int ROUNDS = 32; - static final int PHI = 0x9E3779B9; // (sqrt(5) - 1) * 2**31 - - private boolean encrypting; - private int[] wKey; - - private int X0, X1, X2, X3; // registers - - /** - * initialise a Serpent cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - this.encrypting = encrypting; - this.wKey = makeWorkingKey(((KeyParameter)params).getKey()); - return; - } - - throw new IllegalArgumentException("invalid parameter passed to Serpent init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "Serpent"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public final int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (wKey == null) - { - throw new IllegalStateException("Serpent not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (encrypting) - { - encryptBlock(in, inOff, out, outOff); - } - else - { - decryptBlock(in, inOff, out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - /** - * Expand a user-supplied key material into a session key. - * - * @param key The user-key bytes (multiples of 4) to use. - * @exception IllegalArgumentException - */ - private int[] makeWorkingKey( - byte[] key) - throws IllegalArgumentException - { - // - // pad key to 256 bits - // - int[] kPad = new int[16]; - int off = 0; - int length = 0; - - for (off = key.length - 4; off > 0; off -= 4) - { - kPad[length++] = bytesToWord(key, off); - } - - if (off == 0) - { - kPad[length++] = bytesToWord(key, 0); - if (length < 8) - { - kPad[length] = 1; - } - } - else - { - throw new IllegalArgumentException("key must be a multiple of 4 bytes"); - } - - // - // expand the padded key up to 33 x 128 bits of key material - // - int amount = (ROUNDS + 1) * 4; - int[] w = new int[amount]; - - // - // compute w0 to w7 from w-8 to w-1 - // - for (int i = 8; i < 16; i++) - { - kPad[i] = rotateLeft(kPad[i - 8] ^ kPad[i - 5] ^ kPad[i - 3] ^ kPad[i - 1] ^ PHI ^ (i - 8), 11); - } - - System.arraycopy(kPad, 8, w, 0, 8); - - // - // compute w8 to w136 - // - for (int i = 8; i < amount; i++) - { - w[i] = rotateLeft(w[i - 8] ^ w[i - 5] ^ w[i - 3] ^ w[i - 1] ^ PHI ^ i, 11); - } - - // - // create the working keys by processing w with the Sbox and IP - // - sb3(w[0], w[1], w[2], w[3]); - w[0] = X0; w[1] = X1; w[2] = X2; w[3] = X3; - sb2(w[4], w[5], w[6], w[7]); - w[4] = X0; w[5] = X1; w[6] = X2; w[7] = X3; - sb1(w[8], w[9], w[10], w[11]); - w[8] = X0; w[9] = X1; w[10] = X2; w[11] = X3; - sb0(w[12], w[13], w[14], w[15]); - w[12] = X0; w[13] = X1; w[14] = X2; w[15] = X3; - sb7(w[16], w[17], w[18], w[19]); - w[16] = X0; w[17] = X1; w[18] = X2; w[19] = X3; - sb6(w[20], w[21], w[22], w[23]); - w[20] = X0; w[21] = X1; w[22] = X2; w[23] = X3; - sb5(w[24], w[25], w[26], w[27]); - w[24] = X0; w[25] = X1; w[26] = X2; w[27] = X3; - sb4(w[28], w[29], w[30], w[31]); - w[28] = X0; w[29] = X1; w[30] = X2; w[31] = X3; - sb3(w[32], w[33], w[34], w[35]); - w[32] = X0; w[33] = X1; w[34] = X2; w[35] = X3; - sb2(w[36], w[37], w[38], w[39]); - w[36] = X0; w[37] = X1; w[38] = X2; w[39] = X3; - sb1(w[40], w[41], w[42], w[43]); - w[40] = X0; w[41] = X1; w[42] = X2; w[43] = X3; - sb0(w[44], w[45], w[46], w[47]); - w[44] = X0; w[45] = X1; w[46] = X2; w[47] = X3; - sb7(w[48], w[49], w[50], w[51]); - w[48] = X0; w[49] = X1; w[50] = X2; w[51] = X3; - sb6(w[52], w[53], w[54], w[55]); - w[52] = X0; w[53] = X1; w[54] = X2; w[55] = X3; - sb5(w[56], w[57], w[58], w[59]); - w[56] = X0; w[57] = X1; w[58] = X2; w[59] = X3; - sb4(w[60], w[61], w[62], w[63]); - w[60] = X0; w[61] = X1; w[62] = X2; w[63] = X3; - sb3(w[64], w[65], w[66], w[67]); - w[64] = X0; w[65] = X1; w[66] = X2; w[67] = X3; - sb2(w[68], w[69], w[70], w[71]); - w[68] = X0; w[69] = X1; w[70] = X2; w[71] = X3; - sb1(w[72], w[73], w[74], w[75]); - w[72] = X0; w[73] = X1; w[74] = X2; w[75] = X3; - sb0(w[76], w[77], w[78], w[79]); - w[76] = X0; w[77] = X1; w[78] = X2; w[79] = X3; - sb7(w[80], w[81], w[82], w[83]); - w[80] = X0; w[81] = X1; w[82] = X2; w[83] = X3; - sb6(w[84], w[85], w[86], w[87]); - w[84] = X0; w[85] = X1; w[86] = X2; w[87] = X3; - sb5(w[88], w[89], w[90], w[91]); - w[88] = X0; w[89] = X1; w[90] = X2; w[91] = X3; - sb4(w[92], w[93], w[94], w[95]); - w[92] = X0; w[93] = X1; w[94] = X2; w[95] = X3; - sb3(w[96], w[97], w[98], w[99]); - w[96] = X0; w[97] = X1; w[98] = X2; w[99] = X3; - sb2(w[100], w[101], w[102], w[103]); - w[100] = X0; w[101] = X1; w[102] = X2; w[103] = X3; - sb1(w[104], w[105], w[106], w[107]); - w[104] = X0; w[105] = X1; w[106] = X2; w[107] = X3; - sb0(w[108], w[109], w[110], w[111]); - w[108] = X0; w[109] = X1; w[110] = X2; w[111] = X3; - sb7(w[112], w[113], w[114], w[115]); - w[112] = X0; w[113] = X1; w[114] = X2; w[115] = X3; - sb6(w[116], w[117], w[118], w[119]); - w[116] = X0; w[117] = X1; w[118] = X2; w[119] = X3; - sb5(w[120], w[121], w[122], w[123]); - w[120] = X0; w[121] = X1; w[122] = X2; w[123] = X3; - sb4(w[124], w[125], w[126], w[127]); - w[124] = X0; w[125] = X1; w[126] = X2; w[127] = X3; - sb3(w[128], w[129], w[130], w[131]); - w[128] = X0; w[129] = X1; w[130] = X2; w[131] = X3; - - return w; - } - - private int rotateLeft( - int x, - int bits) - { - return (x << bits) | (x >>> -bits); - } - - private int rotateRight( - int x, - int bits) - { - return (x >>> bits) | (x << -bits); - } - - private int bytesToWord( - byte[] src, - int srcOff) - { - return (((src[srcOff] & 0xff) << 24) | ((src[srcOff + 1] & 0xff) << 16) | - ((src[srcOff + 2] & 0xff) << 8) | ((src[srcOff + 3] & 0xff))); - } - - private void wordToBytes( - int word, - byte[] dst, - int dstOff) - { - dst[dstOff + 3] = (byte)(word); - dst[dstOff + 2] = (byte)(word >>> 8); - dst[dstOff + 1] = (byte)(word >>> 16); - dst[dstOff] = (byte)(word >>> 24); - } - - /** - * Encrypt one block of plaintext. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - */ - private void encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - X3 = bytesToWord(in, inOff); - X2 = bytesToWord(in, inOff + 4); - X1 = bytesToWord(in, inOff + 8); - X0 = bytesToWord(in, inOff + 12); - - sb0(wKey[0] ^ X0, wKey[1] ^ X1, wKey[2] ^ X2, wKey[3] ^ X3); LT(); - sb1(wKey[4] ^ X0, wKey[5] ^ X1, wKey[6] ^ X2, wKey[7] ^ X3); LT(); - sb2(wKey[8] ^ X0, wKey[9] ^ X1, wKey[10] ^ X2, wKey[11] ^ X3); LT(); - sb3(wKey[12] ^ X0, wKey[13] ^ X1, wKey[14] ^ X2, wKey[15] ^ X3); LT(); - sb4(wKey[16] ^ X0, wKey[17] ^ X1, wKey[18] ^ X2, wKey[19] ^ X3); LT(); - sb5(wKey[20] ^ X0, wKey[21] ^ X1, wKey[22] ^ X2, wKey[23] ^ X3); LT(); - sb6(wKey[24] ^ X0, wKey[25] ^ X1, wKey[26] ^ X2, wKey[27] ^ X3); LT(); - sb7(wKey[28] ^ X0, wKey[29] ^ X1, wKey[30] ^ X2, wKey[31] ^ X3); LT(); - sb0(wKey[32] ^ X0, wKey[33] ^ X1, wKey[34] ^ X2, wKey[35] ^ X3); LT(); - sb1(wKey[36] ^ X0, wKey[37] ^ X1, wKey[38] ^ X2, wKey[39] ^ X3); LT(); - sb2(wKey[40] ^ X0, wKey[41] ^ X1, wKey[42] ^ X2, wKey[43] ^ X3); LT(); - sb3(wKey[44] ^ X0, wKey[45] ^ X1, wKey[46] ^ X2, wKey[47] ^ X3); LT(); - sb4(wKey[48] ^ X0, wKey[49] ^ X1, wKey[50] ^ X2, wKey[51] ^ X3); LT(); - sb5(wKey[52] ^ X0, wKey[53] ^ X1, wKey[54] ^ X2, wKey[55] ^ X3); LT(); - sb6(wKey[56] ^ X0, wKey[57] ^ X1, wKey[58] ^ X2, wKey[59] ^ X3); LT(); - sb7(wKey[60] ^ X0, wKey[61] ^ X1, wKey[62] ^ X2, wKey[63] ^ X3); LT(); - sb0(wKey[64] ^ X0, wKey[65] ^ X1, wKey[66] ^ X2, wKey[67] ^ X3); LT(); - sb1(wKey[68] ^ X0, wKey[69] ^ X1, wKey[70] ^ X2, wKey[71] ^ X3); LT(); - sb2(wKey[72] ^ X0, wKey[73] ^ X1, wKey[74] ^ X2, wKey[75] ^ X3); LT(); - sb3(wKey[76] ^ X0, wKey[77] ^ X1, wKey[78] ^ X2, wKey[79] ^ X3); LT(); - sb4(wKey[80] ^ X0, wKey[81] ^ X1, wKey[82] ^ X2, wKey[83] ^ X3); LT(); - sb5(wKey[84] ^ X0, wKey[85] ^ X1, wKey[86] ^ X2, wKey[87] ^ X3); LT(); - sb6(wKey[88] ^ X0, wKey[89] ^ X1, wKey[90] ^ X2, wKey[91] ^ X3); LT(); - sb7(wKey[92] ^ X0, wKey[93] ^ X1, wKey[94] ^ X2, wKey[95] ^ X3); LT(); - sb0(wKey[96] ^ X0, wKey[97] ^ X1, wKey[98] ^ X2, wKey[99] ^ X3); LT(); - sb1(wKey[100] ^ X0, wKey[101] ^ X1, wKey[102] ^ X2, wKey[103] ^ X3); LT(); - sb2(wKey[104] ^ X0, wKey[105] ^ X1, wKey[106] ^ X2, wKey[107] ^ X3); LT(); - sb3(wKey[108] ^ X0, wKey[109] ^ X1, wKey[110] ^ X2, wKey[111] ^ X3); LT(); - sb4(wKey[112] ^ X0, wKey[113] ^ X1, wKey[114] ^ X2, wKey[115] ^ X3); LT(); - sb5(wKey[116] ^ X0, wKey[117] ^ X1, wKey[118] ^ X2, wKey[119] ^ X3); LT(); - sb6(wKey[120] ^ X0, wKey[121] ^ X1, wKey[122] ^ X2, wKey[123] ^ X3); LT(); - sb7(wKey[124] ^ X0, wKey[125] ^ X1, wKey[126] ^ X2, wKey[127] ^ X3); - - wordToBytes(wKey[131] ^ X3, out, outOff); - wordToBytes(wKey[130] ^ X2, out, outOff + 4); - wordToBytes(wKey[129] ^ X1, out, outOff + 8); - wordToBytes(wKey[128] ^ X0, out, outOff + 12); - } - - /** - * Decrypt one block of ciphertext. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - */ - private void decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - X3 = wKey[131] ^ bytesToWord(in, inOff); - X2 = wKey[130] ^ bytesToWord(in, inOff + 4); - X1 = wKey[129] ^ bytesToWord(in, inOff + 8); - X0 = wKey[128] ^ bytesToWord(in, inOff + 12); - - ib7(X0, X1, X2, X3); - X0 ^= wKey[124]; X1 ^= wKey[125]; X2 ^= wKey[126]; X3 ^= wKey[127]; - inverseLT(); ib6(X0, X1, X2, X3); - X0 ^= wKey[120]; X1 ^= wKey[121]; X2 ^= wKey[122]; X3 ^= wKey[123]; - inverseLT(); ib5(X0, X1, X2, X3); - X0 ^= wKey[116]; X1 ^= wKey[117]; X2 ^= wKey[118]; X3 ^= wKey[119]; - inverseLT(); ib4(X0, X1, X2, X3); - X0 ^= wKey[112]; X1 ^= wKey[113]; X2 ^= wKey[114]; X3 ^= wKey[115]; - inverseLT(); ib3(X0, X1, X2, X3); - X0 ^= wKey[108]; X1 ^= wKey[109]; X2 ^= wKey[110]; X3 ^= wKey[111]; - inverseLT(); ib2(X0, X1, X2, X3); - X0 ^= wKey[104]; X1 ^= wKey[105]; X2 ^= wKey[106]; X3 ^= wKey[107]; - inverseLT(); ib1(X0, X1, X2, X3); - X0 ^= wKey[100]; X1 ^= wKey[101]; X2 ^= wKey[102]; X3 ^= wKey[103]; - inverseLT(); ib0(X0, X1, X2, X3); - X0 ^= wKey[96]; X1 ^= wKey[97]; X2 ^= wKey[98]; X3 ^= wKey[99]; - inverseLT(); ib7(X0, X1, X2, X3); - X0 ^= wKey[92]; X1 ^= wKey[93]; X2 ^= wKey[94]; X3 ^= wKey[95]; - inverseLT(); ib6(X0, X1, X2, X3); - X0 ^= wKey[88]; X1 ^= wKey[89]; X2 ^= wKey[90]; X3 ^= wKey[91]; - inverseLT(); ib5(X0, X1, X2, X3); - X0 ^= wKey[84]; X1 ^= wKey[85]; X2 ^= wKey[86]; X3 ^= wKey[87]; - inverseLT(); ib4(X0, X1, X2, X3); - X0 ^= wKey[80]; X1 ^= wKey[81]; X2 ^= wKey[82]; X3 ^= wKey[83]; - inverseLT(); ib3(X0, X1, X2, X3); - X0 ^= wKey[76]; X1 ^= wKey[77]; X2 ^= wKey[78]; X3 ^= wKey[79]; - inverseLT(); ib2(X0, X1, X2, X3); - X0 ^= wKey[72]; X1 ^= wKey[73]; X2 ^= wKey[74]; X3 ^= wKey[75]; - inverseLT(); ib1(X0, X1, X2, X3); - X0 ^= wKey[68]; X1 ^= wKey[69]; X2 ^= wKey[70]; X3 ^= wKey[71]; - inverseLT(); ib0(X0, X1, X2, X3); - X0 ^= wKey[64]; X1 ^= wKey[65]; X2 ^= wKey[66]; X3 ^= wKey[67]; - inverseLT(); ib7(X0, X1, X2, X3); - X0 ^= wKey[60]; X1 ^= wKey[61]; X2 ^= wKey[62]; X3 ^= wKey[63]; - inverseLT(); ib6(X0, X1, X2, X3); - X0 ^= wKey[56]; X1 ^= wKey[57]; X2 ^= wKey[58]; X3 ^= wKey[59]; - inverseLT(); ib5(X0, X1, X2, X3); - X0 ^= wKey[52]; X1 ^= wKey[53]; X2 ^= wKey[54]; X3 ^= wKey[55]; - inverseLT(); ib4(X0, X1, X2, X3); - X0 ^= wKey[48]; X1 ^= wKey[49]; X2 ^= wKey[50]; X3 ^= wKey[51]; - inverseLT(); ib3(X0, X1, X2, X3); - X0 ^= wKey[44]; X1 ^= wKey[45]; X2 ^= wKey[46]; X3 ^= wKey[47]; - inverseLT(); ib2(X0, X1, X2, X3); - X0 ^= wKey[40]; X1 ^= wKey[41]; X2 ^= wKey[42]; X3 ^= wKey[43]; - inverseLT(); ib1(X0, X1, X2, X3); - X0 ^= wKey[36]; X1 ^= wKey[37]; X2 ^= wKey[38]; X3 ^= wKey[39]; - inverseLT(); ib0(X0, X1, X2, X3); - X0 ^= wKey[32]; X1 ^= wKey[33]; X2 ^= wKey[34]; X3 ^= wKey[35]; - inverseLT(); ib7(X0, X1, X2, X3); - X0 ^= wKey[28]; X1 ^= wKey[29]; X2 ^= wKey[30]; X3 ^= wKey[31]; - inverseLT(); ib6(X0, X1, X2, X3); - X0 ^= wKey[24]; X1 ^= wKey[25]; X2 ^= wKey[26]; X3 ^= wKey[27]; - inverseLT(); ib5(X0, X1, X2, X3); - X0 ^= wKey[20]; X1 ^= wKey[21]; X2 ^= wKey[22]; X3 ^= wKey[23]; - inverseLT(); ib4(X0, X1, X2, X3); - X0 ^= wKey[16]; X1 ^= wKey[17]; X2 ^= wKey[18]; X3 ^= wKey[19]; - inverseLT(); ib3(X0, X1, X2, X3); - X0 ^= wKey[12]; X1 ^= wKey[13]; X2 ^= wKey[14]; X3 ^= wKey[15]; - inverseLT(); ib2(X0, X1, X2, X3); - X0 ^= wKey[8]; X1 ^= wKey[9]; X2 ^= wKey[10]; X3 ^= wKey[11]; - inverseLT(); ib1(X0, X1, X2, X3); - X0 ^= wKey[4]; X1 ^= wKey[5]; X2 ^= wKey[6]; X3 ^= wKey[7]; - inverseLT(); ib0(X0, X1, X2, X3); - - wordToBytes(X3 ^ wKey[3], out, outOff); - wordToBytes(X2 ^ wKey[2], out, outOff + 4); - wordToBytes(X1 ^ wKey[1], out, outOff + 8); - wordToBytes(X0 ^ wKey[0], out, outOff + 12); - } - - /** - * The sboxes below are based on the work of Brian Gladman and - * Sam Simpson, whose original notice appears below. - *

    - * For further details see: - * http://fp.gladman.plus.com/cryptography_technology/serpent/ - */ - - /* Partially optimised Serpent S Box boolean functions derived */ - /* using a recursive descent analyser but without a full search */ - /* of all subtrees. This set of S boxes is the result of work */ - /* by Sam Simpson and Brian Gladman using the spare time on a */ - /* cluster of high capacity servers to search for S boxes with */ - /* this customised search engine. There are now an average of */ - /* 15.375 terms per S box. */ - /* */ - /* Copyright: Dr B. R Gladman (gladman@seven77.demon.co.uk) */ - /* and Sam Simpson (s.simpson@mia.co.uk) */ - /* 17th December 1998 */ - /* */ - /* We hereby give permission for information in this file to be */ - /* used freely subject only to acknowledgement of its origin. */ - - /** - * S0 - { 3, 8,15, 1,10, 6, 5,11,14,13, 4, 2, 7, 0, 9,12 } - 15 terms. - */ - private void sb0(int a, int b, int c, int d) - { - int t1 = a ^ d; - int t3 = c ^ t1; - int t4 = b ^ t3; - X3 = (a & d) ^ t4; - int t7 = a ^ (b & t1); - X2 = t4 ^ (c | t7); - int t12 = X3 & (t3 ^ t7); - X1 = (~t3) ^ t12; - X0 = t12 ^ (~t7); - } - - /** - * InvSO - {13, 3,11, 0,10, 6, 5,12, 1,14, 4, 7,15, 9, 8, 2 } - 15 terms. - */ - private void ib0(int a, int b, int c, int d) - { - int t1 = ~a; - int t2 = a ^ b; - int t4 = d ^ (t1 | t2); - int t5 = c ^ t4; - X2 = t2 ^ t5; - int t8 = t1 ^ (d & t2); - X1 = t4 ^ (X2 & t8); - X3 = (a & t4) ^ (t5 | X1); - X0 = X3 ^ (t5 ^ t8); - } - - /** - * S1 - {15,12, 2, 7, 9, 0, 5,10, 1,11,14, 8, 6,13, 3, 4 } - 14 terms. - */ - private void sb1(int a, int b, int c, int d) - { - int t2 = b ^ (~a); - int t5 = c ^ (a | t2); - X2 = d ^ t5; - int t7 = b ^ (d | t2); - int t8 = t2 ^ X2; - X3 = t8 ^ (t5 & t7); - int t11 = t5 ^ t7; - X1 = X3 ^ t11; - X0 = t5 ^ (t8 & t11); - } - - /** - * InvS1 - { 5, 8, 2,14,15, 6,12, 3,11, 4, 7, 9, 1,13,10, 0 } - 14 steps. - */ - private void ib1(int a, int b, int c, int d) - { - int t1 = b ^ d; - int t3 = a ^ (b & t1); - int t4 = t1 ^ t3; - X3 = c ^ t4; - int t7 = b ^ (t1 & t3); - int t8 = X3 | t7; - X1 = t3 ^ t8; - int t10 = ~X1; - int t11 = X3 ^ t7; - X0 = t10 ^ t11; - X2 = t4 ^ (t10 | t11); - } - - /** - * S2 - { 8, 6, 7, 9, 3,12,10,15,13, 1,14, 4, 0,11, 5, 2 } - 16 terms. - */ - private void sb2(int a, int b, int c, int d) - { - int t1 = ~a; - int t2 = b ^ d; - int t3 = c & t1; - X0 = t2 ^ t3; - int t5 = c ^ t1; - int t6 = c ^ X0; - int t7 = b & t6; - X3 = t5 ^ t7; - X2 = a ^ ((d | t7) & (X0 | t5)); - X1 = (t2 ^ X3) ^ (X2 ^ (d | t1)); - } - - /** - * InvS2 - {12, 9,15, 4,11,14, 1, 2, 0, 3, 6,13, 5, 8,10, 7 } - 16 steps. - */ - private void ib2(int a, int b, int c, int d) - { - int t1 = b ^ d; - int t2 = ~t1; - int t3 = a ^ c; - int t4 = c ^ t1; - int t5 = b & t4; - X0 = t3 ^ t5; - int t7 = a | t2; - int t8 = d ^ t7; - int t9 = t3 | t8; - X3 = t1 ^ t9; - int t11 = ~t4; - int t12 = X0 | X3; - X1 = t11 ^ t12; - X2 = (d & t11) ^ (t3 ^ t12); - } - - /** - * S3 - { 0,15,11, 8,12, 9, 6, 3,13, 1, 2, 4,10, 7, 5,14 } - 16 terms. - */ - private void sb3(int a, int b, int c, int d) - { - int t1 = a ^ b; - int t2 = a & c; - int t3 = a | d; - int t4 = c ^ d; - int t5 = t1 & t3; - int t6 = t2 | t5; - X2 = t4 ^ t6; - int t8 = b ^ t3; - int t9 = t6 ^ t8; - int t10 = t4 & t9; - X0 = t1 ^ t10; - int t12 = X2 & X0; - X1 = t9 ^ t12; - X3 = (b | d) ^ (t4 ^ t12); - } - - /** - * InvS3 - { 0, 9,10, 7,11,14, 6,13, 3, 5,12, 2, 4, 8,15, 1 } - 15 terms - */ - private void ib3(int a, int b, int c, int d) - { - int t1 = a | b; - int t2 = b ^ c; - int t3 = b & t2; - int t4 = a ^ t3; - int t5 = c ^ t4; - int t6 = d | t4; - X0 = t2 ^ t6; - int t8 = t2 | t6; - int t9 = d ^ t8; - X2 = t5 ^ t9; - int t11 = t1 ^ t9; - int t12 = X0 & t11; - X3 = t4 ^ t12; - X1 = X3 ^ (X0 ^ t11); - } - - /** - * S4 - { 1,15, 8, 3,12, 0,11, 6, 2, 5, 4,10, 9,14, 7,13 } - 15 terms. - */ - private void sb4(int a, int b, int c, int d) - { - int t1 = a ^ d; - int t2 = d & t1; - int t3 = c ^ t2; - int t4 = b | t3; - X3 = t1 ^ t4; - int t6 = ~b; - int t7 = t1 | t6; - X0 = t3 ^ t7; - int t9 = a & X0; - int t10 = t1 ^ t6; - int t11 = t4 & t10; - X2 = t9 ^ t11; - X1 = (a ^ t3) ^ (t10 & X2); - } - - /** - * InvS4 - { 5, 0, 8, 3,10, 9, 7,14, 2,12,11, 6, 4,15,13, 1 } - 15 terms. - */ - private void ib4(int a, int b, int c, int d) - { - int t1 = c | d; - int t2 = a & t1; - int t3 = b ^ t2; - int t4 = a & t3; - int t5 = c ^ t4; - X1 = d ^ t5; - int t7 = ~a; - int t8 = t5 & X1; - X3 = t3 ^ t8; - int t10 = X1 | t7; - int t11 = d ^ t10; - X0 = X3 ^ t11; - X2 = (t3 & t11) ^ (X1 ^ t7); - } - - /** - * S5 - {15, 5, 2,11, 4,10, 9,12, 0, 3,14, 8,13, 6, 7, 1 } - 16 terms. - */ - private void sb5(int a, int b, int c, int d) - { - int t1 = ~a; - int t2 = a ^ b; - int t3 = a ^ d; - int t4 = c ^ t1; - int t5 = t2 | t3; - X0 = t4 ^ t5; - int t7 = d & X0; - int t8 = t2 ^ X0; - X1 = t7 ^ t8; - int t10 = t1 | X0; - int t11 = t2 | t7; - int t12 = t3 ^ t10; - X2 = t11 ^ t12; - X3 = (b ^ t7) ^ (X1 & t12); - } - - /** - * InvS5 - { 8,15, 2, 9, 4, 1,13,14,11, 6, 5, 3, 7,12,10, 0 } - 16 terms. - */ - private void ib5(int a, int b, int c, int d) - { - int t1 = ~c; - int t2 = b & t1; - int t3 = d ^ t2; - int t4 = a & t3; - int t5 = b ^ t1; - X3 = t4 ^ t5; - int t7 = b | X3; - int t8 = a & t7; - X1 = t3 ^ t8; - int t10 = a | d; - int t11 = t1 ^ t7; - X0 = t10 ^ t11; - X2 = (b & t10) ^ (t4 | (a ^ c)); - } - - /** - * S6 - { 7, 2,12, 5, 8, 4, 6,11,14, 9, 1,15,13, 3,10, 0 } - 15 terms. - */ - private void sb6(int a, int b, int c, int d) - { - int t1 = ~a; - int t2 = a ^ d; - int t3 = b ^ t2; - int t4 = t1 | t2; - int t5 = c ^ t4; - X1 = b ^ t5; - int t7 = t2 | X1; - int t8 = d ^ t7; - int t9 = t5 & t8; - X2 = t3 ^ t9; - int t11 = t5 ^ t8; - X0 = X2 ^ t11; - X3 = (~t5) ^ (t3 & t11); - } - - /** - * InvS6 - {15,10, 1,13, 5, 3, 6, 0, 4, 9,14, 7, 2,12, 8,11 } - 15 terms. - */ - private void ib6(int a, int b, int c, int d) - { - int t1 = ~a; - int t2 = a ^ b; - int t3 = c ^ t2; - int t4 = c | t1; - int t5 = d ^ t4; - X1 = t3 ^ t5; - int t7 = t3 & t5; - int t8 = t2 ^ t7; - int t9 = b | t8; - X3 = t5 ^ t9; - int t11 = b | X3; - X0 = t8 ^ t11; - X2 = (d & t1) ^ (t3 ^ t11); - } - - /** - * S7 - { 1,13,15, 0,14, 8, 2,11, 7, 4,12,10, 9, 3, 5, 6 } - 16 terms. - */ - private void sb7(int a, int b, int c, int d) - { - int t1 = b ^ c; - int t2 = c & t1; - int t3 = d ^ t2; - int t4 = a ^ t3; - int t5 = d | t1; - int t6 = t4 & t5; - X1 = b ^ t6; - int t8 = t3 | X1; - int t9 = a & t4; - X3 = t1 ^ t9; - int t11 = t4 ^ t8; - int t12 = X3 & t11; - X2 = t3 ^ t12; - X0 = (~t11) ^ (X3 & X2); - } - - /** - * InvS7 - { 3, 0, 6,13, 9,14,15, 8, 5,12,11, 7,10, 1, 4, 2 } - 17 terms. - */ - private void ib7(int a, int b, int c, int d) - { - int t3 = c | (a & b); - int t4 = d & (a | b); - X3 = t3 ^ t4; - int t6 = ~d; - int t7 = b ^ t4; - int t9 = t7 | (X3 ^ t6); - X1 = a ^ t9; - X0 = (c ^ t7) ^ (d | X1); - X2 = (t3 ^ X1) ^ (X0 ^ (a & X3)); - } - - /** - * Apply the linear transformation to the register set. - */ - private void LT() - { - int x0 = rotateLeft(X0, 13); - int x2 = rotateLeft(X2, 3); - int x1 = X1 ^ x0 ^ x2 ; - int x3 = X3 ^ x2 ^ x0 << 3; - - X1 = rotateLeft(x1, 1); - X3 = rotateLeft(x3, 7); - X0 = rotateLeft(x0 ^ X1 ^ X3, 5); - X2 = rotateLeft(x2 ^ X3 ^ (X1 << 7), 22); - } - - /** - * Apply the inverse of the linear transformation to the register set. - */ - private void inverseLT() - { - int x2 = rotateRight(X2, 22) ^ X3 ^ (X1 << 7); - int x0 = rotateRight(X0, 5) ^ X1 ^ X3; - int x3 = rotateRight(X3, 7); - int x1 = rotateRight(X1, 1); - X3 = x3 ^ x2 ^ x0 << 3; - X1 = x1 ^ x0 ^ x2; - X2 = rotateRight(x2, 3); - X0 = rotateRight(x0, 13); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SkipjackEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SkipjackEngine.java deleted file mode 100644 index e2d669d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/SkipjackEngine.java +++ /dev/null @@ -1,259 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * a class that provides a basic SKIPJACK engine. - */ -public class SkipjackEngine - implements BlockCipher -{ - static final int BLOCK_SIZE = 8; - - static short ftable[] = - { - 0xa3, 0xd7, 0x09, 0x83, 0xf8, 0x48, 0xf6, 0xf4, 0xb3, 0x21, 0x15, 0x78, 0x99, 0xb1, 0xaf, 0xf9, - 0xe7, 0x2d, 0x4d, 0x8a, 0xce, 0x4c, 0xca, 0x2e, 0x52, 0x95, 0xd9, 0x1e, 0x4e, 0x38, 0x44, 0x28, - 0x0a, 0xdf, 0x02, 0xa0, 0x17, 0xf1, 0x60, 0x68, 0x12, 0xb7, 0x7a, 0xc3, 0xe9, 0xfa, 0x3d, 0x53, - 0x96, 0x84, 0x6b, 0xba, 0xf2, 0x63, 0x9a, 0x19, 0x7c, 0xae, 0xe5, 0xf5, 0xf7, 0x16, 0x6a, 0xa2, - 0x39, 0xb6, 0x7b, 0x0f, 0xc1, 0x93, 0x81, 0x1b, 0xee, 0xb4, 0x1a, 0xea, 0xd0, 0x91, 0x2f, 0xb8, - 0x55, 0xb9, 0xda, 0x85, 0x3f, 0x41, 0xbf, 0xe0, 0x5a, 0x58, 0x80, 0x5f, 0x66, 0x0b, 0xd8, 0x90, - 0x35, 0xd5, 0xc0, 0xa7, 0x33, 0x06, 0x65, 0x69, 0x45, 0x00, 0x94, 0x56, 0x6d, 0x98, 0x9b, 0x76, - 0x97, 0xfc, 0xb2, 0xc2, 0xb0, 0xfe, 0xdb, 0x20, 0xe1, 0xeb, 0xd6, 0xe4, 0xdd, 0x47, 0x4a, 0x1d, - 0x42, 0xed, 0x9e, 0x6e, 0x49, 0x3c, 0xcd, 0x43, 0x27, 0xd2, 0x07, 0xd4, 0xde, 0xc7, 0x67, 0x18, - 0x89, 0xcb, 0x30, 0x1f, 0x8d, 0xc6, 0x8f, 0xaa, 0xc8, 0x74, 0xdc, 0xc9, 0x5d, 0x5c, 0x31, 0xa4, - 0x70, 0x88, 0x61, 0x2c, 0x9f, 0x0d, 0x2b, 0x87, 0x50, 0x82, 0x54, 0x64, 0x26, 0x7d, 0x03, 0x40, - 0x34, 0x4b, 0x1c, 0x73, 0xd1, 0xc4, 0xfd, 0x3b, 0xcc, 0xfb, 0x7f, 0xab, 0xe6, 0x3e, 0x5b, 0xa5, - 0xad, 0x04, 0x23, 0x9c, 0x14, 0x51, 0x22, 0xf0, 0x29, 0x79, 0x71, 0x7e, 0xff, 0x8c, 0x0e, 0xe2, - 0x0c, 0xef, 0xbc, 0x72, 0x75, 0x6f, 0x37, 0xa1, 0xec, 0xd3, 0x8e, 0x62, 0x8b, 0x86, 0x10, 0xe8, - 0x08, 0x77, 0x11, 0xbe, 0x92, 0x4f, 0x24, 0xc5, 0x32, 0x36, 0x9d, 0xcf, 0xf3, 0xa6, 0xbb, 0xac, - 0x5e, 0x6c, 0xa9, 0x13, 0x57, 0x25, 0xb5, 0xe3, 0xbd, 0xa8, 0x3a, 0x01, 0x05, 0x59, 0x2a, 0x46 - }; - - private int[] key0, key1, key2, key3; - private boolean encrypting; - - /** - * initialise a SKIPJACK cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to SKIPJACK init - " + params.getClass().getName()); - } - - byte[] keyBytes = ((KeyParameter)params).getKey(); - - this.encrypting = encrypting; - this.key0 = new int[32]; - this.key1 = new int[32]; - this.key2 = new int[32]; - this.key3 = new int[32]; - - // - // expand the key to 128 bytes in 4 parts (saving us a modulo, multiply - // and an addition). - // - for (int i = 0; i < 32; i ++) - { - key0[i] = keyBytes[(i * 4) % 10] & 0xff; - key1[i] = keyBytes[(i * 4 + 1) % 10] & 0xff; - key2[i] = keyBytes[(i * 4 + 2) % 10] & 0xff; - key3[i] = keyBytes[(i * 4 + 3) % 10] & 0xff; - } - } - - public String getAlgorithmName() - { - return "SKIPJACK"; - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (key1 == null) - { - throw new IllegalStateException("SKIPJACK engine not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (encrypting) - { - encryptBlock(in, inOff, out, outOff); - } - else - { - decryptBlock(in, inOff, out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - } - - /** - * The G permutation - */ - private int g( - int k, - int w) - { - int g1, g2, g3, g4, g5, g6; - - g1 = (w >> 8) & 0xff; - g2 = w & 0xff; - - g3 = ftable[g2 ^ key0[k]] ^ g1; - g4 = ftable[g3 ^ key1[k]] ^ g2; - g5 = ftable[g4 ^ key2[k]] ^ g3; - g6 = ftable[g5 ^ key3[k]] ^ g4; - - return ((g5 << 8) + g6); - } - - public int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int w1 = (in[inOff + 0] << 8) + (in[inOff + 1] & 0xff); - int w2 = (in[inOff + 2] << 8) + (in[inOff + 3] & 0xff); - int w3 = (in[inOff + 4] << 8) + (in[inOff + 5] & 0xff); - int w4 = (in[inOff + 6] << 8) + (in[inOff + 7] & 0xff); - - int k = 0; - - for (int t = 0; t < 2; t++) - { - for(int i = 0; i < 8; i++) - { - int tmp = w4; - w4 = w3; - w3 = w2; - w2 = g(k, w1); - w1 = w2 ^ tmp ^ (k + 1); - k++; - } - - for(int i = 0; i < 8; i++) - { - int tmp = w4; - w4 = w3; - w3 = w1 ^ w2 ^ (k + 1); - w2 = g(k, w1); - w1 = tmp; - k++; - } - } - - out[outOff + 0] = (byte)((w1 >> 8)); - out[outOff + 1] = (byte)(w1); - out[outOff + 2] = (byte)((w2 >> 8)); - out[outOff + 3] = (byte)(w2); - out[outOff + 4] = (byte)((w3 >> 8)); - out[outOff + 5] = (byte)(w3); - out[outOff + 6] = (byte)((w4 >> 8)); - out[outOff + 7] = (byte)(w4); - - return BLOCK_SIZE; - } - - /** - * the inverse of the G permutation. - */ - private int h( - int k, - int w) - { - int h1, h2, h3, h4, h5, h6; - - h1 = w & 0xff; - h2 = (w >> 8) & 0xff; - - h3 = ftable[h2 ^ key3[k]] ^ h1; - h4 = ftable[h3 ^ key2[k]] ^ h2; - h5 = ftable[h4 ^ key1[k]] ^ h3; - h6 = ftable[h5 ^ key0[k]] ^ h4; - - return ((h6 << 8) + h5); - } - - public int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int w2 = (in[inOff + 0] << 8) + (in[inOff + 1] & 0xff); - int w1 = (in[inOff + 2] << 8) + (in[inOff + 3] & 0xff); - int w4 = (in[inOff + 4] << 8) + (in[inOff + 5] & 0xff); - int w3 = (in[inOff + 6] << 8) + (in[inOff + 7] & 0xff); - - int k = 31; - - for (int t = 0; t < 2; t++) - { - for(int i = 0; i < 8; i++) - { - int tmp = w4; - w4 = w3; - w3 = w2; - w2 = h(k, w1); - w1 = w2 ^ tmp ^ (k + 1); - k--; - } - - for(int i = 0; i < 8; i++) - { - int tmp = w4; - w4 = w3; - w3 = w1 ^ w2 ^ (k + 1); - w2 = h(k, w1); - w1 = tmp; - k--; - } - } - - out[outOff + 0] = (byte)((w2 >> 8)); - out[outOff + 1] = (byte)(w2); - out[outOff + 2] = (byte)((w1 >> 8)); - out[outOff + 3] = (byte)(w1); - out[outOff + 4] = (byte)((w4 >> 8)); - out[outOff + 5] = (byte)(w4); - out[outOff + 6] = (byte)((w3 >> 8)); - out[outOff + 7] = (byte)(w3); - - return BLOCK_SIZE; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TEAEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TEAEngine.java deleted file mode 100644 index b7aa136..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TEAEngine.java +++ /dev/null @@ -1,178 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * An TEA engine. - */ -public class TEAEngine - implements BlockCipher -{ - private static final int rounds = 32, - block_size = 8, -// key_size = 16, - delta = 0x9E3779B9, - d_sum = 0xC6EF3720; // sum on decrypt - /* - * the expanded key array of 4 subkeys - */ - private int _a, _b, _c, _d; - private boolean _initialised; - private boolean _forEncryption; - - /** - * Create an instance of the TEA encryption algorithm - * and set some defaults - */ - public TEAEngine() - { - _initialised = false; - } - - public String getAlgorithmName() - { - return "TEA"; - } - - public int getBlockSize() - { - return block_size; - } - - /** - * initialise - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to TEA init - " + params.getClass().getName()); - } - - _forEncryption = forEncryption; - _initialised = true; - - KeyParameter p = (KeyParameter)params; - - setKey(p.getKey()); - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (!_initialised) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - if ((inOff + block_size) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + block_size) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - return (_forEncryption) ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param key the key to be used - */ - private void setKey( - byte[] key) - { - _a = bytesToInt(key, 0); - _b = bytesToInt(key, 4); - _c = bytesToInt(key, 8); - _d = bytesToInt(key, 12); - } - - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // Pack bytes into integers - int v0 = bytesToInt(in, inOff); - int v1 = bytesToInt(in, inOff + 4); - - int sum = 0; - - for (int i = 0; i != rounds; i++) - { - sum += delta; - v0 += ((v1 << 4) + _a) ^ (v1 + sum) ^ ((v1 >>> 5) + _b); - v1 += ((v0 << 4) + _c) ^ (v0 + sum) ^ ((v0 >>> 5) + _d); - } - - unpackInt(v0, out, outOff); - unpackInt(v1, out, outOff + 4); - - return block_size; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // Pack bytes into integers - int v0 = bytesToInt(in, inOff); - int v1 = bytesToInt(in, inOff + 4); - - int sum = d_sum; - - for (int i = 0; i != rounds; i++) - { - v1 -= ((v0 << 4) + _c) ^ (v0 + sum) ^ ((v0 >>> 5) + _d); - v0 -= ((v1 << 4) + _a) ^ (v1 + sum) ^ ((v1 >>> 5) + _b); - sum -= delta; - } - - unpackInt(v0, out, outOff); - unpackInt(v1, out, outOff + 4); - - return block_size; - } - - private int bytesToInt(byte[] in, int inOff) - { - return ((in[inOff++]) << 24) | - ((in[inOff++] & 255) << 16) | - ((in[inOff++] & 255) << 8) | - ((in[inOff] & 255)); - } - - private void unpackInt(int v, byte[] out, int outOff) - { - out[outOff++] = (byte)(v >>> 24); - out[outOff++] = (byte)(v >>> 16); - out[outOff++] = (byte)(v >>> 8); - out[outOff ] = (byte)v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TwofishEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TwofishEngine.java deleted file mode 100644 index 04615ba..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/TwofishEngine.java +++ /dev/null @@ -1,679 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * A class that provides Twofish encryption operations. - * - * This Java implementation is based on the Java reference - * implementation provided by Bruce Schneier and developed - * by Raif S. Naffah. - */ -public final class TwofishEngine - implements BlockCipher -{ - private static final byte[][] P = { - { // p0 - (byte) 0xA9, (byte) 0x67, (byte) 0xB3, (byte) 0xE8, - (byte) 0x04, (byte) 0xFD, (byte) 0xA3, (byte) 0x76, - (byte) 0x9A, (byte) 0x92, (byte) 0x80, (byte) 0x78, - (byte) 0xE4, (byte) 0xDD, (byte) 0xD1, (byte) 0x38, - (byte) 0x0D, (byte) 0xC6, (byte) 0x35, (byte) 0x98, - (byte) 0x18, (byte) 0xF7, (byte) 0xEC, (byte) 0x6C, - (byte) 0x43, (byte) 0x75, (byte) 0x37, (byte) 0x26, - (byte) 0xFA, (byte) 0x13, (byte) 0x94, (byte) 0x48, - (byte) 0xF2, (byte) 0xD0, (byte) 0x8B, (byte) 0x30, - (byte) 0x84, (byte) 0x54, (byte) 0xDF, (byte) 0x23, - (byte) 0x19, (byte) 0x5B, (byte) 0x3D, (byte) 0x59, - (byte) 0xF3, (byte) 0xAE, (byte) 0xA2, (byte) 0x82, - (byte) 0x63, (byte) 0x01, (byte) 0x83, (byte) 0x2E, - (byte) 0xD9, (byte) 0x51, (byte) 0x9B, (byte) 0x7C, - (byte) 0xA6, (byte) 0xEB, (byte) 0xA5, (byte) 0xBE, - (byte) 0x16, (byte) 0x0C, (byte) 0xE3, (byte) 0x61, - (byte) 0xC0, (byte) 0x8C, (byte) 0x3A, (byte) 0xF5, - (byte) 0x73, (byte) 0x2C, (byte) 0x25, (byte) 0x0B, - (byte) 0xBB, (byte) 0x4E, (byte) 0x89, (byte) 0x6B, - (byte) 0x53, (byte) 0x6A, (byte) 0xB4, (byte) 0xF1, - (byte) 0xE1, (byte) 0xE6, (byte) 0xBD, (byte) 0x45, - (byte) 0xE2, (byte) 0xF4, (byte) 0xB6, (byte) 0x66, - (byte) 0xCC, (byte) 0x95, (byte) 0x03, (byte) 0x56, - (byte) 0xD4, (byte) 0x1C, (byte) 0x1E, (byte) 0xD7, - (byte) 0xFB, (byte) 0xC3, (byte) 0x8E, (byte) 0xB5, - (byte) 0xE9, (byte) 0xCF, (byte) 0xBF, (byte) 0xBA, - (byte) 0xEA, (byte) 0x77, (byte) 0x39, (byte) 0xAF, - (byte) 0x33, (byte) 0xC9, (byte) 0x62, (byte) 0x71, - (byte) 0x81, (byte) 0x79, (byte) 0x09, (byte) 0xAD, - (byte) 0x24, (byte) 0xCD, (byte) 0xF9, (byte) 0xD8, - (byte) 0xE5, (byte) 0xC5, (byte) 0xB9, (byte) 0x4D, - (byte) 0x44, (byte) 0x08, (byte) 0x86, (byte) 0xE7, - (byte) 0xA1, (byte) 0x1D, (byte) 0xAA, (byte) 0xED, - (byte) 0x06, (byte) 0x70, (byte) 0xB2, (byte) 0xD2, - (byte) 0x41, (byte) 0x7B, (byte) 0xA0, (byte) 0x11, - (byte) 0x31, (byte) 0xC2, (byte) 0x27, (byte) 0x90, - (byte) 0x20, (byte) 0xF6, (byte) 0x60, (byte) 0xFF, - (byte) 0x96, (byte) 0x5C, (byte) 0xB1, (byte) 0xAB, - (byte) 0x9E, (byte) 0x9C, (byte) 0x52, (byte) 0x1B, - (byte) 0x5F, (byte) 0x93, (byte) 0x0A, (byte) 0xEF, - (byte) 0x91, (byte) 0x85, (byte) 0x49, (byte) 0xEE, - (byte) 0x2D, (byte) 0x4F, (byte) 0x8F, (byte) 0x3B, - (byte) 0x47, (byte) 0x87, (byte) 0x6D, (byte) 0x46, - (byte) 0xD6, (byte) 0x3E, (byte) 0x69, (byte) 0x64, - (byte) 0x2A, (byte) 0xCE, (byte) 0xCB, (byte) 0x2F, - (byte) 0xFC, (byte) 0x97, (byte) 0x05, (byte) 0x7A, - (byte) 0xAC, (byte) 0x7F, (byte) 0xD5, (byte) 0x1A, - (byte) 0x4B, (byte) 0x0E, (byte) 0xA7, (byte) 0x5A, - (byte) 0x28, (byte) 0x14, (byte) 0x3F, (byte) 0x29, - (byte) 0x88, (byte) 0x3C, (byte) 0x4C, (byte) 0x02, - (byte) 0xB8, (byte) 0xDA, (byte) 0xB0, (byte) 0x17, - (byte) 0x55, (byte) 0x1F, (byte) 0x8A, (byte) 0x7D, - (byte) 0x57, (byte) 0xC7, (byte) 0x8D, (byte) 0x74, - (byte) 0xB7, (byte) 0xC4, (byte) 0x9F, (byte) 0x72, - (byte) 0x7E, (byte) 0x15, (byte) 0x22, (byte) 0x12, - (byte) 0x58, (byte) 0x07, (byte) 0x99, (byte) 0x34, - (byte) 0x6E, (byte) 0x50, (byte) 0xDE, (byte) 0x68, - (byte) 0x65, (byte) 0xBC, (byte) 0xDB, (byte) 0xF8, - (byte) 0xC8, (byte) 0xA8, (byte) 0x2B, (byte) 0x40, - (byte) 0xDC, (byte) 0xFE, (byte) 0x32, (byte) 0xA4, - (byte) 0xCA, (byte) 0x10, (byte) 0x21, (byte) 0xF0, - (byte) 0xD3, (byte) 0x5D, (byte) 0x0F, (byte) 0x00, - (byte) 0x6F, (byte) 0x9D, (byte) 0x36, (byte) 0x42, - (byte) 0x4A, (byte) 0x5E, (byte) 0xC1, (byte) 0xE0 }, - { // p1 - (byte) 0x75, (byte) 0xF3, (byte) 0xC6, (byte) 0xF4, - (byte) 0xDB, (byte) 0x7B, (byte) 0xFB, (byte) 0xC8, - (byte) 0x4A, (byte) 0xD3, (byte) 0xE6, (byte) 0x6B, - (byte) 0x45, (byte) 0x7D, (byte) 0xE8, (byte) 0x4B, - (byte) 0xD6, (byte) 0x32, (byte) 0xD8, (byte) 0xFD, - (byte) 0x37, (byte) 0x71, (byte) 0xF1, (byte) 0xE1, - (byte) 0x30, (byte) 0x0F, (byte) 0xF8, (byte) 0x1B, - (byte) 0x87, (byte) 0xFA, (byte) 0x06, (byte) 0x3F, - (byte) 0x5E, (byte) 0xBA, (byte) 0xAE, (byte) 0x5B, - (byte) 0x8A, (byte) 0x00, (byte) 0xBC, (byte) 0x9D, - (byte) 0x6D, (byte) 0xC1, (byte) 0xB1, (byte) 0x0E, - (byte) 0x80, (byte) 0x5D, (byte) 0xD2, (byte) 0xD5, - (byte) 0xA0, (byte) 0x84, (byte) 0x07, (byte) 0x14, - (byte) 0xB5, (byte) 0x90, (byte) 0x2C, (byte) 0xA3, - (byte) 0xB2, (byte) 0x73, (byte) 0x4C, (byte) 0x54, - (byte) 0x92, (byte) 0x74, (byte) 0x36, (byte) 0x51, - (byte) 0x38, (byte) 0xB0, (byte) 0xBD, (byte) 0x5A, - (byte) 0xFC, (byte) 0x60, (byte) 0x62, (byte) 0x96, - (byte) 0x6C, (byte) 0x42, (byte) 0xF7, (byte) 0x10, - (byte) 0x7C, (byte) 0x28, (byte) 0x27, (byte) 0x8C, - (byte) 0x13, (byte) 0x95, (byte) 0x9C, (byte) 0xC7, - (byte) 0x24, (byte) 0x46, (byte) 0x3B, (byte) 0x70, - (byte) 0xCA, (byte) 0xE3, (byte) 0x85, (byte) 0xCB, - (byte) 0x11, (byte) 0xD0, (byte) 0x93, (byte) 0xB8, - (byte) 0xA6, (byte) 0x83, (byte) 0x20, (byte) 0xFF, - (byte) 0x9F, (byte) 0x77, (byte) 0xC3, (byte) 0xCC, - (byte) 0x03, (byte) 0x6F, (byte) 0x08, (byte) 0xBF, - (byte) 0x40, (byte) 0xE7, (byte) 0x2B, (byte) 0xE2, - (byte) 0x79, (byte) 0x0C, (byte) 0xAA, (byte) 0x82, - (byte) 0x41, (byte) 0x3A, (byte) 0xEA, (byte) 0xB9, - (byte) 0xE4, (byte) 0x9A, (byte) 0xA4, (byte) 0x97, - (byte) 0x7E, (byte) 0xDA, (byte) 0x7A, (byte) 0x17, - (byte) 0x66, (byte) 0x94, (byte) 0xA1, (byte) 0x1D, - (byte) 0x3D, (byte) 0xF0, (byte) 0xDE, (byte) 0xB3, - (byte) 0x0B, (byte) 0x72, (byte) 0xA7, (byte) 0x1C, - (byte) 0xEF, (byte) 0xD1, (byte) 0x53, (byte) 0x3E, - (byte) 0x8F, (byte) 0x33, (byte) 0x26, (byte) 0x5F, - (byte) 0xEC, (byte) 0x76, (byte) 0x2A, (byte) 0x49, - (byte) 0x81, (byte) 0x88, (byte) 0xEE, (byte) 0x21, - (byte) 0xC4, (byte) 0x1A, (byte) 0xEB, (byte) 0xD9, - (byte) 0xC5, (byte) 0x39, (byte) 0x99, (byte) 0xCD, - (byte) 0xAD, (byte) 0x31, (byte) 0x8B, (byte) 0x01, - (byte) 0x18, (byte) 0x23, (byte) 0xDD, (byte) 0x1F, - (byte) 0x4E, (byte) 0x2D, (byte) 0xF9, (byte) 0x48, - (byte) 0x4F, (byte) 0xF2, (byte) 0x65, (byte) 0x8E, - (byte) 0x78, (byte) 0x5C, (byte) 0x58, (byte) 0x19, - (byte) 0x8D, (byte) 0xE5, (byte) 0x98, (byte) 0x57, - (byte) 0x67, (byte) 0x7F, (byte) 0x05, (byte) 0x64, - (byte) 0xAF, (byte) 0x63, (byte) 0xB6, (byte) 0xFE, - (byte) 0xF5, (byte) 0xB7, (byte) 0x3C, (byte) 0xA5, - (byte) 0xCE, (byte) 0xE9, (byte) 0x68, (byte) 0x44, - (byte) 0xE0, (byte) 0x4D, (byte) 0x43, (byte) 0x69, - (byte) 0x29, (byte) 0x2E, (byte) 0xAC, (byte) 0x15, - (byte) 0x59, (byte) 0xA8, (byte) 0x0A, (byte) 0x9E, - (byte) 0x6E, (byte) 0x47, (byte) 0xDF, (byte) 0x34, - (byte) 0x35, (byte) 0x6A, (byte) 0xCF, (byte) 0xDC, - (byte) 0x22, (byte) 0xC9, (byte) 0xC0, (byte) 0x9B, - (byte) 0x89, (byte) 0xD4, (byte) 0xED, (byte) 0xAB, - (byte) 0x12, (byte) 0xA2, (byte) 0x0D, (byte) 0x52, - (byte) 0xBB, (byte) 0x02, (byte) 0x2F, (byte) 0xA9, - (byte) 0xD7, (byte) 0x61, (byte) 0x1E, (byte) 0xB4, - (byte) 0x50, (byte) 0x04, (byte) 0xF6, (byte) 0xC2, - (byte) 0x16, (byte) 0x25, (byte) 0x86, (byte) 0x56, - (byte) 0x55, (byte) 0x09, (byte) 0xBE, (byte) 0x91 } - }; - - /** - * Define the fixed p0/p1 permutations used in keyed S-box lookup. - * By changing the following constant definitions, the S-boxes will - * automatically get changed in the Twofish engine. - */ - private static final int P_00 = 1; - private static final int P_01 = 0; - private static final int P_02 = 0; - private static final int P_03 = P_01 ^ 1; - private static final int P_04 = 1; - - private static final int P_10 = 0; - private static final int P_11 = 0; - private static final int P_12 = 1; - private static final int P_13 = P_11 ^ 1; - private static final int P_14 = 0; - - private static final int P_20 = 1; - private static final int P_21 = 1; - private static final int P_22 = 0; - private static final int P_23 = P_21 ^ 1; - private static final int P_24 = 0; - - private static final int P_30 = 0; - private static final int P_31 = 1; - private static final int P_32 = 1; - private static final int P_33 = P_31 ^ 1; - private static final int P_34 = 1; - - /* Primitive polynomial for GF(256) */ - private static final int GF256_FDBK = 0x169; - private static final int GF256_FDBK_2 = GF256_FDBK / 2; - private static final int GF256_FDBK_4 = GF256_FDBK / 4; - - private static final int RS_GF_FDBK = 0x14D; // field generator - - //==================================== - // Useful constants - //==================================== - - private static final int ROUNDS = 16; - private static final int MAX_ROUNDS = 16; // bytes = 128 bits - private static final int BLOCK_SIZE = 16; // bytes = 128 bits - private static final int MAX_KEY_BITS = 256; - - private static final int INPUT_WHITEN=0; - private static final int OUTPUT_WHITEN=INPUT_WHITEN+BLOCK_SIZE/4; // 4 - private static final int ROUND_SUBKEYS=OUTPUT_WHITEN+BLOCK_SIZE/4;// 8 - - private static final int TOTAL_SUBKEYS=ROUND_SUBKEYS+2*MAX_ROUNDS;// 40 - - private static final int SK_STEP = 0x02020202; - private static final int SK_BUMP = 0x01010101; - private static final int SK_ROTL = 9; - - private boolean encrypting = false; - - private int[] gMDS0 = new int[MAX_KEY_BITS]; - private int[] gMDS1 = new int[MAX_KEY_BITS]; - private int[] gMDS2 = new int[MAX_KEY_BITS]; - private int[] gMDS3 = new int[MAX_KEY_BITS]; - - /** - * gSubKeys[] and gSBox[] are eventually used in the - * encryption and decryption methods. - */ - private int[] gSubKeys; - private int[] gSBox; - - private int k64Cnt = 0; - - private byte[] workingKey = null; - - public TwofishEngine() - { - // calculate the MDS matrix - int[] m1 = new int[2]; - int[] mX = new int[2]; - int[] mY = new int[2]; - int j; - - for (int i=0; i< MAX_KEY_BITS ; i++) - { - j = P[0][i] & 0xff; - m1[0] = j; - mX[0] = Mx_X(j) & 0xff; - mY[0] = Mx_Y(j) & 0xff; - - j = P[1][i] & 0xff; - m1[1] = j; - mX[1] = Mx_X(j) & 0xff; - mY[1] = Mx_Y(j) & 0xff; - - gMDS0[i] = m1[P_00] | mX[P_00] << 8 | - mY[P_00] << 16 | mY[P_00] << 24; - - gMDS1[i] = mY[P_10] | mY[P_10] << 8 | - mX[P_10] << 16 | m1[P_10] << 24; - - gMDS2[i] = mX[P_20] | mY[P_20] << 8 | - m1[P_20] << 16 | mY[P_20] << 24; - - gMDS3[i] = mX[P_30] | m1[P_30] << 8 | - mY[P_30] << 16 | mX[P_30] << 24; - } - } - - /** - * initialise a Twofish cipher. - * - * @param encrypting whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - { - if (params instanceof KeyParameter) - { - this.encrypting = encrypting; - this.workingKey = ((KeyParameter)params).getKey(); - this.k64Cnt = (this.workingKey.length / 8); // pre-padded ? - setKey(this.workingKey); - - return; - } - - throw new IllegalArgumentException("invalid parameter passed to Twofish init - " + params.getClass().getName()); - } - - public String getAlgorithmName() - { - return "Twofish"; - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (workingKey == null) - { - throw new IllegalStateException("Twofish not initialised"); - } - - if ((inOff + BLOCK_SIZE) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + BLOCK_SIZE) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (encrypting) - { - encryptBlock(in, inOff, out, outOff); - } - else - { - decryptBlock(in, inOff, out, outOff); - } - - return BLOCK_SIZE; - } - - public void reset() - { - if (this.workingKey != null) - { - setKey(this.workingKey); - } - } - - public int getBlockSize() - { - return BLOCK_SIZE; - } - - //================================== - // Private Implementation - //================================== - - private void setKey(byte[] key) - { - int[] k32e = new int[MAX_KEY_BITS/64]; // 4 - int[] k32o = new int[MAX_KEY_BITS/64]; // 4 - - int[] sBoxKeys = new int[MAX_KEY_BITS/64]; // 4 - gSubKeys = new int[TOTAL_SUBKEYS]; - - if (k64Cnt < 1) - { - throw new IllegalArgumentException("Key size less than 64 bits"); - } - - if (k64Cnt > 4) - { - throw new IllegalArgumentException("Key size larger than 256 bits"); - } - - /* - * k64Cnt is the number of 8 byte blocks (64 chunks) - * that are in the input key. The input key is a - * maximum of 32 bytes (256 bits), so the range - * for k64Cnt is 1..4 - */ - for (int i=0; i>> 24; - A += B; - gSubKeys[i*2] = A; - A += B; - gSubKeys[i*2 + 1] = A << SK_ROTL | A >>> (32-SK_ROTL); - } - - /* - * fully expand the table for speed - */ - int k0 = sBoxKeys[0]; - int k1 = sBoxKeys[1]; - int k2 = sBoxKeys[2]; - int k3 = sBoxKeys[3]; - int b0, b1, b2, b3; - gSBox = new int[4*MAX_KEY_BITS]; - for (int i=0; i>>1 | x2 << 31; - x3 = (x3 << 1 | x3 >>> 31) ^ (t0 + 2*t1 + gSubKeys[k++]); - - t0 = Fe32_0(x2); - t1 = Fe32_3(x3); - x0 ^= t0 + t1 + gSubKeys[k++]; - x0 = x0 >>>1 | x0 << 31; - x1 = (x1 << 1 | x1 >>> 31) ^ (t0 + 2*t1 + gSubKeys[k++]); - } - - Bits32ToBytes(x2 ^ gSubKeys[OUTPUT_WHITEN], dst, dstIndex); - Bits32ToBytes(x3 ^ gSubKeys[OUTPUT_WHITEN + 1], dst, dstIndex + 4); - Bits32ToBytes(x0 ^ gSubKeys[OUTPUT_WHITEN + 2], dst, dstIndex + 8); - Bits32ToBytes(x1 ^ gSubKeys[OUTPUT_WHITEN + 3], dst, dstIndex + 12); - } - - /** - * Decrypt the given input starting at the given offset and place - * the result in the provided buffer starting at the given offset. - * The input will be an exact multiple of our blocksize. - */ - private void decryptBlock( - byte[] src, - int srcIndex, - byte[] dst, - int dstIndex) - { - int x2 = BytesTo32Bits(src, srcIndex) ^ gSubKeys[OUTPUT_WHITEN]; - int x3 = BytesTo32Bits(src, srcIndex+4) ^ gSubKeys[OUTPUT_WHITEN + 1]; - int x0 = BytesTo32Bits(src, srcIndex+8) ^ gSubKeys[OUTPUT_WHITEN + 2]; - int x1 = BytesTo32Bits(src, srcIndex+12) ^ gSubKeys[OUTPUT_WHITEN + 3]; - - int k = ROUND_SUBKEYS + 2 * ROUNDS -1 ; - int t0, t1; - for (int r = 0; r< ROUNDS ; r +=2) - { - t0 = Fe32_0(x2); - t1 = Fe32_3(x3); - x1 ^= t0 + 2*t1 + gSubKeys[k--]; - x0 = (x0 << 1 | x0 >>> 31) ^ (t0 + t1 + gSubKeys[k--]); - x1 = x1 >>>1 | x1 << 31; - - t0 = Fe32_0(x0); - t1 = Fe32_3(x1); - x3 ^= t0 + 2*t1 + gSubKeys[k--]; - x2 = (x2 << 1 | x2 >>> 31) ^ (t0 + t1 + gSubKeys[k--]); - x3 = x3 >>>1 | x3 << 31; - } - - Bits32ToBytes(x0 ^ gSubKeys[INPUT_WHITEN], dst, dstIndex); - Bits32ToBytes(x1 ^ gSubKeys[INPUT_WHITEN + 1], dst, dstIndex + 4); - Bits32ToBytes(x2 ^ gSubKeys[INPUT_WHITEN + 2], dst, dstIndex + 8); - Bits32ToBytes(x3 ^ gSubKeys[INPUT_WHITEN + 3], dst, dstIndex + 12); - } - - /* - * TODO: This can be optimised and made cleaner by combining - * the functionality in this function and applying it appropriately - * to the creation of the subkeys during key setup. - */ - private int F32(int x, int[] k32) - { - int b0 = b0(x); - int b1 = b1(x); - int b2 = b2(x); - int b3 = b3(x); - int k0 = k32[0]; - int k1 = k32[1]; - int k2 = k32[2]; - int k3 = k32[3]; - - int result = 0; - switch (k64Cnt & 3) - { - case 1: - result = gMDS0[(P[P_01][b0] & 0xff) ^ b0(k0)] ^ - gMDS1[(P[P_11][b1] & 0xff) ^ b1(k0)] ^ - gMDS2[(P[P_21][b2] & 0xff) ^ b2(k0)] ^ - gMDS3[(P[P_31][b3] & 0xff) ^ b3(k0)]; - break; - case 0: /* 256 bits of key */ - b0 = (P[P_04][b0] & 0xff) ^ b0(k3); - b1 = (P[P_14][b1] & 0xff) ^ b1(k3); - b2 = (P[P_24][b2] & 0xff) ^ b2(k3); - b3 = (P[P_34][b3] & 0xff) ^ b3(k3); - case 3: - b0 = (P[P_03][b0] & 0xff) ^ b0(k2); - b1 = (P[P_13][b1] & 0xff) ^ b1(k2); - b2 = (P[P_23][b2] & 0xff) ^ b2(k2); - b3 = (P[P_33][b3] & 0xff) ^ b3(k2); - case 2: - result = - gMDS0[(P[P_01][(P[P_02][b0]&0xff)^b0(k1)]&0xff)^b0(k0)] ^ - gMDS1[(P[P_11][(P[P_12][b1]&0xff)^b1(k1)]&0xff)^b1(k0)] ^ - gMDS2[(P[P_21][(P[P_22][b2]&0xff)^b2(k1)]&0xff)^b2(k0)] ^ - gMDS3[(P[P_31][(P[P_32][b3]&0xff)^b3(k1)]&0xff)^b3(k0)]; - break; - } - return result; - } - - /** - * Use (12, 8) Reed-Solomon code over GF(256) to produce - * a key S-box 32-bit entity from 2 key material 32-bit - * entities. - * - * @param k0 first 32-bit entity - * @param k1 second 32-bit entity - * @return Remainder polynomial generated using RS code - */ - private int RS_MDS_Encode(int k0, int k1) - { - int r = k1; - for (int i = 0 ; i < 4 ; i++) // shift 1 byte at a time - { - r = RS_rem(r); - } - r ^= k0; - for (int i=0 ; i < 4 ; i++) - { - r = RS_rem(r); - } - - return r; - } - - /** - * Reed-Solomon code parameters: (12,8) reversible code:

    - *

    -     * g(x) = x^4 + (a+1/a)x^3 + ax^2 + (a+1/a)x + 1
    -     * 
    - * where a = primitive root of field generator 0x14D - */ - private int RS_rem(int x) - { - int b = (x >>> 24) & 0xff; - int g2 = ((b << 1) ^ - ((b & 0x80) != 0 ? RS_GF_FDBK : 0)) & 0xff; - int g3 = ((b >>> 1) ^ - ((b & 0x01) != 0 ? (RS_GF_FDBK >>> 1) : 0)) ^ g2 ; - return ((x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b); - } - - private int LFSR1(int x) - { - return (x >> 1) ^ - (((x & 0x01) != 0) ? GF256_FDBK_2 : 0); - } - - private int LFSR2(int x) - { - return (x >> 2) ^ - (((x & 0x02) != 0) ? GF256_FDBK_2 : 0) ^ - (((x & 0x01) != 0) ? GF256_FDBK_4 : 0); - } - - private int Mx_X(int x) - { - return x ^ LFSR2(x); - } // 5B - - private int Mx_Y(int x) - { - return x ^ LFSR1(x) ^ LFSR2(x); - } // EF - - private int b0(int x) - { - return x & 0xff; - } - - private int b1(int x) - { - return (x >>> 8) & 0xff; - } - - private int b2(int x) - { - return (x >>> 16) & 0xff; - } - - private int b3(int x) - { - return (x >>> 24) & 0xff; - } - - private int Fe32_0(int x) - { - return gSBox[ 0x000 + 2*(x & 0xff) ] ^ - gSBox[ 0x001 + 2*((x >>> 8) & 0xff) ] ^ - gSBox[ 0x200 + 2*((x >>> 16) & 0xff) ] ^ - gSBox[ 0x201 + 2*((x >>> 24) & 0xff) ]; - } - - private int Fe32_3(int x) - { - return gSBox[ 0x000 + 2*((x >>> 24) & 0xff) ] ^ - gSBox[ 0x001 + 2*(x & 0xff) ] ^ - gSBox[ 0x200 + 2*((x >>> 8) & 0xff) ] ^ - gSBox[ 0x201 + 2*((x >>> 16) & 0xff) ]; - } - - private int BytesTo32Bits(byte[] b, int p) - { - return ((b[p] & 0xff)) | - ((b[p+1] & 0xff) << 8) | - ((b[p+2] & 0xff) << 16) | - ((b[p+3] & 0xff) << 24); - } - - private void Bits32ToBytes(int in, byte[] b, int offset) - { - b[offset] = (byte)in; - b[offset + 1] = (byte)(in >> 8); - b[offset + 2] = (byte)(in >> 16); - b[offset + 3] = (byte)(in >> 24); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCEngine.java deleted file mode 100644 index ca9e6d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCEngine.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -public class VMPCEngine implements StreamCipher -{ - /* - * variables to hold the state of the VMPC engine during encryption and - * decryption - */ - protected byte n = 0; - protected byte[] P = null; - protected byte s = 0; - - protected byte[] workingIV; - protected byte[] workingKey; - - public String getAlgorithmName() - { - return "VMPC"; - } - - /** - * initialise a VMPC cipher. - * - * @param forEncryption - * whether or not we are for encryption. - * @param params - * the parameters required to set up the cipher. - * @exception IllegalArgumentException - * if the params argument is inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - { - if (!(params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException( - "VMPC init parameters must include an IV"); - } - - ParametersWithIV ivParams = (ParametersWithIV) params; - KeyParameter key = (KeyParameter) ivParams.getParameters(); - - if (!(ivParams.getParameters() instanceof KeyParameter)) - { - throw new IllegalArgumentException( - "VMPC init parameters must include a key"); - } - - this.workingIV = ivParams.getIV(); - - if (workingIV == null || workingIV.length < 1 || workingIV.length > 768) - { - throw new IllegalArgumentException("VMPC requires 1 to 768 bytes of IV"); - } - - this.workingKey = key.getKey(); - - initKey(this.workingKey, this.workingIV); - } - - protected void initKey(byte[] keyBytes, byte[] ivBytes) - { - s = 0; - P = new byte[256]; - for (int i = 0; i < 256; i++) - { - P[i] = (byte) i; - } - - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - n = 0; - } - - public void processBytes(byte[] in, int inOff, int len, byte[] out, - int outOff) - { - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + len) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - for (int i = 0; i < len; i++) - { - s = P[(s + P[n & 0xff]) & 0xff]; - byte z = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]; - // encryption - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - - // xor - out[i + outOff] = (byte) (in[i + inOff] ^ z); - } - } - - public void reset() - { - initKey(this.workingKey, this.workingIV); - } - - public byte returnByte(byte in) - { - s = P[(s + P[n & 0xff]) & 0xff]; - byte z = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]; - // encryption - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - - // xor - return (byte) (in ^ z); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCKSA3Engine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCKSA3Engine.java deleted file mode 100644 index bf7bdf0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/VMPCKSA3Engine.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.bc.crypto.engines; - -public class VMPCKSA3Engine extends VMPCEngine -{ - public String getAlgorithmName() - { - return "VMPC-KSA3"; - } - - protected void initKey(byte[] keyBytes, byte[] ivBytes) - { - s = 0; - P = new byte[256]; - for (int i = 0; i < 256; i++) - { - P[i] = (byte) i; - } - - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - - n = 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/XTEAEngine.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/XTEAEngine.java deleted file mode 100644 index 44b2e25..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/engines/XTEAEngine.java +++ /dev/null @@ -1,182 +0,0 @@ -package org.bc.crypto.engines; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.KeyParameter; - -/** - * An XTEA engine. - */ -public class XTEAEngine - implements BlockCipher -{ - private static final int rounds = 32, - block_size = 8, -// key_size = 16, - delta = 0x9E3779B9; - - /* - * the expanded key array of 4 subkeys - */ - private int[] _S = new int[4], - _sum0 = new int[32], - _sum1 = new int[32]; - private boolean _initialised, - _forEncryption; - - /** - * Create an instance of the TEA encryption algorithm - * and set some defaults - */ - public XTEAEngine() - { - _initialised = false; - } - - public String getAlgorithmName() - { - return "XTEA"; - } - - public int getBlockSize() - { - return block_size; - } - - /** - * initialise - * - * @param forEncryption whether or not we are for encryption. - * @param params the parameters required to set up the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - { - if (!(params instanceof KeyParameter)) - { - throw new IllegalArgumentException("invalid parameter passed to TEA init - " + params.getClass().getName()); - } - - _forEncryption = forEncryption; - _initialised = true; - - KeyParameter p = (KeyParameter)params; - - setKey(p.getKey()); - } - - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - if (!_initialised) - { - throw new IllegalStateException(getAlgorithmName()+" not initialised"); - } - - if ((inOff + block_size) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + block_size) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - return (_forEncryption) ? encryptBlock(in, inOff, out, outOff) - : decryptBlock(in, inOff, out, outOff); - } - - public void reset() - { - } - - /** - * Re-key the cipher. - *

    - * @param key the key to be used - */ - private void setKey( - byte[] key) - { - int i, j; - for (i = j = 0; i < 4; i++,j+=4) - { - _S[i] = bytesToInt(key, j); - } - - for (i = j = 0; i < rounds; i++) - { - _sum0[i] = (j + _S[j & 3]); - j += delta; - _sum1[i] = (j + _S[j >>> 11 & 3]); - } - } - - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // Pack bytes into integers - int v0 = bytesToInt(in, inOff); - int v1 = bytesToInt(in, inOff + 4); - - for (int i = 0; i < rounds; i++) - { - v0 += ((v1 << 4 ^ v1 >>> 5) + v1) ^ _sum0[i]; - v1 += ((v0 << 4 ^ v0 >>> 5) + v0) ^ _sum1[i]; - } - - unpackInt(v0, out, outOff); - unpackInt(v1, out, outOff + 4); - - return block_size; - } - - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - { - // Pack bytes into integers - int v0 = bytesToInt(in, inOff); - int v1 = bytesToInt(in, inOff + 4); - - for (int i = rounds-1; i >= 0; i--) - { - v1 -= ((v0 << 4 ^ v0 >>> 5) + v0) ^ _sum1[i]; - v0 -= ((v1 << 4 ^ v1 >>> 5) + v1) ^ _sum0[i]; - } - - unpackInt(v0, out, outOff); - unpackInt(v1, out, outOff + 4); - - return block_size; - } - - private int bytesToInt(byte[] in, int inOff) - { - return ((in[inOff++]) << 24) | - ((in[inOff++] & 255) << 16) | - ((in[inOff++] & 255) << 8) | - ((in[inOff] & 255)); - } - - private void unpackInt(int v, byte[] out, int outOff) - { - out[outOff++] = (byte)(v >>> 24); - out[outOff++] = (byte)(v >>> 16); - out[outOff++] = (byte)(v >>> 8); - out[outOff ] = (byte)v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/DESExample.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/DESExample.java deleted file mode 100644 index 9c50776..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/DESExample.java +++ /dev/null @@ -1,419 +0,0 @@ -package org.bc.crypto.examples; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.engines.DESedeEngine; -import org.bc.crypto.generators.DESedeKeyGenerator; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.paddings.PaddedBufferedBlockCipher; -import org.bc.crypto.params.DESedeParameters; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.encoders.Hex; - -/** - * DESExample is a simple DES based encryptor/decryptor. - *

    - * The program is command line driven, with the input - * and output files specified on the command line. - *

    - * java org.bouncycastle.crypto.examples.DESExample infile outfile [keyfile]
    - * 
    - * A new key is generated for each encryption, if key is not specified, - * then the example will assume encryption is required, and as output - * create deskey.dat in the current directory. This key is a hex - * encoded byte-stream that is used for the decryption. The output - * file is Hex encoded, 60 characters wide text file. - *

    - * When encrypting; - *

      - *
    • the infile is expected to be a byte stream (text or binary) - *
    • there is no keyfile specified on the input line - *
    - *

    - * When decrypting; - *

  • the infile is expected to be the 60 character wide base64 - * encoded file - *
  • the keyfile is expected to be a base64 encoded file - *

    - * This example shows how to use the light-weight API, DES and - * the filesystem for message encryption and decryption. - * - */ -public class DESExample extends Object -{ - // Encrypting or decrypting ? - private boolean encrypt = true; - - // To hold the initialised DESede cipher - private PaddedBufferedBlockCipher cipher = null; - - // The input stream of bytes to be processed for encryption - private BufferedInputStream in = null; - - // The output stream of bytes to be procssed - private BufferedOutputStream out = null; - - // The key - private byte[] key = null; - - /* - * start the application - */ - public static void main(String[] args) - { - boolean encrypt = true; - String infile = null; - String outfile = null; - String keyfile = null; - - if (args.length < 2) - { - DESExample de = new DESExample(); - System.err.println("Usage: java "+de.getClass().getName()+ - " infile outfile [keyfile]"); - System.exit(1); - } - - keyfile = "deskey.dat"; - infile = args[0]; - outfile = args[1]; - - if (args.length > 2) - { - encrypt = false; - keyfile = args[2]; - } - - DESExample de = new DESExample(infile, outfile, keyfile, encrypt); - de.process(); - } - - // Default constructor, used for the usage message - public DESExample() - { - } - - /* - * Constructor, that takes the arguments appropriate for - * processing the command line directives. - */ - public DESExample( - String infile, - String outfile, - String keyfile, - boolean encrypt) - { - /* - * First, determine that infile & keyfile exist as appropriate. - * - * This will also create the BufferedInputStream as required - * for reading the input file. All input files are treated - * as if they are binary, even if they contain text, it's the - * bytes that are encrypted. - */ - this.encrypt = encrypt; - try - { - in = new BufferedInputStream(new FileInputStream(infile)); - } - catch (FileNotFoundException fnf) - { - System.err.println("Input file not found ["+infile+"]"); - System.exit(1); - } - - try - { - out = new BufferedOutputStream(new FileOutputStream(outfile)); - } - catch (IOException fnf) - { - System.err.println("Output file not created ["+outfile+"]"); - System.exit(1); - } - - if (encrypt) - { - try - { - /* - * The process of creating a new key requires a - * number of steps. - * - * First, create the parameters for the key generator - * which are a secure random number generator, and - * the length of the key (in bits). - */ - SecureRandom sr = null; - try - { - sr = new SecureRandom(); - /* - * This following call to setSeed() makes the - * initialisation of the SecureRandom object - * _very_ fast, but not secure AT ALL. - * - * Remove the line, recreate the class file and - * then run DESExample again to see the difference. - * - * The initialisation of a SecureRandom object - * can take 5 or more seconds depending on the - * CPU that the program is running on. That can - * be annoying during unit testing. - * -- jon - */ - sr.setSeed("www.bouncycastle.org".getBytes()); - } - catch (Exception nsa) - { - System.err.println("Hmmm, no SHA1PRNG, you need the "+ - "Sun implementation"); - System.exit(1); - } - KeyGenerationParameters kgp = new KeyGenerationParameters( - sr, - DESedeParameters.DES_EDE_KEY_LENGTH*8); - - /* - * Second, initialise the key generator with the parameters - */ - DESedeKeyGenerator kg = new DESedeKeyGenerator(); - kg.init(kgp); - - /* - * Third, and finally, generate the key - */ - key = kg.generateKey(); - - /* - * We can now output the key to the file, but first - * hex encode the key so that we can have a look - * at it with a text editor if we so desire - */ - BufferedOutputStream keystream = - new BufferedOutputStream(new FileOutputStream(keyfile)); - byte[] keyhex = Hex.encode(key); - keystream.write(keyhex, 0, keyhex.length); - keystream.flush(); - keystream.close(); - } - catch (IOException createKey) - { - System.err.println("Could not decryption create key file "+ - "["+keyfile+"]"); - System.exit(1); - } - } - else - { - try - { - // read the key, and decode from hex encoding - BufferedInputStream keystream = - new BufferedInputStream(new FileInputStream(keyfile)); - int len = keystream.available(); - byte[] keyhex = new byte[len]; - keystream.read(keyhex, 0, len); - key = Hex.decode(keyhex); - } - catch (IOException ioe) - { - System.err.println("Decryption key file not found, "+ - "or not valid ["+keyfile+"]"); - System.exit(1); - } - } - } - - private void process() - { - /* - * Setup the DESede cipher engine, create a PaddedBufferedBlockCipher - * in CBC mode. - */ - cipher = new PaddedBufferedBlockCipher( - new CBCBlockCipher(new DESedeEngine())); - - /* - * The input and output streams are currently set up - * appropriately, and the key bytes are ready to be - * used. - * - */ - - if (encrypt) - { - performEncrypt(key); - } - else - { - performDecrypt(key); - } - - // after processing clean up the files - try - { - in.close(); - out.flush(); - out.close(); - } - catch (IOException closing) - { - - } - } - - /* - * This method performs all the encryption and writes - * the cipher text to the buffered output stream created - * previously. - */ - private void performEncrypt(byte[] key) - { - // initialise the cipher with the key bytes, for encryption - cipher.init(true, new KeyParameter(key)); - - /* - * Create some temporary byte arrays for use in - * encryption, make them a reasonable size so that - * we don't spend forever reading small chunks from - * a file. - * - * There is no particular reason for using getBlockSize() - * to determine the size of the input chunk. It just - * was a convenient number for the example. - */ - // int inBlockSize = cipher.getBlockSize() * 5; - int inBlockSize = 47; - int outBlockSize = cipher.getOutputSize(inBlockSize); - - byte[] inblock = new byte[inBlockSize]; - byte[] outblock = new byte[outBlockSize]; - - /* - * now, read the file, and output the chunks - */ - try - { - int inL; - int outL; - byte[] rv = null; - while ((inL=in.read(inblock, 0, inBlockSize)) > 0) - { - outL = cipher.processBytes(inblock, 0, inL, outblock, 0); - /* - * Before we write anything out, we need to make sure - * that we've got something to write out. - */ - if (outL > 0) - { - rv = Hex.encode(outblock, 0, outL); - out.write(rv, 0, rv.length); - out.write('\n'); - } - } - - try - { - /* - * Now, process the bytes that are still buffered - * within the cipher. - */ - outL = cipher.doFinal(outblock, 0); - if (outL > 0) - { - rv = Hex.encode(outblock, 0, outL); - out.write(rv, 0, rv.length); - out.write('\n'); - } - } - catch (CryptoException ce) - { - - } - } - catch (IOException ioeread) - { - ioeread.printStackTrace(); - } - } - - /* - * This method performs all the decryption and writes - * the plain text to the buffered output stream created - * previously. - */ - private void performDecrypt(byte[] key) - { - // initialise the cipher for decryption - cipher.init(false, new KeyParameter(key)); - - /* - * As the decryption is from our preformatted file, - * and we know that it's a hex encoded format, then - * we wrap the InputStream with a BufferedReader - * so that we can read it easily. - */ - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - - /* - * now, read the file, and output the chunks - */ - try - { - int outL; - byte[] inblock = null; - byte[] outblock = null; - String rv = null; - while ((rv = br.readLine()) != null) - { - inblock = Hex.decode(rv); - outblock = new byte[cipher.getOutputSize(inblock.length)]; - - outL = cipher.processBytes(inblock, 0, inblock.length, - outblock, 0); - /* - * Before we write anything out, we need to make sure - * that we've got something to write out. - */ - if (outL > 0) - { - out.write(outblock, 0, outL); - } - } - - try - { - /* - * Now, process the bytes that are still buffered - * within the cipher. - */ - outL = cipher.doFinal(outblock, 0); - if (outL > 0) - { - out.write(outblock, 0, outL); - } - } - catch (CryptoException ce) - { - - } - } - catch (IOException ioeread) - { - ioeread.printStackTrace(); - } - } - -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/JPAKEExample.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/JPAKEExample.java deleted file mode 100644 index 7c18b92..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/examples/JPAKEExample.java +++ /dev/null @@ -1,214 +0,0 @@ -package org.bc.crypto.examples; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.crypto.agreement.jpake.JPAKEParticipant; -import org.bc.crypto.agreement.jpake.JPAKEPrimeOrderGroup; -import org.bc.crypto.agreement.jpake.JPAKEPrimeOrderGroups; -import org.bc.crypto.agreement.jpake.JPAKERound1Payload; -import org.bc.crypto.agreement.jpake.JPAKERound2Payload; -import org.bc.crypto.agreement.jpake.JPAKERound3Payload; -import org.bc.crypto.digests.SHA256Digest; - -/** - * An example of a J-PAKE exchange. - *

    - * - * In this example, both Alice and Bob are on the same computer (in the same JVM, in fact). - * In reality, Alice and Bob would be in different locations, - * and would be sending their generated payloads to each other. - */ -public class JPAKEExample -{ - - public static void main(String args[]) throws CryptoException - { - /* - * Initialization - * - * Pick an appropriate prime order group to use throughout the exchange. - * Note that both participants must use the same group. - */ - JPAKEPrimeOrderGroup group = JPAKEPrimeOrderGroups.NIST_3072; - - BigInteger p = group.getP(); - BigInteger q = group.getQ(); - BigInteger g = group.getG(); - - String alicePassword = "password"; - String bobPassword = "password"; - - System.out.println("********* Initialization **********"); - System.out.println("Public parameters for the cyclic group:"); - System.out.println("p (" + p.bitLength() + " bits): " + p.toString(16)); - System.out.println("q (" + q.bitLength() + " bits): " + q.toString(16)); - System.out.println("g (" + p.bitLength() + " bits): " + g.toString(16)); - System.out.println("p mod q = " + p.mod(q).toString(16)); - System.out.println("g^{q} mod p = " + g.modPow(q, p).toString(16)); - System.out.println(""); - - System.out.println("(Secret passwords used by Alice and Bob: " + - "\"" + alicePassword + "\" and \"" + bobPassword + "\")\n"); - - /* - * Both participants must use the same hashing algorithm. - */ - Digest digest = new SHA256Digest(); - SecureRandom random = new SecureRandom(); - - JPAKEParticipant alice = new JPAKEParticipant("alice", alicePassword.toCharArray(), group, digest, random); - JPAKEParticipant bob = new JPAKEParticipant("bob", bobPassword.toCharArray(), group, digest, random); - - /* - * Round 1 - * - * Alice and Bob each generate a round 1 payload, and send it to each other. - */ - - JPAKERound1Payload aliceRound1Payload = alice.createRound1PayloadToSend(); - JPAKERound1Payload bobRound1Payload = bob.createRound1PayloadToSend(); - - System.out.println("************ Round 1 **************"); - System.out.println("Alice sends to Bob: "); - System.out.println("g^{x1}=" + aliceRound1Payload.getGx1().toString(16)); - System.out.println("g^{x2}=" + aliceRound1Payload.getGx2().toString(16)); - System.out.println("KP{x1}={" + aliceRound1Payload.getKnowledgeProofForX1()[0].toString(16) + "};{" + aliceRound1Payload.getKnowledgeProofForX1()[1].toString(16) + "}"); - System.out.println("KP{x2}={" + aliceRound1Payload.getKnowledgeProofForX2()[0].toString(16) + "};{" + aliceRound1Payload.getKnowledgeProofForX2()[1].toString(16) + "}"); - System.out.println(""); - - System.out.println("Bob sends to Alice: "); - System.out.println("g^{x3}=" + bobRound1Payload.getGx1().toString(16)); - System.out.println("g^{x4}=" + bobRound1Payload.getGx2().toString(16)); - System.out.println("KP{x3}={" + bobRound1Payload.getKnowledgeProofForX1()[0].toString(16) + "};{" + bobRound1Payload.getKnowledgeProofForX1()[1].toString(16) + "}"); - System.out.println("KP{x4}={" + bobRound1Payload.getKnowledgeProofForX2()[0].toString(16) + "};{" + bobRound1Payload.getKnowledgeProofForX2()[1].toString(16) + "}"); - System.out.println(""); - - /* - * Each participant must then validate the received payload for round 1 - */ - - alice.validateRound1PayloadReceived(bobRound1Payload); - System.out.println("Alice checks g^{x4}!=1: OK"); - System.out.println("Alice checks KP{x3}: OK"); - System.out.println("Alice checks KP{x4}: OK"); - System.out.println(""); - - bob.validateRound1PayloadReceived(aliceRound1Payload); - System.out.println("Bob checks g^{x2}!=1: OK"); - System.out.println("Bob checks KP{x1},: OK"); - System.out.println("Bob checks KP{x2},: OK"); - System.out.println(""); - - /* - * Round 2 - * - * Alice and Bob each generate a round 2 payload, and send it to each other. - */ - - JPAKERound2Payload aliceRound2Payload = alice.createRound2PayloadToSend(); - JPAKERound2Payload bobRound2Payload = bob.createRound2PayloadToSend(); - - System.out.println("************ Round 2 **************"); - System.out.println("Alice sends to Bob: "); - System.out.println("A=" + aliceRound2Payload.getA().toString(16)); - System.out.println("KP{x2*s}={" + aliceRound2Payload.getKnowledgeProofForX2s()[0].toString(16) + "},{" + aliceRound2Payload.getKnowledgeProofForX2s()[1].toString(16) + "}"); - System.out.println(""); - - System.out.println("Bob sends to Alice"); - System.out.println("B=" + bobRound2Payload.getA().toString(16)); - System.out.println("KP{x4*s}={" + bobRound2Payload.getKnowledgeProofForX2s()[0].toString(16) + "},{" + bobRound2Payload.getKnowledgeProofForX2s()[1].toString(16) + "}"); - System.out.println(""); - - /* - * Each participant must then validate the received payload for round 2 - */ - - alice.validateRound2PayloadReceived(bobRound2Payload); - System.out.println("Alice checks KP{x4*s}: OK\n"); - - bob.validateRound2PayloadReceived(aliceRound2Payload); - System.out.println("Bob checks KP{x2*s}: OK\n"); - - /* - * After round 2, each participant computes the keying material. - */ - - BigInteger aliceKeyingMaterial = alice.calculateKeyingMaterial(); - BigInteger bobKeyingMaterial = bob.calculateKeyingMaterial(); - - System.out.println("********* After round 2 ***********"); - System.out.println("Alice computes key material \t K=" + aliceKeyingMaterial.toString(16)); - System.out.println("Bob computes key material \t K=" + bobKeyingMaterial.toString(16)); - System.out.println(); - - - /* - * You must derive a session key from the keying material applicable - * to whatever encryption algorithm you want to use. - */ - - BigInteger aliceKey = deriveSessionKey(aliceKeyingMaterial); - BigInteger bobKey = deriveSessionKey(bobKeyingMaterial); - - /* - * At this point, you can stop and use the session keys if you want. - * This is implicit key confirmation. - * - * If you want to explicitly confirm that the key material matches, - * you can continue on and perform round 3. - */ - - /* - * Round 3 - * - * Alice and Bob each generate a round 3 payload, and send it to each other. - */ - - JPAKERound3Payload aliceRound3Payload = alice.createRound3PayloadToSend(aliceKeyingMaterial); - JPAKERound3Payload bobRound3Payload = bob.createRound3PayloadToSend(bobKeyingMaterial); - - System.out.println("************ Round 3 **************"); - System.out.println("Alice sends to Bob: "); - System.out.println("MacTag=" + aliceRound3Payload.getMacTag().toString(16)); - System.out.println(""); - System.out.println("Bob sends to Alice: "); - System.out.println("MacTag=" + bobRound3Payload.getMacTag().toString(16)); - System.out.println(""); - - /* - * Each participant must then validate the received payload for round 3 - */ - - alice.validateRound3PayloadReceived(bobRound3Payload, aliceKeyingMaterial); - System.out.println("Alice checks MacTag: OK\n"); - - bob.validateRound3PayloadReceived(aliceRound3Payload, bobKeyingMaterial); - System.out.println("Bob checks MacTag: OK\n"); - - System.out.println(); - System.out.println("MacTags validated, therefore the keying material matches."); - } - - private static BigInteger deriveSessionKey(BigInteger keyingMaterial) - { - /* - * You should use a secure key derivation function (KDF) to derive the session key. - * - * For the purposes of this example, I'm just going to use a hash of the keying material. - */ - SHA256Digest digest = new SHA256Digest(); - - byte[] keyByteArray = keyingMaterial.toByteArray(); - - byte[] output = new byte[digest.getDigestSize()]; - - digest.update(keyByteArray, 0, keyByteArray.length); - - digest.doFinal(output, 0); - - return new BigInteger(output); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/BaseKDFBytesGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/BaseKDFBytesGenerator.java deleted file mode 100644 index b355253..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/BaseKDFBytesGenerator.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.DataLengthException; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.DerivationParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.ISO18033KDFParameters; -import org.bc.crypto.params.KDFParameters; - -/** - * Basic KDF generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033 - *
    - * This implementation is based on ISO 18033/P1363a. - */ -public class BaseKDFBytesGenerator - implements DerivationFunction -{ - private int counterStart; - private Digest digest; - private byte[] shared; - private byte[] iv; - - /** - * Construct a KDF Parameters generator. - *

    - * @param counterStart value of counter. - * @param digest the digest to be used as the source of derived keys. - */ - protected BaseKDFBytesGenerator( - int counterStart, - Digest digest) - { - this.counterStart = counterStart; - this.digest = digest; - } - - public void init( - DerivationParameters param) - { - if (param instanceof KDFParameters) - { - KDFParameters p = (KDFParameters)param; - - shared = p.getSharedSecret(); - iv = p.getIV(); - } - else if (param instanceof ISO18033KDFParameters) - { - ISO18033KDFParameters p = (ISO18033KDFParameters)param; - - shared = p.getSeed(); - iv = null; - } - else - { - throw new IllegalArgumentException("KDF parameters required for KDF2Generator"); - } - } - - /** - * return the underlying digest. - */ - public Digest getDigest() - { - return digest; - } - - /** - * fill len bytes of the output buffer with bytes generated from - * the derivation function. - * - * @throws IllegalArgumentException if the size of the request will cause an overflow. - * @throws DataLengthException if the out buffer is too small. - */ - public int generateBytes( - byte[] out, - int outOff, - int len) - throws DataLengthException, IllegalArgumentException - { - if ((out.length - len) < outOff) - { - throw new DataLengthException("output buffer too small"); - } - - long oBytes = len; - int outLen = digest.getDigestSize(); - - // - // this is at odds with the standard implementation, the - // maximum value should be hBits * (2^32 - 1) where hBits - // is the digest output size in bits. We can't have an - // array with a long index at the moment... - // - if (oBytes > ((2L << 32) - 1)) - { - throw new IllegalArgumentException("Output length too large"); - } - - int cThreshold = (int)((oBytes + outLen - 1) / outLen); - - byte[] dig = null; - - dig = new byte[digest.getDigestSize()]; - - int counter = counterStart; - - for (int i = 0; i < cThreshold; i++) - { - digest.update(shared, 0, shared.length); - - digest.update((byte)(counter >> 24)); - digest.update((byte)(counter >> 16)); - digest.update((byte)(counter >> 8)); - digest.update((byte)counter); - - if (iv != null) - { - digest.update(iv, 0, iv.length); - } - - digest.doFinal(dig, 0); - - if (len > outLen) - { - System.arraycopy(dig, 0, out, outOff, outLen); - outOff += outLen; - len -= outLen; - } - else - { - System.arraycopy(dig, 0, out, outOff, len); - } - - counter++; - } - - digest.reset(); - - return len; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESKeyGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESKeyGenerator.java deleted file mode 100644 index 0e61fe8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESKeyGenerator.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherKeyGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DESParameters; - -public class DESKeyGenerator - extends CipherKeyGenerator -{ - /** - * initialise the key generator - if strength is set to zero - * the key generated will be 64 bits in size, otherwise - * strength can be 64 or 56 bits (if you don't count the parity bits). - * - * @param param the parameters to be used for key generation - */ - public void init( - KeyGenerationParameters param) - { - super.init(param); - - if (strength == 0 || strength == (56 / 8)) - { - strength = DESParameters.DES_KEY_LENGTH; - } - else if (strength != DESParameters.DES_KEY_LENGTH) - { - throw new IllegalArgumentException("DES key must be " - + (DESParameters.DES_KEY_LENGTH * 8) - + " bits long."); - } - } - - public byte[] generateKey() - { - byte[] newKey = new byte[DESParameters.DES_KEY_LENGTH]; - - do - { - random.nextBytes(newKey); - - DESParameters.setOddParity(newKey); - } - while (DESParameters.isWeakKey(newKey, 0)); - - return newKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESedeKeyGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESedeKeyGenerator.java deleted file mode 100644 index a511bb9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DESedeKeyGenerator.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DESedeParameters; - -public class DESedeKeyGenerator - extends DESKeyGenerator -{ - /** - * initialise the key generator - if strength is set to zero - * the key generated will be 192 bits in size, otherwise - * strength can be 128 or 192 (or 112 or 168 if you don't count - * parity bits), depending on whether you wish to do 2-key or 3-key - * triple DES. - * - * @param param the parameters to be used for key generation - */ - public void init( - KeyGenerationParameters param) - { - this.random = param.getRandom(); - this.strength = (param.getStrength() + 7) / 8; - - if (strength == 0 || strength == (168 / 8)) - { - strength = DESedeParameters.DES_EDE_KEY_LENGTH; - } - else if (strength == (112 / 8)) - { - strength = 2 * DESedeParameters.DES_KEY_LENGTH; - } - else if (strength != DESedeParameters.DES_EDE_KEY_LENGTH - && strength != (2 * DESedeParameters.DES_KEY_LENGTH)) - { - throw new IllegalArgumentException("DESede key must be " - + (DESedeParameters.DES_EDE_KEY_LENGTH * 8) + " or " - + (2 * 8 * DESedeParameters.DES_KEY_LENGTH) - + " bits long."); - } - } - - public byte[] generateKey() - { - byte[] newKey = new byte[strength]; - - do - { - random.nextBytes(newKey); - - DESedeParameters.setOddParity(newKey); - } - while (DESedeParameters.isWeakKey(newKey, 0, newKey.length)); - - return newKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHBasicKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHBasicKeyPairGenerator.java deleted file mode 100644 index 32b59ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHBasicKeyPairGenerator.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DHKeyGenerationParameters; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; - -import java.math.BigInteger; - -/** - * a basic Diffie-Hellman key pair generator. - * - * This generates keys consistent for use with the basic algorithm for - * Diffie-Hellman. - */ -public class DHBasicKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private DHKeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (DHKeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.INSTANCE; - DHParameters dhp = param.getParameters(); - - BigInteger x = helper.calculatePrivate(dhp, param.getRandom()); - BigInteger y = helper.calculatePublic(dhp, x); - - return new AsymmetricCipherKeyPair( - new DHPublicKeyParameters(y, dhp), - new DHPrivateKeyParameters(x, dhp)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyGeneratorHelper.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyGeneratorHelper.java deleted file mode 100644 index 16e47a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyGeneratorHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.crypto.generators; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.params.DHParameters; -import org.bc.util.BigIntegers; - -class DHKeyGeneratorHelper -{ - static final DHKeyGeneratorHelper INSTANCE = new DHKeyGeneratorHelper(); - - private static final BigInteger ONE = BigInteger.valueOf(1); - private static final BigInteger TWO = BigInteger.valueOf(2); - - private DHKeyGeneratorHelper() - { - } - - BigInteger calculatePrivate(DHParameters dhParams, SecureRandom random) - { - BigInteger p = dhParams.getP(); - int limit = dhParams.getL(); - - if (limit != 0) - { - return new BigInteger(limit, random).setBit(limit - 1); - } - - BigInteger min = TWO; - int m = dhParams.getM(); - if (m != 0) - { - min = ONE.shiftLeft(m - 1); - } - - BigInteger max = p.subtract(TWO); - BigInteger q = dhParams.getQ(); - if (q != null) - { - max = q.subtract(TWO); - } - - return BigIntegers.createRandomInRange(min, max, random); - } - - BigInteger calculatePublic(DHParameters dhParams, BigInteger x) - { - return dhParams.getG().modPow(x, dhParams.getP()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyPairGenerator.java deleted file mode 100644 index 16a7715..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHKeyPairGenerator.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DHKeyGenerationParameters; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; - -import java.math.BigInteger; - -/** - * a Diffie-Hellman key pair generator. - * - * This generates keys consistent for use in the MTI/A0 key agreement protocol - * as described in "Handbook of Applied Cryptography", Pages 516-519. - */ -public class DHKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private DHKeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (DHKeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.INSTANCE; - DHParameters dhp = param.getParameters(); - - BigInteger x = helper.calculatePrivate(dhp, param.getRandom()); - BigInteger y = helper.calculatePublic(dhp, x); - - return new AsymmetricCipherKeyPair( - new DHPublicKeyParameters(y, dhp), - new DHPrivateKeyParameters(x, dhp)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersGenerator.java deleted file mode 100644 index 4b3bfe9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersGenerator.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.params.DHParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; - -public class DHParametersGenerator -{ - private int size; - private int certainty; - private SecureRandom random; - - private static final BigInteger TWO = BigInteger.valueOf(2); - - /** - * Initialise the parameters generator. - * - * @param size bit length for the prime p - * @param certainty level of certainty for the prime number tests - * @param random a source of randomness - */ - public void init( - int size, - int certainty, - SecureRandom random) - { - this.size = size; - this.certainty = certainty; - this.random = random; - } - - /** - * which generates the p and g values from the given parameters, - * returning the DHParameters object. - *

    - * Note: can take a while... - */ - public DHParameters generateParameters() - { - // - // find a safe prime p where p = 2*q + 1, where p and q are prime. - // - BigInteger[] safePrimes = DHParametersHelper.generateSafePrimes(size, certainty, random); - - BigInteger p = safePrimes[0]; - BigInteger q = safePrimes[1]; - BigInteger g = DHParametersHelper.selectGenerator(p, q, random); - - return new DHParameters(p, g, q, TWO, null); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersHelper.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersHelper.java deleted file mode 100644 index 0d13c27..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DHParametersHelper.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.crypto.generators; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.util.BigIntegers; - -class DHParametersHelper -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - private static final BigInteger TWO = BigInteger.valueOf(2); - - /* - * Finds a pair of prime BigInteger's {p, q: p = 2q + 1} - * - * (see: Handbook of Applied Cryptography 4.86) - */ - static BigInteger[] generateSafePrimes(int size, int certainty, SecureRandom random) - { - BigInteger p, q; - int qLength = size - 1; - - for (;;) - { - q = new BigInteger(qLength, 2, random); - - // p <- 2q + 1 - p = q.shiftLeft(1).add(ONE); - - if (p.isProbablePrime(certainty) && (certainty <= 2 || q.isProbablePrime(certainty))) - { - break; - } - } - - return new BigInteger[] { p, q }; - } - - /* - * Select a high order element of the multiplicative group Zp* - * - * p and q must be s.t. p = 2*q + 1, where p and q are prime (see generateSafePrimes) - */ - static BigInteger selectGenerator(BigInteger p, BigInteger q, SecureRandom random) - { - BigInteger pMinusTwo = p.subtract(TWO); - BigInteger g; - - /* - * (see: Handbook of Applied Cryptography 4.80) - */ -// do -// { -// g = BigIntegers.createRandomInRange(TWO, pMinusTwo, random); -// } -// while (g.modPow(TWO, p).equals(ONE) || g.modPow(q, p).equals(ONE)); - - - /* - * RFC 2631 2.2.1.2 (and see: Handbook of Applied Cryptography 4.81) - */ - do - { - BigInteger h = BigIntegers.createRandomInRange(TWO, pMinusTwo, random); - - g = h.modPow(TWO, p); - } - while (g.equals(ONE)); - - - return g; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAKeyPairGenerator.java deleted file mode 100644 index 7ebd3d6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAKeyPairGenerator.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DSAKeyGenerationParameters; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAPrivateKeyParameters; -import org.bc.crypto.params.DSAPublicKeyParameters; -import org.bc.util.BigIntegers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * a DSA key pair generator. - * - * This generates DSA keys in line with the method described - * in FIPS 186-3 B.1 FFC Key Pair Generation. - */ -public class DSAKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - - private DSAKeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (DSAKeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - DSAParameters dsaParams = param.getParameters(); - - BigInteger x = generatePrivateKey(dsaParams.getQ(), param.getRandom()); - BigInteger y = calculatePublicKey(dsaParams.getP(), dsaParams.getG(), x); - - return new AsymmetricCipherKeyPair( - new DSAPublicKeyParameters(y, dsaParams), - new DSAPrivateKeyParameters(x, dsaParams)); - } - - private static BigInteger generatePrivateKey(BigInteger q, SecureRandom random) - { - // TODO Prefer this method? (change test cases that used fixed random) - // B.1.1 Key Pair Generation Using Extra Random Bits -// BigInteger c = new BigInteger(q.bitLength() + 64, random); -// return c.mod(q.subtract(ONE)).add(ONE); - - // B.1.2 Key Pair Generation by Testing Candidates - return BigIntegers.createRandomInRange(ONE, q.subtract(ONE), random); - } - - private static BigInteger calculatePublicKey(BigInteger p, BigInteger g, BigInteger x) - { - return g.modPow(x, p); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAParametersGenerator.java deleted file mode 100644 index 7451e22..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSAParametersGenerator.java +++ /dev/null @@ -1,337 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAValidationParameters; -import org.bc.util.Arrays; -import org.bc.util.BigIntegers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -// TODO Update javadoc to mention FIPS 186-3 when done -/** - * generate suitable parameters for DSA, in line with FIPS 186-2. - */ -public class DSAParametersGenerator -{ - private int L, N; - private int certainty; - private SecureRandom random; - - private static final BigInteger ZERO = BigInteger.valueOf(0); - private static final BigInteger ONE = BigInteger.valueOf(1); - private static final BigInteger TWO = BigInteger.valueOf(2); - - /** - * initialise the key generator. - * - * @param size size of the key (range 2^512 -> 2^1024 - 64 bit increments) - * @param certainty measure of robustness of prime (for FIPS 186-2 compliance this should be at least 80). - * @param random random byte source. - */ - public void init( - int size, - int certainty, - SecureRandom random) - { - init(size, getDefaultN(size), certainty, random); - } - - // TODO Make public to enable support for DSA keys > 1024 bits - private void init( - int L, - int N, - int certainty, - SecureRandom random) - { - // TODO Check that the (L, N) pair is in the list of acceptable (L, N pairs) (see Section 4.2) - // TODO Should we enforce the minimum 'certainty' values as per C.3 Table C.1? - - this.L = L; - this.N = N; - this.certainty = certainty; - this.random = random; - } - - /** - * which generates the p and g values from the given parameters, - * returning the DSAParameters object. - *

    - * Note: can take a while... - */ - public DSAParameters generateParameters() - { - return L > 1024 - ? generateParameters_FIPS186_3() - : generateParameters_FIPS186_2(); - } - - private DSAParameters generateParameters_FIPS186_2() - { - byte[] seed = new byte[20]; - byte[] part1 = new byte[20]; - byte[] part2 = new byte[20]; - byte[] u = new byte[20]; - SHA1Digest sha1 = new SHA1Digest(); - int n = (L - 1) / 160; - byte[] w = new byte[L / 8]; - - for (;;) - { - random.nextBytes(seed); - - hash(sha1, seed, part1); - System.arraycopy(seed, 0, part2, 0, seed.length); - inc(part2); - hash(sha1, part2, part2); - - for (int i = 0; i != u.length; i++) - { - u[i] = (byte)(part1[i] ^ part2[i]); - } - - u[0] |= (byte)0x80; - u[19] |= (byte)0x01; - - BigInteger q = new BigInteger(1, u); - - if (!q.isProbablePrime(certainty)) - { - continue; - } - - byte[] offset = Arrays.clone(seed); - inc(offset); - - for (int counter = 0; counter < 4096; ++counter) - { - for (int k = 0; k < n; k++) - { - inc(offset); - hash(sha1, offset, part1); - System.arraycopy(part1, 0, w, w.length - (k + 1) * part1.length, part1.length); - } - - inc(offset); - hash(sha1, offset, part1); - System.arraycopy(part1, part1.length - ((w.length - (n) * part1.length)), w, 0, w.length - n * part1.length); - - w[0] |= (byte)0x80; - - BigInteger x = new BigInteger(1, w); - - BigInteger c = x.mod(q.shiftLeft(1)); - - BigInteger p = x.subtract(c.subtract(ONE)); - - if (p.bitLength() != L) - { - continue; - } - - if (p.isProbablePrime(certainty)) - { - BigInteger g = calculateGenerator_FIPS186_2(p, q, random); - - return new DSAParameters(p, q, g, new DSAValidationParameters(seed, counter)); - } - } - } - } - - private static BigInteger calculateGenerator_FIPS186_2(BigInteger p, BigInteger q, SecureRandom r) - { - BigInteger e = p.subtract(ONE).divide(q); - BigInteger pSub2 = p.subtract(TWO); - - for (;;) - { - BigInteger h = BigIntegers.createRandomInRange(TWO, pSub2, r); - BigInteger g = h.modPow(e, p); - if (g.bitLength() > 1) - { - return g; - } - } - } - - /** - * generate suitable parameters for DSA, in line with - * FIPS 186-3 A.1 Generation of the FFC Primes p and q. - */ - private DSAParameters generateParameters_FIPS186_3() - { -// A.1.1.2 Generation of the Probable Primes p and q Using an Approved Hash Function - // FIXME This should be configurable (digest size in bits must be >= N) - Digest d = new SHA256Digest(); - int outlen = d.getDigestSize() * 8; - -// 1. Check that the (L, N) pair is in the list of acceptable (L, N pairs) (see Section 4.2). If -// the pair is not in the list, then return INVALID. - // Note: checked at initialisation - -// 2. If (seedlen < N), then return INVALID. - // FIXME This should be configurable (must be >= N) - int seedlen = N; - byte[] seed = new byte[seedlen / 8]; - -// 3. n = ceiling(L ⁄ outlen) – 1. - int n = (L - 1) / outlen; - -// 4. b = L – 1 – (n ∗ outlen). - int b = (L - 1) % outlen; - - byte[] output = new byte[d.getDigestSize()]; - for (;;) - { -// 5. Get an arbitrary sequence of seedlen bits as the domain_parameter_seed. - random.nextBytes(seed); - -// 6. U = Hash (domain_parameter_seed) mod 2^(N–1). - hash(d, seed, output); - BigInteger U = new BigInteger(1, output).mod(ONE.shiftLeft(N - 1)); - -// 7. q = 2^(N–1) + U + 1 – ( U mod 2). - BigInteger q = ONE.shiftLeft(N - 1).add(U).add(ONE).subtract(U.mod(TWO)); - -// 8. Test whether or not q is prime as specified in Appendix C.3. - // TODO Review C.3 for primality checking - if (!q.isProbablePrime(certainty)) - { -// 9. If q is not a prime, then go to step 5. - continue; - } - -// 10. offset = 1. - // Note: 'offset' value managed incrementally - byte[] offset = Arrays.clone(seed); - -// 11. For counter = 0 to (4L – 1) do - int counterLimit = 4 * L; - for (int counter = 0; counter < counterLimit; ++counter) - { -// 11.1 For j = 0 to n do -// Vj = Hash ((domain_parameter_seed + offset + j) mod 2^seedlen). -// 11.2 W = V0 + (V1 ∗ 2^outlen) + ... + (V^(n–1) ∗ 2^((n–1) ∗ outlen)) + ((Vn mod 2^b) ∗ 2^(n ∗ outlen)). - // TODO Assemble w as a byte array - BigInteger W = ZERO; - for (int j = 0, exp = 0; j <= n; ++j, exp += outlen) - { - inc(offset); - hash(d, offset, output); - - BigInteger Vj = new BigInteger(1, output); - if (j == n) - { - Vj = Vj.mod(ONE.shiftLeft(b)); - } - - W = W.add(Vj.shiftLeft(exp)); - } - -// 11.3 X = W + 2^(L–1). Comment: 0 ≤ W < 2L–1; hence, 2L–1 ≤ X < 2L. - BigInteger X = W.add(ONE.shiftLeft(L - 1)); - -// 11.4 c = X mod 2q. - BigInteger c = X.mod(q.shiftLeft(1)); - -// 11.5 p = X - (c - 1). Comment: p ≡ 1 (mod 2q). - BigInteger p = X.subtract(c.subtract(ONE)); - -// 11.6 If (p < 2^(L - 1)), then go to step 11.9 - if (p.bitLength() != L) - { - continue; - } - -// 11.7 Test whether or not p is prime as specified in Appendix C.3. - // TODO Review C.3 for primality checking - if (p.isProbablePrime(certainty)) - { -// 11.8 If p is determined to be prime, then return VALID and the values of p, q and -// (optionally) the values of domain_parameter_seed and counter. - // TODO Make configurable (8-bit unsigned)? -// int index = 1; -// BigInteger g = calculateGenerator_FIPS186_3_Verifiable(d, p, q, seed, index); -// if (g != null) -// { -// // TODO Should 'index' be a part of the validation parameters? -// return new DSAParameters(p, q, g, new DSAValidationParameters(seed, counter)); -// } - - BigInteger g = calculateGenerator_FIPS186_3_Unverifiable(p, q, random); - return new DSAParameters(p, q, g, new DSAValidationParameters(seed, counter)); - } - -// 11.9 offset = offset + n + 1. Comment: Increment offset; then, as part of -// the loop in step 11, increment counter; if -// counter < 4L, repeat steps 11.1 through 11.8. - // Note: 'offset' value already incremented in inner loop - } -// 12. Go to step 5. - } - } - - private static BigInteger calculateGenerator_FIPS186_3_Unverifiable(BigInteger p, BigInteger q, - SecureRandom r) - { - return calculateGenerator_FIPS186_2(p, q, r); - } - -// private static BigInteger calculateGenerator_FIPS186_3_Verifiable(Digest d, BigInteger p, BigInteger q, -// byte[] seed, int index) -// { -//// A.2.3 Verifiable Canonical Generation of the Generator g -// BigInteger e = p.subtract(ONE).divide(q); -// byte[] ggen = Hex.decode("6767656E"); -// -// // 7. U = domain_parameter_seed || "ggen" || index || count. -// byte[] U = new byte[seed.length + ggen.length + 1 + 2]; -// System.arraycopy(seed, 0, U, 0, seed.length); -// System.arraycopy(ggen, 0, U, seed.length, ggen.length); -// U[U.length - 3] = (byte)index; -// -// byte[] w = new byte[d.getDigestSize()]; -// for (int count = 1; count < (1 << 16); ++count) -// { -// inc(U); -// hash(d, U, w); -// BigInteger W = new BigInteger(1, w); -// BigInteger g = W.modPow(e, p); -// if (g.compareTo(TWO) >= 0) -// { -// return g; -// } -// } -// -// return null; -// } - - private static void hash(Digest d, byte[] input, byte[] output) - { - d.update(input, 0, input.length); - d.doFinal(output, 0); - } - - private static int getDefaultN(int L) - { - return L > 1024 ? 256 : 160; - } - - private static void inc(byte[] buf) - { - for (int i = buf.length - 1; i >= 0; --i) - { - byte b = (byte)((buf[i] + 1) & 0xff); - buf[i] = b; - - if (b != 0) - { - break; - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSTU4145KeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSTU4145KeyPairGenerator.java deleted file mode 100644 index 3673444..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/DSTU4145KeyPairGenerator.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; - -public class DSTU4145KeyPairGenerator - extends ECKeyPairGenerator -{ - public AsymmetricCipherKeyPair generateKeyPair() - { - AsymmetricCipherKeyPair pair = super.generateKeyPair(); - - ECPublicKeyParameters pub = (ECPublicKeyParameters)pair.getPublic(); - ECPrivateKeyParameters priv = (ECPrivateKeyParameters)pair.getPrivate(); - - pub = new ECPublicKeyParameters(pub.getQ().negate(), pub.getParameters()); - - return new AsymmetricCipherKeyPair(pub, priv); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ECKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ECKeyPairGenerator.java deleted file mode 100644 index 49fab98..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ECKeyPairGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bc.crypto.generators; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECKeyGenerationParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECPoint; - -public class ECKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator, ECConstants -{ - ECDomainParameters params; - SecureRandom random; - - public void init( - KeyGenerationParameters param) - { - ECKeyGenerationParameters ecP = (ECKeyGenerationParameters)param; - - this.random = ecP.getRandom(); - this.params = ecP.getDomainParameters(); - } - - /** - * Given the domain parameters this routine generates an EC key - * pair in accordance with X9.62 section 5.2.1 pages 26, 27. - */ - public AsymmetricCipherKeyPair generateKeyPair() - { - BigInteger n = params.getN(); - int nBitLength = n.bitLength(); - BigInteger d; - - do - { - d = new BigInteger(nBitLength, random); - } - while (d.equals(ZERO) || (d.compareTo(n) >= 0)); - - ECPoint Q = params.getG().multiply(d); - - return new AsymmetricCipherKeyPair( - new ECPublicKeyParameters(Q, params), - new ECPrivateKeyParameters(d, params)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalKeyPairGenerator.java deleted file mode 100644 index bb6d1e6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalKeyPairGenerator.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.bc.crypto.generators; - -import java.math.BigInteger; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.ElGamalKeyGenerationParameters; -import org.bc.crypto.params.ElGamalParameters; -import org.bc.crypto.params.ElGamalPrivateKeyParameters; -import org.bc.crypto.params.ElGamalPublicKeyParameters; - -/** - * a ElGamal key pair generator. - *

    - * This generates keys consistent for use with ElGamal as described in - * page 164 of "Handbook of Applied Cryptography". - */ -public class ElGamalKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private ElGamalKeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (ElGamalKeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - DHKeyGeneratorHelper helper = DHKeyGeneratorHelper.INSTANCE; - ElGamalParameters egp = param.getParameters(); - DHParameters dhp = new DHParameters(egp.getP(), egp.getG(), null, egp.getL()); - - BigInteger x = helper.calculatePrivate(dhp, param.getRandom()); - BigInteger y = helper.calculatePublic(dhp, x); - - return new AsymmetricCipherKeyPair( - new ElGamalPublicKeyParameters(y, egp), - new ElGamalPrivateKeyParameters(x, egp)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalParametersGenerator.java deleted file mode 100644 index 7fd1d83..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/ElGamalParametersGenerator.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.params.ElGamalParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; - -public class ElGamalParametersGenerator -{ - private int size; - private int certainty; - private SecureRandom random; - - public void init( - int size, - int certainty, - SecureRandom random) - { - this.size = size; - this.certainty = certainty; - this.random = random; - } - - /** - * which generates the p and g values from the given parameters, - * returning the ElGamalParameters object. - *

    - * Note: can take a while... - */ - public ElGamalParameters generateParameters() - { - // - // find a safe prime p where p = 2*q + 1, where p and q are prime. - // - BigInteger[] safePrimes = DHParametersHelper.generateSafePrimes(size, certainty, random); - - BigInteger p = safePrimes[0]; - BigInteger q = safePrimes[1]; - BigInteger g = DHParametersHelper.selectGenerator(p, q, random); - - return new ElGamalParameters(p, g); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/EphemeralKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/EphemeralKeyPairGenerator.java deleted file mode 100644 index 8b563f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/EphemeralKeyPairGenerator.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.EphemeralKeyPair; -import org.bc.crypto.KeyEncoder; - -public class EphemeralKeyPairGenerator -{ - private AsymmetricCipherKeyPairGenerator gen; - private KeyEncoder keyEncoder; - - public EphemeralKeyPairGenerator(AsymmetricCipherKeyPairGenerator gen, KeyEncoder keyEncoder) - { - this.gen = gen; - this.keyEncoder = keyEncoder; - } - - public EphemeralKeyPair generate() - { - AsymmetricCipherKeyPair eph = gen.generateKeyPair(); - - // Encode the ephemeral public key - return new EphemeralKeyPair(eph, keyEncoder); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410KeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410KeyPairGenerator.java deleted file mode 100644 index a5cfcbf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410KeyPairGenerator.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.GOST3410KeyGenerationParameters; -import org.bc.crypto.params.GOST3410Parameters; -import org.bc.crypto.params.GOST3410PrivateKeyParameters; -import org.bc.crypto.params.GOST3410PublicKeyParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * a GOST3410 key pair generator. - * This generates GOST3410 keys in line with the method described - * in GOST R 34.10-94. - */ -public class GOST3410KeyPairGenerator - implements AsymmetricCipherKeyPairGenerator - { - private static final BigInteger ZERO = BigInteger.valueOf(0); - - private GOST3410KeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (GOST3410KeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - BigInteger p, q, a, x, y; - GOST3410Parameters GOST3410Params = param.getParameters(); - SecureRandom random = param.getRandom(); - - q = GOST3410Params.getQ(); - p = GOST3410Params.getP(); - a = GOST3410Params.getA(); - - do - { - x = new BigInteger(256, random); - } - while (x.equals(ZERO) || x.compareTo(q) >= 0); - - // - // calculate the public key. - // - y = a.modPow(x, p); - - return new AsymmetricCipherKeyPair( - new GOST3410PublicKeyParameters(y, GOST3410Params), - new GOST3410PrivateKeyParameters(x, GOST3410Params)); - } - } diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410ParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410ParametersGenerator.java deleted file mode 100644 index e0f8440..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/GOST3410ParametersGenerator.java +++ /dev/null @@ -1,541 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.params.GOST3410Parameters; -import org.bc.crypto.params.GOST3410ValidationParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * generate suitable parameters for GOST3410. - */ -public class GOST3410ParametersGenerator -{ - private int size; - private int typeproc; - private SecureRandom init_random; - - private static final BigInteger ONE = BigInteger.valueOf(1); - private static final BigInteger TWO = BigInteger.valueOf(2); - - /** - * initialise the key generator. - * - * @param size size of the key - * @param typeproc type procedure A,B = 1; A',B' - else - * @param random random byte source. - */ - public void init( - int size, - int typeproc, - SecureRandom random) - { - this.size = size; - this.typeproc = typeproc; - this.init_random = random; - } - - //Procedure A - private int procedure_A(int x0, int c, BigInteger[] pq, int size) - { - //Verify and perform condition: 065536) - { - x0 = init_random.nextInt()/32768; - } - - while((c<0 || c>65536) || (c/2==0)) - { - c = init_random.nextInt()/32768 + 1; - } - - BigInteger C = new BigInteger(Integer.toString(c)); - BigInteger constA16 = new BigInteger("19381"); - - //step1 - BigInteger[] y = new BigInteger[1]; // begin length = 1 - y[0] = new BigInteger(Integer.toString(x0)); - - //step 2 - int[] t = new int[1]; // t - orders; begin length = 1 - t[0] = size; - int s = 0; - for (int i=0; t[i]>=17; i++) - { - // extension array t - int tmp_t[] = new int[t.length + 1]; /////////////// - System.arraycopy(t,0,tmp_t,0,t.length); // extension - t = new int[tmp_t.length]; // array t - System.arraycopy(tmp_t, 0, t, 0, tmp_t.length); /////////////// - - t[i+1] = t[i]/2; - s = i+1; - } - - //step3 - BigInteger p[] = new BigInteger[s+1]; - p[s] = new BigInteger("8003",16); //set min prime number length 16 bit - - int m = s-1; //step4 - - for (int i=0; i=0) - { - break; //step 14 - } - else - { - pq[0] = p[0]; - pq[1] = p[1]; - return y[0].intValue(); //return for procedure B step 2 - } - } - } - return y[0].intValue(); - } - - //Procedure A' - private long procedure_Aa(long x0, long c, BigInteger[] pq, int size) - { - //Verify and perform condition: 04294967296L) - { - x0 = init_random.nextInt()*2; - } - - while((c<0 || c>4294967296L) || (c/2==0)) - { - c = init_random.nextInt()*2+1; - } - - BigInteger C = new BigInteger(Long.toString(c)); - BigInteger constA32 = new BigInteger("97781173"); - - //step1 - BigInteger[] y = new BigInteger[1]; // begin length = 1 - y[0] = new BigInteger(Long.toString(x0)); - - //step 2 - int[] t = new int[1]; // t - orders; begin length = 1 - t[0] = size; - int s = 0; - for (int i=0; t[i]>=33; i++) - { - // extension array t - int tmp_t[] = new int[t.length + 1]; /////////////// - System.arraycopy(t,0,tmp_t,0,t.length); // extension - t = new int[tmp_t.length]; // array t - System.arraycopy(tmp_t, 0, t, 0, tmp_t.length); /////////////// - - t[i+1] = t[i]/2; - s = i+1; - } - - //step3 - BigInteger p[] = new BigInteger[s+1]; - p[s] = new BigInteger("8000000B",16); //set min prime number length 32 bit - - int m = s-1; //step4 - - for (int i=0; i=0) - { - break; //step 14 - } - else - { - pq[0] = p[0]; - pq[1] = p[1]; - return y[0].longValue(); //return for procedure B' step 2 - } - } - } - return y[0].longValue(); - } - - //Procedure B - private void procedure_B(int x0, int c, BigInteger[] pq) - { - //Verify and perform condition: 065536) - { - x0 = init_random.nextInt()/32768; - } - - while((c<0 || c>65536) || (c/2==0)) - { - c = init_random.nextInt()/32768 + 1; - } - - BigInteger [] qp = new BigInteger[2]; - BigInteger q = null, Q = null, p = null; - BigInteger C = new BigInteger(Integer.toString(c)); - BigInteger constA16 = new BigInteger("19381"); - - //step1 - x0 = procedure_A(x0, c, qp, 256); - q = qp[0]; - - //step2 - x0 = procedure_A(x0, c, qp, 512); - Q = qp[0]; - - BigInteger[] y = new BigInteger[65]; - y[0] = new BigInteger(Integer.toString(x0)); - - int tp = 1024; - - step3: for(;;) - { - //step 3 - for (int j=0; j<64; j++) - { - y[j+1] = (y[j].multiply(constA16).add(C)).mod(TWO.pow(16)); - } - - //step 4 - BigInteger Y = new BigInteger("0"); - - for (int j=0; j<64; j++) - { - Y = Y.add(y[j].multiply(TWO.pow(16*j))); - } - - y[0] = y[64]; //step 5 - - //step 6 - BigInteger N = TWO.pow(tp-1).divide(q.multiply(Q)). - add((TWO.pow(tp-1).multiply(Y)). - divide(q.multiply(Q).multiply(TWO.pow(1024)))); - - if (N.mod(TWO).compareTo(ONE)==0) - { - N = N.add(ONE); - } - - int k = 0; //step 7 - - step8: for(;;) - { - //step 11 - p = q.multiply(Q).multiply(N.add(BigInteger.valueOf(k))).add(ONE); - - if (p.compareTo(TWO.pow(tp))==1) - { - continue step3; //step 9 - } - - //step10 - if ((TWO.modPow(q.multiply(Q).multiply(N.add(BigInteger.valueOf(k))),p).compareTo(ONE)==0) && - (TWO.modPow(q.multiply(N.add(BigInteger.valueOf(k))),p).compareTo(ONE)!=0)) - { - pq[0] = p; - pq[1] = q; - return; - } - else - { - k += 2; - continue step8; - } - } - } - } - - //Procedure B' - private void procedure_Bb(long x0, long c, BigInteger[] pq) - { - //Verify and perform condition: 04294967296L) - { - x0 = init_random.nextInt()*2; - } - - while((c<0 || c>4294967296L) || (c/2==0)) - { - c = init_random.nextInt()*2+1; - } - - BigInteger [] qp = new BigInteger[2]; - BigInteger q = null, Q = null, p = null; - BigInteger C = new BigInteger(Long.toString(c)); - BigInteger constA32 = new BigInteger("97781173"); - - //step1 - x0 = procedure_Aa(x0, c, qp, 256); - q = qp[0]; - - //step2 - x0 = procedure_Aa(x0, c, qp, 512); - Q = qp[0]; - - BigInteger[] y = new BigInteger[33]; - y[0] = new BigInteger(Long.toString(x0)); - - int tp = 1024; - - step3: for(;;) - { - //step 3 - for (int j=0; j<32; j++) - { - y[j+1] = (y[j].multiply(constA32).add(C)).mod(TWO.pow(32)); - } - - //step 4 - BigInteger Y = new BigInteger("0"); - for (int j=0; j<32; j++) - { - Y = Y.add(y[j].multiply(TWO.pow(32*j))); - } - - y[0] = y[32]; //step 5 - - //step 6 - BigInteger N = TWO.pow(tp-1).divide(q.multiply(Q)). - add((TWO.pow(tp-1).multiply(Y)). - divide(q.multiply(Q).multiply(TWO.pow(1024)))); - - if (N.mod(TWO).compareTo(ONE)==0) - { - N = N.add(ONE); - } - - int k = 0; //step 7 - - step8: for(;;) - { - //step 11 - p = q.multiply(Q).multiply(N.add(BigInteger.valueOf(k))).add(ONE); - - if (p.compareTo(TWO.pow(tp))==1) - { - continue step3; //step 9 - } - - //step10 - if ((TWO.modPow(q.multiply(Q).multiply(N.add(BigInteger.valueOf(k))),p).compareTo(ONE)==0) && - (TWO.modPow(q.multiply(N.add(BigInteger.valueOf(k))),p).compareTo(ONE)!=0)) - { - pq[0] = p; - pq[1] = q; - return; - } - else - { - k += 2; - continue step8; - } - } - } - } - - - /** - * Procedure C - * procedure generates the a value from the given p,q, - * returning the a value. - */ - private BigInteger procedure_C(BigInteger p, BigInteger q) - { - BigInteger pSub1 = p.subtract(ONE); - BigInteger pSub1DivQ = pSub1.divide(q); - int length = p.bitLength(); - - for(;;) - { - BigInteger d = new BigInteger(length, init_random); - - // 1 < d < p-1 - if (d.compareTo(ONE) > 0 && d.compareTo(pSub1) < 0) - { - BigInteger a = d.modPow(pSub1DivQ, p); - - if (a.compareTo(ONE) != 0) - { - return a; - } - } - } - } - - /** - * which generates the p , q and a values from the given parameters, - * returning the GOST3410Parameters object. - */ - public GOST3410Parameters generateParameters() - { - BigInteger [] pq = new BigInteger[2]; - BigInteger q = null, p = null, a = null; - - int x0, c; - long x0L, cL; - - if (typeproc==1) - { - x0 = init_random.nextInt(); - c = init_random.nextInt(); - - switch(size) - { - case 512: - procedure_A(x0, c, pq, 512); - break; - case 1024: - procedure_B(x0, c, pq); - break; - default: - throw new IllegalArgumentException("Ooops! key size 512 or 1024 bit."); - } - p = pq[0]; q = pq[1]; - a = procedure_C(p, q); - //System.out.println("p:"+p.toString(16)+"\n"+"q:"+q.toString(16)+"\n"+"a:"+a.toString(16)); - //System.out.println("p:"+p+"\n"+"q:"+q+"\n"+"a:"+a); - return new GOST3410Parameters(p, q, a, new GOST3410ValidationParameters(x0, c)); - } - else - { - x0L = init_random.nextLong(); - cL = init_random.nextLong(); - - switch(size) - { - case 512: - procedure_Aa(x0L, cL, pq, 512); - break; - case 1024: - procedure_Bb(x0L, cL, pq); - break; - default: - throw new IllegalStateException("Ooops! key size 512 or 1024 bit."); - } - p = pq[0]; q = pq[1]; - a = procedure_C(p, q); - //System.out.println("p:"+p.toString(16)+"\n"+"q:"+q.toString(16)+"\n"+"a:"+a.toString(16)); - //System.out.println("p:"+p+"\n"+"q:"+q+"\n"+"a:"+a); - return new GOST3410Parameters(p, q, a, new GOST3410ValidationParameters(x0L, cL)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/HKDFBytesGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/HKDFBytesGenerator.java deleted file mode 100644 index a12da72..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/HKDFBytesGenerator.java +++ /dev/null @@ -1,161 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.DataLengthException; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.DerivationParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.macs.HMac; -import org.bc.crypto.params.HKDFParameters; -import org.bc.crypto.params.KeyParameter; - -/** - * HMAC-based Extract-and-Expand Key Derivation Function (HKDF) implemented - * according to IETF RFC 5869, May 2010 as specified by H. Krawczyk, IBM - * Research & P. Eronen, Nokia. It uses a HMac internally to compute de OKM - * (output keying material) and is likely to have better security properties - * than KDF's based on just a hash function. - */ -public class HKDFBytesGenerator - implements DerivationFunction -{ - - private HMac hMacHash; - private int hashLen; - - private byte[] info; - private byte[] currentT; - - private int generatedBytes; - - /** - * Creates a HKDFBytesGenerator based on the given hash function. - * - * @param hash the digest to be used as the source of generatedBytes bytes - */ - public HKDFBytesGenerator(Digest hash) - { - this.hMacHash = new HMac(hash); - this.hashLen = hash.getDigestSize(); - } - - public void init(DerivationParameters param) - { - if (!(param instanceof HKDFParameters)) - { - throw new IllegalArgumentException( - "HKDF parameters required for HKDFBytesGenerator"); - } - - HKDFParameters params = (HKDFParameters)param; - if (params.skipExtract()) - { - // use IKM directly as PRK - hMacHash.init(new KeyParameter(params.getIKM())); - } - else - { - hMacHash.init(extract(params.getSalt(), params.getIKM())); - } - - info = params.getInfo(); - - generatedBytes = 0; - currentT = new byte[hashLen]; - } - - /** - * Performs the extract part of the key derivation function. - * - * @param salt the salt to use - * @param ikm the input keying material - * @return the PRK as KeyParameter - */ - private KeyParameter extract(byte[] salt, byte[] ikm) - { - hMacHash.init(new KeyParameter(ikm)); - if (salt == null) - { - // TODO check if hashLen is indeed same as HMAC size - hMacHash.init(new KeyParameter(new byte[hashLen])); - } - else - { - hMacHash.init(new KeyParameter(salt)); - } - - hMacHash.update(ikm, 0, ikm.length); - - byte[] prk = new byte[hashLen]; - hMacHash.doFinal(prk, 0); - return new KeyParameter(prk); - } - - /** - * Performs the expand part of the key derivation function, using currentT - * as input and output buffer. - * - * @throws DataLengthException if the total number of bytes generated is larger than the one - * specified by RFC 5869 (255 * HashLen) - */ - private void expandNext() - throws DataLengthException - { - int n = generatedBytes / hashLen + 1; - if (n >= 256) - { - throw new DataLengthException( - "HKDF cannot generate more than 255 blocks of HashLen size"); - } - // special case for T(0): T(0) is empty, so no update - if (generatedBytes != 0) - { - hMacHash.update(currentT, 0, hashLen); - } - hMacHash.update(info, 0, info.length); - hMacHash.update((byte)n); - hMacHash.doFinal(currentT, 0); - } - - public Digest getDigest() - { - return hMacHash.getUnderlyingDigest(); - } - - public int generateBytes(byte[] out, int outOff, int len) - throws DataLengthException, IllegalArgumentException - { - - if (generatedBytes + len > 255 * hashLen) - { - throw new DataLengthException( - "HKDF may only be used for 255 * HashLen bytes of output"); - } - - if (generatedBytes % hashLen == 0) - { - expandNext(); - } - - // copy what is left in the currentT (1..hash - int toGenerate = len; - int posInT = generatedBytes % hashLen; - int leftInT = hashLen - generatedBytes % hashLen; - int toCopy = Math.min(leftInT, toGenerate); - System.arraycopy(currentT, posInT, out, outOff, toCopy); - generatedBytes += toCopy; - toGenerate -= toCopy; - outOff += toCopy; - - while (toGenerate > 0) - { - expandNext(); - toCopy = Math.min(hashLen, toGenerate); - System.arraycopy(currentT, 0, out, outOff, toCopy); - generatedBytes += toCopy; - toGenerate -= toCopy; - outOff += toCopy; - } - - return len; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF1BytesGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF1BytesGenerator.java deleted file mode 100644 index 5a97f27..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF1BytesGenerator.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.Digest; - -/** - * KDF1 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033 - *
    - * This implementation is based on ISO 18033/IEEE P1363a. - */ -public class KDF1BytesGenerator - extends BaseKDFBytesGenerator -{ - /** - * Construct a KDF1 byte generator. - *

    - * @param digest the digest to be used as the source of derived keys. - */ - public KDF1BytesGenerator( - Digest digest) - { - super(0, digest); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF2BytesGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF2BytesGenerator.java deleted file mode 100644 index 3ad24c5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/KDF2BytesGenerator.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.Digest; - -/** - * KDF2 generator for derived keys and ivs as defined by IEEE P1363a/ISO 18033 - *
    - * This implementation is based on IEEE P1363/ISO 18033. - */ -public class KDF2BytesGenerator - extends BaseKDFBytesGenerator -{ - /** - * Construct a KDF2 bytes generator. Generates key material - * according to IEEE P1363 or ISO 18033 depending on the initialisation. - *

    - * @param digest the digest to be used as the source of derived keys. - */ - public KDF2BytesGenerator( - Digest digest) - { - super(1, digest); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/MGF1BytesGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/MGF1BytesGenerator.java deleted file mode 100644 index 9257dd1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/MGF1BytesGenerator.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.DataLengthException; -import org.bc.crypto.DerivationFunction; -import org.bc.crypto.DerivationParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.MGFParameters; - -/** - * Generator for MGF1 as defined in PKCS 1v2 - */ -public class MGF1BytesGenerator - implements DerivationFunction -{ - private Digest digest; - private byte[] seed; - private int hLen; - - /** - * @param digest the digest to be used as the source of generated bytes - */ - public MGF1BytesGenerator( - Digest digest) - { - this.digest = digest; - this.hLen = digest.getDigestSize(); - } - - public void init( - DerivationParameters param) - { - if (!(param instanceof MGFParameters)) - { - throw new IllegalArgumentException("MGF parameters required for MGF1Generator"); - } - - MGFParameters p = (MGFParameters)param; - - seed = p.getSeed(); - } - - /** - * return the underlying digest. - */ - public Digest getDigest() - { - return digest; - } - - /** - * int to octet string. - */ - private void ItoOSP( - int i, - byte[] sp) - { - sp[0] = (byte)(i >>> 24); - sp[1] = (byte)(i >>> 16); - sp[2] = (byte)(i >>> 8); - sp[3] = (byte)(i >>> 0); - } - - /** - * fill len bytes of the output buffer with bytes generated from - * the derivation function. - * - * @throws DataLengthException if the out buffer is too small. - */ - public int generateBytes( - byte[] out, - int outOff, - int len) - throws DataLengthException, IllegalArgumentException - { - if ((out.length - len) < outOff) - { - throw new DataLengthException("output buffer too small"); - } - - byte[] hashBuf = new byte[hLen]; - byte[] C = new byte[4]; - int counter = 0; - - digest.reset(); - - if (len > hLen) - { - do - { - ItoOSP(counter, C); - - digest.update(seed, 0, seed.length); - digest.update(C, 0, C.length); - digest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, out, outOff + counter * hLen, hLen); - } - while (++counter < (len / hLen)); - } - - if ((counter * hLen) < len) - { - ItoOSP(counter, C); - - digest.update(seed, 0, seed.length); - digest.update(C, 0, C.length); - digest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, out, outOff + counter * hLen, len - (counter * hLen)); - } - - return len; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUEncryptionKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUEncryptionKeyPairGenerator.java deleted file mode 100644 index 77bb40a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUEncryptionKeyPairGenerator.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.NTRUEncryptionKeyGenerationParameters; -import org.bc.crypto.params.NTRUEncryptionPrivateKeyParameters; -import org.bc.crypto.params.NTRUEncryptionPublicKeyParameters; -import org.bc.crypto.params.NTRUParameters; -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; -import org.bc.math.ntru.polynomial.ProductFormPolynomial; -import org.bc.math.ntru.util.Util; - -/** - * Generates key pairs.
    - * The parameter p is hardcoded to 3. - */ -public class NTRUEncryptionKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private NTRUEncryptionKeyGenerationParameters params; - - /** - * Constructs a new instance with a set of encryption parameters. - * - * @param param encryption parameters - */ - public void init(KeyGenerationParameters param) - { - this.params = (NTRUEncryptionKeyGenerationParameters)param; - } - - /** - * Generates a new encryption key pair. - * - * @return a key pair - */ - public AsymmetricCipherKeyPair generateKeyPair() - { - int N = params.N; - int q = params.q; - int df = params.df; - int df1 = params.df1; - int df2 = params.df2; - int df3 = params.df3; - int dg = params.dg; - boolean fastFp = params.fastFp; - boolean sparse = params.sparse; - - Polynomial t; - IntegerPolynomial fq; - IntegerPolynomial fp = null; - - // choose a random f that is invertible mod 3 and q - while (true) - { - IntegerPolynomial f; - - // choose random t, calculate f and fp - if (fastFp) - { - // if fastFp=true, f is always invertible mod 3 - t = params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? Util.generateRandomTernary(N, df, df, sparse, params.getRandom()) : ProductFormPolynomial.generateRandom(N, df1, df2, df3, df3, params.getRandom()); - f = t.toIntegerPolynomial(); - f.mult(3); - f.coeffs[0] += 1; - } - else - { - t = params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? Util.generateRandomTernary(N, df, df - 1, sparse, params.getRandom()) : ProductFormPolynomial.generateRandom(N, df1, df2, df3, df3 - 1, params.getRandom()); - f = t.toIntegerPolynomial(); - fp = f.invertF3(); - if (fp == null) - { - continue; - } - } - - fq = f.invertFq(q); - if (fq == null) - { - continue; - } - break; - } - - // if fastFp=true, fp=1 - if (fastFp) - { - fp = new IntegerPolynomial(N); - fp.coeffs[0] = 1; - } - - // choose a random g that is invertible mod q - DenseTernaryPolynomial g; - while (true) - { - g = DenseTernaryPolynomial.generateRandom(N, dg, dg - 1, params.getRandom()); - if (g.invertFq(q) != null) - { - break; - } - } - - IntegerPolynomial h = g.mult(fq, q); - h.mult3(q); - h.ensurePositive(q); - g.clear(); - fq.clear(); - - NTRUEncryptionPrivateKeyParameters priv = new NTRUEncryptionPrivateKeyParameters(h, t, fp, params.getEncryptionParameters()); - NTRUEncryptionPublicKeyParameters pub = new NTRUEncryptionPublicKeyParameters(h, params.getEncryptionParameters()); - return new AsymmetricCipherKeyPair(pub, priv); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUSigningKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUSigningKeyPairGenerator.java deleted file mode 100644 index 4ebe4be..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NTRUSigningKeyPairGenerator.java +++ /dev/null @@ -1,361 +0,0 @@ -package org.bc.crypto.generators; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.NTRUParameters; -import org.bc.crypto.params.NTRUSigningKeyGenerationParameters; -import org.bc.crypto.params.NTRUSigningPrivateKeyParameters; -import org.bc.crypto.params.NTRUSigningPublicKeyParameters; -import org.bc.math.ntru.euclid.BigIntEuclidean; -import org.bc.math.ntru.polynomial.BigDecimalPolynomial; -import org.bc.math.ntru.polynomial.BigIntPolynomial; -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; -import org.bc.math.ntru.polynomial.ProductFormPolynomial; -import org.bc.math.ntru.polynomial.Resultant; - -import static java.math.BigInteger.ONE; -import static java.math.BigInteger.ZERO; - -public class NTRUSigningKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private NTRUSigningKeyGenerationParameters params; - - public void init(KeyGenerationParameters param) - { - this.params = (NTRUSigningKeyGenerationParameters)param; - } - - /** - * Generates a new signature key pair. Starts B+1 threads. - * - * @return a key pair - */ - public AsymmetricCipherKeyPair generateKeyPair() - { - NTRUSigningPublicKeyParameters pub = null; - ExecutorService executor = Executors.newCachedThreadPool(); - List> bases = new ArrayList>(); - for (int k = params.B; k >= 0; k--) - { - bases.add(executor.submit(new BasisGenerationTask())); - } - executor.shutdown(); - - List basises = new ArrayList(); - - for (int k = params.B; k >= 0; k--) - { - Future basis = bases.get(k); - try - { - basises.add(basis.get()); - if (k == params.B) - { - pub = new NTRUSigningPublicKeyParameters(basis.get().h, params.getSigningParameters()); - } - } - catch (Exception e) - { - throw new IllegalStateException(e); - } - } - NTRUSigningPrivateKeyParameters priv = new NTRUSigningPrivateKeyParameters(basises, pub); - AsymmetricCipherKeyPair kp = new AsymmetricCipherKeyPair(pub, priv); - return kp; - } - - /** - * Generates a new signature key pair. Runs in a single thread. - * - * @return a key pair - */ - public AsymmetricCipherKeyPair generateKeyPairSingleThread() - { - List basises = new ArrayList(); - NTRUSigningPublicKeyParameters pub = null; - for (int k = params.B; k >= 0; k--) - { - NTRUSigningPrivateKeyParameters.Basis basis = generateBoundedBasis(); - basises.add(basis); - if (k == 0) - { - pub = new NTRUSigningPublicKeyParameters(basis.h, params.getSigningParameters()); - } - } - NTRUSigningPrivateKeyParameters priv = new NTRUSigningPrivateKeyParameters(basises, pub); - return new AsymmetricCipherKeyPair(pub, priv); - } - - - /** - * Implementation of the optional steps 20 through 26 in EESS1v2.pdf, section 3.5.1.1. - * This doesn't seem to have much of an effect and sometimes actually increases the - * norm of F, but on average it slightly reduces the norm.
    - * This method changes F and g but leaves f and - * g unchanged. - * - * @param f - * @param g - * @param F - * @param G - * @param N - */ - private void minimizeFG(IntegerPolynomial f, IntegerPolynomial g, IntegerPolynomial F, IntegerPolynomial G, int N) - { - int E = 0; - for (int j = 0; j < N; j++) - { - E += 2 * N * (f.coeffs[j] * f.coeffs[j] + g.coeffs[j] * g.coeffs[j]); - } - - // [f(1)+g(1)]^2 = 4 - E -= 4; - - IntegerPolynomial u = (IntegerPolynomial)f.clone(); - IntegerPolynomial v = (IntegerPolynomial)g.clone(); - int j = 0; - int k = 0; - int maxAdjustment = N; - while (k < maxAdjustment && j < N) - { - int D = 0; - int i = 0; - while (i < N) - { - int D1 = F.coeffs[i] * f.coeffs[i]; - int D2 = G.coeffs[i] * g.coeffs[i]; - int D3 = 4 * N * (D1 + D2); - D += D3; - i++; - } - // f(1)+g(1) = 2 - int D1 = 4 * (F.sumCoeffs() + G.sumCoeffs()); - D -= D1; - - if (D > E) - { - F.sub(u); - G.sub(v); - k++; - j = 0; - } - else if (D < -E) - { - F.add(u); - G.add(v); - k++; - j = 0; - } - j++; - u.rotate1(); - v.rotate1(); - } - } - - /** - * Creates a NTRUSigner basis consisting of polynomials f, g, F, G, h.
    - * If KeyGenAlg=FLOAT, the basis may not be valid and this method must be rerun if that is the case.
    - * - * @see #generateBoundedBasis() - */ - private FGBasis generateBasis() - { - int N = params.N; - int q = params.q; - int d = params.d; - int d1 = params.d1; - int d2 = params.d2; - int d3 = params.d3; - int basisType = params.basisType; - - Polynomial f; - IntegerPolynomial fInt; - Polynomial g; - IntegerPolynomial gInt; - IntegerPolynomial fq; - Resultant rf; - Resultant rg; - BigIntEuclidean r; - - int _2n1 = 2 * N + 1; - boolean primeCheck = params.primeCheck; - - do - { - do - { - f = params.polyType== NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? DenseTernaryPolynomial.generateRandom(N, d + 1, d, new SecureRandom()) : ProductFormPolynomial.generateRandom(N, d1, d2, d3 + 1, d3, new SecureRandom()); - fInt = f.toIntegerPolynomial(); - } - while (primeCheck && fInt.resultant(_2n1).res.equals(ZERO)); - fq = fInt.invertFq(q); - } - while (fq == null); - rf = fInt.resultant(); - - do - { - do - { - do - { - g = params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? DenseTernaryPolynomial.generateRandom(N, d + 1, d, new SecureRandom()) : ProductFormPolynomial.generateRandom(N, d1, d2, d3 + 1, d3, new SecureRandom()); - gInt = g.toIntegerPolynomial(); - } - while (primeCheck && gInt.resultant(_2n1).res.equals(ZERO)); - } - while (gInt.invertFq(q) == null); - rg = gInt.resultant(); - r = BigIntEuclidean.calculate(rf.res, rg.res); - } - while (!r.gcd.equals(ONE)); - - BigIntPolynomial A = (BigIntPolynomial)rf.rho.clone(); - A.mult(r.x.multiply(BigInteger.valueOf(q))); - BigIntPolynomial B = (BigIntPolynomial)rg.rho.clone(); - B.mult(r.y.multiply(BigInteger.valueOf(-q))); - - BigIntPolynomial C; - if (params.keyGenAlg == NTRUSigningKeyGenerationParameters.KEY_GEN_ALG_RESULTANT) - { - int[] fRevCoeffs = new int[N]; - int[] gRevCoeffs = new int[N]; - fRevCoeffs[0] = fInt.coeffs[0]; - gRevCoeffs[0] = gInt.coeffs[0]; - for (int i = 1; i < N; i++) - { - fRevCoeffs[i] = fInt.coeffs[N - i]; - gRevCoeffs[i] = gInt.coeffs[N - i]; - } - IntegerPolynomial fRev = new IntegerPolynomial(fRevCoeffs); - IntegerPolynomial gRev = new IntegerPolynomial(gRevCoeffs); - - IntegerPolynomial t = f.mult(fRev); - t.add(g.mult(gRev)); - Resultant rt = t.resultant(); - C = fRev.mult(B); // fRev.mult(B) is actually faster than new SparseTernaryPolynomial(fRev).mult(B), possibly due to cache locality? - C.add(gRev.mult(A)); - C = C.mult(rt.rho); - C.div(rt.res); - } - else - { // KeyGenAlg.FLOAT - // calculate ceil(log10(N)) - int log10N = 0; - for (int i = 1; i < N; i *= 10) - { - log10N++; - } - - // * Cdec needs to be accurate to 1 decimal place so it can be correctly rounded; - // * fInv loses up to (#digits of longest coeff of B) places in fInv.mult(B); - // * multiplying fInv by B also multiplies the rounding error by a factor of N; - // so make #decimal places of fInv the sum of the above. - BigDecimalPolynomial fInv = rf.rho.div(new BigDecimal(rf.res), B.getMaxCoeffLength() + 1 + log10N); - BigDecimalPolynomial gInv = rg.rho.div(new BigDecimal(rg.res), A.getMaxCoeffLength() + 1 + log10N); - - BigDecimalPolynomial Cdec = fInv.mult(B); - Cdec.add(gInv.mult(A)); - Cdec.halve(); - C = Cdec.round(); - } - - BigIntPolynomial F = (BigIntPolynomial)B.clone(); - F.sub(f.mult(C)); - BigIntPolynomial G = (BigIntPolynomial)A.clone(); - G.sub(g.mult(C)); - - IntegerPolynomial FInt = new IntegerPolynomial(F); - IntegerPolynomial GInt = new IntegerPolynomial(G); - minimizeFG(fInt, gInt, FInt, GInt, N); - - Polynomial fPrime; - IntegerPolynomial h; - if (basisType == NTRUSigningKeyGenerationParameters.BASIS_TYPE_STANDARD) - { - fPrime = FInt; - h = g.mult(fq, q); - } - else - { - fPrime = g; - h = FInt.mult(fq, q); - } - h.modPositive(q); - - return new FGBasis(f, fPrime, h, FInt, GInt, params); - } - - /** - * Creates a basis such that |F| < keyNormBound and |G| < keyNormBound - * - * @return a NTRUSigner basis - */ - public NTRUSigningPrivateKeyParameters.Basis generateBoundedBasis() - { - while (true) - { - FGBasis basis = generateBasis(); - if (basis.isNormOk()) - { - return basis; - } - } - } - - private class BasisGenerationTask - implements Callable - { - - - public NTRUSigningPrivateKeyParameters.Basis call() - throws Exception - { - return generateBoundedBasis(); - } - } - - /** - * A subclass of Basis that additionally contains the polynomials F and G. - */ - public class FGBasis - extends NTRUSigningPrivateKeyParameters.Basis - { - public IntegerPolynomial F; - public IntegerPolynomial G; - - FGBasis(Polynomial f, Polynomial fPrime, IntegerPolynomial h, IntegerPolynomial F, IntegerPolynomial G, NTRUSigningKeyGenerationParameters params) - { - super(f, fPrime, h, params); - this.F = F; - this.G = G; - } - - /** - * Returns true if the norms of the polynomials F and G - * are within {@link NTRUSigningKeyGenerationParameters#keyNormBound}. - * - * @return - */ - boolean isNormOk() - { - double keyNormBoundSq = params.keyNormBoundSq; - int q = params.q; - return (F.centeredNormSq(q) < keyNormBoundSq && G.centeredNormSq(q) < keyNormBoundSq); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NaccacheSternKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NaccacheSternKeyPairGenerator.java deleted file mode 100644 index da50b98..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/NaccacheSternKeyPairGenerator.java +++ /dev/null @@ -1,365 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.NaccacheSternKeyGenerationParameters; -import org.bc.crypto.params.NaccacheSternKeyParameters; -import org.bc.crypto.params.NaccacheSternPrivateKeyParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; -import java.util.Vector; - -/** - * Key generation parameters for NaccacheStern cipher. For details on this cipher, please see - * - * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf - */ -public class NaccacheSternKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - - private static int[] smallPrimes = - { - 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, - 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, - 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, - 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, - 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, - 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, - 541, 547, 557 - }; - - private NaccacheSternKeyGenerationParameters param; - - private static final BigInteger ONE = BigInteger.valueOf(1); // JDK 1.1 compatibility - - /* - * (non-Javadoc) - * - * @see org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator#init(org.bouncycastle.crypto.KeyGenerationParameters) - */ - public void init(KeyGenerationParameters param) - { - this.param = (NaccacheSternKeyGenerationParameters)param; - } - - /* - * (non-Javadoc) - * - * @see org.bouncycastle.crypto.AsymmetricCipherKeyPairGenerator#generateKeyPair() - */ - public AsymmetricCipherKeyPair generateKeyPair() - { - int strength = param.getStrength(); - SecureRandom rand = param.getRandom(); - int certainty = param.getCertainty(); - boolean debug = param.isDebug(); - - if (debug) - { - System.out.println("Fetching first " + param.getCntSmallPrimes() + " primes."); - } - - Vector smallPrimes = findFirstPrimes(param.getCntSmallPrimes()); - smallPrimes = permuteList(smallPrimes, rand); - - BigInteger u = ONE; - BigInteger v = ONE; - - for (int i = 0; i < smallPrimes.size() / 2; i++) - { - u = u.multiply((BigInteger)smallPrimes.elementAt(i)); - } - for (int i = smallPrimes.size() / 2; i < smallPrimes.size(); i++) - { - v = v.multiply((BigInteger)smallPrimes.elementAt(i)); - } - - BigInteger sigma = u.multiply(v); - - // n = (2 a u p_ + 1 ) ( 2 b v q_ + 1) - // -> |n| = strength - // |2| = 1 in bits - // -> |a| * |b| = |n| - |u| - |v| - |p_| - |q_| - |2| -|2| - // remainingStrength = strength - sigma.bitLength() - p_.bitLength() - - // q_.bitLength() - 1 -1 - int remainingStrength = strength - sigma.bitLength() - 48; - BigInteger a = generatePrime(remainingStrength / 2 + 1, certainty, rand); - BigInteger b = generatePrime(remainingStrength / 2 + 1, certainty, rand); - - BigInteger p_; - BigInteger q_; - BigInteger p; - BigInteger q; - long tries = 0; - if (debug) - { - System.out.println("generating p and q"); - } - - BigInteger _2au = a.multiply(u).shiftLeft(1); - BigInteger _2bv = b.multiply(v).shiftLeft(1); - - for (;;) - { - tries++; - - p_ = generatePrime(24, certainty, rand); - - p = p_.multiply(_2au).add(ONE); - - if (!p.isProbablePrime(certainty)) - { - continue; - } - - for (;;) - { - q_ = generatePrime(24, certainty, rand); - - if (p_.equals(q_)) - { - continue; - } - - q = q_.multiply(_2bv).add(ONE); - - if (q.isProbablePrime(certainty)) - { - break; - } - } - - if (!sigma.gcd(p_.multiply(q_)).equals(ONE)) - { - // System.out.println("sigma.gcd(p_.mult(q_)) != 1!\n p_: " + p_ - // +"\n q_: "+ q_ ); - continue; - } - - if (p.multiply(q).bitLength() < strength) - { - if (debug) - { - System.out.println("key size too small. Should be " + strength + " but is actually " - + p.multiply(q).bitLength()); - } - continue; - } - break; - } - - if (debug) - { - System.out.println("needed " + tries + " tries to generate p and q."); - } - - BigInteger n = p.multiply(q); - BigInteger phi_n = p.subtract(ONE).multiply(q.subtract(ONE)); - BigInteger g; - tries = 0; - if (debug) - { - System.out.println("generating g"); - } - for (;;) - { - - Vector gParts = new Vector(); - for (int ind = 0; ind != smallPrimes.size(); ind++) - { - BigInteger i = (BigInteger)smallPrimes.elementAt(ind); - BigInteger e = phi_n.divide(i); - - for (;;) - { - tries++; - g = new BigInteger(strength, certainty, rand); - if (g.modPow(e, n).equals(ONE)) - { - continue; - } - gParts.addElement(g); - break; - } - } - g = ONE; - for (int i = 0; i < smallPrimes.size(); i++) - { - g = g.multiply(((BigInteger)gParts.elementAt(i)).modPow(sigma.divide((BigInteger)smallPrimes.elementAt(i)), n)).mod(n); - } - - // make sure that g is not divisible by p_i or q_i - boolean divisible = false; - for (int i = 0; i < smallPrimes.size(); i++) - { - if (g.modPow(phi_n.divide((BigInteger)smallPrimes.elementAt(i)), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/" + smallPrimes.elementAt(i) + "\n g: " + g); - } - divisible = true; - break; - } - } - - if (divisible) - { - continue; - } - - // make sure that g has order > phi_n/4 - - if (g.modPow(phi_n.divide(BigInteger.valueOf(4)), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/4\n g:" + g); - } - continue; - } - - if (g.modPow(phi_n.divide(p_), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/p'\n g: " + g); - } - continue; - } - if (g.modPow(phi_n.divide(q_), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/q'\n g: " + g); - } - continue; - } - if (g.modPow(phi_n.divide(a), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/a\n g: " + g); - } - continue; - } - if (g.modPow(phi_n.divide(b), n).equals(ONE)) - { - if (debug) - { - System.out.println("g has order phi(n)/b\n g: " + g); - } - continue; - } - break; - } - if (debug) - { - System.out.println("needed " + tries + " tries to generate g"); - System.out.println(); - System.out.println("found new NaccacheStern cipher variables:"); - System.out.println("smallPrimes: " + smallPrimes); - System.out.println("sigma:...... " + sigma + " (" + sigma.bitLength() + " bits)"); - System.out.println("a:.......... " + a); - System.out.println("b:.......... " + b); - System.out.println("p':......... " + p_); - System.out.println("q':......... " + q_); - System.out.println("p:.......... " + p); - System.out.println("q:.......... " + q); - System.out.println("n:.......... " + n); - System.out.println("phi(n):..... " + phi_n); - System.out.println("g:.......... " + g); - System.out.println(); - } - - return new AsymmetricCipherKeyPair(new NaccacheSternKeyParameters(false, g, n, sigma.bitLength()), - new NaccacheSternPrivateKeyParameters(g, n, sigma.bitLength(), smallPrimes, phi_n)); - } - - private static BigInteger generatePrime( - int bitLength, - int certainty, - SecureRandom rand) - { - BigInteger p_ = new BigInteger(bitLength, certainty, rand); - while (p_.bitLength() != bitLength) - { - p_ = new BigInteger(bitLength, certainty, rand); - } - return p_; - } - - /** - * Generates a permuted ArrayList from the original one. The original List - * is not modified - * - * @param arr - * the ArrayList to be permuted - * @param rand - * the source of Randomness for permutation - * @return a new ArrayList with the permuted elements. - */ - private static Vector permuteList( - Vector arr, - SecureRandom rand) - { - Vector retval = new Vector(); - Vector tmp = new Vector(); - for (int i = 0; i < arr.size(); i++) - { - tmp.addElement(arr.elementAt(i)); - } - retval.addElement(tmp.elementAt(0)); - tmp.removeElementAt(0); - while (tmp.size() != 0) - { - retval.insertElementAt(tmp.elementAt(0), getInt(rand, retval.size() + 1)); - tmp.removeElementAt(0); - } - return retval; - } - - private static int getInt( - SecureRandom rand, - int n) - { - if ((n & -n) == n) - { - return (int)((n * (long)(rand.nextInt() & 0x7fffffff)) >> 31); - } - - int bits, val; - do - { - bits = rand.nextInt() & 0x7fffffff; - val = bits % n; - } - while (bits - val + (n-1) < 0); - - return val; - } - - /** - * Finds the first 'count' primes starting with 3 - * - * @param count - * the number of primes to find - * @return a vector containing the found primes as Integer - */ - private static Vector findFirstPrimes( - int count) - { - Vector primes = new Vector(count); - - for (int i = 0; i != count; i++) - { - primes.addElement(BigInteger.valueOf(smallPrimes[i])); - } - - return primes; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/OpenSSLPBEParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/OpenSSLPBEParametersGenerator.java deleted file mode 100644 index 9d30f83..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/OpenSSLPBEParametersGenerator.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.PBEParametersGenerator; -import org.bc.crypto.digests.MD5Digest; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Generator for PBE derived keys and ivs as usd by OpenSSL. - *

    - * The scheme is a simple extension of PKCS 5 V2.0 Scheme 1 using MD5 with an - * iteration count of 1. - *

    - */ -public class OpenSSLPBEParametersGenerator - extends PBEParametersGenerator -{ - private Digest digest = new MD5Digest(); - - /** - * Construct a OpenSSL Parameters generator. - */ - public OpenSSLPBEParametersGenerator() - { - } - - /** - * Initialise - note the iteration count for this algorithm is fixed at 1. - * - * @param password password to use. - * @param salt salt to use. - */ - public void init( - byte[] password, - byte[] salt) - { - super.init(password, salt, 1); - } - - /** - * the derived key function, the ith hash of the password and the salt. - */ - private byte[] generateDerivedKey( - int bytesNeeded) - { - byte[] buf = new byte[digest.getDigestSize()]; - byte[] key = new byte[bytesNeeded]; - int offset = 0; - - for (;;) - { - digest.update(password, 0, password.length); - digest.update(salt, 0, salt.length); - - digest.doFinal(buf, 0); - - int len = (bytesNeeded > buf.length) ? buf.length : bytesNeeded; - System.arraycopy(buf, 0, key, offset, len); - offset += len; - - // check if we need any more - bytesNeeded -= len; - if (bytesNeeded == 0) - { - break; - } - - // do another round - digest.reset(); - digest.update(buf, 0, buf.length); - } - - return key; - } - - /** - * Generate a key parameter derived from the password, salt, and iteration - * count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - * @exception IllegalArgumentException if the key length larger than the base hash size. - */ - public CipherParameters generateDerivedParameters( - int keySize) - { - keySize = keySize / 8; - - byte[] dKey = generateDerivedKey(keySize); - - return new KeyParameter(dKey, 0, keySize); - } - - /** - * Generate a key with initialisation vector parameter derived from - * the password, salt, and iteration count we are currently initialised - * with. - * - * @param keySize the size of the key we want (in bits) - * @param ivSize the size of the iv we want (in bits) - * @return a ParametersWithIV object. - * @exception IllegalArgumentException if keySize + ivSize is larger than the base hash size. - */ - public CipherParameters generateDerivedParameters( - int keySize, - int ivSize) - { - keySize = keySize / 8; - ivSize = ivSize / 8; - - byte[] dKey = generateDerivedKey(keySize + ivSize); - - return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize); - } - - /** - * Generate a key parameter for use with a MAC derived from the password, - * salt, and iteration count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - * @exception IllegalArgumentException if the key length larger than the base hash size. - */ - public CipherParameters generateDerivedMacParameters( - int keySize) - { - return generateDerivedParameters(keySize); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS12ParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS12ParametersGenerator.java deleted file mode 100644 index 760ea8c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS12ParametersGenerator.java +++ /dev/null @@ -1,221 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.ExtendedDigest; -import org.bc.crypto.PBEParametersGenerator; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Generator for PBE derived keys and ivs as defined by PKCS 12 V1.0. - *

    - * The document this implementation is based on can be found at - * - * RSA's PKCS12 Page - */ -public class PKCS12ParametersGenerator - extends PBEParametersGenerator -{ - public static final int KEY_MATERIAL = 1; - public static final int IV_MATERIAL = 2; - public static final int MAC_MATERIAL = 3; - - private Digest digest; - - private int u; - private int v; - - /** - * Construct a PKCS 12 Parameters generator. This constructor will - * accept any digest which also implements ExtendedDigest. - * - * @param digest the digest to be used as the source of derived keys. - * @exception IllegalArgumentException if an unknown digest is passed in. - */ - public PKCS12ParametersGenerator( - Digest digest) - { - this.digest = digest; - if (digest instanceof ExtendedDigest) - { - u = digest.getDigestSize(); - v = ((ExtendedDigest)digest).getByteLength(); - } - else - { - throw new IllegalArgumentException("Digest " + digest.getAlgorithmName() + " unsupported"); - } - } - - /** - * add a + b + 1, returning the result in a. The a value is treated - * as a BigInteger of length (b.length * 8) bits. The result is - * modulo 2^b.length in case of overflow. - */ - private void adjust( - byte[] a, - int aOff, - byte[] b) - { - int x = (b[b.length - 1] & 0xff) + (a[aOff + b.length - 1] & 0xff) + 1; - - a[aOff + b.length - 1] = (byte)x; - x >>>= 8; - - for (int i = b.length - 2; i >= 0; i--) - { - x += (b[i] & 0xff) + (a[aOff + i] & 0xff); - a[aOff + i] = (byte)x; - x >>>= 8; - } - } - - /** - * generation of a derived key ala PKCS12 V1.0. - */ - private byte[] generateDerivedKey( - int idByte, - int n) - { - byte[] D = new byte[v]; - byte[] dKey = new byte[n]; - - for (int i = 0; i != D.length; i++) - { - D[i] = (byte)idByte; - } - - byte[] S; - - if ((salt != null) && (salt.length != 0)) - { - S = new byte[v * ((salt.length + v - 1) / v)]; - - for (int i = 0; i != S.length; i++) - { - S[i] = salt[i % salt.length]; - } - } - else - { - S = new byte[0]; - } - - byte[] P; - - if ((password != null) && (password.length != 0)) - { - P = new byte[v * ((password.length + v - 1) / v)]; - - for (int i = 0; i != P.length; i++) - { - P[i] = password[i % password.length]; - } - } - else - { - P = new byte[0]; - } - - byte[] I = new byte[S.length + P.length]; - - System.arraycopy(S, 0, I, 0, S.length); - System.arraycopy(P, 0, I, S.length, P.length); - - byte[] B = new byte[v]; - int c = (n + u - 1) / u; - - for (int i = 1; i <= c; i++) - { - byte[] A = new byte[u]; - - digest.update(D, 0, D.length); - digest.update(I, 0, I.length); - digest.doFinal(A, 0); - for (int j = 1; j < iterationCount; j++) - { - digest.update(A, 0, A.length); - digest.doFinal(A, 0); - } - - for (int j = 0; j != B.length; j++) - { - B[j] = A[j % A.length]; - } - - for (int j = 0; j != I.length / v; j++) - { - adjust(I, j * v, B); - } - - if (i == c) - { - System.arraycopy(A, 0, dKey, (i - 1) * u, dKey.length - ((i - 1) * u)); - } - else - { - System.arraycopy(A, 0, dKey, (i - 1) * u, A.length); - } - } - - return dKey; - } - - /** - * Generate a key parameter derived from the password, salt, and iteration - * count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - */ - public CipherParameters generateDerivedParameters( - int keySize) - { - keySize = keySize / 8; - - byte[] dKey = generateDerivedKey(KEY_MATERIAL, keySize); - - return new KeyParameter(dKey, 0, keySize); - } - - /** - * Generate a key with initialisation vector parameter derived from - * the password, salt, and iteration count we are currently initialised - * with. - * - * @param keySize the size of the key we want (in bits) - * @param ivSize the size of the iv we want (in bits) - * @return a ParametersWithIV object. - */ - public CipherParameters generateDerivedParameters( - int keySize, - int ivSize) - { - keySize = keySize / 8; - ivSize = ivSize / 8; - - byte[] dKey = generateDerivedKey(KEY_MATERIAL, keySize); - - byte[] iv = generateDerivedKey(IV_MATERIAL, ivSize); - - return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), iv, 0, ivSize); - } - - /** - * Generate a key parameter for use with a MAC derived from the password, - * salt, and iteration count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - */ - public CipherParameters generateDerivedMacParameters( - int keySize) - { - keySize = keySize / 8; - - byte[] dKey = generateDerivedKey(MAC_MATERIAL, keySize); - - return new KeyParameter(dKey, 0, keySize); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S1ParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S1ParametersGenerator.java deleted file mode 100644 index 2b9e4ef..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S1ParametersGenerator.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.PBEParametersGenerator; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Generator for PBE derived keys and ivs as defined by PKCS 5 V2.0 Scheme 1. - * Note this generator is limited to the size of the hash produced by the - * digest used to drive it. - *

    - * The document this implementation is based on can be found at - * - * RSA's PKCS5 Page - */ -public class PKCS5S1ParametersGenerator - extends PBEParametersGenerator -{ - private Digest digest; - - /** - * Construct a PKCS 5 Scheme 1 Parameters generator. - * - * @param digest the digest to be used as the source of derived keys. - */ - public PKCS5S1ParametersGenerator( - Digest digest) - { - this.digest = digest; - } - - /** - * the derived key function, the ith hash of the password and the salt. - */ - private byte[] generateDerivedKey() - { - byte[] digestBytes = new byte[digest.getDigestSize()]; - - digest.update(password, 0, password.length); - digest.update(salt, 0, salt.length); - - digest.doFinal(digestBytes, 0); - for (int i = 1; i < iterationCount; i++) - { - digest.update(digestBytes, 0, digestBytes.length); - digest.doFinal(digestBytes, 0); - } - - return digestBytes; - } - - /** - * Generate a key parameter derived from the password, salt, and iteration - * count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - * @exception IllegalArgumentException if the key length larger than the base hash size. - */ - public CipherParameters generateDerivedParameters( - int keySize) - { - keySize = keySize / 8; - - if (keySize > digest.getDigestSize()) - { - throw new IllegalArgumentException( - "Can't generate a derived key " + keySize + " bytes long."); - } - - byte[] dKey = generateDerivedKey(); - - return new KeyParameter(dKey, 0, keySize); - } - - /** - * Generate a key with initialisation vector parameter derived from - * the password, salt, and iteration count we are currently initialised - * with. - * - * @param keySize the size of the key we want (in bits) - * @param ivSize the size of the iv we want (in bits) - * @return a ParametersWithIV object. - * @exception IllegalArgumentException if keySize + ivSize is larger than the base hash size. - */ - public CipherParameters generateDerivedParameters( - int keySize, - int ivSize) - { - keySize = keySize / 8; - ivSize = ivSize / 8; - - if ((keySize + ivSize) > digest.getDigestSize()) - { - throw new IllegalArgumentException( - "Can't generate a derived key " + (keySize + ivSize) + " bytes long."); - } - - byte[] dKey = generateDerivedKey(); - - return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize); - } - - /** - * Generate a key parameter for use with a MAC derived from the password, - * salt, and iteration count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - * @exception IllegalArgumentException if the key length larger than the base hash size. - */ - public CipherParameters generateDerivedMacParameters( - int keySize) - { - return generateDerivedParameters(keySize); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S2ParametersGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S2ParametersGenerator.java deleted file mode 100644 index bc467de..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/PKCS5S2ParametersGenerator.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.Mac; -import org.bc.crypto.PBEParametersGenerator; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.macs.HMac; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Generator for PBE derived keys and ivs as defined by PKCS 5 V2.0 Scheme 2. - * This generator uses a SHA-1 HMac as the calculation function. - *

    - * The document this implementation is based on can be found at - * - * RSA's PKCS5 Page - */ -public class PKCS5S2ParametersGenerator - extends PBEParametersGenerator -{ - private Mac hMac; - - /** - * construct a PKCS5 Scheme 2 Parameters generator. - */ - public PKCS5S2ParametersGenerator() - { - this(new SHA1Digest()); - } - - public PKCS5S2ParametersGenerator(Digest digest) - { - hMac = new HMac(digest); - } - - private void F( - byte[] P, - byte[] S, - int c, - byte[] iBuf, - byte[] out, - int outOff) - { - byte[] state = new byte[hMac.getMacSize()]; - CipherParameters param = new KeyParameter(P); - - hMac.init(param); - - if (S != null) - { - hMac.update(S, 0, S.length); - } - - hMac.update(iBuf, 0, iBuf.length); - - hMac.doFinal(state, 0); - - System.arraycopy(state, 0, out, outOff, state.length); - - if (c == 0) - { - throw new IllegalArgumentException("iteration count must be at least 1."); - } - - for (int count = 1; count < c; count++) - { - hMac.init(param); - hMac.update(state, 0, state.length); - hMac.doFinal(state, 0); - - for (int j = 0; j != state.length; j++) - { - out[outOff + j] ^= state[j]; - } - } - } - - private void intToOctet( - byte[] buf, - int i) - { - buf[0] = (byte)(i >>> 24); - buf[1] = (byte)(i >>> 16); - buf[2] = (byte)(i >>> 8); - buf[3] = (byte)i; - } - - private byte[] generateDerivedKey( - int dkLen) - { - int hLen = hMac.getMacSize(); - int l = (dkLen + hLen - 1) / hLen; - byte[] iBuf = new byte[4]; - byte[] out = new byte[l * hLen]; - - for (int i = 1; i <= l; i++) - { - intToOctet(iBuf, i); - - F(password, salt, iterationCount, iBuf, out, (i - 1) * hLen); - } - - return out; - } - - /** - * Generate a key parameter derived from the password, salt, and iteration - * count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - */ - public CipherParameters generateDerivedParameters( - int keySize) - { - keySize = keySize / 8; - - byte[] dKey = generateDerivedKey(keySize); - - return new KeyParameter(dKey, 0, keySize); - } - - /** - * Generate a key with initialisation vector parameter derived from - * the password, salt, and iteration count we are currently initialised - * with. - * - * @param keySize the size of the key we want (in bits) - * @param ivSize the size of the iv we want (in bits) - * @return a ParametersWithIV object. - */ - public CipherParameters generateDerivedParameters( - int keySize, - int ivSize) - { - keySize = keySize / 8; - ivSize = ivSize / 8; - - byte[] dKey = generateDerivedKey(keySize + ivSize); - - return new ParametersWithIV(new KeyParameter(dKey, 0, keySize), dKey, keySize, ivSize); - } - - /** - * Generate a key parameter for use with a MAC derived from the password, - * salt, and iteration count we are currently initialised with. - * - * @param keySize the size of the key we want (in bits) - * @return a KeyParameter object. - */ - public CipherParameters generateDerivedMacParameters( - int keySize) - { - return generateDerivedParameters(keySize); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSABlindingFactorGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSABlindingFactorGenerator.java deleted file mode 100644 index 1f098cf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSABlindingFactorGenerator.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * Generate a random factor suitable for use with RSA blind signatures - * as outlined in Chaum's blinding and unblinding as outlined in - * "Handbook of Applied Cryptography", page 475. - */ -public class RSABlindingFactorGenerator -{ - private static BigInteger ZERO = BigInteger.valueOf(0); - private static BigInteger ONE = BigInteger.valueOf(1); - - private RSAKeyParameters key; - private SecureRandom random; - - /** - * Initialise the factor generator - * - * @param param the necessary RSA key parameters. - */ - public void init( - CipherParameters param) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - key = (RSAKeyParameters)rParam.getParameters(); - random = rParam.getRandom(); - } - else - { - key = (RSAKeyParameters)param; - random = new SecureRandom(); - } - - if (key instanceof RSAPrivateCrtKeyParameters) - { - throw new IllegalArgumentException("generator requires RSA public key"); - } - } - - /** - * Generate a suitable blind factor for the public key the generator was initialised with. - * - * @return a random blind factor - */ - public BigInteger generateBlindingFactor() - { - if (key == null) - { - throw new IllegalStateException("generator not initialised"); - } - - BigInteger m = key.getModulus(); - int length = m.bitLength() - 1; // must be less than m.bitLength() - BigInteger factor; - BigInteger gcd; - - do - { - factor = new BigInteger(length, random); - gcd = factor.gcd(m); - } - while (factor.equals(ZERO) || factor.equals(ONE) || !gcd.equals(ONE)); - - return factor; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSAKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSAKeyPairGenerator.java deleted file mode 100644 index 05509cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/RSAKeyPairGenerator.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.params.RSAKeyGenerationParameters; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; - -import java.math.BigInteger; - -/** - * an RSA key pair generator. - */ -public class RSAKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - - private RSAKeyGenerationParameters param; - - public void init( - KeyGenerationParameters param) - { - this.param = (RSAKeyGenerationParameters)param; - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - BigInteger p, q, n, d, e, pSub1, qSub1, phi; - - // - // p and q values should have a length of half the strength in bits - // - int strength = param.getStrength(); - int pbitlength = (strength + 1) / 2; - int qbitlength = strength - pbitlength; - int mindiffbits = strength / 3; - - e = param.getPublicExponent(); - - // TODO Consider generating safe primes for p, q (see DHParametersHelper.generateSafePrimes) - // (then p-1 and q-1 will not consist of only small factors - see "Pollard's algorithm") - - // - // generate p, prime and (p-1) relatively prime to e - // - for (;;) - { - p = new BigInteger(pbitlength, 1, param.getRandom()); - - if (p.mod(e).equals(ONE)) - { - continue; - } - - if (!p.isProbablePrime(param.getCertainty())) - { - continue; - } - - if (e.gcd(p.subtract(ONE)).equals(ONE)) - { - break; - } - } - - // - // generate a modulus of the required length - // - for (;;) - { - // generate q, prime and (q-1) relatively prime to e, - // and not equal to p - // - for (;;) - { - q = new BigInteger(qbitlength, 1, param.getRandom()); - - if (q.subtract(p).abs().bitLength() < mindiffbits) - { - continue; - } - - if (q.mod(e).equals(ONE)) - { - continue; - } - - if (!q.isProbablePrime(param.getCertainty())) - { - continue; - } - - if (e.gcd(q.subtract(ONE)).equals(ONE)) - { - break; - } - } - - // - // calculate the modulus - // - n = p.multiply(q); - - if (n.bitLength() == param.getStrength()) - { - break; - } - - // - // if we get here our primes aren't big enough, make the largest - // of the two p and try again - // - p = p.max(q); - } - - if (p.compareTo(q) < 0) - { - phi = p; - p = q; - q = phi; - } - - pSub1 = p.subtract(ONE); - qSub1 = q.subtract(ONE); - phi = pSub1.multiply(qSub1); - - // - // calculate the private exponent - // - d = e.modInverse(phi); - - // - // calculate the CRT factors - // - BigInteger dP, dQ, qInv; - - dP = d.remainder(pSub1); - dQ = d.remainder(qSub1); - qInv = q.modInverse(p); - - return new AsymmetricCipherKeyPair( - new RSAKeyParameters(false, n, e), - new RSAPrivateCrtKeyParameters(n, e, d, p, q, dP, dQ, qInv)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/SCrypt.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/SCrypt.java deleted file mode 100644 index a7e76eb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/generators/SCrypt.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.bc.crypto.generators; - -import org.bc.crypto.PBEParametersGenerator; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.engines.Salsa20Engine; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -public class SCrypt -{ - // TODO Validate arguments - public static byte[] generate(byte[] P, byte[] S, int N, int r, int p, int dkLen) - { - return MFcrypt(P, S, N, r, p, dkLen); - } - - private static byte[] MFcrypt(byte[] P, byte[] S, int N, int r, int p, int dkLen) - { - int MFLenBytes = r * 128; - byte[] bytes = SingleIterationPBKDF2(P, S, p * MFLenBytes); - - int[] B = null; - - try - { - int BLen = bytes.length >>> 2; - B = new int[BLen]; - - Pack.littleEndianToInt(bytes, 0, B); - - int MFLenWords = MFLenBytes >>> 2; - for (int BOff = 0; BOff < BLen; BOff += MFLenWords) - { - // TODO These can be done in parallel threads - SMix(B, BOff, N, r); - } - - Pack.intToLittleEndian(B, bytes, 0); - - return SingleIterationPBKDF2(P, bytes, dkLen); - } - finally - { - Clear(bytes); - Clear(B); - } - } - - private static byte[] SingleIterationPBKDF2(byte[] P, byte[] S, int dkLen) - { - PBEParametersGenerator pGen = new PKCS5S2ParametersGenerator(new SHA256Digest()); - pGen.init(P, S, 1); - KeyParameter key = (KeyParameter) pGen.generateDerivedMacParameters(dkLen * 8); - return key.getKey(); - } - - private static void SMix(int[] B, int BOff, int N, int r) - { - int BCount = r * 32; - - int[] blockX1 = new int[16]; - int[] blockX2 = new int[16]; - int[] blockY = new int[BCount]; - - int[] X = new int[BCount]; - int[][] V = new int[N][]; - - try - { - System.arraycopy(B, BOff, X, 0, BCount); - - for (int i = 0; i < N; ++i) - { - V[i] = Arrays.clone(X); - BlockMix(X, blockX1, blockX2, blockY, r); - } - - int mask = N - 1; - for (int i = 0; i < N; ++i) - { - int j = X[BCount - 16] & mask; - Xor(X, V[j], 0, X); - BlockMix(X, blockX1, blockX2, blockY, r); - } - - System.arraycopy(X, 0, B, BOff, BCount); - } - finally - { - ClearAll(V); - ClearAll(new int[][]{ X, blockX1, blockX2, blockY }); - } - } - - private static void BlockMix(int[] B, int[] X1, int[] X2, int[] Y, int r) - { - System.arraycopy(B, B.length - 16, X1, 0, 16); - - int BOff = 0, YOff = 0, halfLen = B.length >>> 1; - - for (int i = 2 * r; i > 0; --i) - { - Xor(X1, B, BOff, X2); - - Salsa20Engine.salsaCore(8, X2, X1); - System.arraycopy(X1, 0, Y, YOff, 16); - - YOff = halfLen + BOff - YOff; - BOff += 16; - } - - System.arraycopy(Y, 0, B, 0, Y.length); - } - - private static void Xor(int[] a, int[] b, int bOff, int[] output) - { - for (int i = output.length - 1; i >= 0; --i) - { - output[i] = a[i] ^ b[bOff + i]; - } - } - - private static void Clear(byte[] array) - { - if (array != null) - { - Arrays.fill(array, (byte)0); - } - } - - private static void Clear(int[] array) - { - if (array != null) - { - Arrays.fill(array, 0); - } - } - - private static void ClearAll(int[][] arrays) - { - for (int i = 0; i < arrays.length; ++i) - { - Clear(arrays[i]); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherInputStream.java deleted file mode 100644 index 783559e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherInputStream.java +++ /dev/null @@ -1,244 +0,0 @@ -package org.bc.crypto.io; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.StreamCipher; - -/** - * A CipherInputStream is composed of an InputStream and a BufferedBlockCipher so - * that read() methods return data that are read in from the - * underlying InputStream but have been additionally processed by the - * Cipher. The Cipher must be fully initialized before being used by - * a CipherInputStream. - *

    - * For example, if the Cipher is initialized for decryption, the - * CipherInputStream will attempt to read in data and decrypt them, - * before returning the decrypted data. - */ -public class CipherInputStream - extends FilterInputStream -{ - private BufferedBlockCipher bufferedBlockCipher; - private StreamCipher streamCipher; - - private byte[] buf; - private byte[] inBuf; - - private int bufOff; - private int maxBuf; - private boolean finalized; - - private static final int INPUT_BUF_SIZE = 2048; - - /** - * Constructs a CipherInputStream from an InputStream and a - * BufferedBlockCipher. - */ - public CipherInputStream( - InputStream is, - BufferedBlockCipher cipher) - { - super(is); - - this.bufferedBlockCipher = cipher; - - buf = new byte[cipher.getOutputSize(INPUT_BUF_SIZE)]; - inBuf = new byte[INPUT_BUF_SIZE]; - } - - public CipherInputStream( - InputStream is, - StreamCipher cipher) - { - super(is); - - this.streamCipher = cipher; - - buf = new byte[INPUT_BUF_SIZE]; - inBuf = new byte[INPUT_BUF_SIZE]; - } - - /** - * grab the next chunk of input from the underlying input stream - */ - private int nextChunk() - throws IOException - { - int available = super.available(); - - // must always try to read 1 byte! - // some buggy InputStreams return < 0! - if (available <= 0) - { - available = 1; - } - - if (available > inBuf.length) - { - available = super.read(inBuf, 0, inBuf.length); - } - else - { - available = super.read(inBuf, 0, available); - } - - if (available < 0) - { - if (finalized) - { - return -1; - } - - try - { - if (bufferedBlockCipher != null) - { - maxBuf = bufferedBlockCipher.doFinal(buf, 0); - } - else - { - maxBuf = 0; // a stream cipher - } - } - catch (Exception e) - { - throw new IOException("error processing stream: " + e.toString()); - } - - bufOff = 0; - - finalized = true; - - if (bufOff == maxBuf) - { - return -1; - } - } - else - { - bufOff = 0; - - try - { - if (bufferedBlockCipher != null) - { - maxBuf = bufferedBlockCipher.processBytes(inBuf, 0, available, buf, 0); - } - else - { - streamCipher.processBytes(inBuf, 0, available, buf, 0); - maxBuf = available; - } - } - catch (Exception e) - { - throw new IOException("error processing stream: " + e.toString()); - } - - if (maxBuf == 0) // not enough bytes read for first block... - { - return nextChunk(); - } - } - - return maxBuf; - } - - public int read() - throws IOException - { - if (bufOff == maxBuf) - { - if (nextChunk() < 0) - { - return -1; - } - } - - return buf[bufOff++] & 0xff; - } - - public int read( - byte[] b) - throws IOException - { - return read(b, 0, b.length); - } - - public int read( - byte[] b, - int off, - int len) - throws IOException - { - if (bufOff == maxBuf) - { - if (nextChunk() < 0) - { - return -1; - } - } - - int available = maxBuf - bufOff; - - if (len > available) - { - System.arraycopy(buf, bufOff, b, off, available); - bufOff = maxBuf; - - return available; - } - else - { - System.arraycopy(buf, bufOff, b, off, len); - bufOff += len; - - return len; - } - } - - public long skip( - long n) - throws IOException - { - if (n <= 0) - { - return 0; - } - - int available = maxBuf - bufOff; - - if (n > available) - { - bufOff = maxBuf; - - return available; - } - else - { - bufOff += (int)n; - - return (int)n; - } - } - - public int available() - throws IOException - { - return maxBuf - bufOff; - } - - public void close() - throws IOException - { - super.close(); - } - - public boolean markSupported() - { - return false; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherOutputStream.java deleted file mode 100644 index 0282f55..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/CipherOutputStream.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.bc.crypto.io; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.StreamCipher; - -public class CipherOutputStream - extends FilterOutputStream -{ - private BufferedBlockCipher bufferedBlockCipher; - private StreamCipher streamCipher; - - private byte[] oneByte = new byte[1]; - private byte[] buf; - - /** - * Constructs a CipherOutputStream from an OutputStream and a - * BufferedBlockCipher. - */ - public CipherOutputStream( - OutputStream os, - BufferedBlockCipher cipher) - { - super(os); - this.bufferedBlockCipher = cipher; - this.buf = new byte[cipher.getBlockSize()]; - } - - /** - * Constructs a CipherOutputStream from an OutputStream and a - * BufferedBlockCipher. - */ - public CipherOutputStream( - OutputStream os, - StreamCipher cipher) - { - super(os); - this.streamCipher = cipher; - } - - /** - * Writes the specified byte to this output stream. - * - * @param b the byte. - * @exception java.io.IOException if an I/O error occurs. - */ - public void write( - int b) - throws IOException - { - oneByte[0] = (byte)b; - - if (bufferedBlockCipher != null) - { - int len = bufferedBlockCipher.processBytes(oneByte, 0, 1, buf, 0); - - if (len != 0) - { - out.write(buf, 0, len); - } - } - else - { - out.write(streamCipher.returnByte((byte)b)); - } - } - - /** - * Writes b.length bytes from the specified byte array - * to this output stream. - *

    - * The write method of - * CipherOutputStream calls the write - * method of three arguments with the three arguments - * b, 0, and b.length. - * - * @param b the data. - * @exception java.io.IOException if an I/O error occurs. - * @see #write(byte[], int, int) - */ - public void write( - byte[] b) - throws IOException - { - write(b, 0, b.length); - } - - /** - * Writes len bytes from the specified byte array - * starting at offset off to this output stream. - * - * @param b the data. - * @param off the start offset in the data. - * @param len the number of bytes to write. - * @exception java.io.IOException if an I/O error occurs. - */ - public void write( - byte[] b, - int off, - int len) - throws IOException - { - if (bufferedBlockCipher != null) - { - byte[] buf = new byte[bufferedBlockCipher.getOutputSize(len)]; - - int outLen = bufferedBlockCipher.processBytes(b, off, len, buf, 0); - - if (outLen != 0) - { - out.write(buf, 0, outLen); - } - } - else - { - byte[] buf = new byte[len]; - - streamCipher.processBytes(b, off, len, buf, 0); - - out.write(buf, 0, len); - } - } - - /** - * Flushes this output stream by forcing any buffered output bytes - * that have already been processed by the encapsulated cipher object - * to be written out. - * - *

    - * Any bytes buffered by the encapsulated cipher - * and waiting to be processed by it will not be written out. For example, - * if the encapsulated cipher is a block cipher, and the total number of - * bytes written using one of the write methods is less than - * the cipher's block size, no bytes will be written out. - * - * @exception java.io.IOException if an I/O error occurs. - */ - public void flush() - throws IOException - { - super.flush(); - } - - /** - * Closes this output stream and releases any system resources - * associated with this stream. - *

    - * This method invokes the doFinal method of the encapsulated - * cipher object, which causes any bytes buffered by the encapsulated - * cipher to be processed. The result is written out by calling the - * flush method of this output stream. - *

    - * This method resets the encapsulated cipher object to its initial state - * and calls the close method of the underlying output - * stream. - * - * @exception java.io.IOException if an I/O error occurs. - */ - public void close() - throws IOException - { - try - { - if (bufferedBlockCipher != null) - { - byte[] buf = new byte[bufferedBlockCipher.getOutputSize(0)]; - - int outLen = bufferedBlockCipher.doFinal(buf, 0); - - if (outLen != 0) - { - out.write(buf, 0, outLen); - } - } - } - catch (Exception e) - { - throw new IOException("Error closing stream: " + e.toString()); - } - - flush(); - - super.close(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestInputStream.java deleted file mode 100644 index 8538bdf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestInputStream.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.crypto.io; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.Digest; - -public class DigestInputStream - extends FilterInputStream -{ - protected Digest digest; - - public DigestInputStream( - InputStream stream, - Digest digest) - { - super(stream); - this.digest = digest; - } - - public int read() - throws IOException - { - int b = in.read(); - - if (b >= 0) - { - digest.update((byte)b); - } - return b; - } - - public int read( - byte[] b, - int off, - int len) - throws IOException - { - int n = in.read(b, off, len); - if (n > 0) - { - digest.update(b, off, n); - } - return n; - } - - public Digest getDigest() - { - return digest; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestOutputStream.java deleted file mode 100644 index b67b58b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/DigestOutputStream.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.crypto.io; - -import java.io.IOException; -import java.io.OutputStream; - -import org.bc.crypto.Digest; - -public class DigestOutputStream - extends OutputStream -{ - protected Digest digest; - - public DigestOutputStream( - Digest Digest) - { - this.digest = Digest; - } - - public void write(int b) - throws IOException - { - digest.update((byte)b); - } - - public void write( - byte[] b, - int off, - int len) - throws IOException - { - digest.update(b, off, len); - } - - public byte[] getDigest() - { - byte[] res = new byte[digest.getDigestSize()]; - - digest.doFinal(res, 0); - - return res; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacInputStream.java deleted file mode 100644 index cc3edaa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacInputStream.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.crypto.io; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.Mac; - -public class MacInputStream - extends FilterInputStream -{ - protected Mac mac; - - public MacInputStream( - InputStream stream, - Mac mac) - { - super(stream); - this.mac = mac; - } - - public int read() - throws IOException - { - int b = in.read(); - - if (b >= 0) - { - mac.update((byte)b); - } - return b; - } - - public int read( - byte[] b, - int off, - int len) - throws IOException - { - int n = in.read(b, off, len); - if (n >= 0) - { - mac.update(b, off, n); - } - return n; - } - - public Mac getMac() - { - return mac; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacOutputStream.java deleted file mode 100644 index 1d26868..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/MacOutputStream.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.crypto.io; - -import java.io.IOException; -import java.io.OutputStream; - -import org.bc.crypto.Mac; - -public class MacOutputStream - extends OutputStream -{ - protected Mac mac; - - public MacOutputStream( - Mac mac) - { - this.mac = mac; - } - - public void write(int b) - throws IOException - { - mac.update((byte)b); - } - - public void write( - byte[] b, - int off, - int len) - throws IOException - { - mac.update(b, off, len); - } - - public byte[] getMac() - { - byte[] res = new byte[mac.getMacSize()]; - - mac.doFinal(res, 0); - - return res; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerInputStream.java deleted file mode 100644 index ab37fed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerInputStream.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.crypto.io; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.Signer; - -public class SignerInputStream - extends FilterInputStream -{ - protected Signer signer; - - public SignerInputStream( - InputStream stream, - Signer signer) - { - super(stream); - this.signer = signer; - } - - public int read() - throws IOException - { - int b = in.read(); - - if (b >= 0) - { - signer.update((byte)b); - } - return b; - } - - public int read( - byte[] b, - int off, - int len) - throws IOException - { - int n = in.read(b, off, len); - if (n > 0) - { - signer.update(b, off, n); - } - return n; - } - - public Signer getSigner() - { - return signer; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerOutputStream.java deleted file mode 100644 index 5cbb934..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/io/SignerOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.crypto.io; - -import java.io.IOException; -import java.io.OutputStream; - -import org.bc.crypto.Signer; - -public class SignerOutputStream - extends OutputStream -{ - protected Signer signer; - - public SignerOutputStream( - Signer Signer) - { - this.signer = Signer; - } - - public void write(int b) - throws IOException - { - signer.update((byte)b); - } - - public void write( - byte[] b, - int off, - int len) - throws IOException - { - signer.update(b, off, len); - } - - public Signer getSigner() - { - return signer; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/BlockCipherMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/BlockCipherMac.java deleted file mode 100644 index 2683e06..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/BlockCipherMac.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Mac; -import org.bc.crypto.modes.CBCBlockCipher; - -public class BlockCipherMac - implements Mac -{ - private byte[] mac; - - private byte[] buf; - private int bufOff; - private BlockCipher cipher; - - private int macSize; - - /** - * create a standard MAC based on a block cipher. This will produce an - * authentication code half the length of the block size of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @deprecated use CBCBlockCipherMac - */ - public BlockCipherMac( - BlockCipher cipher) - { - this(cipher, (cipher.getBlockSize() * 8) / 2); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. - *

    - * Note: the size of the MAC must be at least 16 bits (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - * @deprecated use CBCBlockCipherMac - */ - public BlockCipherMac( - BlockCipher cipher, - int macSizeInBits) - { - if ((macSizeInBits % 8) != 0) - { - throw new IllegalArgumentException("MAC size must be multiple of 8"); - } - - this.cipher = new CBCBlockCipher(cipher); - this.macSize = macSizeInBits / 8; - - mac = new byte[cipher.getBlockSize()]; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName(); - } - - public void init( - CipherParameters params) - { - reset(); - - cipher.init(true, params); - } - - public int getMacSize() - { - return macSize; - } - - public void update( - byte in) - { - if (bufOff == buf.length) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - public void update( - byte[] in, - int inOff, - int len) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = cipher.getBlockSize(); - int resultLen = 0; - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - resultLen += cipher.processBlock(in, inOff, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal( - byte[] out, - int outOff) - { - int blockSize = cipher.getBlockSize(); - - // - // pad with zeroes - // - while (bufOff < blockSize) - { - buf[bufOff] = 0; - bufOff++; - } - - cipher.processBlock(buf, 0, mac, 0); - - System.arraycopy(mac, 0, out, outOff, macSize); - - reset(); - - return macSize; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - /* - * reset the underlying cipher. - */ - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CBCBlockCipherMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CBCBlockCipherMac.java deleted file mode 100644 index d500a21..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CBCBlockCipherMac.java +++ /dev/null @@ -1,229 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Mac; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.paddings.BlockCipherPadding; - -/** - * standard CBC Block Cipher MAC - if no padding is specified the default of - * pad of zeroes is used. - */ -public class CBCBlockCipherMac - implements Mac -{ - private byte[] mac; - - private byte[] buf; - private int bufOff; - private BlockCipher cipher; - private BlockCipherPadding padding; - - private int macSize; - - /** - * create a standard MAC based on a CBC block cipher. This will produce an - * authentication code half the length of the block size of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - */ - public CBCBlockCipherMac( - BlockCipher cipher) - { - this(cipher, (cipher.getBlockSize() * 8) / 2, null); - } - - /** - * create a standard MAC based on a CBC block cipher. This will produce an - * authentication code half the length of the block size of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param padding the padding to be used to complete the last block. - */ - public CBCBlockCipherMac( - BlockCipher cipher, - BlockCipherPadding padding) - { - this(cipher, (cipher.getBlockSize() * 8) / 2, padding); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses CBC mode as the basis for the - * MAC generation. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - */ - public CBCBlockCipherMac( - BlockCipher cipher, - int macSizeInBits) - { - this(cipher, macSizeInBits, null); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses CBC mode as the basis for the - * MAC generation. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - * @param padding the padding to be used to complete the last block. - */ - public CBCBlockCipherMac( - BlockCipher cipher, - int macSizeInBits, - BlockCipherPadding padding) - { - if ((macSizeInBits % 8) != 0) - { - throw new IllegalArgumentException("MAC size must be multiple of 8"); - } - - this.cipher = new CBCBlockCipher(cipher); - this.padding = padding; - this.macSize = macSizeInBits / 8; - - mac = new byte[cipher.getBlockSize()]; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName(); - } - - public void init( - CipherParameters params) - { - reset(); - - cipher.init(true, params); - } - - public int getMacSize() - { - return macSize; - } - - public void update( - byte in) - { - if (bufOff == buf.length) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - public void update( - byte[] in, - int inOff, - int len) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = cipher.getBlockSize(); - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - cipher.processBlock(buf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - cipher.processBlock(in, inOff, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal( - byte[] out, - int outOff) - { - int blockSize = cipher.getBlockSize(); - - if (padding == null) - { - // - // pad with zeroes - // - while (bufOff < blockSize) - { - buf[bufOff] = 0; - bufOff++; - } - } - else - { - if (bufOff == blockSize) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - padding.addPadding(buf, bufOff); - } - - cipher.processBlock(buf, 0, mac, 0); - - System.arraycopy(mac, 0, out, outOff, macSize); - - reset(); - - return macSize; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - /* - * reset the underlying cipher. - */ - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CFBBlockCipherMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CFBBlockCipherMac.java deleted file mode 100644 index 85e2d7f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CFBBlockCipherMac.java +++ /dev/null @@ -1,388 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Mac; -import org.bc.crypto.paddings.BlockCipherPadding; -import org.bc.crypto.params.ParametersWithIV; - -/** - * implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. - */ -class MacCFBBlockCipher -{ - private byte[] IV; - private byte[] cfbV; - private byte[] cfbOutV; - - private int blockSize; - private BlockCipher cipher = null; - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * feedback mode. - * @param blockSize the block size in bits (note: a multiple of 8) - */ - public MacCFBBlockCipher( - BlockCipher cipher, - int bitBlockSize) - { - this.cipher = cipher; - this.blockSize = bitBlockSize / 8; - - this.IV = new byte[cipher.getBlockSize()]; - this.cfbV = new byte[cipher.getBlockSize()]; - this.cfbOutV = new byte[cipher.getBlockSize()]; - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param param the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - CipherParameters params) - throws IllegalArgumentException - { - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length < IV.length) - { - System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); - } - else - { - System.arraycopy(iv, 0, IV, 0, IV.length); - } - - reset(); - - cipher.init(true, ivParam.getParameters()); - } - else - { - reset(); - - cipher.init(true, params); - } - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/CFB" - * and the block size in bits. - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/CFB" + (blockSize * 8); - } - - /** - * return the block size we are operating at. - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return blockSize; - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(cfbV, 0, cfbOutV, 0); - - // - // XOR the cfbV with the plaintext producing the cipher text - // - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]); - } - - // - // change over the input block. - // - System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize); - System.arraycopy(out, outOff, cfbV, cfbV.length - blockSize, blockSize); - - return blockSize; - } - - /** - * reset the chaining vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - System.arraycopy(IV, 0, cfbV, 0, IV.length); - - cipher.reset(); - } - - void getMacBlock( - byte[] mac) - { - cipher.processBlock(cfbV, 0, mac, 0); - } -} - -public class CFBBlockCipherMac - implements Mac -{ - private byte[] mac; - - private byte[] buf; - private int bufOff; - private MacCFBBlockCipher cipher; - private BlockCipherPadding padding = null; - - - private int macSize; - - /** - * create a standard MAC based on a CFB block cipher. This will produce an - * authentication code half the length of the block size of the cipher, with - * the CFB mode set to 8 bits. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - */ - public CFBBlockCipherMac( - BlockCipher cipher) - { - this(cipher, 8, (cipher.getBlockSize() * 8) / 2, null); - } - - /** - * create a standard MAC based on a CFB block cipher. This will produce an - * authentication code half the length of the block size of the cipher, with - * the CFB mode set to 8 bits. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param padding the padding to be used. - */ - public CFBBlockCipherMac( - BlockCipher cipher, - BlockCipherPadding padding) - { - this(cipher, 8, (cipher.getBlockSize() * 8) / 2, padding); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses CFB mode as the basis for the - * MAC generation. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param cfbBitSize the size of an output block produced by the CFB mode. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - */ - public CFBBlockCipherMac( - BlockCipher cipher, - int cfbBitSize, - int macSizeInBits) - { - this(cipher, cfbBitSize, macSizeInBits, null); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses CFB mode as the basis for the - * MAC generation. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param cfbBitSize the size of an output block produced by the CFB mode. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - * @param padding a padding to be used. - */ - public CFBBlockCipherMac( - BlockCipher cipher, - int cfbBitSize, - int macSizeInBits, - BlockCipherPadding padding) - { - if ((macSizeInBits % 8) != 0) - { - throw new IllegalArgumentException("MAC size must be multiple of 8"); - } - - mac = new byte[cipher.getBlockSize()]; - - this.cipher = new MacCFBBlockCipher(cipher, cfbBitSize); - this.padding = padding; - this.macSize = macSizeInBits / 8; - - buf = new byte[this.cipher.getBlockSize()]; - bufOff = 0; - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName(); - } - - public void init( - CipherParameters params) - { - reset(); - - cipher.init(params); - } - - public int getMacSize() - { - return macSize; - } - - public void update( - byte in) - { - if (bufOff == buf.length) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - public void update( - byte[] in, - int inOff, - int len) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = cipher.getBlockSize(); - int resultLen = 0; - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - resultLen += cipher.processBlock(in, inOff, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal( - byte[] out, - int outOff) - { - int blockSize = cipher.getBlockSize(); - - // - // pad with zeroes - // - if (this.padding == null) - { - while (bufOff < blockSize) - { - buf[bufOff] = 0; - bufOff++; - } - } - else - { - padding.addPadding(buf, bufOff); - } - - cipher.processBlock(buf, 0, mac, 0); - - cipher.getMacBlock(mac); - - System.arraycopy(mac, 0, out, outOff, macSize); - - reset(); - - return macSize; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - /* - * reset the underlying cipher. - */ - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CMac.java deleted file mode 100644 index 5d94026..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/CMac.java +++ /dev/null @@ -1,238 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Mac; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.paddings.ISO7816d4Padding; - -/** - * CMAC - as specified at www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/omac.html - *

    - * CMAC is analogous to OMAC1 - see also en.wikipedia.org/wiki/CMAC - *

    - * CMAC is a NIST recomendation - see - * csrc.nist.gov/CryptoToolkit/modes/800-38_Series_Publications/SP800-38B.pdf - *

    - * CMAC/OMAC1 is a blockcipher-based message authentication code designed and - * analyzed by Tetsu Iwata and Kaoru Kurosawa. - *

    - * CMAC/OMAC1 is a simple variant of the CBC MAC (Cipher Block Chaining Message - * Authentication Code). OMAC stands for One-Key CBC MAC. - *

    - * It supports 128- or 64-bits block ciphers, with any key size, and returns - * a MAC with dimension less or equal to the block size of the underlying - * cipher. - *

    - */ -public class CMac implements Mac -{ - private static final byte CONSTANT_128 = (byte)0x87; - private static final byte CONSTANT_64 = (byte)0x1b; - - private byte[] ZEROES; - - private byte[] mac; - - private byte[] buf; - private int bufOff; - private BlockCipher cipher; - - private int macSize; - - private byte[] L, Lu, Lu2; - - /** - * create a standard MAC based on a CBC block cipher (64 or 128 bit block). - * This will produce an authentication code the length of the block size - * of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - */ - public CMac(BlockCipher cipher) - { - this(cipher, cipher.getBlockSize() * 8); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8 and <= 128. - */ - public CMac(BlockCipher cipher, int macSizeInBits) - { - if ((macSizeInBits % 8) != 0) - { - throw new IllegalArgumentException("MAC size must be multiple of 8"); - } - - if (macSizeInBits > (cipher.getBlockSize() * 8)) - { - throw new IllegalArgumentException( - "MAC size must be less or equal to " - + (cipher.getBlockSize() * 8)); - } - - if (cipher.getBlockSize() != 8 && cipher.getBlockSize() != 16) - { - throw new IllegalArgumentException( - "Block size must be either 64 or 128 bits"); - } - - this.cipher = new CBCBlockCipher(cipher); - this.macSize = macSizeInBits / 8; - - mac = new byte[cipher.getBlockSize()]; - - buf = new byte[cipher.getBlockSize()]; - - ZEROES = new byte[cipher.getBlockSize()]; - - bufOff = 0; - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName(); - } - - private static byte[] doubleLu(byte[] in) - { - int FirstBit = (in[0] & 0xFF) >> 7; - byte[] ret = new byte[in.length]; - for (int i = 0; i < in.length - 1; i++) - { - ret[i] = (byte)((in[i] << 1) + ((in[i + 1] & 0xFF) >> 7)); - } - ret[in.length - 1] = (byte)(in[in.length - 1] << 1); - if (FirstBit == 1) - { - ret[in.length - 1] ^= in.length == 16 ? CONSTANT_128 : CONSTANT_64; - } - return ret; - } - - public void init(CipherParameters params) - { - if (params != null) - { - cipher.init(true, params); - - //initializes the L, Lu, Lu2 numbers - L = new byte[ZEROES.length]; - cipher.processBlock(ZEROES, 0, L, 0); - Lu = doubleLu(L); - Lu2 = doubleLu(Lu); - } - - reset(); - } - - public int getMacSize() - { - return macSize; - } - - public void update(byte in) - { - if (bufOff == buf.length) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - public void update(byte[] in, int inOff, int len) - { - if (len < 0) - { - throw new IllegalArgumentException( - "Can't have a negative input length!"); - } - - int blockSize = cipher.getBlockSize(); - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - cipher.processBlock(buf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - cipher.processBlock(in, inOff, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal(byte[] out, int outOff) - { - int blockSize = cipher.getBlockSize(); - - byte[] lu; - if (bufOff == blockSize) - { - lu = Lu; - } - else - { - new ISO7816d4Padding().addPadding(buf, bufOff); - lu = Lu2; - } - - for (int i = 0; i < mac.length; i++) - { - buf[i] ^= lu[i]; - } - - cipher.processBlock(buf, 0, mac, 0); - - System.arraycopy(mac, 0, out, outOff, macSize); - - reset(); - - return macSize; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - /* - * reset the underlying cipher. - */ - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/GOST28147Mac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/GOST28147Mac.java deleted file mode 100644 index 3ae06c8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/GOST28147Mac.java +++ /dev/null @@ -1,298 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Mac; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithSBox; - -/** - * implementation of GOST 28147-89 MAC - */ -public class GOST28147Mac - implements Mac -{ - private int blockSize = 8; - private int macSize = 4; - private int bufOff; - private byte[] buf; - private byte[] mac; - private boolean firstStep = true; - private int[] workingKey = null; - - // - // This is default S-box - E_A. - private byte S[] = { - 0x9,0x6,0x3,0x2,0x8,0xB,0x1,0x7,0xA,0x4,0xE,0xF,0xC,0x0,0xD,0x5, - 0x3,0x7,0xE,0x9,0x8,0xA,0xF,0x0,0x5,0x2,0x6,0xC,0xB,0x4,0xD,0x1, - 0xE,0x4,0x6,0x2,0xB,0x3,0xD,0x8,0xC,0xF,0x5,0xA,0x0,0x7,0x1,0x9, - 0xE,0x7,0xA,0xC,0xD,0x1,0x3,0x9,0x0,0x2,0xB,0x4,0xF,0x8,0x5,0x6, - 0xB,0x5,0x1,0x9,0x8,0xD,0xF,0x0,0xE,0x4,0x2,0x3,0xC,0x7,0xA,0x6, - 0x3,0xA,0xD,0xC,0x1,0x2,0x0,0xB,0x7,0x5,0x9,0x4,0x8,0xF,0xE,0x6, - 0x1,0xD,0x2,0x9,0x7,0xA,0x6,0x0,0x8,0xC,0x4,0x5,0xF,0x3,0xB,0xE, - 0xB,0xA,0xF,0x5,0x0,0xC,0xE,0x8,0x6,0x2,0x3,0x9,0x1,0x7,0xD,0x4 - }; - - public GOST28147Mac() - { - mac = new byte[blockSize]; - - buf = new byte[blockSize]; - bufOff = 0; - } - - private int[] generateWorkingKey( - byte[] userKey) - { - if (userKey.length != 32) - { - throw new IllegalArgumentException("Key length invalid. Key needs to be 32 byte - 256 bit!!!"); - } - - int key[] = new int[8]; - for(int i=0; i!=8; i++) - { - key[i] = bytesToint(userKey,i*4); - } - - return key; - } - - public void init( - CipherParameters params) - throws IllegalArgumentException - { - reset(); - buf = new byte[blockSize]; - if (params instanceof ParametersWithSBox) - { - ParametersWithSBox param = (ParametersWithSBox)params; - - // - // Set the S-Box - // - System.arraycopy(param.getSBox(), 0, this.S, 0, param.getSBox().length); - - // - // set key if there is one - // - if (param.getParameters() != null) - { - workingKey = generateWorkingKey(((KeyParameter)param.getParameters()).getKey()); - } - } - else if (params instanceof KeyParameter) - { - workingKey = generateWorkingKey(((KeyParameter)params).getKey()); - } - else - { - throw new IllegalArgumentException("invalid parameter passed to GOST28147 init - " + params.getClass().getName()); - } - } - - public String getAlgorithmName() - { - return "GOST28147Mac"; - } - - public int getMacSize() - { - return macSize; - } - - private int gost28147_mainStep(int n1, int key) - { - int cm = (key + n1); // CM1 - - // S-box replacing - - int om = S[ 0 + ((cm >> (0 * 4)) & 0xF)] << (0 * 4); - om += S[ 16 + ((cm >> (1 * 4)) & 0xF)] << (1 * 4); - om += S[ 32 + ((cm >> (2 * 4)) & 0xF)] << (2 * 4); - om += S[ 48 + ((cm >> (3 * 4)) & 0xF)] << (3 * 4); - om += S[ 64 + ((cm >> (4 * 4)) & 0xF)] << (4 * 4); - om += S[ 80 + ((cm >> (5 * 4)) & 0xF)] << (5 * 4); - om += S[ 96 + ((cm >> (6 * 4)) & 0xF)] << (6 * 4); - om += S[112 + ((cm >> (7 * 4)) & 0xF)] << (7 * 4); - - return om << 11 | om >>> (32-11); // 11-leftshift - } - - private void gost28147MacFunc( - int[] workingKey, - byte[] in, - int inOff, - byte[] out, - int outOff) - { - int N1, N2, tmp; //tmp -> for saving N1 - N1 = bytesToint(in, inOff); - N2 = bytesToint(in, inOff + 4); - - for(int k = 0; k < 2; k++) // 1-16 steps - { - for(int j = 0; j < 8; j++) - { - tmp = N1; - N1 = N2 ^ gost28147_mainStep(N1, workingKey[j]); // CM2 - N2 = tmp; - } - } - - intTobytes(N1, out, outOff); - intTobytes(N2, out, outOff + 4); - } - - //array of bytes to type int - private int bytesToint( - byte[] in, - int inOff) - { - return ((in[inOff + 3] << 24) & 0xff000000) + ((in[inOff + 2] << 16) & 0xff0000) + - ((in[inOff + 1] << 8) & 0xff00) + (in[inOff] & 0xff); - } - - //int to array of bytes - private void intTobytes( - int num, - byte[] out, - int outOff) - { - out[outOff + 3] = (byte)(num >>> 24); - out[outOff + 2] = (byte)(num >>> 16); - out[outOff + 1] = (byte)(num >>> 8); - out[outOff] = (byte)num; - } - - private byte[] CM5func(byte[] buf, int bufOff, byte[] mac) - { - byte[] sum = new byte[buf.length - bufOff]; - - System.arraycopy(buf, bufOff, sum, 0, mac.length); - - for (int i = 0; i != mac.length; i++) - { - sum[i] = (byte)(sum[i] ^ mac[i]); - } - - return sum; - } - - public void update(byte in) - throws IllegalStateException - { - if (bufOff == buf.length) - { - byte[] sumbuf = new byte[buf.length]; - System.arraycopy(buf, 0, sumbuf, 0, mac.length); - - if (firstStep) - { - firstStep = false; - } - else - { - sumbuf = CM5func(buf, 0, mac); - } - - gost28147MacFunc(workingKey, sumbuf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - public void update(byte[] in, int inOff, int len) - throws DataLengthException, IllegalStateException - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - byte[] sumbuf = new byte[buf.length]; - System.arraycopy(buf, 0, sumbuf, 0, mac.length); - - if (firstStep) - { - firstStep = false; - } - else - { - sumbuf = CM5func(buf, 0, mac); - } - - gost28147MacFunc(workingKey, sumbuf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - sumbuf = CM5func(in, inOff, mac); - gost28147MacFunc(workingKey, sumbuf, 0, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal(byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - //padding with zero - while (bufOff < blockSize) - { - buf[bufOff] = 0; - bufOff++; - } - - byte[] sumbuf = new byte[buf.length]; - System.arraycopy(buf, 0, sumbuf, 0, mac.length); - - if (firstStep) - { - firstStep = false; - } - else - { - sumbuf = CM5func(buf, 0, mac); - } - - gost28147MacFunc(workingKey, sumbuf, 0, mac, 0); - - System.arraycopy(mac, (mac.length/2)-macSize, out, outOff, macSize); - - reset(); - - return macSize; - } - - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - firstStep = true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/HMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/HMac.java deleted file mode 100644 index 1495d53..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/HMac.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.bc.crypto.macs; - -import java.util.Hashtable; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.ExtendedDigest; -import org.bc.crypto.Mac; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Integers; - -/** - * HMAC implementation based on RFC2104 - * - * H(K XOR opad, H(K XOR ipad, text)) - */ -public class HMac - implements Mac -{ - private final static byte IPAD = (byte)0x36; - private final static byte OPAD = (byte)0x5C; - - private Digest digest; - private int digestSize; - private int blockLength; - - private byte[] inputPad; - private byte[] outputPad; - - private static Hashtable blockLengths; - - static - { - blockLengths = new Hashtable(); - - blockLengths.put("GOST3411", Integers.valueOf(32)); - - blockLengths.put("MD2", Integers.valueOf(16)); - blockLengths.put("MD4", Integers.valueOf(64)); - blockLengths.put("MD5", Integers.valueOf(64)); - - blockLengths.put("RIPEMD128", Integers.valueOf(64)); - blockLengths.put("RIPEMD160", Integers.valueOf(64)); - - blockLengths.put("SHA-1", Integers.valueOf(64)); - blockLengths.put("SHA-224", Integers.valueOf(64)); - blockLengths.put("SHA-256", Integers.valueOf(64)); - blockLengths.put("SHA-384", Integers.valueOf(128)); - blockLengths.put("SHA-512", Integers.valueOf(128)); - - blockLengths.put("Tiger", Integers.valueOf(64)); - blockLengths.put("Whirlpool", Integers.valueOf(64)); - } - - private static int getByteLength( - Digest digest) - { - if (digest instanceof ExtendedDigest) - { - return ((ExtendedDigest)digest).getByteLength(); - } - - Integer b = (Integer)blockLengths.get(digest.getAlgorithmName()); - - if (b == null) - { - throw new IllegalArgumentException("unknown digest passed: " + digest.getAlgorithmName()); - } - - return b.intValue(); - } - - /** - * Base constructor for one of the standard digest algorithms that the - * byteLength of the algorithm is know for. - * - * @param digest the digest. - */ - public HMac( - Digest digest) - { - this(digest, getByteLength(digest)); - } - - private HMac( - Digest digest, - int byteLength) - { - this.digest = digest; - digestSize = digest.getDigestSize(); - - this.blockLength = byteLength; - - inputPad = new byte[blockLength]; - outputPad = new byte[blockLength]; - } - - public String getAlgorithmName() - { - return digest.getAlgorithmName() + "/HMAC"; - } - - public Digest getUnderlyingDigest() - { - return digest; - } - - public void init( - CipherParameters params) - { - digest.reset(); - - byte[] key = ((KeyParameter)params).getKey(); - - if (key.length > blockLength) - { - digest.update(key, 0, key.length); - digest.doFinal(inputPad, 0); - for (int i = digestSize; i < inputPad.length; i++) - { - inputPad[i] = 0; - } - } - else - { - System.arraycopy(key, 0, inputPad, 0, key.length); - for (int i = key.length; i < inputPad.length; i++) - { - inputPad[i] = 0; - } - } - - outputPad = new byte[inputPad.length]; - System.arraycopy(inputPad, 0, outputPad, 0, inputPad.length); - - for (int i = 0; i < inputPad.length; i++) - { - inputPad[i] ^= IPAD; - } - - for (int i = 0; i < outputPad.length; i++) - { - outputPad[i] ^= OPAD; - } - - digest.update(inputPad, 0, inputPad.length); - } - - public int getMacSize() - { - return digestSize; - } - - public void update( - byte in) - { - digest.update(in); - } - - public void update( - byte[] in, - int inOff, - int len) - { - digest.update(in, inOff, len); - } - - public int doFinal( - byte[] out, - int outOff) - { - byte[] tmp = new byte[digestSize]; - digest.doFinal(tmp, 0); - - digest.update(outputPad, 0, outputPad.length); - digest.update(tmp, 0, tmp.length); - - int len = digest.doFinal(out, outOff); - - reset(); - - return len; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * reset the underlying digest. - */ - digest.reset(); - - /* - * reinitialize the digest. - */ - digest.update(inputPad, 0, inputPad.length); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/ISO9797Alg3Mac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/ISO9797Alg3Mac.java deleted file mode 100644 index 49da340..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/ISO9797Alg3Mac.java +++ /dev/null @@ -1,305 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Mac; -import org.bc.crypto.engines.DESEngine; -import org.bc.crypto.modes.CBCBlockCipher; -import org.bc.crypto.paddings.BlockCipherPadding; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -/** - * DES based CBC Block Cipher MAC according to ISO9797, algorithm 3 (ANSI X9.19 Retail MAC) - * - * This could as well be derived from CBCBlockCipherMac, but then the property mac in the base - * class must be changed to protected - */ - -public class ISO9797Alg3Mac - implements Mac -{ - private byte[] mac; - - private byte[] buf; - private int bufOff; - private BlockCipher cipher; - private BlockCipherPadding padding; - - private int macSize; - private KeyParameter lastKey2; - private KeyParameter lastKey3; - - /** - * create a Retail-MAC based on a CBC block cipher. This will produce an - * authentication code of the length of the block size of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. This must - * be DESEngine. - */ - public ISO9797Alg3Mac( - BlockCipher cipher) - { - this(cipher, cipher.getBlockSize() * 8, null); - } - - /** - * create a Retail-MAC based on a CBC block cipher. This will produce an - * authentication code of the length of the block size of the cipher. - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param padding the padding to be used to complete the last block. - */ - public ISO9797Alg3Mac( - BlockCipher cipher, - BlockCipherPadding padding) - { - this(cipher, cipher.getBlockSize() * 8, padding); - } - - /** - * create a Retail-MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses single DES CBC mode as the basis for the - * MAC generation. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - */ - public ISO9797Alg3Mac( - BlockCipher cipher, - int macSizeInBits) - { - this(cipher, macSizeInBits, null); - } - - /** - * create a standard MAC based on a block cipher with the size of the - * MAC been given in bits. This class uses single DES CBC mode as the basis for the - * MAC generation. The final block is decrypted and then encrypted using the - * middle and right part of the key. - *

    - * Note: the size of the MAC must be at least 24 bits (FIPS Publication 81), - * or 16 bits if being used as a data authenticator (FIPS Publication 113), - * and in general should be less than the size of the block cipher as it reduces - * the chance of an exhaustive attack (see Handbook of Applied Cryptography). - * - * @param cipher the cipher to be used as the basis of the MAC generation. - * @param macSizeInBits the size of the MAC in bits, must be a multiple of 8. - * @param padding the padding to be used to complete the last block. - */ - public ISO9797Alg3Mac( - BlockCipher cipher, - int macSizeInBits, - BlockCipherPadding padding) - { - if ((macSizeInBits % 8) != 0) - { - throw new IllegalArgumentException("MAC size must be multiple of 8"); - } - - if (!(cipher instanceof DESEngine)) - { - throw new IllegalArgumentException("cipher must be instance of DESEngine"); - } - - this.cipher = new CBCBlockCipher(cipher); - this.padding = padding; - this.macSize = macSizeInBits / 8; - - mac = new byte[cipher.getBlockSize()]; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - } - - public String getAlgorithmName() - { - return "ISO9797Alg3"; - } - - public void init(CipherParameters params) - { - reset(); - - if (!(params instanceof KeyParameter || params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException( - "params must be an instance of KeyParameter or ParametersWithIV"); - } - - // KeyParameter must contain a double or triple length DES key, - // however the underlying cipher is a single DES. The middle and - // right key are used only in the final step. - - KeyParameter kp; - - if (params instanceof KeyParameter) - { - kp = (KeyParameter)params; - } - else - { - kp = (KeyParameter)((ParametersWithIV)params).getParameters(); - } - - KeyParameter key1; - byte[] keyvalue = kp.getKey(); - - if (keyvalue.length == 16) - { // Double length DES key - key1 = new KeyParameter(keyvalue, 0, 8); - this.lastKey2 = new KeyParameter(keyvalue, 8, 8); - this.lastKey3 = key1; - } - else if (keyvalue.length == 24) - { // Triple length DES key - key1 = new KeyParameter(keyvalue, 0, 8); - this.lastKey2 = new KeyParameter(keyvalue, 8, 8); - this.lastKey3 = new KeyParameter(keyvalue, 16, 8); - } - else - { - throw new IllegalArgumentException( - "Key must be either 112 or 168 bit long"); - } - - if (params instanceof ParametersWithIV) - { - cipher.init(true, new ParametersWithIV(key1, ((ParametersWithIV)params).getIV())); - } - else - { - cipher.init(true, key1); - } - } - - public int getMacSize() - { - return macSize; - } - - public void update( - byte in) - { - if (bufOff == buf.length) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - buf[bufOff++] = in; - } - - - public void update( - byte[] in, - int inOff, - int len) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = cipher.getBlockSize(); - int resultLen = 0; - int gapLen = blockSize - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, mac, 0); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - resultLen += cipher.processBlock(in, inOff, mac, 0); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - public int doFinal( - byte[] out, - int outOff) - { - int blockSize = cipher.getBlockSize(); - - if (padding == null) - { - // - // pad with zeroes - // - while (bufOff < blockSize) - { - buf[bufOff] = 0; - bufOff++; - } - } - else - { - if (bufOff == blockSize) - { - cipher.processBlock(buf, 0, mac, 0); - bufOff = 0; - } - - padding.addPadding(buf, bufOff); - } - - cipher.processBlock(buf, 0, mac, 0); - - // Added to code from base class - DESEngine deseng = new DESEngine(); - - deseng.init(false, this.lastKey2); - deseng.processBlock(mac, 0, mac, 0); - - deseng.init(true, this.lastKey3); - deseng.processBlock(mac, 0, mac, 0); - // **** - - System.arraycopy(mac, 0, out, outOff, macSize); - - reset(); - - return macSize; - } - - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * clean the buffer. - */ - for (int i = 0; i < buf.length; i++) - { - buf[i] = 0; - } - - bufOff = 0; - - /* - * reset the underlying cipher. - */ - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/OldHMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/OldHMac.java deleted file mode 100644 index aeaeb9d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/OldHMac.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.Mac; -import org.bc.crypto.params.KeyParameter; - -/** - * HMAC implementation based on RFC2104 - * - * H(K XOR opad, H(K XOR ipad, text)) - */ -public class OldHMac -implements Mac -{ - private final static int BLOCK_LENGTH = 64; - - private final static byte IPAD = (byte)0x36; - private final static byte OPAD = (byte)0x5C; - - private Digest digest; - private int digestSize; - private byte[] inputPad = new byte[BLOCK_LENGTH]; - private byte[] outputPad = new byte[BLOCK_LENGTH]; - - /** - * @deprecated uses incorrect pad for SHA-512 and SHA-384 use HMac. - */ - public OldHMac( - Digest digest) - { - this.digest = digest; - digestSize = digest.getDigestSize(); - } - - public String getAlgorithmName() - { - return digest.getAlgorithmName() + "/HMAC"; - } - - public Digest getUnderlyingDigest() - { - return digest; - } - - public void init( - CipherParameters params) - { - digest.reset(); - - byte[] key = ((KeyParameter)params).getKey(); - - if (key.length > BLOCK_LENGTH) - { - digest.update(key, 0, key.length); - digest.doFinal(inputPad, 0); - for (int i = digestSize; i < inputPad.length; i++) - { - inputPad[i] = 0; - } - } - else - { - System.arraycopy(key, 0, inputPad, 0, key.length); - for (int i = key.length; i < inputPad.length; i++) - { - inputPad[i] = 0; - } - } - - outputPad = new byte[inputPad.length]; - System.arraycopy(inputPad, 0, outputPad, 0, inputPad.length); - - for (int i = 0; i < inputPad.length; i++) - { - inputPad[i] ^= IPAD; - } - - for (int i = 0; i < outputPad.length; i++) - { - outputPad[i] ^= OPAD; - } - - digest.update(inputPad, 0, inputPad.length); - } - - public int getMacSize() - { - return digestSize; - } - - public void update( - byte in) - { - digest.update(in); - } - - public void update( - byte[] in, - int inOff, - int len) - { - digest.update(in, inOff, len); - } - - public int doFinal( - byte[] out, - int outOff) - { - byte[] tmp = new byte[digestSize]; - digest.doFinal(tmp, 0); - - digest.update(outputPad, 0, outputPad.length); - digest.update(tmp, 0, tmp.length); - - int len = digest.doFinal(out, outOff); - - reset(); - - return len; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - /* - * reset the underlying digest. - */ - digest.reset(); - - /* - * reinitialize the digest. - */ - digest.update(inputPad, 0, inputPad.length); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/VMPCMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/VMPCMac.java deleted file mode 100644 index 8f1f616..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/macs/VMPCMac.java +++ /dev/null @@ -1,186 +0,0 @@ -package org.bc.crypto.macs; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Mac; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; - -public class VMPCMac implements Mac -{ - private byte g; - - private byte n = 0; - private byte[] P = null; - private byte s = 0; - - private byte[] T; - private byte[] workingIV; - - private byte[] workingKey; - - private byte x1, x2, x3, x4; - - public int doFinal(byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - // Execute the Post-Processing Phase - for (int r = 1; r < 25; r++) - { - s = P[(s + P[n & 0xff]) & 0xff]; - - x4 = P[(x4 + x3 + r) & 0xff]; - x3 = P[(x3 + x2 + r) & 0xff]; - x2 = P[(x2 + x1 + r) & 0xff]; - x1 = P[(x1 + s + r) & 0xff]; - T[g & 0x1f] = (byte) (T[g & 0x1f] ^ x1); - T[(g + 1) & 0x1f] = (byte) (T[(g + 1) & 0x1f] ^ x2); - T[(g + 2) & 0x1f] = (byte) (T[(g + 2) & 0x1f] ^ x3); - T[(g + 3) & 0x1f] = (byte) (T[(g + 3) & 0x1f] ^ x4); - g = (byte) ((g + 4) & 0x1f); - - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - } - - // Input T to the IV-phase of the VMPC KSA - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + T[m & 0x1f]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - - // Store 20 new outputs of the VMPC Stream Cipher in table M - byte[] M = new byte[20]; - for (int i = 0; i < 20; i++) - { - s = P[(s + P[i & 0xff]) & 0xff]; - M[i] = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]; - - byte temp = P[i & 0xff]; - P[i & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - - System.arraycopy(M, 0, out, outOff, M.length); - reset(); - - return M.length; - } - - public String getAlgorithmName() - { - return "VMPC-MAC"; - } - - public int getMacSize() - { - return 20; - } - - public void init(CipherParameters params) throws IllegalArgumentException - { - if (!(params instanceof ParametersWithIV)) - { - throw new IllegalArgumentException( - "VMPC-MAC Init parameters must include an IV"); - } - - ParametersWithIV ivParams = (ParametersWithIV) params; - KeyParameter key = (KeyParameter) ivParams.getParameters(); - - if (!(ivParams.getParameters() instanceof KeyParameter)) - { - throw new IllegalArgumentException( - "VMPC-MAC Init parameters must include a key"); - } - - this.workingIV = ivParams.getIV(); - - if (workingIV == null || workingIV.length < 1 || workingIV.length > 768) - { - throw new IllegalArgumentException( - "VMPC-MAC requires 1 to 768 bytes of IV"); - } - - this.workingKey = key.getKey(); - - reset(); - - } - - private void initKey(byte[] keyBytes, byte[] ivBytes) - { - s = 0; - P = new byte[256]; - for (int i = 0; i < 256; i++) - { - P[i] = (byte) i; - } - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + keyBytes[m % keyBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - for (int m = 0; m < 768; m++) - { - s = P[(s + P[m & 0xff] + ivBytes[m % ivBytes.length]) & 0xff]; - byte temp = P[m & 0xff]; - P[m & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - } - n = 0; - } - - public void reset() - { - initKey(this.workingKey, this.workingIV); - g = x1 = x2 = x3 = x4 = n = 0; - T = new byte[32]; - for (int i = 0; i < 32; i++) - { - T[i] = 0; - } - } - - public void update(byte in) throws IllegalStateException - { - s = P[(s + P[n & 0xff]) & 0xff]; - byte c = (byte) (in ^ P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]); - - x4 = P[(x4 + x3) & 0xff]; - x3 = P[(x3 + x2) & 0xff]; - x2 = P[(x2 + x1) & 0xff]; - x1 = P[(x1 + s + c) & 0xff]; - T[g & 0x1f] = (byte) (T[g & 0x1f] ^ x1); - T[(g + 1) & 0x1f] = (byte) (T[(g + 1) & 0x1f] ^ x2); - T[(g + 2) & 0x1f] = (byte) (T[(g + 2) & 0x1f] ^ x3); - T[(g + 3) & 0x1f] = (byte) (T[(g + 3) & 0x1f] ^ x4); - g = (byte) ((g + 4) & 0x1f); - - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - } - - public void update(byte[] in, int inOff, int len) - throws DataLengthException, IllegalStateException - { - if ((inOff + len) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - for (int i = 0; i < len; i++) - { - update(in[i]); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/AEADBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/AEADBlockCipher.java deleted file mode 100644 index 0b715e9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/AEADBlockCipher.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; - -/** - * A block cipher mode that includes authenticated encryption with a streaming mode and optional associated data. - * @see org.bc.crypto.params.AEADParameters - */ -public interface AEADBlockCipher -{ - /** - * initialise the underlying cipher. Parameter can either be an AEADParameters or a ParametersWithIV object. - * - * @param forEncryption true if we are setting up for encryption, false otherwise. - * @param params the necessary parameters for the underlying cipher to be initialised. - * @exception IllegalArgumentException if the params argument is inappropriate. - */ - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException; - - /** - * Return the name of the algorithm. - * - * @return the algorithm name. - */ - public String getAlgorithmName(); - - /** - * return the cipher this object wraps. - * - * @return the cipher this object wraps. - */ - public BlockCipher getUnderlyingCipher(); - - /** - * Add a single byte to the associated data check. - *
    If the implementation supports it, this will be an online operation and will not retain the associated data. - * - * @param in the byte to be processed. - */ - public void processAADByte(byte in); - - /** - * Add a sequence of bytes to the associated data check. - *
    If the implementation supports it, this will be an online operation and will not retain the associated data. - * - * @param in the input byte array. - * @param inOff the offset into the in array where the data to be processed starts. - * @param len the number of bytes to be processed. - */ - public void processAADBytes(byte[] in, int inOff, int len); - - /** - * encrypt/decrypt a single byte. - * - * @param in the byte to be processed. - * @param out the output buffer the processed byte goes into. - * @param outOff the offset into the output byte array the processed data starts at. - * @return the number of bytes written to out. - * @exception DataLengthException if the output buffer is too small. - */ - public int processByte(byte in, byte[] out, int outOff) - throws DataLengthException; - - /** - * process a block of bytes from in putting the result into out. - * - * @param in the input byte array. - * @param inOff the offset into the in array where the data to be processed starts. - * @param len the number of bytes to be processed. - * @param out the output buffer the processed bytes go into. - * @param outOff the offset into the output byte array the processed data starts at. - * @return the number of bytes written to out. - * @exception DataLengthException if the output buffer is too small. - */ - public int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) - throws DataLengthException; - - /** - * Finish the operation either appending or verifying the MAC at the end of the data. - * - * @param out space for any resulting output data. - * @param outOff offset into out to start copying the data at. - * @return number of bytes written into out. - * @throws IllegalStateException if the cipher is in an inappropriate state. - * @throws org.bc.crypto.InvalidCipherTextException if the MAC fails to match. - */ - public int doFinal(byte[] out, int outOff) - throws IllegalStateException, InvalidCipherTextException; - - /** - * Return the value of the MAC associated with the last stream processed. - * - * @return MAC for plaintext data. - */ - public byte[] getMac(); - - /** - * return the size of the output buffer required for a processBytes - * an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to processBytes - * with len bytes of input. - */ - public int getUpdateOutputSize(int len); - - /** - * return the size of the output buffer required for a processBytes plus a - * doFinal with an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to processBytes and doFinal - * with len bytes of input. - */ - public int getOutputSize(int len); - - /** - * Reset the cipher. After resetting the cipher is in the same state - * as it was after the last init (if there was one). - */ - public void reset(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CBCBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CBCBlockCipher.java deleted file mode 100644 index c55fe6a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CBCBlockCipher.java +++ /dev/null @@ -1,253 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.util.Arrays; - -/** - * implements Cipher-Block-Chaining (CBC) mode on top of a simple cipher. - */ -public class CBCBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] cbcV; - private byte[] cbcNextV; - - private int blockSize; - private BlockCipher cipher = null; - private boolean encrypting; - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of chaining. - */ - public CBCBlockCipher( - BlockCipher cipher) - { - this.cipher = cipher; - this.blockSize = cipher.getBlockSize(); - - this.IV = new byte[blockSize]; - this.cbcV = new byte[blockSize]; - this.cbcNextV = new byte[blockSize]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * - * @param encrypting if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - throws IllegalArgumentException - { - boolean oldEncrypting = this.encrypting; - - this.encrypting = encrypting; - - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length != blockSize) - { - throw new IllegalArgumentException("initialisation vector must be the same length as block size"); - } - - System.arraycopy(iv, 0, IV, 0, iv.length); - - reset(); - - // if null it's an IV changed only. - if (ivParam.getParameters() != null) - { - cipher.init(encrypting, ivParam.getParameters()); - } - else if (oldEncrypting != encrypting) - { - throw new IllegalArgumentException("cannot change encrypting state without providing key."); - } - } - else - { - reset(); - - // if it's null, key is to be reused. - if (params != null) - { - cipher.init(encrypting, params); - } - else if (oldEncrypting != encrypting) - { - throw new IllegalArgumentException("cannot change encrypting state without providing key."); - } - } - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/CBC". - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/CBC"; - } - - /** - * return the block size of the underlying cipher. - * - * @return the block size of the underlying cipher. - */ - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - return (encrypting) ? encryptBlock(in, inOff, out, outOff) : decryptBlock(in, inOff, out, outOff); - } - - /** - * reset the chaining vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - System.arraycopy(IV, 0, cbcV, 0, IV.length); - Arrays.fill(cbcNextV, (byte)0); - - cipher.reset(); - } - - /** - * Do the appropriate chaining step for CBC mode encryption. - * - * @param in the array containing the data to be encrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - /* - * XOR the cbcV and the input, - * then encrypt the cbcV - */ - for (int i = 0; i < blockSize; i++) - { - cbcV[i] ^= in[inOff + i]; - } - - int length = cipher.processBlock(cbcV, 0, out, outOff); - - /* - * copy ciphertext to cbcV - */ - System.arraycopy(out, outOff, cbcV, 0, cbcV.length); - - return length; - } - - /** - * Do the appropriate chaining step for CBC mode decryption. - * - * @param in the array containing the data to be decrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the decrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - System.arraycopy(in, inOff, cbcNextV, 0, blockSize); - - int length = cipher.processBlock(in, inOff, out, outOff); - - /* - * XOR the cbcV and the output - */ - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] ^= cbcV[i]; - } - - /* - * swap the back up buffer into next position - */ - byte[] tmp; - - tmp = cbcV; - cbcV = cbcNextV; - cbcNextV = tmp; - - return length; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CCMBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CCMBlockCipher.java deleted file mode 100644 index c9577d6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CCMBlockCipher.java +++ /dev/null @@ -1,367 +0,0 @@ -package org.bc.crypto.modes; - -import java.io.ByteArrayOutputStream; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Mac; -import org.bc.crypto.macs.CBCBlockCipherMac; -import org.bc.crypto.params.AEADParameters; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.util.Arrays; - -/** - * Implements the Counter with Cipher Block Chaining mode (CCM) detailed in - * NIST Special Publication 800-38C. - *

    - * Note: this mode is a packet mode - it needs all the data up front. - */ -public class CCMBlockCipher - implements AEADBlockCipher -{ - private BlockCipher cipher; - private int blockSize; - private boolean forEncryption; - private byte[] nonce; - private byte[] initialAssociatedText; - private int macSize; - private CipherParameters keyParam; - private byte[] macBlock; - private ByteArrayOutputStream associatedText = new ByteArrayOutputStream(); - private ByteArrayOutputStream data = new ByteArrayOutputStream(); - - /** - * Basic constructor. - * - * @param c the block cipher to be used. - */ - public CCMBlockCipher(BlockCipher c) - { - this.cipher = c; - this.blockSize = c.getBlockSize(); - this.macBlock = new byte[blockSize]; - - if (blockSize != 16) - { - throw new IllegalArgumentException("cipher required with a block size of 16."); - } - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - if (params instanceof AEADParameters) - { - AEADParameters param = (AEADParameters)params; - - nonce = param.getNonce(); - initialAssociatedText = param.getAssociatedText(); - macSize = param.getMacSize() / 8; - keyParam = param.getKey(); - } - else if (params instanceof ParametersWithIV) - { - ParametersWithIV param = (ParametersWithIV)params; - - nonce = param.getIV(); - initialAssociatedText = null; - macSize = macBlock.length / 2; - keyParam = param.getParameters(); - } - else - { - throw new IllegalArgumentException("invalid parameters passed to CCM"); - } - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/CCM"; - } - - public void processAADByte(byte in) - { - associatedText.write(in); - } - - public void processAADBytes(byte[] in, int inOff, int len) - { - // TODO: Process AAD online - associatedText.write(in, inOff, len); - } - - public int processByte(byte in, byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - data.write(in); - - return 0; - } - - public int processBytes(byte[] in, int inOff, int inLen, byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - data.write(in, inOff, inLen); - - return 0; - } - - public int doFinal(byte[] out, int outOff) - throws IllegalStateException, InvalidCipherTextException - { - byte[] text = data.toByteArray(); - byte[] enc = processPacket(text, 0, text.length); - - System.arraycopy(enc, 0, out, outOff, enc.length); - - reset(); - - return enc.length; - } - - public void reset() - { - cipher.reset(); - associatedText.reset(); - data.reset(); - } - - /** - * Returns a byte array containing the mac calculated as part of the - * last encrypt or decrypt operation. - * - * @return the last mac calculated. - */ - public byte[] getMac() - { - byte[] mac = new byte[macSize]; - - System.arraycopy(macBlock, 0, mac, 0, mac.length); - - return mac; - } - - public int getUpdateOutputSize(int len) - { - return 0; - } - - public int getOutputSize(int len) - { - int totalData = len + data.size(); - - if (forEncryption) - { - return totalData + macSize; - } - - return totalData < macSize ? 0 : totalData - macSize; - } - - public byte[] processPacket(byte[] in, int inOff, int inLen) - throws IllegalStateException, InvalidCipherTextException - { - // TODO: handle null keyParam (e.g. via RepeatedKeySpec) - // Need to keep the CTR and CBC Mac parts around and reset - if (keyParam == null) - { - throw new IllegalStateException("CCM cipher unitialized."); - } - - BlockCipher ctrCipher = new SICBlockCipher(cipher); - byte[] iv = new byte[blockSize]; - byte[] out; - - iv[0] = (byte)(((15 - nonce.length) - 1) & 0x7); - - System.arraycopy(nonce, 0, iv, 1, nonce.length); - - ctrCipher.init(forEncryption, new ParametersWithIV(keyParam, iv)); - - if (forEncryption) - { - int index = inOff; - int outOff = 0; - - out = new byte[inLen + macSize]; - - calculateMac(in, inOff, inLen, macBlock); - - ctrCipher.processBlock(macBlock, 0, macBlock, 0); // S0 - - while (index < inLen - blockSize) // S1... - { - ctrCipher.processBlock(in, index, out, outOff); - outOff += blockSize; - index += blockSize; - } - - byte[] block = new byte[blockSize]; - - System.arraycopy(in, index, block, 0, inLen - index); - - ctrCipher.processBlock(block, 0, block, 0); - - System.arraycopy(block, 0, out, outOff, inLen - index); - - outOff += inLen - index; - - System.arraycopy(macBlock, 0, out, outOff, out.length - outOff); - } - else - { - int index = inOff; - int outOff = 0; - - out = new byte[inLen - macSize]; - - System.arraycopy(in, inOff + inLen - macSize, macBlock, 0, macSize); - - ctrCipher.processBlock(macBlock, 0, macBlock, 0); - - for (int i = macSize; i != macBlock.length; i++) - { - macBlock[i] = 0; - } - - while (outOff < out.length - blockSize) - { - ctrCipher.processBlock(in, index, out, outOff); - outOff += blockSize; - index += blockSize; - } - - byte[] block = new byte[blockSize]; - - System.arraycopy(in, index, block, 0, out.length - outOff); - - ctrCipher.processBlock(block, 0, block, 0); - - System.arraycopy(block, 0, out, outOff, out.length - outOff); - - byte[] calculatedMacBlock = new byte[blockSize]; - - calculateMac(out, 0, out.length, calculatedMacBlock); - - if (!Arrays.constantTimeAreEqual(macBlock, calculatedMacBlock)) - { - throw new InvalidCipherTextException("mac check in CCM failed"); - } - } - - return out; - } - - private int calculateMac(byte[] data, int dataOff, int dataLen, byte[] macBlock) - { - Mac cMac = new CBCBlockCipherMac(cipher, macSize * 8); - - cMac.init(keyParam); - - // - // build b0 - // - byte[] b0 = new byte[16]; - - if (hasAssociatedText()) - { - b0[0] |= 0x40; - } - - b0[0] |= (((cMac.getMacSize() - 2) / 2) & 0x7) << 3; - - b0[0] |= ((15 - nonce.length) - 1) & 0x7; - - System.arraycopy(nonce, 0, b0, 1, nonce.length); - - int q = dataLen; - int count = 1; - while (q > 0) - { - b0[b0.length - count] = (byte)(q & 0xff); - q >>>= 8; - count++; - } - - cMac.update(b0, 0, b0.length); - - // - // process associated text - // - if (hasAssociatedText()) - { - int extra; - - int textLength = getAssociatedTextLength(); - if (textLength < ((1 << 16) - (1 << 8))) - { - cMac.update((byte)(textLength >> 8)); - cMac.update((byte)textLength); - - extra = 2; - } - else // can't go any higher than 2^32 - { - cMac.update((byte)0xff); - cMac.update((byte)0xfe); - cMac.update((byte)(textLength >> 24)); - cMac.update((byte)(textLength >> 16)); - cMac.update((byte)(textLength >> 8)); - cMac.update((byte)textLength); - - extra = 6; - } - - if (initialAssociatedText != null) - { - cMac.update(initialAssociatedText, 0, initialAssociatedText.length); - } - if (associatedText.size() > 0) - { - byte[] tmp = associatedText.toByteArray(); - cMac.update(tmp, 0, tmp.length); - } - - extra = (extra + textLength) % 16; - if (extra != 0) - { - for (int i = 0; i != 16 - extra; i++) - { - cMac.update((byte)0x00); - } - } - } - - // - // add the text - // - cMac.update(data, dataOff, dataLen); - - return cMac.doFinal(macBlock, 0); - } - - private int getAssociatedTextLength() - { - return associatedText.size() + ((initialAssociatedText == null) ? 0 : initialAssociatedText.length); - } - - private boolean hasAssociatedText() - { - return getAssociatedTextLength() > 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CFBBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CFBBlockCipher.java deleted file mode 100644 index eaec321..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CFBBlockCipher.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; - -/** - * implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. - */ -public class CFBBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] cfbV; - private byte[] cfbOutV; - - private int blockSize; - private BlockCipher cipher = null; - private boolean encrypting; - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * feedback mode. - * @param bitBlockSize the block size in bits (note: a multiple of 8) - */ - public CFBBlockCipher( - BlockCipher cipher, - int bitBlockSize) - { - this.cipher = cipher; - this.blockSize = bitBlockSize / 8; - - this.IV = new byte[cipher.getBlockSize()]; - this.cfbV = new byte[cipher.getBlockSize()]; - this.cfbOutV = new byte[cipher.getBlockSize()]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param encrypting if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, - CipherParameters params) - throws IllegalArgumentException - { - this.encrypting = encrypting; - - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length < IV.length) - { - // prepend the supplied IV with zeros (per FIPS PUB 81) - System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); - for (int i = 0; i < IV.length - iv.length; i++) - { - IV[i] = 0; - } - } - else - { - System.arraycopy(iv, 0, IV, 0, IV.length); - } - - reset(); - - // if null it's an IV changed only. - if (ivParam.getParameters() != null) - { - cipher.init(true, ivParam.getParameters()); - } - } - else - { - reset(); - - // if it's null, key is to be reused. - if (params != null) - { - cipher.init(true, params); - } - } - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/CFB" - * and the block size in bits. - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/CFB" + (blockSize * 8); - } - - /** - * return the block size we are operating at. - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return blockSize; - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - return (encrypting) ? encryptBlock(in, inOff, out, outOff) : decryptBlock(in, inOff, out, outOff); - } - - /** - * Do the appropriate processing for CFB mode encryption. - * - * @param in the array containing the data to be encrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(cfbV, 0, cfbOutV, 0); - - // - // XOR the cfbV with the plaintext producing the ciphertext - // - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]); - } - - // - // change over the input block. - // - System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize); - System.arraycopy(out, outOff, cfbV, cfbV.length - blockSize, blockSize); - - return blockSize; - } - - /** - * Do the appropriate processing for CFB mode decryption. - * - * @param in the array containing the data to be decrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(cfbV, 0, cfbOutV, 0); - - // - // change over the input block. - // - System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize); - System.arraycopy(in, inOff, cfbV, cfbV.length - blockSize, blockSize); - - // - // XOR the cfbV with the ciphertext producing the plaintext - // - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]); - } - - return blockSize; - } - - /** - * reset the chaining vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - System.arraycopy(IV, 0, cfbV, 0, IV.length); - - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CTSBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CTSBlockCipher.java deleted file mode 100644 index edd4248..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/CTSBlockCipher.java +++ /dev/null @@ -1,265 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; - -/** - * A Cipher Text Stealing (CTS) mode cipher. CTS allows block ciphers to - * be used to produce cipher text which is the same length as the plain text. - */ -public class CTSBlockCipher - extends BufferedBlockCipher -{ - private int blockSize; - - /** - * Create a buffered block cipher that uses Cipher Text Stealing - * - * @param cipher the underlying block cipher this buffering object wraps. - */ - public CTSBlockCipher( - BlockCipher cipher) - { - if ((cipher instanceof OFBBlockCipher) || (cipher instanceof CFBBlockCipher)) - { - throw new IllegalArgumentException("CTSBlockCipher can only accept ECB, or CBC ciphers"); - } - - this.cipher = cipher; - - blockSize = cipher.getBlockSize(); - - buf = new byte[blockSize * 2]; - bufOff = 0; - } - - /** - * return the size of the output buffer required for an update - * an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update - * with len bytes of input. - */ - public int getUpdateOutputSize( - int len) - { - int total = len + bufOff; - int leftOver = total % buf.length; - - if (leftOver == 0) - { - return total - buf.length; - } - - return total - leftOver; - } - - /** - * return the size of the output buffer required for an update plus a - * doFinal with an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update and doFinal - * with len bytes of input. - */ - public int getOutputSize( - int len) - { - return len + bufOff; - } - - /** - * process a single byte, producing an output block if neccessary. - * - * @param in the input byte. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processByte( - byte in, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - int resultLen = 0; - - if (bufOff == buf.length) - { - resultLen = cipher.processBlock(buf, 0, out, outOff); - System.arraycopy(buf, blockSize, buf, 0, blockSize); - - bufOff = blockSize; - } - - buf[bufOff++] = in; - - return resultLen; - } - - /** - * process an array of bytes, producing output if necessary. - * - * @param in the input byte array. - * @param inOff the offset at which the input data starts. - * @param len the number of bytes to be copied out of the input array. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = getBlockSize(); - int length = getUpdateOutputSize(len); - - if (length > 0) - { - if ((outOff + length) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, out, outOff); - System.arraycopy(buf, blockSize, buf, 0, blockSize); - - bufOff = blockSize; - - len -= gapLen; - inOff += gapLen; - - while (len > blockSize) - { - System.arraycopy(in, inOff, buf, bufOff, blockSize); - resultLen += cipher.processBlock(buf, 0, out, outOff + resultLen); - System.arraycopy(buf, blockSize, buf, 0, blockSize); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - - return resultLen; - } - - /** - * Process the last block in the buffer. - * - * @param out the array the block currently being held is copied into. - * @param outOff the offset at which the copying starts. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there is insufficient space in out for - * the output. - * @exception IllegalStateException if the underlying cipher is not - * initialised. - * @exception InvalidCipherTextException if cipher text decrypts wrongly (in - * case the exception will never get thrown). - */ - public int doFinal( - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException, InvalidCipherTextException - { - if (bufOff + outOff > out.length) - { - throw new DataLengthException("output buffer to small in doFinal"); - } - - int blockSize = cipher.getBlockSize(); - int len = bufOff - blockSize; - byte[] block = new byte[blockSize]; - - if (forEncryption) - { - cipher.processBlock(buf, 0, block, 0); - - if (bufOff < blockSize) - { - throw new DataLengthException("need at least one block of input for CTS"); - } - - for (int i = bufOff; i != buf.length; i++) - { - buf[i] = block[i - blockSize]; - } - - for (int i = blockSize; i != bufOff; i++) - { - buf[i] ^= block[i - blockSize]; - } - - if (cipher instanceof CBCBlockCipher) - { - BlockCipher c = ((CBCBlockCipher)cipher).getUnderlyingCipher(); - - c.processBlock(buf, blockSize, out, outOff); - } - else - { - cipher.processBlock(buf, blockSize, out, outOff); - } - - System.arraycopy(block, 0, out, outOff + blockSize, len); - } - else - { - byte[] lastBlock = new byte[blockSize]; - - if (cipher instanceof CBCBlockCipher) - { - BlockCipher c = ((CBCBlockCipher)cipher).getUnderlyingCipher(); - - c.processBlock(buf, 0, block, 0); - } - else - { - cipher.processBlock(buf, 0, block, 0); - } - - for (int i = blockSize; i != bufOff; i++) - { - lastBlock[i - blockSize] = (byte)(block[i - blockSize] ^ buf[i]); - } - - System.arraycopy(buf, blockSize, block, 0, len); - - cipher.processBlock(block, 0, out, outOff); - System.arraycopy(lastBlock, 0, out, outOff + blockSize, len); - } - - int offset = bufOff; - - reset(); - - return offset; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/EAXBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/EAXBlockCipher.java deleted file mode 100644 index 1a1cd63..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/EAXBlockCipher.java +++ /dev/null @@ -1,368 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.Mac; -import org.bc.crypto.macs.CMac; -import org.bc.crypto.params.AEADParameters; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.util.Arrays; - -/** - * A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and - * Efficiency - by M. Bellare, P. Rogaway, D. Wagner. - * - * http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf - * - * EAX is an AEAD scheme based on CTR and OMAC1/CMAC, that uses a single block - * cipher to encrypt and authenticate data. It's on-line (the length of a - * message isn't needed to begin processing it), has good performances, it's - * simple and provably secure (provided the underlying block cipher is secure). - * - * Of course, this implementations is NOT thread-safe. - */ -public class EAXBlockCipher - implements AEADBlockCipher -{ - private static final byte nTAG = 0x0; - - private static final byte hTAG = 0x1; - - private static final byte cTAG = 0x2; - - private SICBlockCipher cipher; - - private boolean forEncryption; - - private int blockSize; - - private Mac mac; - - private byte[] nonceMac; - private byte[] associatedTextMac; - private byte[] macBlock; - - private int macSize; - private byte[] bufBlock; - private int bufOff; - - private boolean cipherInitialized; - private byte[] initialAssociatedText; - - /** - * Constructor that accepts an instance of a block cipher engine. - * - * @param cipher the engine to use - */ - public EAXBlockCipher(BlockCipher cipher) - { - blockSize = cipher.getBlockSize(); - mac = new CMac(cipher); - macBlock = new byte[blockSize]; - bufBlock = new byte[blockSize * 2]; - associatedTextMac = new byte[mac.getMacSize()]; - nonceMac = new byte[mac.getMacSize()]; - this.cipher = new SICBlockCipher(cipher); - } - - public String getAlgorithmName() - { - return cipher.getUnderlyingCipher().getAlgorithmName() + "/EAX"; - } - - public BlockCipher getUnderlyingCipher() - { - return cipher.getUnderlyingCipher(); - } - - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - byte[] nonce; - CipherParameters keyParam; - - if (params instanceof AEADParameters) - { - AEADParameters param = (AEADParameters)params; - - nonce = param.getNonce(); - initialAssociatedText = param.getAssociatedText(); - macSize = param.getMacSize() / 8; - keyParam = param.getKey(); - } - else if (params instanceof ParametersWithIV) - { - ParametersWithIV param = (ParametersWithIV)params; - - nonce = param.getIV(); - initialAssociatedText = null; - macSize = mac.getMacSize() / 2; - keyParam = param.getParameters(); - } - else - { - throw new IllegalArgumentException("invalid parameters passed to EAX"); - } - - byte[] tag = new byte[blockSize]; - - // Key reuse implemented in CBC mode of underlying CMac - mac.init(keyParam); - - tag[blockSize - 1] = nTAG; - mac.update(tag, 0, blockSize); - mac.update(nonce, 0, nonce.length); - mac.doFinal(nonceMac, 0); - - tag[blockSize - 1] = hTAG; - mac.update(tag, 0, blockSize); - - if (initialAssociatedText != null) - { - processAADBytes(initialAssociatedText, 0, initialAssociatedText.length); - } - - // Same BlockCipher underlies this and the mac, so reuse last key on cipher - cipher.init(true, new ParametersWithIV(null, nonceMac)); - } - - private void initCipher() - { - if (cipherInitialized) - { - return; - } - - cipherInitialized = true; - - mac.doFinal(associatedTextMac, 0); - - byte[] tag = new byte[blockSize]; - tag[blockSize - 1] = cTAG; - mac.update(tag, 0, blockSize); - } - - private void calculateMac() - { - byte[] outC = new byte[blockSize]; - mac.doFinal(outC, 0); - - for (int i = 0; i < macBlock.length; i++) - { - macBlock[i] = (byte)(nonceMac[i] ^ associatedTextMac[i] ^ outC[i]); - } - } - - public void reset() - { - reset(true); - } - - private void reset( - boolean clearMac) - { - cipher.reset(); // TODO Redundant since the mac will reset it? - mac.reset(); - - bufOff = 0; - Arrays.fill(bufBlock, (byte)0); - - if (clearMac) - { - Arrays.fill(macBlock, (byte)0); - } - - byte[] tag = new byte[blockSize]; - tag[blockSize - 1] = hTAG; - mac.update(tag, 0, blockSize); - - cipherInitialized = false; - - if (initialAssociatedText != null) - { - processAADBytes(initialAssociatedText, 0, initialAssociatedText.length); - } - } - - public void processAADByte(byte in) - { - if (cipherInitialized) - { - throw new IllegalStateException("AAD data cannot be added after encryption/decription processing has begun."); - } - mac.update(in); - } - - public void processAADBytes(byte[] in, int inOff, int len) - { - if (cipherInitialized) - { - throw new IllegalStateException("AAD data cannot be added after encryption/decription processing has begun."); - } - mac.update(in, inOff, len); - } - - public int processByte(byte in, byte[] out, int outOff) - throws DataLengthException - { - initCipher(); - - return process(in, out, outOff); - } - - public int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) - throws DataLengthException - { - initCipher(); - - int resultLen = 0; - - for (int i = 0; i != len; i++) - { - resultLen += process(in[inOff + i], out, outOff + resultLen); - } - - return resultLen; - } - - public int doFinal(byte[] out, int outOff) - throws IllegalStateException, InvalidCipherTextException - { - initCipher(); - - int extra = bufOff; - byte[] tmp = new byte[bufBlock.length]; - - bufOff = 0; - - if (forEncryption) - { - cipher.processBlock(bufBlock, 0, tmp, 0); - cipher.processBlock(bufBlock, blockSize, tmp, blockSize); - - System.arraycopy(tmp, 0, out, outOff, extra); - - mac.update(tmp, 0, extra); - - calculateMac(); - - System.arraycopy(macBlock, 0, out, outOff + extra, macSize); - - reset(false); - - return extra + macSize; - } - else - { - if (extra > macSize) - { - mac.update(bufBlock, 0, extra - macSize); - - cipher.processBlock(bufBlock, 0, tmp, 0); - cipher.processBlock(bufBlock, blockSize, tmp, blockSize); - - System.arraycopy(tmp, 0, out, outOff, extra - macSize); - } - - calculateMac(); - - if (!verifyMac(bufBlock, extra - macSize)) - { - throw new InvalidCipherTextException("mac check in EAX failed"); - } - - reset(false); - - return extra - macSize; - } - } - - public byte[] getMac() - { - byte[] mac = new byte[macSize]; - - System.arraycopy(macBlock, 0, mac, 0, macSize); - - return mac; - } - - public int getUpdateOutputSize(int len) - { - int totalData = len + bufOff; - if (!forEncryption) - { - if (totalData < macSize) - { - return 0; - } - totalData -= macSize; - } - return totalData - totalData % blockSize; - } - - public int getOutputSize(int len) - { - int totalData = len + bufOff; - - if (forEncryption) - { - return totalData + macSize; - } - - return totalData < macSize ? 0 : totalData - macSize; - } - - private int process(byte b, byte[] out, int outOff) - { - bufBlock[bufOff++] = b; - - if (bufOff == bufBlock.length) - { - // TODO Could move the processByte(s) calls to here -// initCipher(); - - int size; - - if (forEncryption) - { - size = cipher.processBlock(bufBlock, 0, out, outOff); - - mac.update(out, outOff, blockSize); - } - else - { - mac.update(bufBlock, 0, blockSize); - - size = cipher.processBlock(bufBlock, 0, out, outOff); - } - - bufOff = blockSize; - System.arraycopy(bufBlock, blockSize, bufBlock, 0, blockSize); - - return size; - } - - return 0; - } - - private boolean verifyMac(byte[] mac, int off) - { - int nonEqual = 0; - - for (int i = 0; i < macSize; i++) - { - nonEqual |= (macBlock[i] ^ mac[off + i]); - } - - return nonEqual == 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GCMBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GCMBlockCipher.java deleted file mode 100644 index c868d51..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GCMBlockCipher.java +++ /dev/null @@ -1,574 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.modes.gcm.GCMExponentiator; -import org.bc.crypto.modes.gcm.GCMMultiplier; -import org.bc.crypto.modes.gcm.Tables1kGCMExponentiator; -import org.bc.crypto.modes.gcm.Tables8kGCMMultiplier; -import org.bc.crypto.params.AEADParameters; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -/** - * Implements the Galois/Counter mode (GCM) detailed in - * NIST Special Publication 800-38D. - */ -public class GCMBlockCipher - implements AEADBlockCipher -{ - private static final int BLOCK_SIZE = 16; - - // not final due to a compiler bug - private BlockCipher cipher; - private GCMMultiplier multiplier; - private GCMExponentiator exp; - - // These fields are set by init and not modified by processing - private boolean forEncryption; - private int macSize; - private byte[] nonce; - private byte[] initialAssociatedText; - private byte[] H; - private byte[] J0; - - // These fields are modified during processing - private byte[] bufBlock; - private byte[] macBlock; - private byte[] S, S_at, S_atPre; - private byte[] counter; - private int bufOff; - private long totalLength; - private byte[] atBlock; - private int atBlockPos; - private long atLength; - private long atLengthPre; - - public GCMBlockCipher(BlockCipher c) - { - this(c, null); - } - - public GCMBlockCipher(BlockCipher c, GCMMultiplier m) - { - if (c.getBlockSize() != BLOCK_SIZE) - { - throw new IllegalArgumentException( - "cipher required with a block size of " + BLOCK_SIZE + "."); - } - - if (m == null) - { - // TODO Consider a static property specifying default multiplier - m = new Tables8kGCMMultiplier(); - } - - this.cipher = c; - this.multiplier = m; - } - - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/GCM"; - } - - public void init(boolean forEncryption, CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - this.macBlock = null; - - KeyParameter keyParam; - - if (params instanceof AEADParameters) - { - AEADParameters param = (AEADParameters)params; - - nonce = param.getNonce(); - initialAssociatedText = param.getAssociatedText(); - - int macSizeBits = param.getMacSize(); - if (macSizeBits < 96 || macSizeBits > 128 || macSizeBits % 8 != 0) - { - throw new IllegalArgumentException("Invalid value for MAC size: " + macSizeBits); - } - - macSize = macSizeBits / 8; - keyParam = param.getKey(); - } - else if (params instanceof ParametersWithIV) - { - ParametersWithIV param = (ParametersWithIV)params; - - nonce = param.getIV(); - initialAssociatedText = null; - macSize = 16; - keyParam = (KeyParameter)param.getParameters(); - } - else - { - throw new IllegalArgumentException("invalid parameters passed to GCM"); - } - - int bufLength = forEncryption ? BLOCK_SIZE : (BLOCK_SIZE + macSize); - this.bufBlock = new byte[bufLength]; - - if (nonce == null || nonce.length < 1) - { - throw new IllegalArgumentException("IV must be at least 1 byte"); - } - - // TODO This should be configurable by init parameters - // (but must be 16 if nonce length not 12) (BLOCK_SIZE?) -// this.tagLength = 16; - - // Cipher always used in forward mode - // if keyParam is null we're reusing the last key. - if (keyParam != null) - { - cipher.init(true, keyParam); - - this.H = new byte[BLOCK_SIZE]; - cipher.processBlock(H, 0, H, 0); - - // GCMMultiplier tables don't change unless the key changes (and are expensive to init) - multiplier.init(H); - exp = null; - } - - this.J0 = new byte[BLOCK_SIZE]; - - if (nonce.length == 12) - { - System.arraycopy(nonce, 0, J0, 0, nonce.length); - this.J0[BLOCK_SIZE - 1] = 0x01; - } - else - { - gHASH(J0, nonce, nonce.length); - byte[] X = new byte[BLOCK_SIZE]; - Pack.longToBigEndian((long)nonce.length * 8, X, 8); - gHASHBlock(J0, X); - } - - this.S = new byte[BLOCK_SIZE]; - this.S_at = new byte[BLOCK_SIZE]; - this.S_atPre = new byte[BLOCK_SIZE]; - this.atBlock = new byte[BLOCK_SIZE]; - this.atBlockPos = 0; - this.atLength = 0; - this.atLengthPre = 0; - this.counter = Arrays.clone(J0); - this.bufOff = 0; - this.totalLength = 0; - - if (initialAssociatedText != null) - { - processAADBytes(initialAssociatedText, 0, initialAssociatedText.length); - } - } - - public byte[] getMac() - { - return Arrays.clone(macBlock); - } - - public int getOutputSize(int len) - { - int totalData = len + bufOff; - - if (forEncryption) - { - return totalData + macSize; - } - - return totalData < macSize ? 0 : totalData - macSize; - } - - public int getUpdateOutputSize(int len) - { - int totalData = len + bufOff; - if (!forEncryption) - { - if (totalData < macSize) - { - return 0; - } - totalData -= macSize; - } - return totalData - totalData % BLOCK_SIZE; - } - - public void processAADByte(byte in) - { - atBlock[atBlockPos] = in; - if (++atBlockPos == BLOCK_SIZE) - { - // Hash each block as it fills - gHASHBlock(S_at, atBlock); - atBlockPos = 0; - atLength += BLOCK_SIZE; - } - } - - public void processAADBytes(byte[] in, int inOff, int len) - { - for (int i = 0; i < len; ++i) - { - atBlock[atBlockPos] = in[inOff + i]; - if (++atBlockPos == BLOCK_SIZE) - { - // Hash each block as it fills - gHASHBlock(S_at, atBlock); - atBlockPos = 0; - atLength += BLOCK_SIZE; - } - } - } - - private void initCipher() - { - if (atLength > 0) - { - System.arraycopy(S_at, 0, S_atPre, 0, BLOCK_SIZE); - atLengthPre = atLength; - } - - // Finish hash for partial AAD block - if (atBlockPos > 0) - { - gHASHPartial(S_atPre, atBlock, 0, atBlockPos); - atLengthPre += atBlockPos; - } - - if (atLengthPre > 0) - { - System.arraycopy(S_atPre, 0, S, 0, BLOCK_SIZE); - } - } - - public int processByte(byte in, byte[] out, int outOff) - throws DataLengthException - { - bufBlock[bufOff] = in; - if (++bufOff == bufBlock.length) - { - outputBlock(out, outOff); - return BLOCK_SIZE; - } - return 0; - } - - public int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) - throws DataLengthException - { - int resultLen = 0; - - for (int i = 0; i < len; ++i) - { - bufBlock[bufOff] = in[inOff + i]; - if (++bufOff == bufBlock.length) - { - outputBlock(out, outOff + resultLen); - resultLen += BLOCK_SIZE; - } - } - - return resultLen; - } - - private void outputBlock(byte[] output, int offset) - { - if (totalLength == 0) - { - initCipher(); - } - gCTRBlock(bufBlock, output, offset); - if (forEncryption) - { - bufOff = 0; - } - else - { - System.arraycopy(bufBlock, BLOCK_SIZE, bufBlock, 0, macSize); - bufOff = macSize; - } - } - - public int doFinal(byte[] out, int outOff) - throws IllegalStateException, InvalidCipherTextException - { - if (totalLength == 0) - { - initCipher(); - } - - int extra = bufOff; - if (!forEncryption) - { - if (extra < macSize) - { - throw new InvalidCipherTextException("data too short"); - } - extra -= macSize; - } - - if (extra > 0) - { - gCTRPartial(bufBlock, 0, extra, out, outOff); - } - - atLength += atBlockPos; - - if (atLength > atLengthPre) - { - /* - * Some AAD was sent after the cipher started. We determine the difference b/w the hash value - * we actually used when the cipher started (S_atPre) and the final hash value calculated (S_at). - * Then we carry this difference forward by multiplying by H^c, where c is the number of (full or - * partial) cipher-text blocks produced, and adjust the current hash. - */ - - // Finish hash for partial AAD block - if (atBlockPos > 0) - { - gHASHPartial(S_at, atBlock, 0, atBlockPos); - } - - // Find the difference between the AAD hashes - if (atLengthPre > 0) - { - xor(S_at, S_atPre); - } - - // Number of cipher-text blocks produced - long c = ((totalLength * 8) + 127) >>> 7; - - // Calculate the adjustment factor - byte[] H_c = new byte[16]; - if (exp == null) - { - exp = new Tables1kGCMExponentiator(); - exp.init(H); - } - exp.exponentiateX(c, H_c); - - // Carry the difference forward - multiply(S_at, H_c); - - // Adjust the current hash - xor(S, S_at); - } - - // Final gHASH - byte[] X = new byte[BLOCK_SIZE]; - Pack.longToBigEndian(atLength * 8, X, 0); - Pack.longToBigEndian(totalLength * 8, X, 8); - - gHASHBlock(S, X); - - // TODO Fix this if tagLength becomes configurable - // T = MSBt(GCTRk(J0,S)) - byte[] tag = new byte[BLOCK_SIZE]; - cipher.processBlock(J0, 0, tag, 0); - xor(tag, S); - - int resultLen = extra; - - // We place into macBlock our calculated value for T - this.macBlock = new byte[macSize]; - System.arraycopy(tag, 0, macBlock, 0, macSize); - - if (forEncryption) - { - // Append T to the message - System.arraycopy(macBlock, 0, out, outOff + bufOff, macSize); - resultLen += macSize; - } - else - { - // Retrieve the T value from the message and compare to calculated one - byte[] msgMac = new byte[macSize]; - System.arraycopy(bufBlock, extra, msgMac, 0, macSize); - if (!Arrays.constantTimeAreEqual(this.macBlock, msgMac)) - { - throw new InvalidCipherTextException("mac check in GCM failed"); - } - } - - reset(false); - - return resultLen; - } - - public void reset() - { - reset(true); - } - - private void reset( - boolean clearMac) - { - cipher.reset(); - - S = new byte[BLOCK_SIZE]; - S_at = new byte[BLOCK_SIZE]; - S_atPre = new byte[BLOCK_SIZE]; - atBlock = new byte[BLOCK_SIZE]; - atBlockPos = 0; - atLength = 0; - atLengthPre = 0; - counter = Arrays.clone(J0); - bufOff = 0; - totalLength = 0; - - if (bufBlock != null) - { - Arrays.fill(bufBlock, (byte)0); - } - - if (clearMac) - { - macBlock = null; - } - - if (initialAssociatedText != null) - { - processAADBytes(initialAssociatedText, 0, initialAssociatedText.length); - } - } - - private void gCTRBlock(byte[] block, byte[] out, int outOff) - { - byte[] tmp = getNextCounterBlock(); - - xor(tmp, block); - System.arraycopy(tmp, 0, out, outOff, BLOCK_SIZE); - - gHASHBlock(S, forEncryption ? tmp : block); - - totalLength += BLOCK_SIZE; - } - - private void gCTRPartial(byte[] buf, int off, int len, byte[] out, int outOff) - { - byte[] tmp = getNextCounterBlock(); - - xor(tmp, buf, off, len); - System.arraycopy(tmp, 0, out, outOff, len); - - gHASHPartial(S, forEncryption ? tmp : buf, 0, len); - - totalLength += len; - } - - private void gHASH(byte[] Y, byte[] b, int len) - { - for (int pos = 0; pos < len; pos += BLOCK_SIZE) - { - int num = Math.min(len - pos, BLOCK_SIZE); - gHASHPartial(Y, b, pos, num); - } - } - - private void gHASHBlock(byte[] Y, byte[] b) - { - xor(Y, b); - multiplier.multiplyH(Y); - } - - private void gHASHPartial(byte[] Y, byte[] b, int off, int len) - { - xor(Y, b, off, len); - multiplier.multiplyH(Y); - } - - private byte[] getNextCounterBlock() - { - for (int i = 15; i >= 12; --i) - { - byte b = (byte)((counter[i] + 1) & 0xff); - counter[i] = b; - - if (b != 0) - { - break; - } - } - - byte[] tmp = new byte[BLOCK_SIZE]; - // TODO Sure would be nice if ciphers could operate on int[] - cipher.processBlock(counter, 0, tmp, 0); - return tmp; - } - - private static void multiply(byte[] block, byte[] val) - { - byte[] tmp = Arrays.clone(block); - byte[] c = new byte[16]; - - for (int i = 0; i < 16; ++i) - { - byte bits = val[i]; - for (int j = 7; j >= 0; --j) - { - if ((bits & (1 << j)) != 0) - { - xor(c, tmp); - } - - boolean lsb = (tmp[15] & 1) != 0; - shiftRight(tmp); - if (lsb) - { - // R = new byte[]{ 0xe1, ... }; -// xor(v, R); - tmp[0] ^= (byte)0xe1; - } - } - } - - System.arraycopy(c, 0, block, 0, 16); - } - - private static void shiftRight(byte[] block) - { - int i = 0; - int bit = 0; - for (;;) - { - int b = block[i] & 0xff; - block[i] = (byte) ((b >>> 1) | bit); - if (++i == 16) - { - break; - } - bit = (b & 1) << 7; - } - } - - private static void xor(byte[] block, byte[] val) - { - for (int i = 15; i >= 0; --i) - { - block[i] ^= val[i]; - } - } - - private static void xor(byte[] block, byte[] val, int off, int len) - { - while (len-- > 0) - { - block[len] ^= val[off + len]; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GOFBBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GOFBBlockCipher.java deleted file mode 100644 index a7d84e1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/GOFBBlockCipher.java +++ /dev/null @@ -1,234 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; - -/** - * implements the GOST 28147 OFB counter mode (GCTR). - */ -public class GOFBBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] ofbV; - private byte[] ofbOutV; - - private final int blockSize; - private final BlockCipher cipher; - - boolean firstStep = true; - int N3; - int N4; - static final int C1 = 16843012; //00000001000000010000000100000100 - static final int C2 = 16843009; //00000001000000010000000100000001 - - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * counter mode (must have a 64 bit block size). - */ - public GOFBBlockCipher( - BlockCipher cipher) - { - this.cipher = cipher; - this.blockSize = cipher.getBlockSize(); - - if (blockSize != 8) - { - throw new IllegalArgumentException("GCTR only for 64 bit block ciphers"); - } - - this.IV = new byte[cipher.getBlockSize()]; - this.ofbV = new byte[cipher.getBlockSize()]; - this.ofbOutV = new byte[cipher.getBlockSize()]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param encrypting if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, //ignored by this CTR mode - CipherParameters params) - throws IllegalArgumentException - { - firstStep = true; - N3 = 0; - N4 = 0; - - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length < IV.length) - { - // prepend the supplied IV with zeros (per FIPS PUB 81) - System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); - for (int i = 0; i < IV.length - iv.length; i++) - { - IV[i] = 0; - } - } - else - { - System.arraycopy(iv, 0, IV, 0, IV.length); - } - - reset(); - - // if params is null we reuse the current working key. - if (ivParam.getParameters() != null) - { - cipher.init(true, ivParam.getParameters()); - } - } - else - { - reset(); - - // if params is null we reuse the current working key. - if (params != null) - { - cipher.init(true, params); - } - } - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/GCTR" - * and the block size in bits - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/GCTR"; - } - - - /** - * return the block size we are operating at (in bytes). - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return blockSize; - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (firstStep) - { - firstStep = false; - cipher.processBlock(ofbV, 0, ofbOutV, 0); - N3 = bytesToint(ofbOutV, 0); - N4 = bytesToint(ofbOutV, 4); - } - N3 += C2; - N4 += C1; - intTobytes(N3, ofbV, 0); - intTobytes(N4, ofbV, 4); - - cipher.processBlock(ofbV, 0, ofbOutV, 0); - - // - // XOR the ofbV with the plaintext producing the cipher text (and - // the next input block). - // - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] = (byte)(ofbOutV[i] ^ in[inOff + i]); - } - - // - // change over the input block. - // - System.arraycopy(ofbV, blockSize, ofbV, 0, ofbV.length - blockSize); - System.arraycopy(ofbOutV, 0, ofbV, ofbV.length - blockSize, blockSize); - - return blockSize; - } - - /** - * reset the feedback vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - System.arraycopy(IV, 0, ofbV, 0, IV.length); - - cipher.reset(); - } - - //array of bytes to type int - private int bytesToint( - byte[] in, - int inOff) - { - return ((in[inOff + 3] << 24) & 0xff000000) + ((in[inOff + 2] << 16) & 0xff0000) + - ((in[inOff + 1] << 8) & 0xff00) + (in[inOff] & 0xff); - } - - //int to array of bytes - private void intTobytes( - int num, - byte[] out, - int outOff) - { - out[outOff + 3] = (byte)(num >>> 24); - out[outOff + 2] = (byte)(num >>> 16); - out[outOff + 1] = (byte)(num >>> 8); - out[outOff] = (byte)num; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OFBBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OFBBlockCipher.java deleted file mode 100644 index 20970ee..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OFBBlockCipher.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; - -/** - * implements a Output-FeedBack (OFB) mode on top of a simple cipher. - */ -public class OFBBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] ofbV; - private byte[] ofbOutV; - - private final int blockSize; - private final BlockCipher cipher; - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * feedback mode. - * @param blockSize the block size in bits (note: a multiple of 8) - */ - public OFBBlockCipher( - BlockCipher cipher, - int blockSize) - { - this.cipher = cipher; - this.blockSize = blockSize / 8; - - this.IV = new byte[cipher.getBlockSize()]; - this.ofbV = new byte[cipher.getBlockSize()]; - this.ofbOutV = new byte[cipher.getBlockSize()]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param encrypting if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean encrypting, //ignored by this OFB mode - CipherParameters params) - throws IllegalArgumentException - { - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length < IV.length) - { - // prepend the supplied IV with zeros (per FIPS PUB 81) - System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); - for (int i = 0; i < IV.length - iv.length; i++) - { - IV[i] = 0; - } - } - else - { - System.arraycopy(iv, 0, IV, 0, IV.length); - } - - reset(); - - // if null it's an IV changed only. - if (ivParam.getParameters() != null) - { - cipher.init(true, ivParam.getParameters()); - } - } - else - { - reset(); - - // if it's null, key is to be reused. - if (params != null) - { - cipher.init(true, params); - } - } - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/OFB" - * and the block size in bits - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/OFB" + (blockSize * 8); - } - - - /** - * return the block size we are operating at (in bytes). - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return blockSize; - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(ofbV, 0, ofbOutV, 0); - - // - // XOR the ofbV with the plaintext producing the cipher text (and - // the next input block). - // - for (int i = 0; i < blockSize; i++) - { - out[outOff + i] = (byte)(ofbOutV[i] ^ in[inOff + i]); - } - - // - // change over the input block. - // - System.arraycopy(ofbV, blockSize, ofbV, 0, ofbV.length - blockSize); - System.arraycopy(ofbOutV, 0, ofbV, ofbV.length - blockSize, blockSize); - - return blockSize; - } - - /** - * reset the feedback vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - System.arraycopy(IV, 0, ofbV, 0, IV.length); - - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OpenPGPCFBBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OpenPGPCFBBlockCipher.java deleted file mode 100644 index e5b426e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/OpenPGPCFBBlockCipher.java +++ /dev/null @@ -1,312 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; - -/** - * Implements OpenPGP's rather strange version of Cipher-FeedBack (CFB) mode - * on top of a simple cipher. This class assumes the IV has been prepended - * to the data stream already, and just accomodates the reset after - * (blockSize + 2) bytes have been read. - *

    - * For further info see RFC 2440. - */ -public class OpenPGPCFBBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] FR; - private byte[] FRE; - - private BlockCipher cipher; - - private int count; - private int blockSize; - private boolean forEncryption; - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * feedback mode. - */ - public OpenPGPCFBBlockCipher( - BlockCipher cipher) - { - this.cipher = cipher; - - this.blockSize = cipher.getBlockSize(); - this.IV = new byte[blockSize]; - this.FR = new byte[blockSize]; - this.FRE = new byte[blockSize]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/PGPCFB" - * and the block size in bits. - */ - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/OpenPGPCFB"; - } - - /** - * return the block size we are operating at. - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - return (forEncryption) ? encryptBlock(in, inOff, out, outOff) : decryptBlock(in, inOff, out, outOff); - } - - /** - * reset the chaining vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - count = 0; - - System.arraycopy(IV, 0, FR, 0, FR.length); - - cipher.reset(); - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - reset(); - - cipher.init(true, params); - } - - /** - * Encrypt one byte of data according to CFB mode. - * @param data the byte to encrypt - * @param blockOff offset in the current block - * @return the encrypted byte - */ - private byte encryptByte(byte data, int blockOff) - { - return (byte)(FRE[blockOff] ^ data); - } - - /** - * Do the appropriate processing for CFB IV mode encryption. - * - * @param in the array containing the data to be encrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (count > blockSize) - { - FR[blockSize - 2] = out[outOff] = encryptByte(in[inOff], blockSize - 2); - FR[blockSize - 1] = out[outOff + 1] = encryptByte(in[inOff + 1], blockSize - 1); - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 2; n < blockSize; n++) - { - FR[n - 2] = out[outOff + n] = encryptByte(in[inOff + n], n - 2); - } - } - else if (count == 0) - { - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize; n++) - { - FR[n] = out[outOff + n] = encryptByte(in[inOff + n], n); - } - - count += blockSize; - } - else if (count == blockSize) - { - cipher.processBlock(FR, 0, FRE, 0); - - out[outOff] = encryptByte(in[inOff], 0); - out[outOff + 1] = encryptByte(in[inOff + 1], 1); - - // - // do reset - // - System.arraycopy(FR, 2, FR, 0, blockSize - 2); - System.arraycopy(out, outOff, FR, blockSize - 2, 2); - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 2; n < blockSize; n++) - { - FR[n - 2] = out[outOff + n] = encryptByte(in[inOff + n], n - 2); - } - - count += blockSize; - } - - return blockSize; - } - - /** - * Do the appropriate processing for CFB IV mode decryption. - * - * @param in the array containing the data to be decrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (count > blockSize) - { - byte inVal = in[inOff]; - FR[blockSize - 2] = inVal; - out[outOff] = encryptByte(inVal, blockSize - 2); - - inVal = in[inOff + 1]; - FR[blockSize - 1] = inVal; - out[outOff + 1] = encryptByte(inVal, blockSize - 1); - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 2; n < blockSize; n++) - { - inVal = in[inOff + n]; - FR[n - 2] = inVal; - out[outOff + n] = encryptByte(inVal, n - 2); - } - } - else if (count == 0) - { - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize; n++) - { - FR[n] = in[inOff + n]; - out[n] = encryptByte(in[inOff + n], n); - } - - count += blockSize; - } - else if (count == blockSize) - { - cipher.processBlock(FR, 0, FRE, 0); - - byte inVal1 = in[inOff]; - byte inVal2 = in[inOff + 1]; - out[outOff ] = encryptByte(inVal1, 0); - out[outOff + 1] = encryptByte(inVal2, 1); - - System.arraycopy(FR, 2, FR, 0, blockSize - 2); - - FR[blockSize - 2] = inVal1; - FR[blockSize - 1] = inVal2; - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 2; n < blockSize; n++) - { - byte inVal = in[inOff + n]; - FR[n - 2] = inVal; - out[outOff + n] = encryptByte(inVal, n - 2); - } - - count += blockSize; - } - - return blockSize; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PGPCFBBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PGPCFBBlockCipher.java deleted file mode 100644 index 16db7f9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PGPCFBBlockCipher.java +++ /dev/null @@ -1,450 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Implements OpenPGP's rather strange version of Cipher-FeedBack (CFB) mode on top of a simple cipher. For further info see RFC 2440. - */ -public class PGPCFBBlockCipher - implements BlockCipher -{ - private byte[] IV; - private byte[] FR; - private byte[] FRE; - private byte[] tmp; - - private BlockCipher cipher; - - private int count; - private int blockSize; - private boolean forEncryption; - - private boolean inlineIv; // if false we don't need to prepend an IV - - /** - * Basic constructor. - * - * @param cipher the block cipher to be used as the basis of the - * feedback mode. - * @param inlineIv if true this is for PGP CFB with a prepended iv. - */ - public PGPCFBBlockCipher( - BlockCipher cipher, - boolean inlineIv) - { - this.cipher = cipher; - this.inlineIv = inlineIv; - - this.blockSize = cipher.getBlockSize(); - this.IV = new byte[blockSize]; - this.FR = new byte[blockSize]; - this.FRE = new byte[blockSize]; - this.tmp = new byte[blockSize]; - } - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - /** - * return the algorithm name and mode. - * - * @return the name of the underlying algorithm followed by "/PGPCFB" - * and the block size in bits. - */ - public String getAlgorithmName() - { - if (inlineIv) - { - return cipher.getAlgorithmName() + "/PGPCFBwithIV"; - } - else - { - return cipher.getAlgorithmName() + "/PGPCFB"; - } - } - - /** - * return the block size we are operating at. - * - * @return the block size we are operating at (in bytes). - */ - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - /** - * Process one block of input from the array in and write it to - * the out array. - * - * @param in the array containing the input data. - * @param inOff offset into the in array the data starts at. - * @param out the array the output data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - public int processBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (inlineIv) - { - return (forEncryption) ? encryptBlockWithIV(in, inOff, out, outOff) : decryptBlockWithIV(in, inOff, out, outOff); - } - else - { - return (forEncryption) ? encryptBlock(in, inOff, out, outOff) : decryptBlock(in, inOff, out, outOff); - } - } - - /** - * reset the chaining vector back to the IV and reset the underlying - * cipher. - */ - public void reset() - { - count = 0; - - for (int i = 0; i != FR.length; i++) - { - if (inlineIv) - { - FR[i] = 0; - } - else - { - FR[i] = IV[i]; // if simple mode, key is IV (even if this is zero) - } - } - - cipher.reset(); - } - - /** - * Initialise the cipher and, possibly, the initialisation vector (IV). - * If an IV isn't passed as part of the parameter, the IV will be all zeros. - * An IV which is too short is handled in FIPS compliant fashion. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - - if (iv.length < IV.length) - { - // prepend the supplied IV with zeros (per FIPS PUB 81) - System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); - for (int i = 0; i < IV.length - iv.length; i++) - { - IV[i] = 0; - } - } - else - { - System.arraycopy(iv, 0, IV, 0, IV.length); - } - - reset(); - - cipher.init(true, ivParam.getParameters()); - } - else - { - reset(); - - cipher.init(true, params); - } - } - - /** - * Encrypt one byte of data according to CFB mode. - * @param data the byte to encrypt - * @param blockOff where am i in the current block, determines when to resync the block - * @returns the encrypted byte - */ - private byte encryptByte(byte data, int blockOff) - { - return (byte)(FRE[blockOff] ^ data); - } - - /** - * Do the appropriate processing for CFB IV mode encryption. - * - * @param in the array containing the data to be encrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int encryptBlockWithIV( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (count == 0) - { - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize; n++) - { - out[outOff + n] = encryptByte(IV[n], n); - } - - System.arraycopy(out, outOff, FR, 0, blockSize); - - cipher.processBlock(FR, 0, FRE, 0); - - out[outOff + blockSize] = encryptByte(IV[blockSize - 2], 0); - out[outOff + blockSize + 1] = encryptByte(IV[blockSize - 1], 1); - - System.arraycopy(out, outOff + 2, FR, 0, blockSize); - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize; n++) - { - out[outOff + blockSize + 2 + n] = encryptByte(in[inOff + n], n); - } - - System.arraycopy(out, outOff + blockSize + 2, FR, 0, blockSize); - - count += 2 * blockSize + 2; - - return 2 * blockSize + 2; - } - else if (count >= blockSize + 2) - { - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize; n++) - { - out[outOff + n] = encryptByte(in[inOff + n], n); - } - - System.arraycopy(out, outOff, FR, 0, blockSize); - } - - return blockSize; - } - - /** - * Do the appropriate processing for CFB IV mode decryption. - * - * @param in the array containing the data to be decrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int decryptBlockWithIV( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - if (count == 0) - { - for (int n = 0; n < blockSize; n++) - { - FR[n] = in[inOff + n]; - } - - cipher.processBlock(FR, 0, FRE, 0); - - count += blockSize; - - return 0; - } - else if (count == blockSize) - { - // copy in buffer so that this mode works if in and out are the same - System.arraycopy(in, inOff, tmp, 0, blockSize); - - System.arraycopy(FR, 2, FR, 0, blockSize - 2); - - FR[blockSize - 2] = tmp[0]; - FR[blockSize - 1] = tmp[1]; - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize - 2; n++) - { - out[outOff + n] = encryptByte(tmp[n + 2], n); - } - - System.arraycopy(tmp, 2, FR, 0, blockSize - 2); - - count += 2; - - return blockSize - 2; - } - else if (count >= blockSize + 2) - { - // copy in buffer so that this mode works if in and out are the same - System.arraycopy(in, inOff, tmp, 0, blockSize); - - out[outOff + 0] = encryptByte(tmp[0], blockSize - 2); - out[outOff + 1] = encryptByte(tmp[1], blockSize - 1); - - System.arraycopy(tmp, 0, FR, blockSize - 2, 2); - - cipher.processBlock(FR, 0, FRE, 0); - - for (int n = 0; n < blockSize - 2; n++) - { - out[outOff + n + 2] = encryptByte(tmp[n + 2], n); - } - - System.arraycopy(tmp, 2, FR, 0, blockSize - 2); - - } - - return blockSize; - } - - /** - * Do the appropriate processing for CFB mode encryption. - * - * @param in the array containing the data to be encrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int encryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(FR, 0, FRE, 0); - for (int n = 0; n < blockSize; n++) - { - out[outOff + n] = encryptByte(in[inOff + n], n); - } - - for (int n = 0; n < blockSize; n++) - { - FR[n] = out[outOff + n]; - } - - return blockSize; - - } - - /** - * Do the appropriate processing for CFB mode decryption. - * - * @param in the array containing the data to be decrypted. - * @param inOff offset into the in array the data starts at. - * @param out the array the encrypted data will be copied into. - * @param outOff the offset into the out array the output will start at. - * @exception DataLengthException if there isn't enough data in in, or - * space in out. - * @exception IllegalStateException if the cipher isn't initialised. - * @return the number of bytes processed and produced. - */ - private int decryptBlock( - byte[] in, - int inOff, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if ((inOff + blockSize) > in.length) - { - throw new DataLengthException("input buffer too short"); - } - - if ((outOff + blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - cipher.processBlock(FR, 0, FRE, 0); - for (int n = 0; n < blockSize; n++) - { - out[outOff + n] = encryptByte(in[inOff + n], n); - } - - for (int n = 0; n < blockSize; n++) - { - FR[n] = in[inOff + n]; - } - - return blockSize; - - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PaddedBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PaddedBlockCipher.java deleted file mode 100644 index 03a7bfb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/PaddedBlockCipher.java +++ /dev/null @@ -1,253 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; - -/** - * A wrapper class that allows block ciphers to be used to process data in - * a piecemeal fashion with PKCS5/PKCS7 padding. The PaddedBlockCipher - * outputs a block only when the buffer is full and more data is being added, - * or on a doFinal (unless the current block in the buffer is a pad block). - * The padding mechanism used is the one outlined in PKCS5/PKCS7. - * - * @deprecated use org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher instead. - */ -public class PaddedBlockCipher - extends BufferedBlockCipher -{ - /** - * Create a buffered block cipher with, or without, padding. - * - * @param cipher the underlying block cipher this buffering object wraps. - */ - public PaddedBlockCipher( - BlockCipher cipher) - { - this.cipher = cipher; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - } - - /** - * return the size of the output buffer required for an update plus a - * doFinal with an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update and doFinal - * with len bytes of input. - */ - public int getOutputSize( - int len) - { - int total = len + bufOff; - int leftOver = total % buf.length; - - if (leftOver == 0) - { - if (forEncryption) - { - return total + buf.length; - } - - return total; - } - - return total - leftOver + buf.length; - } - - /** - * return the size of the output buffer required for an update - * an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update - * with len bytes of input. - */ - public int getUpdateOutputSize( - int len) - { - int total = len + bufOff; - int leftOver = total % buf.length; - - if (leftOver == 0) - { - return total - buf.length; - } - - return total - leftOver; - } - - /** - * process a single byte, producing an output block if neccessary. - * - * @param in the input byte. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processByte( - byte in, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - int resultLen = 0; - - if (bufOff == buf.length) - { - resultLen = cipher.processBlock(buf, 0, out, outOff); - bufOff = 0; - } - - buf[bufOff++] = in; - - return resultLen; - } - - /** - * process an array of bytes, producing output if necessary. - * - * @param in the input byte array. - * @param inOff the offset at which the input data starts. - * @param len the number of bytes to be copied out of the input array. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = getBlockSize(); - int length = getUpdateOutputSize(len); - - if (length > 0) - { - if ((outOff + length) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, out, outOff); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > buf.length) - { - resultLen += cipher.processBlock(in, inOff, out, outOff + resultLen); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - - return resultLen; - } - - /** - * Process the last block in the buffer. If the buffer is currently - * full and padding needs to be added a call to doFinal will produce - * 2 * getBlockSize() bytes. - * - * @param out the array the block currently being held is copied into. - * @param outOff the offset at which the copying starts. - * @exception DataLengthException if there is insufficient space in out for - * the output or we are decrypting and the input is not block size aligned. - * @exception IllegalStateException if the underlying cipher is not - * initialised. - * @exception InvalidCipherTextException if padding is expected and not found. - */ - public int doFinal( - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException, InvalidCipherTextException - { - int blockSize = cipher.getBlockSize(); - int resultLen = 0; - - if (forEncryption) - { - if (bufOff == blockSize) - { - if ((outOff + 2 * blockSize) > out.length) - { - throw new DataLengthException("output buffer too short"); - } - - resultLen = cipher.processBlock(buf, 0, out, outOff); - bufOff = 0; - } - - // - // add PKCS7 padding - // - byte code = (byte)(blockSize - bufOff); - - while (bufOff < blockSize) - { - buf[bufOff] = code; - bufOff++; - } - - resultLen += cipher.processBlock(buf, 0, out, outOff + resultLen); - } - else - { - if (bufOff == blockSize) - { - resultLen = cipher.processBlock(buf, 0, buf, 0); - bufOff = 0; - } - else - { - throw new DataLengthException("last block incomplete in decryption"); - } - - // - // remove PKCS7 padding - // - int count = buf[blockSize - 1] & 0xff; - - if ((count < 0) || (count > blockSize)) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - - resultLen -= count; - - System.arraycopy(buf, 0, out, outOff, resultLen); - } - - reset(); - - return resultLen; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/SICBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/SICBlockCipher.java deleted file mode 100644 index f0631f9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/SICBlockCipher.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.bc.crypto.modes; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.params.ParametersWithIV; - -/** - * Implements the Segmented Integer Counter (SIC) mode on top of a simple - * block cipher. This mode is also known as CTR mode. - */ -public class SICBlockCipher - implements BlockCipher -{ - private final BlockCipher cipher; - private final int blockSize; - - private byte[] IV; - private byte[] counter; - private byte[] counterOut; - - - /** - * Basic constructor. - * - * @param c the block cipher to be used. - */ - public SICBlockCipher(BlockCipher c) - { - this.cipher = c; - this.blockSize = cipher.getBlockSize(); - this.IV = new byte[blockSize]; - this.counter = new byte[blockSize]; - this.counterOut = new byte[blockSize]; - } - - - /** - * return the underlying block cipher that we are wrapping. - * - * @return the underlying block cipher that we are wrapping. - */ - public BlockCipher getUnderlyingCipher() - { - return cipher; - } - - - public void init( - boolean forEncryption, //ignored by this CTR mode - CipherParameters params) - throws IllegalArgumentException - { - if (params instanceof ParametersWithIV) - { - ParametersWithIV ivParam = (ParametersWithIV)params; - byte[] iv = ivParam.getIV(); - System.arraycopy(iv, 0, IV, 0, IV.length); - - reset(); - - // if null it's an IV changed only. - if (ivParam.getParameters() != null) - { - cipher.init(true, ivParam.getParameters()); - } - } - else - { - throw new IllegalArgumentException("SIC mode requires ParametersWithIV"); - } - } - - public String getAlgorithmName() - { - return cipher.getAlgorithmName() + "/SIC"; - } - - public int getBlockSize() - { - return cipher.getBlockSize(); - } - - - public int processBlock(byte[] in, int inOff, byte[] out, int outOff) - throws DataLengthException, IllegalStateException - { - cipher.processBlock(counter, 0, counterOut, 0); - - // - // XOR the counterOut with the plaintext producing the cipher text - // - for (int i = 0; i < counterOut.length; i++) - { - out[outOff + i] = (byte)(counterOut[i] ^ in[inOff + i]); - } - - // increment counter by 1. - for (int i = counter.length - 1; i >= 0 && ++counter[i] == 0; i--) - { - ; // do nothing - pre-increment and test for 0 in counter does the job. - } - - return counter.length; - } - - - public void reset() - { - System.arraycopy(IV, 0, counter, 0, counter.length); - cipher.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMExponentiator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMExponentiator.java deleted file mode 100644 index c6e17f0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMExponentiator.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import org.bc.util.Arrays; - -public class BasicGCMExponentiator implements GCMExponentiator -{ - private byte[] x; - - public void init(byte[] x) - { - this.x = Arrays.clone(x); - } - - public void exponentiateX(long pow, byte[] output) - { - // Initial value is little-endian 1 - byte[] y = GCMUtil.oneAsBytes(); - - if (pow > 0) - { - byte[] powX = Arrays.clone(x); - do - { - if ((pow & 1L) != 0) - { - GCMUtil.multiply(y, powX); - } - GCMUtil.multiply(powX, powX); - pow >>>= 1; - } - while (pow > 0); - } - - System.arraycopy(y, 0, output, 0, 16); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMMultiplier.java deleted file mode 100644 index 3733b13..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/BasicGCMMultiplier.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import org.bc.util.Arrays; - -public class BasicGCMMultiplier implements GCMMultiplier -{ - private byte[] H; - - public void init(byte[] H) - { - this.H = Arrays.clone(H); - } - - public void multiplyH(byte[] x) - { - GCMUtil.multiply(x, H); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMExponentiator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMExponentiator.java deleted file mode 100644 index c1cc4c7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMExponentiator.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.bc.crypto.modes.gcm; - -public interface GCMExponentiator -{ - void init(byte[] x); - void exponentiateX(long pow, byte[] output); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMMultiplier.java deleted file mode 100644 index 0a0d30f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMMultiplier.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.bc.crypto.modes.gcm; - -public interface GCMMultiplier -{ - void init(byte[] H); - void multiplyH(byte[] x); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMUtil.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMUtil.java deleted file mode 100644 index 5893f72..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/GCMUtil.java +++ /dev/null @@ -1,260 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -abstract class GCMUtil -{ - static byte[] oneAsBytes() - { - byte[] tmp = new byte[16]; - tmp[0] = (byte)0x80; - return tmp; - } - - static int[] oneAsInts() - { - int[] tmp = new int[4]; - tmp[0] = 0x80000000; - return tmp; - } - - static byte[] asBytes(int[] ns) - { - byte[] output = new byte[16]; - Pack.intToBigEndian(ns, output, 0); - return output; - } - - static int[] asInts(byte[] bs) - { - int[] output = new int[4]; - Pack.bigEndianToInt(bs, 0, output); - return output; - } - - static void asInts(byte[] bs, int[] output) - { - Pack.bigEndianToInt(bs, 0, output); - } - - static void multiply(byte[] block, byte[] val) - { - byte[] tmp = Arrays.clone(block); - byte[] c = new byte[16]; - - for (int i = 0; i < 16; ++i) - { - byte bits = val[i]; - for (int j = 7; j >= 0; --j) - { - if ((bits & (1 << j)) != 0) - { - xor(c, tmp); - } - - boolean lsb = (tmp[15] & 1) != 0; - shiftRight(tmp); - if (lsb) - { - // R = new byte[]{ 0xe1, ... }; -// GCMUtil.xor(v, R); - tmp[0] ^= (byte)0xe1; - } - } - } - - System.arraycopy(c, 0, block, 0, 16); - } - - // P is the value with only bit i=1 set - static void multiplyP(int[] x) - { - boolean lsb = (x[3] & 1) != 0; - shiftRight(x); - if (lsb) - { - // R = new int[]{ 0xe1000000, 0, 0, 0 }; -// xor(v, R); - x[0] ^= 0xe1000000; - } - } - - static void multiplyP(int[] x, int[] output) - { - boolean lsb = (x[3] & 1) != 0; - shiftRight(x, output); - if (lsb) - { - output[0] ^= 0xe1000000; - } - } - - // P is the value with only bit i=1 set - static void multiplyP8(int[] x) - { -// for (int i = 8; i != 0; --i) -// { -// multiplyP(x); -// } - - int lsw = x[3]; - shiftRightN(x, 8); - for (int i = 7; i >= 0; --i) - { - if ((lsw & (1 << i)) != 0) - { - x[0] ^= (0xe1000000 >>> (7 - i)); - } - } - } - - static void multiplyP8(int[] x, int[] output) - { - int lsw = x[3]; - shiftRightN(x, 8, output); - for (int i = 7; i >= 0; --i) - { - if ((lsw & (1 << i)) != 0) - { - output[0] ^= (0xe1000000 >>> (7 - i)); - } - } - } - - static void shiftRight(byte[] block) - { - int i = 0; - int bit = 0; - for (;;) - { - int b = block[i] & 0xff; - block[i] = (byte) ((b >>> 1) | bit); - if (++i == 16) - { - break; - } - bit = (b & 1) << 7; - } - } - - static void shiftRight(byte[] block, byte[] output) - { - int i = 0; - int bit = 0; - for (;;) - { - int b = block[i] & 0xff; - output[i] = (byte) ((b >>> 1) | bit); - if (++i == 16) - { - break; - } - bit = (b & 1) << 7; - } - } - - static void shiftRight(int[] block) - { - int i = 0; - int bit = 0; - for (;;) - { - int b = block[i]; - block[i] = (b >>> 1) | bit; - if (++i == 4) - { - break; - } - bit = b << 31; - } - } - - static void shiftRight(int[] block, int[] output) - { - int i = 0; - int bit = 0; - for (;;) - { - int b = block[i]; - output[i] = (b >>> 1) | bit; - if (++i == 4) - { - break; - } - bit = b << 31; - } - } - - static void shiftRightN(int[] block, int n) - { - int i = 0; - int bits = 0; - for (;;) - { - int b = block[i]; - block[i] = (b >>> n) | bits; - if (++i == 4) - { - break; - } - bits = b << (32 - n); - } - } - - static void shiftRightN(int[] block, int n, int[] output) - { - int i = 0; - int bits = 0; - for (;;) - { - int b = block[i]; - output[i] = (b >>> n) | bits; - if (++i == 4) - { - break; - } - bits = b << (32 - n); - } - } - - static void xor(byte[] block, byte[] val) - { - for (int i = 15; i >= 0; --i) - { - block[i] ^= val[i]; - } - } - - static void xor(byte[] block, byte[] val, int off, int len) - { - while (len-- > 0) - { - block[len] ^= val[off + len]; - } - } - - static void xor(byte[] block, byte[] val, byte[] output) - { - for (int i = 15; i >= 0; --i) - { - output[i] = (byte)(block[i] ^ val[i]); - } - } - - static void xor(int[] block, int[] val) - { - for (int i = 3; i >= 0; --i) - { - block[i] ^= val[i]; - } - } - - static void xor(int[] block, int[] val, int[] output) - { - for (int i = 3; i >= 0; --i) - { - output[i] = block[i] ^ val[i]; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables1kGCMExponentiator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables1kGCMExponentiator.java deleted file mode 100644 index 69dff12..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables1kGCMExponentiator.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import java.util.Vector; - -import org.bc.util.Arrays; - -public class Tables1kGCMExponentiator implements GCMExponentiator -{ - // A lookup table of the power-of-two powers of 'x' - // - lookupPowX2[i] = x^(2^i) - private Vector lookupPowX2; - - public void init(byte[] x) - { - if (lookupPowX2 != null && Arrays.areEqual(x, (byte[])lookupPowX2.elementAt(0))) - { - return; - } - - lookupPowX2 = new Vector(8); - lookupPowX2.addElement(Arrays.clone(x)); - } - - public void exponentiateX(long pow, byte[] output) - { - byte[] y = GCMUtil.oneAsBytes(); - int bit = 0; - while (pow > 0) - { - if ((pow & 1L) != 0) - { - ensureAvailable(bit); - GCMUtil.multiply(y, (byte[])lookupPowX2.elementAt(bit)); - } - ++bit; - pow >>>= 1; - } - - System.arraycopy(y, 0, output, 0, 16); - } - - private void ensureAvailable(int bit) - { - int count = lookupPowX2.size(); - if (count <= bit) - { - byte[] tmp = (byte[])lookupPowX2.elementAt(count - 1); - do - { - tmp = Arrays.clone(tmp); - GCMUtil.multiply(tmp, tmp); - lookupPowX2.addElement(tmp); - } - while (++count <= bit); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables64kGCMMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables64kGCMMultiplier.java deleted file mode 100644 index e32acd3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables64kGCMMultiplier.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -public class Tables64kGCMMultiplier implements GCMMultiplier -{ - private byte[] H; - private int[][][] M; - - public void init(byte[] H) - { - if (M == null) - { - M = new int[16][256][4]; - } - else if (Arrays.areEqual(this.H, H)) - { - return; - } - - this.H = Arrays.clone(H); - - // M[0][0] is ZEROES; - GCMUtil.asInts(H, M[0][128]); - - for (int j = 64; j >= 1; j >>= 1) - { - GCMUtil.multiplyP(M[0][j + j], M[0][j]); - } - - int i = 0; - for (;;) - { - for (int j = 2; j < 256; j += j) - { - for (int k = 1; k < j; ++k) - { - GCMUtil.xor(M[i][j], M[i][k], M[i][j + k]); - } - } - - if (++i == 16) - { - return; - } - - // M[i][0] is ZEROES; - for (int j = 128; j > 0; j >>= 1) - { - GCMUtil.multiplyP8(M[i - 1][j], M[i][j]); - } - } - } - - public void multiplyH(byte[] x) - { -// assert x.Length == 16; - - int[] z = new int[4]; - for (int i = 15; i >= 0; --i) - { -// GCMUtil.xor(z, M[i][x[i] & 0xff]); - int[] m = M[i][x[i] & 0xff]; - z[0] ^= m[0]; - z[1] ^= m[1]; - z[2] ^= m[2]; - z[3] ^= m[3]; - } - - Pack.intToBigEndian(z, x, 0); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables8kGCMMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables8kGCMMultiplier.java deleted file mode 100644 index 674f230..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/modes/gcm/Tables8kGCMMultiplier.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.bc.crypto.modes.gcm; - -import org.bc.crypto.util.Pack; -import org.bc.util.Arrays; - -public class Tables8kGCMMultiplier implements GCMMultiplier -{ - private byte[] H; - private int[][][] M; - - public void init(byte[] H) - { - if (M == null) - { - M = new int[32][16][4]; - } - else if (Arrays.areEqual(this.H, H)) - { - return; - } - - this.H = Arrays.clone(H); - - // M[0][0] is ZEROES; - // M[1][0] is ZEROES; - GCMUtil.asInts(H, M[1][8]); - - for (int j = 4; j >= 1; j >>= 1) - { - GCMUtil.multiplyP(M[1][j + j], M[1][j]); - } - - GCMUtil.multiplyP(M[1][1], M[0][8]); - - for (int j = 4; j >= 1; j >>= 1) - { - GCMUtil.multiplyP(M[0][j + j], M[0][j]); - } - - int i = 0; - for (;;) - { - for (int j = 2; j < 16; j += j) - { - for (int k = 1; k < j; ++k) - { - GCMUtil.xor(M[i][j], M[i][k], M[i][j + k]); - } - } - - if (++i == 32) - { - return; - } - - if (i > 1) - { - // M[i][0] is ZEROES; - for(int j = 8; j > 0; j >>= 1) - { - GCMUtil.multiplyP8(M[i - 2][j], M[i][j]); - } - } - } - } - - public void multiplyH(byte[] x) - { -// assert x.Length == 16; - - int[] z = new int[4]; - for (int i = 15; i >= 0; --i) - { -// GCMUtil.xor(z, M[i + i][x[i] & 0x0f]); - int[] m = M[i + i][x[i] & 0x0f]; - z[0] ^= m[0]; - z[1] ^= m[1]; - z[2] ^= m[2]; - z[3] ^= m[3]; -// GCMUtil.xor(z, M[i + i + 1][(x[i] & 0xf0) >>> 4]); - m = M[i + i + 1][(x[i] & 0xf0) >>> 4]; - z[0] ^= m[0]; - z[1] ^= m[1]; - z[2] ^= m[2]; - z[3] ^= m[3]; - } - - Pack.intToBigEndian(z, x, 0); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/BlockCipherPadding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/BlockCipherPadding.java deleted file mode 100644 index 0432277..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/BlockCipherPadding.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * Block cipher padders are expected to conform to this interface - */ -public interface BlockCipherPadding -{ - /** - * Initialise the padder. - * - * @param random the source of randomness for the padding, if required. - */ - public void init(SecureRandom random) - throws IllegalArgumentException; - - /** - * Return the name of the algorithm the cipher implements. - * - * @return the name of the algorithm the cipher implements. - */ - public String getPaddingName(); - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - *

    - * Note: this assumes that the last block of plain text is always - * passed to it inside in. i.e. if inOff is zero, indicating the - * entire block is to be overwritten with padding the value of in - * should be the same as the last block of plain text. The reason - * for this is that some modes such as "trailing bit compliment" - * base the padding on the last byte of plain text. - *

    - */ - public int addPadding(byte[] in, int inOff); - - /** - * return the number of pad bytes present in the block. - * @exception InvalidCipherTextException if the padding is badly formed - * or invalid. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO10126d2Padding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO10126d2Padding.java deleted file mode 100644 index a40d7cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO10126d2Padding.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds ISO10126-2 padding to a block. - */ -public class ISO10126d2Padding - implements BlockCipherPadding -{ - SecureRandom random; - - /** - * Initialise the padder. - * - * @param random a SecureRandom if available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - if (random != null) - { - this.random = random; - } - else - { - this.random = new SecureRandom(); - } - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "ISO10126-2"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - */ - public int addPadding( - byte[] in, - int inOff) - { - byte code = (byte)(in.length - inOff); - - while (inOff < (in.length - 1)) - { - in[inOff] = (byte)random.nextInt(); - inOff++; - } - - in[inOff] = code; - - return code; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - int count = in[in.length - 1] & 0xff; - - if (count > in.length) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - - return count; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO7816d4Padding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO7816d4Padding.java deleted file mode 100644 index 2523eff..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ISO7816d4Padding.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds the padding according to the scheme referenced in - * ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00 - */ -public class ISO7816d4Padding - implements BlockCipherPadding -{ - /** - * Initialise the padder. - * - * @param random - a SecureRandom if available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - // nothing to do. - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "ISO7816-4"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - */ - public int addPadding( - byte[] in, - int inOff) - { - int added = (in.length - inOff); - - in [inOff]= (byte) 0x80; - inOff ++; - - while (inOff < in.length) - { - in[inOff] = (byte) 0; - inOff++; - } - - return added; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - int count = in.length - 1; - - while (count > 0 && in[count] == 0) - { - count--; - } - - if (in[count] != (byte)0x80) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - - return in.length - count; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PKCS7Padding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PKCS7Padding.java deleted file mode 100644 index 2212b53..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PKCS7Padding.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds PKCS7/PKCS5 padding to a block. - */ -public class PKCS7Padding - implements BlockCipherPadding -{ - /** - * Initialise the padder. - * - * @param random - a SecureRandom if available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - // nothing to do. - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "PKCS7"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - */ - public int addPadding( - byte[] in, - int inOff) - { - byte code = (byte)(in.length - inOff); - - while (inOff < in.length) - { - in[inOff] = code; - inOff++; - } - - return code; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - int count = in[in.length - 1] & 0xff; - - if (count > in.length || count == 0) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - - for (int i = 1; i <= count; i++) - { - if (in[in.length - i] != count) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - } - - return count; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PaddedBufferedBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PaddedBufferedBlockCipher.java deleted file mode 100644 index 59b836e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/PaddedBufferedBlockCipher.java +++ /dev/null @@ -1,299 +0,0 @@ -package org.bc.crypto.paddings; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.BufferedBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.OutputLengthException; -import org.bc.crypto.params.ParametersWithRandom; - -/** - * A wrapper class that allows block ciphers to be used to process data in - * a piecemeal fashion with padding. The PaddedBufferedBlockCipher - * outputs a block only when the buffer is full and more data is being added, - * or on a doFinal (unless the current block in the buffer is a pad block). - * The default padding mechanism used is the one outlined in PKCS5/PKCS7. - */ -public class PaddedBufferedBlockCipher - extends BufferedBlockCipher -{ - BlockCipherPadding padding; - - /** - * Create a buffered block cipher with the desired padding. - * - * @param cipher the underlying block cipher this buffering object wraps. - * @param padding the padding type. - */ - public PaddedBufferedBlockCipher( - BlockCipher cipher, - BlockCipherPadding padding) - { - this.cipher = cipher; - this.padding = padding; - - buf = new byte[cipher.getBlockSize()]; - bufOff = 0; - } - - /** - * Create a buffered block cipher PKCS7 padding - * - * @param cipher the underlying block cipher this buffering object wraps. - */ - public PaddedBufferedBlockCipher( - BlockCipher cipher) - { - this(cipher, new PKCS7Padding()); - } - - /** - * initialise the cipher. - * - * @param forEncryption if true the cipher is initialised for - * encryption, if false for decryption. - * @param params the key and other data required by the cipher. - * @exception IllegalArgumentException if the params argument is - * inappropriate. - */ - public void init( - boolean forEncryption, - CipherParameters params) - throws IllegalArgumentException - { - this.forEncryption = forEncryption; - - reset(); - - if (params instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)params; - - padding.init(p.getRandom()); - - cipher.init(forEncryption, p.getParameters()); - } - else - { - padding.init(null); - - cipher.init(forEncryption, params); - } - } - - /** - * return the minimum size of the output buffer required for an update - * plus a doFinal with an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update and doFinal - * with len bytes of input. - */ - public int getOutputSize( - int len) - { - int total = len + bufOff; - int leftOver = total % buf.length; - - if (leftOver == 0) - { - if (forEncryption) - { - return total + buf.length; - } - - return total; - } - - return total - leftOver + buf.length; - } - - /** - * return the size of the output buffer required for an update - * an input of len bytes. - * - * @param len the length of the input. - * @return the space required to accommodate a call to update - * with len bytes of input. - */ - public int getUpdateOutputSize( - int len) - { - int total = len + bufOff; - int leftOver = total % buf.length; - - if (leftOver == 0) - { - return total - buf.length; - } - - return total - leftOver; - } - - /** - * process a single byte, producing an output block if neccessary. - * - * @param in the input byte. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processByte( - byte in, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - int resultLen = 0; - - if (bufOff == buf.length) - { - resultLen = cipher.processBlock(buf, 0, out, outOff); - bufOff = 0; - } - - buf[bufOff++] = in; - - return resultLen; - } - - /** - * process an array of bytes, producing output if necessary. - * - * @param in the input byte array. - * @param inOff the offset at which the input data starts. - * @param len the number of bytes to be copied out of the input array. - * @param out the space for any output that might be produced. - * @param outOff the offset from which the output will be copied. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there isn't enough space in out. - * @exception IllegalStateException if the cipher isn't initialised. - */ - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int blockSize = getBlockSize(); - int length = getUpdateOutputSize(len); - - if (length > 0) - { - if ((outOff + length) > out.length) - { - throw new OutputLengthException("output buffer too short"); - } - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += cipher.processBlock(buf, 0, out, outOff); - - bufOff = 0; - len -= gapLen; - inOff += gapLen; - - while (len > buf.length) - { - resultLen += cipher.processBlock(in, inOff, out, outOff + resultLen); - - len -= blockSize; - inOff += blockSize; - } - } - - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - - return resultLen; - } - - /** - * Process the last block in the buffer. If the buffer is currently - * full and padding needs to be added a call to doFinal will produce - * 2 * getBlockSize() bytes. - * - * @param out the array the block currently being held is copied into. - * @param outOff the offset at which the copying starts. - * @return the number of output bytes copied to out. - * @exception DataLengthException if there is insufficient space in out for - * the output or we are decrypting and the input is not block size aligned. - * @exception IllegalStateException if the underlying cipher is not - * initialised. - * @exception InvalidCipherTextException if padding is expected and not found. - */ - public int doFinal( - byte[] out, - int outOff) - throws DataLengthException, IllegalStateException, InvalidCipherTextException - { - int blockSize = cipher.getBlockSize(); - int resultLen = 0; - - if (forEncryption) - { - if (bufOff == blockSize) - { - if ((outOff + 2 * blockSize) > out.length) - { - reset(); - - throw new OutputLengthException("output buffer too short"); - } - - resultLen = cipher.processBlock(buf, 0, out, outOff); - bufOff = 0; - } - - padding.addPadding(buf, bufOff); - - resultLen += cipher.processBlock(buf, 0, out, outOff + resultLen); - - reset(); - } - else - { - if (bufOff == blockSize) - { - resultLen = cipher.processBlock(buf, 0, buf, 0); - bufOff = 0; - } - else - { - reset(); - - throw new DataLengthException("last block incomplete in decryption"); - } - - try - { - resultLen -= padding.padCount(buf); - - System.arraycopy(buf, 0, out, outOff, resultLen); - } - finally - { - reset(); - } - } - - return resultLen; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/TBCPadding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/TBCPadding.java deleted file mode 100644 index 9863910..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/TBCPadding.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds Trailing-Bit-Compliment padding to a block. - *

    - * This padding pads the block out with the compliment of the last bit - * of the plain text. - *

    - */ -public class TBCPadding - implements BlockCipherPadding -{ - /** - * Initialise the padder. - * - * @param random - a SecureRandom if available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - // nothing to do. - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "TBC"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - *

    - * Note: this assumes that the last block of plain text is always - * passed to it inside in. i.e. if inOff is zero, indicating the - * entire block is to be overwritten with padding the value of in - * should be the same as the last block of plain text. - *

    - */ - public int addPadding( - byte[] in, - int inOff) - { - int count = in.length - inOff; - byte code; - - if (inOff > 0) - { - code = (byte)((in[inOff - 1] & 0x01) == 0 ? 0xff : 0x00); - } - else - { - code = (byte)((in[in.length - 1] & 0x01) == 0 ? 0xff : 0x00); - } - - while (inOff < in.length) - { - in[inOff] = code; - inOff++; - } - - return count; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - byte code = in[in.length - 1]; - - int index = in.length - 1; - while (index > 0 && in[index - 1] == code) - { - index--; - } - - return in.length - index; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/X923Padding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/X923Padding.java deleted file mode 100644 index f6e3690..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/X923Padding.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds X9.23 padding to a block - if a SecureRandom is - * passed in random padding is assumed, otherwise padding with zeros is used. - */ -public class X923Padding - implements BlockCipherPadding -{ - SecureRandom random = null; - - /** - * Initialise the padder. - * - * @param random a SecureRandom if one is available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - this.random = random; - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "X9.23"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - */ - public int addPadding( - byte[] in, - int inOff) - { - byte code = (byte)(in.length - inOff); - - while (inOff < in.length - 1) - { - if (random == null) - { - in[inOff] = 0; - } - else - { - in[inOff] = (byte)random.nextInt(); - } - inOff++; - } - - in[inOff] = code; - - return code; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - int count = in[in.length - 1] & 0xff; - - if (count > in.length) - { - throw new InvalidCipherTextException("pad block corrupted"); - } - - return count; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ZeroBytePadding.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ZeroBytePadding.java deleted file mode 100644 index f209d22..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/paddings/ZeroBytePadding.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.bc.crypto.paddings; - -import java.security.SecureRandom; - -import org.bc.crypto.InvalidCipherTextException; - -/** - * A padder that adds NULL byte padding to a block. - */ -public class ZeroBytePadding - implements BlockCipherPadding -{ - /** - * Initialise the padder. - * - * @param random - a SecureRandom if available. - */ - public void init(SecureRandom random) - throws IllegalArgumentException - { - // nothing to do. - } - - /** - * Return the name of the algorithm the padder implements. - * - * @return the name of the algorithm the padder implements. - */ - public String getPaddingName() - { - return "ZeroByte"; - } - - /** - * add the pad bytes to the passed in block, returning the - * number of bytes added. - */ - public int addPadding( - byte[] in, - int inOff) - { - int added = (in.length - inOff); - - while (inOff < in.length) - { - in[inOff] = (byte) 0; - inOff++; - } - - return added; - } - - /** - * return the number of pad bytes present in the block. - */ - public int padCount(byte[] in) - throws InvalidCipherTextException - { - int count = in.length; - - while (count > 0) - { - if (in[count - 1] != 0) - { - break; - } - - count--; - } - - return in.length - count; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AEADParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AEADParameters.java deleted file mode 100644 index d49f61e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AEADParameters.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class AEADParameters - implements CipherParameters -{ - private byte[] associatedText; - private byte[] nonce; - private KeyParameter key; - private int macSize; - - /** - * Base constructor. - * - * @param key key to be used by underlying cipher - * @param macSize macSize in bits - * @param nonce nonce to be used - */ - public AEADParameters(KeyParameter key, int macSize, byte[] nonce) - { - this(key, macSize, nonce, null); - } - - /** - * Base constructor. - * - * @param key key to be used by underlying cipher - * @param macSize macSize in bits - * @param nonce nonce to be used - * @param associatedText initial associated text, if any - */ - public AEADParameters(KeyParameter key, int macSize, byte[] nonce, byte[] associatedText) - { - this.key = key; - this.nonce = nonce; - this.macSize = macSize; - this.associatedText = associatedText; - } - - public KeyParameter getKey() - { - return key; - } - - public int getMacSize() - { - return macSize; - } - - public byte[] getAssociatedText() - { - return associatedText; - } - - public byte[] getNonce() - { - return nonce; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AsymmetricKeyParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AsymmetricKeyParameter.java deleted file mode 100644 index be06f0f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/AsymmetricKeyParameter.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class AsymmetricKeyParameter - implements CipherParameters -{ - boolean privateKey; - - public AsymmetricKeyParameter( - boolean privateKey) - { - this.privateKey = privateKey; - } - - public boolean isPrivate() - { - return privateKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/CCMParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/CCMParameters.java deleted file mode 100644 index cf33006..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/CCMParameters.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.crypto.params; - -/** - * @deprecated use AEADParameters - */ -public class CCMParameters - extends AEADParameters -{ - /** - * Base constructor. - * - * @param key key to be used by underlying cipher - * @param macSize macSize in bits - * @param nonce nonce to be used - * @param associatedText associated text, if any - */ - public CCMParameters(KeyParameter key, int macSize, byte[] nonce, byte[] associatedText) - { - super(key, macSize, nonce, associatedText); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESParameters.java deleted file mode 100644 index d2aeb80..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESParameters.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.bc.crypto.params; - -public class DESParameters - extends KeyParameter -{ - public DESParameters( - byte[] key) - { - super(key); - - if (isWeakKey(key, 0)) - { - throw new IllegalArgumentException("attempt to create weak DES key"); - } - } - - /* - * DES Key length in bytes. - */ - static public final int DES_KEY_LENGTH = 8; - - /* - * Table of weak and semi-weak keys taken from Schneier pp281 - */ - static private final int N_DES_WEAK_KEYS = 16; - - static private byte[] DES_weak_keys = - { - /* weak keys */ - (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01, (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01, - (byte)0x1f,(byte)0x1f,(byte)0x1f,(byte)0x1f, (byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0x0e, - (byte)0xe0,(byte)0xe0,(byte)0xe0,(byte)0xe0, (byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xf1, - (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe, (byte)0xfe,(byte)0xfe,(byte)0xfe,(byte)0xfe, - - /* semi-weak keys */ - (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe, (byte)0x01,(byte)0xfe,(byte)0x01,(byte)0xfe, - (byte)0x1f,(byte)0xe0,(byte)0x1f,(byte)0xe0, (byte)0x0e,(byte)0xf1,(byte)0x0e,(byte)0xf1, - (byte)0x01,(byte)0xe0,(byte)0x01,(byte)0xe0, (byte)0x01,(byte)0xf1,(byte)0x01,(byte)0xf1, - (byte)0x1f,(byte)0xfe,(byte)0x1f,(byte)0xfe, (byte)0x0e,(byte)0xfe,(byte)0x0e,(byte)0xfe, - (byte)0x01,(byte)0x1f,(byte)0x01,(byte)0x1f, (byte)0x01,(byte)0x0e,(byte)0x01,(byte)0x0e, - (byte)0xe0,(byte)0xfe,(byte)0xe0,(byte)0xfe, (byte)0xf1,(byte)0xfe,(byte)0xf1,(byte)0xfe, - (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01, (byte)0xfe,(byte)0x01,(byte)0xfe,(byte)0x01, - (byte)0xe0,(byte)0x1f,(byte)0xe0,(byte)0x1f, (byte)0xf1,(byte)0x0e,(byte)0xf1,(byte)0x0e, - (byte)0xe0,(byte)0x01,(byte)0xe0,(byte)0x01, (byte)0xf1,(byte)0x01,(byte)0xf1,(byte)0x01, - (byte)0xfe,(byte)0x1f,(byte)0xfe,(byte)0x1f, (byte)0xfe,(byte)0x0e,(byte)0xfe,(byte)0x0e, - (byte)0x1f,(byte)0x01,(byte)0x1f,(byte)0x01, (byte)0x0e,(byte)0x01,(byte)0x0e,(byte)0x01, - (byte)0xfe,(byte)0xe0,(byte)0xfe,(byte)0xe0, (byte)0xfe,(byte)0xf1,(byte)0xfe,(byte)0xf1 - }; - - /** - * DES has 16 weak keys. This method will check - * if the given DES key material is weak or semi-weak. - * Key material that is too short is regarded as weak. - *

    - * See "Applied - * Cryptography" by Bruce Schneier for more information. - * - * @return true if the given DES key material is weak or semi-weak, - * false otherwise. - */ - public static boolean isWeakKey( - byte[] key, - int offset) - { - if (key.length - offset < DES_KEY_LENGTH) - { - throw new IllegalArgumentException("key material too short."); - } - - nextkey: for (int i = 0; i < N_DES_WEAK_KEYS; i++) - { - for (int j = 0; j < DES_KEY_LENGTH; j++) - { - if (key[j + offset] != DES_weak_keys[i * DES_KEY_LENGTH + j]) - { - continue nextkey; - } - } - - return true; - } - return false; - } - - /** - * DES Keys use the LSB as the odd parity bit. This can - * be used to check for corrupt keys. - * - * @param bytes the byte array to set the parity on. - */ - public static void setOddParity( - byte[] bytes) - { - for (int i = 0; i < bytes.length; i++) - { - int b = bytes[i]; - bytes[i] = (byte)((b & 0xfe) | - ((((b >> 1) ^ - (b >> 2) ^ - (b >> 3) ^ - (b >> 4) ^ - (b >> 5) ^ - (b >> 6) ^ - (b >> 7)) ^ 0x01) & 0x01)); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESedeParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESedeParameters.java deleted file mode 100644 index fddfaa6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DESedeParameters.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.crypto.params; - -public class DESedeParameters - extends DESParameters -{ - /* - * DES-EDE Key length in bytes. - */ - static public final int DES_EDE_KEY_LENGTH = 24; - - public DESedeParameters( - byte[] key) - { - super(key); - - if (isWeakKey(key, 0, key.length)) - { - throw new IllegalArgumentException("attempt to create weak DESede key"); - } - } - - /** - * return true if the passed in key is a DES-EDE weak key. - * - * @param key bytes making up the key - * @param offset offset into the byte array the key starts at - * @param length number of bytes making up the key - */ - public static boolean isWeakKey( - byte[] key, - int offset, - int length) - { - for (int i = offset; i < length; i += DES_KEY_LENGTH) - { - if (DESParameters.isWeakKey(key, i)) - { - return true; - } - } - - return false; - } - - /** - * return true if the passed in key is a DES-EDE weak key. - * - * @param key bytes making up the key - * @param offset offset into the byte array the key starts at - */ - public static boolean isWeakKey( - byte[] key, - int offset) - { - return isWeakKey(key, offset, key.length - offset); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyGenerationParameters.java deleted file mode 100644 index 68e5d45..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyGenerationParameters.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.params; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class DHKeyGenerationParameters - extends KeyGenerationParameters -{ - private DHParameters params; - - public DHKeyGenerationParameters( - SecureRandom random, - DHParameters params) - { - super(random, getStrength(params)); - - this.params = params; - } - - public DHParameters getParameters() - { - return params; - } - - static int getStrength(DHParameters params) - { - return params.getL() != 0 ? params.getL() : params.getP().bitLength(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyParameters.java deleted file mode 100644 index 021f4a9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHKeyParameters.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.crypto.params; - - -public class DHKeyParameters - extends AsymmetricKeyParameter -{ - private DHParameters params; - - protected DHKeyParameters( - boolean isPrivate, - DHParameters params) - { - super(isPrivate); - - this.params = params; - } - - public DHParameters getParameters() - { - return params; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof DHKeyParameters)) - { - return false; - } - - DHKeyParameters dhKey = (DHKeyParameters)obj; - - if (params == null) - { - return dhKey.getParameters() == null; - } - else - { - return params.equals(dhKey.getParameters()); - } - } - - public int hashCode() - { - int code = isPrivate() ? 0 : 1; - - if (params != null) - { - code ^= params.hashCode(); - } - - return code; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHParameters.java deleted file mode 100644 index a9b2144..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHParameters.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -import org.bc.crypto.CipherParameters; - -public class DHParameters - implements CipherParameters -{ - private static final int DEFAULT_MINIMUM_LENGTH = 160; - - // not final due to compiler bug in "simpler" JDKs - private BigInteger g; - private BigInteger p; - private BigInteger q; - private BigInteger j; - private int m; - private int l; - private DHValidationParameters validation; - - private static int getDefaultMParam( - int lParam) - { - if (lParam == 0) - { - return DEFAULT_MINIMUM_LENGTH; - } - - return lParam < DEFAULT_MINIMUM_LENGTH ? lParam : DEFAULT_MINIMUM_LENGTH; - } - - public DHParameters( - BigInteger p, - BigInteger g) - { - this(p, g, null, 0); - } - - public DHParameters( - BigInteger p, - BigInteger g, - BigInteger q) - { - this(p, g, q, 0); - } - - public DHParameters( - BigInteger p, - BigInteger g, - BigInteger q, - int l) - { - this(p, g, q, getDefaultMParam(l), l, null, null); - } - - public DHParameters( - BigInteger p, - BigInteger g, - BigInteger q, - int m, - int l) - { - this(p, g, q, m, l, null, null); - } - - public DHParameters( - BigInteger p, - BigInteger g, - BigInteger q, - BigInteger j, - DHValidationParameters validation) - { - this(p, g, q, DEFAULT_MINIMUM_LENGTH, 0, j, validation); - } - - public DHParameters( - BigInteger p, - BigInteger g, - BigInteger q, - int m, - int l, - BigInteger j, - DHValidationParameters validation) - { - if (l != 0) - { - BigInteger bigL = BigInteger.valueOf(2L ^ (l - 1)); - if (bigL.compareTo(p) == 1) - { - throw new IllegalArgumentException("when l value specified, it must satisfy 2^(l-1) <= p"); - } - if (l < m) - { - throw new IllegalArgumentException("when l value specified, it may not be less than m value"); - } - } - - this.g = g; - this.p = p; - this.q = q; - this.m = m; - this.l = l; - this.j = j; - this.validation = validation; - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getG() - { - return g; - } - - public BigInteger getQ() - { - return q; - } - - /** - * Return the subgroup factor J. - * - * @return subgroup factor - */ - public BigInteger getJ() - { - return j; - } - - /** - * Return the minimum length of the private value. - * - * @return the minimum length of the private value in bits. - */ - public int getM() - { - return m; - } - - /** - * Return the private value length in bits - if set, zero otherwise - * - * @return the private value length in bits, zero otherwise. - */ - public int getL() - { - return l; - } - - public DHValidationParameters getValidationParameters() - { - return validation; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof DHParameters)) - { - return false; - } - - DHParameters pm = (DHParameters)obj; - - if (this.getQ() != null) - { - if (!this.getQ().equals(pm.getQ())) - { - return false; - } - } - else - { - if (pm.getQ() != null) - { - return false; - } - } - - return pm.getP().equals(p) && pm.getG().equals(g); - } - - public int hashCode() - { - return getP().hashCode() ^ getG().hashCode() ^ (getQ() != null ? getQ().hashCode() : 0); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPrivateKeyParameters.java deleted file mode 100644 index 2e4f7ee..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPrivateKeyParameters.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class DHPrivateKeyParameters - extends DHKeyParameters -{ - private BigInteger x; - - public DHPrivateKeyParameters( - BigInteger x, - DHParameters params) - { - super(true, params); - - this.x = x; - } - - public BigInteger getX() - { - return x; - } - - public int hashCode() - { - return x.hashCode() ^ super.hashCode(); - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof DHPrivateKeyParameters)) - { - return false; - } - - DHPrivateKeyParameters other = (DHPrivateKeyParameters)obj; - - return other.getX().equals(this.x) && super.equals(obj); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPublicKeyParameters.java deleted file mode 100644 index 900f1a7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHPublicKeyParameters.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class DHPublicKeyParameters - extends DHKeyParameters -{ - private BigInteger y; - - public DHPublicKeyParameters( - BigInteger y, - DHParameters params) - { - super(false, params); - - this.y = y; - } - - public BigInteger getY() - { - return y; - } - - public int hashCode() - { - return y.hashCode() ^ super.hashCode(); - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof DHPublicKeyParameters)) - { - return false; - } - - DHPublicKeyParameters other = (DHPublicKeyParameters)obj; - - return other.getY().equals(y) && super.equals(obj); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHValidationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHValidationParameters.java deleted file mode 100644 index af66f07..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DHValidationParameters.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.util.Arrays; - -public class DHValidationParameters -{ - private byte[] seed; - private int counter; - - public DHValidationParameters( - byte[] seed, - int counter) - { - this.seed = seed; - this.counter = counter; - } - - public int getCounter() - { - return counter; - } - - public byte[] getSeed() - { - return seed; - } - - public boolean equals( - Object o) - { - if (!(o instanceof DHValidationParameters)) - { - return false; - } - - DHValidationParameters other = (DHValidationParameters)o; - - if (other.counter != this.counter) - { - return false; - } - - return Arrays.areEqual(this.seed, other.seed); - } - - public int hashCode() - { - return counter ^ Arrays.hashCode(seed); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyGenerationParameters.java deleted file mode 100644 index 56a222a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyGenerationParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.crypto.params; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class DSAKeyGenerationParameters - extends KeyGenerationParameters -{ - private DSAParameters params; - - public DSAKeyGenerationParameters( - SecureRandom random, - DSAParameters params) - { - super(random, params.getP().bitLength() - 1); - - this.params = params; - } - - public DSAParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyParameters.java deleted file mode 100644 index fc0d3e9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAKeyParameters.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.crypto.params; - -public class DSAKeyParameters - extends AsymmetricKeyParameter -{ - private DSAParameters params; - - public DSAKeyParameters( - boolean isPrivate, - DSAParameters params) - { - super(isPrivate); - - this.params = params; - } - - public DSAParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAParameters.java deleted file mode 100644 index 1db720d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAParameters.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -import org.bc.crypto.CipherParameters; - -public class DSAParameters - implements CipherParameters -{ - private BigInteger g; - private BigInteger q; - private BigInteger p; - private DSAValidationParameters validation; - - public DSAParameters( - BigInteger p, - BigInteger q, - BigInteger g) - { - this.g = g; - this.p = p; - this.q = q; - } - - public DSAParameters( - BigInteger p, - BigInteger q, - BigInteger g, - DSAValidationParameters params) - { - this.g = g; - this.p = p; - this.q = q; - this.validation = params; - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getQ() - { - return q; - } - - public BigInteger getG() - { - return g; - } - - public DSAValidationParameters getValidationParameters() - { - return validation; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof DSAParameters)) - { - return false; - } - - DSAParameters pm = (DSAParameters)obj; - - return (pm.getP().equals(p) && pm.getQ().equals(q) && pm.getG().equals(g)); - } - - public int hashCode() - { - return getP().hashCode() ^ getQ().hashCode() ^ getG().hashCode(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPrivateKeyParameters.java deleted file mode 100644 index da62537..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPrivateKeyParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class DSAPrivateKeyParameters - extends DSAKeyParameters -{ - private BigInteger x; - - public DSAPrivateKeyParameters( - BigInteger x, - DSAParameters params) - { - super(true, params); - - this.x = x; - } - - public BigInteger getX() - { - return x; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPublicKeyParameters.java deleted file mode 100644 index 3337768..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAPublicKeyParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class DSAPublicKeyParameters - extends DSAKeyParameters -{ - private BigInteger y; - - public DSAPublicKeyParameters( - BigInteger y, - DSAParameters params) - { - super(false, params); - - this.y = y; - } - - public BigInteger getY() - { - return y; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAValidationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAValidationParameters.java deleted file mode 100644 index fce829a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/DSAValidationParameters.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.util.Arrays; - -public class DSAValidationParameters -{ - private byte[] seed; - private int counter; - - public DSAValidationParameters( - byte[] seed, - int counter) - { - this.seed = seed; - this.counter = counter; - } - - public int getCounter() - { - return counter; - } - - public byte[] getSeed() - { - return seed; - } - - public int hashCode() - { - return counter ^ Arrays.hashCode(seed); - } - - public boolean equals( - Object o) - { - if (!(o instanceof DSAValidationParameters)) - { - return false; - } - - DSAValidationParameters other = (DSAValidationParameters)o; - - if (other.counter != this.counter) - { - return false; - } - - return Arrays.areEqual(this.seed, other.seed); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECDomainParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECDomainParameters.java deleted file mode 100644 index 6fa6a55..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECDomainParameters.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECPoint; - -public class ECDomainParameters - implements ECConstants -{ - ECCurve curve; - byte[] seed; - ECPoint G; - BigInteger n; - BigInteger h; - - public ECDomainParameters( - ECCurve curve, - ECPoint G, - BigInteger n) - { - this.curve = curve; - this.G = G; - this.n = n; - this.h = ONE; - this.seed = null; - } - - public ECDomainParameters( - ECCurve curve, - ECPoint G, - BigInteger n, - BigInteger h) - { - this.curve = curve; - this.G = G; - this.n = n; - this.h = h; - this.seed = null; - } - - public ECDomainParameters( - ECCurve curve, - ECPoint G, - BigInteger n, - BigInteger h, - byte[] seed) - { - this.curve = curve; - this.G = G; - this.n = n; - this.h = h; - this.seed = seed; - } - - public ECCurve getCurve() - { - return curve; - } - - public ECPoint getG() - { - return G; - } - - public BigInteger getN() - { - return n; - } - - public BigInteger getH() - { - return h; - } - - public byte[] getSeed() - { - return seed; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyGenerationParameters.java deleted file mode 100644 index 785b766..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyGenerationParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.crypto.params; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class ECKeyGenerationParameters - extends KeyGenerationParameters -{ - private ECDomainParameters domainParams; - - public ECKeyGenerationParameters( - ECDomainParameters domainParams, - SecureRandom random) - { - super(random, domainParams.getN().bitLength()); - - this.domainParams = domainParams; - } - - public ECDomainParameters getDomainParameters() - { - return domainParams; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyParameters.java deleted file mode 100644 index a95ea6b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECKeyParameters.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.crypto.params; - -public class ECKeyParameters - extends AsymmetricKeyParameter -{ - ECDomainParameters params; - - protected ECKeyParameters( - boolean isPrivate, - ECDomainParameters params) - { - super(isPrivate); - - this.params = params; - } - - public ECDomainParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPrivateKeyParameters.java deleted file mode 100644 index 6166e9b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPrivateKeyParameters.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class ECPrivateKeyParameters - extends ECKeyParameters -{ - BigInteger d; - - public ECPrivateKeyParameters( - BigInteger d, - ECDomainParameters params) - { - super(true, params); - this.d = d; - } - - public BigInteger getD() - { - return d; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPublicKeyParameters.java deleted file mode 100644 index 7e63ad0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ECPublicKeyParameters.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.math.ec.ECPoint; - -public class ECPublicKeyParameters - extends ECKeyParameters -{ - ECPoint Q; - - public ECPublicKeyParameters( - ECPoint Q, - ECDomainParameters params) - { - super(false, params); - this.Q = Q; - } - - public ECPoint getQ() - { - return Q; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyGenerationParameters.java deleted file mode 100644 index 23bfbe7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyGenerationParameters.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.params; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class ElGamalKeyGenerationParameters - extends KeyGenerationParameters -{ - private ElGamalParameters params; - - public ElGamalKeyGenerationParameters( - SecureRandom random, - ElGamalParameters params) - { - super(random, getStrength(params)); - - this.params = params; - } - - public ElGamalParameters getParameters() - { - return params; - } - - static int getStrength(ElGamalParameters params) - { - return params.getL() != 0 ? params.getL() : params.getP().bitLength(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyParameters.java deleted file mode 100644 index 4f0a4a9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalKeyParameters.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.crypto.params; - - -public class ElGamalKeyParameters - extends AsymmetricKeyParameter -{ - private ElGamalParameters params; - - protected ElGamalKeyParameters( - boolean isPrivate, - ElGamalParameters params) - { - super(isPrivate); - - this.params = params; - } - - public ElGamalParameters getParameters() - { - return params; - } - - public int hashCode() - { - return (params != null) ? params.hashCode() : 0; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof ElGamalKeyParameters)) - { - return false; - } - - ElGamalKeyParameters dhKey = (ElGamalKeyParameters)obj; - - if (params == null) - { - return dhKey.getParameters() == null; - } - else - { - return params.equals(dhKey.getParameters()); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalParameters.java deleted file mode 100644 index 1ba523a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalParameters.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -import org.bc.crypto.CipherParameters; - -public class ElGamalParameters - implements CipherParameters -{ - private BigInteger g; - private BigInteger p; - private int l; - - public ElGamalParameters( - BigInteger p, - BigInteger g) - { - this(p, g, 0); - } - - public ElGamalParameters( - BigInteger p, - BigInteger g, - int l) - { - this.g = g; - this.p = p; - this.l = l; - } - - public BigInteger getP() - { - return p; - } - - /** - * return the generator - g - */ - public BigInteger getG() - { - return g; - } - - /** - * return private value limit - l - */ - public int getL() - { - return l; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof ElGamalParameters)) - { - return false; - } - - ElGamalParameters pm = (ElGamalParameters)obj; - - return pm.getP().equals(p) && pm.getG().equals(g) && pm.getL() == l; - } - - public int hashCode() - { - return (getP().hashCode() ^ getG().hashCode()) + l; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPrivateKeyParameters.java deleted file mode 100644 index 8bec291..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPrivateKeyParameters.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class ElGamalPrivateKeyParameters - extends ElGamalKeyParameters -{ - private BigInteger x; - - public ElGamalPrivateKeyParameters( - BigInteger x, - ElGamalParameters params) - { - super(true, params); - - this.x = x; - } - - public BigInteger getX() - { - return x; - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof ElGamalPrivateKeyParameters)) - { - return false; - } - - ElGamalPrivateKeyParameters pKey = (ElGamalPrivateKeyParameters)obj; - - if (!pKey.getX().equals(x)) - { - return false; - } - - return super.equals(obj); - } - - public int hashCode() - { - return getX().hashCode(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPublicKeyParameters.java deleted file mode 100644 index fc26be7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ElGamalPublicKeyParameters.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class ElGamalPublicKeyParameters - extends ElGamalKeyParameters -{ - private BigInteger y; - - public ElGamalPublicKeyParameters( - BigInteger y, - ElGamalParameters params) - { - super(false, params); - - this.y = y; - } - - public BigInteger getY() - { - return y; - } - - public int hashCode() - { - return y.hashCode() ^ super.hashCode(); - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof ElGamalPublicKeyParameters)) - { - return false; - } - - ElGamalPublicKeyParameters other = (ElGamalPublicKeyParameters)obj; - - return other.getY().equals(y) && super.equals(obj); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyGenerationParameters.java deleted file mode 100644 index 066efe7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyGenerationParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.KeyGenerationParameters; - -import java.security.SecureRandom; - -public class GOST3410KeyGenerationParameters - extends KeyGenerationParameters -{ - private GOST3410Parameters params; - - public GOST3410KeyGenerationParameters( - SecureRandom random, - GOST3410Parameters params) - { - super(random, params.getP().bitLength() - 1); - - this.params = params; - } - - public GOST3410Parameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyParameters.java deleted file mode 100644 index ece2238..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410KeyParameters.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.bc.crypto.params; - -public class GOST3410KeyParameters - extends AsymmetricKeyParameter -{ - private GOST3410Parameters params; - - public GOST3410KeyParameters( - boolean isPrivate, - GOST3410Parameters params) - { - super(isPrivate); - - this.params = params; - } - - public GOST3410Parameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410Parameters.java deleted file mode 100644 index 0413297..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410Parameters.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -import java.math.BigInteger; - -public class GOST3410Parameters - implements CipherParameters -{ - private BigInteger p; - private BigInteger q; - private BigInteger a; - private GOST3410ValidationParameters validation; - - public GOST3410Parameters( - BigInteger p, - BigInteger q, - BigInteger a) - { - this.p = p; - this.q = q; - this.a = a; - } - - public GOST3410Parameters( - BigInteger p, - BigInteger q, - BigInteger a, - GOST3410ValidationParameters params) - { - this.a = a; - this.p = p; - this.q = q; - this.validation = params; - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getQ() - { - return q; - } - - public BigInteger getA() - { - return a; - } - - public GOST3410ValidationParameters getValidationParameters() - { - return validation; - } - - public int hashCode() - { - return p.hashCode() ^ q.hashCode() ^ a.hashCode(); - } - - public boolean equals( - Object obj) - { - if (!(obj instanceof GOST3410Parameters)) - { - return false; - } - - GOST3410Parameters pm = (GOST3410Parameters)obj; - - return (pm.getP().equals(p) && pm.getQ().equals(q) && pm.getA().equals(a)); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PrivateKeyParameters.java deleted file mode 100644 index 27a4fe7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PrivateKeyParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class GOST3410PrivateKeyParameters - extends GOST3410KeyParameters -{ - private BigInteger x; - - public GOST3410PrivateKeyParameters( - BigInteger x, - GOST3410Parameters params) - { - super(true, params); - - this.x = x; - } - - public BigInteger getX() - { - return x; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PublicKeyParameters.java deleted file mode 100644 index a184c5f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410PublicKeyParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class GOST3410PublicKeyParameters - extends GOST3410KeyParameters -{ - private BigInteger y; - - public GOST3410PublicKeyParameters( - BigInteger y, - GOST3410Parameters params) - { - super(false, params); - - this.y = y; - } - - public BigInteger getY() - { - return y; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410ValidationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410ValidationParameters.java deleted file mode 100644 index 2fa8dea..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/GOST3410ValidationParameters.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.crypto.params; - -public class GOST3410ValidationParameters -{ - private int x0; - private int c; - private long x0L; - private long cL; - - - public GOST3410ValidationParameters( - int x0, - int c) - { - this.x0 = x0; - this.c = c; - } - - public GOST3410ValidationParameters( - long x0L, - long cL) - { - this.x0L = x0L; - this.cL = cL; - } - - public int getC() - { - return c; - } - - public int getX0() - { - return x0; - } - - public long getCL() - { - return cL; - } - - public long getX0L() - { - return x0L; - } - - public boolean equals( - Object o) - { - if (!(o instanceof GOST3410ValidationParameters)) - { - return false; - } - - GOST3410ValidationParameters other = (GOST3410ValidationParameters)o; - - if (other.c != this.c) - { - return false; - } - - if (other.x0 != this.x0) - { - return false; - } - - if (other.cL != this.cL) - { - return false; - } - - if (other.x0L != this.x0L) - { - return false; - } - - return true; - } - - public int hashCode() - { - return x0 ^ c ^ (int) x0L ^ (int)(x0L >> 32) ^ (int) cL ^ (int)(cL >> 32); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/HKDFParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/HKDFParameters.java deleted file mode 100644 index 5e1f2c7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/HKDFParameters.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.DerivationParameters; -import org.bc.util.Arrays; - -/** - * Parameter class for the HKDFBytesGenerator class. - */ -public class HKDFParameters - implements DerivationParameters -{ - private final byte[] ikm; - private final boolean skipExpand; - private final byte[] salt; - private final byte[] info; - - private HKDFParameters(final byte[] ikm, final boolean skip, - final byte[] salt, final byte[] info) - { - if (ikm == null) - { - throw new IllegalArgumentException( - "IKM (input keying material) should not be null"); - } - - this.ikm = Arrays.clone(ikm); - - this.skipExpand = skip; - - if (salt == null || salt.length == 0) - { - this.salt = null; - } - else - { - this.salt = Arrays.clone(salt); - } - - if (info == null) - { - this.info = new byte[0]; - } - else - { - this.info = Arrays.clone(info); - } - } - - /** - * Generates parameters for HKDF, specifying both the optional salt and - * optional info. Step 1: Extract won't be skipped. - * - * @param ikm the input keying material or seed - * @param salt the salt to use, may be null for a salt for hashLen zeros - * @param info the info to use, may be null for an info field of zero bytes - */ - public HKDFParameters(final byte[] ikm, final byte[] salt, final byte[] info) - { - this(ikm, false, salt, info); - } - - /** - * Factory method that makes the HKDF skip the extract part of the key - * derivation function. - * - * @param ikm the input keying material or seed, directly used for step 2: - * Expand - * @param info the info to use, may be null for an info field of zero bytes - * @return HKDFParameters that makes the implementation skip step 1 - */ - public static HKDFParameters skipExtractParameters(final byte[] ikm, - final byte[] info) - { - - return new HKDFParameters(ikm, true, null, info); - } - - public static HKDFParameters defaultParameters(final byte[] ikm) - { - return new HKDFParameters(ikm, false, null, null); - } - - /** - * Returns the input keying material or seed. - * - * @return the keying material - */ - public byte[] getIKM() - { - return Arrays.clone(ikm); - } - - /** - * Returns if step 1: extract has to be skipped or not - * - * @return true for skipping, false for no skipping of step 1 - */ - public boolean skipExtract() - { - return skipExpand; - } - - /** - * Returns the salt, or null if the salt should be generated as a byte array - * of HashLen zeros. - * - * @return the salt, or null - */ - public byte[] getSalt() - { - return Arrays.clone(salt); - } - - /** - * Returns the info field, which may be empty (null is converted to empty). - * - * @return the info field, never null - */ - public byte[] getInfo() - { - return Arrays.clone(info); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESParameters.java deleted file mode 100644 index a496e5c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESParameters.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -/** - * parameters for using an integrated cipher in stream mode. - */ -public class IESParameters - implements CipherParameters -{ - private byte[] derivation; - private byte[] encoding; - private int macKeySize; - - /** - * @param derivation the derivation parameter for the KDF function. - * @param encoding the encoding parameter for the KDF function. - * @param macKeySize the size of the MAC key (in bits). - */ - public IESParameters( - byte[] derivation, - byte[] encoding, - int macKeySize) - { - this.derivation = derivation; - this.encoding = encoding; - this.macKeySize = macKeySize; - } - - public byte[] getDerivationV() - { - return derivation; - } - - public byte[] getEncodingV() - { - return encoding; - } - - public int getMacKeySize() - { - return macKeySize; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESWithCipherParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESWithCipherParameters.java deleted file mode 100644 index 9b7f9d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/IESWithCipherParameters.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.params; - - -public class IESWithCipherParameters - extends IESParameters -{ - private int cipherKeySize; - - /** - * @param derivation the derivation parameter for the KDF function. - * @param encoding the encoding parameter for the KDF function. - * @param macKeySize the size of the MAC key (in bits). - * @param cipherKeySize the size of the associated Cipher key (in bits). - */ - public IESWithCipherParameters( - byte[] derivation, - byte[] encoding, - int macKeySize, - int cipherKeySize) - { - super(derivation, encoding, macKeySize); - - this.cipherKeySize = cipherKeySize; - } - - public int getCipherKeySize() - { - return cipherKeySize; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ISO18033KDFParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ISO18033KDFParameters.java deleted file mode 100644 index 071b46a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ISO18033KDFParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.DerivationParameters; - -/** - * parameters for Key derivation functions for ISO-18033 - */ -public class ISO18033KDFParameters - implements DerivationParameters -{ - byte[] seed; - - public ISO18033KDFParameters( - byte[] seed) - { - this.seed = seed; - } - - public byte[] getSeed() - { - return seed; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KDFParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KDFParameters.java deleted file mode 100644 index 3ff305d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KDFParameters.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.DerivationParameters; - -/** - * parameters for Key derivation functions for IEEE P1363a - */ -public class KDFParameters - implements DerivationParameters -{ - byte[] iv; - byte[] shared; - - public KDFParameters( - byte[] shared, - byte[] iv) - { - this.shared = shared; - this.iv = iv; - } - - public byte[] getSharedSecret() - { - return shared; - } - - public byte[] getIV() - { - return iv; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KeyParameter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KeyParameter.java deleted file mode 100644 index cab4b82..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/KeyParameter.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class KeyParameter - implements CipherParameters -{ - private byte[] key; - - public KeyParameter( - byte[] key) - { - this(key, 0, key.length); - } - - public KeyParameter( - byte[] key, - int keyOff, - int keyLen) - { - this.key = new byte[keyLen]; - - System.arraycopy(key, keyOff, this.key, 0, keyLen); - } - - public byte[] getKey() - { - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MGFParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MGFParameters.java deleted file mode 100644 index 753af93..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MGFParameters.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.DerivationParameters; - -/** - * parameters for mask derivation functions. - */ -public class MGFParameters - implements DerivationParameters -{ - byte[] seed; - - public MGFParameters( - byte[] seed) - { - this(seed, 0, seed.length); - } - - public MGFParameters( - byte[] seed, - int off, - int len) - { - this.seed = new byte[len]; - System.arraycopy(seed, off, this.seed, 0, len); - } - - public byte[] getSeed() - { - return seed; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPrivateParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPrivateParameters.java deleted file mode 100644 index 3b32378..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPrivateParameters.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class MQVPrivateParameters - implements CipherParameters -{ - private ECPrivateKeyParameters staticPrivateKey; - private ECPrivateKeyParameters ephemeralPrivateKey; - private ECPublicKeyParameters ephemeralPublicKey; - - public MQVPrivateParameters( - ECPrivateKeyParameters staticPrivateKey, - ECPrivateKeyParameters ephemeralPrivateKey) - { - this(staticPrivateKey, ephemeralPrivateKey, null); - } - - public MQVPrivateParameters( - ECPrivateKeyParameters staticPrivateKey, - ECPrivateKeyParameters ephemeralPrivateKey, - ECPublicKeyParameters ephemeralPublicKey) - { - this.staticPrivateKey = staticPrivateKey; - this.ephemeralPrivateKey = ephemeralPrivateKey; - this.ephemeralPublicKey = ephemeralPublicKey; - } - - public ECPrivateKeyParameters getStaticPrivateKey() - { - return staticPrivateKey; - } - - public ECPrivateKeyParameters getEphemeralPrivateKey() - { - return ephemeralPrivateKey; - } - - public ECPublicKeyParameters getEphemeralPublicKey() - { - return ephemeralPublicKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPublicParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPublicParameters.java deleted file mode 100644 index a5b1f61..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/MQVPublicParameters.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class MQVPublicParameters - implements CipherParameters -{ - private ECPublicKeyParameters staticPublicKey; - private ECPublicKeyParameters ephemeralPublicKey; - - public MQVPublicParameters( - ECPublicKeyParameters staticPublicKey, - ECPublicKeyParameters ephemeralPublicKey) - { - this.staticPublicKey = staticPublicKey; - this.ephemeralPublicKey = ephemeralPublicKey; - } - - public ECPublicKeyParameters getStaticPublicKey() - { - return staticPublicKey; - } - - public ECPublicKeyParameters getEphemeralPublicKey() - { - return ephemeralPublicKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyGenerationParameters.java deleted file mode 100644 index 85402f7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyGenerationParameters.java +++ /dev/null @@ -1,463 +0,0 @@ -package org.bc.crypto.params; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.SecureRandom; -import java.util.Arrays; - -import org.bc.crypto.Digest; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.digests.SHA512Digest; - -/** - * A set of parameters for NtruEncrypt. Several predefined parameter sets are available and new ones can be created as well. - */ -public class NTRUEncryptionKeyGenerationParameters - extends KeyGenerationParameters - implements Cloneable -{ - /** - * A conservative (in terms of security) parameter set that gives 256 bits of security and is optimized for key size. - */ - public static final NTRUEncryptionKeyGenerationParameters EES1087EP2 = new NTRUEncryptionKeyGenerationParameters(1087, 2048, 120, 120, 256, 13, 25, 14, true, new byte[]{0, 6, 3}, true, false, new SHA512Digest()); - - /** - * A conservative (in terms of security) parameter set that gives 256 bits of security and is a tradeoff between key size and encryption/decryption speed. - */ - public static final NTRUEncryptionKeyGenerationParameters EES1171EP1 = new NTRUEncryptionKeyGenerationParameters(1171, 2048, 106, 106, 256, 13, 20, 15, true, new byte[]{0, 6, 4}, true, false, new SHA512Digest()); - - /** - * A conservative (in terms of security) parameter set that gives 256 bits of security and is optimized for encryption/decryption speed. - */ - public static final NTRUEncryptionKeyGenerationParameters EES1499EP1 = new NTRUEncryptionKeyGenerationParameters(1499, 2048, 79, 79, 256, 13, 17, 19, true, new byte[]{0, 6, 5}, true, false, new SHA512Digest()); - - /** - * A parameter set that gives 128 bits of security and uses simple ternary polynomials. - */ - public static final NTRUEncryptionKeyGenerationParameters APR2011_439 = new NTRUEncryptionKeyGenerationParameters(439, 2048, 146, 130, 128, 9, 32, 9, true, new byte[]{0, 7, 101}, true, false, new SHA256Digest()); - - /** - * Like APR2011_439, this parameter set gives 128 bits of security but uses product-form polynomials and f=1+pF. - */ - public static final NTRUEncryptionKeyGenerationParameters APR2011_439_FAST = new NTRUEncryptionKeyGenerationParameters(439, 2048, 9, 8, 5, 130, 128, 9, 32, 9, true, new byte[]{0, 7, 101}, true, true, new SHA256Digest()); - - /** - * A parameter set that gives 256 bits of security and uses simple ternary polynomials. - */ - public static final NTRUEncryptionKeyGenerationParameters APR2011_743 = new NTRUEncryptionKeyGenerationParameters(743, 2048, 248, 220, 256, 10, 27, 14, true, new byte[]{0, 7, 105}, false, false, new SHA512Digest()); - - /** - * Like APR2011_743, this parameter set gives 256 bits of security but uses product-form polynomials and f=1+pF. - */ - public static final NTRUEncryptionKeyGenerationParameters APR2011_743_FAST = new NTRUEncryptionKeyGenerationParameters(743, 2048, 11, 11, 15, 220, 256, 10, 27, 14, true, new byte[]{0, 7, 105}, false, true, new SHA512Digest()); - - public int N, q, df, df1, df2, df3; - public int dr; - public int dr1; - public int dr2; - public int dr3; - public int dg; - int llen; - public int maxMsgLenBytes; - public int db; - public int bufferLenBits; - int bufferLenTrits; - public int dm0; - public int pkLen; - public int c; - public int minCallsR; - public int minCallsMask; - public boolean hashSeed; - public byte[] oid; - public boolean sparse; - public boolean fastFp; - public int polyType; - public Digest hashAlg; - - /** - * Constructs a parameter set that uses ternary private keys (i.e. polyType=SIMPLE). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param df number of ones in the private polynomial f - * @param dm0 minimum acceptable number of -1's, 0's, and 1's in the polynomial m' in the last encryption step - * @param db number of random bits to prepend to the message - * @param c a parameter for the Index Generation Function ({@link org.bc.crypto.engines.IndexGenerator}) - * @param minCallsR minimum number of hash calls for the IGF to make - * @param minCallsMask minimum number of calls to generate the masking polynomial - * @param hashSeed whether to hash the seed in the MGF first (true) or use the seed directly (false) - * @param oid three bytes that uniquely identify the parameter set - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param fastFp whether f=1+p*F for a ternary F (true) or f is ternary (false) - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUEncryptionKeyGenerationParameters(int N, int q, int df, int dm0, int db, int c, int minCallsR, int minCallsMask, boolean hashSeed, byte[] oid, boolean sparse, boolean fastFp, Digest hashAlg) - { - super(new SecureRandom(), db); - this.N = N; - this.q = q; - this.df = df; - this.db = db; - this.dm0 = dm0; - this.c = c; - this.minCallsR = minCallsR; - this.minCallsMask = minCallsMask; - this.hashSeed = hashSeed; - this.oid = oid; - this.sparse = sparse; - this.fastFp = fastFp; - this.polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE; - this.hashAlg = hashAlg; - init(); - } - - /** - * Constructs a parameter set that uses product-form private keys (i.e. polyType=PRODUCT). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param df1 number of ones in the private polynomial f1 - * @param df2 number of ones in the private polynomial f2 - * @param df3 number of ones in the private polynomial f3 - * @param dm0 minimum acceptable number of -1's, 0's, and 1's in the polynomial m' in the last encryption step - * @param db number of random bits to prepend to the message - * @param c a parameter for the Index Generation Function ({@link org.bc.crypto.engines.IndexGenerator}) - * @param minCallsR minimum number of hash calls for the IGF to make - * @param minCallsMask minimum number of calls to generate the masking polynomial - * @param hashSeed whether to hash the seed in the MGF first (true) or use the seed directly (false) - * @param oid three bytes that uniquely identify the parameter set - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param fastFp whether f=1+p*F for a ternary F (true) or f is ternary (false) - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256 - */ - public NTRUEncryptionKeyGenerationParameters(int N, int q, int df1, int df2, int df3, int dm0, int db, int c, int minCallsR, int minCallsMask, boolean hashSeed, byte[] oid, boolean sparse, boolean fastFp, Digest hashAlg) - { - super(new SecureRandom(), db); - - this.N = N; - this.q = q; - this.df1 = df1; - this.df2 = df2; - this.df3 = df3; - this.db = db; - this.dm0 = dm0; - this.c = c; - this.minCallsR = minCallsR; - this.minCallsMask = minCallsMask; - this.hashSeed = hashSeed; - this.oid = oid; - this.sparse = sparse; - this.fastFp = fastFp; - this.polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT; - this.hashAlg = hashAlg; - init(); - } - - private void init() - { - dr = df; - dr1 = df1; - dr2 = df2; - dr3 = df3; - dg = N / 3; - llen = 1; // ceil(log2(maxMsgLenBytes)) - maxMsgLenBytes = N * 3 / 2 / 8 - llen - db / 8 - 1; - bufferLenBits = (N * 3 / 2 + 7) / 8 * 8 + 1; - bufferLenTrits = N - 1; - pkLen = db; - } - - /** - * Reads a parameter set from an input stream. - * - * @param is an input stream - * @throws java.io.IOException - */ - public NTRUEncryptionKeyGenerationParameters(InputStream is) - throws IOException - { - super(new SecureRandom(), -1); - DataInputStream dis = new DataInputStream(is); - N = dis.readInt(); - q = dis.readInt(); - df = dis.readInt(); - df1 = dis.readInt(); - df2 = dis.readInt(); - df3 = dis.readInt(); - db = dis.readInt(); - dm0 = dis.readInt(); - c = dis.readInt(); - minCallsR = dis.readInt(); - minCallsMask = dis.readInt(); - hashSeed = dis.readBoolean(); - oid = new byte[3]; - dis.read(oid); - sparse = dis.readBoolean(); - fastFp = dis.readBoolean(); - polyType = dis.read(); - - String alg = dis.readUTF(); - - if ("SHA-512".equals(alg)) - { - hashAlg = new SHA512Digest(); - } - else if ("SHA-256".equals(alg)) - { - hashAlg = new SHA256Digest(); - } - - init(); - } - - public NTRUEncryptionParameters getEncryptionParameters() - { - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - return new NTRUEncryptionParameters(N, q, df, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - else - { - return new NTRUEncryptionParameters(N, q, df1, df2, df3, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - } - - public NTRUEncryptionKeyGenerationParameters clone() - { - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - return new NTRUEncryptionKeyGenerationParameters(N, q, df, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - else - { - return new NTRUEncryptionKeyGenerationParameters(N, q, df1, df2, df3, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - } - - /** - * Returns the maximum length a plaintext message can be with this parameter set. - * - * @return the maximum length in bytes - */ - public int getMaxMessageLength() - { - return maxMsgLenBytes; - } - - /** - * Writes the parameter set to an output stream - * - * @param os an output stream - * @throws java.io.IOException - */ - public void writeTo(OutputStream os) - throws IOException - { - DataOutputStream dos = new DataOutputStream(os); - dos.writeInt(N); - dos.writeInt(q); - dos.writeInt(df); - dos.writeInt(df1); - dos.writeInt(df2); - dos.writeInt(df3); - dos.writeInt(db); - dos.writeInt(dm0); - dos.writeInt(c); - dos.writeInt(minCallsR); - dos.writeInt(minCallsMask); - dos.writeBoolean(hashSeed); - dos.write(oid); - dos.writeBoolean(sparse); - dos.writeBoolean(fastFp); - dos.write(polyType); - dos.writeUTF(hashAlg.getAlgorithmName()); - } - - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + N; - result = prime * result + bufferLenBits; - result = prime * result + bufferLenTrits; - result = prime * result + c; - result = prime * result + db; - result = prime * result + df; - result = prime * result + df1; - result = prime * result + df2; - result = prime * result + df3; - result = prime * result + dg; - result = prime * result + dm0; - result = prime * result + dr; - result = prime * result + dr1; - result = prime * result + dr2; - result = prime * result + dr3; - result = prime * result + (fastFp ? 1231 : 1237); - result = prime * result + ((hashAlg == null) ? 0 : hashAlg.getAlgorithmName().hashCode()); - result = prime * result + (hashSeed ? 1231 : 1237); - result = prime * result + llen; - result = prime * result + maxMsgLenBytes; - result = prime * result + minCallsMask; - result = prime * result + minCallsR; - result = prime * result + Arrays.hashCode(oid); - result = prime * result + pkLen; - result = prime * result + polyType; - result = prime * result + q; - result = prime * result + (sparse ? 1231 : 1237); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - NTRUEncryptionKeyGenerationParameters other = (NTRUEncryptionKeyGenerationParameters)obj; - if (N != other.N) - { - return false; - } - if (bufferLenBits != other.bufferLenBits) - { - return false; - } - if (bufferLenTrits != other.bufferLenTrits) - { - return false; - } - if (c != other.c) - { - return false; - } - if (db != other.db) - { - return false; - } - if (df != other.df) - { - return false; - } - if (df1 != other.df1) - { - return false; - } - if (df2 != other.df2) - { - return false; - } - if (df3 != other.df3) - { - return false; - } - if (dg != other.dg) - { - return false; - } - if (dm0 != other.dm0) - { - return false; - } - if (dr != other.dr) - { - return false; - } - if (dr1 != other.dr1) - { - return false; - } - if (dr2 != other.dr2) - { - return false; - } - if (dr3 != other.dr3) - { - return false; - } - if (fastFp != other.fastFp) - { - return false; - } - if (hashAlg == null) - { - if (other.hashAlg != null) - { - return false; - } - } - else if (!hashAlg.getAlgorithmName().equals(other.hashAlg.getAlgorithmName())) - { - return false; - } - if (hashSeed != other.hashSeed) - { - return false; - } - if (llen != other.llen) - { - return false; - } - if (maxMsgLenBytes != other.maxMsgLenBytes) - { - return false; - } - if (minCallsMask != other.minCallsMask) - { - return false; - } - if (minCallsR != other.minCallsR) - { - return false; - } - if (!Arrays.equals(oid, other.oid)) - { - return false; - } - if (pkLen != other.pkLen) - { - return false; - } - if (polyType != other.polyType) - { - return false; - } - if (q != other.q) - { - return false; - } - if (sparse != other.sparse) - { - return false; - } - return true; - } - - public String toString() - { - StringBuilder output = new StringBuilder("EncryptionParameters(N=" + N + " q=" + q); - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - output.append(" polyType=SIMPLE df=" + df); - } - else - { - output.append(" polyType=PRODUCT df1=" + df1 + " df2=" + df2 + " df3=" + df3); - } - output.append(" dm0=" + dm0 + " db=" + db + " c=" + c + " minCallsR=" + minCallsR + " minCallsMask=" + minCallsMask + - " hashSeed=" + hashSeed + " hashAlg=" + hashAlg + " oid=" + Arrays.toString(oid) + " sparse=" + sparse + ")"); - return output.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyParameters.java deleted file mode 100644 index 0442784..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionKeyParameters.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto.params; - -public class NTRUEncryptionKeyParameters - extends AsymmetricKeyParameter -{ - final protected NTRUEncryptionParameters params; - - public NTRUEncryptionKeyParameters(boolean privateKey, NTRUEncryptionParameters params) - { - super(privateKey); - this.params = params; - } - - public NTRUEncryptionParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionParameters.java deleted file mode 100644 index dd7ff01..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionParameters.java +++ /dev/null @@ -1,410 +0,0 @@ -package org.bc.crypto.params; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; - -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.digests.SHA512Digest; - -/** - * A set of parameters for NtruEncrypt. Several predefined parameter sets are available and new ones can be created as well. - */ -public class NTRUEncryptionParameters - implements Cloneable -{ - - public int N, q, df, df1, df2, df3; - public int dr; - public int dr1; - public int dr2; - public int dr3; - public int dg; - int llen; - public int maxMsgLenBytes; - public int db; - public int bufferLenBits; - int bufferLenTrits; - public int dm0; - public int pkLen; - public int c; - public int minCallsR; - public int minCallsMask; - public boolean hashSeed; - public byte[] oid; - public boolean sparse; - public boolean fastFp; - public int polyType; - public Digest hashAlg; - - /** - * Constructs a parameter set that uses ternary private keys (i.e. polyType=SIMPLE). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param df number of ones in the private polynomial f - * @param dm0 minimum acceptable number of -1's, 0's, and 1's in the polynomial m' in the last encryption step - * @param db number of random bits to prepend to the message - * @param c a parameter for the Index Generation Function ({@link org.bc.crypto.engines.IndexGenerator}) - * @param minCallsR minimum number of hash calls for the IGF to make - * @param minCallsMask minimum number of calls to generate the masking polynomial - * @param hashSeed whether to hash the seed in the MGF first (true) or use the seed directly (false) - * @param oid three bytes that uniquely identify the parameter set - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param fastFp whether f=1+p*F for a ternary F (true) or f is ternary (false) - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUEncryptionParameters(int N, int q, int df, int dm0, int db, int c, int minCallsR, int minCallsMask, boolean hashSeed, byte[] oid, boolean sparse, boolean fastFp, Digest hashAlg) - { - this.N = N; - this.q = q; - this.df = df; - this.db = db; - this.dm0 = dm0; - this.c = c; - this.minCallsR = minCallsR; - this.minCallsMask = minCallsMask; - this.hashSeed = hashSeed; - this.oid = oid; - this.sparse = sparse; - this.fastFp = fastFp; - this.polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE; - this.hashAlg = hashAlg; - init(); - } - - /** - * Constructs a parameter set that uses product-form private keys (i.e. polyType=PRODUCT). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param df1 number of ones in the private polynomial f1 - * @param df2 number of ones in the private polynomial f2 - * @param df3 number of ones in the private polynomial f3 - * @param dm0 minimum acceptable number of -1's, 0's, and 1's in the polynomial m' in the last encryption step - * @param db number of random bits to prepend to the message - * @param c a parameter for the Index Generation Function ({@link org.bc.crypto.engines.IndexGenerator}) - * @param minCallsR minimum number of hash calls for the IGF to make - * @param minCallsMask minimum number of calls to generate the masking polynomial - * @param hashSeed whether to hash the seed in the MGF first (true) or use the seed directly (false) - * @param oid three bytes that uniquely identify the parameter set - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param fastFp whether f=1+p*F for a ternary F (true) or f is ternary (false) - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256 - */ - public NTRUEncryptionParameters(int N, int q, int df1, int df2, int df3, int dm0, int db, int c, int minCallsR, int minCallsMask, boolean hashSeed, byte[] oid, boolean sparse, boolean fastFp, Digest hashAlg) - { - this.N = N; - this.q = q; - this.df1 = df1; - this.df2 = df2; - this.df3 = df3; - this.db = db; - this.dm0 = dm0; - this.c = c; - this.minCallsR = minCallsR; - this.minCallsMask = minCallsMask; - this.hashSeed = hashSeed; - this.oid = oid; - this.sparse = sparse; - this.fastFp = fastFp; - this.polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT; - this.hashAlg = hashAlg; - init(); - } - - private void init() - { - dr = df; - dr1 = df1; - dr2 = df2; - dr3 = df3; - dg = N / 3; - llen = 1; // ceil(log2(maxMsgLenBytes)) - maxMsgLenBytes = N * 3 / 2 / 8 - llen - db / 8 - 1; - bufferLenBits = (N * 3 / 2 + 7) / 8 * 8 + 1; - bufferLenTrits = N - 1; - pkLen = db; - } - - /** - * Reads a parameter set from an input stream. - * - * @param is an input stream - * @throws IOException - */ - public NTRUEncryptionParameters(InputStream is) - throws IOException - { - DataInputStream dis = new DataInputStream(is); - N = dis.readInt(); - q = dis.readInt(); - df = dis.readInt(); - df1 = dis.readInt(); - df2 = dis.readInt(); - df3 = dis.readInt(); - db = dis.readInt(); - dm0 = dis.readInt(); - c = dis.readInt(); - minCallsR = dis.readInt(); - minCallsMask = dis.readInt(); - hashSeed = dis.readBoolean(); - oid = new byte[3]; - dis.read(oid); - sparse = dis.readBoolean(); - fastFp = dis.readBoolean(); - polyType = dis.read(); - - String alg = dis.readUTF(); - - if ("SHA-512".equals(alg)) - { - hashAlg = new SHA512Digest(); - } - else if ("SHA-256".equals(alg)) - { - hashAlg = new SHA256Digest(); - } - - init(); - } - - public NTRUEncryptionParameters clone() - { - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - return new NTRUEncryptionParameters(N, q, df, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - else - { - return new NTRUEncryptionParameters(N, q, df1, df2, df3, dm0, db, c, minCallsR, minCallsMask, hashSeed, oid, sparse, fastFp, hashAlg); - } - } - - /** - * Returns the maximum length a plaintext message can be with this parameter set. - * - * @return the maximum length in bytes - */ - public int getMaxMessageLength() - { - return maxMsgLenBytes; - } - - /** - * Writes the parameter set to an output stream - * - * @param os an output stream - * @throws IOException - */ - public void writeTo(OutputStream os) - throws IOException - { - DataOutputStream dos = new DataOutputStream(os); - dos.writeInt(N); - dos.writeInt(q); - dos.writeInt(df); - dos.writeInt(df1); - dos.writeInt(df2); - dos.writeInt(df3); - dos.writeInt(db); - dos.writeInt(dm0); - dos.writeInt(c); - dos.writeInt(minCallsR); - dos.writeInt(minCallsMask); - dos.writeBoolean(hashSeed); - dos.write(oid); - dos.writeBoolean(sparse); - dos.writeBoolean(fastFp); - dos.write(polyType); - dos.writeUTF(hashAlg.getAlgorithmName()); - } - - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + N; - result = prime * result + bufferLenBits; - result = prime * result + bufferLenTrits; - result = prime * result + c; - result = prime * result + db; - result = prime * result + df; - result = prime * result + df1; - result = prime * result + df2; - result = prime * result + df3; - result = prime * result + dg; - result = prime * result + dm0; - result = prime * result + dr; - result = prime * result + dr1; - result = prime * result + dr2; - result = prime * result + dr3; - result = prime * result + (fastFp ? 1231 : 1237); - result = prime * result + ((hashAlg == null) ? 0 : hashAlg.getAlgorithmName().hashCode()); - result = prime * result + (hashSeed ? 1231 : 1237); - result = prime * result + llen; - result = prime * result + maxMsgLenBytes; - result = prime * result + minCallsMask; - result = prime * result + minCallsR; - result = prime * result + Arrays.hashCode(oid); - result = prime * result + pkLen; - result = prime * result + polyType; - result = prime * result + q; - result = prime * result + (sparse ? 1231 : 1237); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - NTRUEncryptionParameters other = (NTRUEncryptionParameters)obj; - if (N != other.N) - { - return false; - } - if (bufferLenBits != other.bufferLenBits) - { - return false; - } - if (bufferLenTrits != other.bufferLenTrits) - { - return false; - } - if (c != other.c) - { - return false; - } - if (db != other.db) - { - return false; - } - if (df != other.df) - { - return false; - } - if (df1 != other.df1) - { - return false; - } - if (df2 != other.df2) - { - return false; - } - if (df3 != other.df3) - { - return false; - } - if (dg != other.dg) - { - return false; - } - if (dm0 != other.dm0) - { - return false; - } - if (dr != other.dr) - { - return false; - } - if (dr1 != other.dr1) - { - return false; - } - if (dr2 != other.dr2) - { - return false; - } - if (dr3 != other.dr3) - { - return false; - } - if (fastFp != other.fastFp) - { - return false; - } - if (hashAlg == null) - { - if (other.hashAlg != null) - { - return false; - } - } - else if (!hashAlg.getAlgorithmName().equals(other.hashAlg.getAlgorithmName())) - { - return false; - } - if (hashSeed != other.hashSeed) - { - return false; - } - if (llen != other.llen) - { - return false; - } - if (maxMsgLenBytes != other.maxMsgLenBytes) - { - return false; - } - if (minCallsMask != other.minCallsMask) - { - return false; - } - if (minCallsR != other.minCallsR) - { - return false; - } - if (!Arrays.equals(oid, other.oid)) - { - return false; - } - if (pkLen != other.pkLen) - { - return false; - } - if (polyType != other.polyType) - { - return false; - } - if (q != other.q) - { - return false; - } - if (sparse != other.sparse) - { - return false; - } - return true; - } - - public String toString() - { - StringBuilder output = new StringBuilder("EncryptionParameters(N=" + N + " q=" + q); - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - output.append(" polyType=SIMPLE df=" + df); - } - else - { - output.append(" polyType=PRODUCT df1=" + df1 + " df2=" + df2 + " df3=" + df3); - } - output.append(" dm0=" + dm0 + " db=" + db + " c=" + c + " minCallsR=" + minCallsR + " minCallsMask=" + minCallsMask + - " hashSeed=" + hashSeed + " hashAlg=" + hashAlg + " oid=" + Arrays.toString(oid) + " sparse=" + sparse + ")"); - return output.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPrivateKeyParameters.java deleted file mode 100644 index c302da3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPrivateKeyParameters.java +++ /dev/null @@ -1,199 +0,0 @@ -package org.bc.crypto.params; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; -import org.bc.math.ntru.polynomial.ProductFormPolynomial; -import org.bc.math.ntru.polynomial.SparseTernaryPolynomial; - -/** - * A NtruEncrypt private key is essentially a polynomial named f - * which takes different forms depending on whether product-form polynomials are used, - * and on fastP
    - * The inverse of f modulo p is precomputed on initialization. - */ -public class NTRUEncryptionPrivateKeyParameters - extends NTRUEncryptionKeyParameters -{ - public Polynomial t; - public IntegerPolynomial fp; - public IntegerPolynomial h; - - /** - * Constructs a new private key from a polynomial - * - * @param h the public polynomial for the key. - * @param t the polynomial which determines the key: if fastFp=true, f=1+3t; otherwise, f=t - * @param fp the inverse of f - * @param params the NtruEncrypt parameters to use - */ - public NTRUEncryptionPrivateKeyParameters(IntegerPolynomial h, Polynomial t, IntegerPolynomial fp, NTRUEncryptionParameters params) - { - super(true, params); - - this.h = h; - this.t = t; - this.fp = fp; - } - - /** - * Converts a byte array to a polynomial f and constructs a new private key - * - * @param b an encoded polynomial - * @param params the NtruEncrypt parameters to use - * @see #getEncoded() - */ - public NTRUEncryptionPrivateKeyParameters(byte[] b, NTRUEncryptionParameters params) - throws IOException - { - this(new ByteArrayInputStream(b), params); - } - - /** - * Reads a polynomial f from an input stream and constructs a new private key - * - * @param is an input stream - * @param params the NtruEncrypt parameters to use - * @see #writeTo(OutputStream) - */ - public NTRUEncryptionPrivateKeyParameters(InputStream is, NTRUEncryptionParameters params) - throws IOException - { - super(true, params); - - if (params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT) - { - int N = params.N; - int df1 = params.df1; - int df2 = params.df2; - int df3Ones = params.df3; - int df3NegOnes = params.fastFp ? params.df3 : params.df3 - 1; - h = IntegerPolynomial.fromBinary(is, params.N, params.q); - t = ProductFormPolynomial.fromBinary(is, N, df1, df2, df3Ones, df3NegOnes); - } - else - { - h = IntegerPolynomial.fromBinary(is, params.N, params.q); - IntegerPolynomial fInt = IntegerPolynomial.fromBinary3Tight(is, params.N); - t = params.sparse ? new SparseTernaryPolynomial(fInt) : new DenseTernaryPolynomial(fInt); - } - - init(); - } - - /** - * Initializes fp from t. - */ - private void init() - { - if (params.fastFp) - { - fp = new IntegerPolynomial(params.N); - fp.coeffs[0] = 1; - } - else - { - fp = t.toIntegerPolynomial().invertF3(); - } - } - - /** - * Converts the key to a byte array - * - * @return the encoded key - * @see #NTRUEncryptionPrivateKeyParameters(byte[], NTRUEncryptionParameters) - */ - public byte[] getEncoded() - { - byte[] hBytes = h.toBinary(params.q); - byte[] tBytes; - - if (t instanceof ProductFormPolynomial) - { - tBytes = ((ProductFormPolynomial)t).toBinary(); - } - else - { - tBytes = t.toIntegerPolynomial().toBinary3Tight(); - } - - byte[] res = new byte[hBytes.length + tBytes.length]; - - System.arraycopy(hBytes, 0, res, 0, hBytes.length); - System.arraycopy(tBytes, 0, res, hBytes.length, tBytes.length); - - return res; - } - - /** - * Writes the key to an output stream - * - * @param os an output stream - * @throws IOException - * @see #NTRUEncryptionPrivateKeyParameters(InputStream, NTRUEncryptionParameters) - */ - public void writeTo(OutputStream os) - throws IOException - { - os.write(getEncoded()); - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((params == null) ? 0 : params.hashCode()); - result = prime * result + ((t == null) ? 0 : t.hashCode()); - result = prime * result + ((h == null) ? 0 : h.hashCode()); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NTRUEncryptionPrivateKeyParameters)) - { - return false; - } - NTRUEncryptionPrivateKeyParameters other = (NTRUEncryptionPrivateKeyParameters)obj; - if (params == null) - { - if (other.params != null) - { - return false; - } - } - else if (!params.equals(other.params)) - { - return false; - } - if (t == null) - { - if (other.t != null) - { - return false; - } - } - else if (!t.equals(other.t)) - { - return false; - } - if (!h.equals(other.h)) - { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPublicKeyParameters.java deleted file mode 100644 index 4546888..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUEncryptionPublicKeyParameters.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.crypto.params; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.math.ntru.polynomial.IntegerPolynomial; - -/** - * A NtruEncrypt public key is essentially a polynomial named h. - */ -public class NTRUEncryptionPublicKeyParameters - extends NTRUEncryptionKeyParameters -{ - public IntegerPolynomial h; - - /** - * Constructs a new public key from a polynomial - * - * @param h the polynomial h which determines the key - * @param params the NtruEncrypt parameters to use - */ - public NTRUEncryptionPublicKeyParameters(IntegerPolynomial h, NTRUEncryptionParameters params) - { - super(false, params); - - this.h = h; - } - - /** - * Converts a byte array to a polynomial h and constructs a new public key - * - * @param b an encoded polynomial - * @param params the NtruEncrypt parameters to use - * @see #getEncoded() - */ - public NTRUEncryptionPublicKeyParameters(byte[] b, NTRUEncryptionParameters params) - { - super(false, params); - - h = IntegerPolynomial.fromBinary(b, params.N, params.q); - } - - /** - * Reads a polynomial h from an input stream and constructs a new public key - * - * @param is an input stream - * @param params the NtruEncrypt parameters to use - * @see #writeTo(OutputStream) - */ - public NTRUEncryptionPublicKeyParameters(InputStream is, NTRUEncryptionParameters params) - throws IOException - { - super(false, params); - - h = IntegerPolynomial.fromBinary(is, params.N, params.q); - } - - /** - * Converts the key to a byte array - * - * @return the encoded key - * @see #NTRUEncryptionPublicKeyParameters(byte[], NTRUEncryptionParameters) - */ - public byte[] getEncoded() - { - return h.toBinary(params.q); - } - - /** - * Writes the key to an output stream - * - * @param os an output stream - * @throws IOException - * @see #NTRUEncryptionPublicKeyParameters(InputStream, NTRUEncryptionParameters) - */ - public void writeTo(OutputStream os) - throws IOException - { - os.write(getEncoded()); - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((h == null) ? 0 : h.hashCode()); - result = prime * result + ((params == null) ? 0 : params.hashCode()); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NTRUEncryptionPublicKeyParameters)) - { - return false; - } - NTRUEncryptionPublicKeyParameters other = (NTRUEncryptionPublicKeyParameters)obj; - if (h == null) - { - if (other.h != null) - { - return false; - } - } - else if (!h.equals(other.h)) - { - return false; - } - if (params == null) - { - if (other.params != null) - { - return false; - } - } - else if (!params.equals(other.params)) - { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUParameters.java deleted file mode 100644 index 6b66c2c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUParameters.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.bc.crypto.params; - -public class NTRUParameters -{ - public static final int TERNARY_POLYNOMIAL_TYPE_SIMPLE = 0; - public static final int TERNARY_POLYNOMIAL_TYPE_PRODUCT = 1; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningKeyGenerationParameters.java deleted file mode 100644 index a8ec5e6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningKeyGenerationParameters.java +++ /dev/null @@ -1,407 +0,0 @@ -package org.bc.crypto.params; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.SecureRandom; -import java.text.DecimalFormat; - -import org.bc.crypto.Digest; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.digests.SHA512Digest; - -/** - * A set of parameters for NtruSign. Several predefined parameter sets are available and new ones can be created as well. - */ -public class NTRUSigningKeyGenerationParameters - extends KeyGenerationParameters - implements Cloneable -{ - public static final int BASIS_TYPE_STANDARD = 0; - public static final int BASIS_TYPE_TRANSPOSE = 1; - - public static final int KEY_GEN_ALG_RESULTANT = 0; - public static final int KEY_GEN_ALG_FLOAT = 1; - - /** - * Gives 128 bits of security - */ - public static final NTRUSigningKeyGenerationParameters APR2011_439 = new NTRUSigningKeyGenerationParameters(439, 2048, 146, 1, BASIS_TYPE_TRANSPOSE, 0.165, 400, 280, false, true, KEY_GEN_ALG_RESULTANT, new SHA256Digest()); - - /** - * Like APR2011_439, this parameter set gives 128 bits of security but uses product-form polynomials - */ - public static final NTRUSigningKeyGenerationParameters APR2011_439_PROD = new NTRUSigningKeyGenerationParameters(439, 2048, 9, 8, 5, 1, BASIS_TYPE_TRANSPOSE, 0.165, 400, 280, false, true, KEY_GEN_ALG_RESULTANT, new SHA256Digest()); - - /** - * Gives 256 bits of security - */ - public static final NTRUSigningKeyGenerationParameters APR2011_743 = new NTRUSigningKeyGenerationParameters(743, 2048, 248, 1, BASIS_TYPE_TRANSPOSE, 0.127, 405, 360, true, false, KEY_GEN_ALG_RESULTANT, new SHA512Digest()); - - /** - * Like APR2011_439, this parameter set gives 256 bits of security but uses product-form polynomials - */ - public static final NTRUSigningKeyGenerationParameters APR2011_743_PROD = new NTRUSigningKeyGenerationParameters(743, 2048, 11, 11, 15, 1, BASIS_TYPE_TRANSPOSE, 0.127, 405, 360, true, false, KEY_GEN_ALG_RESULTANT, new SHA512Digest()); - - /** - * Generates key pairs quickly. Use for testing only. - */ - public static final NTRUSigningKeyGenerationParameters TEST157 = new NTRUSigningKeyGenerationParameters(157, 256, 29, 1, BASIS_TYPE_TRANSPOSE, 0.38, 200, 80, false, false, KEY_GEN_ALG_RESULTANT, new SHA256Digest()); - /** - * Generates key pairs quickly. Use for testing only. - */ - public static final NTRUSigningKeyGenerationParameters TEST157_PROD = new NTRUSigningKeyGenerationParameters(157, 256, 5, 5, 8, 1, BASIS_TYPE_TRANSPOSE, 0.38, 200, 80, false, false, KEY_GEN_ALG_RESULTANT, new SHA256Digest()); - - - public int N; - public int q; - public int d, d1, d2, d3, B; - double beta; - public double betaSq; - double normBound; - public double normBoundSq; - public int signFailTolerance = 100; - double keyNormBound; - public double keyNormBoundSq; - public boolean primeCheck; // true if N and 2N+1 are prime - public int basisType; - int bitsF = 6; // max #bits needed to encode one coefficient of the polynomial F - public boolean sparse; // whether to treat ternary polynomials as sparsely populated - public int keyGenAlg; - public Digest hashAlg; - public int polyType; - - /** - * Constructs a parameter set that uses ternary private keys (i.e. polyType=SIMPLE). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param d number of -1's in the private polynomials f and g - * @param B number of perturbations - * @param basisType whether to use the standard or transpose lattice - * @param beta balancing factor for the transpose lattice - * @param normBound maximum norm for valid signatures - * @param keyNormBound maximum norm for the ploynomials F and G - * @param primeCheck whether 2N+1 is prime - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param keyGenAlg RESULTANT produces better bases, FLOAT is slightly faster. RESULTANT follows the EESS standard while FLOAT is described in Hoffstein et al: An Introduction to Mathematical Cryptography. - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUSigningKeyGenerationParameters(int N, int q, int d, int B, int basisType, double beta, double normBound, double keyNormBound, boolean primeCheck, boolean sparse, int keyGenAlg, Digest hashAlg) - { - super(new SecureRandom(), N); - this.N = N; - this.q = q; - this.d = d; - this.B = B; - this.basisType = basisType; - this.beta = beta; - this.normBound = normBound; - this.keyNormBound = keyNormBound; - this.primeCheck = primeCheck; - this.sparse = sparse; - this.keyGenAlg = keyGenAlg; - this.hashAlg = hashAlg; - polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE; - init(); - } - - /** - * Constructs a parameter set that uses product-form private keys (i.e. polyType=PRODUCT). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param d1 number of -1's in the private polynomials f and g - * @param d2 number of -1's in the private polynomials f and g - * @param d3 number of -1's in the private polynomials f and g - * @param B number of perturbations - * @param basisType whether to use the standard or transpose lattice - * @param beta balancing factor for the transpose lattice - * @param normBound maximum norm for valid signatures - * @param keyNormBound maximum norm for the ploynomials F and G - * @param primeCheck whether 2N+1 is prime - * @param sparse whether to treat ternary polynomials as sparsely populated ({@link org.bc.math.ntru.polynomial.SparseTernaryPolynomial} vs {@link org.bc.math.ntru.polynomial.DenseTernaryPolynomial}) - * @param keyGenAlg RESULTANT produces better bases, FLOAT is slightly faster. RESULTANT follows the EESS standard while FLOAT is described in Hoffstein et al: An Introduction to Mathematical Cryptography. - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUSigningKeyGenerationParameters(int N, int q, int d1, int d2, int d3, int B, int basisType, double beta, double normBound, double keyNormBound, boolean primeCheck, boolean sparse, int keyGenAlg, Digest hashAlg) - { - super(new SecureRandom(), N); - this.N = N; - this.q = q; - this.d1 = d1; - this.d2 = d2; - this.d3 = d3; - this.B = B; - this.basisType = basisType; - this.beta = beta; - this.normBound = normBound; - this.keyNormBound = keyNormBound; - this.primeCheck = primeCheck; - this.sparse = sparse; - this.keyGenAlg = keyGenAlg; - this.hashAlg = hashAlg; - polyType = NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT; - init(); - } - - private void init() - { - betaSq = beta * beta; - normBoundSq = normBound * normBound; - keyNormBoundSq = keyNormBound * keyNormBound; - } - - /** - * Reads a parameter set from an input stream. - * - * @param is an input stream - * @throws java.io.IOException - */ - public NTRUSigningKeyGenerationParameters(InputStream is) - throws IOException - { - super(new SecureRandom(), 0); // TODO: - DataInputStream dis = new DataInputStream(is); - N = dis.readInt(); - q = dis.readInt(); - d = dis.readInt(); - d1 = dis.readInt(); - d2 = dis.readInt(); - d3 = dis.readInt(); - B = dis.readInt(); - basisType = dis.readInt(); - beta = dis.readDouble(); - normBound = dis.readDouble(); - keyNormBound = dis.readDouble(); - signFailTolerance = dis.readInt(); - primeCheck = dis.readBoolean(); - sparse = dis.readBoolean(); - bitsF = dis.readInt(); - keyGenAlg = dis.read(); - String alg = dis.readUTF(); - if ("SHA-512".equals(alg)) - { - hashAlg = new SHA512Digest(); - } - else if ("SHA-256".equals(alg)) - { - hashAlg = new SHA256Digest(); - } - polyType = dis.read(); - init(); - } - - /** - * Writes the parameter set to an output stream - * - * @param os an output stream - * @throws java.io.IOException - */ - public void writeTo(OutputStream os) - throws IOException - { - DataOutputStream dos = new DataOutputStream(os); - dos.writeInt(N); - dos.writeInt(q); - dos.writeInt(d); - dos.writeInt(d1); - dos.writeInt(d2); - dos.writeInt(d3); - dos.writeInt(B); - dos.writeInt(basisType); - dos.writeDouble(beta); - dos.writeDouble(normBound); - dos.writeDouble(keyNormBound); - dos.writeInt(signFailTolerance); - dos.writeBoolean(primeCheck); - dos.writeBoolean(sparse); - dos.writeInt(bitsF); - dos.write(keyGenAlg); - dos.writeUTF(hashAlg.getAlgorithmName()); - dos.write(polyType); - } - - public NTRUSigningParameters getSigningParameters() - { - return new NTRUSigningParameters(N, q, d, B, beta, normBound, hashAlg); - } - - public NTRUSigningKeyGenerationParameters clone() - { - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - return new NTRUSigningKeyGenerationParameters(N, q, d, B, basisType, beta, normBound, keyNormBound, primeCheck, sparse, keyGenAlg, hashAlg); - } - else - { - return new NTRUSigningKeyGenerationParameters(N, q, d1, d2, d3, B, basisType, beta, normBound, keyNormBound, primeCheck, sparse, keyGenAlg, hashAlg); - } - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + B; - result = prime * result + N; - result = prime * result + basisType; - long temp; - temp = Double.doubleToLongBits(beta); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(betaSq); - result = prime * result + (int)(temp ^ (temp >>> 32)); - result = prime * result + bitsF; - result = prime * result + d; - result = prime * result + d1; - result = prime * result + d2; - result = prime * result + d3; - result = prime * result + ((hashAlg == null) ? 0 : hashAlg.getAlgorithmName().hashCode()); - result = prime * result + keyGenAlg; - temp = Double.doubleToLongBits(keyNormBound); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(keyNormBoundSq); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(normBound); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(normBoundSq); - result = prime * result + (int)(temp ^ (temp >>> 32)); - result = prime * result + polyType; - result = prime * result + (primeCheck ? 1231 : 1237); - result = prime * result + q; - result = prime * result + signFailTolerance; - result = prime * result + (sparse ? 1231 : 1237); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NTRUSigningKeyGenerationParameters)) - { - return false; - } - NTRUSigningKeyGenerationParameters other = (NTRUSigningKeyGenerationParameters)obj; - if (B != other.B) - { - return false; - } - if (N != other.N) - { - return false; - } - if (basisType != other.basisType) - { - return false; - } - if (Double.doubleToLongBits(beta) != Double.doubleToLongBits(other.beta)) - { - return false; - } - if (Double.doubleToLongBits(betaSq) != Double.doubleToLongBits(other.betaSq)) - { - return false; - } - if (bitsF != other.bitsF) - { - return false; - } - if (d != other.d) - { - return false; - } - if (d1 != other.d1) - { - return false; - } - if (d2 != other.d2) - { - return false; - } - if (d3 != other.d3) - { - return false; - } - if (hashAlg == null) - { - if (other.hashAlg != null) - { - return false; - } - } - else if (!hashAlg.getAlgorithmName().equals(other.hashAlg.getAlgorithmName())) - { - return false; - } - if (keyGenAlg != other.keyGenAlg) - { - return false; - } - if (Double.doubleToLongBits(keyNormBound) != Double.doubleToLongBits(other.keyNormBound)) - { - return false; - } - if (Double.doubleToLongBits(keyNormBoundSq) != Double.doubleToLongBits(other.keyNormBoundSq)) - { - return false; - } - if (Double.doubleToLongBits(normBound) != Double.doubleToLongBits(other.normBound)) - { - return false; - } - if (Double.doubleToLongBits(normBoundSq) != Double.doubleToLongBits(other.normBoundSq)) - { - return false; - } - if (polyType != other.polyType) - { - return false; - } - if (primeCheck != other.primeCheck) - { - return false; - } - if (q != other.q) - { - return false; - } - if (signFailTolerance != other.signFailTolerance) - { - return false; - } - if (sparse != other.sparse) - { - return false; - } - return true; - } - - public String toString() - { - DecimalFormat format = new DecimalFormat("0.00"); - - StringBuilder output = new StringBuilder("SignatureParameters(N=" + N + " q=" + q); - if (polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE) - { - output.append(" polyType=SIMPLE d=" + d); - } - else - { - output.append(" polyType=PRODUCT d1=" + d1 + " d2=" + d2 + " d3=" + d3); - } - output.append(" B=" + B + " basisType=" + basisType + " beta=" + format.format(beta) + - " normBound=" + format.format(normBound) + " keyNormBound=" + format.format(keyNormBound) + - " prime=" + primeCheck + " sparse=" + sparse + " keyGenAlg=" + keyGenAlg + " hashAlg=" + hashAlg + ")"); - return output.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningParameters.java deleted file mode 100644 index bf696c5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningParameters.java +++ /dev/null @@ -1,269 +0,0 @@ -package org.bc.crypto.params; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.text.DecimalFormat; - -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.digests.SHA512Digest; - -/** - * A set of parameters for NtruSign. Several predefined parameter sets are available and new ones can be created as well. - */ -public class NTRUSigningParameters - implements Cloneable -{ - public int N; - public int q; - public int d, d1, d2, d3, B; - double beta; - public double betaSq; - double normBound; - public double normBoundSq; - public int signFailTolerance = 100; - int bitsF = 6; // max #bits needed to encode one coefficient of the polynomial F - public Digest hashAlg; - - /** - * Constructs a parameter set that uses ternary private keys (i.e. polyType=SIMPLE). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param d number of -1's in the private polynomials f and g - * @param B number of perturbations - * @param beta balancing factor for the transpose lattice - * @param normBound maximum norm for valid signatures - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUSigningParameters(int N, int q, int d, int B, double beta, double normBound, Digest hashAlg) - { - this.N = N; - this.q = q; - this.d = d; - this.B = B; - this.beta = beta; - this.normBound = normBound; - this.hashAlg = hashAlg; - init(); - } - - /** - * Constructs a parameter set that uses product-form private keys (i.e. polyType=PRODUCT). - * - * @param N number of polynomial coefficients - * @param q modulus - * @param d1 number of -1's in the private polynomials f and g - * @param d2 number of -1's in the private polynomials f and g - * @param d3 number of -1's in the private polynomials f and g - * @param B number of perturbations - * @param beta balancing factor for the transpose lattice - * @param normBound maximum norm for valid signatures - * @param keyNormBound maximum norm for the ploynomials F and G - * @param hashAlg a valid identifier for a java.security.MessageDigest instance such as SHA-256. The MessageDigest must support the getDigestLength() method. - */ - public NTRUSigningParameters(int N, int q, int d1, int d2, int d3, int B, double beta, double normBound, double keyNormBound, Digest hashAlg) - { - this.N = N; - this.q = q; - this.d1 = d1; - this.d2 = d2; - this.d3 = d3; - this.B = B; - this.beta = beta; - this.normBound = normBound; - this.hashAlg = hashAlg; - init(); - } - - private void init() - { - betaSq = beta * beta; - normBoundSq = normBound * normBound; - } - - /** - * Reads a parameter set from an input stream. - * - * @param is an input stream - * @throws IOException - */ - public NTRUSigningParameters(InputStream is) - throws IOException - { - DataInputStream dis = new DataInputStream(is); - N = dis.readInt(); - q = dis.readInt(); - d = dis.readInt(); - d1 = dis.readInt(); - d2 = dis.readInt(); - d3 = dis.readInt(); - B = dis.readInt(); - beta = dis.readDouble(); - normBound = dis.readDouble(); - signFailTolerance = dis.readInt(); - bitsF = dis.readInt(); - String alg = dis.readUTF(); - if ("SHA-512".equals(alg)) - { - hashAlg = new SHA512Digest(); - } - else if ("SHA-256".equals(alg)) - { - hashAlg = new SHA256Digest(); - } - init(); - } - - /** - * Writes the parameter set to an output stream - * - * @param os an output stream - * @throws IOException - */ - public void writeTo(OutputStream os) - throws IOException - { - DataOutputStream dos = new DataOutputStream(os); - dos.writeInt(N); - dos.writeInt(q); - dos.writeInt(d); - dos.writeInt(d1); - dos.writeInt(d2); - dos.writeInt(d3); - dos.writeInt(B); - dos.writeDouble(beta); - dos.writeDouble(normBound); - dos.writeInt(signFailTolerance); - dos.writeInt(bitsF); - dos.writeUTF(hashAlg.getAlgorithmName()); - } - - public NTRUSigningParameters clone() - { - return new NTRUSigningParameters(N, q, d, B, beta, normBound, hashAlg); - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + B; - result = prime * result + N; - long temp; - temp = Double.doubleToLongBits(beta); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(betaSq); - result = prime * result + (int)(temp ^ (temp >>> 32)); - result = prime * result + bitsF; - result = prime * result + d; - result = prime * result + d1; - result = prime * result + d2; - result = prime * result + d3; - result = prime * result + ((hashAlg == null) ? 0 : hashAlg.getAlgorithmName().hashCode()); - temp = Double.doubleToLongBits(normBound); - result = prime * result + (int)(temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(normBoundSq); - result = prime * result + (int)(temp ^ (temp >>> 32)); - result = prime * result + q; - result = prime * result + signFailTolerance; - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NTRUSigningParameters)) - { - return false; - } - NTRUSigningParameters other = (NTRUSigningParameters)obj; - if (B != other.B) - { - return false; - } - if (N != other.N) - { - return false; - } - if (Double.doubleToLongBits(beta) != Double.doubleToLongBits(other.beta)) - { - return false; - } - if (Double.doubleToLongBits(betaSq) != Double.doubleToLongBits(other.betaSq)) - { - return false; - } - if (bitsF != other.bitsF) - { - return false; - } - if (d != other.d) - { - return false; - } - if (d1 != other.d1) - { - return false; - } - if (d2 != other.d2) - { - return false; - } - if (d3 != other.d3) - { - return false; - } - if (hashAlg == null) - { - if (other.hashAlg != null) - { - return false; - } - } - else if (!hashAlg.getAlgorithmName().equals(other.hashAlg.getAlgorithmName())) - { - return false; - } - if (Double.doubleToLongBits(normBound) != Double.doubleToLongBits(other.normBound)) - { - return false; - } - if (Double.doubleToLongBits(normBoundSq) != Double.doubleToLongBits(other.normBoundSq)) - { - return false; - } - if (q != other.q) - { - return false; - } - if (signFailTolerance != other.signFailTolerance) - { - return false; - } - - return true; - } - - public String toString() - { - DecimalFormat format = new DecimalFormat("0.00"); - - StringBuilder output = new StringBuilder("SignatureParameters(N=" + N + " q=" + q); - - output.append(" B=" + B + " beta=" + format.format(beta) + - " normBound=" + format.format(normBound) + - " hashAlg=" + hashAlg + ")"); - return output.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPrivateKeyParameters.java deleted file mode 100644 index e60706c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPrivateKeyParameters.java +++ /dev/null @@ -1,384 +0,0 @@ -package org.bc.crypto.params; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; -import org.bc.math.ntru.polynomial.ProductFormPolynomial; -import org.bc.math.ntru.polynomial.SparseTernaryPolynomial; - -/** - * A NtruSign private key comprises one or more {@link NTRUSigningPrivateKeyParameters.Basis} of three polynomials each, - * except the zeroth basis for which h is undefined. - */ -public class NTRUSigningPrivateKeyParameters - extends AsymmetricKeyParameter -{ - private List bases; - private NTRUSigningPublicKeyParameters publicKey; - - /** - * Constructs a new private key from a byte array - * - * @param b an encoded private key - * @param params the NtruSign parameters to use - */ - public NTRUSigningPrivateKeyParameters(byte[] b, NTRUSigningKeyGenerationParameters params) - throws IOException - { - this(new ByteArrayInputStream(b), params); - } - - /** - * Constructs a new private key from an input stream - * - * @param is an input stream - * @param params the NtruSign parameters to use - */ - public NTRUSigningPrivateKeyParameters(InputStream is, NTRUSigningKeyGenerationParameters params) - throws IOException - { - super(true); - bases = new ArrayList(); - for (int i = 0; i <= params.B; i++) - // include a public key h[i] in all bases except for the first one - { - add(new Basis(is, params, i != 0)); - } - publicKey = new NTRUSigningPublicKeyParameters(is, params.getSigningParameters()); - } - - public NTRUSigningPrivateKeyParameters(List bases, NTRUSigningPublicKeyParameters publicKey) - { - super(true); - this.bases = new ArrayList(bases); - this.publicKey = publicKey; - } - - /** - * Adds a basis to the key. - * - * @param b a NtruSign basis - */ - private void add(Basis b) - { - bases.add(b); - } - - /** - * Returns the i-th basis - * - * @param i the index - * @return the basis at index i - */ - public Basis getBasis(int i) - { - return bases.get(i); - } - - public NTRUSigningPublicKeyParameters getPublicKey() - { - return publicKey; - } - - /** - * Converts the key to a byte array - * - * @return the encoded key - */ - public byte[] getEncoded() - throws IOException - { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - for (int i = 0; i < bases.size(); i++) - { - // all bases except for the first one contain a public key - bases.get(i).encode(os, i != 0); - } - - os.write(publicKey.getEncoded()); - - return os.toByteArray(); - } - - /** - * Writes the key to an output stream - * - * @param os an output stream - * @throws IOException - */ - public void writeTo(OutputStream os) - throws IOException - { - os.write(getEncoded()); - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((bases == null) ? 0 : bases.hashCode()); - for (Basis basis : bases) - { - result += basis.hashCode(); - } - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - NTRUSigningPrivateKeyParameters other = (NTRUSigningPrivateKeyParameters)obj; - if (bases == null) - { - if (other.bases != null) - { - return false; - } - } - if (bases.size() != other.bases.size()) - { - return false; - } - for (int i = 0; i < bases.size(); i++) - { - Basis basis1 = bases.get(i); - Basis basis2 = other.bases.get(i); - if (!basis1.f.equals(basis2.f)) - { - return false; - } - if (!basis1.fPrime.equals(basis2.fPrime)) - { - return false; - } - if (i != 0 && !basis1.h.equals(basis2.h)) // don't compare h for the 0th basis - { - return false; - } - if (!basis1.params.equals(basis2.params)) - { - return false; - } - } - return true; - } - - /** - * A NtruSign basis. Contains three polynomials f, f', h. - */ - public static class Basis - { - public Polynomial f; - public Polynomial fPrime; - public IntegerPolynomial h; - NTRUSigningKeyGenerationParameters params; - - /** - * Constructs a new basis from polynomials f, f', h. - * - * @param f - * @param fPrime - * @param h - * @param params NtruSign parameters - */ - protected Basis(Polynomial f, Polynomial fPrime, IntegerPolynomial h, NTRUSigningKeyGenerationParameters params) - { - this.f = f; - this.fPrime = fPrime; - this.h = h; - this.params = params; - } - - /** - * Reads a basis from an input stream and constructs a new basis. - * - * @param is an input stream - * @param params NtruSign parameters - * @param include_h whether to read the polynomial h (true) or only f and f' (false) - */ - Basis(InputStream is, NTRUSigningKeyGenerationParameters params, boolean include_h) - throws IOException - { - int N = params.N; - int q = params.q; - int d1 = params.d1; - int d2 = params.d2; - int d3 = params.d3; - boolean sparse = params.sparse; - this.params = params; - - if (params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT) - { - f = ProductFormPolynomial.fromBinary(is, N, d1, d2, d3 + 1, d3); - } - else - { - IntegerPolynomial fInt = IntegerPolynomial.fromBinary3Tight(is, N); - f = sparse ? new SparseTernaryPolynomial(fInt) : new DenseTernaryPolynomial(fInt); - } - - if (params.basisType == NTRUSigningKeyGenerationParameters.BASIS_TYPE_STANDARD) - { - IntegerPolynomial fPrimeInt = IntegerPolynomial.fromBinary(is, N, q); - for (int i = 0; i < fPrimeInt.coeffs.length; i++) - { - fPrimeInt.coeffs[i] -= q / 2; - } - fPrime = fPrimeInt; - } - else if (params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT) - { - fPrime = ProductFormPolynomial.fromBinary(is, N, d1, d2, d3 + 1, d3); - } - else - { - fPrime = IntegerPolynomial.fromBinary3Tight(is, N); - } - - if (include_h) - { - h = IntegerPolynomial.fromBinary(is, N, q); - } - } - - /** - * Writes the basis to an output stream - * - * @param os an output stream - * @param include_h whether to write the polynomial h (true) or only f and f' (false) - * @throws IOException - */ - void encode(OutputStream os, boolean include_h) - throws IOException - { - int q = params.q; - - os.write(getEncoded(f)); - if (params.basisType == NTRUSigningKeyGenerationParameters.BASIS_TYPE_STANDARD) - { - IntegerPolynomial fPrimeInt = fPrime.toIntegerPolynomial(); - for (int i = 0; i < fPrimeInt.coeffs.length; i++) - { - fPrimeInt.coeffs[i] += q / 2; - } - os.write(fPrimeInt.toBinary(q)); - } - else - { - os.write(getEncoded(fPrime)); - } - if (include_h) - { - os.write(h.toBinary(q)); - } - } - - private byte[] getEncoded(Polynomial p) - { - if (p instanceof ProductFormPolynomial) - { - return ((ProductFormPolynomial)p).toBinary(); - } - else - { - return p.toIntegerPolynomial().toBinary3Tight(); - } - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((f == null) ? 0 : f.hashCode()); - result = prime * result + ((fPrime == null) ? 0 : fPrime.hashCode()); - result = prime * result + ((h == null) ? 0 : h.hashCode()); - result = prime * result + ((params == null) ? 0 : params.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof Basis)) - { - return false; - } - Basis other = (Basis)obj; - if (f == null) - { - if (other.f != null) - { - return false; - } - } - else if (!f.equals(other.f)) - { - return false; - } - if (fPrime == null) - { - if (other.fPrime != null) - { - return false; - } - } - else if (!fPrime.equals(other.fPrime)) - { - return false; - } - if (h == null) - { - if (other.h != null) - { - return false; - } - } - else if (!h.equals(other.h)) - { - return false; - } - if (params == null) - { - if (other.params != null) - { - return false; - } - } - else if (!params.equals(other.params)) - { - return false; - } - return true; - } - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPublicKeyParameters.java deleted file mode 100644 index bc34217..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NTRUSigningPublicKeyParameters.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.crypto.params; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.math.ntru.polynomial.IntegerPolynomial; - -/** - * A NtruSign public key is essentially a polynomial named h. - */ -public class NTRUSigningPublicKeyParameters - extends AsymmetricKeyParameter -{ - private NTRUSigningParameters params; - public IntegerPolynomial h; - - /** - * Constructs a new public key from a polynomial - * @param h the polynomial h which determines the key - * @param params the NtruSign parameters to use - */ - public NTRUSigningPublicKeyParameters(IntegerPolynomial h, NTRUSigningParameters params) { - super(false); - this.h = h; - this.params = params; - } - - /** - * Converts a byte array to a polynomial h and constructs a new public key - * @param b an encoded polynomial - * @param params the NtruSign parameters to use - */ - public NTRUSigningPublicKeyParameters(byte[] b, NTRUSigningParameters params) { - super(false); - h = IntegerPolynomial.fromBinary(b, params.N, params.q); - this.params = params; - } - - /** - * Reads a polynomial h from an input stream and constructs a new public key - * @param is an input stream - * @param params the NtruSign parameters to use - */ - public NTRUSigningPublicKeyParameters(InputStream is, NTRUSigningParameters params) throws IOException { - super(false); - h = IntegerPolynomial.fromBinary(is, params.N, params.q); - this.params = params; - } - - - - /** - * Converts the key to a byte array - * @return the encoded key - */ - public byte[] getEncoded() { - return h.toBinary(params.q); - } - - /** - * Writes the key to an output stream - * @param os an output stream - * @throws IOException - */ - public void writeTo(OutputStream os) throws IOException { - os.write(getEncoded()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((h == null) ? 0 : h.hashCode()); - result = prime * result + ((params == null) ? 0 : params.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - NTRUSigningPublicKeyParameters other = (NTRUSigningPublicKeyParameters) obj; - if (h == null) { - if (other.h != null) - return false; - } else if (!h.equals(other.h)) - return false; - if (params == null) { - if (other.params != null) - return false; - } else if (!params.equals(other.params)) - return false; - return true; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyGenerationParameters.java deleted file mode 100644 index 3e304ad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyGenerationParameters.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.crypto.params; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -/** - * Parameters for NaccacheStern public private key generation. For details on - * this cipher, please see - * - * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf - */ -public class NaccacheSternKeyGenerationParameters extends KeyGenerationParameters -{ - - // private BigInteger publicExponent; - private int certainty; - - private int cntSmallPrimes; - - private boolean debug = false; - - /** - * Parameters for generating a NaccacheStern KeyPair. - * - * @param random - * The source of randomness - * @param strength - * The desired strength of the Key in Bits - * @param certainty - * the probability that the generated primes are not really prime - * as integer: 2^(-certainty) is then the probability - * @param cntSmallPrimes - * How many small key factors are desired - */ - public NaccacheSternKeyGenerationParameters(SecureRandom random, int strength, int certainty, int cntSmallPrimes) - { - this(random, strength, certainty, cntSmallPrimes, false); - } - - /** - * Parameters for a NaccacheStern KeyPair. - * - * @param random - * The source of randomness - * @param strength - * The desired strength of the Key in Bits - * @param certainty - * the probability that the generated primes are not really prime - * as integer: 2^(-certainty) is then the probability - * @param cntSmallPrimes - * How many small key factors are desired - * @param debug - * Turn debugging on or off (reveals secret information, use with - * caution) - */ - public NaccacheSternKeyGenerationParameters(SecureRandom random, - int strength, int certainty, int cntSmallPrimes, boolean debug) - { - super(random, strength); - - this.certainty = certainty; - if (cntSmallPrimes % 2 == 1) - { - throw new IllegalArgumentException("cntSmallPrimes must be a multiple of 2"); - } - if (cntSmallPrimes < 30) - { - throw new IllegalArgumentException("cntSmallPrimes must be >= 30 for security reasons"); - } - this.cntSmallPrimes = cntSmallPrimes; - - this.debug = debug; - } - - /** - * @return Returns the certainty. - */ - public int getCertainty() - { - return certainty; - } - - /** - * @return Returns the cntSmallPrimes. - */ - public int getCntSmallPrimes() - { - return cntSmallPrimes; - } - - public boolean isDebug() - { - return debug; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyParameters.java deleted file mode 100644 index d073ed1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternKeyParameters.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -/** - * Public key parameters for NaccacheStern cipher. For details on this cipher, - * please see - * - * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf - */ -public class NaccacheSternKeyParameters extends AsymmetricKeyParameter -{ - - private BigInteger g, n; - - int lowerSigmaBound; - - /** - * @param privateKey - */ - public NaccacheSternKeyParameters(boolean privateKey, BigInteger g, BigInteger n, int lowerSigmaBound) - { - super(privateKey); - this.g = g; - this.n = n; - this.lowerSigmaBound = lowerSigmaBound; - } - - /** - * @return Returns the g. - */ - public BigInteger getG() - { - return g; - } - - /** - * @return Returns the lowerSigmaBound. - */ - public int getLowerSigmaBound() - { - return lowerSigmaBound; - } - - /** - * @return Returns the n. - */ - public BigInteger getModulus() - { - return n; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternPrivateKeyParameters.java deleted file mode 100644 index 3556346..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/NaccacheSternPrivateKeyParameters.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; -import java.util.Vector; - -/** - * Private key parameters for NaccacheStern cipher. For details on this cipher, - * please see - * - * http://www.gemplus.com/smart/rd/publications/pdf/NS98pkcs.pdf - */ -public class NaccacheSternPrivateKeyParameters extends NaccacheSternKeyParameters -{ - private BigInteger phi_n; - private Vector smallPrimes; - - /** - * Constructs a NaccacheSternPrivateKey - * - * @param g - * the public enryption parameter g - * @param n - * the public modulus n = p*q - * @param lowerSigmaBound - * the public lower sigma bound up to which data can be encrypted - * @param smallPrimes - * the small primes, of which sigma is constructed in the right - * order - * @param phi_n - * the private modulus phi(n) = (p-1)(q-1) - */ - public NaccacheSternPrivateKeyParameters(BigInteger g, BigInteger n, - int lowerSigmaBound, Vector smallPrimes, - BigInteger phi_n) - { - super(true, g, n, lowerSigmaBound); - this.smallPrimes = smallPrimes; - this.phi_n = phi_n; - } - - public BigInteger getPhi_n() - { - return phi_n; - } - - public Vector getSmallPrimes() - { - return smallPrimes; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithIV.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithIV.java deleted file mode 100644 index 7cc01c1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithIV.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class ParametersWithIV - implements CipherParameters -{ - private byte[] iv; - private CipherParameters parameters; - - public ParametersWithIV( - CipherParameters parameters, - byte[] iv) - { - this(parameters, iv, 0, iv.length); - } - - public ParametersWithIV( - CipherParameters parameters, - byte[] iv, - int ivOff, - int ivLen) - { - this.iv = new byte[ivLen]; - this.parameters = parameters; - - System.arraycopy(iv, ivOff, this.iv, 0, ivLen); - } - - public byte[] getIV() - { - return iv; - } - - public CipherParameters getParameters() - { - return parameters; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithRandom.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithRandom.java deleted file mode 100644 index c916601..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithRandom.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -import java.security.SecureRandom; - -public class ParametersWithRandom - implements CipherParameters -{ - private SecureRandom random; - private CipherParameters parameters; - - public ParametersWithRandom( - CipherParameters parameters, - SecureRandom random) - { - this.random = random; - this.parameters = parameters; - } - - public ParametersWithRandom( - CipherParameters parameters) - { - this(parameters, new SecureRandom()); - } - - public SecureRandom getRandom() - { - return random; - } - - public CipherParameters getParameters() - { - return parameters; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSBox.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSBox.java deleted file mode 100644 index cb5b205..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSBox.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class ParametersWithSBox - implements CipherParameters -{ - private CipherParameters parameters; - private byte[] sBox; - - public ParametersWithSBox( - CipherParameters parameters, - byte[] sBox) - { - this.parameters = parameters; - this.sBox = sBox; - } - - public byte[] getSBox() - { - return sBox; - } - - public CipherParameters getParameters() - { - return parameters; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSalt.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSalt.java deleted file mode 100644 index 72383c4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/ParametersWithSalt.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -/** - * Cipher parameters with a fixed salt value associated with them. - */ -public class ParametersWithSalt - implements CipherParameters -{ - private byte[] salt; - private CipherParameters parameters; - - public ParametersWithSalt( - CipherParameters parameters, - byte[] salt) - { - this(parameters, salt, 0, salt.length); - } - - public ParametersWithSalt( - CipherParameters parameters, - byte[] salt, - int saltOff, - int saltLen) - { - this.salt = new byte[saltLen]; - this.parameters = parameters; - - System.arraycopy(salt, saltOff, this.salt, 0, saltLen); - } - - public byte[] getSalt() - { - return salt; - } - - public CipherParameters getParameters() - { - return parameters; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC2Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC2Parameters.java deleted file mode 100644 index 3cd203e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC2Parameters.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class RC2Parameters - implements CipherParameters -{ - private byte[] key; - private int bits; - - public RC2Parameters( - byte[] key) - { - this(key, (key.length > 128) ? 1024 : (key.length * 8)); - } - - public RC2Parameters( - byte[] key, - int bits) - { - this.key = new byte[key.length]; - this.bits = bits; - - System.arraycopy(key, 0, this.key, 0, key.length); - } - - public byte[] getKey() - { - return key; - } - - public int getEffectiveKeyBits() - { - return bits; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC5Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC5Parameters.java deleted file mode 100644 index 108124a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RC5Parameters.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -public class RC5Parameters - implements CipherParameters -{ - private byte[] key; - private int rounds; - - public RC5Parameters( - byte[] key, - int rounds) - { - if (key.length > 255) - { - throw new IllegalArgumentException("RC5 key length can be no greater than 255"); - } - - this.key = new byte[key.length]; - this.rounds = rounds; - - System.arraycopy(key, 0, this.key, 0, key.length); - } - - public byte[] getKey() - { - return key; - } - - public int getRounds() - { - return rounds; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSABlindingParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSABlindingParameters.java deleted file mode 100644 index 5f9dd44..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSABlindingParameters.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.bc.crypto.params; - -import org.bc.crypto.CipherParameters; - -import java.math.BigInteger; - -public class RSABlindingParameters - implements CipherParameters -{ - private RSAKeyParameters publicKey; - private BigInteger blindingFactor; - - public RSABlindingParameters( - RSAKeyParameters publicKey, - BigInteger blindingFactor) - { - if (publicKey instanceof RSAPrivateCrtKeyParameters) - { - throw new IllegalArgumentException("RSA parameters should be for a public key"); - } - - this.publicKey = publicKey; - this.blindingFactor = blindingFactor; - } - - public RSAKeyParameters getPublicKey() - { - return publicKey; - } - - public BigInteger getBlindingFactor() - { - return blindingFactor; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyGenerationParameters.java deleted file mode 100644 index f58156c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyGenerationParameters.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class RSAKeyGenerationParameters - extends KeyGenerationParameters -{ - private BigInteger publicExponent; - private int certainty; - - public RSAKeyGenerationParameters( - BigInteger publicExponent, - SecureRandom random, - int strength, - int certainty) - { - super(random, strength); - - if (strength < 12) - { - throw new IllegalArgumentException("key strength too small"); - } - - // - // public exponent cannot be even - // - if (!publicExponent.testBit(0)) - { - throw new IllegalArgumentException("public exponent cannot be even"); - } - - this.publicExponent = publicExponent; - this.certainty = certainty; - } - - public BigInteger getPublicExponent() - { - return publicExponent; - } - - public int getCertainty() - { - return certainty; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyParameters.java deleted file mode 100644 index 79f6de6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAKeyParameters.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class RSAKeyParameters - extends AsymmetricKeyParameter -{ - private BigInteger modulus; - private BigInteger exponent; - - public RSAKeyParameters( - boolean isPrivate, - BigInteger modulus, - BigInteger exponent) - { - super(isPrivate); - - this.modulus = modulus; - this.exponent = exponent; - } - - public BigInteger getModulus() - { - return modulus; - } - - public BigInteger getExponent() - { - return exponent; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAPrivateCrtKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAPrivateCrtKeyParameters.java deleted file mode 100644 index fad5860..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/params/RSAPrivateCrtKeyParameters.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.bc.crypto.params; - -import java.math.BigInteger; - -public class RSAPrivateCrtKeyParameters - extends RSAKeyParameters -{ - private BigInteger e; - private BigInteger p; - private BigInteger q; - private BigInteger dP; - private BigInteger dQ; - private BigInteger qInv; - - /** - * - */ - public RSAPrivateCrtKeyParameters( - BigInteger modulus, - BigInteger publicExponent, - BigInteger privateExponent, - BigInteger p, - BigInteger q, - BigInteger dP, - BigInteger dQ, - BigInteger qInv) - { - super(true, modulus, privateExponent); - - this.e = publicExponent; - this.p = p; - this.q = q; - this.dP = dP; - this.dQ = dQ; - this.qInv = qInv; - } - - public BigInteger getPublicExponent() - { - return e; - } - - public BigInteger getP() - { - return p; - } - - public BigInteger getQ() - { - return q; - } - - public BigInteger getDP() - { - return dP; - } - - public BigInteger getDQ() - { - return dQ; - } - - public BigInteger getQInv() - { - return qInv; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/DHIESPublicKeyParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/DHIESPublicKeyParser.java deleted file mode 100644 index b476179..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/DHIESPublicKeyParser.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.bc.crypto.parsers; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; - -import org.bc.crypto.KeyParser; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPublicKeyParameters; - -public class DHIESPublicKeyParser - implements KeyParser -{ - private DHParameters dhParams; - - public DHIESPublicKeyParser(DHParameters dhParams) - { - this.dhParams = dhParams; - } - - public AsymmetricKeyParameter readKey(InputStream stream) - throws IOException - { - byte[] V = new byte[(dhParams.getP().bitLength() + 7) / 8]; - - stream.read(V, 0, V.length); - - return new DHPublicKeyParameters(new BigInteger(1, V), dhParams); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/ECIESPublicKeyParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/ECIESPublicKeyParser.java deleted file mode 100644 index 6154ced..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/parsers/ECIESPublicKeyParser.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bc.crypto.parsers; - -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.KeyParser; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPublicKeyParameters; - -public class ECIESPublicKeyParser - implements KeyParser -{ - private ECDomainParameters ecParams; - - public ECIESPublicKeyParser(ECDomainParameters ecParams) - { - this.ecParams = ecParams; - } - - public AsymmetricKeyParameter readKey(InputStream stream) - throws IOException - { - byte[] V; - int first = stream.read(); - - // Decode the public ephemeral key - switch (first) - { - case 0x00: // infinity - throw new IOException("Sender's public key invalid."); - - case 0x02: // compressed - case 0x03: // Byte length calculated as in ECPoint.getEncoded(); - V = new byte[1 + (ecParams.getCurve().getFieldSize()+7)/8]; - break; - - case 0x04: // uncompressed or - case 0x06: // hybrid - case 0x07: // Byte length calculated as in ECPoint.getEncoded(); - V = new byte[1 + 2*((ecParams.getCurve().getFieldSize()+7)/8)]; - break; - - default: - throw new IOException("Sender's public key has invalid point encoding 0x" + Integer.toString(first, 16)); - } - - V[0] = (byte)first; - stream.read(V, 1, V.length - 1); - - return new ECPublicKeyParameters(ecParams.getCurve().decodePoint(V), ecParams); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/DigestRandomGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/DigestRandomGenerator.java deleted file mode 100644 index c04ccfa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/DigestRandomGenerator.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.crypto.prng; - -import org.bc.crypto.Digest; - -/** - * Random generation based on the digest with counter. Calling addSeedMaterial will - * always increase the entropy of the hash. - *

    - * Internal access to the digest is synchronized so a single one of these can be shared. - *

    - */ -public class DigestRandomGenerator - implements RandomGenerator -{ - private static long CYCLE_COUNT = 10; - - private long stateCounter; - private long seedCounter; - private Digest digest; - private byte[] state; - private byte[] seed; - - // public constructors - public DigestRandomGenerator( - Digest digest) - { - this.digest = digest; - - this.seed = new byte[digest.getDigestSize()]; - this.seedCounter = 1; - - this.state = new byte[digest.getDigestSize()]; - this.stateCounter = 1; - } - - public void addSeedMaterial(byte[] inSeed) - { - synchronized (this) - { - digestUpdate(inSeed); - digestUpdate(seed); - digestDoFinal(seed); - } - } - - public void addSeedMaterial(long rSeed) - { - synchronized (this) - { - digestAddCounter(rSeed); - digestUpdate(seed); - - digestDoFinal(seed); - } - } - - public void nextBytes(byte[] bytes) - { - nextBytes(bytes, 0, bytes.length); - } - - public void nextBytes(byte[] bytes, int start, int len) - { - synchronized (this) - { - int stateOff = 0; - - generateState(); - - int end = start + len; - for (int i = start; i != end; i++) - { - if (stateOff == state.length) - { - generateState(); - stateOff = 0; - } - bytes[i] = state[stateOff++]; - } - } - } - - private void cycleSeed() - { - digestUpdate(seed); - digestAddCounter(seedCounter++); - - digestDoFinal(seed); - } - - private void generateState() - { - digestAddCounter(stateCounter++); - digestUpdate(state); - digestUpdate(seed); - - digestDoFinal(state); - - if ((stateCounter % CYCLE_COUNT) == 0) - { - cycleSeed(); - } - } - - private void digestAddCounter(long seed) - { - for (int i = 0; i != 8; i++) - { - digest.update((byte)seed); - seed >>>= 8; - } - } - - private void digestUpdate(byte[] inSeed) - { - digest.update(inSeed, 0, inSeed.length); - } - - private void digestDoFinal(byte[] result) - { - digest.doFinal(result, 0); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/RandomGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/RandomGenerator.java deleted file mode 100644 index 9fc912e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/RandomGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.bc.crypto.prng; - -/** - * Generic interface for objects generating random bytes. - */ -public interface RandomGenerator -{ - /** - * Add more seed material to the generator. - * - * @param seed a byte array to be mixed into the generator's state. - */ - void addSeedMaterial(byte[] seed); - - /** - * Add more seed material to the generator. - * - * @param seed a long value to be mixed into the generator's state. - */ - void addSeedMaterial(long seed); - - /** - * Fill bytes with random values. - * - * @param bytes byte array to be filled. - */ - void nextBytes(byte[] bytes); - - /** - * Fill part of bytes with random values. - * - * @param bytes byte array to be filled. - * @param start index to start filling at. - * @param len length of segment to fill. - */ - void nextBytes(byte[] bytes, int start, int len); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ReversedWindowGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ReversedWindowGenerator.java deleted file mode 100644 index 9810d76..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ReversedWindowGenerator.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.crypto.prng; - -/** - * Takes bytes generated by an underling RandomGenerator and reverses the order in - * each small window (of configurable size). - *

    - * Access to internals is synchronized so a single one of these can be shared. - *

    - */ -public class ReversedWindowGenerator - implements RandomGenerator -{ - private final RandomGenerator generator; - - private byte[] window; - private int windowCount; - - public ReversedWindowGenerator( - RandomGenerator generator, - int windowSize) - { - if (generator == null) - { - throw new IllegalArgumentException("generator cannot be null"); - } - if (windowSize < 2) - { - throw new IllegalArgumentException("windowSize must be at least 2"); - } - - this.generator = generator; - this.window = new byte[windowSize]; - } - - /** - * Add more seed material to the generator. - * - * @param seed a byte array to be mixed into the generator's state. - */ - public void addSeedMaterial( - byte[] seed) - { - synchronized (this) - { - windowCount = 0; - generator.addSeedMaterial(seed); - } - } - - /** - * Add more seed material to the generator. - * - * @param seed a long value to be mixed into the generator's state. - */ - public void addSeedMaterial( - long seed) - { - synchronized (this) - { - windowCount = 0; - generator.addSeedMaterial(seed); - } - } - - /** - * Fill bytes with random values. - * - * @param bytes byte array to be filled. - */ - public void nextBytes( - byte[] bytes) - { - doNextBytes(bytes, 0, bytes.length); - } - - /** - * Fill part of bytes with random values. - * - * @param bytes byte array to be filled. - * @param start index to start filling at. - * @param len length of segment to fill. - */ - public void nextBytes( - byte[] bytes, - int start, - int len) - { - doNextBytes(bytes, start, len); - } - - private void doNextBytes( - byte[] bytes, - int start, - int len) - { - synchronized (this) - { - int done = 0; - while (done < len) - { - if (windowCount < 1) - { - generator.nextBytes(window, 0, window.length); - windowCount = window.length; - } - - bytes[start + done++] = window[--windowCount]; - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ThreadedSeedGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ThreadedSeedGenerator.java deleted file mode 100644 index 81317aa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/ThreadedSeedGenerator.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.bc.crypto.prng; - -/** - * A thread based seed generator - one source of randomness. - *

    - * Based on an idea from Marcus Lippert. - *

    - */ -public class ThreadedSeedGenerator -{ - private class SeedGenerator - implements Runnable - { - private volatile int counter = 0; - private volatile boolean stop = false; - - public void run() - { - while (!this.stop) - { - this.counter++; - } - - } - - public byte[] generateSeed( - int numbytes, - boolean fast) - { - Thread t = new Thread(this); - byte[] result = new byte[numbytes]; - this.counter = 0; - this.stop = false; - int last = 0; - int end; - - t.start(); - if(fast) - { - end = numbytes; - } - else - { - end = numbytes * 8; - } - for (int i = 0; i < end; i++) - { - while (this.counter == last) - { - try - { - Thread.sleep(1); - } - catch (InterruptedException e) - { - // ignore - } - } - last = this.counter; - if (fast) - { - result[i] = (byte) (last & 0xff); - } - else - { - int bytepos = i/8; - result[bytepos] = (byte) ((result[bytepos] << 1) | (last & 1)); - } - - } - stop = true; - return result; - } - } - - /** - * Generate seed bytes. Set fast to false for best quality. - *

    - * If fast is set to true, the code should be round about 8 times faster when - * generating a long sequence of random bytes. 20 bytes of random values using - * the fast mode take less than half a second on a Nokia e70. If fast is set to false, - * it takes round about 2500 ms. - *

    - * @param numBytes the number of bytes to generate - * @param fast true if fast mode should be used - */ - public byte[] generateSeed( - int numBytes, - boolean fast) - { - SeedGenerator gen = new SeedGenerator(); - - return gen.generateSeed(numBytes, fast); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/VMPCRandomGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/VMPCRandomGenerator.java deleted file mode 100644 index 447c106..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/prng/VMPCRandomGenerator.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.crypto.prng; - -public class VMPCRandomGenerator implements RandomGenerator -{ - private byte n = 0; - - /** - * Permutation generated by code: - * // First 1850 fractional digit of Pi number. - * byte[] key = new BigInteger("14159265358979323846...5068006422512520511").toByteArray(); - * s = 0; - * P = new byte[256]; - * for (int i = 0; i < 256; i++) { - * P[i] = (byte) i; - * } - * for (int m = 0; m < 768; m++) { - * s = P[(s + P[m & 0xff] + key[m % key.length]) & 0xff]; - * byte temp = P[m & 0xff]; - * P[m & 0xff] = P[s & 0xff]; - * P[s & 0xff] = temp; - * } - */ - private byte[] P = - { - (byte) 0xbb, (byte) 0x2c, (byte) 0x62, (byte) 0x7f, - (byte) 0xb5, (byte) 0xaa, (byte) 0xd4, (byte) 0x0d, (byte) 0x81, - (byte) 0xfe, (byte) 0xb2, (byte) 0x82, (byte) 0xcb, (byte) 0xa0, - (byte) 0xa1, (byte) 0x08, (byte) 0x18, (byte) 0x71, (byte) 0x56, - (byte) 0xe8, (byte) 0x49, (byte) 0x02, (byte) 0x10, (byte) 0xc4, - (byte) 0xde, (byte) 0x35, (byte) 0xa5, (byte) 0xec, (byte) 0x80, - (byte) 0x12, (byte) 0xb8, (byte) 0x69, (byte) 0xda, (byte) 0x2f, - (byte) 0x75, (byte) 0xcc, (byte) 0xa2, (byte) 0x09, (byte) 0x36, - (byte) 0x03, (byte) 0x61, (byte) 0x2d, (byte) 0xfd, (byte) 0xe0, - (byte) 0xdd, (byte) 0x05, (byte) 0x43, (byte) 0x90, (byte) 0xad, - (byte) 0xc8, (byte) 0xe1, (byte) 0xaf, (byte) 0x57, (byte) 0x9b, - (byte) 0x4c, (byte) 0xd8, (byte) 0x51, (byte) 0xae, (byte) 0x50, - (byte) 0x85, (byte) 0x3c, (byte) 0x0a, (byte) 0xe4, (byte) 0xf3, - (byte) 0x9c, (byte) 0x26, (byte) 0x23, (byte) 0x53, (byte) 0xc9, - (byte) 0x83, (byte) 0x97, (byte) 0x46, (byte) 0xb1, (byte) 0x99, - (byte) 0x64, (byte) 0x31, (byte) 0x77, (byte) 0xd5, (byte) 0x1d, - (byte) 0xd6, (byte) 0x78, (byte) 0xbd, (byte) 0x5e, (byte) 0xb0, - (byte) 0x8a, (byte) 0x22, (byte) 0x38, (byte) 0xf8, (byte) 0x68, - (byte) 0x2b, (byte) 0x2a, (byte) 0xc5, (byte) 0xd3, (byte) 0xf7, - (byte) 0xbc, (byte) 0x6f, (byte) 0xdf, (byte) 0x04, (byte) 0xe5, - (byte) 0x95, (byte) 0x3e, (byte) 0x25, (byte) 0x86, (byte) 0xa6, - (byte) 0x0b, (byte) 0x8f, (byte) 0xf1, (byte) 0x24, (byte) 0x0e, - (byte) 0xd7, (byte) 0x40, (byte) 0xb3, (byte) 0xcf, (byte) 0x7e, - (byte) 0x06, (byte) 0x15, (byte) 0x9a, (byte) 0x4d, (byte) 0x1c, - (byte) 0xa3, (byte) 0xdb, (byte) 0x32, (byte) 0x92, (byte) 0x58, - (byte) 0x11, (byte) 0x27, (byte) 0xf4, (byte) 0x59, (byte) 0xd0, - (byte) 0x4e, (byte) 0x6a, (byte) 0x17, (byte) 0x5b, (byte) 0xac, - (byte) 0xff, (byte) 0x07, (byte) 0xc0, (byte) 0x65, (byte) 0x79, - (byte) 0xfc, (byte) 0xc7, (byte) 0xcd, (byte) 0x76, (byte) 0x42, - (byte) 0x5d, (byte) 0xe7, (byte) 0x3a, (byte) 0x34, (byte) 0x7a, - (byte) 0x30, (byte) 0x28, (byte) 0x0f, (byte) 0x73, (byte) 0x01, - (byte) 0xf9, (byte) 0xd1, (byte) 0xd2, (byte) 0x19, (byte) 0xe9, - (byte) 0x91, (byte) 0xb9, (byte) 0x5a, (byte) 0xed, (byte) 0x41, - (byte) 0x6d, (byte) 0xb4, (byte) 0xc3, (byte) 0x9e, (byte) 0xbf, - (byte) 0x63, (byte) 0xfa, (byte) 0x1f, (byte) 0x33, (byte) 0x60, - (byte) 0x47, (byte) 0x89, (byte) 0xf0, (byte) 0x96, (byte) 0x1a, - (byte) 0x5f, (byte) 0x93, (byte) 0x3d, (byte) 0x37, (byte) 0x4b, - (byte) 0xd9, (byte) 0xa8, (byte) 0xc1, (byte) 0x1b, (byte) 0xf6, - (byte) 0x39, (byte) 0x8b, (byte) 0xb7, (byte) 0x0c, (byte) 0x20, - (byte) 0xce, (byte) 0x88, (byte) 0x6e, (byte) 0xb6, (byte) 0x74, - (byte) 0x8e, (byte) 0x8d, (byte) 0x16, (byte) 0x29, (byte) 0xf2, - (byte) 0x87, (byte) 0xf5, (byte) 0xeb, (byte) 0x70, (byte) 0xe3, - (byte) 0xfb, (byte) 0x55, (byte) 0x9f, (byte) 0xc6, (byte) 0x44, - (byte) 0x4a, (byte) 0x45, (byte) 0x7d, (byte) 0xe2, (byte) 0x6b, - (byte) 0x5c, (byte) 0x6c, (byte) 0x66, (byte) 0xa9, (byte) 0x8c, - (byte) 0xee, (byte) 0x84, (byte) 0x13, (byte) 0xa7, (byte) 0x1e, - (byte) 0x9d, (byte) 0xdc, (byte) 0x67, (byte) 0x48, (byte) 0xba, - (byte) 0x2e, (byte) 0xe6, (byte) 0xa4, (byte) 0xab, (byte) 0x7c, - (byte) 0x94, (byte) 0x00, (byte) 0x21, (byte) 0xef, (byte) 0xea, - (byte) 0xbe, (byte) 0xca, (byte) 0x72, (byte) 0x4f, (byte) 0x52, - (byte) 0x98, (byte) 0x3f, (byte) 0xc2, (byte) 0x14, (byte) 0x7b, - (byte) 0x3b, (byte) 0x54 }; - - /** - * Value generated in the same way as {@link VMPCRandomGenerator#P}; - */ - private byte s = (byte) 0xbe; - - public VMPCRandomGenerator() - { - } - - public void addSeedMaterial(byte[] seed) - { - for (int m = 0; m < seed.length; m++) - { - s = P[(s + P[n & 0xff] + seed[m]) & 0xff]; - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - } - } - - public void addSeedMaterial(long seed) - { - byte[] s = new byte[4]; - s[3] = (byte) (seed & 0x000000ff); - s[2] = (byte) ((seed & 0x0000ff00) >> 8); - s[1] = (byte) ((seed & 0x00ff0000) >> 16); - s[0] = (byte) ((seed & 0xff000000) >> 24); - addSeedMaterial(s); - } - - public void nextBytes(byte[] bytes) - { - nextBytes(bytes, 0, bytes.length); - } - - public void nextBytes(byte[] bytes, int start, int len) - { - synchronized (P) - { - int end = start + len; - for (int i = start; i != end; i++) - { - s = P[(s + P[n & 0xff]) & 0xff]; - bytes[i] = P[(P[(P[s & 0xff]) & 0xff] + 1) & 0xff]; - byte temp = P[n & 0xff]; - P[n & 0xff] = P[s & 0xff]; - P[s & 0xff] = temp; - n = (byte) ((n + 1) & 0xff); - } - } - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSADigestSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSADigestSigner.java deleted file mode 100644 index 34fc43d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSADigestSigner.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.bc.crypto.signers; - -import java.io.IOException; -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERInteger; -import org.bc.asn1.DERSequence; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.Digest; -import org.bc.crypto.Signer; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; - -public class DSADigestSigner - implements Signer -{ - private final Digest digest; - private final DSA dsaSigner; - private boolean forSigning; - - public DSADigestSigner( - DSA signer, - Digest digest) - { - this.digest = digest; - this.dsaSigner = signer; - } - - public void init( - boolean forSigning, - CipherParameters parameters) - { - this.forSigning = forSigning; - - AsymmetricKeyParameter k; - - if (parameters instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)parameters; - } - - if (forSigning && !k.isPrivate()) - { - throw new IllegalArgumentException("Signing Requires Private Key."); - } - - if (!forSigning && k.isPrivate()) - { - throw new IllegalArgumentException("Verification Requires Public Key."); - } - - reset(); - - dsaSigner.init(forSigning, parameters); - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte input) - { - digest.update(input); - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] input, - int inOff, - int length) - { - digest.update(input, inOff, length); - } - - /** - * Generate a signature for the message we've been loaded with using - * the key we were initialised with. - */ - public byte[] generateSignature() - { - if (!forSigning) - { - throw new IllegalStateException("DSADigestSigner not initialised for signature generation."); - } - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - BigInteger[] sig = dsaSigner.generateSignature(hash); - - try - { - return derEncode(sig[0], sig[1]); - } - catch (IOException e) - { - throw new IllegalStateException("unable to encode signature"); - } - } - - public boolean verifySignature( - byte[] signature) - { - if (forSigning) - { - throw new IllegalStateException("DSADigestSigner not initialised for verification"); - } - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - try - { - BigInteger[] sig = derDecode(signature); - return dsaSigner.verifySignature(hash, sig[0], sig[1]); - } - catch (IOException e) - { - return false; - } - } - - public void reset() - { - digest.reset(); - } - - private byte[] derEncode( - BigInteger r, - BigInteger s) - throws IOException - { - ASN1EncodableVector v = new ASN1EncodableVector(); - v.add(new DERInteger(r)); - v.add(new DERInteger(s)); - - return new DERSequence(v).getEncoded(ASN1Encoding.DER); - } - - private BigInteger[] derDecode( - byte[] encoding) - throws IOException - { - ASN1Sequence s = (ASN1Sequence)ASN1Primitive.fromByteArray(encoding); - - return new BigInteger[] - { - ((DERInteger)s.getObjectAt(0)).getValue(), - ((DERInteger)s.getObjectAt(1)).getValue() - }; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSASigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSASigner.java deleted file mode 100644 index c23093b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSASigner.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.crypto.signers; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.params.DSAKeyParameters; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAPrivateKeyParameters; -import org.bc.crypto.params.DSAPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * The Digital Signature Algorithm - as described in "Handbook of Applied - * Cryptography", pages 452 - 453. - */ -public class DSASigner - implements DSA -{ - DSAKeyParameters key; - - SecureRandom random; - - public void init( - boolean forSigning, - CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (DSAPrivateKeyParameters)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.key = (DSAPrivateKeyParameters)param; - } - } - else - { - this.key = (DSAPublicKeyParameters)param; - } - } - - /** - * generate a signature for the given message using the key we were - * initialised with. For conventional DSA the message should be a SHA-1 - * hash of the message of interest. - * - * @param message the message that will be verified later. - */ - public BigInteger[] generateSignature( - byte[] message) - { - DSAParameters params = key.getParameters(); - BigInteger m = calculateE(params.getQ(), message); - BigInteger k; - int qBitLength = params.getQ().bitLength(); - - do - { - k = new BigInteger(qBitLength, random); - } - while (k.compareTo(params.getQ()) >= 0); - - BigInteger r = params.getG().modPow(k, params.getP()).mod(params.getQ()); - - k = k.modInverse(params.getQ()).multiply( - m.add(((DSAPrivateKeyParameters)key).getX().multiply(r))); - - BigInteger s = k.mod(params.getQ()); - - BigInteger[] res = new BigInteger[2]; - - res[0] = r; - res[1] = s; - - return res; - } - - /** - * return true if the value r and s represent a DSA signature for - * the passed in message for standard DSA the message should be a - * SHA-1 hash of the real message to be verified. - */ - public boolean verifySignature( - byte[] message, - BigInteger r, - BigInteger s) - { - DSAParameters params = key.getParameters(); - BigInteger m = calculateE(params.getQ(), message); - BigInteger zero = BigInteger.valueOf(0); - - if (zero.compareTo(r) >= 0 || params.getQ().compareTo(r) <= 0) - { - return false; - } - - if (zero.compareTo(s) >= 0 || params.getQ().compareTo(s) <= 0) - { - return false; - } - - BigInteger w = s.modInverse(params.getQ()); - - BigInteger u1 = m.multiply(w).mod(params.getQ()); - BigInteger u2 = r.multiply(w).mod(params.getQ()); - - u1 = params.getG().modPow(u1, params.getP()); - u2 = ((DSAPublicKeyParameters)key).getY().modPow(u2, params.getP()); - - BigInteger v = u1.multiply(u2).mod(params.getP()).mod(params.getQ()); - - return v.equals(r); - } - - private BigInteger calculateE(BigInteger n, byte[] message) - { - if (n.bitLength() >= message.length * 8) - { - return new BigInteger(1, message); - } - else - { - byte[] trunc = new byte[n.bitLength() / 8]; - - System.arraycopy(message, 0, trunc, 0, trunc.length); - - return new BigInteger(1, trunc); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSTU4145Signer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSTU4145Signer.java deleted file mode 100644 index b709779..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/DSTU4145Signer.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.bc.crypto.signers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.params.ECKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.math.ec.ECAlgorithms; -import org.bc.math.ec.ECCurve; -import org.bc.math.ec.ECFieldElement; -import org.bc.math.ec.ECPoint; -import org.bc.util.Arrays; - -/** - * DSTU 4145-2002 - *

    - * National Ukrainian standard of digital signature based on elliptic curves (DSTU 4145-2002). - *

    - */ -public class DSTU4145Signer - implements DSA -{ - private static final BigInteger ONE = BigInteger.valueOf(1); - - private ECKeyParameters key; - private SecureRandom random; - - public void init(boolean forSigning, CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - param = rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - } - - this.key = (ECPrivateKeyParameters)param; - } - else - { - this.key = (ECPublicKeyParameters)param; - } - - } - - public BigInteger[] generateSignature(byte[] message) - { - ECFieldElement h = hash2FieldElement(key.getParameters().getCurve(), message); - if (h.toBigInteger().signum() == 0) - { - h = key.getParameters().getCurve().fromBigInteger(ONE); - } - - BigInteger e, r, s; - ECFieldElement Fe, y; - - do - { - do - { - do - { - e = generateRandomInteger(key.getParameters().getN(), random); - Fe = key.getParameters().getG().multiply(e).getX(); - } - while (Fe.toBigInteger().signum() == 0); - - y = h.multiply(Fe); - r = fieldElement2Integer(key.getParameters().getN(), y); - } - while (r.signum() == 0); - - s = r.multiply(((ECPrivateKeyParameters)key).getD()).add(e).mod(key.getParameters().getN()); - } - while (s.signum() == 0); - - return new BigInteger[]{r, s}; - } - - public boolean verifySignature(byte[] message, BigInteger r, BigInteger s) - { - if (r.signum() == 0 || s.signum() == 0) - { - return false; - } - if (r.compareTo(key.getParameters().getN()) >= 0 || s.compareTo(key.getParameters().getN()) >= 0) - { - return false; - } - - ECFieldElement h = hash2FieldElement(key.getParameters().getCurve(), message); - if (h.toBigInteger().signum() == 0) - { - h = key.getParameters().getCurve().fromBigInteger(ONE); - } - - ECPoint R = ECAlgorithms.sumOfTwoMultiplies(key.getParameters().getG(), s, ((ECPublicKeyParameters)key).getQ(), r); - ECFieldElement y = h.multiply(R.getX()); - return fieldElement2Integer(key.getParameters().getN(), y).compareTo(r) == 0; - } - - /** - * Generates random integer such, than its bit length is less than that of n - */ - private static BigInteger generateRandomInteger(BigInteger n, SecureRandom random) - { - return new BigInteger(n.bitLength() - 1, random); - } - - private static void reverseBytes(byte[] bytes) - { - byte tmp; - - for (int i=0; i= curve.getFieldSize()) - { - num = num.clearBit(num.bitLength() - 1); - } - - return curve.fromBigInteger(num); - } - - private static BigInteger fieldElement2Integer(BigInteger n, ECFieldElement fieldElement) - { - BigInteger num = fieldElement.toBigInteger(); - while (num.bitLength() >= n.bitLength()) - { - num = num.clearBit(num.bitLength() - 1); - } - - return num; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECDSASigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECDSASigner.java deleted file mode 100644 index 318a505..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECDSASigner.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.bc.crypto.signers; - -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.params.ECKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.math.ec.ECAlgorithms; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECPoint; - -/** - * EC-DSA as described in X9.62 - */ -public class ECDSASigner - implements ECConstants, DSA -{ - ECKeyParameters key; - - SecureRandom random; - - public void init( - boolean forSigning, - CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (ECPrivateKeyParameters)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.key = (ECPrivateKeyParameters)param; - } - } - else - { - this.key = (ECPublicKeyParameters)param; - } - } - - // 5.3 pg 28 - /** - * generate a signature for the given message using the key we were - * initialised with. For conventional DSA the message should be a SHA-1 - * hash of the message of interest. - * - * @param message the message that will be verified later. - */ - public BigInteger[] generateSignature( - byte[] message) - { - BigInteger n = key.getParameters().getN(); - BigInteger e = calculateE(n, message); - BigInteger r = null; - BigInteger s = null; - - // 5.3.2 - do // generate s - { - BigInteger k = null; - int nBitLength = n.bitLength(); - - do // generate r - { - do - { - k = new BigInteger(nBitLength, random); - } - while (k.equals(ZERO) || k.compareTo(n) >= 0); - - ECPoint p = key.getParameters().getG().multiply(k); - - // 5.3.3 - BigInteger x = p.getX().toBigInteger(); - - r = x.mod(n); - } - while (r.equals(ZERO)); - - BigInteger d = ((ECPrivateKeyParameters)key).getD(); - - s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n); - } - while (s.equals(ZERO)); - - BigInteger[] res = new BigInteger[2]; - - res[0] = r; - res[1] = s; - - return res; - } - - // 5.4 pg 29 - /** - * return true if the value r and s represent a DSA signature for - * the passed in message (for standard DSA the message should be - * a SHA-1 hash of the real message to be verified). - */ - public boolean verifySignature( - byte[] message, - BigInteger r, - BigInteger s) - { - BigInteger n = key.getParameters().getN(); - BigInteger e = calculateE(n, message); - - // r in the range [1,n-1] - if (r.compareTo(ONE) < 0 || r.compareTo(n) >= 0) - { - return false; - } - - // s in the range [1,n-1] - if (s.compareTo(ONE) < 0 || s.compareTo(n) >= 0) - { - return false; - } - - BigInteger c = s.modInverse(n); - - BigInteger u1 = e.multiply(c).mod(n); - BigInteger u2 = r.multiply(c).mod(n); - - ECPoint G = key.getParameters().getG(); - ECPoint Q = ((ECPublicKeyParameters)key).getQ(); - - ECPoint point = ECAlgorithms.sumOfTwoMultiplies(G, u1, Q, u2); - - BigInteger v = point.getX().toBigInteger().mod(n); - - return v.equals(r); - } - - private BigInteger calculateE(BigInteger n, byte[] message) - { - int log2n = n.bitLength(); - int messageBitLength = message.length * 8; - - if (log2n >= messageBitLength) - { - return new BigInteger(1, message); - } - else - { - BigInteger trunc = new BigInteger(1, message); - - trunc = trunc.shiftRight(messageBitLength - log2n); - - return trunc; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECGOST3410Signer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECGOST3410Signer.java deleted file mode 100644 index 4ecd41f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECGOST3410Signer.java +++ /dev/null @@ -1,152 +0,0 @@ -package org.bc.crypto.signers; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.params.ECKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.math.ec.ECAlgorithms; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECPoint; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * GOST R 34.10-2001 Signature Algorithm - */ -public class ECGOST3410Signer - implements DSA -{ - ECKeyParameters key; - - SecureRandom random; - - public void init( - boolean forSigning, - CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (ECPrivateKeyParameters)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.key = (ECPrivateKeyParameters)param; - } - } - else - { - this.key = (ECPublicKeyParameters)param; - } - } - - /** - * generate a signature for the given message using the key we were - * initialised with. For conventional GOST3410 the message should be a GOST3411 - * hash of the message of interest. - * - * @param message the message that will be verified later. - */ - public BigInteger[] generateSignature( - byte[] message) - { - byte[] mRev = new byte[message.length]; // conversion is little-endian - for (int i = 0; i != mRev.length; i++) - { - mRev[i] = message[mRev.length - 1 - i]; - } - - BigInteger e = new BigInteger(1, mRev); - BigInteger n = key.getParameters().getN(); - - BigInteger r = null; - BigInteger s = null; - - do // generate s - { - BigInteger k = null; - - do // generate r - { - do - { - k = new BigInteger(n.bitLength(), random); - } - while (k.equals(ECConstants.ZERO)); - - ECPoint p = key.getParameters().getG().multiply(k); - - BigInteger x = p.getX().toBigInteger(); - - r = x.mod(n); - } - while (r.equals(ECConstants.ZERO)); - - BigInteger d = ((ECPrivateKeyParameters)key).getD(); - - s = (k.multiply(e)).add(d.multiply(r)).mod(n); - } - while (s.equals(ECConstants.ZERO)); - - BigInteger[] res = new BigInteger[2]; - - res[0] = r; - res[1] = s; - - return res; - } - - /** - * return true if the value r and s represent a GOST3410 signature for - * the passed in message (for standard GOST3410 the message should be - * a GOST3411 hash of the real message to be verified). - */ - public boolean verifySignature( - byte[] message, - BigInteger r, - BigInteger s) - { - byte[] mRev = new byte[message.length]; // conversion is little-endian - for (int i = 0; i != mRev.length; i++) - { - mRev[i] = message[mRev.length - 1 - i]; - } - - BigInteger e = new BigInteger(1, mRev); - BigInteger n = key.getParameters().getN(); - - // r in the range [1,n-1] - if (r.compareTo(ECConstants.ONE) < 0 || r.compareTo(n) >= 0) - { - return false; - } - - // s in the range [1,n-1] - if (s.compareTo(ECConstants.ONE) < 0 || s.compareTo(n) >= 0) - { - return false; - } - - BigInteger v = e.modInverse(n); - - BigInteger z1 = s.multiply(v).mod(n); - BigInteger z2 = (n.subtract(r)).multiply(v).mod(n); - - ECPoint G = key.getParameters().getG(); // P - ECPoint Q = ((ECPublicKeyParameters)key).getQ(); - - ECPoint point = ECAlgorithms.sumOfTwoMultiplies(G, z1, Q, z2); - - BigInteger R = point.getX().toBigInteger().mod(n); - - return R.equals(r); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECNRSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECNRSigner.java deleted file mode 100644 index 324ee6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ECNRSigner.java +++ /dev/null @@ -1,182 +0,0 @@ -package org.bc.crypto.signers; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.generators.ECKeyPairGenerator; -import org.bc.crypto.params.ECKeyGenerationParameters; -import org.bc.crypto.params.ECKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.math.ec.ECAlgorithms; -import org.bc.math.ec.ECConstants; -import org.bc.math.ec.ECPoint; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * EC-NR as described in IEEE 1363-2000 - */ -public class ECNRSigner - implements DSA -{ - private boolean forSigning; - private ECKeyParameters key; - private SecureRandom random; - - public void init( - boolean forSigning, - CipherParameters param) - { - this.forSigning = forSigning; - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (ECPrivateKeyParameters)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.key = (ECPrivateKeyParameters)param; - } - } - else - { - this.key = (ECPublicKeyParameters)param; - } - } - - // Section 7.2.5 ECSP-NR, pg 34 - /** - * generate a signature for the given message using the key we were - * initialised with. Generally, the order of the curve should be at - * least as long as the hash of the message of interest, and with - * ECNR it *must* be at least as long. - * - * @param digest the digest to be signed. - * @exception DataLengthException if the digest is longer than the key allows - */ - public BigInteger[] generateSignature( - byte[] digest) - { - if (! this.forSigning) - { - throw new IllegalStateException("not initialised for signing"); - } - - BigInteger n = ((ECPrivateKeyParameters)this.key).getParameters().getN(); - int nBitLength = n.bitLength(); - - BigInteger e = new BigInteger(1, digest); - int eBitLength = e.bitLength(); - - ECPrivateKeyParameters privKey = (ECPrivateKeyParameters)key; - - if (eBitLength > nBitLength) - { - throw new DataLengthException("input too large for ECNR key."); - } - - BigInteger r = null; - BigInteger s = null; - - AsymmetricCipherKeyPair tempPair; - do // generate r - { - // generate another, but very temporary, key pair using - // the same EC parameters - ECKeyPairGenerator keyGen = new ECKeyPairGenerator(); - - keyGen.init(new ECKeyGenerationParameters(privKey.getParameters(), this.random)); - - tempPair = keyGen.generateKeyPair(); - - // BigInteger Vx = tempPair.getPublic().getW().getAffineX(); - ECPublicKeyParameters V = (ECPublicKeyParameters)tempPair.getPublic(); // get temp's public key - BigInteger Vx = V.getQ().getX().toBigInteger(); // get the point's x coordinate - - r = Vx.add(e).mod(n); - } - while (r.equals(ECConstants.ZERO)); - - // generate s - BigInteger x = privKey.getD(); // private key value - BigInteger u = ((ECPrivateKeyParameters)tempPair.getPrivate()).getD(); // temp's private key value - s = u.subtract(r.multiply(x)).mod(n); - - BigInteger[] res = new BigInteger[2]; - res[0] = r; - res[1] = s; - - return res; - } - - // Section 7.2.6 ECVP-NR, pg 35 - /** - * return true if the value r and s represent a signature for the - * message passed in. Generally, the order of the curve should be at - * least as long as the hash of the message of interest, and with - * ECNR, it *must* be at least as long. But just in case the signer - * applied mod(n) to the longer digest, this implementation will - * apply mod(n) during verification. - * - * @param digest the digest to be verified. - * @param r the r value of the signature. - * @param s the s value of the signature. - * @exception DataLengthException if the digest is longer than the key allows - */ - public boolean verifySignature( - byte[] digest, - BigInteger r, - BigInteger s) - { - if (this.forSigning) - { - throw new IllegalStateException("not initialised for verifying"); - } - - ECPublicKeyParameters pubKey = (ECPublicKeyParameters)key; - BigInteger n = pubKey.getParameters().getN(); - int nBitLength = n.bitLength(); - - BigInteger e = new BigInteger(1, digest); - int eBitLength = e.bitLength(); - - if (eBitLength > nBitLength) - { - throw new DataLengthException("input too large for ECNR key."); - } - - // r in the range [1,n-1] - if (r.compareTo(ECConstants.ONE) < 0 || r.compareTo(n) >= 0) - { - return false; - } - - // s in the range [0,n-1] NB: ECNR spec says 0 - if (s.compareTo(ECConstants.ZERO) < 0 || s.compareTo(n) >= 0) - { - return false; - } - - // compute P = sG + rW - - ECPoint G = pubKey.getParameters().getG(); - ECPoint W = pubKey.getQ(); - // calculate P using Bouncy math - ECPoint P = ECAlgorithms.sumOfTwoMultiplies(G, s, W, r); - - BigInteger x = P.getX().toBigInteger(); - BigInteger t = r.subtract(x).mod(n); - - return t.equals(e); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GOST3410Signer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GOST3410Signer.java deleted file mode 100644 index 8c3df4b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GOST3410Signer.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bc.crypto.signers; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.DSA; -import org.bc.crypto.params.*; - -import java.security.SecureRandom; -import java.math.BigInteger; - -/** - * GOST R 34.10-94 Signature Algorithm - */ -public class GOST3410Signer - implements DSA -{ - GOST3410KeyParameters key; - - SecureRandom random; - - public void init( - boolean forSigning, - CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (GOST3410PrivateKeyParameters)rParam.getParameters(); - } - else - { - this.random = new SecureRandom(); - this.key = (GOST3410PrivateKeyParameters)param; - } - } - else - { - this.key = (GOST3410PublicKeyParameters)param; - } - } - - /** - * generate a signature for the given message using the key we were - * initialised with. For conventional GOST3410 the message should be a GOST3411 - * hash of the message of interest. - * - * @param message the message that will be verified later. - */ - public BigInteger[] generateSignature( - byte[] message) - { - byte[] mRev = new byte[message.length]; // conversion is little-endian - for (int i = 0; i != mRev.length; i++) - { - mRev[i] = message[mRev.length - 1 - i]; - } - - BigInteger m = new BigInteger(1, mRev); - GOST3410Parameters params = key.getParameters(); - BigInteger k; - - do - { - k = new BigInteger(params.getQ().bitLength(), random); - } - while (k.compareTo(params.getQ()) >= 0); - - BigInteger r = params.getA().modPow(k, params.getP()).mod(params.getQ()); - - BigInteger s = k.multiply(m). - add(((GOST3410PrivateKeyParameters)key).getX().multiply(r)). - mod(params.getQ()); - - BigInteger[] res = new BigInteger[2]; - - res[0] = r; - res[1] = s; - - return res; - } - - /** - * return true if the value r and s represent a GOST3410 signature for - * the passed in message for standard GOST3410 the message should be a - * GOST3411 hash of the real message to be verified. - */ - public boolean verifySignature( - byte[] message, - BigInteger r, - BigInteger s) - { - byte[] mRev = new byte[message.length]; // conversion is little-endian - for (int i = 0; i != mRev.length; i++) - { - mRev[i] = message[mRev.length - 1 - i]; - } - - BigInteger m = new BigInteger(1, mRev); - GOST3410Parameters params = key.getParameters(); - BigInteger zero = BigInteger.valueOf(0); - - if (zero.compareTo(r) >= 0 || params.getQ().compareTo(r) <= 0) - { - return false; - } - - if (zero.compareTo(s) >= 0 || params.getQ().compareTo(s) <= 0) - { - return false; - } - - BigInteger v = m.modPow(params.getQ().subtract(new BigInteger("2")),params.getQ()); - - BigInteger z1 = s.multiply(v).mod(params.getQ()); - BigInteger z2 = (params.getQ().subtract(r)).multiply(v).mod(params.getQ()); - - z1 = params.getA().modPow(z1, params.getP()); - z2 = ((GOST3410PublicKeyParameters)key).getY().modPow(z2, params.getP()); - - BigInteger u = z1.multiply(z2).mod(params.getP()).mod(params.getQ()); - - return u.equals(r); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GenericSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GenericSigner.java deleted file mode 100644 index 4358921..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/GenericSigner.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.bc.crypto.signers; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.CryptoException; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Digest; -import org.bc.crypto.Signer; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - -public class GenericSigner - implements Signer -{ - private final AsymmetricBlockCipher engine; - private final Digest digest; - private boolean forSigning; - - public GenericSigner( - AsymmetricBlockCipher engine, - Digest digest) - { - this.engine = engine; - this.digest = digest; - } - - /** - * initialise the signer for signing or verification. - * - * @param forSigning - * true if for signing, false otherwise - * @param parameters - * necessary parameters. - */ - public void init( - boolean forSigning, - CipherParameters parameters) - { - this.forSigning = forSigning; - AsymmetricKeyParameter k; - - if (parameters instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)parameters; - } - - if (forSigning && !k.isPrivate()) - { - throw new IllegalArgumentException("signing requires private key"); - } - - if (!forSigning && k.isPrivate()) - { - throw new IllegalArgumentException("verification requires public key"); - } - - reset(); - - engine.init(forSigning, parameters); - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte input) - { - digest.update(input); - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] input, - int inOff, - int length) - { - digest.update(input, inOff, length); - } - - /** - * Generate a signature for the message we've been loaded with using the key - * we were initialised with. - */ - public byte[] generateSignature() - throws CryptoException, DataLengthException - { - if (!forSigning) - { - throw new IllegalStateException("GenericSigner not initialised for signature generation."); - } - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - return engine.processBlock(hash, 0, hash.length); - } - - /** - * return true if the internal state represents the signature described in - * the passed in array. - */ - public boolean verifySignature( - byte[] signature) - { - if (forSigning) - { - throw new IllegalStateException("GenericSigner not initialised for verification"); - } - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - try - { - byte[] sig = engine.processBlock(signature, 0, signature.length); - - return Arrays.constantTimeAreEqual(sig, hash); - } - catch (Exception e) - { - return false; - } - } - - public void reset() - { - digest.reset(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2PSSSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2PSSSigner.java deleted file mode 100644 index 07092fe..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2PSSSigner.java +++ /dev/null @@ -1,621 +0,0 @@ -package org.bc.crypto.signers; - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.SignerWithRecovery; -import org.bc.crypto.digests.RIPEMD128Digest; -import org.bc.crypto.digests.RIPEMD160Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.ParametersWithSalt; -import org.bc.crypto.params.RSAKeyParameters; - -/** - * ISO9796-2 - mechanism using a hash function with recovery (scheme 2 and 3). - *

    - * Note: the usual length for the salt is the length of the hash - * function used in bytes. - */ -public class ISO9796d2PSSSigner - implements SignerWithRecovery -{ - static final public int TRAILER_IMPLICIT = 0xBC; - static final public int TRAILER_RIPEMD160 = 0x31CC; - static final public int TRAILER_RIPEMD128 = 0x32CC; - static final public int TRAILER_SHA1 = 0x33CC; - - private Digest digest; - private AsymmetricBlockCipher cipher; - - private SecureRandom random; - private byte[] standardSalt; - - private int hLen; - private int trailer; - private int keyBits; - private byte[] block; - private byte[] mBuf; - private int messageLength; - private int saltLength; - private boolean fullMessage; - private byte[] recoveredMessage; - - /** - * Generate a signer for the with either implicit or explicit trailers - * for ISO9796-2, scheme 2 or 3. - * - * @param cipher base cipher to use for signature creation/verification - * @param digest digest to use. - * @param saltLength length of salt in bytes. - * @param implicit whether or not the trailer is implicit or gives the hash. - */ - public ISO9796d2PSSSigner( - AsymmetricBlockCipher cipher, - Digest digest, - int saltLength, - boolean implicit) - { - this.cipher = cipher; - this.digest = digest; - this.hLen = digest.getDigestSize(); - this.saltLength = saltLength; - - if (implicit) - { - trailer = TRAILER_IMPLICIT; - } - else - { - if (digest instanceof SHA1Digest) - { - trailer = TRAILER_SHA1; - } - else if (digest instanceof RIPEMD160Digest) - { - trailer = TRAILER_RIPEMD160; - } - else if (digest instanceof RIPEMD128Digest) - { - trailer = TRAILER_RIPEMD128; - } - else - { - throw new IllegalArgumentException("no valid trailer for digest"); - } - } - } - - /** - * Constructor for a signer with an explicit digest trailer. - * - * @param cipher cipher to use. - * @param digest digest to sign with. - * @param saltLength length of salt in bytes. - */ - public ISO9796d2PSSSigner( - AsymmetricBlockCipher cipher, - Digest digest, - int saltLength) - { - this(cipher, digest, saltLength, false); - } - - /** - * Initialise the signer. - * - * @param forSigning true if for signing, false if for verification. - * @param param parameters for signature generation/verification. If the - * parameters are for generation they should be a ParametersWithRandom, - * a ParametersWithSalt, or just an RSAKeyParameters object. If RSAKeyParameters - * are passed in a SecureRandom will be created. - * @exception IllegalArgumentException if wrong parameter type or a fixed - * salt is passed in which is the wrong length. - */ - public void init( - boolean forSigning, - CipherParameters param) - { - RSAKeyParameters kParam; - int lengthOfSalt = saltLength; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)param; - - kParam = (RSAKeyParameters)p.getParameters(); - if (forSigning) - { - random = p.getRandom(); - } - } - else if (param instanceof ParametersWithSalt) - { - ParametersWithSalt p = (ParametersWithSalt)param; - - kParam = (RSAKeyParameters)p.getParameters(); - standardSalt = p.getSalt(); - lengthOfSalt = standardSalt.length; - if (standardSalt.length != saltLength) - { - throw new IllegalArgumentException("Fixed salt is of wrong length"); - } - } - else - { - kParam = (RSAKeyParameters)param; - if (forSigning) - { - random = new SecureRandom(); - } - } - - cipher.init(forSigning, kParam); - - keyBits = kParam.getModulus().bitLength(); - - block = new byte[(keyBits + 7) / 8]; - - if (trailer == TRAILER_IMPLICIT) - { - mBuf = new byte[block.length - digest.getDigestSize() - lengthOfSalt - 1 - 1]; - } - else - { - mBuf = new byte[block.length - digest.getDigestSize() - lengthOfSalt - 1 - 2]; - } - - reset(); - } - - /** - * compare two byte arrays - constant time - */ - private boolean isSameAs( - byte[] a, - byte[] b) - { - boolean isOkay = true; - - if (messageLength != b.length) - { - isOkay = false; - } - - for (int i = 0; i != b.length; i++) - { - if (a[i] != b[i]) - { - isOkay = false; - } - } - - return isOkay; - } - - /** - * clear possible sensitive data - */ - private void clearBlock( - byte[] block) - { - for (int i = 0; i != block.length; i++) - { - block[i] = 0; - } - } - - public void updateWithRecoveredMessage(byte[] signature) - throws InvalidCipherTextException - { - throw new RuntimeException("not implemented"); // TODO: - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte b) - { - if (messageLength < mBuf.length) - { - mBuf[messageLength++] = b; - } - else - { - digest.update(b); - } - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] in, - int off, - int len) - { - while (len > 0 && messageLength < mBuf.length) - { - this.update(in[off]); - off++; - len--; - } - - if (len > 0) - { - digest.update(in, off, len); - } - } - - /** - * reset the internal state - */ - public void reset() - { - digest.reset(); - messageLength = 0; - if (mBuf != null) - { - clearBlock(mBuf); - } - if (recoveredMessage != null) - { - clearBlock(recoveredMessage); - recoveredMessage = null; - } - fullMessage = false; - } - - /** - * generate a signature for the loaded message using the key we were - * initialised with. - */ - public byte[] generateSignature() - throws CryptoException - { - int digSize = digest.getDigestSize(); - - byte[] m2Hash = new byte[digSize]; - - digest.doFinal(m2Hash, 0); - - byte[] C = new byte[8]; - LtoOSP(messageLength * 8, C); - - digest.update(C, 0, C.length); - - digest.update(mBuf, 0, messageLength); - - digest.update(m2Hash, 0, m2Hash.length); - - byte[] salt; - - if (standardSalt != null) - { - salt = standardSalt; - } - else - { - salt = new byte[saltLength]; - random.nextBytes(salt); - } - - digest.update(salt, 0, salt.length); - - byte[] hash = new byte[digest.getDigestSize()]; - - digest.doFinal(hash, 0); - - int tLength = 2; - if (trailer == TRAILER_IMPLICIT) - { - tLength = 1; - } - - int off = block.length - messageLength - salt.length - hLen - tLength - 1; - - block[off] = 0x01; - - System.arraycopy(mBuf, 0, block, off + 1, messageLength); - System.arraycopy(salt, 0, block, off + 1 + messageLength, salt.length); - - byte[] dbMask = maskGeneratorFunction1(hash, 0, hash.length, block.length - hLen - tLength); - for (int i = 0; i != dbMask.length; i++) - { - block[i] ^= dbMask[i]; - } - - System.arraycopy(hash, 0, block, block.length - hLen - tLength, hLen); - - if (trailer == TRAILER_IMPLICIT) - { - block[block.length - 1] = (byte)TRAILER_IMPLICIT; - } - else - { - block[block.length - 2] = (byte)(trailer >>> 8); - block[block.length - 1] = (byte)trailer; - } - - block[0] &= 0x7f; - - byte[] b = cipher.processBlock(block, 0, block.length); - - clearBlock(mBuf); - clearBlock(block); - messageLength = 0; - - return b; - } - - /** - * return true if the signature represents a ISO9796-2 signature - * for the passed in message. - */ - public boolean verifySignature( - byte[] signature) - { - byte[] block; - - try - { - block = cipher.processBlock(signature, 0, signature.length); - } - catch (Exception e) - { - return false; - } - - // - // adjust block size for leading zeroes if necessary - // - if (block.length < (keyBits + 7) / 8) - { - byte[] tmp = new byte[(keyBits + 7) / 8]; - - System.arraycopy(block, 0, tmp, tmp.length - block.length, block.length); - clearBlock(block); - block = tmp; - } - - int tLength; - - if (((block[block.length - 1] & 0xFF) ^ 0xBC) == 0) - { - tLength = 1; - } - else - { - int sigTrail = ((block[block.length - 2] & 0xFF) << 8) | (block[block.length - 1] & 0xFF); - - switch (sigTrail) - { - case TRAILER_RIPEMD160: - if (!(digest instanceof RIPEMD160Digest)) - { - throw new IllegalStateException("signer should be initialised with RIPEMD160"); - } - break; - case TRAILER_SHA1: - if (!(digest instanceof SHA1Digest)) - { - throw new IllegalStateException("signer should be initialised with SHA1"); - } - break; - case TRAILER_RIPEMD128: - if (!(digest instanceof RIPEMD128Digest)) - { - throw new IllegalStateException("signer should be initialised with RIPEMD128"); - } - break; - default: - throw new IllegalArgumentException("unrecognised hash in signature"); - } - - tLength = 2; - } - - // - // calculate H(m2) - // - byte[] m2Hash = new byte[hLen]; - digest.doFinal(m2Hash, 0); - - // - // remove the mask - // - byte[] dbMask = maskGeneratorFunction1(block, block.length - hLen - tLength, hLen, block.length - hLen - tLength); - for (int i = 0; i != dbMask.length; i++) - { - block[i] ^= dbMask[i]; - } - - block[0] &= 0x7f; - - // - // find out how much padding we've got - // - int mStart = 0; - for (; mStart != block.length; mStart++) - { - if (block[mStart] == 0x01) - { - break; - } - } - - mStart++; - - if (mStart >= block.length) - { - clearBlock(block); - return false; - } - - fullMessage = (mStart > 1); - - recoveredMessage = new byte[dbMask.length - mStart - saltLength]; - - System.arraycopy(block, mStart, recoveredMessage, 0, recoveredMessage.length); - - // - // check the hashes - // - byte[] C = new byte[8]; - LtoOSP(recoveredMessage.length * 8, C); - - digest.update(C, 0, C.length); - - if (recoveredMessage.length != 0) - { - digest.update(recoveredMessage, 0, recoveredMessage.length); - } - - digest.update(m2Hash, 0, m2Hash.length); - - // Update for the salt - digest.update(block, mStart + recoveredMessage.length, saltLength); - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - int off = block.length - tLength - hash.length; - - boolean isOkay = true; - - for (int i = 0; i != hash.length; i++) - { - if (hash[i] != block[off + i]) - { - isOkay = false; - } - } - - clearBlock(block); - clearBlock(hash); - - if (!isOkay) - { - fullMessage = false; - clearBlock(recoveredMessage); - return false; - } - - // - // if they've input a message check what we've recovered against - // what was input. - // - if (messageLength != 0) - { - if (!isSameAs(mBuf, recoveredMessage)) - { - clearBlock(mBuf); - return false; - } - - messageLength = 0; - } - - clearBlock(mBuf); - return true; - } - - /** - * Return true if the full message was recoveredMessage. - * - * @return true on full message recovery, false otherwise, or if not sure. - * @see org.bc.crypto.SignerWithRecovery#hasFullMessage() - */ - public boolean hasFullMessage() - { - return fullMessage; - } - - /** - * Return a reference to the recoveredMessage message. - * - * @return the full/partial recoveredMessage message. - * @see org.bc.crypto.SignerWithRecovery#getRecoveredMessage() - */ - public byte[] getRecoveredMessage() - { - return recoveredMessage; - } - - /** - * int to octet string. - */ - private void ItoOSP( - int i, - byte[] sp) - { - sp[0] = (byte)(i >>> 24); - sp[1] = (byte)(i >>> 16); - sp[2] = (byte)(i >>> 8); - sp[3] = (byte)(i >>> 0); - } - - /** - * long to octet string. - */ - private void LtoOSP( - long l, - byte[] sp) - { - sp[0] = (byte)(l >>> 56); - sp[1] = (byte)(l >>> 48); - sp[2] = (byte)(l >>> 40); - sp[3] = (byte)(l >>> 32); - sp[4] = (byte)(l >>> 24); - sp[5] = (byte)(l >>> 16); - sp[6] = (byte)(l >>> 8); - sp[7] = (byte)(l >>> 0); - } - /** - * mask generator function, as described in PKCS1v2. - */ - private byte[] maskGeneratorFunction1( - byte[] Z, - int zOff, - int zLen, - int length) - { - byte[] mask = new byte[length]; - byte[] hashBuf = new byte[hLen]; - byte[] C = new byte[4]; - int counter = 0; - - digest.reset(); - - while (counter < (length / hLen)) - { - ItoOSP(counter, C); - - digest.update(Z, zOff, zLen); - digest.update(C, 0, C.length); - digest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * hLen, hLen); - - counter++; - } - - if ((counter * hLen) < length) - { - ItoOSP(counter, C); - - digest.update(Z, zOff, zLen); - digest.update(C, 0, C.length); - digest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * hLen, mask.length - (counter * hLen)); - } - - return mask; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2Signer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2Signer.java deleted file mode 100644 index b10beab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/ISO9796d2Signer.java +++ /dev/null @@ -1,615 +0,0 @@ -package org.bc.crypto.signers; - -import java.util.Hashtable; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.CryptoException; -import org.bc.crypto.Digest; -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.SignerWithRecovery; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.util.Arrays; -import org.bc.util.Integers; - -/** - * ISO9796-2 - mechanism using a hash function with recovery (scheme 1) - */ -public class ISO9796d2Signer - implements SignerWithRecovery -{ - static final public int TRAILER_IMPLICIT = 0xBC; - static final public int TRAILER_RIPEMD160 = 0x31CC; - static final public int TRAILER_RIPEMD128 = 0x32CC; - static final public int TRAILER_SHA1 = 0x33CC; - static final public int TRAILER_SHA256 = 0x34CC; - static final public int TRAILER_SHA512 = 0x35CC; - static final public int TRAILER_SHA384 = 0x36CC; - static final public int TRAILER_WHIRLPOOL = 0x37CC; - - private static Hashtable trailerMap = new Hashtable(); - - static - { - trailerMap.put("RIPEMD128", Integers.valueOf(TRAILER_RIPEMD128)); - trailerMap.put("RIPEMD160", Integers.valueOf(TRAILER_RIPEMD160)); - - trailerMap.put("SHA-1", Integers.valueOf(TRAILER_SHA1)); - trailerMap.put("SHA-256", Integers.valueOf(TRAILER_SHA256)); - trailerMap.put("SHA-384", Integers.valueOf(TRAILER_SHA384)); - trailerMap.put("SHA-512", Integers.valueOf(TRAILER_SHA512)); - - trailerMap.put("Whirlpool", Integers.valueOf(TRAILER_WHIRLPOOL)); - } - - private Digest digest; - private AsymmetricBlockCipher cipher; - - private int trailer; - private int keyBits; - private byte[] block; - private byte[] mBuf; - private int messageLength; - private boolean fullMessage; - private byte[] recoveredMessage; - - private byte[] preSig; - private byte[] preBlock; - - /** - * Generate a signer for the with either implicit or explicit trailers - * for ISO9796-2. - * - * @param cipher base cipher to use for signature creation/verification - * @param digest digest to use. - * @param implicit whether or not the trailer is implicit or gives the hash. - */ - public ISO9796d2Signer( - AsymmetricBlockCipher cipher, - Digest digest, - boolean implicit) - { - this.cipher = cipher; - this.digest = digest; - - if (implicit) - { - trailer = TRAILER_IMPLICIT; - } - else - { - Integer trailerObj = (Integer)trailerMap.get(digest.getAlgorithmName()); - - if (trailerObj != null) - { - trailer = trailerObj.intValue(); - } - else - { - throw new IllegalArgumentException("no valid trailer for digest"); - } - } - } - - /** - * Constructor for a signer with an explicit digest trailer. - * - * @param cipher cipher to use. - * @param digest digest to sign with. - */ - public ISO9796d2Signer( - AsymmetricBlockCipher cipher, - Digest digest) - { - this(cipher, digest, false); - } - - public void init( - boolean forSigning, - CipherParameters param) - { - RSAKeyParameters kParam = (RSAKeyParameters)param; - - cipher.init(forSigning, kParam); - - keyBits = kParam.getModulus().bitLength(); - - block = new byte[(keyBits + 7) / 8]; - - if (trailer == TRAILER_IMPLICIT) - { - mBuf = new byte[block.length - digest.getDigestSize() - 2]; - } - else - { - mBuf = new byte[block.length - digest.getDigestSize() - 3]; - } - - reset(); - } - - /** - * compare two byte arrays - constant time - */ - private boolean isSameAs( - byte[] a, - byte[] b) - { - boolean isOkay = true; - - if (messageLength > mBuf.length) - { - if (mBuf.length > b.length) - { - isOkay = false; - } - - for (int i = 0; i != mBuf.length; i++) - { - if (a[i] != b[i]) - { - isOkay = false; - } - } - } - else - { - if (messageLength != b.length) - { - isOkay = false; - } - - for (int i = 0; i != b.length; i++) - { - if (a[i] != b[i]) - { - isOkay = false; - } - } - } - - return isOkay; - } - - /** - * clear possible sensitive data - */ - private void clearBlock( - byte[] block) - { - for (int i = 0; i != block.length; i++) - { - block[i] = 0; - } - } - - public void updateWithRecoveredMessage(byte[] signature) - throws InvalidCipherTextException - { - byte[] block = cipher.processBlock(signature, 0, signature.length); - - if (((block[0] & 0xC0) ^ 0x40) != 0) - { - throw new InvalidCipherTextException("malformed signature"); - } - - if (((block[block.length - 1] & 0xF) ^ 0xC) != 0) - { - throw new InvalidCipherTextException("malformed signature"); - } - - int delta = 0; - - if (((block[block.length - 1] & 0xFF) ^ 0xBC) == 0) - { - delta = 1; - } - else - { - int sigTrail = ((block[block.length - 2] & 0xFF) << 8) | (block[block.length - 1] & 0xFF); - Integer trailerObj = (Integer)trailerMap.get(digest.getAlgorithmName()); - - if (trailerObj != null) - { - if (sigTrail != trailerObj.intValue()) - { - throw new IllegalStateException("signer initialised with wrong digest for trailer " + sigTrail); - } - } - else - { - throw new IllegalArgumentException("unrecognised hash in signature"); - } - - delta = 2; - } - - // - // find out how much padding we've got - // - int mStart = 0; - - for (mStart = 0; mStart != block.length; mStart++) - { - if (((block[mStart] & 0x0f) ^ 0x0a) == 0) - { - break; - } - } - - mStart++; - - int off = block.length - delta - digest.getDigestSize(); - - // - // there must be at least one byte of message string - // - if ((off - mStart) <= 0) - { - throw new InvalidCipherTextException("malformed block"); - } - - // - // if we contain the whole message as well, check the hash of that. - // - if ((block[0] & 0x20) == 0) - { - fullMessage = true; - - recoveredMessage = new byte[off - mStart]; - System.arraycopy(block, mStart, recoveredMessage, 0, recoveredMessage.length); - } - else - { - fullMessage = false; - - recoveredMessage = new byte[off - mStart]; - System.arraycopy(block, mStart, recoveredMessage, 0, recoveredMessage.length); - } - - preSig = signature; - preBlock = block; - - digest.update(recoveredMessage, 0, recoveredMessage.length); - messageLength = recoveredMessage.length; - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte b) - { - digest.update(b); - - if (preSig == null && messageLength < mBuf.length) - { - mBuf[messageLength] = b; - } - - messageLength++; - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] in, - int off, - int len) - { - digest.update(in, off, len); - - if (preSig == null && messageLength < mBuf.length) - { - for (int i = 0; i < len && (i + messageLength) < mBuf.length; i++) - { - mBuf[messageLength + i] = in[off + i]; - } - } - - messageLength += len; - } - - /** - * reset the internal state - */ - public void reset() - { - digest.reset(); - messageLength = 0; - clearBlock(mBuf); - - if (recoveredMessage != null) - { - clearBlock(recoveredMessage); - } - - recoveredMessage = null; - fullMessage = false; - } - - /** - * generate a signature for the loaded message using the key we were - * initialised with. - */ - public byte[] generateSignature() - throws CryptoException - { - int digSize = digest.getDigestSize(); - - int t = 0; - int delta = 0; - - if (trailer == TRAILER_IMPLICIT) - { - t = 8; - delta = block.length - digSize - 1; - digest.doFinal(block, delta); - block[block.length - 1] = (byte)TRAILER_IMPLICIT; - } - else - { - t = 16; - delta = block.length - digSize - 2; - digest.doFinal(block, delta); - block[block.length - 2] = (byte)(trailer >>> 8); - block[block.length - 1] = (byte)trailer; - } - - byte header = 0; - int x = (digSize + messageLength) * 8 + t + 4 - keyBits; - - if (x > 0) - { - int mR = messageLength - ((x + 7) / 8); - header = 0x60; - - delta -= mR; - - System.arraycopy(mBuf, 0, block, delta, mR); - } - else - { - header = 0x40; - delta -= messageLength; - - System.arraycopy(mBuf, 0, block, delta, messageLength); - } - - if ((delta - 1) > 0) - { - for (int i = delta - 1; i != 0; i--) - { - block[i] = (byte)0xbb; - } - block[delta - 1] ^= (byte)0x01; - block[0] = (byte)0x0b; - block[0] |= header; - } - else - { - block[0] = (byte)0x0a; - block[0] |= header; - } - - byte[] b = cipher.processBlock(block, 0, block.length); - - clearBlock(mBuf); - clearBlock(block); - - return b; - } - - /** - * return true if the signature represents a ISO9796-2 signature - * for the passed in message. - */ - public boolean verifySignature( - byte[] signature) - { - byte[] block = null; - boolean updateWithRecoveredCalled; - - if (preSig == null) - { - updateWithRecoveredCalled = false; - try - { - block = cipher.processBlock(signature, 0, signature.length); - } - catch (Exception e) - { - return false; - } - } - else - { - if (!Arrays.areEqual(preSig, signature)) - { - throw new IllegalStateException("updateWithRecoveredMessage called on different signature"); - } - - updateWithRecoveredCalled = true; - block = preBlock; - - preSig = null; - preBlock = null; - } - - if (((block[0] & 0xC0) ^ 0x40) != 0) - { - return returnFalse(block); - } - - if (((block[block.length - 1] & 0xF) ^ 0xC) != 0) - { - return returnFalse(block); - } - - int delta = 0; - - if (((block[block.length - 1] & 0xFF) ^ 0xBC) == 0) - { - delta = 1; - } - else - { - int sigTrail = ((block[block.length - 2] & 0xFF) << 8) | (block[block.length - 1] & 0xFF); - Integer trailerObj = (Integer)trailerMap.get(digest.getAlgorithmName()); - - if (trailerObj != null) - { - if (sigTrail != trailerObj.intValue()) - { - throw new IllegalStateException("signer initialised with wrong digest for trailer " + sigTrail); - } - } - else - { - throw new IllegalArgumentException("unrecognised hash in signature"); - } - - delta = 2; - } - - // - // find out how much padding we've got - // - int mStart = 0; - - for (mStart = 0; mStart != block.length; mStart++) - { - if (((block[mStart] & 0x0f) ^ 0x0a) == 0) - { - break; - } - } - - mStart++; - - // - // check the hashes - // - byte[] hash = new byte[digest.getDigestSize()]; - - int off = block.length - delta - hash.length; - - // - // there must be at least one byte of message string - // - if ((off - mStart) <= 0) - { - return returnFalse(block); - } - - // - // if we contain the whole message as well, check the hash of that. - // - if ((block[0] & 0x20) == 0) - { - fullMessage = true; - - // check right number of bytes passed in. - if (messageLength > off - mStart) - { - return returnFalse(block); - } - - digest.reset(); - digest.update(block, mStart, off - mStart); - digest.doFinal(hash, 0); - - boolean isOkay = true; - - for (int i = 0; i != hash.length; i++) - { - block[off + i] ^= hash[i]; - if (block[off + i] != 0) - { - isOkay = false; - } - } - - if (!isOkay) - { - return returnFalse(block); - } - - recoveredMessage = new byte[off - mStart]; - System.arraycopy(block, mStart, recoveredMessage, 0, recoveredMessage.length); - } - else - { - fullMessage = false; - - digest.doFinal(hash, 0); - - boolean isOkay = true; - - for (int i = 0; i != hash.length; i++) - { - block[off + i] ^= hash[i]; - if (block[off + i] != 0) - { - isOkay = false; - } - } - - if (!isOkay) - { - return returnFalse(block); - } - - recoveredMessage = new byte[off - mStart]; - System.arraycopy(block, mStart, recoveredMessage, 0, recoveredMessage.length); - } - - // - // if they've input a message check what we've recovered against - // what was input. - // - if (messageLength != 0 && !updateWithRecoveredCalled) - { - if (!isSameAs(mBuf, recoveredMessage)) - { - return returnFalse(block); - } - } - - clearBlock(mBuf); - clearBlock(block); - - return true; - } - - private boolean returnFalse(byte[] block) - { - clearBlock(mBuf); - clearBlock(block); - - return false; - } - - /** - * Return true if the full message was recoveredMessage. - * - * @return true on full message recovery, false otherwise. - * @see org.bc.crypto.SignerWithRecovery#hasFullMessage() - */ - public boolean hasFullMessage() - { - return fullMessage; - } - - /** - * Return a reference to the recoveredMessage message. - * - * @return the full/partial recoveredMessage message. - * @see org.bc.crypto.SignerWithRecovery#getRecoveredMessage() - */ - public byte[] getRecoveredMessage() - { - return recoveredMessage; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSigner.java deleted file mode 100644 index 64d3f6c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSigner.java +++ /dev/null @@ -1,262 +0,0 @@ -package org.bc.crypto.signers; - -import java.nio.ByteBuffer; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.NTRUSigningParameters; -import org.bc.crypto.params.NTRUSigningPrivateKeyParameters; -import org.bc.crypto.params.NTRUSigningPublicKeyParameters; -import org.bc.math.ntru.polynomial.IntegerPolynomial; -import org.bc.math.ntru.polynomial.Polynomial; - -/** - * Signs, verifies data and generates key pairs. - */ -public class NTRUSigner -{ - private NTRUSigningParameters params; - private Digest hashAlg; - private NTRUSigningPrivateKeyParameters signingKeyPair; - private NTRUSigningPublicKeyParameters verificationKey; - - /** - * Constructs a new instance with a set of signature parameters. - * - * @param params signature parameters - */ - public NTRUSigner(NTRUSigningParameters params) - { - this.params = params; - } - - /** - * Resets the engine for signing a message. - * - * @param forSigning - * @param params - */ - public void init(boolean forSigning, CipherParameters params) - { - if (forSigning) - { - this.signingKeyPair = (NTRUSigningPrivateKeyParameters)params; - } - else - { - this.verificationKey = (NTRUSigningPublicKeyParameters)params; - } - hashAlg = this.params.hashAlg; - hashAlg.reset(); - } - - /** - * Adds data to sign or verify. - * - * @param b data - */ - public void update(byte b) - { - if (hashAlg == null) - { - throw new IllegalStateException("Call initSign or initVerify first!"); - } - - hashAlg.update(b); - } - - /** - * Adds data to sign or verify. - * - * @param m data - * @param off offset - * @param length number of bytes - */ - public void update(byte[] m, int off, int length) - { - if (hashAlg == null) - { - throw new IllegalStateException("Call initSign or initVerify first!"); - } - - hashAlg.update(m, off, length); - } - - /** - * Adds data to sign and computes a signature over this data and any data previously added via {@link #update(byte[], int, int)}. - * - * @return a signature - * @throws IllegalStateException if initSign was not called - */ - public byte[] generateSignature() - { - if (hashAlg == null || signingKeyPair == null) - { - throw new IllegalStateException("Call initSign first!"); - } - - byte[] msgHash = new byte[hashAlg.getDigestSize()]; - - hashAlg.doFinal(msgHash, 0); - return signHash(msgHash, signingKeyPair); - } - - private byte[] signHash(byte[] msgHash, NTRUSigningPrivateKeyParameters kp) - { - int r = 0; - IntegerPolynomial s; - IntegerPolynomial i; - - NTRUSigningPublicKeyParameters kPub = kp.getPublicKey(); - do - { - r++; - if (r > params.signFailTolerance) - { - throw new IllegalStateException("Signing failed: too many retries (max=" + params.signFailTolerance + ")"); - } - i = createMsgRep(msgHash, r); - s = sign(i, kp); - } - while (!verify(i, s, kPub.h)); - - byte[] rawSig = s.toBinary(params.q); - ByteBuffer sbuf = ByteBuffer.allocate(rawSig.length + 4); - sbuf.put(rawSig); - sbuf.putInt(r); - return sbuf.array(); - } - - private IntegerPolynomial sign(IntegerPolynomial i, NTRUSigningPrivateKeyParameters kp) - { - int N = params.N; - int q = params.q; - int perturbationBases = params.B; - - NTRUSigningPrivateKeyParameters kPriv = kp; - NTRUSigningPublicKeyParameters kPub = kp.getPublicKey(); - - IntegerPolynomial s = new IntegerPolynomial(N); - int iLoop = perturbationBases; - while (iLoop >= 1) - { - Polynomial f = kPriv.getBasis(iLoop).f; - Polynomial fPrime = kPriv.getBasis(iLoop).fPrime; - - IntegerPolynomial y = f.mult(i); - y.div(q); - y = fPrime.mult(y); - - IntegerPolynomial x = fPrime.mult(i); - x.div(q); - x = f.mult(x); - - IntegerPolynomial si = y; - si.sub(x); - s.add(si); - - IntegerPolynomial hi = (IntegerPolynomial)kPriv.getBasis(iLoop).h.clone(); - if (iLoop > 1) - { - hi.sub(kPriv.getBasis(iLoop - 1).h); - } - else - { - hi.sub(kPub.h); - } - i = si.mult(hi, q); - - iLoop--; - } - - Polynomial f = kPriv.getBasis(0).f; - Polynomial fPrime = kPriv.getBasis(0).fPrime; - - IntegerPolynomial y = f.mult(i); - y.div(q); - y = fPrime.mult(y); - - IntegerPolynomial x = fPrime.mult(i); - x.div(q); - x = f.mult(x); - - y.sub(x); - s.add(y); - s.modPositive(q); - return s; - } - - /** - * Verifies a signature for any data previously added via {@link #update(byte[], int, int)}. - * - * @param sig a signature - * @return whether the signature is valid - * @throws IllegalStateException if initVerify was not called - */ - public boolean verifySignature(byte[] sig) - { - if (hashAlg == null || verificationKey == null) - { - throw new IllegalStateException("Call initVerify first!"); - } - - byte[] msgHash = new byte[hashAlg.getDigestSize()]; - - hashAlg.doFinal(msgHash, 0); - - return verifyHash(msgHash, sig, verificationKey); - } - - private boolean verifyHash(byte[] msgHash, byte[] sig, NTRUSigningPublicKeyParameters pub) - { - ByteBuffer sbuf = ByteBuffer.wrap(sig); - byte[] rawSig = new byte[sig.length - 4]; - sbuf.get(rawSig); - IntegerPolynomial s = IntegerPolynomial.fromBinary(rawSig, params.N, params.q); - int r = sbuf.getInt(); - return verify(createMsgRep(msgHash, r), s, pub.h); - } - - private boolean verify(IntegerPolynomial i, IntegerPolynomial s, IntegerPolynomial h) - { - int q = params.q; - double normBoundSq = params.normBoundSq; - double betaSq = params.betaSq; - - IntegerPolynomial t = h.mult(s, q); - t.sub(i); - long centeredNormSq = (long)(s.centeredNormSq(q) + betaSq * t.centeredNormSq(q)); - return centeredNormSq <= normBoundSq; - } - - protected IntegerPolynomial createMsgRep(byte[] msgHash, int r) - { - int N = params.N; - int q = params.q; - - int c = 31 - Integer.numberOfLeadingZeros(q); - int B = (c + 7) / 8; - IntegerPolynomial i = new IntegerPolynomial(N); - - ByteBuffer cbuf = ByteBuffer.allocate(msgHash.length + 4); - cbuf.put(msgHash); - cbuf.putInt(r); - NTRUSignerPrng prng = new NTRUSignerPrng(cbuf.array(), params.hashAlg); - - for (int t = 0; t < N; t++) - { - byte[] o = prng.nextBytes(B); - int hi = o[o.length - 1]; - hi >>= 8 * B - c; - hi <<= 8 * B - c; - o[o.length - 1] = (byte)hi; - - ByteBuffer obuf = ByteBuffer.allocate(4); - obuf.put(o); - obuf.rewind(); - // reverse byte order so it matches the endianness of java ints - i.coeffs[t] = Integer.reverseBytes(obuf.getInt()); - } - return i; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSignerPrng.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSignerPrng.java deleted file mode 100644 index 97f6d68..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/NTRUSignerPrng.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.crypto.signers; - -import java.nio.ByteBuffer; - -import org.bc.crypto.Digest; - -/** - * An implementation of the deterministic pseudo-random generator in EESS section 3.7.3.1 - */ -public class NTRUSignerPrng { - private int counter; - private byte[] seed; - private Digest hashAlg; - - /** - * Constructs a new PRNG and seeds it with a byte array. - * @param seed a seed - * @param hashAlg the hash algorithm to use - */ - NTRUSignerPrng(byte[] seed, Digest hashAlg) { - counter = 0; - this.seed = seed; - this.hashAlg = hashAlg; - } - - /** - * Returns n random bytes - * @param n number of bytes to return - * @return the next n random bytes - */ - byte[] nextBytes(int n) { - ByteBuffer buf = ByteBuffer.allocate(n); - - while (buf.hasRemaining()) { - ByteBuffer cbuf = ByteBuffer.allocate(seed.length + 4); - cbuf.put(seed); - cbuf.putInt(counter); - byte[] array = cbuf.array(); - byte[] hash = new byte[hashAlg.getDigestSize()]; - - hashAlg.update(array, 0, array.length); - - hashAlg.doFinal(hash, 0); - - if (buf.remaining() < hash.length) - buf.put(hash, 0, buf.remaining()); - else - buf.put(hash); - counter++; - } - - return buf.array(); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/PSSSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/PSSSigner.java deleted file mode 100644 index 1ef82b4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/PSSSigner.java +++ /dev/null @@ -1,348 +0,0 @@ -package org.bc.crypto.signers; - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.CryptoException; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Digest; -import org.bc.crypto.Signer; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSABlindingParameters; -import org.bc.crypto.params.RSAKeyParameters; - -/** - * RSA-PSS as described in PKCS# 1 v 2.1. - *

    - * Note: the usual value for the salt length is the number of - * bytes in the hash function. - */ -public class PSSSigner - implements Signer -{ - static final public byte TRAILER_IMPLICIT = (byte)0xBC; - - private Digest contentDigest; - private Digest mgfDigest; - private AsymmetricBlockCipher cipher; - private SecureRandom random; - - private int hLen; - private int mgfhLen; - private int sLen; - private int emBits; - private byte[] salt; - private byte[] mDash; - private byte[] block; - private byte trailer; - - /** - * basic constructor - * - * @param cipher the asymmetric cipher to use. - * @param digest the digest to use. - * @param sLen the length of the salt to use (in bytes). - */ - public PSSSigner( - AsymmetricBlockCipher cipher, - Digest digest, - int sLen) - { - this(cipher, digest, sLen, TRAILER_IMPLICIT); - } - - public PSSSigner( - AsymmetricBlockCipher cipher, - Digest contentDigest, - Digest mgfDigest, - int sLen) - { - this(cipher, contentDigest, mgfDigest, sLen, TRAILER_IMPLICIT); - } - - public PSSSigner( - AsymmetricBlockCipher cipher, - Digest digest, - int sLen, - byte trailer) - { - this(cipher, digest, digest, sLen, trailer); - } - - public PSSSigner( - AsymmetricBlockCipher cipher, - Digest contentDigest, - Digest mgfDigest, - int sLen, - byte trailer) - { - this.cipher = cipher; - this.contentDigest = contentDigest; - this.mgfDigest = mgfDigest; - this.hLen = contentDigest.getDigestSize(); - this.mgfhLen = mgfDigest.getDigestSize(); - this.sLen = sLen; - this.salt = new byte[sLen]; - this.mDash = new byte[8 + sLen + hLen]; - this.trailer = trailer; - } - - public void init( - boolean forSigning, - CipherParameters param) - { - CipherParameters params; - - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom p = (ParametersWithRandom)param; - - params = p.getParameters(); - random = p.getRandom(); - } - else - { - params = param; - if (forSigning) - { - random = new SecureRandom(); - } - } - - cipher.init(forSigning, params); - - RSAKeyParameters kParam; - - if (params instanceof RSABlindingParameters) - { - kParam = ((RSABlindingParameters)params).getPublicKey(); - } - else - { - kParam = (RSAKeyParameters)params; - } - - emBits = kParam.getModulus().bitLength() - 1; - - if (emBits < (8 * hLen + 8 * sLen + 9)) - { - throw new IllegalArgumentException("key too small for specified hash and salt lengths"); - } - - block = new byte[(emBits + 7) / 8]; - - reset(); - } - - /** - * clear possible sensitive data - */ - private void clearBlock( - byte[] block) - { - for (int i = 0; i != block.length; i++) - { - block[i] = 0; - } - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte b) - { - contentDigest.update(b); - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] in, - int off, - int len) - { - contentDigest.update(in, off, len); - } - - /** - * reset the internal state - */ - public void reset() - { - contentDigest.reset(); - } - - /** - * generate a signature for the message we've been loaded with using - * the key we were initialised with. - */ - public byte[] generateSignature() - throws CryptoException, DataLengthException - { - contentDigest.doFinal(mDash, mDash.length - hLen - sLen); - - if (sLen != 0) - { - random.nextBytes(salt); - - System.arraycopy(salt, 0, mDash, mDash.length - sLen, sLen); - } - - byte[] h = new byte[hLen]; - - contentDigest.update(mDash, 0, mDash.length); - - contentDigest.doFinal(h, 0); - - block[block.length - sLen - 1 - hLen - 1] = 0x01; - System.arraycopy(salt, 0, block, block.length - sLen - hLen - 1, sLen); - - byte[] dbMask = maskGeneratorFunction1(h, 0, h.length, block.length - hLen - 1); - for (int i = 0; i != dbMask.length; i++) - { - block[i] ^= dbMask[i]; - } - - block[0] &= (0xff >> ((block.length * 8) - emBits)); - - System.arraycopy(h, 0, block, block.length - hLen - 1, hLen); - - block[block.length - 1] = trailer; - - byte[] b = cipher.processBlock(block, 0, block.length); - - clearBlock(block); - - return b; - } - - /** - * return true if the internal state represents the signature described - * in the passed in array. - */ - public boolean verifySignature( - byte[] signature) - { - contentDigest.doFinal(mDash, mDash.length - hLen - sLen); - - try - { - byte[] b = cipher.processBlock(signature, 0, signature.length); - System.arraycopy(b, 0, block, block.length - b.length, b.length); - } - catch (Exception e) - { - return false; - } - - if (block[block.length - 1] != trailer) - { - clearBlock(block); - return false; - } - - byte[] dbMask = maskGeneratorFunction1(block, block.length - hLen - 1, hLen, block.length - hLen - 1); - - for (int i = 0; i != dbMask.length; i++) - { - block[i] ^= dbMask[i]; - } - - block[0] &= (0xff >> ((block.length * 8) - emBits)); - - for (int i = 0; i != block.length - hLen - sLen - 2; i++) - { - if (block[i] != 0) - { - clearBlock(block); - return false; - } - } - - if (block[block.length - hLen - sLen - 2] != 0x01) - { - clearBlock(block); - return false; - } - - System.arraycopy(block, block.length - sLen - hLen - 1, mDash, mDash.length - sLen, sLen); - - contentDigest.update(mDash, 0, mDash.length); - contentDigest.doFinal(mDash, mDash.length - hLen); - - for (int i = block.length - hLen - 1, j = mDash.length - hLen; - j != mDash.length; i++, j++) - { - if ((block[i] ^ mDash[j]) != 0) - { - clearBlock(mDash); - clearBlock(block); - return false; - } - } - - clearBlock(mDash); - clearBlock(block); - - return true; - } - - /** - * int to octet string. - */ - private void ItoOSP( - int i, - byte[] sp) - { - sp[0] = (byte)(i >>> 24); - sp[1] = (byte)(i >>> 16); - sp[2] = (byte)(i >>> 8); - sp[3] = (byte)(i >>> 0); - } - - /** - * mask generator function, as described in PKCS1v2. - */ - private byte[] maskGeneratorFunction1( - byte[] Z, - int zOff, - int zLen, - int length) - { - byte[] mask = new byte[length]; - byte[] hashBuf = new byte[mgfhLen]; - byte[] C = new byte[4]; - int counter = 0; - - mgfDigest.reset(); - - while (counter < (length / mgfhLen)) - { - ItoOSP(counter, C); - - mgfDigest.update(Z, zOff, zLen); - mgfDigest.update(C, 0, C.length); - mgfDigest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * mgfhLen, mgfhLen); - - counter++; - } - - if ((counter * mgfhLen) < length) - { - ItoOSP(counter, C); - - mgfDigest.update(Z, zOff, zLen); - mgfDigest.update(C, 0, C.length); - mgfDigest.doFinal(hashBuf, 0); - - System.arraycopy(hashBuf, 0, mask, counter * mgfhLen, mask.length - (counter * mgfhLen)); - } - - return mask; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/RSADigestSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/RSADigestSigner.java deleted file mode 100644 index 9f30a8e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/signers/RSADigestSigner.java +++ /dev/null @@ -1,232 +0,0 @@ -package org.bc.crypto.signers; - -import java.io.IOException; -import java.util.Hashtable; - -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.DERNull; -import org.bc.asn1.nist.NISTObjectIdentifiers; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.teletrust.TeleTrusTObjectIdentifiers; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.DigestInfo; -import org.bc.asn1.x509.X509ObjectIdentifiers; -import org.bc.crypto.AsymmetricBlockCipher; -import org.bc.crypto.CipherParameters; -import org.bc.crypto.CryptoException; -import org.bc.crypto.DataLengthException; -import org.bc.crypto.Digest; -import org.bc.crypto.Signer; -import org.bc.crypto.encodings.PKCS1Encoding; -import org.bc.crypto.engines.RSABlindedEngine; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.util.Arrays; - -public class RSADigestSigner - implements Signer -{ - private final AsymmetricBlockCipher rsaEngine = new PKCS1Encoding(new RSABlindedEngine()); - private final AlgorithmIdentifier algId; - private final Digest digest; - private boolean forSigning; - - private static final Hashtable oidMap = new Hashtable(); - - /* - * Load OID table. - */ - static - { - oidMap.put("RIPEMD128", TeleTrusTObjectIdentifiers.ripemd128); - oidMap.put("RIPEMD160", TeleTrusTObjectIdentifiers.ripemd160); - oidMap.put("RIPEMD256", TeleTrusTObjectIdentifiers.ripemd256); - - oidMap.put("SHA-1", X509ObjectIdentifiers.id_SHA1); - oidMap.put("SHA-224", NISTObjectIdentifiers.id_sha224); - oidMap.put("SHA-256", NISTObjectIdentifiers.id_sha256); - oidMap.put("SHA-384", NISTObjectIdentifiers.id_sha384); - oidMap.put("SHA-512", NISTObjectIdentifiers.id_sha512); - - oidMap.put("MD2", PKCSObjectIdentifiers.md2); - oidMap.put("MD4", PKCSObjectIdentifiers.md4); - oidMap.put("MD5", PKCSObjectIdentifiers.md5); - } - - public RSADigestSigner( - Digest digest) - { - this.digest = digest; - - algId = new AlgorithmIdentifier((ASN1ObjectIdentifier)oidMap.get(digest.getAlgorithmName()), DERNull.INSTANCE); - } - - /** - * @deprecated - */ - public String getAlgorithmName() - { - return digest.getAlgorithmName() + "withRSA"; - } - - /** - * initialise the signer for signing or verification. - * - * @param forSigning - * true if for signing, false otherwise - * @param parameters - * necessary parameters. - */ - public void init( - boolean forSigning, - CipherParameters parameters) - { - this.forSigning = forSigning; - AsymmetricKeyParameter k; - - if (parameters instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)parameters; - } - - if (forSigning && !k.isPrivate()) - { - throw new IllegalArgumentException("signing requires private key"); - } - - if (!forSigning && k.isPrivate()) - { - throw new IllegalArgumentException("verification requires public key"); - } - - reset(); - - rsaEngine.init(forSigning, parameters); - } - - /** - * update the internal digest with the byte b - */ - public void update( - byte input) - { - digest.update(input); - } - - /** - * update the internal digest with the byte array in - */ - public void update( - byte[] input, - int inOff, - int length) - { - digest.update(input, inOff, length); - } - - /** - * Generate a signature for the message we've been loaded with using the key - * we were initialised with. - */ - public byte[] generateSignature() - throws CryptoException, DataLengthException - { - if (!forSigning) - { - throw new IllegalStateException("RSADigestSigner not initialised for signature generation."); - } - - byte[] hash = new byte[digest.getDigestSize()]; - digest.doFinal(hash, 0); - - try - { - byte[] data = derEncode(hash); - return rsaEngine.processBlock(data, 0, data.length); - } - catch (IOException e) - { - throw new CryptoException("unable to encode signature: " + e.getMessage(), e); - } - } - - /** - * return true if the internal state represents the signature described in - * the passed in array. - */ - public boolean verifySignature( - byte[] signature) - { - if (forSigning) - { - throw new IllegalStateException("RSADigestSigner not initialised for verification"); - } - - byte[] hash = new byte[digest.getDigestSize()]; - - digest.doFinal(hash, 0); - - byte[] sig; - byte[] expected; - - try - { - sig = rsaEngine.processBlock(signature, 0, signature.length); - expected = derEncode(hash); - } - catch (Exception e) - { - return false; - } - - if (sig.length == expected.length) - { - return Arrays.constantTimeAreEqual(sig, expected); - } - else if (sig.length == expected.length - 2) // NULL left out - { - int sigOffset = sig.length - hash.length - 2; - int expectedOffset = expected.length - hash.length - 2; - - expected[1] -= 2; // adjust lengths - expected[3] -= 2; - - int nonEqual = 0; - - for (int i = 0; i < hash.length; i++) - { - nonEqual |= (sig[sigOffset + i] ^ expected[expectedOffset + i]); - } - - for (int i = 0; i < sigOffset; i++) - { - nonEqual |= (sig[i] ^ expected[i]); // check header less NULL - } - - return nonEqual == 0; - } - else - { - return false; - } - } - - public void reset() - { - digest.reset(); - } - - private byte[] derEncode( - byte[] hash) - throws IOException - { - DigestInfo dInfo = new DigestInfo(algId, hash); - - return dInfo.getEncoded(ASN1Encoding.DER); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertDescription.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertDescription.java deleted file mode 100644 index a097b4b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertDescription.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 7.2 - */ -public class AlertDescription -{ - public static final short close_notify = 0; - public static final short unexpected_message = 10; - public static final short bad_record_mac = 20; - public static final short decryption_failed = 21; - public static final short record_overflow = 22; - public static final short decompression_failure = 30; - public static final short handshake_failure = 40; - /* no_certificate(41) is specific to SSLv3 */ - public static final short no_certificate = 41; - public static final short bad_certificate = 42; - public static final short unsupported_certificate = 43; - public static final short certificate_revoked = 44; - public static final short certificate_expired = 45; - public static final short certificate_unknown = 46; - public static final short illegal_parameter = 47; - public static final short unknown_ca = 48; - public static final short access_denied = 49; - public static final short decode_error = 50; - public static final short decrypt_error = 51; - public static final short export_restriction = 60; - public static final short protocol_version = 70; - public static final short insufficient_security = 71; - public static final short internal_error = 80; - public static final short user_canceled = 90; - public static final short no_renegotiation = 100; - - /* - * RFC 3546 - */ - public static final short unsupported_extension = 110; - public static final short certificate_unobtainable = 111; - public static final short unrecognized_name = 112; - public static final short bad_certificate_status_response = 113; - public static final short bad_certificate_hash_value = 114; - - /* - * RFC 4279 - */ - public static final short unknown_psk_identity = 115; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertLevel.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertLevel.java deleted file mode 100644 index ed3b794..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlertLevel.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 7.2 - */ -public class AlertLevel -{ - public static final short warning = 1; - public static final short fatal = 2; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlwaysValidVerifyer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlwaysValidVerifyer.java deleted file mode 100644 index 51420d1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/AlwaysValidVerifyer.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.tls; - -/** - * A certificate verifyer, that will always return true. - * - *

    - * DO NOT USE THIS FILE UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING.
    - * 
    - * - * @deprecated Perform certificate verification in TlsAuthentication implementation - */ -public class AlwaysValidVerifyer implements CertificateVerifyer -{ - /** - * Return true. - * - * @see org.bc.crypto.tls.CertificateVerifyer#isValid(org.bc.asn1.x509.Certificate[]) - */ - public boolean isValid(org.bc.asn1.x509.Certificate[] certs) - { - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ByteQueue.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ByteQueue.java deleted file mode 100644 index 8081aa2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ByteQueue.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.crypto.tls; - -/** - * A queue for bytes. This file could be more optimized. - */ -public class ByteQueue -{ - /** - * @return The smallest number which can be written as 2^x which is bigger than i. - */ - public static final int nextTwoPow(int i) - { - /* - * This code is based of a lot of code I found on the Internet which mostly - * referenced a book called "Hacking delight". - */ - i |= (i >> 1); - i |= (i >> 2); - i |= (i >> 4); - i |= (i >> 8); - i |= (i >> 16); - return i + 1; - } - - /** - * The initial size for our buffer. - */ - private static final int INITBUFSIZE = 1024; - - /** - * The buffer where we store our data. - */ - private byte[] databuf = new byte[ByteQueue.INITBUFSIZE]; - - /** - * How many bytes at the beginning of the buffer are skipped. - */ - private int skipped = 0; - - /** - * How many bytes in the buffer are valid data. - */ - private int available = 0; - - /** - * Read data from the buffer. - * - * @param buf The buffer where the read data will be copied to. - * @param offset How many bytes to skip at the beginning of buf. - * @param len How many bytes to read at all. - * @param skip How many bytes from our data to skip. - */ - public void read(byte[] buf, int offset, int len, int skip) - { - if ((available - skip) < len) - { - throw new TlsRuntimeException("Not enough data to read"); - } - if ((buf.length - offset) < len) - { - throw new TlsRuntimeException("Buffer size of " + buf.length - + " is too small for a read of " + len + " bytes"); - } - System.arraycopy(databuf, skipped + skip, buf, offset, len); - return; - } - - /** - * Add some data to our buffer. - * - * @param data A byte-array to read data from. - * @param offset How many bytes to skip at the beginning of the array. - * @param len How many bytes to read from the array. - */ - public void addData(byte[] data, int offset, int len) - { - if ((skipped + available + len) > databuf.length) - { - byte[] tmp = new byte[ByteQueue.nextTwoPow(data.length)]; - System.arraycopy(databuf, skipped, tmp, 0, available); - skipped = 0; - databuf = tmp; - } - System.arraycopy(data, offset, databuf, skipped + available, len); - available += len; - } - - /** - * Remove some bytes from our data from the beginning. - * - * @param i How many bytes to remove. - */ - public void removeData(int i) - { - if (i > available) - { - throw new TlsRuntimeException("Cannot remove " + i + " bytes, only got " + available); - } - - /* - * Skip the data. - */ - available -= i; - skipped += i; - - /* - * If more than half of our data is skipped, we will move the data in the buffer. - */ - if (skipped > (databuf.length / 2)) - { - System.arraycopy(databuf, skipped, databuf, 0, available); - skipped = 0; - } - } - - /** - * @return The number of bytes which are available in this buffer. - */ - public int size() - { - return available; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/Certificate.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/Certificate.java deleted file mode 100644 index 2eab412..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/Certificate.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Vector; - -import org.bc.asn1.ASN1Encoding; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Primitive; - -/** - * A representation for a certificate chain as used by a tls server. - */ -public class Certificate -{ - public static final Certificate EMPTY_CHAIN = new Certificate(new org.bc.asn1.x509.Certificate[0]); - - /** - * The certificates. - */ - protected org.bc.asn1.x509.Certificate[] certs; - - /** - * Parse the ServerCertificate message. - * - * @param is The stream where to parse from. - * @return A Certificate object with the certs, the server has sended. - * @throws IOException If something goes wrong during parsing. - */ - protected static Certificate parse(InputStream is) throws IOException - { - org.bc.asn1.x509.Certificate[] certs; - int left = TlsUtils.readUint24(is); - if (left == 0) - { - return EMPTY_CHAIN; - } - Vector tmp = new Vector(); - while (left > 0) - { - int size = TlsUtils.readUint24(is); - left -= 3 + size; - byte[] buf = new byte[size]; - TlsUtils.readFully(buf, is); - ByteArrayInputStream bis = new ByteArrayInputStream(buf); - ASN1InputStream ais = new ASN1InputStream(bis); - ASN1Primitive o = ais.readObject(); - tmp.addElement(org.bc.asn1.x509.Certificate.getInstance(o)); - if (bis.available() > 0) - { - throw new IllegalArgumentException( - "Sorry, there is garbage data left after the certificate"); - } - } - certs = new org.bc.asn1.x509.Certificate[tmp.size()]; - for (int i = 0; i < tmp.size(); i++) - { - certs[i] = (org.bc.asn1.x509.Certificate)tmp.elementAt(i); - } - return new Certificate(certs); - } - - /** - * Encodes version of the ClientCertificate message - * - * @param os stream to write the message to - * @throws IOException If something goes wrong - */ - protected void encode(OutputStream os) throws IOException - { - Vector encCerts = new Vector(); - int totalSize = 0; - for (int i = 0; i < this.certs.length; ++i) - { - byte[] encCert = certs[i].getEncoded(ASN1Encoding.DER); - encCerts.addElement(encCert); - totalSize += encCert.length + 3; - } - - TlsUtils.writeUint24(totalSize, os); - - for (int i = 0; i < encCerts.size(); ++i) - { - byte[] encCert = (byte[])encCerts.elementAt(i); - TlsUtils.writeOpaque24(encCert, os); - } - } - - /** - * Private constructor from a cert array. - * - * @param certs The certs the chain should contain. - */ - public Certificate(org.bc.asn1.x509.Certificate[] certs) - { - if (certs == null) - { - throw new IllegalArgumentException("'certs' cannot be null"); - } - - this.certs = certs; - } - - /** - * @return An array which contains the certs, this chain contains. - */ - public org.bc.asn1.x509.Certificate[] getCerts() - { - org.bc.asn1.x509.Certificate[] result = new org.bc.asn1.x509.Certificate[certs.length]; - System.arraycopy(certs, 0, result, 0, certs.length); - return result; - } - - public boolean isEmpty() - { - return certs.length == 0; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateRequest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateRequest.java deleted file mode 100644 index 1a32a51..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.crypto.tls; - -import java.util.Vector; - -public class CertificateRequest -{ - private short[] certificateTypes; - private Vector certificateAuthorities; - - public CertificateRequest(short[] certificateTypes, Vector certificateAuthorities) - { - this.certificateTypes = certificateTypes; - this.certificateAuthorities = certificateAuthorities; - } - - public short[] getCertificateTypes() - { - return certificateTypes; - } - - /** - * @return Vector of X500Name - */ - public Vector getCertificateAuthorities() - { - return certificateAuthorities; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateVerifyer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateVerifyer.java deleted file mode 100644 index 0d62c35..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CertificateVerifyer.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.crypto.tls; - -/** - * This should be implemented by any class which can find out, if a given certificate - * chain is being accepted by an client. - * - * @deprecated Perform certificate verification in TlsAuthentication implementation - */ -public interface CertificateVerifyer -{ - /** - * @param certs The certs, which are part of the chain. - * @return True, if the chain is accepted, false otherwise. - */ - public boolean isValid(org.bc.asn1.x509.Certificate[] certs); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CipherSuite.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CipherSuite.java deleted file mode 100644 index 69164c6..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CipherSuite.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 A.5 - */ -public class CipherSuite -{ - public static final int TLS_NULL_WITH_NULL_NULL = 0x0000; - public static final int TLS_RSA_WITH_NULL_MD5 = 0x0001; - public static final int TLS_RSA_WITH_NULL_SHA = 0x0002; - public static final int TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003; - public static final int TLS_RSA_WITH_RC4_128_MD5 = 0x0004; - public static final int TLS_RSA_WITH_RC4_128_SHA = 0x0005; - public static final int TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0x0006; - public static final int TLS_RSA_WITH_IDEA_CBC_SHA = 0x0007; - public static final int TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0008; - public static final int TLS_RSA_WITH_DES_CBC_SHA = 0x0009; - public static final int TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A; - public static final int TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x000B; - public static final int TLS_DH_DSS_WITH_DES_CBC_SHA = 0x000C; - public static final int TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D; - public static final int TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x000E; - public static final int TLS_DH_RSA_WITH_DES_CBC_SHA = 0x000F; - public static final int TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0010; - public static final int TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x0011; - public static final int TLS_DHE_DSS_WITH_DES_CBC_SHA = 0x0012; - public static final int TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013; - public static final int TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0014; - public static final int TLS_DHE_RSA_WITH_DES_CBC_SHA = 0x0015; - public static final int TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016; - public static final int TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = 0x0017; - public static final int TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018; - public static final int TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 0x0019; - public static final int TLS_DH_anon_WITH_DES_CBC_SHA = 0x001A; - public static final int TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0x001B; - - /* - * RFC 3268 - */ - public static final int TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F; - public static final int TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x0030; - public static final int TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x0031; - public static final int TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032; - public static final int TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033; - public static final int TLS_DH_anon_WITH_AES_128_CBC_SHA = 0x0034; - public static final int TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035; - public static final int TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x0036; - public static final int TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x0037; - public static final int TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038; - public static final int TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039; - public static final int TLS_DH_anon_WITH_AES_256_CBC_SHA = 0x003A; - - /* - * RFC 4279 - */ - public static final int TLS_PSK_WITH_RC4_128_SHA = 0x008A; - public static final int TLS_PSK_WITH_3DES_EDE_CBC_SHA = 0x008B; - public static final int TLS_PSK_WITH_AES_128_CBC_SHA = 0x008C; - public static final int TLS_PSK_WITH_AES_256_CBC_SHA = 0x008D; - public static final int TLS_DHE_PSK_WITH_RC4_128_SHA = 0x008E; - public static final int TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA = 0x008F; - public static final int TLS_DHE_PSK_WITH_AES_128_CBC_SHA = 0x0090; - public static final int TLS_DHE_PSK_WITH_AES_256_CBC_SHA = 0x0091; - public static final int TLS_RSA_PSK_WITH_RC4_128_SHA = 0x0092; - public static final int TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA = 0x0093; - public static final int TLS_RSA_PSK_WITH_AES_128_CBC_SHA = 0x0094; - public static final int TLS_RSA_PSK_WITH_AES_256_CBC_SHA = 0x0095; - - /* - * RFC 4492 - */ - public static final int TLS_ECDH_ECDSA_WITH_NULL_SHA = 0xC001; - public static final int TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0xC002; - public static final int TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC003; - public static final int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0xC004; - public static final int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0xC005; - public static final int TLS_ECDHE_ECDSA_WITH_NULL_SHA = 0xC006; - public static final int TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0xC007; - public static final int TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC008; - public static final int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009; - public static final int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A; - public static final int TLS_ECDH_RSA_WITH_NULL_SHA = 0xC00B; - public static final int TLS_ECDH_RSA_WITH_RC4_128_SHA = 0xC00C; - public static final int TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = 0xC00D; - public static final int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = 0xC00E; - public static final int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = 0xC00F; - public static final int TLS_ECDHE_RSA_WITH_NULL_SHA = 0xC010; - public static final int TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0xC011; - public static final int TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0xC012; - public static final int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013; - public static final int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014; - public static final int TLS_ECDH_anon_WITH_NULL_SHA = 0xC015; - public static final int TLS_ECDH_anon_WITH_RC4_128_SHA = 0xC016; - public static final int TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA = 0xC017; - public static final int TLS_ECDH_anon_WITH_AES_128_CBC_SHA = 0xC018; - public static final int TLS_ECDH_anon_WITH_AES_256_CBC_SHA = 0xC019; - - /* - * RFC 5054 - */ - public static final int TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0xC01A; - public static final int TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0xC01B; - public static final int TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = 0xC01C; - public static final int TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0xC01D; - public static final int TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0xC01E; - public static final int TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = 0xC01F; - public static final int TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0xC020; - public static final int TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0xC021; - public static final int TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = 0xC022; - - /* - * RFC 5289 - */ - public static final int TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023; - public static final int TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024; - public static final int TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC025; - public static final int TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC026; - public static final int TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027; - public static final int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028; - public static final int TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 = 0xC029; - public static final int TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 = 0xC02A; - public static final int TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B; - public static final int TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C; - public static final int TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02D; - public static final int TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02E; - public static final int TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F; - public static final int TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030; - public static final int TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0xC031; - public static final int TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0xC032; - - /* - * RFC 5746 - */ - public static final int TLS_EMPTY_RENEGOTIATION_INFO_SCSV = 0x00FF; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ClientCertificateType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ClientCertificateType.java deleted file mode 100644 index 920ad76..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ClientCertificateType.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 7.4.4 - */ -public class ClientCertificateType -{ - public static final short rsa_sign = 1; - public static final short dss_sign = 2; - public static final short rsa_fixed_dh = 3; - public static final short dss_fixed_dh = 4; - - /* - * RFC 4492 5.5 - */ - public static final short ecdsa_sign = 64; - public static final short rsa_fixed_ecdh = 65; - public static final short ecdsa_fixed_ecdh = 66; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CombinedHash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CombinedHash.java deleted file mode 100644 index 70af45b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CombinedHash.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.bc.crypto.tls; - -import org.bc.crypto.Digest; -import org.bc.crypto.digests.MD5Digest; -import org.bc.crypto.digests.SHA1Digest; - -/** - * A combined hash, which implements md5(m) || sha1(m). - */ -class CombinedHash implements Digest -{ - protected TlsClientContext context; - protected MD5Digest md5; - protected SHA1Digest sha1; - - CombinedHash() - { - this.md5 = new MD5Digest(); - this.sha1 = new SHA1Digest(); - } - - CombinedHash(TlsClientContext context) - { - this.context = context; - this.md5 = new MD5Digest(); - this.sha1 = new SHA1Digest(); - } - - CombinedHash(CombinedHash t) - { - this.context = t.context; - this.md5 = new MD5Digest(t.md5); - this.sha1 = new SHA1Digest(t.sha1); - } - - /** - * @see org.bc.crypto.Digest#getAlgorithmName() - */ - public String getAlgorithmName() - { - return md5.getAlgorithmName() + " and " + sha1.getAlgorithmName(); - } - - /** - * @see org.bc.crypto.Digest#getDigestSize() - */ - public int getDigestSize() - { - return 16 + 20; - } - - /** - * @see org.bc.crypto.Digest#update(byte) - */ - public void update(byte in) - { - md5.update(in); - sha1.update(in); - } - - /** - * @see org.bc.crypto.Digest#update(byte[],int,int) - */ - public void update(byte[] in, int inOff, int len) - { - md5.update(in, inOff, len); - sha1.update(in, inOff, len); - } - - /** - * @see org.bc.crypto.Digest#doFinal(byte[],int) - */ - public int doFinal(byte[] out, int outOff) - { - if (context != null) - { - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (!isTls) - { - ssl3Complete(md5, SSL3Mac.MD5_IPAD, SSL3Mac.MD5_OPAD); - ssl3Complete(sha1, SSL3Mac.SHA1_IPAD, SSL3Mac.SHA1_OPAD); - } - } - - int i1 = md5.doFinal(out, outOff); - int i2 = sha1.doFinal(out, outOff + 16); - return i1 + i2; - } - - /** - * @see org.bc.crypto.Digest#reset() - */ - public void reset() - { - md5.reset(); - sha1.reset(); - } - - protected void ssl3Complete(Digest d, byte[] ipad, byte[] opad) - { - byte[] secret = context.getSecurityParameters().masterSecret; - - d.update(secret, 0, secret.length); - d.update(ipad, 0, ipad.length); - - byte[] tmp = new byte[d.getDigestSize()]; - d.doFinal(tmp, 0); - - d.update(secret, 0, secret.length); - d.update(opad, 0, opad.length); - d.update(tmp, 0, tmp.length); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CompressionMethod.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CompressionMethod.java deleted file mode 100644 index 13e4853..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/CompressionMethod.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 6.1 - */ -public class CompressionMethod -{ - public static final short NULL = 0; - - /* - * RFC 3749 2 - */ - public static final short DEFLATE = 1; - - /* - * Values from 224 decimal (0xE0) through 255 decimal (0xFF) - * inclusive are reserved for private use. - */ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ContentType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ContentType.java deleted file mode 100644 index e4c13b0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ContentType.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 6.2.1 - */ -public class ContentType -{ - public static final short change_cipher_spec = 20; - public static final short alert = 21; - public static final short handshake = 22; - public static final short application_data = 23; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsAgreementCredentials.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsAgreementCredentials.java deleted file mode 100644 index 5b126d7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsAgreementCredentials.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.bc.crypto.tls; - -import java.math.BigInteger; - -import org.bc.crypto.BasicAgreement; -import org.bc.crypto.agreement.DHBasicAgreement; -import org.bc.crypto.agreement.ECDHBasicAgreement; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.util.BigIntegers; - -public class DefaultTlsAgreementCredentials implements TlsAgreementCredentials -{ - protected Certificate clientCert; - protected AsymmetricKeyParameter clientPrivateKey; - - protected BasicAgreement basicAgreement; - - public DefaultTlsAgreementCredentials(Certificate clientCertificate, AsymmetricKeyParameter clientPrivateKey) - { - if (clientCertificate == null) - { - throw new IllegalArgumentException("'clientCertificate' cannot be null"); - } - if (clientCertificate.certs.length == 0) - { - throw new IllegalArgumentException("'clientCertificate' cannot be empty"); - } - if (clientPrivateKey == null) - { - throw new IllegalArgumentException("'clientPrivateKey' cannot be null"); - } - if (!clientPrivateKey.isPrivate()) - { - throw new IllegalArgumentException("'clientPrivateKey' must be private"); - } - - if (clientPrivateKey instanceof DHPrivateKeyParameters) - { - basicAgreement = new DHBasicAgreement(); - } - else if (clientPrivateKey instanceof ECPrivateKeyParameters) - { - basicAgreement = new ECDHBasicAgreement(); - } - else - { - throw new IllegalArgumentException("'clientPrivateKey' type not supported: " - + clientPrivateKey.getClass().getName()); - } - - this.clientCert = clientCertificate; - this.clientPrivateKey = clientPrivateKey; - } - - public Certificate getCertificate() - { - return clientCert; - } - - public byte[] generateAgreement(AsymmetricKeyParameter serverPublicKey) - { - basicAgreement.init(clientPrivateKey); - BigInteger agreementValue = basicAgreement.calculateAgreement(serverPublicKey); - return BigIntegers.asUnsignedByteArray(agreementValue); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsCipherFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsCipherFactory.java deleted file mode 100644 index d933e70..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsCipherFactory.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.Digest; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.digests.MD5Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.digests.SHA256Digest; -import org.bc.crypto.digests.SHA384Digest; -import org.bc.crypto.engines.AESFastEngine; -import org.bc.crypto.engines.DESedeEngine; -import org.bc.crypto.engines.RC4Engine; -import org.bc.crypto.modes.CBCBlockCipher; - -public class DefaultTlsCipherFactory implements TlsCipherFactory -{ - public TlsCipher createCipher(TlsClientContext context, int encryptionAlgorithm, int digestAlgorithm) throws IOException - { - switch (encryptionAlgorithm) - { - case EncryptionAlgorithm._3DES_EDE_CBC: - return createDESedeCipher(context, 24, digestAlgorithm); - case EncryptionAlgorithm.AES_128_CBC: - return createAESCipher(context, 16, digestAlgorithm); - case EncryptionAlgorithm.AES_256_CBC: - return createAESCipher(context, 32, digestAlgorithm); - case EncryptionAlgorithm.RC4_128: - return createRC4Cipher(context, 16, digestAlgorithm); - default: - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - protected TlsCipher createAESCipher(TlsClientContext context, int cipherKeySize, int digestAlgorithm) throws IOException - { - return new TlsBlockCipher(context, createAESBlockCipher(), - createAESBlockCipher(), createDigest(digestAlgorithm), createDigest(digestAlgorithm), cipherKeySize); - } - - protected TlsCipher createRC4Cipher(TlsClientContext context, int cipherKeySize, int digestAlgorithm) throws IOException - { - return new TlsStreamCipher(context, createRC4StreamCipher(), createRC4StreamCipher(), - createDigest(digestAlgorithm), createDigest(digestAlgorithm), cipherKeySize); - } - - protected TlsCipher createDESedeCipher(TlsClientContext context, int cipherKeySize, int digestAlgorithm) throws IOException - { - return new TlsBlockCipher(context, createDESedeBlockCipher(), - createDESedeBlockCipher(), createDigest(digestAlgorithm), createDigest(digestAlgorithm), cipherKeySize); - } - - protected StreamCipher createRC4StreamCipher() - { - return new RC4Engine(); - } - - protected BlockCipher createAESBlockCipher() - { - return new CBCBlockCipher(new AESFastEngine()); - } - - protected BlockCipher createDESedeBlockCipher() - { - return new CBCBlockCipher(new DESedeEngine()); - } - - protected Digest createDigest(int digestAlgorithm) throws IOException - { - switch (digestAlgorithm) - { - case DigestAlgorithm.MD5: - return new MD5Digest(); - case DigestAlgorithm.SHA: - return new SHA1Digest(); - case DigestAlgorithm.SHA256: - return new SHA256Digest(); - case DigestAlgorithm.SHA384: - return new SHA384Digest(); - default: - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsClient.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsClient.java deleted file mode 100644 index f53cfe1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsClient.java +++ /dev/null @@ -1,264 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.util.Hashtable; - -public abstract class DefaultTlsClient implements TlsClient -{ - protected TlsCipherFactory cipherFactory; - - protected TlsClientContext context; - - protected int selectedCipherSuite; - protected int selectedCompressionMethod; - - public DefaultTlsClient() - { - this(new DefaultTlsCipherFactory()); - } - - public DefaultTlsClient(TlsCipherFactory cipherFactory) - { - this.cipherFactory = cipherFactory; - } - - public void init(TlsClientContext context) - { - this.context = context; - } - - public ProtocolVersion getClientVersion() - { - return ProtocolVersion.TLSv10; - } - - public int[] getCipherSuites() - { - return new int[] { - CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_RSA_WITH_RC4_128_SHA, - }; - } - - public Hashtable getClientExtensions() - { - return null; - } - - public short[] getCompressionMethods() - { - return new short[] { CompressionMethod.NULL }; - } - - public void notifyServerVersion(ProtocolVersion serverVersion) throws IOException - { - if (!ProtocolVersion.TLSv10.equals(serverVersion)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - - public void notifySessionID(byte[] sessionID) - { - // Currently ignored - } - - public void notifySelectedCipherSuite(int selectedCipherSuite) - { - this.selectedCipherSuite = selectedCipherSuite; - } - - public void notifySelectedCompressionMethod(short selectedCompressionMethod) - { - this.selectedCompressionMethod = selectedCompressionMethod; - } - - public void notifySecureRenegotiation(boolean secureRenegotiation) throws IOException - { - if (!secureRenegotiation) - { - /* - * RFC 5746 3.4. If the extension is not present, the server does not support - * secure renegotiation; set secure_renegotiation flag to FALSE. In this case, - * some clients may want to terminate the handshake instead of continuing; see - * Section 4.1 for discussion. - */ -// throw new TlsFatalAlert(AlertDescription.handshake_failure); - } - } - - public void processServerExtensions(Hashtable serverExtensions) - { - } - - public TlsKeyExchange getKeyExchange() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_RSA_WITH_RC4_128_SHA: - return createRSAKeyExchange(); - - case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA: - return createDHKeyExchange(KeyExchangeAlgorithm.DH_DSS); - - case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA: - return createDHKeyExchange(KeyExchangeAlgorithm.DH_RSA); - - case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA: - return createDHEKeyExchange(KeyExchangeAlgorithm.DHE_DSS); - - case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA: - return createDHEKeyExchange(KeyExchangeAlgorithm.DHE_RSA); - - case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA: - return createECDHKeyExchange(KeyExchangeAlgorithm.ECDH_ECDSA); - - case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA: - return createECDHEKeyExchange(KeyExchangeAlgorithm.ECDHE_ECDSA); - - case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA: - return createECDHKeyExchange(KeyExchangeAlgorithm.ECDH_RSA); - - case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA: - return createECDHEKeyExchange(KeyExchangeAlgorithm.ECDHE_RSA); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCompression getCompression() throws IOException - { - switch (selectedCompressionMethod) - { - case CompressionMethod.NULL: - return new TlsNullCompression(); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected compression method was in the list of client-offered compression - * methods, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCipher getCipher() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm._3DES_EDE_CBC, DigestAlgorithm.SHA); - - case CipherSuite.TLS_RSA_WITH_RC4_128_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.RC4_128, DigestAlgorithm.SHA); - - case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_128_CBC, DigestAlgorithm.SHA); - - case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_256_CBC, DigestAlgorithm.SHA); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - protected TlsKeyExchange createDHKeyExchange(int keyExchange) - { - return new TlsDHKeyExchange(context, keyExchange); - } - - protected TlsKeyExchange createDHEKeyExchange(int keyExchange) - { - return new TlsDHEKeyExchange(context, keyExchange); - } - - protected TlsKeyExchange createECDHKeyExchange(int keyExchange) - { - return new TlsECDHKeyExchange(context, keyExchange); - } - - protected TlsKeyExchange createECDHEKeyExchange(int keyExchange) - { - return new TlsECDHEKeyExchange(context, keyExchange); - } - - protected TlsKeyExchange createRSAKeyExchange() - { - return new TlsRSAKeyExchange(context); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsSignerCredentials.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsSignerCredentials.java deleted file mode 100644 index eb1ab8b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DefaultTlsSignerCredentials.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DSAPrivateKeyParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.RSAKeyParameters; - -public class DefaultTlsSignerCredentials implements TlsSignerCredentials -{ - protected TlsClientContext context; - protected Certificate clientCert; - protected AsymmetricKeyParameter clientPrivateKey; - - protected TlsSigner clientSigner; - - public DefaultTlsSignerCredentials(TlsClientContext context, Certificate clientCertificate, - AsymmetricKeyParameter clientPrivateKey) - { - if (clientCertificate == null) - { - throw new IllegalArgumentException("'clientCertificate' cannot be null"); - } - if (clientCertificate.certs.length == 0) - { - throw new IllegalArgumentException("'clientCertificate' cannot be empty"); - } - if (clientPrivateKey == null) - { - throw new IllegalArgumentException("'clientPrivateKey' cannot be null"); - } - if (!clientPrivateKey.isPrivate()) - { - throw new IllegalArgumentException("'clientPrivateKey' must be private"); - } - - if (clientPrivateKey instanceof RSAKeyParameters) - { - clientSigner = new TlsRSASigner(); - } - else if (clientPrivateKey instanceof DSAPrivateKeyParameters) - { - clientSigner = new TlsDSSSigner(); - } - else if (clientPrivateKey instanceof ECPrivateKeyParameters) - { - clientSigner = new TlsECDSASigner(); - } - else - { - throw new IllegalArgumentException("'clientPrivateKey' type not supported: " - + clientPrivateKey.getClass().getName()); - } - - this.context = context; - this.clientCert = clientCertificate; - this.clientPrivateKey = clientPrivateKey; - } - - public Certificate getCertificate() - { - return clientCert; - } - - public byte[] generateCertificateSignature(byte[] md5andsha1) throws IOException - { - try - { - return clientSigner.calculateRawSignature(context.getSecureRandom(), clientPrivateKey, - md5andsha1); - } - catch (CryptoException e) - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DigestAlgorithm.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DigestAlgorithm.java deleted file mode 100644 index 52617ae..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/DigestAlgorithm.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto.tls; - -public class DigestAlgorithm -{ - /* - * Note that the values here are implementation-specific and arbitrary. - * It is recommended not to depend on the particular values (e.g. serialization). - */ - public static final int NULL = 0; - public static final int MD5 = 1; - public static final int SHA = 2; - - /* - * RFC 5289 - */ - public static final int SHA256 = 3; - public static final int SHA384 = 4; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECCurveType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECCurveType.java deleted file mode 100644 index 8d291cc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECCurveType.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 4492 5.4 - */ -public class ECCurveType -{ - /** - * Indicates the elliptic curve domain parameters are conveyed verbosely, and the - * underlying finite field is a prime field. - */ - public static final short explicit_prime = 1; - - /** - * Indicates the elliptic curve domain parameters are conveyed verbosely, and the - * underlying finite field is a characteristic-2 field. - */ - public static final short explicit_char2 = 2; - - /** - * Indicates that a named curve is used. This option SHOULD be used when applicable. - */ - public static final short named_curve = 3; - - /* - * Values 248 through 255 are reserved for private use. - */ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECPointFormat.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECPointFormat.java deleted file mode 100644 index 5890367..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ECPointFormat.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 4492 5.1.2 - */ -public class ECPointFormat -{ - public static final short uncompressed = 0; - public static final short ansiX962_compressed_prime = 1; - public static final short ansiX962_compressed_char2 = 2; - - /* - * reserved (248..255) - */ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/EncryptionAlgorithm.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/EncryptionAlgorithm.java deleted file mode 100644 index 4656d19..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/EncryptionAlgorithm.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.crypto.tls; - -public class EncryptionAlgorithm -{ - /* - * Note that the values here are implementation-specific and arbitrary. - * It is recommended not to depend on the particular values (e.g. serialization). - */ - public static final int NULL = 0; - public static final int RC4_40 = 1; - public static final int RC4_128 = 2; - public static final int RC2_CBC_40 = 3; - public static final int IDEA_CBC = 4; - public static final int DES40_CBC = 5; - public static final int DES_CBC = 6; - public static final int _3DES_EDE_CBC = 7; - - /* - * RFC 3268 - */ - public static final int AES_128_CBC = 8; - public static final int AES_256_CBC = 9; - - /* - * RFC 5289 - */ - public static final int AES_128_GCM = 10; - public static final int AES_256_GCM = 11; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ExtensionType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ExtensionType.java deleted file mode 100644 index e781483..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ExtensionType.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 4366 2.3 - */ -public class ExtensionType -{ - public static final int server_name = 0; - public static final int max_fragment_length = 1; - public static final int client_certificate_url = 2; - public static final int trusted_ca_keys = 3; - public static final int truncated_hmac = 4; - public static final int status_request = 5; - - /* - * RFC 4492 - */ - public static final int elliptic_curves = 10; - public static final int ec_point_formats = 11; - - /* - * RFC 5054 2.8.1 - */ - public static final int srp = 12; - - /* - * RFC 5746 6 - */ - public static final int renegotiation_info = 0xff01; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/HandshakeType.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/HandshakeType.java deleted file mode 100644 index ab06fca..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/HandshakeType.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto.tls; - -/** - * RFC 2246 7.4 - */ -public class HandshakeType -{ - public static final short hello_request = 0; - public static final short client_hello = 1; - public static final short server_hello = 2; - public static final short certificate = 11; - public static final short server_key_exchange = 12; - public static final short certificate_request = 13; - public static final short server_hello_done = 14; - public static final short certificate_verify = 15; - public static final short client_key_exchange = 16; - public static final short finished = 20; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/KeyExchangeAlgorithm.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/KeyExchangeAlgorithm.java deleted file mode 100644 index 2936e1f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/KeyExchangeAlgorithm.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.bc.crypto.tls; - -public class KeyExchangeAlgorithm -{ - /* - * Note that the values here are implementation-specific and arbitrary. - * It is recommended not to depend on the particular values (e.g. serialization). - */ - public static final int NULL = 0; - public static final int RSA = 1; - public static final int RSA_EXPORT = 2; - public static final int DHE_DSS = 3; - public static final int DHE_DSS_EXPORT = 4; - public static final int DHE_RSA = 5; - public static final int DHE_RSA_EXPORT = 6; - public static final int DH_DSS = 7; - public static final int DH_DSS_EXPORT = 8; - public static final int DH_RSA = 9; - public static final int DH_RSA_EXPORT = 10; - public static final int DH_anon = 11; - public static final int DH_anon_EXPORT = 12; - public static final int PSK = 13; - public static final int DHE_PSK = 14; - public static final int RSA_PSK = 15; - public static final int ECDH_ECDSA = 16; - public static final int ECDHE_ECDSA = 17; - public static final int ECDH_RSA = 18; - public static final int ECDHE_RSA = 19; - public static final int ECDH_anon = 20; - public static final int SRP = 21; - public static final int SRP_DSS = 22; - public static final int SRP_RSA = 23; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsAuthentication.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsAuthentication.java deleted file mode 100644 index b4e24fa..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsAuthentication.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -/** - * A temporary class to wrap old CertificateVerifyer stuff for new TlsAuthentication - * - * @deprecated - */ -public class LegacyTlsAuthentication implements TlsAuthentication -{ - protected CertificateVerifyer verifyer; - - public LegacyTlsAuthentication(CertificateVerifyer verifyer) - { - this.verifyer = verifyer; - } - - public void notifyServerCertificate(Certificate serverCertificate) throws IOException - { - if (!this.verifyer.isValid(serverCertificate.getCerts())) - { - throw new TlsFatalAlert(AlertDescription.user_canceled); - } - } - - public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) - throws IOException - { - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsClient.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsClient.java deleted file mode 100644 index 4d290a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/LegacyTlsClient.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -/** - * A temporary class to use LegacyTlsAuthentication - * - * @deprecated - */ -public class LegacyTlsClient extends DefaultTlsClient -{ - /** @deprecated */ - protected CertificateVerifyer verifyer; - - /** - * @deprecated - */ - public LegacyTlsClient(CertificateVerifyer verifyer) - { - super(); - - this.verifyer = verifyer; - } - - public TlsAuthentication getAuthentication() throws IOException - { - return new LegacyTlsAuthentication(verifyer); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/NamedCurve.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/NamedCurve.java deleted file mode 100644 index f124de2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/NamedCurve.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.crypto.tls; - -import org.bc.asn1.sec.SECNamedCurves; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.crypto.params.ECDomainParameters; - -/** - * RFC 4492 5.1.1 - * - * The named curves defined here are those specified in SEC 2 [13]. Note that many of - * these curves are also recommended in ANSI X9.62 [7] and FIPS 186-2 [11]. Values 0xFE00 - * through 0xFEFF are reserved for private use. Values 0xFF01 and 0xFF02 indicate that the - * client supports arbitrary prime and characteristic-2 curves, respectively (the curve - * parameters must be encoded explicitly in ECParameters). - */ -public class NamedCurve -{ - public static final int sect163k1 = 1; - public static final int sect163r1 = 2; - public static final int sect163r2 = 3; - public static final int sect193r1 = 4; - public static final int sect193r2 = 5; - public static final int sect233k1 = 6; - public static final int sect233r1 = 7; - public static final int sect239k1 = 8; - public static final int sect283k1 = 9; - public static final int sect283r1 = 10; - public static final int sect409k1 = 11; - public static final int sect409r1 = 12; - public static final int sect571k1 = 13; - public static final int sect571r1 = 14; - public static final int secp160k1 = 15; - public static final int secp160r1 = 16; - public static final int secp160r2 = 17; - public static final int secp192k1 = 18; - public static final int secp192r1 = 19; - public static final int secp224k1 = 20; - public static final int secp224r1 = 21; - public static final int secp256k1 = 22; - public static final int secp256r1 = 23; - public static final int secp384r1 = 24; - public static final int secp521r1 = 25; - - /* - * reserved (0xFE00..0xFEFF) - */ - - public static final int arbitrary_explicit_prime_curves = 0xFF01; - public static final int arbitrary_explicit_char2_curves = 0xFF02; - - private static final String[] curveNames = new String[] { - "sect163k1", - "sect163r1", - "sect163r2", - "sect193r1", - "sect193r2", - "sect233k1", - "sect233r1", - "sect239k1", - "sect283k1", - "sect283r1", - "sect409k1", - "sect409r1", - "sect571k1", - "sect571r1", - "secp160k1", - "secp160r1", - "secp160r2", - "secp192k1", - "secp192r1", - "secp224k1", - "secp224r1", - "secp256k1", - "secp256r1", - "secp384r1", - "secp521r1", }; - - static ECDomainParameters getECParameters(int namedCurve) - { - int index = namedCurve - 1; - if (index < 0 || index >= curveNames.length) - { - return null; - } - - String curveName = curveNames[index]; - - // Lazily created the first time a particular curve is accessed - X9ECParameters ecP = SECNamedCurves.getByName(curveName); - - if (ecP == null) - { - return null; - } - - // It's a bit inefficient to do this conversion every time - return new ECDomainParameters(ecP.getCurve(), ecP.getG(), ecP.getN(), ecP.getH(), - ecP.getSeed()); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/PSKTlsClient.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/PSKTlsClient.java deleted file mode 100644 index a3e5dcb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/PSKTlsClient.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.util.Hashtable; - -public abstract class PSKTlsClient implements TlsClient -{ - protected TlsCipherFactory cipherFactory; - protected TlsPSKIdentity pskIdentity; - - protected TlsClientContext context; - - protected int selectedCompressionMethod; - protected int selectedCipherSuite; - - public PSKTlsClient(TlsPSKIdentity pskIdentity) - { - this(new DefaultTlsCipherFactory(), pskIdentity); - } - - public PSKTlsClient(TlsCipherFactory cipherFactory, TlsPSKIdentity pskIdentity) - { - this.cipherFactory = cipherFactory; - this.pskIdentity = pskIdentity; - } - - public ProtocolVersion getClientVersion() - { - return ProtocolVersion.TLSv10; - } - - public void init(TlsClientContext context) - { - this.context = context; - } - - public int[] getCipherSuites() - { - return new int[] { - CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA, - CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA, - CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_PSK_WITH_RC4_128_SHA, - }; - } - - public Hashtable getClientExtensions() throws IOException - { - return null; - } - - public short[] getCompressionMethods() - { - return new short[] { CompressionMethod.NULL }; - } - - public void notifyServerVersion(ProtocolVersion serverVersion) throws IOException - { - if (!ProtocolVersion.TLSv10.equals(serverVersion)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - - public void notifySessionID(byte[] sessionID) - { - // Currently ignored - } - - public void notifySelectedCipherSuite(int selectedCipherSuite) - { - this.selectedCipherSuite = selectedCipherSuite; - } - - public void notifySelectedCompressionMethod(short selectedCompressionMethod) - { - this.selectedCompressionMethod = selectedCompressionMethod; - } - - public void notifySecureRenegotiation(boolean secureRenegotiation) throws IOException - { - if (!secureRenegotiation) - { - /* - * RFC 5746 3.4. If the extension is not present, the server does not support - * secure renegotiation; set secure_renegotiation flag to FALSE. In this case, - * some clients may want to terminate the handshake instead of continuing; see - * Section 4.1 for discussion. - */ -// throw new TlsFatalAlert(AlertDescription.handshake_failure); - } - } - - public void processServerExtensions(Hashtable serverExtensions) - { - } - - public TlsKeyExchange getKeyExchange() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_PSK_WITH_RC4_128_SHA: - return createPSKKeyExchange(KeyExchangeAlgorithm.PSK); - - case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA: - return createPSKKeyExchange(KeyExchangeAlgorithm.RSA_PSK); - - case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA: - return createPSKKeyExchange(KeyExchangeAlgorithm.DHE_PSK); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCompression getCompression() throws IOException - { - switch (selectedCompressionMethod) - { - case CompressionMethod.NULL: - return new TlsNullCompression(); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected compression method was in the list of client-offered compression - * methods, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCipher getCipher() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm._3DES_EDE_CBC, - DigestAlgorithm.SHA); - - case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_128_CBC, - DigestAlgorithm.SHA); - - case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_256_CBC, - DigestAlgorithm.SHA); - - case CipherSuite.TLS_PSK_WITH_RC4_128_SHA: - case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA: - case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.RC4_128, - DigestAlgorithm.SHA); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - protected TlsKeyExchange createPSKKeyExchange(int keyExchange) - { - return new TlsPSKKeyExchange(context, keyExchange, pskIdentity); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ProtocolVersion.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ProtocolVersion.java deleted file mode 100644 index cba84ca..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/ProtocolVersion.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public class ProtocolVersion -{ - public static final ProtocolVersion SSLv3 = new ProtocolVersion(0x0300); - public static final ProtocolVersion TLSv10 = new ProtocolVersion(0x0301); - public static final ProtocolVersion TLSv11 = new ProtocolVersion(0x0302); - public static final ProtocolVersion TLSv12 = new ProtocolVersion(0x0303); - - private int version; - - private ProtocolVersion(int v) - { - version = v & 0xffff; - } - - public int getFullVersion() - { - return version; - } - - public int getMajorVersion() - { - return version >> 8; - } - - public int getMinorVersion() - { - return version & 0xff; - } - - public boolean equals(Object obj) - { - return this == obj; - } - - public int hashCode() - { - return version; - } - - public static ProtocolVersion get(int major, int minor) throws IOException - { - switch (major) - { - case 3: - switch (minor) - { - case 0: - return SSLv3; - case 1: - return TLSv10; - case 2: - return TLSv11; - case 3: - return TLSv12; - } - } - - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/RecordStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/RecordStream.java deleted file mode 100644 index 7e975bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/RecordStream.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.crypto.Digest; - -/** - * An implementation of the TLS 1.0 record layer, allowing downgrade to SSLv3. - */ -class RecordStream -{ - private TlsProtocolHandler handler; - private InputStream is; - private OutputStream os; - private TlsCompression readCompression = null; - private TlsCompression writeCompression = null; - private TlsCipher readCipher = null; - private TlsCipher writeCipher = null; - private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - - private TlsClientContext context = null; - private CombinedHash hash = null; - - RecordStream(TlsProtocolHandler handler, InputStream is, OutputStream os) - { - this.handler = handler; - this.is = is; - this.os = os; - this.readCompression = new TlsNullCompression(); - this.writeCompression = this.readCompression; - this.readCipher = new TlsNullCipher(); - this.writeCipher = this.readCipher; - } - - void init(TlsClientContext context) - { - this.context = context; - this.hash = new CombinedHash(context); - } - - void clientCipherSpecDecided(TlsCompression tlsCompression, TlsCipher tlsCipher) - { - this.writeCompression = tlsCompression; - this.writeCipher = tlsCipher; - } - - void serverClientSpecReceived() - { - this.readCompression = this.writeCompression; - this.readCipher = this.writeCipher; - } - - public void readData() throws IOException - { - short type = TlsUtils.readUint8(is); - - // TODO In light of versioning and SSLv3, what should we expect here? - ProtocolVersion expectedVersion = ProtocolVersion.TLSv10; //context.getServerVersion(); - if (!expectedVersion.equals(TlsUtils.readVersion(is))) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - - int size = TlsUtils.readUint16(is); - byte[] buf = decodeAndVerify(type, is, size); - handler.processData(type, buf, 0, buf.length); - } - - protected byte[] decodeAndVerify(short type, InputStream is, int len) throws IOException - { - byte[] buf = new byte[len]; - TlsUtils.readFully(buf, is); - byte[] decoded = readCipher.decodeCiphertext(type, buf, 0, buf.length); - - OutputStream cOut = readCompression.decompress(buffer); - - if (cOut == buffer) - { - return decoded; - } - - cOut.write(decoded, 0, decoded.length); - cOut.flush(); - return getBufferContents(); - } - - protected void writeMessage(short type, byte[] message, int offset, int len) throws IOException - { - if (type == ContentType.handshake) - { - updateHandshakeData(message, offset, len); - } - - OutputStream cOut = writeCompression.compress(buffer); - - byte[] ciphertext; - if (cOut == buffer) - { - ciphertext = writeCipher.encodePlaintext(type, message, offset, len); - } - else - { - cOut.write(message, offset, len); - cOut.flush(); - byte[] compressed = getBufferContents(); - ciphertext = writeCipher.encodePlaintext(type, compressed, 0, compressed.length); - } - - byte[] writeMessage = new byte[ciphertext.length + 5]; - TlsUtils.writeUint8(type, writeMessage, 0); - // TODO In light of versioning, what should we send here? -// TlsUtils.writeVersion(context.getServerVersion(), writeMessage, 1); - TlsUtils.writeVersion(ProtocolVersion.TLSv10, writeMessage, 1); - TlsUtils.writeUint16(ciphertext.length, writeMessage, 3); - System.arraycopy(ciphertext, 0, writeMessage, 5, ciphertext.length); - os.write(writeMessage); - os.flush(); - } - - void updateHandshakeData(byte[] message, int offset, int len) - { - hash.update(message, offset, len); - } - - /** - * 'sender' only relevant to SSLv3 - */ - byte[] getCurrentHash(byte[] sender) - { - Digest d = new CombinedHash(hash); - - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (!isTls) - { - if (sender != null) - { - d.update(sender, 0, sender.length); - } - } - - return doFinal(d); - } - - protected void close() throws IOException - { - IOException e = null; - try - { - is.close(); - } - catch (IOException ex) - { - e = ex; - } - try - { - os.close(); - } - catch (IOException ex) - { - e = ex; - } - if (e != null) - { - throw e; - } - } - - protected void flush() throws IOException - { - os.flush(); - } - - private byte[] getBufferContents() - { - byte[] contents = buffer.toByteArray(); - buffer.reset(); - return contents; - } - - private static byte[] doFinal(Digest d) - { - byte[] bs = new byte[d.getDigestSize()]; - d.doFinal(bs, 0); - return bs; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SRPTlsClient.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SRPTlsClient.java deleted file mode 100644 index 08a4199..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SRPTlsClient.java +++ /dev/null @@ -1,203 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Hashtable; - -import org.bc.util.Arrays; -import org.bc.util.Integers; - -public abstract class SRPTlsClient - implements TlsClient -{ - public static final Integer EXT_SRP = Integers.valueOf(ExtensionType.srp); - - protected TlsCipherFactory cipherFactory; - protected byte[] identity; - protected byte[] password; - - protected TlsClientContext context; - - protected int selectedCompressionMethod; - protected int selectedCipherSuite; - - public SRPTlsClient(byte[] identity, byte[] password) - { - this(new DefaultTlsCipherFactory(), identity, password); - } - - public SRPTlsClient(TlsCipherFactory cipherFactory, byte[] identity, byte[] password) - { - this.cipherFactory = cipherFactory; - this.identity = Arrays.clone(identity); - this.password = Arrays.clone(password); - } - - public void init(TlsClientContext context) - { - this.context = context; - } - - public ProtocolVersion getClientVersion() - { - return ProtocolVersion.TLSv10; - } - - public int[] getCipherSuites() - { - return new int[] { - CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, - CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA, - CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA, }; - } - - public Hashtable getClientExtensions() throws IOException - { - Hashtable clientExtensions = new Hashtable(); - - ByteArrayOutputStream srpData = new ByteArrayOutputStream(); - TlsUtils.writeOpaque8(this.identity, srpData); - clientExtensions.put(EXT_SRP, srpData.toByteArray()); - - return clientExtensions; - } - - public short[] getCompressionMethods() - { - return new short[] { CompressionMethod.NULL }; - } - - public void notifyServerVersion(ProtocolVersion serverVersion) throws IOException - { - if (!ProtocolVersion.TLSv10.equals(serverVersion)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - - public void notifySessionID(byte[] sessionID) - { - // Currently ignored - } - - public void notifySelectedCipherSuite(int selectedCipherSuite) - { - this.selectedCipherSuite = selectedCipherSuite; - } - - public void notifySelectedCompressionMethod(short selectedCompressionMethod) - { - this.selectedCompressionMethod = selectedCompressionMethod; - } - - public void notifySecureRenegotiation(boolean secureRenegotiation) throws IOException - { - if (!secureRenegotiation) - { - /* - * RFC 5746 3.4. If the extension is not present, the server does not support - * secure renegotiation; set secure_renegotiation flag to FALSE. In this case, - * some clients may want to terminate the handshake instead of continuing; see - * Section 4.1 for discussion. - */ -// throw new TlsFatalAlert(AlertDescription.handshake_failure); - } - } - - public void processServerExtensions(Hashtable serverExtensions) - { - // There is no server response for the SRP extension - } - - public TlsKeyExchange getKeyExchange() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA: - return createSRPKeyExchange(KeyExchangeAlgorithm.SRP); - - case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA: - return createSRPKeyExchange(KeyExchangeAlgorithm.SRP_RSA); - - case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA: - return createSRPKeyExchange(KeyExchangeAlgorithm.SRP_DSS); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCompression getCompression() throws IOException - { - switch (selectedCompressionMethod) - { - case CompressionMethod.NULL: - return new TlsNullCompression(); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected compression method was in the list of client-offered compression - * methods, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public TlsCipher getCipher() throws IOException - { - switch (selectedCipherSuite) - { - case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm._3DES_EDE_CBC, - DigestAlgorithm.SHA); - - case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_128_CBC, - DigestAlgorithm.SHA); - - case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA: - case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA: - return cipherFactory.createCipher(context, EncryptionAlgorithm.AES_256_CBC, - DigestAlgorithm.SHA); - - default: - /* - * Note: internal error here; the TlsProtocolHandler verifies that the - * server-selected cipher suite was in the list of client-offered cipher - * suites, so if we now can't produce an implementation, we shouldn't have - * offered it! - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - protected TlsKeyExchange createSRPKeyExchange(int keyExchange) - { - return new TlsSRPKeyExchange(context, keyExchange, identity, password); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SSL3Mac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SSL3Mac.java deleted file mode 100644 index bd3de6c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SSL3Mac.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.crypto.tls; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.Mac; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Arrays; - -/** - * HMAC implementation based on original internet draft for HMAC (RFC 2104) - * - * The difference is that padding is concatentated versus XORed with the key - * - * H(K + opad, H(K + ipad, text)) - */ -public class SSL3Mac implements Mac -{ - private final static byte IPAD = (byte)0x36; - private final static byte OPAD = (byte)0x5C; - - static final byte[] MD5_IPAD = genPad(IPAD, 48); - static final byte[] MD5_OPAD = genPad(OPAD, 48); - static final byte[] SHA1_IPAD = genPad(IPAD, 40); - static final byte[] SHA1_OPAD = genPad(OPAD, 40); - - private Digest digest; - - private byte[] secret; - private byte[] ipad, opad; - - /** - * Base constructor for one of the standard digest algorithms that the byteLength of - * the algorithm is know for. Behaviour is undefined for digests other than MD5 or SHA1. - * - * @param digest the digest. - */ - public SSL3Mac(Digest digest) - { - this.digest = digest; - - if (digest.getDigestSize() == 20) - { - this.ipad = SHA1_IPAD; - this.opad = SHA1_OPAD; - } - else - { - this.ipad = MD5_IPAD; - this.opad = MD5_OPAD; - } - } - - public String getAlgorithmName() - { - return digest.getAlgorithmName() + "/SSL3MAC"; - } - - public Digest getUnderlyingDigest() - { - return digest; - } - - public void init(CipherParameters params) - { - secret = Arrays.clone(((KeyParameter)params).getKey()); - - reset(); - } - - public int getMacSize() - { - return digest.getDigestSize(); - } - - public void update(byte in) - { - digest.update(in); - } - - public void update(byte[] in, int inOff, int len) - { - digest.update(in, inOff, len); - } - - public int doFinal(byte[] out, int outOff) - { - byte[] tmp = new byte[digest.getDigestSize()]; - digest.doFinal(tmp, 0); - - digest.update(secret, 0, secret.length); - digest.update(opad, 0, opad.length); - digest.update(tmp, 0, tmp.length); - - int len = digest.doFinal(out, outOff); - - reset(); - - return len; - } - - /** - * Reset the mac generator. - */ - public void reset() - { - digest.reset(); - digest.update(secret, 0, secret.length); - digest.update(ipad, 0, ipad.length); - } - - private static byte[] genPad(byte b, int count) - { - byte[] padding = new byte[count]; - Arrays.fill(padding, b); - return padding; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SecurityParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SecurityParameters.java deleted file mode 100644 index 64525f8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/SecurityParameters.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.crypto.tls; - -public class SecurityParameters -{ - byte[] clientRandom = null; - byte[] serverRandom = null; - byte[] masterSecret = null; - - public byte[] getClientRandom() - { - return clientRandom; - } - - public byte[] getServerRandom() - { - return serverRandom; - } - - public byte[] getMasterSecret() - { - return masterSecret; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAgreementCredentials.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAgreementCredentials.java deleted file mode 100644 index dbfa3e7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAgreementCredentials.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -public interface TlsAgreementCredentials extends TlsCredentials -{ - byte[] generateAgreement(AsymmetricKeyParameter serverPublicKey) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAuthentication.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAuthentication.java deleted file mode 100644 index 36e1e84..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsAuthentication.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public interface TlsAuthentication -{ - /** - * Called by the protocol handler to report the server certificate - * Note: this method is responsible for certificate verification and validation - * - * @param serverCertificate the server certificate received - * @throws IOException - */ - void notifyServerCertificate(Certificate serverCertificate) throws IOException; - - /** - * Return client credentials in response to server's certificate request - * - * @param certificateRequest details of the certificate request - * @return a TlsCredentials object or null for no client authentication - * @throws IOException - */ - TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsBlockCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsBlockCipher.java deleted file mode 100644 index 2db7d58..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsBlockCipher.java +++ /dev/null @@ -1,229 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.security.SecureRandom; - -import org.bc.crypto.BlockCipher; -import org.bc.crypto.Digest; -import org.bc.crypto.params.KeyParameter; -import org.bc.crypto.params.ParametersWithIV; -import org.bc.util.Arrays; - -/** - * A generic TLS 1.0 / SSLv3 block cipher. - * This can be used for AES or 3DES for example. - */ -public class TlsBlockCipher implements TlsCipher -{ - protected TlsClientContext context; - protected byte[] randomData; - - protected BlockCipher encryptCipher; - protected BlockCipher decryptCipher; - - protected TlsMac writeMac; - protected TlsMac readMac; - - public TlsMac getWriteMac() - { - return writeMac; - } - - public TlsMac getReadMac() - { - return readMac; - } - - public TlsBlockCipher(TlsClientContext context, BlockCipher encryptCipher, - BlockCipher decryptCipher, Digest writeDigest, Digest readDigest, int cipherKeySize) - { - this.context = context; - - this.randomData = new byte[256]; - context.getSecureRandom().nextBytes(randomData); - - this.encryptCipher = encryptCipher; - this.decryptCipher = decryptCipher; - - int key_block_size = (2 * cipherKeySize) + writeDigest.getDigestSize() - + readDigest.getDigestSize() + encryptCipher.getBlockSize() - + decryptCipher.getBlockSize(); - - byte[] key_block = TlsUtils.calculateKeyBlock(context, key_block_size); - - int offset = 0; - - // Init MACs - writeMac = new TlsMac(context, writeDigest, key_block, offset, writeDigest.getDigestSize()); - offset += writeDigest.getDigestSize(); - readMac = new TlsMac(context, readDigest, key_block, offset, readDigest.getDigestSize()); - offset += readDigest.getDigestSize(); - - // Init Ciphers - this.initCipher(true, encryptCipher, key_block, cipherKeySize, offset, offset - + (cipherKeySize * 2)); - offset += cipherKeySize; - this.initCipher(false, decryptCipher, key_block, cipherKeySize, offset, offset - + cipherKeySize + encryptCipher.getBlockSize()); - } - - protected void initCipher(boolean forEncryption, BlockCipher cipher, byte[] key_block, - int key_size, int key_offset, int iv_offset) - { - KeyParameter key_parameter = new KeyParameter(key_block, key_offset, key_size); - ParametersWithIV parameters_with_iv = new ParametersWithIV(key_parameter, key_block, - iv_offset, cipher.getBlockSize()); - cipher.init(forEncryption, parameters_with_iv); - } - - public byte[] encodePlaintext(short type, byte[] plaintext, int offset, int len) - { - int blocksize = encryptCipher.getBlockSize(); - int padding_length = blocksize - 1 - ((len + writeMac.getSize()) % blocksize); - - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - // Add a random number of extra blocks worth of padding - int maxExtraPadBlocks = (255 - padding_length) / blocksize; - int actualExtraPadBlocks = chooseExtraPadBlocks(context.getSecureRandom(), maxExtraPadBlocks); - padding_length += actualExtraPadBlocks * blocksize; - } - - int totalsize = len + writeMac.getSize() + padding_length + 1; - byte[] outbuf = new byte[totalsize]; - System.arraycopy(plaintext, offset, outbuf, 0, len); - byte[] mac = writeMac.calculateMac(type, plaintext, offset, len); - System.arraycopy(mac, 0, outbuf, len, mac.length); - int paddoffset = len + mac.length; - for (int i = 0; i <= padding_length; i++) - { - outbuf[i + paddoffset] = (byte)padding_length; - } - for (int i = 0; i < totalsize; i += blocksize) - { - encryptCipher.processBlock(outbuf, i, outbuf, i); - } - return outbuf; - } - - public byte[] decodeCiphertext(short type, byte[] ciphertext, int offset, int len) - throws IOException - { - int blockSize = decryptCipher.getBlockSize(); - int macSize = readMac.getSize(); - - /* - * TODO[TLS 1.1] Explicit IV implies minLen = blockSize + max(blockSize, macSize + 1), - * and will need further changes to offset and plen variables below. - */ - - int minLen = Math.max(blockSize, macSize + 1); - if (len < minLen) - { - throw new TlsFatalAlert(AlertDescription.decode_error); - } - - if (len % blockSize != 0) - { - throw new TlsFatalAlert(AlertDescription.decryption_failed); - } - - for (int i = 0; i < len; i += blockSize) - { - decryptCipher.processBlock(ciphertext, offset + i, ciphertext, offset + i); - } - - int plen = len; - - // If there's anything wrong with the padding, this will return zero - int totalPad = checkPaddingConstantTime(ciphertext, offset, plen, blockSize, macSize); - - int macInputLen = plen - totalPad - macSize; - - byte[] decryptedMac = Arrays.copyOfRange(ciphertext, offset + macInputLen, offset + macInputLen + macSize); - byte[] calculatedMac = readMac.calculateMacConstantTime(type, ciphertext, offset, macInputLen, plen - macSize, randomData); - - boolean badMac = !Arrays.constantTimeAreEqual(calculatedMac, decryptedMac); - - if (badMac || totalPad == 0) - { - throw new TlsFatalAlert(AlertDescription.bad_record_mac); - } - - return Arrays.copyOfRange(ciphertext, offset, offset + macInputLen); - } - - protected int checkPaddingConstantTime(byte[] buf, int off, int len, int blockSize, int macSize) - { - int end = off + len; - byte lastByte = buf[end - 1]; - int padlen = lastByte & 0xff; - int totalPad = padlen + 1; - - int dummyIndex = 0; - byte padDiff = 0; - - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if ((!isTls && totalPad > blockSize) || (macSize + totalPad > len)) - { - totalPad = 0; - } - else - { - int padPos = end - totalPad; - do - { - padDiff |= (buf[padPos++] ^ lastByte); - } - while (padPos < end); - - dummyIndex = totalPad; - - if (padDiff != 0) - { - totalPad = 0; - } - } - - // Run some extra dummy checks so the number of checks is always constant - { - byte[] dummyPad = randomData; - while (dummyIndex < 256) - { - padDiff |= (dummyPad[dummyIndex++] ^ lastByte); - } - // Ensure the above loop is not eliminated - dummyPad[0] ^= padDiff; - } - - return totalPad; - } - - protected int chooseExtraPadBlocks(SecureRandom r, int max) - { -// return r.nextInt(max + 1); - - int x = r.nextInt(); - int n = lowestBitSet(x); - return Math.min(n, max); - } - - protected int lowestBitSet(int x) - { - if (x == 0) - { - return 32; - } - - int n = 0; - while ((x & 1) == 0) - { - ++n; - x >>= 1; - } - return n; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipher.java deleted file mode 100644 index bcff141..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipher.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public interface TlsCipher -{ - byte[] encodePlaintext(short type, byte[] plaintext, int offset, int len) throws IOException; - - byte[] decodeCiphertext(short type, byte[] ciphertext, int offset, int len) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipherFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipherFactory.java deleted file mode 100644 index 43abef9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCipherFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public interface TlsCipherFactory -{ - /** - * See enumeration classes EncryptionAlgorithm and DigestAlgorithm for appropriate argument values - */ - TlsCipher createCipher(TlsClientContext context, int encryptionAlgorithm, int digestAlgorithm) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClient.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClient.java deleted file mode 100644 index c67ff99..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClient.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.util.Hashtable; - -public interface TlsClient -{ - void init(TlsClientContext context); - - ProtocolVersion getClientVersion(); - - int[] getCipherSuites(); - - short[] getCompressionMethods(); - - // Hashtable is (Integer -> byte[]) - Hashtable getClientExtensions() throws IOException; - - void notifyServerVersion(ProtocolVersion selectedVersion) throws IOException; - - void notifySessionID(byte[] sessionID); - - void notifySelectedCipherSuite(int selectedCipherSuite); - - void notifySelectedCompressionMethod(short selectedCompressionMethod); - - void notifySecureRenegotiation(boolean secureNegotiation) throws IOException; - - // Hashtable is (Integer -> byte[]) - void processServerExtensions(Hashtable serverExtensions); - - TlsKeyExchange getKeyExchange() throws IOException; - - TlsAuthentication getAuthentication() throws IOException; - - TlsCompression getCompression() throws IOException; - - TlsCipher getCipher() throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContext.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContext.java deleted file mode 100644 index 57d9277..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContext.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.crypto.tls; - -import java.security.SecureRandom; - -public interface TlsClientContext -{ - SecureRandom getSecureRandom(); - - SecurityParameters getSecurityParameters(); - - ProtocolVersion getClientVersion(); - - ProtocolVersion getServerVersion(); - - Object getUserObject(); - - void setUserObject(Object userObject); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContextImpl.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContextImpl.java deleted file mode 100644 index 7f165d9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsClientContextImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.bc.crypto.tls; - -import java.security.SecureRandom; - -class TlsClientContextImpl implements TlsClientContext -{ - private SecureRandom secureRandom; - private SecurityParameters securityParameters; - - private ProtocolVersion clientVersion = null; - private ProtocolVersion serverVersion = null; - private Object userObject = null; - - TlsClientContextImpl(SecureRandom secureRandom, SecurityParameters securityParameters) - { - this.secureRandom = secureRandom; - this.securityParameters = securityParameters; - } - - public SecureRandom getSecureRandom() - { - return secureRandom; - } - - public SecurityParameters getSecurityParameters() - { - return securityParameters; - } - - public ProtocolVersion getClientVersion() - { - return clientVersion; - } - - public void setClientVersion(ProtocolVersion clientVersion) - { - this.clientVersion = clientVersion; - } - - public ProtocolVersion getServerVersion() - { - return serverVersion; - } - - public void setServerVersion(ProtocolVersion serverVersion) - { - this.serverVersion = serverVersion; - } - - public Object getUserObject() - { - return userObject; - } - - public void setUserObject(Object userObject) - { - this.userObject = userObject; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCompression.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCompression.java deleted file mode 100644 index 836adc4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCompression.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.OutputStream; - -public interface TlsCompression -{ - OutputStream compress(OutputStream output); - - OutputStream decompress(OutputStream output); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCredentials.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCredentials.java deleted file mode 100644 index d7d678d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsCredentials.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bc.crypto.tls; - -public interface TlsCredentials -{ - Certificate getCertificate(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHEKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHEKeyExchange.java deleted file mode 100644 index 2b43268..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHEKeyExchange.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; - -import org.bc.crypto.Signer; -import org.bc.crypto.io.SignerInputStream; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPublicKeyParameters; - -class TlsDHEKeyExchange extends TlsDHKeyExchange -{ - TlsDHEKeyExchange(TlsClientContext context, int keyExchange) - { - super(context, keyExchange); - } - - public void skipServerKeyExchange() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerKeyExchange(InputStream is) - throws IOException - { - SecurityParameters securityParameters = context.getSecurityParameters(); - - Signer signer = initSigner(tlsSigner, securityParameters); - InputStream sigIn = new SignerInputStream(is, signer); - - byte[] pBytes = TlsUtils.readOpaque16(sigIn); - byte[] gBytes = TlsUtils.readOpaque16(sigIn); - byte[] YsBytes = TlsUtils.readOpaque16(sigIn); - - byte[] sigByte = TlsUtils.readOpaque16(is); - if (!signer.verifySignature(sigByte)) - { - throw new TlsFatalAlert(AlertDescription.bad_certificate); - } - - BigInteger p = new BigInteger(1, pBytes); - BigInteger g = new BigInteger(1, gBytes); - BigInteger Ys = new BigInteger(1, YsBytes); - - this.dhAgreeServerPublicKey = validateDHPublicKey(new DHPublicKeyParameters(Ys, - new DHParameters(p, g))); - } - - protected Signer initSigner(TlsSigner tlsSigner, SecurityParameters securityParameters) - { - Signer signer = tlsSigner.createVerifyer(this.serverPublicKey); - signer.update(securityParameters.clientRandom, 0, securityParameters.clientRandom.length); - signer.update(securityParameters.serverRandom, 0, securityParameters.serverRandom.length); - return signer; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHKeyExchange.java deleted file mode 100644 index 3b488f0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHKeyExchange.java +++ /dev/null @@ -1,210 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.math.BigInteger; - -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.crypto.util.PublicKeyFactory; - -/** - * TLS 1.0 DH key exchange. - */ -class TlsDHKeyExchange implements TlsKeyExchange -{ - protected static final BigInteger ONE = BigInteger.valueOf(1); - protected static final BigInteger TWO = BigInteger.valueOf(2); - - protected TlsClientContext context; - protected int keyExchange; - protected TlsSigner tlsSigner; - - protected AsymmetricKeyParameter serverPublicKey = null; - protected DHPublicKeyParameters dhAgreeServerPublicKey = null; - protected TlsAgreementCredentials agreementCredentials; - protected DHPrivateKeyParameters dhAgreeClientPrivateKey = null; - - TlsDHKeyExchange(TlsClientContext context, int keyExchange) - { - switch (keyExchange) - { - case KeyExchangeAlgorithm.DH_RSA: - case KeyExchangeAlgorithm.DH_DSS: - this.tlsSigner = null; - break; - case KeyExchangeAlgorithm.DHE_RSA: - this.tlsSigner = new TlsRSASigner(); - break; - case KeyExchangeAlgorithm.DHE_DSS: - this.tlsSigner = new TlsDSSSigner(); - break; - default: - throw new IllegalArgumentException("unsupported key exchange algorithm"); - } - - this.context = context; - this.keyExchange = keyExchange; - } - - public void skipServerCertificate() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerCertificate(Certificate serverCertificate) throws IOException - { - org.bc.asn1.x509.Certificate x509Cert = serverCertificate.certs[0]; - SubjectPublicKeyInfo keyInfo = x509Cert.getSubjectPublicKeyInfo(); - - try - { - this.serverPublicKey = PublicKeyFactory.createKey(keyInfo); - } - catch (RuntimeException e) - { - throw new TlsFatalAlert(AlertDescription.unsupported_certificate); - } - - if (tlsSigner == null) - { - try - { - this.dhAgreeServerPublicKey = validateDHPublicKey((DHPublicKeyParameters)this.serverPublicKey); - } - catch (ClassCastException e) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.keyAgreement); - } - else - { - if (!tlsSigner.isValidPublicKey(this.serverPublicKey)) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.digitalSignature); - } - - // TODO - /* - * Perform various checks per RFC2246 7.4.2: "Unless otherwise specified, the - * signing algorithm for the certificate must be the same as the algorithm for the - * certificate key." - */ - } - - public void skipServerKeyExchange() throws IOException - { - // OK - } - - public void processServerKeyExchange(InputStream is) - throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - short[] types = certificateRequest.getCertificateTypes(); - for (int i = 0; i < types.length; ++i) - { - switch (types[i]) - { - case ClientCertificateType.rsa_sign: - case ClientCertificateType.dss_sign: - case ClientCertificateType.rsa_fixed_dh: - case ClientCertificateType.dss_fixed_dh: - case ClientCertificateType.ecdsa_sign: - break; - default: - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - } - - public void skipClientCredentials() throws IOException - { - this.agreementCredentials = null; - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - if (clientCredentials instanceof TlsAgreementCredentials) - { - // TODO Validate client cert has matching parameters (see 'areCompatibleParameters')? - - this.agreementCredentials = (TlsAgreementCredentials)clientCredentials; - } - else if (clientCredentials instanceof TlsSignerCredentials) - { - // OK - } - else - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public void generateClientKeyExchange(OutputStream os) throws IOException - { - /* - * RFC 2246 7.4.7.2 If the client certificate already contains a suitable - * Diffie-Hellman key, then Yc is implicit and does not need to be sent again. In - * this case, the Client Key Exchange message will be sent, but will be empty. - */ - if (agreementCredentials == null) - { - generateEphemeralClientKeyExchange(dhAgreeServerPublicKey.getParameters(), os); - } - } - - public byte[] generatePremasterSecret() throws IOException - { - if (agreementCredentials != null) - { - return agreementCredentials.generateAgreement(dhAgreeServerPublicKey); - } - - return calculateDHBasicAgreement(dhAgreeServerPublicKey, dhAgreeClientPrivateKey); - } - - protected boolean areCompatibleParameters(DHParameters a, DHParameters b) - { - return a.getP().equals(b.getP()) && a.getG().equals(b.getG()); - } - - protected byte[] calculateDHBasicAgreement(DHPublicKeyParameters publicKey, - DHPrivateKeyParameters privateKey) - { - return TlsDHUtils.calculateDHBasicAgreement(publicKey, privateKey); - } - - protected AsymmetricCipherKeyPair generateDHKeyPair(DHParameters dhParams) - { - return TlsDHUtils.generateDHKeyPair(context.getSecureRandom(), dhParams); - } - - protected void generateEphemeralClientKeyExchange(DHParameters dhParams, OutputStream os) - throws IOException - { - this.dhAgreeClientPrivateKey = TlsDHUtils.generateEphemeralClientKeyExchange(context.getSecureRandom(), dhParams, os); - } - - protected DHPublicKeyParameters validateDHPublicKey(DHPublicKeyParameters key) - throws IOException - { - return TlsDHUtils.validateDHPublicKey(key); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHUtils.java deleted file mode 100644 index fffa3e5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDHUtils.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.OutputStream; -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.agreement.DHBasicAgreement; -import org.bc.crypto.generators.DHBasicKeyPairGenerator; -import org.bc.crypto.params.DHKeyGenerationParameters; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.util.BigIntegers; - -public class TlsDHUtils -{ - static final BigInteger ONE = BigInteger.valueOf(1); - static final BigInteger TWO = BigInteger.valueOf(2); - - public static byte[] calculateDHBasicAgreement(DHPublicKeyParameters publicKey, - DHPrivateKeyParameters privateKey) - { - DHBasicAgreement dhAgree = new DHBasicAgreement(); - dhAgree.init(privateKey); - BigInteger agreement = dhAgree.calculateAgreement(publicKey); - return BigIntegers.asUnsignedByteArray(agreement); - } - - public static AsymmetricCipherKeyPair generateDHKeyPair(SecureRandom random, DHParameters dhParams) - { - DHBasicKeyPairGenerator dhGen = new DHBasicKeyPairGenerator(); - dhGen.init(new DHKeyGenerationParameters(random, dhParams)); - return dhGen.generateKeyPair(); - } - - public static DHPrivateKeyParameters generateEphemeralClientKeyExchange(SecureRandom random, DHParameters dhParams, OutputStream os) - throws IOException - { - AsymmetricCipherKeyPair dhAgreeClientKeyPair = generateDHKeyPair(random, dhParams); - DHPrivateKeyParameters dhAgreeClientPrivateKey = (DHPrivateKeyParameters)dhAgreeClientKeyPair.getPrivate(); - - BigInteger Yc = ((DHPublicKeyParameters)dhAgreeClientKeyPair.getPublic()).getY(); - byte[] keData = BigIntegers.asUnsignedByteArray(Yc); - TlsUtils.writeOpaque16(keData, os); - - return dhAgreeClientPrivateKey; - } - - public static DHPublicKeyParameters validateDHPublicKey(DHPublicKeyParameters key) - throws IOException - { - BigInteger Y = key.getY(); - DHParameters params = key.getParameters(); - BigInteger p = params.getP(); - BigInteger g = params.getG(); - - if (!p.isProbablePrime(2)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - if (g.compareTo(TWO) < 0 || g.compareTo(p.subtract(TWO)) > 0) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - if (Y.compareTo(TWO) < 0 || Y.compareTo(p.subtract(ONE)) > 0) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - - // TODO See RFC 2631 for more discussion of Diffie-Hellman validation - - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSASigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSASigner.java deleted file mode 100644 index 19e9621..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSASigner.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.bc.crypto.tls; - -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.DSA; -import org.bc.crypto.Signer; -import org.bc.crypto.digests.NullDigest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.signers.DSADigestSigner; - -abstract class TlsDSASigner implements TlsSigner -{ - public byte[] calculateRawSignature(SecureRandom secureRandom, AsymmetricKeyParameter privateKey, byte[] md5andsha1) - throws CryptoException - { - // Note: Only use the SHA1 part of the hash - Signer signer = new DSADigestSigner(createDSAImpl(), new NullDigest()); - signer.init(true, new ParametersWithRandom(privateKey, secureRandom)); - signer.update(md5andsha1, 16, 20); - return signer.generateSignature(); - } - - public Signer createVerifyer(AsymmetricKeyParameter publicKey) - { - Signer verifyer = new DSADigestSigner(createDSAImpl(), new SHA1Digest()); - verifyer.init(false, publicKey); - return verifyer; - } - - protected abstract DSA createDSAImpl(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSSSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSSSigner.java deleted file mode 100644 index dfc7354..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsDSSSigner.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.crypto.tls; - -import org.bc.crypto.DSA; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DSAPublicKeyParameters; -import org.bc.crypto.signers.DSASigner; - -class TlsDSSSigner extends TlsDSASigner -{ - public boolean isValidPublicKey(AsymmetricKeyParameter publicKey) - { - return publicKey instanceof DSAPublicKeyParameters; - } - - protected DSA createDSAImpl() - { - return new DSASigner(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHEKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHEKeyExchange.java deleted file mode 100644 index ab7104a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHEKeyExchange.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; - -import org.bc.crypto.Signer; -import org.bc.crypto.io.SignerInputStream; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.math.ec.ECPoint; - -/** - * ECDHE key exchange (see RFC 4492) - */ -class TlsECDHEKeyExchange extends TlsECDHKeyExchange -{ - TlsECDHEKeyExchange(TlsClientContext context, int keyExchange) - { - super(context, keyExchange); - } - - public void skipServerKeyExchange() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerKeyExchange(InputStream is) - throws IOException - { - SecurityParameters securityParameters = context.getSecurityParameters(); - - Signer signer = initSigner(tlsSigner, securityParameters); - InputStream sigIn = new SignerInputStream(is, signer); - - short curveType = TlsUtils.readUint8(sigIn); - ECDomainParameters curve_params; - - // Currently, we only support named curves - if (curveType == ECCurveType.named_curve) - { - int namedCurve = TlsUtils.readUint16(sigIn); - - // TODO Check namedCurve is one we offered? - - curve_params = NamedCurve.getECParameters(namedCurve); - } - else - { - // TODO Add support for explicit curve parameters (read from sigIn) - - throw new TlsFatalAlert(AlertDescription.handshake_failure); - } - - byte[] publicBytes = TlsUtils.readOpaque8(sigIn); - - byte[] sigByte = TlsUtils.readOpaque16(is); - if (!signer.verifySignature(sigByte)) - { - throw new TlsFatalAlert(AlertDescription.bad_certificate); - } - - // TODO Check curve_params not null - - ECPoint Q = curve_params.getCurve().decodePoint(publicBytes); - - this.ecAgreeServerPublicKey = validateECPublicKey(new ECPublicKeyParameters(Q, curve_params)); - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - /* - * RFC 4492 3. [...] The ECDSA_fixed_ECDH and RSA_fixed_ECDH mechanisms are usable - * with ECDH_ECDSA and ECDH_RSA. Their use with ECDHE_ECDSA and ECDHE_RSA is - * prohibited because the use of a long-term ECDH client key would jeopardize the - * forward secrecy property of these algorithms. - */ - short[] types = certificateRequest.getCertificateTypes(); - for (int i = 0; i < types.length; ++i) - { - switch (types[i]) - { - case ClientCertificateType.rsa_sign: - case ClientCertificateType.dss_sign: - case ClientCertificateType.ecdsa_sign: - break; - default: - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - if (clientCredentials instanceof TlsSignerCredentials) - { - // OK - } - else - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - protected Signer initSigner(TlsSigner tlsSigner, SecurityParameters securityParameters) - { - Signer signer = tlsSigner.createVerifyer(this.serverPublicKey); - signer.update(securityParameters.clientRandom, 0, securityParameters.clientRandom.length); - signer.update(securityParameters.serverRandom, 0, securityParameters.serverRandom.length); - return signer; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHKeyExchange.java deleted file mode 100644 index b9bbaed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDHKeyExchange.java +++ /dev/null @@ -1,239 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.math.BigInteger; - -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.agreement.ECDHBasicAgreement; -import org.bc.crypto.generators.ECKeyPairGenerator; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECKeyGenerationParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.util.PublicKeyFactory; -import org.bc.util.BigIntegers; - -/** - * ECDH key exchange (see RFC 4492) - */ -class TlsECDHKeyExchange implements TlsKeyExchange -{ - protected TlsClientContext context; - protected int keyExchange; - protected TlsSigner tlsSigner; - - protected AsymmetricKeyParameter serverPublicKey; - protected ECPublicKeyParameters ecAgreeServerPublicKey; - protected TlsAgreementCredentials agreementCredentials; - protected ECPrivateKeyParameters ecAgreeClientPrivateKey = null; - - TlsECDHKeyExchange(TlsClientContext context, int keyExchange) - { - switch (keyExchange) - { - case KeyExchangeAlgorithm.ECDHE_RSA: - this.tlsSigner = new TlsRSASigner(); - break; - case KeyExchangeAlgorithm.ECDHE_ECDSA: - this.tlsSigner = new TlsECDSASigner(); - break; - case KeyExchangeAlgorithm.ECDH_RSA: - case KeyExchangeAlgorithm.ECDH_ECDSA: - this.tlsSigner = null; - break; - default: - throw new IllegalArgumentException("unsupported key exchange algorithm"); - } - - this.context = context; - this.keyExchange = keyExchange; - } - - public void skipServerCertificate() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerCertificate(Certificate serverCertificate) throws IOException - { - org.bc.asn1.x509.Certificate x509Cert = serverCertificate.certs[0]; - SubjectPublicKeyInfo keyInfo = x509Cert.getSubjectPublicKeyInfo(); - - try - { - this.serverPublicKey = PublicKeyFactory.createKey(keyInfo); - } - catch (RuntimeException e) - { - throw new TlsFatalAlert(AlertDescription.unsupported_certificate); - } - - if (tlsSigner == null) - { - try - { - this.ecAgreeServerPublicKey = validateECPublicKey((ECPublicKeyParameters)this.serverPublicKey); - } - catch (ClassCastException e) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.keyAgreement); - } - else - { - if (!tlsSigner.isValidPublicKey(this.serverPublicKey)) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.digitalSignature); - } - - // TODO - /* - * Perform various checks per RFC2246 7.4.2: "Unless otherwise specified, the - * signing algorithm for the certificate must be the same as the algorithm for the - * certificate key." - */ - } - - public void skipServerKeyExchange() throws IOException - { - // do nothing - } - - public void processServerKeyExchange(InputStream is) - throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - /* - * RFC 4492 3. [...] The ECDSA_fixed_ECDH and RSA_fixed_ECDH mechanisms are usable - * with ECDH_ECDSA and ECDH_RSA. Their use with ECDHE_ECDSA and ECDHE_RSA is - * prohibited because the use of a long-term ECDH client key would jeopardize the - * forward secrecy property of these algorithms. - */ - short[] types = certificateRequest.getCertificateTypes(); - for (int i = 0; i < types.length; ++i) - { - switch (types[i]) - { - case ClientCertificateType.rsa_sign: - case ClientCertificateType.dss_sign: - case ClientCertificateType.ecdsa_sign: - case ClientCertificateType.rsa_fixed_ecdh: - case ClientCertificateType.ecdsa_fixed_ecdh: - break; - default: - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - } - - public void skipClientCredentials() throws IOException - { - this.agreementCredentials = null; - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - if (clientCredentials instanceof TlsAgreementCredentials) - { - // TODO Validate client cert has matching parameters (see 'areOnSameCurve')? - - this.agreementCredentials = (TlsAgreementCredentials)clientCredentials; - } - else if (clientCredentials instanceof TlsSignerCredentials) - { - // OK - } - else - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public void generateClientKeyExchange(OutputStream os) throws IOException - { - if (agreementCredentials == null) - { - generateEphemeralClientKeyExchange(ecAgreeServerPublicKey.getParameters(), os); - } - } - - public byte[] generatePremasterSecret() throws IOException - { - if (agreementCredentials != null) - { - return agreementCredentials.generateAgreement(ecAgreeServerPublicKey); - } - - return calculateECDHBasicAgreement(ecAgreeServerPublicKey, ecAgreeClientPrivateKey); - } - - protected boolean areOnSameCurve(ECDomainParameters a, ECDomainParameters b) - { - // TODO Move to ECDomainParameters.equals() or other utility method? - return a.getCurve().equals(b.getCurve()) && a.getG().equals(b.getG()) - && a.getN().equals(b.getN()) && a.getH().equals(b.getH()); - } - - protected byte[] externalizeKey(ECPublicKeyParameters keyParameters) throws IOException - { - // TODO Add support for compressed encoding and SPF extension - - /* - * RFC 4492 5.7. ...an elliptic curve point in uncompressed or compressed format. - * Here, the format MUST conform to what the server has requested through a - * Supported Point Formats Extension if this extension was used, and MUST be - * uncompressed if this extension was not used. - */ - return keyParameters.getQ().getEncoded(); - } - - protected AsymmetricCipherKeyPair generateECKeyPair(ECDomainParameters ecParams) - { - ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); - ECKeyGenerationParameters keyGenerationParameters = new ECKeyGenerationParameters(ecParams, - context.getSecureRandom()); - keyPairGenerator.init(keyGenerationParameters); - return keyPairGenerator.generateKeyPair(); - } - - protected void generateEphemeralClientKeyExchange(ECDomainParameters ecParams, OutputStream os) - throws IOException - { - AsymmetricCipherKeyPair ecAgreeClientKeyPair = generateECKeyPair(ecParams); - this.ecAgreeClientPrivateKey = (ECPrivateKeyParameters)ecAgreeClientKeyPair.getPrivate(); - - byte[] keData = externalizeKey((ECPublicKeyParameters)ecAgreeClientKeyPair.getPublic()); - TlsUtils.writeOpaque8(keData, os); - } - - protected byte[] calculateECDHBasicAgreement(ECPublicKeyParameters publicKey, - ECPrivateKeyParameters privateKey) - { - ECDHBasicAgreement basicAgreement = new ECDHBasicAgreement(); - basicAgreement.init(privateKey); - BigInteger agreement = basicAgreement.calculateAgreement(publicKey); - return BigIntegers.asUnsignedByteArray(agreement); - } - - protected ECPublicKeyParameters validateECPublicKey(ECPublicKeyParameters key) - throws IOException - { - // TODO Check RFC 4492 for validation - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDSASigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDSASigner.java deleted file mode 100644 index b6a8d27..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsECDSASigner.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.crypto.tls; - -import org.bc.crypto.DSA; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.signers.ECDSASigner; - -class TlsECDSASigner extends TlsDSASigner -{ - public boolean isValidPublicKey(AsymmetricKeyParameter publicKey) - { - return publicKey instanceof ECPublicKeyParameters; - } - - protected DSA createDSAImpl() - { - return new ECDSASigner(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsFatalAlert.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsFatalAlert.java deleted file mode 100644 index 8e4f149..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsFatalAlert.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public class TlsFatalAlert extends IOException -{ - private static final long serialVersionUID = 3584313123679111168L; - - private short alertDescription; - - public TlsFatalAlert(short alertDescription) - { - this.alertDescription = alertDescription; - } - - public short getAlertDescription() - { - return alertDescription; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsInputStream.java deleted file mode 100644 index 9ef50fb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsInputStream.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; - -/** - * An InputStream for an TLS 1.0 connection. - */ -class TlsInputStream extends InputStream -{ - private byte[] buf = new byte[1]; - private TlsProtocolHandler handler = null; - - TlsInputStream(TlsProtocolHandler handler) - { - this.handler = handler; - } - - public int read(byte[] buf, int offset, int len) throws IOException - { - return this.handler.readApplicationData(buf, offset, len); - } - - public int read() throws IOException - { - if (this.read(buf) < 0) - { - return -1; - } - return buf[0] & 0xff; - } - - public void close() throws IOException - { - handler.close(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsKeyExchange.java deleted file mode 100644 index a6b7655..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsKeyExchange.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * A generic interface for key exchange implementations in TLS 1.0. - */ -public interface TlsKeyExchange -{ - void skipServerCertificate() throws IOException; - - void processServerCertificate(Certificate serverCertificate) throws IOException; - - void skipServerKeyExchange() throws IOException; - - void processServerKeyExchange(InputStream is) - throws IOException; - - void validateCertificateRequest(CertificateRequest certificateRequest) throws IOException; - - void skipClientCredentials() throws IOException; - - void processClientCredentials(TlsCredentials clientCredentials) throws IOException; - - void generateClientKeyExchange(OutputStream os) throws IOException; - - byte[] generatePremasterSecret() throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsMac.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsMac.java deleted file mode 100644 index cfe1ccc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsMac.java +++ /dev/null @@ -1,163 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.bc.crypto.Digest; -import org.bc.crypto.Mac; -import org.bc.crypto.macs.HMac; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Arrays; - -/** - * A generic TLS MAC implementation, which can be used with any kind of Digest to act as - * an HMAC. - */ -public class TlsMac -{ - protected TlsClientContext context; - protected long seqNo; - protected byte[] secret; - protected Mac mac; - - /** - * Generate a new instance of an TlsMac. - * - * @param context the TLS client context - * @param digest The digest to use. - * @param key_block A byte-array where the key for this mac is located. - * @param offset The number of bytes to skip, before the key starts in the buffer. - * @param len The length of the key. - */ - public TlsMac(TlsClientContext context, Digest digest, byte[] key_block, int offset, int len) - { - this.context = context; - this.seqNo = 0; - - KeyParameter param = new KeyParameter(key_block, offset, len); - - this.secret = Arrays.clone(param.getKey()); - - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - this.mac = new HMac(digest); - } - else - { - this.mac = new SSL3Mac(digest); - } - - this.mac.init(param); - } - - /** - * @return the MAC write secret - */ - public byte[] getMACSecret() - { - return this.secret; - } - - /** - * @return the current write sequence number - */ - public long getSequenceNumber() - { - return this.seqNo; - } - - /** - * Increment the current write sequence number - */ - public void incSequenceNumber() - { - this.seqNo++; - } - - /** - * @return The Keysize of the mac. - */ - public int getSize() - { - return mac.getMacSize(); - } - - /** - * Calculate the mac for some given data. - *

    - * TlsMac will keep track of the sequence number internally. - * - * @param type The message type of the message. - * @param message A byte-buffer containing the message. - * @param offset The number of bytes to skip, before the message starts. - * @param len The length of the message. - * @return A new byte-buffer containing the mac value. - */ - public byte[] calculateMac(short type, byte[] message, int offset, int len) - { - ProtocolVersion serverVersion = context.getServerVersion(); - boolean isTls = serverVersion.getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - ByteArrayOutputStream bosMac = new ByteArrayOutputStream(isTls ? 13 : 11); - try - { - TlsUtils.writeUint64(seqNo++, bosMac); - TlsUtils.writeUint8(type, bosMac); - - if (isTls) - { - TlsUtils.writeVersion(serverVersion, bosMac); - } - - TlsUtils.writeUint16(len, bosMac); - } - catch (IOException e) - { - // This should never happen - throw new IllegalStateException("Internal error during mac calculation"); - } - - byte[] macHeader = bosMac.toByteArray(); - mac.update(macHeader, 0, macHeader.length); - mac.update(message, offset, len); - - byte[] result = new byte[mac.getMacSize()]; - mac.doFinal(result, 0); - return result; - } - - public byte[] calculateMacConstantTime(short type, byte[] message, int offset, int len, int fullLength, byte[] dummyData) - { - // Actual MAC only calculated on 'len' bytes - byte[] result = calculateMac(type, message, offset, len); - - ProtocolVersion serverVersion = context.getServerVersion(); - boolean isTls = serverVersion.getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - // ...but ensure a constant number of complete digest blocks are processed (per 'fullLength') - if (isTls) - { - // TODO Currently all TLS digests use a block size of 64, a suffix (length field) of 8, and padding (1+) - int db = 64, ds = 8; - - int L1 = 13 + fullLength; - int L2 = 13 + len; - - // How many extra full blocks do we need to calculate? - int extra = ((L1 + ds) / db) - ((L2 + ds) / db); - - while (--extra >= 0) - { - mac.update(dummyData, 0, db); - } - - // One more byte in case the implementation is "lazy" about processing blocks - mac.update(dummyData[0]); - mac.reset(); - } - - return result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCipher.java deleted file mode 100644 index dd3b4ca..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCipher.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.bc.crypto.tls; - -/** - * A NULL CipherSuite in java, this should only be used during handshake. - */ -public class TlsNullCipher implements TlsCipher -{ - public byte[] encodePlaintext(short type, byte[] plaintext, int offset, int len) - { - return copyData(plaintext, offset, len); - } - - public byte[] decodeCiphertext(short type, byte[] ciphertext, int offset, int len) - { - return copyData(ciphertext, offset, len); - } - - protected byte[] copyData(byte[] text, int offset, int len) - { - byte[] result = new byte[len]; - System.arraycopy(text, offset, result, 0, len); - return result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCompression.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCompression.java deleted file mode 100644 index d971a6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsNullCompression.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.OutputStream; - -public class TlsNullCompression implements TlsCompression -{ - public OutputStream compress(OutputStream output) - { - return output; - } - - public OutputStream decompress(OutputStream output) - { - return output; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsOutputStream.java deleted file mode 100644 index 2bda1ad..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsOutputStream.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * An OutputStream for an TLS connection. - */ -class TlsOutputStream extends OutputStream -{ - private byte[] buf = new byte[1]; - private TlsProtocolHandler handler; - - TlsOutputStream(TlsProtocolHandler handler) - { - this.handler = handler; - } - - public void write(byte buf[], int offset, int len) throws IOException - { - this.handler.writeData(buf, offset, len); - } - - public void write(int arg0) throws IOException - { - buf[0] = (byte)arg0; - this.write(buf, 0, 1); - } - - public void close() throws IOException - { - handler.close(); - } - - public void flush() throws IOException - { - handler.flush(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKIdentity.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKIdentity.java deleted file mode 100644 index 8f6b1bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKIdentity.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.crypto.tls; - -public interface TlsPSKIdentity -{ - void skipIdentityHint(); - - void notifyIdentityHint(byte[] psk_identity_hint); - - byte[] getPSKIdentity(); - - byte[] getPSK(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKKeyExchange.java deleted file mode 100644 index 74ec68c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsPSKKeyExchange.java +++ /dev/null @@ -1,210 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.math.BigInteger; - -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.util.PublicKeyFactory; - -class TlsPSKKeyExchange implements TlsKeyExchange -{ - protected TlsClientContext context; - protected int keyExchange; - protected TlsPSKIdentity pskIdentity; - - protected byte[] psk_identity_hint = null; - - protected DHPublicKeyParameters dhAgreeServerPublicKey = null; - protected DHPrivateKeyParameters dhAgreeClientPrivateKey = null; - - protected AsymmetricKeyParameter serverPublicKey = null; - protected RSAKeyParameters rsaServerPublicKey = null; - protected byte[] premasterSecret; - - TlsPSKKeyExchange(TlsClientContext context, int keyExchange, TlsPSKIdentity pskIdentity) - { - switch (keyExchange) - { - case KeyExchangeAlgorithm.PSK: - case KeyExchangeAlgorithm.RSA_PSK: - case KeyExchangeAlgorithm.DHE_PSK: - break; - default: - throw new IllegalArgumentException("unsupported key exchange algorithm"); - } - - this.context = context; - this.keyExchange = keyExchange; - this.pskIdentity = pskIdentity; - } - - public void skipServerCertificate() throws IOException - { - if (keyExchange == KeyExchangeAlgorithm.RSA_PSK) - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - } - - public void processServerCertificate(Certificate serverCertificate) throws IOException - { - if (keyExchange != KeyExchangeAlgorithm.RSA_PSK) - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - org.bc.asn1.x509.Certificate x509Cert = serverCertificate.certs[0]; - SubjectPublicKeyInfo keyInfo = x509Cert.getSubjectPublicKeyInfo(); - - try - { - this.serverPublicKey = PublicKeyFactory.createKey(keyInfo); - } - catch (RuntimeException e) - { - throw new TlsFatalAlert(AlertDescription.unsupported_certificate); - } - - // Sanity check the PublicKeyFactory - if (this.serverPublicKey.isPrivate()) - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - this.rsaServerPublicKey = validateRSAPublicKey((RSAKeyParameters) this.serverPublicKey); - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.keyEncipherment); - - // TODO - /* - * Perform various checks per RFC2246 7.4.2: "Unless otherwise - * specified, the signing algorithm for the certificate must be the same - * as the algorithm for the certificate key." - */ - } - - public void skipServerKeyExchange() throws IOException - { - if (keyExchange == KeyExchangeAlgorithm.DHE_PSK) - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - this.psk_identity_hint = new byte[0]; - } - - public void processServerKeyExchange(InputStream is) throws IOException - { - this.psk_identity_hint = TlsUtils.readOpaque16(is); - - if (this.keyExchange == KeyExchangeAlgorithm.DHE_PSK) - { - byte[] pBytes = TlsUtils.readOpaque16(is); - byte[] gBytes = TlsUtils.readOpaque16(is); - byte[] YsBytes = TlsUtils.readOpaque16(is); - - BigInteger p = new BigInteger(1, pBytes); - BigInteger g = new BigInteger(1, gBytes); - BigInteger Ys = new BigInteger(1, YsBytes); - - this.dhAgreeServerPublicKey = TlsDHUtils.validateDHPublicKey(new DHPublicKeyParameters(Ys, - new DHParameters(p, g))); - } - else if (this.psk_identity_hint.length == 0) - { - // TODO Should we enforce that this message should have been skipped if hint is empty? -// throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void skipClientCredentials() throws IOException - { - // OK - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - public void generateClientKeyExchange(OutputStream os) throws IOException - { - if (psk_identity_hint == null || psk_identity_hint.length == 0) - { - pskIdentity.skipIdentityHint(); - } - else - { - pskIdentity.notifyIdentityHint(psk_identity_hint); - } - - byte[] psk_identity = pskIdentity.getPSKIdentity(); - - TlsUtils.writeOpaque16(psk_identity, os); - - if (this.keyExchange == KeyExchangeAlgorithm.RSA_PSK) - { - this.premasterSecret = TlsRSAUtils.generateEncryptedPreMasterSecret(context, - this.rsaServerPublicKey, os); - } - else if (this.keyExchange == KeyExchangeAlgorithm.DHE_PSK) - { - this.dhAgreeClientPrivateKey = TlsDHUtils.generateEphemeralClientKeyExchange( - context.getSecureRandom(), dhAgreeServerPublicKey.getParameters(), os); - } - } - - public byte[] generatePremasterSecret() throws IOException - { - byte[] psk = pskIdentity.getPSK(); - byte[] other_secret = generateOtherSecret(psk.length); - - ByteArrayOutputStream buf = new ByteArrayOutputStream(4 + other_secret.length + psk.length); - TlsUtils.writeOpaque16(other_secret, buf); - TlsUtils.writeOpaque16(psk, buf); - return buf.toByteArray(); - } - - protected byte[] generateOtherSecret(int pskLength) - { - if (this.keyExchange == KeyExchangeAlgorithm.DHE_PSK) - { - return TlsDHUtils.calculateDHBasicAgreement(dhAgreeServerPublicKey, dhAgreeClientPrivateKey); - } - - if (this.keyExchange == KeyExchangeAlgorithm.RSA_PSK) - { - return this.premasterSecret; - } - - return new byte[pskLength]; - } - - protected RSAKeyParameters validateRSAPublicKey(RSAKeyParameters key) throws IOException - { - // TODO What is the minimum bit length required? - // key.getModulus().bitLength(); - - if (!key.getExponent().isProbablePrime(2)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsProtocolHandler.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsProtocolHandler.java deleted file mode 100644 index b06fa5c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsProtocolHandler.java +++ /dev/null @@ -1,1260 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.security.SecureRandom; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.x500.X500Name; -import org.bc.crypto.prng.ThreadedSeedGenerator; -import org.bc.util.Arrays; -import org.bc.util.Integers; - -/** - * An implementation of all high level protocols in TLS 1.0. - */ -public class TlsProtocolHandler -{ - private static final Integer EXT_RenegotiationInfo = Integers.valueOf(ExtensionType.renegotiation_info); - - /* - * Our Connection states - */ - private static final short CS_CLIENT_HELLO_SEND = 1; - private static final short CS_SERVER_HELLO_RECEIVED = 2; - private static final short CS_SERVER_CERTIFICATE_RECEIVED = 3; - private static final short CS_SERVER_KEY_EXCHANGE_RECEIVED = 4; - private static final short CS_CERTIFICATE_REQUEST_RECEIVED = 5; - private static final short CS_SERVER_HELLO_DONE_RECEIVED = 6; - private static final short CS_CLIENT_KEY_EXCHANGE_SEND = 7; - private static final short CS_CERTIFICATE_VERIFY_SEND = 8; - private static final short CS_CLIENT_CHANGE_CIPHER_SPEC_SEND = 9; - private static final short CS_CLIENT_FINISHED_SEND = 10; - private static final short CS_SERVER_CHANGE_CIPHER_SPEC_RECEIVED = 11; - private static final short CS_DONE = 12; - - private static final byte[] emptybuf = new byte[0]; - - private static final String TLS_ERROR_MESSAGE = "Internal TLS error, this could be an attack"; - - /* - * Queues for data from some protocols. - */ - private ByteQueue applicationDataQueue = new ByteQueue(); - private ByteQueue changeCipherSpecQueue = new ByteQueue(); - private ByteQueue alertQueue = new ByteQueue(); - private ByteQueue handshakeQueue = new ByteQueue(); - - /* - * The Record Stream we use - */ - private RecordStream rs; - private SecureRandom random; - - private TlsInputStream tlsInputStream = null; - private TlsOutputStream tlsOutputStream = null; - - private boolean closed = false; - private boolean failedWithError = false; - private boolean appDataReady = false; - private Hashtable clientExtensions; - - private SecurityParameters securityParameters = null; - - private TlsClientContextImpl tlsClientContext = null; - private TlsClient tlsClient = null; - private int[] offeredCipherSuites = null; - private short[] offeredCompressionMethods = null; - private TlsKeyExchange keyExchange = null; - private TlsAuthentication authentication = null; - private CertificateRequest certificateRequest = null; - - private short connection_state = 0; - - private static SecureRandom createSecureRandom() - { - /* - * We use our threaded seed generator to generate a good random seed. If the user - * has a better random seed, he should use the constructor with a SecureRandom. - */ - ThreadedSeedGenerator tsg = new ThreadedSeedGenerator(); - SecureRandom random = new SecureRandom(); - - /* - * Hopefully, 20 bytes in fast mode are good enough. - */ - random.setSeed(tsg.generateSeed(20, true)); - - return random; - } - - public TlsProtocolHandler(InputStream is, OutputStream os) - { - this(is, os, createSecureRandom()); - } - - public TlsProtocolHandler(InputStream is, OutputStream os, SecureRandom sr) - { - this.rs = new RecordStream(this, is, os); - this.random = sr; - } - - protected void processData(short protocol, byte[] buf, int offset, int len) throws IOException - { - /* - * Have a look at the protocol type, and add it to the correct queue. - */ - switch (protocol) - { - case ContentType.change_cipher_spec: - changeCipherSpecQueue.addData(buf, offset, len); - processChangeCipherSpec(); - break; - case ContentType.alert: - alertQueue.addData(buf, offset, len); - processAlert(); - break; - case ContentType.handshake: - handshakeQueue.addData(buf, offset, len); - processHandshake(); - break; - case ContentType.application_data: - if (!appDataReady) - { - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - applicationDataQueue.addData(buf, offset, len); - processApplicationData(); - break; - default: - /* - * Uh, we don't know this protocol. - * - * RFC2246 defines on page 13, that we should ignore this. - */ - } - } - - private void processHandshake() throws IOException - { - boolean read; - do - { - read = false; - /* - * We need the first 4 bytes, they contain type and length of the message. - */ - if (handshakeQueue.size() >= 4) - { - byte[] beginning = new byte[4]; - handshakeQueue.read(beginning, 0, 4, 0); - ByteArrayInputStream bis = new ByteArrayInputStream(beginning); - short type = TlsUtils.readUint8(bis); - int len = TlsUtils.readUint24(bis); - - /* - * Check if we have enough bytes in the buffer to read the full message. - */ - if (handshakeQueue.size() >= (len + 4)) - { - /* - * Read the message. - */ - byte[] buf = new byte[len]; - handshakeQueue.read(buf, 0, len, 4); - handshakeQueue.removeData(len + 4); - - /* - * RFC 2246 7.4.9. The value handshake_messages includes all handshake - * messages starting at client hello up to, but not including, this - * finished message. [..] Note: [Also,] Hello Request messages are - * omitted from handshake hashes. - */ - switch (type) - { - case HandshakeType.hello_request: - case HandshakeType.finished: - break; - default: - rs.updateHandshakeData(beginning, 0, 4); - rs.updateHandshakeData(buf, 0, len); - break; - } - - /* - * Now, parse the message. - */ - processHandshakeMessage(type, buf); - read = true; - } - } - } - while (read); - } - - private void processHandshakeMessage(short type, byte[] buf) throws IOException - { - ByteArrayInputStream is = new ByteArrayInputStream(buf); - - switch (type) - { - case HandshakeType.certificate: - { - switch (connection_state) - { - case CS_SERVER_HELLO_RECEIVED: - { - // Parse the Certificate message and send to cipher suite - - Certificate serverCertificate = Certificate.parse(is); - - assertEmpty(is); - - this.keyExchange.processServerCertificate(serverCertificate); - - this.authentication = tlsClient.getAuthentication(); - this.authentication.notifyServerCertificate(serverCertificate); - - break; - } - default: - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - - connection_state = CS_SERVER_CERTIFICATE_RECEIVED; - break; - } - case HandshakeType.finished: - switch (connection_state) - { - case CS_SERVER_CHANGE_CIPHER_SPEC_RECEIVED: - /* - * Read the checksum from the finished message, it has always 12 - * bytes for TLS 1.0 and 36 for SSLv3. - */ - boolean isTls = tlsClientContext.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - int checksumLength = isTls ? 12 : 36; - byte[] serverVerifyData = new byte[checksumLength]; - TlsUtils.readFully(serverVerifyData, is); - - assertEmpty(is); - - /* - * Calculate our own checksum. - */ - byte[] expectedServerVerifyData = TlsUtils.calculateVerifyData(tlsClientContext, - "server finished", rs.getCurrentHash(TlsUtils.SSL_SERVER)); - - /* - * Compare both checksums. - */ - if (!Arrays.constantTimeAreEqual(expectedServerVerifyData, serverVerifyData)) - { - /* - * Wrong checksum in the finished message. - */ - this.failWithError(AlertLevel.fatal, AlertDescription.handshake_failure); - } - - connection_state = CS_DONE; - - /* - * We are now ready to receive application data. - */ - this.appDataReady = true; - break; - default: - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - break; - case HandshakeType.server_hello: - switch (connection_state) - { - case CS_CLIENT_HELLO_SEND: - /* - * Read the server hello message - */ - ProtocolVersion server_version = TlsUtils.readVersion(is); - ProtocolVersion client_version = this.tlsClientContext.getClientVersion(); - if (server_version.getFullVersion() > client_version.getFullVersion()) - { - this.failWithError(AlertLevel.fatal, AlertDescription.illegal_parameter); - } - - this.tlsClientContext.setServerVersion(server_version); - this.tlsClient.notifyServerVersion(server_version); - - /* - * Read the server random - */ - securityParameters.serverRandom = new byte[32]; - TlsUtils.readFully(securityParameters.serverRandom, is); - - byte[] sessionID = TlsUtils.readOpaque8(is); - if (sessionID.length > 32) - { - this.failWithError(AlertLevel.fatal, AlertDescription.illegal_parameter); - } - - this.tlsClient.notifySessionID(sessionID); - - /* - * Find out which CipherSuite the server has chosen and check that - * it was one of the offered ones. - */ - int selectedCipherSuite = TlsUtils.readUint16(is); - if (!arrayContains(offeredCipherSuites, selectedCipherSuite) - || selectedCipherSuite == CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV) - { - this.failWithError(AlertLevel.fatal, AlertDescription.illegal_parameter); - } - - this.tlsClient.notifySelectedCipherSuite(selectedCipherSuite); - - /* - * Find out which CompressionMethod the server has chosen and check that - * it was one of the offered ones. - */ - short selectedCompressionMethod = TlsUtils.readUint8(is); - if (!arrayContains(offeredCompressionMethods, selectedCompressionMethod)) - { - this.failWithError(AlertLevel.fatal, AlertDescription.illegal_parameter); - } - - this.tlsClient.notifySelectedCompressionMethod(selectedCompressionMethod); - - /* - * RFC3546 2.2 The extended server hello message format MAY be - * sent in place of the server hello message when the client has - * requested extended functionality via the extended client hello - * message specified in Section 2.1. ... Note that the extended - * server hello message is only sent in response to an extended - * client hello message. This prevents the possibility that the - * extended server hello message could "break" existing TLS 1.0 - * clients. - */ - - /* - * TODO RFC 3546 2.3 If [...] the older session is resumed, then - * the server MUST ignore extensions appearing in the client - * hello, and send a server hello containing no extensions. - */ - - // Integer -> byte[] - Hashtable serverExtensions = new Hashtable(); - - if (is.available() > 0) - { - // Process extensions from extended server hello - byte[] extBytes = TlsUtils.readOpaque16(is); - - ByteArrayInputStream ext = new ByteArrayInputStream(extBytes); - while (ext.available() > 0) - { - Integer extType = Integers.valueOf(TlsUtils.readUint16(ext)); - byte[] extValue = TlsUtils.readOpaque16(ext); - - /* - * RFC 5746 Note that sending a "renegotiation_info" - * extension in response to a ClientHello containing only - * the SCSV is an explicit exception to the prohibition in - * RFC 5246, Section 7.4.1.4, on the server sending - * unsolicited extensions and is only allowed because the - * client is signaling its willingness to receive the - * extension via the TLS_EMPTY_RENEGOTIATION_INFO_SCSV - * SCSV. TLS implementations MUST continue to comply with - * Section 7.4.1.4 for all other extensions. - */ - - if (!extType.equals(EXT_RenegotiationInfo) - && clientExtensions.get(extType) == null) - { - /* - * RFC 3546 2.3 Note that for all extension types - * (including those defined in future), the extension - * type MUST NOT appear in the extended server hello - * unless the same extension type appeared in the - * corresponding client hello. Thus clients MUST abort - * the handshake if they receive an extension type in - * the extended server hello that they did not request - * in the associated (extended) client hello. - */ - this.failWithError(AlertLevel.fatal, - AlertDescription.unsupported_extension); - } - - if (serverExtensions.containsKey(extType)) - { - /* - * RFC 3546 2.3 Also note that when multiple - * extensions of different types are present in the - * extended client hello or the extended server hello, - * the extensions may appear in any order. There MUST - * NOT be more than one extension of the same type. - */ - this.failWithError(AlertLevel.fatal, - AlertDescription.illegal_parameter); - } - - serverExtensions.put(extType, extValue); - } - } - - assertEmpty(is); - - /* - * RFC 5746 3.4. When a ServerHello is received, the client MUST - * check if it includes the "renegotiation_info" extension: - */ - { - boolean secure_negotiation = serverExtensions.containsKey(EXT_RenegotiationInfo); - - /* - * If the extension is present, set the secure_renegotiation - * flag to TRUE. The client MUST then verify that the length - * of the "renegotiated_connection" field is zero, and if it - * is not, MUST abort the handshake (by sending a fatal - * handshake_failure alert). - */ - if (secure_negotiation) - { - byte[] renegExtValue = (byte[])serverExtensions.get(EXT_RenegotiationInfo); - - if (!Arrays.constantTimeAreEqual(renegExtValue, - createRenegotiationInfo(emptybuf))) - { - this.failWithError(AlertLevel.fatal, - AlertDescription.handshake_failure); - } - } - - tlsClient.notifySecureRenegotiation(secure_negotiation); - } - - if (clientExtensions != null) - { - tlsClient.processServerExtensions(serverExtensions); - } - - this.keyExchange = tlsClient.getKeyExchange(); - - connection_state = CS_SERVER_HELLO_RECEIVED; - break; - default: - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - break; - case HandshakeType.server_hello_done: - switch (connection_state) - { - case CS_SERVER_HELLO_RECEIVED: - - // There was no server certificate message; check it's OK - this.keyExchange.skipServerCertificate(); - this.authentication = null; - - // NB: Fall through to next case label - - case CS_SERVER_CERTIFICATE_RECEIVED: - - // There was no server key exchange message; check it's OK - this.keyExchange.skipServerKeyExchange(); - - // NB: Fall through to next case label - - case CS_SERVER_KEY_EXCHANGE_RECEIVED: - case CS_CERTIFICATE_REQUEST_RECEIVED: - - assertEmpty(is); - - connection_state = CS_SERVER_HELLO_DONE_RECEIVED; - - TlsCredentials clientCreds = null; - if (certificateRequest == null) - { - this.keyExchange.skipClientCredentials(); - } - else - { - clientCreds = this.authentication.getClientCredentials(certificateRequest); - - if (clientCreds == null) - { - this.keyExchange.skipClientCredentials(); - - boolean isTls = tlsClientContext.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - sendClientCertificate(Certificate.EMPTY_CHAIN); - } - else - { - sendAlert(AlertLevel.warning, AlertDescription.no_certificate); - } - } - else - { - this.keyExchange.processClientCredentials(clientCreds); - - sendClientCertificate(clientCreds.getCertificate()); - } - } - - /* - * Send the client key exchange message, depending on the key - * exchange we are using in our CipherSuite. - */ - sendClientKeyExchange(); - - connection_state = CS_CLIENT_KEY_EXCHANGE_SEND; - - /* - * Calculate the master_secret - */ - byte[] pms = this.keyExchange.generatePremasterSecret(); - - securityParameters.masterSecret = TlsUtils.calculateMasterSecret( - this.tlsClientContext, pms); - - // TODO Is there a way to ensure the data is really overwritten? - /* - * RFC 2246 8.1. The pre_master_secret should be deleted from - * memory once the master_secret has been computed. - */ - Arrays.fill(pms, (byte)0); - - if (clientCreds != null && clientCreds instanceof TlsSignerCredentials) - { - TlsSignerCredentials signerCreds = (TlsSignerCredentials)clientCreds; - byte[] md5andsha1 = rs.getCurrentHash(null); - byte[] clientCertificateSignature = signerCreds.generateCertificateSignature( - md5andsha1); - sendCertificateVerify(clientCertificateSignature); - - connection_state = CS_CERTIFICATE_VERIFY_SEND; - } - - /* - * Now, we send change cipher state - */ - byte[] cmessage = new byte[1]; - cmessage[0] = 1; - rs.writeMessage(ContentType.change_cipher_spec, cmessage, 0, - cmessage.length); - - connection_state = CS_CLIENT_CHANGE_CIPHER_SPEC_SEND; - - /* - * Initialize our cipher suite - */ - rs.clientCipherSpecDecided(tlsClient.getCompression(), tlsClient.getCipher()); - - /* - * Send our finished message. - */ - byte[] clientVerifyData = TlsUtils.calculateVerifyData(tlsClientContext, - "client finished", rs.getCurrentHash(TlsUtils.SSL_CLIENT)); - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - TlsUtils.writeUint8(HandshakeType.finished, bos); - TlsUtils.writeOpaque24(clientVerifyData, bos); - byte[] message = bos.toByteArray(); - - rs.writeMessage(ContentType.handshake, message, 0, message.length); - - this.connection_state = CS_CLIENT_FINISHED_SEND; - break; - default: - this.failWithError(AlertLevel.fatal, AlertDescription.handshake_failure); - } - break; - case HandshakeType.server_key_exchange: - { - switch (connection_state) - { - case CS_SERVER_HELLO_RECEIVED: - - // There was no server certificate message; check it's OK - this.keyExchange.skipServerCertificate(); - this.authentication = null; - - // NB: Fall through to next case label - - case CS_SERVER_CERTIFICATE_RECEIVED: - - this.keyExchange.processServerKeyExchange(is); - - assertEmpty(is); - break; - - default: - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - - this.connection_state = CS_SERVER_KEY_EXCHANGE_RECEIVED; - break; - } - case HandshakeType.certificate_request: - { - switch (connection_state) - { - case CS_SERVER_CERTIFICATE_RECEIVED: - - // There was no server key exchange message; check it's OK - this.keyExchange.skipServerKeyExchange(); - - // NB: Fall through to next case label - - case CS_SERVER_KEY_EXCHANGE_RECEIVED: - { - if (this.authentication == null) - { - /* - * RFC 2246 7.4.4. It is a fatal handshake_failure alert - * for an anonymous server to request client identification. - */ - this.failWithError(AlertLevel.fatal, AlertDescription.handshake_failure); - } - - int numTypes = TlsUtils.readUint8(is); - short[] certificateTypes = new short[numTypes]; - for (int i = 0; i < numTypes; ++i) - { - certificateTypes[i] = TlsUtils.readUint8(is); - } - - byte[] authorities = TlsUtils.readOpaque16(is); - - assertEmpty(is); - - Vector authorityDNs = new Vector(); - - ByteArrayInputStream bis = new ByteArrayInputStream(authorities); - while (bis.available() > 0) - { - byte[] dnBytes = TlsUtils.readOpaque16(bis); - authorityDNs.addElement(X500Name.getInstance(ASN1Primitive.fromByteArray(dnBytes))); - } - - this.certificateRequest = new CertificateRequest(certificateTypes, - authorityDNs); - this.keyExchange.validateCertificateRequest(this.certificateRequest); - - break; - } - default: - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - - this.connection_state = CS_CERTIFICATE_REQUEST_RECEIVED; - break; - } - case HandshakeType.hello_request: - /* - * RFC 2246 7.4.1.1 Hello request This message will be ignored by the - * client if the client is currently negotiating a session. This message - * may be ignored by the client if it does not wish to renegotiate a - * session, or the client may, if it wishes, respond with a - * no_renegotiation alert. - */ - if (connection_state == CS_DONE) - { - // Renegotiation not supported yet - sendAlert(AlertLevel.warning, AlertDescription.no_renegotiation); - } - break; - case HandshakeType.client_key_exchange: - case HandshakeType.certificate_verify: - case HandshakeType.client_hello: - default: - // We do not support this! - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - break; - } - } - - private void processApplicationData() - { - /* - * There is nothing we need to do here. - * - * This function could be used for callbacks when application data arrives in the - * future. - */ - } - - private void processAlert() throws IOException - { - while (alertQueue.size() >= 2) - { - /* - * An alert is always 2 bytes. Read the alert. - */ - byte[] tmp = new byte[2]; - alertQueue.read(tmp, 0, 2, 0); - alertQueue.removeData(2); - short level = tmp[0]; - short description = tmp[1]; - if (level == AlertLevel.fatal) - { - /* - * This is a fatal error. - */ - this.failedWithError = true; - this.closed = true; - /* - * Now try to close the stream, ignore errors. - */ - try - { - rs.close(); - } - catch (Exception e) - { - - } - throw new IOException(TLS_ERROR_MESSAGE); - } - else - { - /* - * This is just a warning. - */ - if (description == AlertDescription.close_notify) - { - /* - * Close notify - */ - this.failWithError(AlertLevel.warning, AlertDescription.close_notify); - } - /* - * If it is just a warning, we continue. - */ - } - } - } - - /** - * This method is called, when a change cipher spec message is received. - * - * @throws IOException If the message has an invalid content or the handshake is not - * in the correct state. - */ - private void processChangeCipherSpec() throws IOException - { - while (changeCipherSpecQueue.size() > 0) - { - /* - * A change cipher spec message is only one byte with the value 1. - */ - byte[] b = new byte[1]; - changeCipherSpecQueue.read(b, 0, 1, 0); - changeCipherSpecQueue.removeData(1); - if (b[0] != 1) - { - /* - * This should never happen. - */ - this.failWithError(AlertLevel.fatal, AlertDescription.unexpected_message); - } - - /* - * Check if we are in the correct connection state. - */ - if (this.connection_state != CS_CLIENT_FINISHED_SEND) - { - this.failWithError(AlertLevel.fatal, AlertDescription.handshake_failure); - } - - rs.serverClientSpecReceived(); - - this.connection_state = CS_SERVER_CHANGE_CIPHER_SPEC_RECEIVED; - } - } - - private void sendClientCertificate(Certificate clientCert) throws IOException - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - TlsUtils.writeUint8(HandshakeType.certificate, bos); - - // Reserve space for length - TlsUtils.writeUint24(0, bos); - - clientCert.encode(bos); - byte[] message = bos.toByteArray(); - - // Patch actual length back in - TlsUtils.writeUint24(message.length - 4, message, 1); - - rs.writeMessage(ContentType.handshake, message, 0, message.length); - } - - private void sendClientKeyExchange() throws IOException - { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - TlsUtils.writeUint8(HandshakeType.client_key_exchange, bos); - - // Reserve space for length - TlsUtils.writeUint24(0, bos); - - this.keyExchange.generateClientKeyExchange(bos); - byte[] message = bos.toByteArray(); - - // Patch actual length back in - TlsUtils.writeUint24(message.length - 4, message, 1); - - rs.writeMessage(ContentType.handshake, message, 0, message.length); - } - - private void sendCertificateVerify(byte[] data) throws IOException - { - /* - * Send signature of handshake messages so far to prove we are the owner of the - * cert See RFC 2246 sections 4.7, 7.4.3 and 7.4.8 - */ - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - TlsUtils.writeUint8(HandshakeType.certificate_verify, bos); - TlsUtils.writeUint24(data.length + 2, bos); - TlsUtils.writeOpaque16(data, bos); - byte[] message = bos.toByteArray(); - - rs.writeMessage(ContentType.handshake, message, 0, message.length); - } - - /** - * Connects to the remote system. - * - * @param verifyer Will be used when a certificate is received to verify that this - * certificate is accepted by the client. - * @throws IOException If handshake was not successful. - * - * @deprecated use version taking TlsClient - */ - public void connect(CertificateVerifyer verifyer) throws IOException - { - this.connect(new LegacyTlsClient(verifyer)); - } - - /** - * Connects to the remote system using client authentication - * - * @param tlsClient - * @throws IOException If handshake was not successful. - */ - public void connect(TlsClient tlsClient) throws IOException - { - if (tlsClient == null) - { - throw new IllegalArgumentException("'tlsClient' cannot be null"); - } - if (this.tlsClient != null) - { - throw new IllegalStateException("connect can only be called once"); - } - - /* - * Send Client hello - * - * First, generate some random data. - */ - this.securityParameters = new SecurityParameters(); - this.securityParameters.clientRandom = new byte[32]; - random.nextBytes(securityParameters.clientRandom); - TlsUtils.writeGMTUnixTime(securityParameters.clientRandom, 0); - - this.tlsClientContext = new TlsClientContextImpl(random, securityParameters); - - this.rs.init(tlsClientContext); - - this.tlsClient = tlsClient; - this.tlsClient.init(tlsClientContext); - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - - ProtocolVersion client_version = this.tlsClient.getClientVersion(); - this.tlsClientContext.setClientVersion(client_version); - // TODO For SSLv3 support, server version needs to be set to ProtocolVersion.SSLv3 - this.tlsClientContext.setServerVersion(client_version); - TlsUtils.writeVersion(client_version, os); - - os.write(securityParameters.clientRandom); - - /* - * Length of Session id - */ - TlsUtils.writeUint8((short)0, os); - - /* - * Cipher suites - */ - this.offeredCipherSuites = this.tlsClient.getCipherSuites(); - - // Integer -> byte[] - this.clientExtensions = this.tlsClient.getClientExtensions(); - - // Cipher Suites (and SCSV) - { - /* - * RFC 5746 3.4. The client MUST include either an empty "renegotiation_info" - * extension, or the TLS_EMPTY_RENEGOTIATION_INFO_SCSV signaling cipher suite - * value in the ClientHello. Including both is NOT RECOMMENDED. - */ - boolean noRenegExt = clientExtensions == null - || clientExtensions.get(EXT_RenegotiationInfo) == null; - - int count = offeredCipherSuites.length; - if (noRenegExt) - { - // Note: 1 extra slot for TLS_EMPTY_RENEGOTIATION_INFO_SCSV - ++count; - } - - TlsUtils.writeUint16(2 * count, os); - TlsUtils.writeUint16Array(offeredCipherSuites, os); - - if (noRenegExt) - { - TlsUtils.writeUint16(CipherSuite.TLS_EMPTY_RENEGOTIATION_INFO_SCSV, os); - } - } - - // Compression methods - this.offeredCompressionMethods = this.tlsClient.getCompressionMethods(); - - TlsUtils.writeUint8((short)offeredCompressionMethods.length, os); - TlsUtils.writeUint8Array(offeredCompressionMethods, os); - - // Extensions - if (clientExtensions != null) - { - ByteArrayOutputStream ext = new ByteArrayOutputStream(); - - Enumeration keys = clientExtensions.keys(); - while (keys.hasMoreElements()) - { - Integer extType = (Integer)keys.nextElement(); - writeExtension(ext, extType, (byte[])clientExtensions.get(extType)); - } - - TlsUtils.writeOpaque16(ext.toByteArray(), os); - } - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - TlsUtils.writeUint8(HandshakeType.client_hello, bos); - TlsUtils.writeUint24(os.size(), bos); - bos.write(os.toByteArray()); - byte[] message = bos.toByteArray(); - - safeWriteMessage(ContentType.handshake, message, 0, message.length); - - connection_state = CS_CLIENT_HELLO_SEND; - - /* - * We will now read data, until we have completed the handshake. - */ - while (connection_state != CS_DONE) - { - safeReadData(); - } - - this.tlsInputStream = new TlsInputStream(this); - this.tlsOutputStream = new TlsOutputStream(this); - } - - /** - * Read data from the network. The method will return immediately, if there is still - * some data left in the buffer, or block until some application data has been read - * from the network. - * - * @param buf The buffer where the data will be copied to. - * @param offset The position where the data will be placed in the buffer. - * @param len The maximum number of bytes to read. - * @return The number of bytes read. - * @throws IOException If something goes wrong during reading data. - */ - protected int readApplicationData(byte[] buf, int offset, int len) throws IOException - { - while (applicationDataQueue.size() == 0) - { - /* - * We need to read some data. - */ - if (this.closed) - { - if (this.failedWithError) - { - /* - * Something went terribly wrong, we should throw an IOException - */ - throw new IOException(TLS_ERROR_MESSAGE); - } - - /* - * Connection has been closed, there is no more data to read. - */ - return -1; - } - - safeReadData(); - } - len = Math.min(len, applicationDataQueue.size()); - applicationDataQueue.read(buf, offset, len, 0); - applicationDataQueue.removeData(len); - return len; - } - - private void safeReadData() throws IOException - { - try - { - rs.readData(); - } - catch (TlsFatalAlert e) - { - if (!this.closed) - { - this.failWithError(AlertLevel.fatal, e.getAlertDescription()); - } - throw e; - } - catch (IOException e) - { - if (!this.closed) - { - this.failWithError(AlertLevel.fatal, AlertDescription.internal_error); - } - throw e; - } - catch (RuntimeException e) - { - if (!this.closed) - { - this.failWithError(AlertLevel.fatal, AlertDescription.internal_error); - } - throw e; - } - } - - private void safeWriteMessage(short type, byte[] buf, int offset, int len) throws IOException - { - try - { - rs.writeMessage(type, buf, offset, len); - } - catch (TlsFatalAlert e) - { - if (!this.closed) - { - this.failWithError(AlertLevel.fatal, e.getAlertDescription()); - } - throw e; - } - catch (IOException e) - { - if (!closed) - { - this.failWithError(AlertLevel.fatal, AlertDescription.internal_error); - } - throw e; - } - catch (RuntimeException e) - { - if (!closed) - { - this.failWithError(AlertLevel.fatal, AlertDescription.internal_error); - } - throw e; - } - } - - /** - * Send some application data to the remote system. - *

    - * The method will handle fragmentation internally. - * - * @param buf The buffer with the data. - * @param offset The position in the buffer where the data is placed. - * @param len The length of the data. - * @throws IOException If something goes wrong during sending. - */ - protected void writeData(byte[] buf, int offset, int len) throws IOException - { - if (this.closed) - { - if (this.failedWithError) - { - throw new IOException(TLS_ERROR_MESSAGE); - } - - throw new IOException("Sorry, connection has been closed, you cannot write more data"); - } - - /* - * Protect against known IV attack! - * - * DO NOT REMOVE THIS LINE, EXCEPT YOU KNOW EXACTLY WHAT YOU ARE DOING HERE. - */ - safeWriteMessage(ContentType.application_data, emptybuf, 0, 0); - - do - { - /* - * We are only allowed to write fragments up to 2^14 bytes. - */ - int toWrite = Math.min(len, 1 << 14); - - safeWriteMessage(ContentType.application_data, buf, offset, toWrite); - - offset += toWrite; - len -= toWrite; - } - while (len > 0); - - } - - /** - * @return An OutputStream which can be used to send data. - */ - public OutputStream getOutputStream() - { - return this.tlsOutputStream; - } - - /** - * @return An InputStream which can be used to read data. - */ - public InputStream getInputStream() - { - return this.tlsInputStream; - } - - /** - * Terminate this connection with an alert. - *

    - * Can be used for normal closure too. - * - * @param alertLevel The level of the alert, an be AlertLevel.fatal or AL_warning. - * @param alertDescription The exact alert message. - * @throws IOException If alert was fatal. - */ - private void failWithError(short alertLevel, short alertDescription) throws IOException - { - /* - * Check if the connection is still open. - */ - if (!closed) - { - /* - * Prepare the message - */ - this.closed = true; - - if (alertLevel == AlertLevel.fatal) - { - /* - * This is a fatal message. - */ - this.failedWithError = true; - } - sendAlert(alertLevel, alertDescription); - rs.close(); - if (alertLevel == AlertLevel.fatal) - { - throw new IOException(TLS_ERROR_MESSAGE); - } - } - else - { - throw new IOException(TLS_ERROR_MESSAGE); - } - } - - private void sendAlert(short alertLevel, short alertDescription) throws IOException - { - byte[] error = new byte[2]; - error[0] = (byte)alertLevel; - error[1] = (byte)alertDescription; - - rs.writeMessage(ContentType.alert, error, 0, 2); - } - - /** - * Closes this connection. - * - * @throws IOException If something goes wrong during closing. - */ - public void close() throws IOException - { - if (!closed) - { - this.failWithError(AlertLevel.warning, AlertDescription.close_notify); - } - } - - /** - * Make sure the InputStream is now empty. Fail otherwise. - * - * @param is The InputStream to check. - * @throws IOException If is is not empty. - */ - protected void assertEmpty(ByteArrayInputStream is) throws IOException - { - if (is.available() > 0) - { - throw new TlsFatalAlert(AlertDescription.decode_error); - } - } - - protected void flush() throws IOException - { - rs.flush(); - } - - private static boolean arrayContains(short[] a, short n) - { - for (int i = 0; i < a.length; ++i) - { - if (a[i] == n) - { - return true; - } - } - return false; - } - - private static boolean arrayContains(int[] a, int n) - { - for (int i = 0; i < a.length; ++i) - { - if (a[i] == n) - { - return true; - } - } - return false; - } - - private static byte[] createRenegotiationInfo(byte[] renegotiated_connection) - throws IOException - { - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - TlsUtils.writeOpaque8(renegotiated_connection, buf); - return buf.toByteArray(); - } - - private static void writeExtension(OutputStream output, Integer extType, byte[] extValue) - throws IOException - { - TlsUtils.writeUint16(extType.intValue(), output); - TlsUtils.writeOpaque16(extValue, output); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAKeyExchange.java deleted file mode 100644 index db06628..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAKeyExchange.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.util.PublicKeyFactory; - -/** - * TLS 1.0 and SSLv3 RSA key exchange. - */ -class TlsRSAKeyExchange implements TlsKeyExchange -{ - protected TlsClientContext context; - - protected AsymmetricKeyParameter serverPublicKey = null; - - protected RSAKeyParameters rsaServerPublicKey = null; - - protected byte[] premasterSecret; - - TlsRSAKeyExchange(TlsClientContext context) - { - this.context = context; - } - - public void skipServerCertificate() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerCertificate(Certificate serverCertificate) throws IOException - { - org.bc.asn1.x509.Certificate x509Cert = serverCertificate.certs[0]; - SubjectPublicKeyInfo keyInfo = x509Cert.getSubjectPublicKeyInfo(); - - try - { - this.serverPublicKey = PublicKeyFactory.createKey(keyInfo); - } - catch (RuntimeException e) - { - throw new TlsFatalAlert(AlertDescription.unsupported_certificate); - } - - // Sanity check the PublicKeyFactory - if (this.serverPublicKey.isPrivate()) - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - this.rsaServerPublicKey = validateRSAPublicKey((RSAKeyParameters)this.serverPublicKey); - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.keyEncipherment); - - // TODO - /* - * Perform various checks per RFC2246 7.4.2: "Unless otherwise specified, the - * signing algorithm for the certificate must be the same as the algorithm for the - * certificate key." - */ - } - - public void skipServerKeyExchange() throws IOException - { - // OK - } - - public void processServerKeyExchange(InputStream is) - throws IOException - { - // TODO - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - short[] types = certificateRequest.getCertificateTypes(); - for (int i = 0; i < types.length; ++i) - { - switch (types[i]) - { - case ClientCertificateType.rsa_sign: - case ClientCertificateType.dss_sign: - case ClientCertificateType.ecdsa_sign: - break; - default: - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - } - - public void skipClientCredentials() throws IOException - { - // OK - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - if (!(clientCredentials instanceof TlsSignerCredentials)) - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - } - - public void generateClientKeyExchange(OutputStream os) throws IOException - { - this.premasterSecret = TlsRSAUtils.generateEncryptedPreMasterSecret(context, - this.rsaServerPublicKey, os); - } - - public byte[] generatePremasterSecret() throws IOException - { - byte[] tmp = this.premasterSecret; - this.premasterSecret = null; - return tmp; - } - - // Would be needed to process RSA_EXPORT server key exchange -// protected void processRSAServerKeyExchange(InputStream is, Signer signer) throws IOException -// { -// InputStream sigIn = is; -// if (signer != null) -// { -// sigIn = new SignerInputStream(is, signer); -// } -// -// byte[] modulusBytes = TlsUtils.readOpaque16(sigIn); -// byte[] exponentBytes = TlsUtils.readOpaque16(sigIn); -// -// if (signer != null) -// { -// byte[] sigByte = TlsUtils.readOpaque16(is); -// -// if (!signer.verifySignature(sigByte)) -// { -// handler.failWithError(AlertLevel.fatal, AlertDescription.bad_certificate); -// } -// } -// -// BigInteger modulus = new BigInteger(1, modulusBytes); -// BigInteger exponent = new BigInteger(1, exponentBytes); -// -// this.rsaServerPublicKey = validateRSAPublicKey(new RSAKeyParameters(false, modulus, -// exponent)); -// } - - protected RSAKeyParameters validateRSAPublicKey(RSAKeyParameters key) throws IOException - { - // TODO What is the minimum bit length required? -// key.getModulus().bitLength(); - - if (!key.getExponent().isProbablePrime(2)) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - - return key; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSASigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSASigner.java deleted file mode 100644 index 05ac66d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSASigner.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.bc.crypto.tls; - -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Signer; -import org.bc.crypto.digests.NullDigest; -import org.bc.crypto.encodings.PKCS1Encoding; -import org.bc.crypto.engines.RSABlindedEngine; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.signers.GenericSigner; - -class TlsRSASigner implements TlsSigner -{ - public byte[] calculateRawSignature(SecureRandom random, AsymmetricKeyParameter privateKey, byte[] md5andsha1) - throws CryptoException - { - Signer sig = new GenericSigner(new PKCS1Encoding(new RSABlindedEngine()), new NullDigest()); - sig.init(true, new ParametersWithRandom(privateKey, random)); - sig.update(md5andsha1, 0, md5andsha1.length); - return sig.generateSignature(); - } - - public Signer createVerifyer(AsymmetricKeyParameter publicKey) - { - Signer s = new GenericSigner(new PKCS1Encoding(new RSABlindedEngine()), new CombinedHash()); - s.init(false, publicKey); - return s; - } - - public boolean isValidPublicKey(AsymmetricKeyParameter publicKey) - { - return publicKey instanceof RSAKeyParameters && !publicKey.isPrivate(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAUtils.java deleted file mode 100644 index f9a475b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRSAUtils.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.OutputStream; - -import org.bc.crypto.InvalidCipherTextException; -import org.bc.crypto.encodings.PKCS1Encoding; -import org.bc.crypto.engines.RSABlindedEngine; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.params.RSAKeyParameters; - -public class TlsRSAUtils -{ - public static byte[] generateEncryptedPreMasterSecret(TlsClientContext context, - RSAKeyParameters rsaServerPublicKey, OutputStream os) throws IOException - { - /* - * Choose a PremasterSecret and send it encrypted to the server - */ - byte[] premasterSecret = new byte[48]; - context.getSecureRandom().nextBytes(premasterSecret); - TlsUtils.writeVersion(context.getClientVersion(), premasterSecret, 0); - - PKCS1Encoding encoding = new PKCS1Encoding(new RSABlindedEngine()); - encoding.init(true, new ParametersWithRandom(rsaServerPublicKey, context.getSecureRandom())); - - try - { - boolean isTls = context.getServerVersion().getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - byte[] keData = encoding.processBlock(premasterSecret, 0, premasterSecret.length); - - if (isTls) - { - TlsUtils.writeOpaque16(keData, os); - } - else - { - os.write(keData); - } - } - catch (InvalidCipherTextException e) - { - /* - * This should never happen, only during decryption. - */ - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - return premasterSecret; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRuntimeException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRuntimeException.java deleted file mode 100644 index 1b5a21b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsRuntimeException.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.crypto.tls; - -public class TlsRuntimeException extends RuntimeException -{ - private static final long serialVersionUID = 1928023487348344086L; - - Throwable e; - - public TlsRuntimeException(String message, Throwable e) - { - super(message); - - this.e = e; - } - - public TlsRuntimeException(String message) - { - super(message); - } - - public Throwable getCause() - { - return e; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSRPKeyExchange.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSRPKeyExchange.java deleted file mode 100644 index 46ad74c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSRPKeyExchange.java +++ /dev/null @@ -1,202 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.math.BigInteger; - -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.crypto.CryptoException; -import org.bc.crypto.Signer; -import org.bc.crypto.agreement.srp.SRP6Client; -import org.bc.crypto.agreement.srp.SRP6Util; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.io.SignerInputStream; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.util.PublicKeyFactory; -import org.bc.util.BigIntegers; - -/** - * TLS 1.1 SRP key exchange. - */ -class TlsSRPKeyExchange implements TlsKeyExchange -{ - protected TlsClientContext context; - protected int keyExchange; - protected TlsSigner tlsSigner; - protected byte[] identity; - protected byte[] password; - - protected AsymmetricKeyParameter serverPublicKey = null; - - protected byte[] s = null; - protected BigInteger B = null; - protected SRP6Client srpClient = new SRP6Client(); - - TlsSRPKeyExchange(TlsClientContext context, int keyExchange, byte[] identity, byte[] password) - { - switch (keyExchange) - { - case KeyExchangeAlgorithm.SRP: - this.tlsSigner = null; - break; - case KeyExchangeAlgorithm.SRP_RSA: - this.tlsSigner = new TlsRSASigner(); - break; - case KeyExchangeAlgorithm.SRP_DSS: - this.tlsSigner = new TlsDSSSigner(); - break; - default: - throw new IllegalArgumentException("unsupported key exchange algorithm"); - } - - this.context = context; - this.keyExchange = keyExchange; - this.identity = identity; - this.password = password; - } - - public void skipServerCertificate() throws IOException - { - if (tlsSigner != null) - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - } - - public void processServerCertificate(Certificate serverCertificate) throws IOException - { - if (tlsSigner == null) - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - org.bc.asn1.x509.Certificate x509Cert = serverCertificate.certs[0]; - SubjectPublicKeyInfo keyInfo = x509Cert.getSubjectPublicKeyInfo(); - - try - { - this.serverPublicKey = PublicKeyFactory.createKey(keyInfo); - } - catch (RuntimeException e) - { - throw new TlsFatalAlert(AlertDescription.unsupported_certificate); - } - - if (!tlsSigner.isValidPublicKey(this.serverPublicKey)) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - - TlsUtils.validateKeyUsage(x509Cert, KeyUsage.digitalSignature); - - // TODO - /* - * Perform various checks per RFC2246 7.4.2: "Unless otherwise specified, the - * signing algorithm for the certificate must be the same as the algorithm for the - * certificate key." - */ - } - - public void skipServerKeyExchange() throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void processServerKeyExchange(InputStream is) throws IOException - { - SecurityParameters securityParameters = context.getSecurityParameters(); - - InputStream sigIn = is; - Signer signer = null; - - if (tlsSigner != null) - { - signer = initSigner(tlsSigner, securityParameters); - sigIn = new SignerInputStream(is, signer); - } - - byte[] NBytes = TlsUtils.readOpaque16(sigIn); - byte[] gBytes = TlsUtils.readOpaque16(sigIn); - byte[] sBytes = TlsUtils.readOpaque8(sigIn); - byte[] BBytes = TlsUtils.readOpaque16(sigIn); - - if (signer != null) - { - byte[] sigByte = TlsUtils.readOpaque16(is); - - if (!signer.verifySignature(sigByte)) - { - throw new TlsFatalAlert(AlertDescription.bad_certificate); - } - } - - BigInteger N = new BigInteger(1, NBytes); - BigInteger g = new BigInteger(1, gBytes); - - // TODO Validate group parameters (see RFC 5054) -// handler.failWithError(AlertLevel.fatal, AlertDescription.insufficient_security); - - this.s = sBytes; - - /* - * RFC 5054 2.5.3: The client MUST abort the handshake with an "illegal_parameter" - * alert if B % N = 0. - */ - try - { - this.B = SRP6Util.validatePublicValue(N, new BigInteger(1, BBytes)); - } - catch (CryptoException e) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - - this.srpClient.init(N, g, new SHA1Digest(), context.getSecureRandom()); - } - - public void validateCertificateRequest(CertificateRequest certificateRequest) - throws IOException - { - throw new TlsFatalAlert(AlertDescription.unexpected_message); - } - - public void skipClientCredentials() throws IOException - { - // OK - } - - public void processClientCredentials(TlsCredentials clientCredentials) throws IOException - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - public void generateClientKeyExchange(OutputStream os) throws IOException - { - byte[] keData = BigIntegers.asUnsignedByteArray(srpClient.generateClientCredentials(s, - this.identity, this.password)); - TlsUtils.writeOpaque16(keData, os); - } - - public byte[] generatePremasterSecret() throws IOException - { - try - { - // TODO Check if this needs to be a fixed size - return BigIntegers.asUnsignedByteArray(srpClient.calculateSecret(B)); - } - catch (CryptoException e) - { - throw new TlsFatalAlert(AlertDescription.illegal_parameter); - } - } - - protected Signer initSigner(TlsSigner tlsSigner, SecurityParameters securityParameters) - { - Signer signer = tlsSigner.createVerifyer(this.serverPublicKey); - signer.update(securityParameters.clientRandom, 0, securityParameters.clientRandom.length); - signer.update(securityParameters.serverRandom, 0, securityParameters.serverRandom.length); - return signer; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSigner.java deleted file mode 100644 index 1b3dc47..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSigner.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.crypto.tls; - -import java.security.SecureRandom; - -import org.bc.crypto.CryptoException; -import org.bc.crypto.Signer; -import org.bc.crypto.params.AsymmetricKeyParameter; - -interface TlsSigner -{ - byte[] calculateRawSignature(SecureRandom random, AsymmetricKeyParameter privateKey, byte[] md5andsha1) - throws CryptoException; - - Signer createVerifyer(AsymmetricKeyParameter publicKey); - - boolean isValidPublicKey(AsymmetricKeyParameter publicKey); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSignerCredentials.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSignerCredentials.java deleted file mode 100644 index 1ba7a95..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsSignerCredentials.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -public interface TlsSignerCredentials extends TlsCredentials -{ - byte[] generateCertificateSignature(byte[] md5andsha1) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsStreamCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsStreamCipher.java deleted file mode 100644 index 4fe5a54..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsStreamCipher.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.IOException; - -import org.bc.crypto.Digest; -import org.bc.crypto.StreamCipher; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Arrays; - -public class TlsStreamCipher implements TlsCipher -{ - protected TlsClientContext context; - - protected StreamCipher encryptCipher; - protected StreamCipher decryptCipher; - - protected TlsMac writeMac; - protected TlsMac readMac; - - public TlsStreamCipher(TlsClientContext context, StreamCipher encryptCipher, - StreamCipher decryptCipher, Digest writeDigest, Digest readDigest, int cipherKeySize) - throws IOException - { - this.context = context; - this.encryptCipher = encryptCipher; - this.decryptCipher = decryptCipher; - - int prfSize = (2 * cipherKeySize) + writeDigest.getDigestSize() - + readDigest.getDigestSize(); - - SecurityParameters securityParameters = context.getSecurityParameters(); - - byte[] keyBlock = TlsUtils.PRF(securityParameters.masterSecret, "key expansion", - TlsUtils.concat(securityParameters.serverRandom, securityParameters.clientRandom), - prfSize); - - int offset = 0; - - // Init MACs - writeMac = new TlsMac(context, writeDigest, keyBlock, offset, writeDigest.getDigestSize()); - offset += writeDigest.getDigestSize(); - readMac = new TlsMac(context, readDigest, keyBlock, offset, readDigest.getDigestSize()); - offset += readDigest.getDigestSize(); - - // Build keys - KeyParameter encryptKey = new KeyParameter(keyBlock, offset, cipherKeySize); - offset += cipherKeySize; - KeyParameter decryptKey = new KeyParameter(keyBlock, offset, cipherKeySize); - offset += cipherKeySize; - - if (offset != prfSize) - { - throw new TlsFatalAlert(AlertDescription.internal_error); - } - - encryptCipher.init(true, encryptKey); - decryptCipher.init(true, decryptKey); - } - - public byte[] encodePlaintext(short type, byte[] plaintext, int offset, int len) - { - byte[] mac = writeMac.calculateMac(type, plaintext, offset, len); - - byte[] outbuf = new byte[len + mac.length]; - - encryptCipher.processBytes(plaintext, offset, len, outbuf, 0); - encryptCipher.processBytes(mac, 0, mac.length, outbuf, len); - - return outbuf; - } - - public byte[] decodeCiphertext(short type, byte[] ciphertext, int offset, int len) - throws IOException - { - byte[] deciphered = new byte[len]; - decryptCipher.processBytes(ciphertext, offset, len, deciphered, 0); - - int plaintextSize = deciphered.length - readMac.getSize(); - byte[] plainText = copyData(deciphered, 0, plaintextSize); - - byte[] receivedMac = copyData(deciphered, plaintextSize, readMac.getSize()); - byte[] computedMac = readMac.calculateMac(type, plainText, 0, plainText.length); - - if (!Arrays.constantTimeAreEqual(receivedMac, computedMac)) - { - throw new TlsFatalAlert(AlertDescription.bad_record_mac); - } - - return plainText; - } - - protected byte[] copyData(byte[] text, int offset, int len) - { - byte[] result = new byte[len]; - System.arraycopy(text, offset, result, 0, len); - return result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsUtils.java deleted file mode 100644 index ee54de3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/tls/TlsUtils.java +++ /dev/null @@ -1,437 +0,0 @@ -package org.bc.crypto.tls; - -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.bc.asn1.x509.Extension; -import org.bc.asn1.x509.Extensions; -import org.bc.asn1.x509.KeyUsage; -import org.bc.asn1.x509.X509Extension; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.MD5Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.macs.HMac; -import org.bc.crypto.params.KeyParameter; -import org.bc.util.Arrays; -import org.bc.util.Strings; -import org.bc.util.io.Streams; - -/** - * Some helper fuctions for MicroTLS. - */ -public class TlsUtils -{ - protected static void writeUint8(short i, OutputStream os) throws IOException - { - os.write(i); - } - - protected static void writeUint8(short i, byte[] buf, int offset) - { - buf[offset] = (byte)i; - } - - protected static void writeUint16(int i, OutputStream os) throws IOException - { - os.write(i >> 8); - os.write(i); - } - - protected static void writeUint16(int i, byte[] buf, int offset) - { - buf[offset] = (byte)(i >> 8); - buf[offset + 1] = (byte)i; - } - - protected static void writeUint24(int i, OutputStream os) throws IOException - { - os.write(i >> 16); - os.write(i >> 8); - os.write(i); - } - - protected static void writeUint24(int i, byte[] buf, int offset) - { - buf[offset] = (byte)(i >> 16); - buf[offset + 1] = (byte)(i >> 8); - buf[offset + 2] = (byte)(i); - } - - protected static void writeUint32(long i, OutputStream os) throws IOException - { - os.write((int)(i >> 24)); - os.write((int)(i >> 16)); - os.write((int)(i >> 8)); - os.write((int)(i)); - } - - protected static void writeUint32(long i, byte[] buf, int offset) - { - buf[offset] = (byte)(i >> 24); - buf[offset + 1] = (byte)(i >> 16); - buf[offset + 2] = (byte)(i >> 8); - buf[offset + 3] = (byte)(i); - } - - protected static void writeUint64(long i, OutputStream os) throws IOException - { - os.write((int)(i >> 56)); - os.write((int)(i >> 48)); - os.write((int)(i >> 40)); - os.write((int)(i >> 32)); - os.write((int)(i >> 24)); - os.write((int)(i >> 16)); - os.write((int)(i >> 8)); - os.write((int)(i)); - } - - - protected static void writeUint64(long i, byte[] buf, int offset) - { - buf[offset] = (byte)(i >> 56); - buf[offset + 1] = (byte)(i >> 48); - buf[offset + 2] = (byte)(i >> 40); - buf[offset + 3] = (byte)(i >> 32); - buf[offset + 4] = (byte)(i >> 24); - buf[offset + 5] = (byte)(i >> 16); - buf[offset + 6] = (byte)(i >> 8); - buf[offset + 7] = (byte)(i); - } - - protected static void writeOpaque8(byte[] buf, OutputStream os) throws IOException - { - writeUint8((short)buf.length, os); - os.write(buf); - } - - protected static void writeOpaque16(byte[] buf, OutputStream os) throws IOException - { - writeUint16(buf.length, os); - os.write(buf); - } - - protected static void writeOpaque24(byte[] buf, OutputStream os) throws IOException - { - writeUint24(buf.length, os); - os.write(buf); - } - - protected static void writeUint8Array(short[] uints, OutputStream os) throws IOException - { - for (int i = 0; i < uints.length; ++i) - { - writeUint8(uints[i], os); - } - } - - protected static void writeUint16Array(int[] uints, OutputStream os) throws IOException - { - for (int i = 0; i < uints.length; ++i) - { - writeUint16(uints[i], os); - } - } - - protected static short readUint8(InputStream is) throws IOException - { - int i = is.read(); - if (i == -1) - { - throw new EOFException(); - } - return (short)i; - } - - protected static int readUint16(InputStream is) throws IOException - { - int i1 = is.read(); - int i2 = is.read(); - if ((i1 | i2) < 0) - { - throw new EOFException(); - } - return i1 << 8 | i2; - } - - protected static int readUint24(InputStream is) throws IOException - { - int i1 = is.read(); - int i2 = is.read(); - int i3 = is.read(); - if ((i1 | i2 | i3) < 0) - { - throw new EOFException(); - } - return (i1 << 16) | (i2 << 8) | i3; - } - - protected static long readUint32(InputStream is) throws IOException - { - int i1 = is.read(); - int i2 = is.read(); - int i3 = is.read(); - int i4 = is.read(); - if ((i1 | i2 | i3 | i4) < 0) - { - throw new EOFException(); - } - return (((long)i1) << 24) | (((long)i2) << 16) | (((long)i3) << 8) | ((long)i4); - } - - protected static void readFully(byte[] buf, InputStream is) throws IOException - { - if (Streams.readFully(is, buf) != buf.length) - { - throw new EOFException(); - } - } - - protected static byte[] readOpaque8(InputStream is) throws IOException - { - short length = readUint8(is); - byte[] value = new byte[length]; - readFully(value, is); - return value; - } - - protected static byte[] readOpaque16(InputStream is) throws IOException - { - int length = readUint16(is); - byte[] value = new byte[length]; - readFully(value, is); - return value; - } - - static ProtocolVersion readVersion(byte[] buf) throws IOException - { - return ProtocolVersion.get(buf[0], buf[1]); - } - - static ProtocolVersion readVersion(InputStream is) throws IOException - { - int i1 = is.read(); - int i2 = is.read(); - return ProtocolVersion.get(i1, i2); - } - - protected static void writeGMTUnixTime(byte[] buf, int offset) - { - int t = (int)(System.currentTimeMillis() / 1000L); - buf[offset] = (byte)(t >> 24); - buf[offset + 1] = (byte)(t >> 16); - buf[offset + 2] = (byte)(t >> 8); - buf[offset + 3] = (byte)t; - } - - static void writeVersion(ProtocolVersion version, OutputStream os) throws IOException - { - os.write(version.getMajorVersion()); - os.write(version.getMinorVersion()); - } - - static void writeVersion(ProtocolVersion version, byte[] buf, int offset) throws IOException - { - buf[offset] = (byte)version.getMajorVersion(); - buf[offset + 1] = (byte)version.getMinorVersion(); - } - - private static void hmac_hash(Digest digest, byte[] secret, byte[] seed, byte[] out) - { - HMac mac = new HMac(digest); - KeyParameter param = new KeyParameter(secret); - byte[] a = seed; - int size = digest.getDigestSize(); - int iterations = (out.length + size - 1) / size; - byte[] buf = new byte[mac.getMacSize()]; - byte[] buf2 = new byte[mac.getMacSize()]; - for (int i = 0; i < iterations; i++) - { - mac.init(param); - mac.update(a, 0, a.length); - mac.doFinal(buf, 0); - a = buf; - mac.init(param); - mac.update(a, 0, a.length); - mac.update(seed, 0, seed.length); - mac.doFinal(buf2, 0); - System.arraycopy(buf2, 0, out, (size * i), Math.min(size, out.length - (size * i))); - } - } - - protected static byte[] PRF(byte[] secret, String asciiLabel, byte[] seed, int size) - { - byte[] label = Strings.toByteArray(asciiLabel); - - int s_half = (secret.length + 1) / 2; - byte[] s1 = new byte[s_half]; - byte[] s2 = new byte[s_half]; - System.arraycopy(secret, 0, s1, 0, s_half); - System.arraycopy(secret, secret.length - s_half, s2, 0, s_half); - - byte[] ls = concat(label, seed); - - byte[] buf = new byte[size]; - byte[] prf = new byte[size]; - hmac_hash(new MD5Digest(), s1, ls, prf); - hmac_hash(new SHA1Digest(), s2, ls, buf); - for (int i = 0; i < size; i++) - { - buf[i] ^= prf[i]; - } - return buf; - } - - static byte[] PRF_1_2(Digest digest, byte[] secret, String asciiLabel, byte[] seed, int size) - { - byte[] label = Strings.toByteArray(asciiLabel); - byte[] labelSeed = concat(label, seed); - - byte[] buf = new byte[size]; - hmac_hash(digest, secret, labelSeed, buf); - return buf; - } - - static byte[] concat(byte[] a, byte[] b) - { - byte[] c = new byte[a.length + b.length]; - System.arraycopy(a, 0, c, 0, a.length); - System.arraycopy(b, 0, c, a.length, b.length); - return c; - } - - static void validateKeyUsage(org.bc.asn1.x509.Certificate c, int keyUsageBits) throws IOException - { - Extensions exts = c.getTBSCertificate().getExtensions(); - if (exts != null) - { - Extension ext = exts.getExtension(X509Extension.keyUsage); - if (ext != null) - { - KeyUsage ku = KeyUsage.getInstance(ext); - int bits = ku.getBytes()[0] & 0xff; - if ((bits & keyUsageBits) != keyUsageBits) - { - throw new TlsFatalAlert(AlertDescription.certificate_unknown); - } - } - } - } - - static byte[] calculateKeyBlock(TlsClientContext context, int size) - { - ProtocolVersion pv = context.getServerVersion(); - SecurityParameters sp = context.getSecurityParameters(); - byte[] random = concat(sp.serverRandom, sp.clientRandom); - - boolean isTls = pv.getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - return PRF(sp.masterSecret, "key expansion", random, size); - } - - Digest md5 = new MD5Digest(); - Digest sha1 = new SHA1Digest(); - int md5Size = md5.getDigestSize(); - byte[] shatmp = new byte[sha1.getDigestSize()]; - byte[] tmp = new byte[size + md5Size]; - - int i = 0, pos = 0; - while (pos < size) - { - byte[] ssl3Const = SSL3_CONST[i]; - - sha1.update(ssl3Const, 0, ssl3Const.length); - sha1.update(sp.masterSecret, 0, sp.masterSecret.length); - sha1.update(random, 0, random.length); - sha1.doFinal(shatmp, 0); - - md5.update(sp.masterSecret, 0, sp.masterSecret.length); - md5.update(shatmp, 0, shatmp.length); - md5.doFinal(tmp, pos); - - pos += md5Size; - ++i; - } - - byte rval[] = new byte[size]; - System.arraycopy(tmp, 0, rval, 0, size); - return rval; - } - - static byte[] calculateMasterSecret(TlsClientContext context, byte[] pms) - { - ProtocolVersion pv = context.getServerVersion(); - SecurityParameters sp = context.getSecurityParameters(); - byte[] random = concat(sp.clientRandom, sp.serverRandom); - - boolean isTls = pv.getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - return PRF(pms, "master secret", random, 48); - } - - Digest md5 = new MD5Digest(); - Digest sha1 = new SHA1Digest(); - int md5Size = md5.getDigestSize(); - byte[] shatmp = new byte[sha1.getDigestSize()]; - - byte[] rval = new byte[md5Size * 3]; - int pos = 0; - - for (int i = 0; i < 3; ++i) - { - byte[] ssl3Const = SSL3_CONST[i]; - - sha1.update(ssl3Const, 0, ssl3Const.length); - sha1.update(pms, 0, pms.length); - sha1.update(random, 0, random.length); - sha1.doFinal(shatmp, 0); - - md5.update(pms, 0, pms.length); - md5.update(shatmp, 0, shatmp.length); - md5.doFinal(rval, pos); - - pos += md5Size; - } - - return rval; - } - - static byte[] calculateVerifyData(TlsClientContext context, String asciiLabel, byte[] handshakeHash) - { - ProtocolVersion pv = context.getServerVersion(); - SecurityParameters sp = context.getSecurityParameters(); - - boolean isTls = pv.getFullVersion() >= ProtocolVersion.TLSv10.getFullVersion(); - - if (isTls) - { - return PRF(sp.masterSecret, asciiLabel, handshakeHash, 12); - } - - return handshakeHash; - } - - static final byte[] SSL_CLIENT = { 0x43, 0x4C, 0x4E, 0x54 }; - static final byte[] SSL_SERVER = { 0x53, 0x52, 0x56, 0x52 }; - - // SSL3 magic mix constants ("A", "BB", "CCC", ...) - static final byte[][] SSL3_CONST = genConst(); - - private static byte[][] genConst() - { - int n = 10; - byte[][] arr = new byte[n][]; - for (int i = 0; i < n; i++) - { - byte[] b = new byte[i + 1]; - Arrays.fill(b, (byte)('A' + i)); - arr[i] = b; - } - return arr; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/Pack.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/Pack.java deleted file mode 100644 index c36d70c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/Pack.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.bc.crypto.util; - -public abstract class Pack -{ - public static int bigEndianToInt(byte[] bs, int off) - { - int n = bs[ off] << 24; - n |= (bs[++off] & 0xff) << 16; - n |= (bs[++off] & 0xff) << 8; - n |= (bs[++off] & 0xff); - return n; - } - - public static void bigEndianToInt(byte[] bs, int off, int[] ns) - { - for (int i = 0; i < ns.length; ++i) - { - ns[i] = bigEndianToInt(bs, off); - off += 4; - } - } - - public static void intToBigEndian(int n, byte[] bs, int off) - { - bs[ off] = (byte)(n >>> 24); - bs[++off] = (byte)(n >>> 16); - bs[++off] = (byte)(n >>> 8); - bs[++off] = (byte)(n ); - } - - public static void intToBigEndian(int[] ns, byte[] bs, int off) - { - for (int i = 0; i < ns.length; ++i) - { - intToBigEndian(ns[i], bs, off); - off += 4; - } - } - - public static long bigEndianToLong(byte[] bs, int off) - { - int hi = bigEndianToInt(bs, off); - int lo = bigEndianToInt(bs, off + 4); - return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); - } - - public static void longToBigEndian(long n, byte[] bs, int off) - { - intToBigEndian((int)(n >>> 32), bs, off); - intToBigEndian((int)(n & 0xffffffffL), bs, off + 4); - } - - public static int littleEndianToInt(byte[] bs, int off) - { - int n = bs[ off] & 0xff; - n |= (bs[++off] & 0xff) << 8; - n |= (bs[++off] & 0xff) << 16; - n |= bs[++off] << 24; - return n; - } - - public static void littleEndianToInt(byte[] bs, int off, int[] ns) - { - for (int i = 0; i < ns.length; ++i) - { - ns[i] = littleEndianToInt(bs, off); - off += 4; - } - } - - public static void intToLittleEndian(int n, byte[] bs, int off) - { - bs[ off] = (byte)(n ); - bs[++off] = (byte)(n >>> 8); - bs[++off] = (byte)(n >>> 16); - bs[++off] = (byte)(n >>> 24); - } - - public static void intToLittleEndian(int[] ns, byte[] bs, int off) - { - for (int i = 0; i < ns.length; ++i) - { - intToLittleEndian(ns[i], bs, off); - off += 4; - } - } - - public static long littleEndianToLong(byte[] bs, int off) - { - int lo = littleEndianToInt(bs, off); - int hi = littleEndianToInt(bs, off + 4); - return ((long)(hi & 0xffffffffL) << 32) | (long)(lo & 0xffffffffL); - } - - public static void longToLittleEndian(long n, byte[] bs, int off) - { - intToLittleEndian((int)(n & 0xffffffffL), bs, off); - intToLittleEndian((int)(n >>> 32), bs, off + 4); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyFactory.java deleted file mode 100644 index c2a4691..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyFactory.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.bc.crypto.util; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.nist.NISTNamedCurves; -import org.bc.asn1.oiw.ElGamalParameter; -import org.bc.asn1.oiw.OIWObjectIdentifiers; -import org.bc.asn1.pkcs.DHParameter; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.pkcs.PrivateKeyInfo; -import org.bc.asn1.pkcs.RSAPrivateKey; -import org.bc.asn1.sec.ECPrivateKey; -import org.bc.asn1.sec.SECNamedCurves; -import org.bc.asn1.teletrust.TeleTrusTNamedCurves; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.DSAParameter; -import org.bc.asn1.x9.X962NamedCurves; -import org.bc.asn1.x9.X962Parameters; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.asn1.x9.X9ObjectIdentifiers; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPrivateKeyParameters; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAPrivateKeyParameters; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPrivateKeyParameters; -import org.bc.crypto.params.ElGamalParameters; -import org.bc.crypto.params.ElGamalPrivateKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; - -/** - * Factory for creating private key objects from PKCS8 PrivateKeyInfo objects. - */ -public class PrivateKeyFactory -{ - /** - * Create a private key parameter from a PKCS8 PrivateKeyInfo encoding. - * - * @param privateKeyInfoData the PrivateKeyInfo encoding - * @return a suitable private key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(byte[] privateKeyInfoData) throws IOException - { - return createKey(PrivateKeyInfo.getInstance(ASN1Primitive.fromByteArray(privateKeyInfoData))); - } - - /** - * Create a private key parameter from a PKCS8 PrivateKeyInfo encoding read from a - * stream. - * - * @param inStr the stream to read the PrivateKeyInfo encoding from - * @return a suitable private key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(InputStream inStr) throws IOException - { - return createKey(PrivateKeyInfo.getInstance(new ASN1InputStream(inStr).readObject())); - } - - /** - * Create a private key parameter from the passed in PKCS8 PrivateKeyInfo object. - * - * @param keyInfo the PrivateKeyInfo object containing the key material - * @return a suitable private key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(PrivateKeyInfo keyInfo) throws IOException - { - AlgorithmIdentifier algId = keyInfo.getPrivateKeyAlgorithm(); - - if (algId.getAlgorithm().equals(PKCSObjectIdentifiers.rsaEncryption)) - { - RSAPrivateKey keyStructure = RSAPrivateKey.getInstance(keyInfo.parsePrivateKey()); - - return new RSAPrivateCrtKeyParameters(keyStructure.getModulus(), - keyStructure.getPublicExponent(), keyStructure.getPrivateExponent(), - keyStructure.getPrime1(), keyStructure.getPrime2(), keyStructure.getExponent1(), - keyStructure.getExponent2(), keyStructure.getCoefficient()); - } - // TODO? -// else if (algId.getObjectId().equals(X9ObjectIdentifiers.dhpublicnumber)) - else if (algId.getAlgorithm().equals(PKCSObjectIdentifiers.dhKeyAgreement)) - { - DHParameter params = DHParameter.getInstance(algId.getParameters()); - ASN1Integer derX = (ASN1Integer)keyInfo.parsePrivateKey(); - - BigInteger lVal = params.getL(); - int l = lVal == null ? 0 : lVal.intValue(); - DHParameters dhParams = new DHParameters(params.getP(), params.getG(), null, l); - - return new DHPrivateKeyParameters(derX.getValue(), dhParams); - } - else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm)) - { - ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters()); - ASN1Integer derX = (ASN1Integer)keyInfo.parsePrivateKey(); - - return new ElGamalPrivateKeyParameters(derX.getValue(), new ElGamalParameters( - params.getP(), params.getG())); - } - else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_dsa)) - { - ASN1Integer derX = (ASN1Integer)keyInfo.parsePrivateKey(); - ASN1Encodable de = algId.getParameters(); - - DSAParameters parameters = null; - if (de != null) - { - DSAParameter params = DSAParameter.getInstance(de.toASN1Primitive()); - parameters = new DSAParameters(params.getP(), params.getQ(), params.getG()); - } - - return new DSAPrivateKeyParameters(derX.getValue(), parameters); - } - else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_ecPublicKey)) - { - X962Parameters params = new X962Parameters((ASN1Primitive)algId.getParameters()); - - X9ECParameters x9; - if (params.isNamedCurve()) - { - ASN1ObjectIdentifier oid = ASN1ObjectIdentifier.getInstance(params.getParameters()); - x9 = X962NamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = SECNamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = NISTNamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = TeleTrusTNamedCurves.getByOID(oid); - } - } - } - } - else - { - x9 = X9ECParameters.getInstance(params.getParameters()); - } - - ECPrivateKey ec = ECPrivateKey.getInstance(keyInfo.parsePrivateKey()); - BigInteger d = ec.getKey(); - - // TODO We lose any named parameters here - - ECDomainParameters dParams = new ECDomainParameters( - x9.getCurve(), x9.getG(), x9.getN(), x9.getH(), x9.getSeed()); - - return new ECPrivateKeyParameters(d, dParams); - } - else - { - throw new RuntimeException("algorithm identifier in key not recognised"); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyInfoFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyInfoFactory.java deleted file mode 100644 index e960034..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PrivateKeyInfoFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.crypto.util; - -import java.io.IOException; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.DERNull; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.pkcs.PrivateKeyInfo; -import org.bc.asn1.pkcs.RSAPrivateKey; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.DSAParameter; -import org.bc.asn1.x9.X9ObjectIdentifiers; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAPrivateKeyParameters; -import org.bc.crypto.params.RSAKeyParameters; -import org.bc.crypto.params.RSAPrivateCrtKeyParameters; - -/** - * Factory to create ASN.1 private key info objects from lightweight private keys. - */ -public class PrivateKeyInfoFactory -{ - /** - * Create a PrivateKeyInfo representation of a private key. - * - * @param privateKey the SubjectPublicKeyInfo encoding - * @return the appropriate key parameter - * @throws java.io.IOException on an error encoding the key - */ - public static PrivateKeyInfo createPrivateKeyInfo(AsymmetricKeyParameter privateKey) throws IOException - { - if (privateKey instanceof RSAKeyParameters) - { - RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters)privateKey; - - return new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPrivateKey(priv.getModulus(), priv.getPublicExponent(), priv.getExponent(), priv.getP(), priv.getQ(), priv.getDP(), priv.getDQ(), priv.getQInv())); - } - else if (privateKey instanceof DSAPrivateKeyParameters) - { - DSAPrivateKeyParameters priv = (DSAPrivateKeyParameters)privateKey; - DSAParameters params = priv.getParameters(); - - return new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_dsa, new DSAParameter(params.getP(), params.getQ(), params.getG())), new ASN1Integer(priv.getX())); - } - else - { - throw new IOException("key parameters not recognised."); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PublicKeyFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PublicKeyFactory.java deleted file mode 100644 index 85db012..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/PublicKeyFactory.java +++ /dev/null @@ -1,207 +0,0 @@ -package org.bc.crypto.util; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1InputStream; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.nist.NISTNamedCurves; -import org.bc.asn1.oiw.ElGamalParameter; -import org.bc.asn1.oiw.OIWObjectIdentifiers; -import org.bc.asn1.pkcs.DHParameter; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.pkcs.RSAPublicKey; -import org.bc.asn1.sec.SECNamedCurves; -import org.bc.asn1.teletrust.TeleTrusTNamedCurves; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.DSAParameter; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.asn1.x509.X509ObjectIdentifiers; -import org.bc.asn1.x9.DHDomainParameters; -import org.bc.asn1.x9.DHPublicKey; -import org.bc.asn1.x9.DHValidationParms; -import org.bc.asn1.x9.X962NamedCurves; -import org.bc.asn1.x9.X962Parameters; -import org.bc.asn1.x9.X9ECParameters; -import org.bc.asn1.x9.X9ECPoint; -import org.bc.asn1.x9.X9ObjectIdentifiers; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DHParameters; -import org.bc.crypto.params.DHPublicKeyParameters; -import org.bc.crypto.params.DHValidationParameters; -import org.bc.crypto.params.DSAParameters; -import org.bc.crypto.params.DSAPublicKeyParameters; -import org.bc.crypto.params.ECDomainParameters; -import org.bc.crypto.params.ECPublicKeyParameters; -import org.bc.crypto.params.ElGamalParameters; -import org.bc.crypto.params.ElGamalPublicKeyParameters; -import org.bc.crypto.params.RSAKeyParameters; - -/** - * Factory to create asymmetric public key parameters for asymmetric ciphers from range of - * ASN.1 encoded SubjectPublicKeyInfo objects. - */ -public class PublicKeyFactory -{ - /** - * Create a public key from a SubjectPublicKeyInfo encoding - * - * @param keyInfoData the SubjectPublicKeyInfo encoding - * @return the appropriate key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(byte[] keyInfoData) throws IOException - { - return createKey(SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(keyInfoData))); - } - - /** - * Create a public key from a SubjectPublicKeyInfo encoding read from a stream - * - * @param inStr the stream to read the SubjectPublicKeyInfo encoding from - * @return the appropriate key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(InputStream inStr) throws IOException - { - return createKey(SubjectPublicKeyInfo.getInstance(new ASN1InputStream(inStr).readObject())); - } - - /** - * Create a public key from the passed in SubjectPublicKeyInfo - * - * @param keyInfo the SubjectPublicKeyInfo containing the key data - * @return the appropriate key parameter - * @throws IOException on an error decoding the key - */ - public static AsymmetricKeyParameter createKey(SubjectPublicKeyInfo keyInfo) throws IOException - { - AlgorithmIdentifier algId = keyInfo.getAlgorithm(); - - if (algId.getAlgorithm().equals(PKCSObjectIdentifiers.rsaEncryption) - || algId.getAlgorithm().equals(X509ObjectIdentifiers.id_ea_rsa)) - { - RSAPublicKey pubKey = RSAPublicKey.getInstance(keyInfo.parsePublicKey()); - - return new RSAKeyParameters(false, pubKey.getModulus(), pubKey.getPublicExponent()); - } - else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.dhpublicnumber)) - { - DHPublicKey dhPublicKey = DHPublicKey.getInstance(keyInfo.parsePublicKey()); - - BigInteger y = dhPublicKey.getY().getValue(); - - DHDomainParameters dhParams = DHDomainParameters.getInstance(algId.getParameters()); - - BigInteger p = dhParams.getP().getValue(); - BigInteger g = dhParams.getG().getValue(); - BigInteger q = dhParams.getQ().getValue(); - - BigInteger j = null; - if (dhParams.getJ() != null) - { - j = dhParams.getJ().getValue(); - } - - DHValidationParameters validation = null; - DHValidationParms dhValidationParms = dhParams.getValidationParms(); - if (dhValidationParms != null) - { - byte[] seed = dhValidationParms.getSeed().getBytes(); - BigInteger pgenCounter = dhValidationParms.getPgenCounter().getValue(); - - // TODO Check pgenCounter size? - - validation = new DHValidationParameters(seed, pgenCounter.intValue()); - } - - return new DHPublicKeyParameters(y, new DHParameters(p, g, q, j, validation)); - } - else if (algId.getAlgorithm().equals(PKCSObjectIdentifiers.dhKeyAgreement)) - { - DHParameter params = DHParameter.getInstance(algId.getParameters()); - ASN1Integer derY = (ASN1Integer)keyInfo.parsePublicKey(); - - BigInteger lVal = params.getL(); - int l = lVal == null ? 0 : lVal.intValue(); - DHParameters dhParams = new DHParameters(params.getP(), params.getG(), null, l); - - return new DHPublicKeyParameters(derY.getValue(), dhParams); - } - else if (algId.getAlgorithm().equals(OIWObjectIdentifiers.elGamalAlgorithm)) - { - ElGamalParameter params = new ElGamalParameter((ASN1Sequence)algId.getParameters()); - ASN1Integer derY = (ASN1Integer)keyInfo.parsePublicKey(); - - return new ElGamalPublicKeyParameters(derY.getValue(), new ElGamalParameters( - params.getP(), params.getG())); - } - else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_dsa) - || algId.getAlgorithm().equals(OIWObjectIdentifiers.dsaWithSHA1)) - { - ASN1Integer derY = (ASN1Integer)keyInfo.parsePublicKey(); - ASN1Encodable de = algId.getParameters(); - - DSAParameters parameters = null; - if (de != null) - { - DSAParameter params = DSAParameter.getInstance(de.toASN1Primitive()); - parameters = new DSAParameters(params.getP(), params.getQ(), params.getG()); - } - - return new DSAPublicKeyParameters(derY.getValue(), parameters); - } - else if (algId.getAlgorithm().equals(X9ObjectIdentifiers.id_ecPublicKey)) - { - X962Parameters params = new X962Parameters( - (ASN1Primitive)algId.getParameters()); - - X9ECParameters x9; - if (params.isNamedCurve()) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)params.getParameters(); - x9 = X962NamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = SECNamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = NISTNamedCurves.getByOID(oid); - - if (x9 == null) - { - x9 = TeleTrusTNamedCurves.getByOID(oid); - } - } - } - } - else - { - x9 = X9ECParameters.getInstance(params.getParameters()); - } - - ASN1OctetString key = new DEROctetString(keyInfo.getPublicKeyData().getBytes()); - X9ECPoint derQ = new X9ECPoint(x9.getCurve(), key); - - // TODO We lose any named parameters here - - ECDomainParameters dParams = new ECDomainParameters( - x9.getCurve(), x9.getG(), x9.getN(), x9.getH(), x9.getSeed()); - - return new ECPublicKeyParameters(derQ.getPoint(), dParams); - } - else - { - throw new RuntimeException("algorithm identifier in key not recognised"); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/SubjectPublicKeyInfoFactory.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/SubjectPublicKeyInfoFactory.java deleted file mode 100644 index 06a85c5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/crypto/util/SubjectPublicKeyInfoFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bc.crypto.util; - -import java.io.IOException; - -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.DERNull; -import org.bc.asn1.pkcs.PKCSObjectIdentifiers; -import org.bc.asn1.pkcs.RSAPublicKey; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.asn1.x509.SubjectPublicKeyInfo; -import org.bc.asn1.x9.X9ObjectIdentifiers; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.DSAPublicKeyParameters; -import org.bc.crypto.params.RSAKeyParameters; - -/** - * Factory to create ASN.1 subject public key info objects from lightweight public keys. - */ -public class SubjectPublicKeyInfoFactory -{ - /** - * Create a SubjectPublicKeyInfo public key. - * - * @param publicKey the SubjectPublicKeyInfo encoding - * @return the appropriate key parameter - * @throws java.io.IOException on an error encoding the key - */ - public static SubjectPublicKeyInfo createSubjectPublicKeyInfo(AsymmetricKeyParameter publicKey) throws IOException - { - if (publicKey instanceof RSAKeyParameters) - { - RSAKeyParameters pub = (RSAKeyParameters)publicKey; - - return new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), new RSAPublicKey(pub.getModulus(), pub.getExponent())); - } - else if (publicKey instanceof DSAPublicKeyParameters) - { - DSAPublicKeyParameters pub = (DSAPublicKeyParameters)publicKey; - - return new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_dsa), new ASN1Integer(pub.getY())); - } - else - { - throw new IOException("key parameters not recognised."); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECAlgorithms.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECAlgorithms.java deleted file mode 100644 index 0c7e3b8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECAlgorithms.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -public class ECAlgorithms -{ - public static ECPoint sumOfTwoMultiplies(ECPoint P, BigInteger a, - ECPoint Q, BigInteger b) - { - ECCurve c = P.getCurve(); - if (!c.equals(Q.getCurve())) - { - throw new IllegalArgumentException("P and Q must be on same curve"); - } - - // Point multiplication for Koblitz curves (using WTNAF) beats Shamir's trick - if (c instanceof ECCurve.F2m) - { - ECCurve.F2m f2mCurve = (ECCurve.F2m)c; - if (f2mCurve.isKoblitz()) - { - return P.multiply(a).add(Q.multiply(b)); - } - } - - return implShamirsTrick(P, a, Q, b); - } - - /* - * "Shamir's Trick", originally due to E. G. Straus - * (Addition chains of vectors. American Mathematical Monthly, - * 71(7):806-808, Aug./Sept. 1964) - *

    -     * Input: The points P, Q, scalar k = (km?, ... , k1, k0)
    -     * and scalar l = (lm?, ... , l1, l0).
    -     * Output: R = k * P + l * Q.
    -     * 1: Z <- P + Q
    -     * 2: R <- O
    -     * 3: for i from m-1 down to 0 do
    -     * 4:        R <- R + R        {point doubling}
    -     * 5:        if (ki = 1) and (li = 0) then R <- R + P end if
    -     * 6:        if (ki = 0) and (li = 1) then R <- R + Q end if
    -     * 7:        if (ki = 1) and (li = 1) then R <- R + Z end if
    -     * 8: end for
    -     * 9: return R
    -     * 
    - */ - public static ECPoint shamirsTrick(ECPoint P, BigInteger k, - ECPoint Q, BigInteger l) - { - if (!P.getCurve().equals(Q.getCurve())) - { - throw new IllegalArgumentException("P and Q must be on same curve"); - } - - return implShamirsTrick(P, k, Q, l); - } - - private static ECPoint implShamirsTrick(ECPoint P, BigInteger k, - ECPoint Q, BigInteger l) - { - int m = Math.max(k.bitLength(), l.bitLength()); - ECPoint Z = P.add(Q); - ECPoint R = P.getCurve().getInfinity(); - - for (int i = m - 1; i >= 0; --i) - { - R = R.twice(); - - if (k.testBit(i)) - { - if (l.testBit(i)) - { - R = R.add(Z); - } - else - { - R = R.add(P); - } - } - else - { - if (l.testBit(i)) - { - R = R.add(Q); - } - } - } - - return R; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECConstants.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECConstants.java deleted file mode 100644 index b6dfbf7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECConstants.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -public interface ECConstants -{ - public static final BigInteger ZERO = BigInteger.valueOf(0); - public static final BigInteger ONE = BigInteger.valueOf(1); - public static final BigInteger TWO = BigInteger.valueOf(2); - public static final BigInteger THREE = BigInteger.valueOf(3); - public static final BigInteger FOUR = BigInteger.valueOf(4); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECCurve.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECCurve.java deleted file mode 100644 index b626ae8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECCurve.java +++ /dev/null @@ -1,668 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; -import java.util.Random; - -/** - * base class for an elliptic curve - */ -public abstract class ECCurve -{ - ECFieldElement a, b; - - public abstract int getFieldSize(); - - public abstract ECFieldElement fromBigInteger(BigInteger x); - - public abstract ECPoint createPoint(BigInteger x, BigInteger y, boolean withCompression); - - public abstract ECPoint decodePoint(byte[] encoded); - - public abstract ECPoint getInfinity(); - - public ECFieldElement getA() - { - return a; - } - - public ECFieldElement getB() - { - return b; - } - - /** - * Elliptic curve over Fp - */ - public static class Fp extends ECCurve - { - BigInteger q; - ECPoint.Fp infinity; - - public Fp(BigInteger q, BigInteger a, BigInteger b) - { - this.q = q; - this.a = fromBigInteger(a); - this.b = fromBigInteger(b); - this.infinity = new ECPoint.Fp(this, null, null); - } - - public BigInteger getQ() - { - return q; - } - - public int getFieldSize() - { - return q.bitLength(); - } - - public ECFieldElement fromBigInteger(BigInteger x) - { - return new ECFieldElement.Fp(this.q, x); - } - - public ECPoint createPoint(BigInteger x, BigInteger y, boolean withCompression) - { - return new ECPoint.Fp(this, fromBigInteger(x), fromBigInteger(y), withCompression); - } - - /** - * Decode a point on this curve from its ASN.1 encoding. The different - * encodings are taken account of, including point compression for - * Fp (X9.62 s 4.2.1 pg 17). - * @return The decoded point. - */ - public ECPoint decodePoint(byte[] encoded) - { - ECPoint p = null; - - switch (encoded[0]) - { - // infinity - case 0x00: - if (encoded.length > 1) - { - throw new RuntimeException("Invalid point encoding"); - } - p = getInfinity(); - break; - // compressed - case 0x02: - case 0x03: - int ytilde = encoded[0] & 1; - byte[] i = new byte[encoded.length - 1]; - - System.arraycopy(encoded, 1, i, 0, i.length); - - ECFieldElement x = new ECFieldElement.Fp(this.q, new BigInteger(1, i)); - ECFieldElement alpha = x.multiply(x.square().add(a)).add(b); - ECFieldElement beta = alpha.sqrt(); - - // - // if we can't find a sqrt we haven't got a point on the - // curve - run! - // - if (beta == null) - { - throw new RuntimeException("Invalid point compression"); - } - - int bit0 = (beta.toBigInteger().testBit(0) ? 1 : 0); - - if (bit0 == ytilde) - { - p = new ECPoint.Fp(this, x, beta, true); - } - else - { - p = new ECPoint.Fp(this, x, - new ECFieldElement.Fp(this.q, q.subtract(beta.toBigInteger())), true); - } - break; - // uncompressed - case 0x04: - // hybrid - case 0x06: - case 0x07: - byte[] xEnc = new byte[(encoded.length - 1) / 2]; - byte[] yEnc = new byte[(encoded.length - 1) / 2]; - - System.arraycopy(encoded, 1, xEnc, 0, xEnc.length); - System.arraycopy(encoded, xEnc.length + 1, yEnc, 0, yEnc.length); - - p = new ECPoint.Fp(this, - new ECFieldElement.Fp(this.q, new BigInteger(1, xEnc)), - new ECFieldElement.Fp(this.q, new BigInteger(1, yEnc))); - break; - default: - throw new RuntimeException("Invalid point encoding 0x" + Integer.toString(encoded[0], 16)); - } - - return p; - } - - public ECPoint getInfinity() - { - return infinity; - } - - public boolean equals( - Object anObject) - { - if (anObject == this) - { - return true; - } - - if (!(anObject instanceof ECCurve.Fp)) - { - return false; - } - - ECCurve.Fp other = (ECCurve.Fp) anObject; - - return this.q.equals(other.q) - && a.equals(other.a) && b.equals(other.b); - } - - public int hashCode() - { - return a.hashCode() ^ b.hashCode() ^ q.hashCode(); - } - } - - /** - * Elliptic curves over F2m. The Weierstrass equation is given by - * y2 + xy = x3 + ax2 + b. - */ - public static class F2m extends ECCurve - { - /** - * The exponent m of F2m. - */ - private int m; // can't be final - JDK 1.1 - - /** - * TPB: The integer k where xm + - * xk + 1 represents the reduction polynomial - * f(z).
    - * PPB: The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k1; // can't be final - JDK 1.1 - - /** - * TPB: Always set to 0
    - * PPB: The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k2; // can't be final - JDK 1.1 - - /** - * TPB: Always set to 0
    - * PPB: The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k3; // can't be final - JDK 1.1 - - /** - * The order of the base point of the curve. - */ - private BigInteger n; // can't be final - JDK 1.1 - - /** - * The cofactor of the curve. - */ - private BigInteger h; // can't be final - JDK 1.1 - - /** - * The point at infinity on this curve. - */ - private ECPoint.F2m infinity; // can't be final - JDK 1.1 - - /** - * The parameter μ of the elliptic curve if this is - * a Koblitz curve. - */ - private byte mu = 0; - - /** - * The auxiliary values s0 and - * s1 used for partial modular reduction for - * Koblitz curves. - */ - private BigInteger[] si = null; - - /** - * Constructor for Trinomial Polynomial Basis (TPB). - * @param m The exponent m of - * F2m. - * @param k The integer k where xm + - * xk + 1 represents the reduction - * polynomial f(z). - * @param a The coefficient a in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param b The coefficient b in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - */ - public F2m( - int m, - int k, - BigInteger a, - BigInteger b) - { - this(m, k, 0, 0, a, b, null, null); - } - - /** - * Constructor for Trinomial Polynomial Basis (TPB). - * @param m The exponent m of - * F2m. - * @param k The integer k where xm + - * xk + 1 represents the reduction - * polynomial f(z). - * @param a The coefficient a in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param b The coefficient b in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param n The order of the main subgroup of the elliptic curve. - * @param h The cofactor of the elliptic curve, i.e. - * #Ea(F2m) = h * n. - */ - public F2m( - int m, - int k, - BigInteger a, - BigInteger b, - BigInteger n, - BigInteger h) - { - this(m, k, 0, 0, a, b, n, h); - } - - /** - * Constructor for Pentanomial Polynomial Basis (PPB). - * @param m The exponent m of - * F2m. - * @param k1 The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k2 The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k3 The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param a The coefficient a in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param b The coefficient b in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - */ - public F2m( - int m, - int k1, - int k2, - int k3, - BigInteger a, - BigInteger b) - { - this(m, k1, k2, k3, a, b, null, null); - } - - /** - * Constructor for Pentanomial Polynomial Basis (PPB). - * @param m The exponent m of - * F2m. - * @param k1 The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k2 The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k3 The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param a The coefficient a in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param b The coefficient b in the Weierstrass equation - * for non-supersingular elliptic curves over - * F2m. - * @param n The order of the main subgroup of the elliptic curve. - * @param h The cofactor of the elliptic curve, i.e. - * #Ea(F2m) = h * n. - */ - public F2m( - int m, - int k1, - int k2, - int k3, - BigInteger a, - BigInteger b, - BigInteger n, - BigInteger h) - { - this.m = m; - this.k1 = k1; - this.k2 = k2; - this.k3 = k3; - this.n = n; - this.h = h; - - if (k1 == 0) - { - throw new IllegalArgumentException("k1 must be > 0"); - } - - if (k2 == 0) - { - if (k3 != 0) - { - throw new IllegalArgumentException("k3 must be 0 if k2 == 0"); - } - } - else - { - if (k2 <= k1) - { - throw new IllegalArgumentException("k2 must be > k1"); - } - - if (k3 <= k2) - { - throw new IllegalArgumentException("k3 must be > k2"); - } - } - - this.a = fromBigInteger(a); - this.b = fromBigInteger(b); - this.infinity = new ECPoint.F2m(this, null, null); - } - - public int getFieldSize() - { - return m; - } - - public ECFieldElement fromBigInteger(BigInteger x) - { - return new ECFieldElement.F2m(this.m, this.k1, this.k2, this.k3, x); - } - - public ECPoint createPoint(BigInteger x, BigInteger y, boolean withCompression) - { - return new ECPoint.F2m(this, fromBigInteger(x), fromBigInteger(y), withCompression); - } - - /* (non-Javadoc) - * @see org.bouncycastle.math.ec.ECCurve#decodePoint(byte[]) - */ - public ECPoint decodePoint(byte[] encoded) - { - ECPoint p = null; - - switch (encoded[0]) - { - // infinity - case 0x00: - if (encoded.length > 1) - { - throw new RuntimeException("Invalid point encoding"); - } - p = getInfinity(); - break; - // compressed - case 0x02: - case 0x03: - byte[] enc = new byte[encoded.length - 1]; - System.arraycopy(encoded, 1, enc, 0, enc.length); - if (encoded[0] == 0x02) - { - p = decompressPoint(enc, 0); - } - else - { - p = decompressPoint(enc, 1); - } - break; - // uncompressed - case 0x04: - // hybrid - case 0x06: - case 0x07: - byte[] xEnc = new byte[(encoded.length - 1) / 2]; - byte[] yEnc = new byte[(encoded.length - 1) / 2]; - - System.arraycopy(encoded, 1, xEnc, 0, xEnc.length); - System.arraycopy(encoded, xEnc.length + 1, yEnc, 0, yEnc.length); - - p = new ECPoint.F2m(this, - new ECFieldElement.F2m(this.m, this.k1, this.k2, this.k3, - new BigInteger(1, xEnc)), - new ECFieldElement.F2m(this.m, this.k1, this.k2, this.k3, - new BigInteger(1, yEnc)), false); - break; - - default: - throw new RuntimeException("Invalid point encoding 0x" + Integer.toString(encoded[0], 16)); - } - - return p; - } - - public ECPoint getInfinity() - { - return infinity; - } - - /** - * Returns true if this is a Koblitz curve (ABC curve). - * @return true if this is a Koblitz curve (ABC curve), false otherwise - */ - public boolean isKoblitz() - { - return ((n != null) && (h != null) && - ((a.toBigInteger().equals(ECConstants.ZERO)) || - (a.toBigInteger().equals(ECConstants.ONE))) && - (b.toBigInteger().equals(ECConstants.ONE))); - } - - /** - * Returns the parameter μ of the elliptic curve. - * @return μ of the elliptic curve. - * @throws IllegalArgumentException if the given ECCurve is not a - * Koblitz curve. - */ - synchronized byte getMu() - { - if (mu == 0) - { - mu = Tnaf.getMu(this); - } - return mu; - } - - /** - * @return the auxiliary values s0 and - * s1 used for partial modular reduction for - * Koblitz curves. - */ - synchronized BigInteger[] getSi() - { - if (si == null) - { - si = Tnaf.getSi(this); - } - return si; - } - - /** - * Decompresses a compressed point P = (xp, yp) (X9.62 s 4.2.2). - * - * @param xEnc - * The encoding of field element xp. - * @param ypBit - * ~yp, an indication bit for the decompression of yp. - * @return the decompressed point. - */ - private ECPoint decompressPoint( - byte[] xEnc, - int ypBit) - { - ECFieldElement xp = new ECFieldElement.F2m( - this.m, this.k1, this.k2, this.k3, new BigInteger(1, xEnc)); - ECFieldElement yp = null; - if (xp.toBigInteger().equals(ECConstants.ZERO)) - { - yp = (ECFieldElement.F2m)b; - for (int i = 0; i < m - 1; i++) - { - yp = yp.square(); - } - } - else - { - ECFieldElement beta = xp.add(a).add( - b.multiply(xp.square().invert())); - ECFieldElement z = solveQuadradicEquation(beta); - if (z == null) - { - throw new RuntimeException("Invalid point compression"); - } - int zBit = 0; - if (z.toBigInteger().testBit(0)) - { - zBit = 1; - } - if (zBit != ypBit) - { - z = z.add(new ECFieldElement.F2m(this.m, this.k1, this.k2, - this.k3, ECConstants.ONE)); - } - yp = xp.multiply(z); - } - - return new ECPoint.F2m(this, xp, yp); - } - - /** - * Solves a quadratic equation z2 + z = beta(X9.62 - * D.1.6) The other solution is z + 1. - * - * @param beta - * The value to solve the qradratic equation for. - * @return the solution for z2 + z = beta or - * null if no solution exists. - */ - private ECFieldElement solveQuadradicEquation(ECFieldElement beta) - { - ECFieldElement zeroElement = new ECFieldElement.F2m( - this.m, this.k1, this.k2, this.k3, ECConstants.ZERO); - - if (beta.toBigInteger().equals(ECConstants.ZERO)) - { - return zeroElement; - } - - ECFieldElement z = null; - ECFieldElement gamma = zeroElement; - - Random rand = new Random(); - do - { - ECFieldElement t = new ECFieldElement.F2m(this.m, this.k1, - this.k2, this.k3, new BigInteger(m, rand)); - z = zeroElement; - ECFieldElement w = beta; - for (int i = 1; i <= m - 1; i++) - { - ECFieldElement w2 = w.square(); - z = z.square().add(w2.multiply(t)); - w = w2.add(beta); - } - if (!w.toBigInteger().equals(ECConstants.ZERO)) - { - return null; - } - gamma = z.square().add(z); - } - while (gamma.toBigInteger().equals(ECConstants.ZERO)); - - return z; - } - - public boolean equals( - Object anObject) - { - if (anObject == this) - { - return true; - } - - if (!(anObject instanceof ECCurve.F2m)) - { - return false; - } - - ECCurve.F2m other = (ECCurve.F2m)anObject; - - return (this.m == other.m) && (this.k1 == other.k1) - && (this.k2 == other.k2) && (this.k3 == other.k3) - && a.equals(other.a) && b.equals(other.b); - } - - public int hashCode() - { - return this.a.hashCode() ^ this.b.hashCode() ^ m ^ k1 ^ k2 ^ k3; - } - - public int getM() - { - return m; - } - - /** - * Return true if curve uses a Trinomial basis. - * - * @return true if curve Trinomial, false otherwise. - */ - public boolean isTrinomial() - { - return k2 == 0 && k3 == 0; - } - - public int getK1() - { - return k1; - } - - public int getK2() - { - return k2; - } - - public int getK3() - { - return k3; - } - - public BigInteger getN() - { - return n; - } - - public BigInteger getH() - { - return h; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECFieldElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECFieldElement.java deleted file mode 100644 index da77e44..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECFieldElement.java +++ /dev/null @@ -1,1196 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; -import java.util.Random; - -public abstract class ECFieldElement - implements ECConstants -{ - - public abstract BigInteger toBigInteger(); - public abstract String getFieldName(); - public abstract int getFieldSize(); - public abstract ECFieldElement add(ECFieldElement b); - public abstract ECFieldElement subtract(ECFieldElement b); - public abstract ECFieldElement multiply(ECFieldElement b); - public abstract ECFieldElement divide(ECFieldElement b); - public abstract ECFieldElement negate(); - public abstract ECFieldElement square(); - public abstract ECFieldElement invert(); - public abstract ECFieldElement sqrt(); - - public String toString() - { - return this.toBigInteger().toString(2); - } - - public static class Fp extends ECFieldElement - { - BigInteger x; - - BigInteger q; - - public Fp(BigInteger q, BigInteger x) - { - this.x = x; - - if (x.compareTo(q) >= 0) - { - throw new IllegalArgumentException("x value too large in field element"); - } - - this.q = q; - } - - public BigInteger toBigInteger() - { - return x; - } - - /** - * return the field name for this field. - * - * @return the string "Fp". - */ - public String getFieldName() - { - return "Fp"; - } - - public int getFieldSize() - { - return q.bitLength(); - } - - public BigInteger getQ() - { - return q; - } - - public ECFieldElement add(ECFieldElement b) - { - return new Fp(q, x.add(b.toBigInteger()).mod(q)); - } - - public ECFieldElement subtract(ECFieldElement b) - { - return new Fp(q, x.subtract(b.toBigInteger()).mod(q)); - } - - public ECFieldElement multiply(ECFieldElement b) - { - return new Fp(q, x.multiply(b.toBigInteger()).mod(q)); - } - - public ECFieldElement divide(ECFieldElement b) - { - return new Fp(q, x.multiply(b.toBigInteger().modInverse(q)).mod(q)); - } - - public ECFieldElement negate() - { - return new Fp(q, x.negate().mod(q)); - } - - public ECFieldElement square() - { - return new Fp(q, x.multiply(x).mod(q)); - } - - public ECFieldElement invert() - { - return new Fp(q, x.modInverse(q)); - } - - // D.1.4 91 - /** - * return a sqrt root - the routine verifies that the calculation - * returns the right value - if none exists it returns null. - */ - public ECFieldElement sqrt() - { - if (!q.testBit(0)) - { - throw new RuntimeException("not done yet"); - } - - // note: even though this class implements ECConstants don't be tempted to - // remove the explicit declaration, some J2ME environments don't cope. - // p mod 4 == 3 - if (q.testBit(1)) - { - // z = g^(u+1) + p, p = 4u + 3 - ECFieldElement z = new Fp(q, x.modPow(q.shiftRight(2).add(ECConstants.ONE), q)); - - return z.square().equals(this) ? z : null; - } - - // p mod 4 == 1 - BigInteger qMinusOne = q.subtract(ECConstants.ONE); - - BigInteger legendreExponent = qMinusOne.shiftRight(1); - if (!(x.modPow(legendreExponent, q).equals(ECConstants.ONE))) - { - return null; - } - - BigInteger u = qMinusOne.shiftRight(2); - BigInteger k = u.shiftLeft(1).add(ECConstants.ONE); - - BigInteger Q = this.x; - BigInteger fourQ = Q.shiftLeft(2).mod(q); - - BigInteger U, V; - Random rand = new Random(); - do - { - BigInteger P; - do - { - P = new BigInteger(q.bitLength(), rand); - } - while (P.compareTo(q) >= 0 - || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, q).equals(qMinusOne))); - - BigInteger[] result = lucasSequence(q, P, Q, k); - U = result[0]; - V = result[1]; - - if (V.multiply(V).mod(q).equals(fourQ)) - { - // Integer division by 2, mod q - if (V.testBit(0)) - { - V = V.add(q); - } - - V = V.shiftRight(1); - - //assert V.multiply(V).mod(q).equals(x); - - return new ECFieldElement.Fp(q, V); - } - } - while (U.equals(ECConstants.ONE) || U.equals(qMinusOne)); - - return null; - -// BigInteger qMinusOne = q.subtract(ECConstants.ONE); -// BigInteger legendreExponent = qMinusOne.shiftRight(1); //divide(ECConstants.TWO); -// if (!(x.modPow(legendreExponent, q).equals(ECConstants.ONE))) -// { -// return null; -// } -// -// Random rand = new Random(); -// BigInteger fourX = x.shiftLeft(2); -// -// BigInteger r; -// do -// { -// r = new BigInteger(q.bitLength(), rand); -// } -// while (r.compareTo(q) >= 0 -// || !(r.multiply(r).subtract(fourX).modPow(legendreExponent, q).equals(qMinusOne))); -// -// BigInteger n1 = qMinusOne.shiftRight(2); //.divide(ECConstants.FOUR); -// BigInteger n2 = n1.add(ECConstants.ONE); //q.add(ECConstants.THREE).divide(ECConstants.FOUR); -// -// BigInteger wOne = WOne(r, x, q); -// BigInteger wSum = W(n1, wOne, q).add(W(n2, wOne, q)).mod(q); -// BigInteger twoR = r.shiftLeft(1); //ECConstants.TWO.multiply(r); -// -// BigInteger root = twoR.modPow(q.subtract(ECConstants.TWO), q) -// .multiply(x).mod(q) -// .multiply(wSum).mod(q); -// -// return new Fp(q, root); - } - -// private static BigInteger W(BigInteger n, BigInteger wOne, BigInteger p) -// { -// if (n.equals(ECConstants.ONE)) -// { -// return wOne; -// } -// boolean isEven = !n.testBit(0); -// n = n.shiftRight(1);//divide(ECConstants.TWO); -// if (isEven) -// { -// BigInteger w = W(n, wOne, p); -// return w.multiply(w).subtract(ECConstants.TWO).mod(p); -// } -// BigInteger w1 = W(n.add(ECConstants.ONE), wOne, p); -// BigInteger w2 = W(n, wOne, p); -// return w1.multiply(w2).subtract(wOne).mod(p); -// } -// -// private BigInteger WOne(BigInteger r, BigInteger x, BigInteger p) -// { -// return r.multiply(r).multiply(x.modPow(q.subtract(ECConstants.TWO), q)).subtract(ECConstants.TWO).mod(p); -// } - - private static BigInteger[] lucasSequence( - BigInteger p, - BigInteger P, - BigInteger Q, - BigInteger k) - { - int n = k.bitLength(); - int s = k.getLowestSetBit(); - - BigInteger Uh = ECConstants.ONE; - BigInteger Vl = ECConstants.TWO; - BigInteger Vh = P; - BigInteger Ql = ECConstants.ONE; - BigInteger Qh = ECConstants.ONE; - - for (int j = n - 1; j >= s + 1; --j) - { - Ql = Ql.multiply(Qh).mod(p); - - if (k.testBit(j)) - { - Qh = Ql.multiply(Q).mod(p); - Uh = Uh.multiply(Vh).mod(p); - Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Vh = Vh.multiply(Vh).subtract(Qh.shiftLeft(1)).mod(p); - } - else - { - Qh = Ql; - Uh = Uh.multiply(Vl).subtract(Ql).mod(p); - Vh = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); - } - } - - Ql = Ql.multiply(Qh).mod(p); - Qh = Ql.multiply(Q).mod(p); - Uh = Uh.multiply(Vl).subtract(Ql).mod(p); - Vl = Vh.multiply(Vl).subtract(P.multiply(Ql)).mod(p); - Ql = Ql.multiply(Qh).mod(p); - - for (int j = 1; j <= s; ++j) - { - Uh = Uh.multiply(Vl).mod(p); - Vl = Vl.multiply(Vl).subtract(Ql.shiftLeft(1)).mod(p); - Ql = Ql.multiply(Ql).mod(p); - } - - return new BigInteger[]{ Uh, Vl }; - } - - public boolean equals(Object other) - { - if (other == this) - { - return true; - } - - if (!(other instanceof ECFieldElement.Fp)) - { - return false; - } - - ECFieldElement.Fp o = (ECFieldElement.Fp)other; - return q.equals(o.q) && x.equals(o.x); - } - - public int hashCode() - { - return q.hashCode() ^ x.hashCode(); - } - } - -// /** -// * Class representing the Elements of the finite field -// * F2m in polynomial basis (PB) -// * representation. Both trinomial (TPB) and pentanomial (PPB) polynomial -// * basis representations are supported. Gaussian normal basis (GNB) -// * representation is not supported. -// */ -// public static class F2m extends ECFieldElement -// { -// BigInteger x; -// -// /** -// * Indicates gaussian normal basis representation (GNB). Number chosen -// * according to X9.62. GNB is not implemented at present. -// */ -// public static final int GNB = 1; -// -// /** -// * Indicates trinomial basis representation (TPB). Number chosen -// * according to X9.62. -// */ -// public static final int TPB = 2; -// -// /** -// * Indicates pentanomial basis representation (PPB). Number chosen -// * according to X9.62. -// */ -// public static final int PPB = 3; -// -// /** -// * TPB or PPB. -// */ -// private int representation; -// -// /** -// * The exponent m of F2m. -// */ -// private int m; -// -// /** -// * TPB: The integer k where xm + -// * xk + 1 represents the reduction polynomial -// * f(z).
    -// * PPB: The integer k1 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// private int k1; -// -// /** -// * TPB: Always set to 0
    -// * PPB: The integer k2 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// private int k2; -// -// /** -// * TPB: Always set to 0
    -// * PPB: The integer k3 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// private int k3; -// -// /** -// * Constructor for PPB. -// * @param m The exponent m of -// * F2m. -// * @param k1 The integer k1 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z). -// * @param k2 The integer k2 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z). -// * @param k3 The integer k3 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z). -// * @param x The BigInteger representing the value of the field element. -// */ -// public F2m( -// int m, -// int k1, -// int k2, -// int k3, -// BigInteger x) -// { -//// super(x); -// this.x = x; -// -// if ((k2 == 0) && (k3 == 0)) -// { -// this.representation = TPB; -// } -// else -// { -// if (k2 >= k3) -// { -// throw new IllegalArgumentException( -// "k2 must be smaller than k3"); -// } -// if (k2 <= 0) -// { -// throw new IllegalArgumentException( -// "k2 must be larger than 0"); -// } -// this.representation = PPB; -// } -// -// if (x.signum() < 0) -// { -// throw new IllegalArgumentException("x value cannot be negative"); -// } -// -// this.m = m; -// this.k1 = k1; -// this.k2 = k2; -// this.k3 = k3; -// } -// -// /** -// * Constructor for TPB. -// * @param m The exponent m of -// * F2m. -// * @param k The integer k where xm + -// * xk + 1 represents the reduction -// * polynomial f(z). -// * @param x The BigInteger representing the value of the field element. -// */ -// public F2m(int m, int k, BigInteger x) -// { -// // Set k1 to k, and set k2 and k3 to 0 -// this(m, k, 0, 0, x); -// } -// -// public BigInteger toBigInteger() -// { -// return x; -// } -// -// public String getFieldName() -// { -// return "F2m"; -// } -// -// public int getFieldSize() -// { -// return m; -// } -// -// /** -// * Checks, if the ECFieldElements a and b -// * are elements of the same field F2m -// * (having the same representation). -// * @param a field element. -// * @param b field element to be compared. -// * @throws IllegalArgumentException if a and b -// * are not elements of the same field -// * F2m (having the same -// * representation). -// */ -// public static void checkFieldElements( -// ECFieldElement a, -// ECFieldElement b) -// { -// if ((!(a instanceof F2m)) || (!(b instanceof F2m))) -// { -// throw new IllegalArgumentException("Field elements are not " -// + "both instances of ECFieldElement.F2m"); -// } -// -// if ((a.toBigInteger().signum() < 0) || (b.toBigInteger().signum() < 0)) -// { -// throw new IllegalArgumentException( -// "x value may not be negative"); -// } -// -// ECFieldElement.F2m aF2m = (ECFieldElement.F2m)a; -// ECFieldElement.F2m bF2m = (ECFieldElement.F2m)b; -// -// if ((aF2m.m != bF2m.m) || (aF2m.k1 != bF2m.k1) -// || (aF2m.k2 != bF2m.k2) || (aF2m.k3 != bF2m.k3)) -// { -// throw new IllegalArgumentException("Field elements are not " -// + "elements of the same field F2m"); -// } -// -// if (aF2m.representation != bF2m.representation) -// { -// // Should never occur -// throw new IllegalArgumentException( -// "One of the field " -// + "elements are not elements has incorrect representation"); -// } -// } -// -// /** -// * Computes z * a(z) mod f(z), where f(z) is -// * the reduction polynomial of this. -// * @param a The polynomial a(z) to be multiplied by -// * z mod f(z). -// * @return z * a(z) mod f(z) -// */ -// private BigInteger multZModF(final BigInteger a) -// { -// // Left-shift of a(z) -// BigInteger az = a.shiftLeft(1); -// if (az.testBit(this.m)) -// { -// // If the coefficient of z^m in a(z) equals 1, reduction -// // modulo f(z) is performed: Add f(z) to to a(z): -// // Step 1: Unset mth coeffient of a(z) -// az = az.clearBit(this.m); -// -// // Step 2: Add r(z) to a(z), where r(z) is defined as -// // f(z) = z^m + r(z), and k1, k2, k3 are the positions of -// // the non-zero coefficients in r(z) -// az = az.flipBit(0); -// az = az.flipBit(this.k1); -// if (this.representation == PPB) -// { -// az = az.flipBit(this.k2); -// az = az.flipBit(this.k3); -// } -// } -// return az; -// } -// -// public ECFieldElement add(final ECFieldElement b) -// { -// // No check performed here for performance reasons. Instead the -// // elements involved are checked in ECPoint.F2m -// // checkFieldElements(this, b); -// if (b.toBigInteger().signum() == 0) -// { -// return this; -// } -// -// return new F2m(this.m, this.k1, this.k2, this.k3, this.x.xor(b.toBigInteger())); -// } -// -// public ECFieldElement subtract(final ECFieldElement b) -// { -// // Addition and subtraction are the same in F2m -// return add(b); -// } -// -// -// public ECFieldElement multiply(final ECFieldElement b) -// { -// // Left-to-right shift-and-add field multiplication in F2m -// // Input: Binary polynomials a(z) and b(z) of degree at most m-1 -// // Output: c(z) = a(z) * b(z) mod f(z) -// -// // No check performed here for performance reasons. Instead the -// // elements involved are checked in ECPoint.F2m -// // checkFieldElements(this, b); -// final BigInteger az = this.x; -// BigInteger bz = b.toBigInteger(); -// BigInteger cz; -// -// // Compute c(z) = a(z) * b(z) mod f(z) -// if (az.testBit(0)) -// { -// cz = bz; -// } -// else -// { -// cz = ECConstants.ZERO; -// } -// -// for (int i = 1; i < this.m; i++) -// { -// // b(z) := z * b(z) mod f(z) -// bz = multZModF(bz); -// -// if (az.testBit(i)) -// { -// // If the coefficient of x^i in a(z) equals 1, b(z) is added -// // to c(z) -// cz = cz.xor(bz); -// } -// } -// return new ECFieldElement.F2m(m, this.k1, this.k2, this.k3, cz); -// } -// -// -// public ECFieldElement divide(final ECFieldElement b) -// { -// // There may be more efficient implementations -// ECFieldElement bInv = b.invert(); -// return multiply(bInv); -// } -// -// public ECFieldElement negate() -// { -// // -x == x holds for all x in F2m -// return this; -// } -// -// public ECFieldElement square() -// { -// // Naive implementation, can probably be speeded up using modular -// // reduction -// return multiply(this); -// } -// -// public ECFieldElement invert() -// { -// // Inversion in F2m using the extended Euclidean algorithm -// // Input: A nonzero polynomial a(z) of degree at most m-1 -// // Output: a(z)^(-1) mod f(z) -// -// // u(z) := a(z) -// BigInteger uz = this.x; -// if (uz.signum() <= 0) -// { -// throw new ArithmeticException("x is zero or negative, " + -// "inversion is impossible"); -// } -// -// // v(z) := f(z) -// BigInteger vz = ECConstants.ZERO.setBit(m); -// vz = vz.setBit(0); -// vz = vz.setBit(this.k1); -// if (this.representation == PPB) -// { -// vz = vz.setBit(this.k2); -// vz = vz.setBit(this.k3); -// } -// -// // g1(z) := 1, g2(z) := 0 -// BigInteger g1z = ECConstants.ONE; -// BigInteger g2z = ECConstants.ZERO; -// -// // while u != 1 -// while (!(uz.equals(ECConstants.ZERO))) -// { -// // j := deg(u(z)) - deg(v(z)) -// int j = uz.bitLength() - vz.bitLength(); -// -// // If j < 0 then: u(z) <-> v(z), g1(z) <-> g2(z), j := -j -// if (j < 0) -// { -// final BigInteger uzCopy = uz; -// uz = vz; -// vz = uzCopy; -// -// final BigInteger g1zCopy = g1z; -// g1z = g2z; -// g2z = g1zCopy; -// -// j = -j; -// } -// -// // u(z) := u(z) + z^j * v(z) -// // Note, that no reduction modulo f(z) is required, because -// // deg(u(z) + z^j * v(z)) <= max(deg(u(z)), j + deg(v(z))) -// // = max(deg(u(z)), deg(u(z)) - deg(v(z)) + deg(v(z)) -// // = deg(u(z)) -// uz = uz.xor(vz.shiftLeft(j)); -// -// // g1(z) := g1(z) + z^j * g2(z) -// g1z = g1z.xor(g2z.shiftLeft(j)); -//// if (g1z.bitLength() > this.m) { -//// throw new ArithmeticException( -//// "deg(g1z) >= m, g1z = " + g1z.toString(2)); -//// } -// } -// return new ECFieldElement.F2m( -// this.m, this.k1, this.k2, this.k3, g2z); -// } -// -// public ECFieldElement sqrt() -// { -// throw new RuntimeException("Not implemented"); -// } -// -// /** -// * @return the representation of the field -// * F2m, either of -// * TPB (trinomial -// * basis representation) or -// * PPB (pentanomial -// * basis representation). -// */ -// public int getRepresentation() -// { -// return this.representation; -// } -// -// /** -// * @return the degree m of the reduction polynomial -// * f(z). -// */ -// public int getM() -// { -// return this.m; -// } -// -// /** -// * @return TPB: The integer k where xm + -// * xk + 1 represents the reduction polynomial -// * f(z).
    -// * PPB: The integer k1 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// public int getK1() -// { -// return this.k1; -// } -// -// /** -// * @return TPB: Always returns 0
    -// * PPB: The integer k2 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// public int getK2() -// { -// return this.k2; -// } -// -// /** -// * @return TPB: Always set to 0
    -// * PPB: The integer k3 where xm + -// * xk3 + xk2 + xk1 + 1 -// * represents the reduction polynomial f(z).
    -// */ -// public int getK3() -// { -// return this.k3; -// } -// -// public boolean equals(Object anObject) -// { -// if (anObject == this) -// { -// return true; -// } -// -// if (!(anObject instanceof ECFieldElement.F2m)) -// { -// return false; -// } -// -// ECFieldElement.F2m b = (ECFieldElement.F2m)anObject; -// -// return ((this.m == b.m) && (this.k1 == b.k1) && (this.k2 == b.k2) -// && (this.k3 == b.k3) -// && (this.representation == b.representation) -// && (this.x.equals(b.x))); -// } -// -// public int hashCode() -// { -// return x.hashCode() ^ m ^ k1 ^ k2 ^ k3; -// } -// } - - /** - * Class representing the Elements of the finite field - * F2m in polynomial basis (PB) - * representation. Both trinomial (TPB) and pentanomial (PPB) polynomial - * basis representations are supported. Gaussian normal basis (GNB) - * representation is not supported. - */ - public static class F2m extends ECFieldElement - { - /** - * Indicates gaussian normal basis representation (GNB). Number chosen - * according to X9.62. GNB is not implemented at present. - */ - public static final int GNB = 1; - - /** - * Indicates trinomial basis representation (TPB). Number chosen - * according to X9.62. - */ - public static final int TPB = 2; - - /** - * Indicates pentanomial basis representation (PPB). Number chosen - * according to X9.62. - */ - public static final int PPB = 3; - - /** - * TPB or PPB. - */ - private int representation; - - /** - * The exponent m of F2m. - */ - private int m; - - /** - * TPB: The integer k where xm + - * xk + 1 represents the reduction polynomial - * f(z).
    - * PPB: The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k1; - - /** - * TPB: Always set to 0
    - * PPB: The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k2; - - /** - * TPB: Always set to 0
    - * PPB: The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - private int k3; - - /** - * The IntArray holding the bits. - */ - private IntArray x; - - /** - * The number of ints required to hold m bits. - */ - private int t; - - /** - * Constructor for PPB. - * @param m The exponent m of - * F2m. - * @param k1 The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k2 The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param k3 The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z). - * @param x The BigInteger representing the value of the field element. - */ - public F2m( - int m, - int k1, - int k2, - int k3, - BigInteger x) - { - // t = m / 32 rounded up to the next integer - t = (m + 31) >> 5; - this.x = new IntArray(x, t); - - if ((k2 == 0) && (k3 == 0)) - { - this.representation = TPB; - } - else - { - if (k2 >= k3) - { - throw new IllegalArgumentException( - "k2 must be smaller than k3"); - } - if (k2 <= 0) - { - throw new IllegalArgumentException( - "k2 must be larger than 0"); - } - this.representation = PPB; - } - - if (x.signum() < 0) - { - throw new IllegalArgumentException("x value cannot be negative"); - } - - this.m = m; - this.k1 = k1; - this.k2 = k2; - this.k3 = k3; - } - - /** - * Constructor for TPB. - * @param m The exponent m of - * F2m. - * @param k The integer k where xm + - * xk + 1 represents the reduction - * polynomial f(z). - * @param x The BigInteger representing the value of the field element. - */ - public F2m(int m, int k, BigInteger x) - { - // Set k1 to k, and set k2 and k3 to 0 - this(m, k, 0, 0, x); - } - - private F2m(int m, int k1, int k2, int k3, IntArray x) - { - t = (m + 31) >> 5; - this.x = x; - this.m = m; - this.k1 = k1; - this.k2 = k2; - this.k3 = k3; - - if ((k2 == 0) && (k3 == 0)) - { - this.representation = TPB; - } - else - { - this.representation = PPB; - } - - } - - public BigInteger toBigInteger() - { - return x.toBigInteger(); - } - - public String getFieldName() - { - return "F2m"; - } - - public int getFieldSize() - { - return m; - } - - /** - * Checks, if the ECFieldElements a and b - * are elements of the same field F2m - * (having the same representation). - * @param a field element. - * @param b field element to be compared. - * @throws IllegalArgumentException if a and b - * are not elements of the same field - * F2m (having the same - * representation). - */ - public static void checkFieldElements( - ECFieldElement a, - ECFieldElement b) - { - if ((!(a instanceof F2m)) || (!(b instanceof F2m))) - { - throw new IllegalArgumentException("Field elements are not " - + "both instances of ECFieldElement.F2m"); - } - - ECFieldElement.F2m aF2m = (ECFieldElement.F2m)a; - ECFieldElement.F2m bF2m = (ECFieldElement.F2m)b; - - if ((aF2m.m != bF2m.m) || (aF2m.k1 != bF2m.k1) - || (aF2m.k2 != bF2m.k2) || (aF2m.k3 != bF2m.k3)) - { - throw new IllegalArgumentException("Field elements are not " - + "elements of the same field F2m"); - } - - if (aF2m.representation != bF2m.representation) - { - // Should never occur - throw new IllegalArgumentException( - "One of the field " - + "elements are not elements has incorrect representation"); - } - } - - public ECFieldElement add(final ECFieldElement b) - { - // No check performed here for performance reasons. Instead the - // elements involved are checked in ECPoint.F2m - // checkFieldElements(this, b); - IntArray iarrClone = (IntArray)this.x.clone(); - F2m bF2m = (F2m)b; - iarrClone.addShifted(bF2m.x, 0); - return new F2m(m, k1, k2, k3, iarrClone); - } - - public ECFieldElement subtract(final ECFieldElement b) - { - // Addition and subtraction are the same in F2m - return add(b); - } - - public ECFieldElement multiply(final ECFieldElement b) - { - // Right-to-left comb multiplication in the IntArray - // Input: Binary polynomials a(z) and b(z) of degree at most m-1 - // Output: c(z) = a(z) * b(z) mod f(z) - - // No check performed here for performance reasons. Instead the - // elements involved are checked in ECPoint.F2m - // checkFieldElements(this, b); - F2m bF2m = (F2m)b; - IntArray mult = x.multiply(bF2m.x, m); - mult.reduce(m, new int[]{k1, k2, k3}); - return new F2m(m, k1, k2, k3, mult); - } - - public ECFieldElement divide(final ECFieldElement b) - { - // There may be more efficient implementations - ECFieldElement bInv = b.invert(); - return multiply(bInv); - } - - public ECFieldElement negate() - { - // -x == x holds for all x in F2m - return this; - } - - public ECFieldElement square() - { - IntArray squared = x.square(m); - squared.reduce(m, new int[]{k1, k2, k3}); - return new F2m(m, k1, k2, k3, squared); - } - - - public ECFieldElement invert() - { - // Inversion in F2m using the extended Euclidean algorithm - // Input: A nonzero polynomial a(z) of degree at most m-1 - // Output: a(z)^(-1) mod f(z) - - // u(z) := a(z) - IntArray uz = (IntArray)this.x.clone(); - - // v(z) := f(z) - IntArray vz = new IntArray(t); - vz.setBit(m); - vz.setBit(0); - vz.setBit(this.k1); - if (this.representation == PPB) - { - vz.setBit(this.k2); - vz.setBit(this.k3); - } - - // g1(z) := 1, g2(z) := 0 - IntArray g1z = new IntArray(t); - g1z.setBit(0); - IntArray g2z = new IntArray(t); - - // while u != 0 - while (!uz.isZero()) -// while (uz.getUsedLength() > 0) -// while (uz.bitLength() > 1) - { - // j := deg(u(z)) - deg(v(z)) - int j = uz.bitLength() - vz.bitLength(); - - // If j < 0 then: u(z) <-> v(z), g1(z) <-> g2(z), j := -j - if (j < 0) - { - final IntArray uzCopy = uz; - uz = vz; - vz = uzCopy; - - final IntArray g1zCopy = g1z; - g1z = g2z; - g2z = g1zCopy; - - j = -j; - } - - // u(z) := u(z) + z^j * v(z) - // Note, that no reduction modulo f(z) is required, because - // deg(u(z) + z^j * v(z)) <= max(deg(u(z)), j + deg(v(z))) - // = max(deg(u(z)), deg(u(z)) - deg(v(z)) + deg(v(z)) - // = deg(u(z)) - // uz = uz.xor(vz.shiftLeft(j)); - // jInt = n / 32 - int jInt = j >> 5; - // jInt = n % 32 - int jBit = j & 0x1F; - IntArray vzShift = vz.shiftLeft(jBit); - uz.addShifted(vzShift, jInt); - - // g1(z) := g1(z) + z^j * g2(z) -// g1z = g1z.xor(g2z.shiftLeft(j)); - IntArray g2zShift = g2z.shiftLeft(jBit); - g1z.addShifted(g2zShift, jInt); - - } - return new ECFieldElement.F2m( - this.m, this.k1, this.k2, this.k3, g2z); - } - - public ECFieldElement sqrt() - { - throw new RuntimeException("Not implemented"); - } - - /** - * @return the representation of the field - * F2m, either of - * TPB (trinomial - * basis representation) or - * PPB (pentanomial - * basis representation). - */ - public int getRepresentation() - { - return this.representation; - } - - /** - * @return the degree m of the reduction polynomial - * f(z). - */ - public int getM() - { - return this.m; - } - - /** - * @return TPB: The integer k where xm + - * xk + 1 represents the reduction polynomial - * f(z).
    - * PPB: The integer k1 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - public int getK1() - { - return this.k1; - } - - /** - * @return TPB: Always returns 0
    - * PPB: The integer k2 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - public int getK2() - { - return this.k2; - } - - /** - * @return TPB: Always set to 0
    - * PPB: The integer k3 where xm + - * xk3 + xk2 + xk1 + 1 - * represents the reduction polynomial f(z).
    - */ - public int getK3() - { - return this.k3; - } - - public boolean equals(Object anObject) - { - if (anObject == this) - { - return true; - } - - if (!(anObject instanceof ECFieldElement.F2m)) - { - return false; - } - - ECFieldElement.F2m b = (ECFieldElement.F2m)anObject; - - return ((this.m == b.m) && (this.k1 == b.k1) && (this.k2 == b.k2) - && (this.k3 == b.k3) - && (this.representation == b.representation) - && (this.x.equals(b.x))); - } - - public int hashCode() - { - return x.hashCode() ^ m ^ k1 ^ k2 ^ k3; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECMultiplier.java deleted file mode 100644 index 0e8e292..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECMultiplier.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Interface for classes encapsulating a point multiplication algorithm - * for ECPoints. - */ -interface ECMultiplier -{ - /** - * Multiplies the ECPoint p by k, i.e. - * p is added k times to itself. - * @param p The ECPoint to be multiplied. - * @param k The factor by which p i multiplied. - * @return p multiplied by k. - */ - ECPoint multiply(ECPoint p, BigInteger k, PreCompInfo preCompInfo); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECPoint.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECPoint.java deleted file mode 100644 index 37a646f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ECPoint.java +++ /dev/null @@ -1,588 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -import org.bc.asn1.x9.X9IntegerConverter; - -/** - * base class for points on elliptic curves. - */ -public abstract class ECPoint -{ - ECCurve curve; - ECFieldElement x; - ECFieldElement y; - - protected boolean withCompression; - - protected ECMultiplier multiplier = null; - - protected PreCompInfo preCompInfo = null; - - private static X9IntegerConverter converter = new X9IntegerConverter(); - - protected ECPoint(ECCurve curve, ECFieldElement x, ECFieldElement y) - { - this.curve = curve; - this.x = x; - this.y = y; - } - - public ECCurve getCurve() - { - return curve; - } - - public ECFieldElement getX() - { - return x; - } - - public ECFieldElement getY() - { - return y; - } - - public boolean isInfinity() - { - return x == null && y == null; - } - - public boolean isCompressed() - { - return withCompression; - } - - public boolean equals( - Object other) - { - if (other == this) - { - return true; - } - - if (!(other instanceof ECPoint)) - { - return false; - } - - ECPoint o = (ECPoint)other; - - if (this.isInfinity()) - { - return o.isInfinity(); - } - - return x.equals(o.x) && y.equals(o.y); - } - - public int hashCode() - { - if (this.isInfinity()) - { - return 0; - } - - return x.hashCode() ^ y.hashCode(); - } - -// /** -// * Mainly for testing. Explicitly set the ECMultiplier. -// * @param multiplier The ECMultiplier to be used to multiply -// * this ECPoint. -// */ -// public void setECMultiplier(ECMultiplier multiplier) -// { -// this.multiplier = multiplier; -// } - - /** - * Sets the PreCompInfo. Used by ECMultipliers - * to save the precomputation for this ECPoint to store the - * precomputation result for use by subsequent multiplication. - * @param preCompInfo The values precomputed by the - * ECMultiplier. - */ - void setPreCompInfo(PreCompInfo preCompInfo) - { - this.preCompInfo = preCompInfo; - } - - public abstract byte[] getEncoded(); - - public abstract ECPoint add(ECPoint b); - public abstract ECPoint subtract(ECPoint b); - public abstract ECPoint negate(); - public abstract ECPoint twice(); - - /** - * Sets the default ECMultiplier, unless already set. - */ - synchronized void assertECMultiplier() - { - if (this.multiplier == null) - { - this.multiplier = new FpNafMultiplier(); - } - } - - /** - * Multiplies this ECPoint by the given number. - * @param k The multiplicator. - * @return k * this. - */ - public ECPoint multiply(BigInteger k) - { - if (k.signum() < 0) - { - throw new IllegalArgumentException("The multiplicator cannot be negative"); - } - - if (this.isInfinity()) - { - return this; - } - - if (k.signum() == 0) - { - return this.curve.getInfinity(); - } - - assertECMultiplier(); - return this.multiplier.multiply(this, k, preCompInfo); - } - - /** - * Elliptic curve points over Fp - */ - public static class Fp extends ECPoint - { - - /** - * Create a point which encodes with point compression. - * - * @param curve the curve to use - * @param x affine x co-ordinate - * @param y affine y co-ordinate - */ - public Fp(ECCurve curve, ECFieldElement x, ECFieldElement y) - { - this(curve, x, y, false); - } - - /** - * Create a point that encodes with or without point compresion. - * - * @param curve the curve to use - * @param x affine x co-ordinate - * @param y affine y co-ordinate - * @param withCompression if true encode with point compression - */ - public Fp(ECCurve curve, ECFieldElement x, ECFieldElement y, boolean withCompression) - { - super(curve, x, y); - - if ((x != null && y == null) || (x == null && y != null)) - { - throw new IllegalArgumentException("Exactly one of the field elements is null"); - } - - this.withCompression = withCompression; - } - - /** - * return the field element encoded with point compression. (S 4.3.6) - */ - public byte[] getEncoded() - { - if (this.isInfinity()) - { - return new byte[1]; - } - - int qLength = converter.getByteLength(x); - - if (withCompression) - { - byte PC; - - if (this.getY().toBigInteger().testBit(0)) - { - PC = 0x03; - } - else - { - PC = 0x02; - } - - byte[] X = converter.integerToBytes(this.getX().toBigInteger(), qLength); - byte[] PO = new byte[X.length + 1]; - - PO[0] = PC; - System.arraycopy(X, 0, PO, 1, X.length); - - return PO; - } - else - { - byte[] X = converter.integerToBytes(this.getX().toBigInteger(), qLength); - byte[] Y = converter.integerToBytes(this.getY().toBigInteger(), qLength); - byte[] PO = new byte[X.length + Y.length + 1]; - - PO[0] = 0x04; - System.arraycopy(X, 0, PO, 1, X.length); - System.arraycopy(Y, 0, PO, X.length + 1, Y.length); - - return PO; - } - } - - // B.3 pg 62 - public ECPoint add(ECPoint b) - { - if (this.isInfinity()) - { - return b; - } - - if (b.isInfinity()) - { - return this; - } - - // Check if b = this or b = -this - if (this.x.equals(b.x)) - { - if (this.y.equals(b.y)) - { - // this = b, i.e. this must be doubled - return this.twice(); - } - - // this = -b, i.e. the result is the point at infinity - return this.curve.getInfinity(); - } - - ECFieldElement gamma = b.y.subtract(this.y).divide(b.x.subtract(this.x)); - - ECFieldElement x3 = gamma.square().subtract(this.x).subtract(b.x); - ECFieldElement y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); - - return new ECPoint.Fp(curve, x3, y3); - } - - // B.3 pg 62 - public ECPoint twice() - { - if (this.isInfinity()) - { - // Twice identity element (point at infinity) is identity - return this; - } - - if (this.y.toBigInteger().signum() == 0) - { - // if y1 == 0, then (x1, y1) == (x1, -y1) - // and hence this = -this and thus 2(x1, y1) == infinity - return this.curve.getInfinity(); - } - - ECFieldElement TWO = this.curve.fromBigInteger(BigInteger.valueOf(2)); - ECFieldElement THREE = this.curve.fromBigInteger(BigInteger.valueOf(3)); - ECFieldElement gamma = this.x.square().multiply(THREE).add(curve.a).divide(y.multiply(TWO)); - - ECFieldElement x3 = gamma.square().subtract(this.x.multiply(TWO)); - ECFieldElement y3 = gamma.multiply(this.x.subtract(x3)).subtract(this.y); - - return new ECPoint.Fp(curve, x3, y3, this.withCompression); - } - - // D.3.2 pg 102 (see Note:) - public ECPoint subtract(ECPoint b) - { - if (b.isInfinity()) - { - return this; - } - - // Add -b - return add(b.negate()); - } - - public ECPoint negate() - { - return new ECPoint.Fp(curve, this.x, this.y.negate(), this.withCompression); - } - - /** - * Sets the default ECMultiplier, unless already set. - */ - synchronized void assertECMultiplier() - { - if (this.multiplier == null) - { - this.multiplier = new WNafMultiplier(); - } - } - } - - /** - * Elliptic curve points over F2m - */ - public static class F2m extends ECPoint - { - /** - * @param curve base curve - * @param x x point - * @param y y point - */ - public F2m(ECCurve curve, ECFieldElement x, ECFieldElement y) - { - this(curve, x, y, false); - } - - /** - * @param curve base curve - * @param x x point - * @param y y point - * @param withCompression true if encode with point compression. - */ - public F2m(ECCurve curve, ECFieldElement x, ECFieldElement y, boolean withCompression) - { - super(curve, x, y); - - if ((x != null && y == null) || (x == null && y != null)) - { - throw new IllegalArgumentException("Exactly one of the field elements is null"); - } - - if (x != null) - { - // Check if x and y are elements of the same field - ECFieldElement.F2m.checkFieldElements(this.x, this.y); - - // Check if x and a are elements of the same field - if (curve != null) - { - ECFieldElement.F2m.checkFieldElements(this.x, this.curve.getA()); - } - } - - this.withCompression = withCompression; - } - - /* (non-Javadoc) - * @see org.bouncycastle.math.ec.ECPoint#getEncoded() - */ - public byte[] getEncoded() - { - if (this.isInfinity()) - { - return new byte[1]; - } - - int byteCount = converter.getByteLength(this.x); - byte[] X = converter.integerToBytes(this.getX().toBigInteger(), byteCount); - byte[] PO; - - if (withCompression) - { - // See X9.62 4.3.6 and 4.2.2 - PO = new byte[byteCount + 1]; - - PO[0] = 0x02; - // X9.62 4.2.2 and 4.3.6: - // if x = 0 then ypTilde := 0, else ypTilde is the rightmost - // bit of y * x^(-1) - // if ypTilde = 0, then PC := 02, else PC := 03 - // Note: PC === PO[0] - if (!(this.getX().toBigInteger().equals(ECConstants.ZERO))) - { - if (this.getY().multiply(this.getX().invert()) - .toBigInteger().testBit(0)) - { - // ypTilde = 1, hence PC = 03 - PO[0] = 0x03; - } - } - - System.arraycopy(X, 0, PO, 1, byteCount); - } - else - { - byte[] Y = converter.integerToBytes(this.getY().toBigInteger(), byteCount); - - PO = new byte[byteCount + byteCount + 1]; - - PO[0] = 0x04; - System.arraycopy(X, 0, PO, 1, byteCount); - System.arraycopy(Y, 0, PO, byteCount + 1, byteCount); - } - - return PO; - } - - /** - * Check, if two ECPoints can be added or subtracted. - * @param a The first ECPoint to check. - * @param b The second ECPoint to check. - * @throws IllegalArgumentException if a and b - * cannot be added. - */ - private static void checkPoints(ECPoint a, ECPoint b) - { - // Check, if points are on the same curve - if (!(a.curve.equals(b.curve))) - { - throw new IllegalArgumentException("Only points on the same " - + "curve can be added or subtracted"); - } - -// ECFieldElement.F2m.checkFieldElements(a.x, b.x); - } - - /* (non-Javadoc) - * @see org.bouncycastle.math.ec.ECPoint#add(org.bouncycastle.math.ec.ECPoint) - */ - public ECPoint add(ECPoint b) - { - checkPoints(this, b); - return addSimple((ECPoint.F2m)b); - } - - /** - * Adds another ECPoints.F2m to this without - * checking if both points are on the same curve. Used by multiplication - * algorithms, because there all points are a multiple of the same point - * and hence the checks can be omitted. - * @param b The other ECPoints.F2m to add to - * this. - * @return this + b - */ - public ECPoint.F2m addSimple(ECPoint.F2m b) - { - ECPoint.F2m other = b; - if (this.isInfinity()) - { - return other; - } - - if (other.isInfinity()) - { - return this; - } - - ECFieldElement.F2m x2 = (ECFieldElement.F2m)other.getX(); - ECFieldElement.F2m y2 = (ECFieldElement.F2m)other.getY(); - - // Check if other = this or other = -this - if (this.x.equals(x2)) - { - if (this.y.equals(y2)) - { - // this = other, i.e. this must be doubled - return (ECPoint.F2m)this.twice(); - } - - // this = -other, i.e. the result is the point at infinity - return (ECPoint.F2m)this.curve.getInfinity(); - } - - ECFieldElement.F2m lambda - = (ECFieldElement.F2m)(this.y.add(y2)).divide(this.x.add(x2)); - - ECFieldElement.F2m x3 - = (ECFieldElement.F2m)lambda.square().add(lambda).add(this.x).add(x2).add(this.curve.getA()); - - ECFieldElement.F2m y3 - = (ECFieldElement.F2m)lambda.multiply(this.x.add(x3)).add(x3).add(this.y); - - return new ECPoint.F2m(curve, x3, y3, withCompression); - } - - /* (non-Javadoc) - * @see org.bouncycastle.math.ec.ECPoint#subtract(org.bouncycastle.math.ec.ECPoint) - */ - public ECPoint subtract(ECPoint b) - { - checkPoints(this, b); - return subtractSimple((ECPoint.F2m)b); - } - - /** - * Subtracts another ECPoints.F2m from this - * without checking if both points are on the same curve. Used by - * multiplication algorithms, because there all points are a multiple - * of the same point and hence the checks can be omitted. - * @param b The other ECPoints.F2m to subtract from - * this. - * @return this - b - */ - public ECPoint.F2m subtractSimple(ECPoint.F2m b) - { - if (b.isInfinity()) - { - return this; - } - - // Add -b - return addSimple((ECPoint.F2m)b.negate()); - } - - /* (non-Javadoc) - * @see org.bouncycastle.math.ec.ECPoint#twice() - */ - public ECPoint twice() - { - if (this.isInfinity()) - { - // Twice identity element (point at infinity) is identity - return this; - } - - if (this.x.toBigInteger().signum() == 0) - { - // if x1 == 0, then (x1, y1) == (x1, x1 + y1) - // and hence this = -this and thus 2(x1, y1) == infinity - return this.curve.getInfinity(); - } - - ECFieldElement.F2m lambda - = (ECFieldElement.F2m)this.x.add(this.y.divide(this.x)); - - ECFieldElement.F2m x3 - = (ECFieldElement.F2m)lambda.square().add(lambda). - add(this.curve.getA()); - - ECFieldElement ONE = this.curve.fromBigInteger(ECConstants.ONE); - ECFieldElement.F2m y3 - = (ECFieldElement.F2m)this.x.square().add( - x3.multiply(lambda.add(ONE))); - - return new ECPoint.F2m(this.curve, x3, y3, withCompression); - } - - public ECPoint negate() - { - return new ECPoint.F2m(curve, this.getX(), this.getY().add(this.getX()), withCompression); - } - - /** - * Sets the appropriate ECMultiplier, unless already set. - */ - synchronized void assertECMultiplier() - { - if (this.multiplier == null) - { - if (((ECCurve.F2m)this.curve).isKoblitz()) - { - this.multiplier = new WTauNafMultiplier(); - } - else - { - this.multiplier = new WNafMultiplier(); - } - } - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/FpNafMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/FpNafMultiplier.java deleted file mode 100644 index cf567e2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/FpNafMultiplier.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class implementing the NAF (Non-Adjacent Form) multiplication algorithm. - */ -class FpNafMultiplier implements ECMultiplier -{ - /** - * D.3.2 pg 101 - * @see org.bc.math.ec.ECMultiplier#multiply(org.bc.math.ec.ECPoint, java.math.BigInteger) - */ - public ECPoint multiply(ECPoint p, BigInteger k, PreCompInfo preCompInfo) - { - // TODO Probably should try to add this - // BigInteger e = k.mod(n); // n == order of p - BigInteger e = k; - BigInteger h = e.multiply(BigInteger.valueOf(3)); - - ECPoint neg = p.negate(); - ECPoint R = p; - - for (int i = h.bitLength() - 2; i > 0; --i) - { - R = R.twice(); - - boolean hBit = h.testBit(i); - boolean eBit = e.testBit(i); - - if (hBit != eBit) - { - R = R.add(hBit ? p : neg); - } - } - - return R; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/IntArray.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/IntArray.java deleted file mode 100644 index f041478..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/IntArray.java +++ /dev/null @@ -1,518 +0,0 @@ -package org.bc.math.ec; - -import org.bc.util.Arrays; - -import java.math.BigInteger; - -class IntArray -{ - // TODO make m fixed for the IntArray, and hence compute T once and for all - - private int[] m_ints; - - public IntArray(int intLen) - { - m_ints = new int[intLen]; - } - - public IntArray(int[] ints) - { - m_ints = ints; - } - - public IntArray(BigInteger bigInt) - { - this(bigInt, 0); - } - - public IntArray(BigInteger bigInt, int minIntLen) - { - if (bigInt.signum() == -1) - { - throw new IllegalArgumentException("Only positive Integers allowed"); - } - if (bigInt.equals(ECConstants.ZERO)) - { - m_ints = new int[] { 0 }; - return; - } - - byte[] barr = bigInt.toByteArray(); - int barrLen = barr.length; - int barrStart = 0; - if (barr[0] == 0) - { - // First byte is 0 to enforce highest (=sign) bit is zero. - // In this case ignore barr[0]. - barrLen--; - barrStart = 1; - } - int intLen = (barrLen + 3) / 4; - if (intLen < minIntLen) - { - m_ints = new int[minIntLen]; - } - else - { - m_ints = new int[intLen]; - } - - int iarrJ = intLen - 1; - int rem = barrLen % 4 + barrStart; - int temp = 0; - int barrI = barrStart; - if (barrStart < rem) - { - for (; barrI < rem; barrI++) - { - temp <<= 8; - int barrBarrI = barr[barrI]; - if (barrBarrI < 0) - { - barrBarrI += 256; - } - temp |= barrBarrI; - } - m_ints[iarrJ--] = temp; - } - - for (; iarrJ >= 0; iarrJ--) - { - temp = 0; - for (int i = 0; i < 4; i++) - { - temp <<= 8; - int barrBarrI = barr[barrI++]; - if (barrBarrI < 0) - { - barrBarrI += 256; - } - temp |= barrBarrI; - } - m_ints[iarrJ] = temp; - } - } - - public boolean isZero() - { - return m_ints.length == 0 - || (m_ints[0] == 0 && getUsedLength() == 0); - } - - public int getUsedLength() - { - int highestIntPos = m_ints.length; - - if (highestIntPos < 1) - { - return 0; - } - - // Check if first element will act as sentinel - if (m_ints[0] != 0) - { - while (m_ints[--highestIntPos] == 0) - { - } - return highestIntPos + 1; - } - - do - { - if (m_ints[--highestIntPos] != 0) - { - return highestIntPos + 1; - } - } - while (highestIntPos > 0); - - return 0; - } - - public int bitLength() - { - // JDK 1.5: see Integer.numberOfLeadingZeros() - int intLen = getUsedLength(); - if (intLen == 0) - { - return 0; - } - - int last = intLen - 1; - int highest = m_ints[last]; - int bits = (last << 5) + 1; - - // A couple of binary search steps - if ((highest & 0xffff0000) != 0) - { - if ((highest & 0xff000000) != 0) - { - bits += 24; - highest >>>= 24; - } - else - { - bits += 16; - highest >>>= 16; - } - } - else if (highest > 0x000000ff) - { - bits += 8; - highest >>>= 8; - } - - while (highest != 1) - { - ++bits; - highest >>>= 1; - } - - return bits; - } - - private int[] resizedInts(int newLen) - { - int[] newInts = new int[newLen]; - int oldLen = m_ints.length; - int copyLen = oldLen < newLen ? oldLen : newLen; - System.arraycopy(m_ints, 0, newInts, 0, copyLen); - return newInts; - } - - public BigInteger toBigInteger() - { - int usedLen = getUsedLength(); - if (usedLen == 0) - { - return ECConstants.ZERO; - } - - int highestInt = m_ints[usedLen - 1]; - byte[] temp = new byte[4]; - int barrI = 0; - boolean trailingZeroBytesDone = false; - for (int j = 3; j >= 0; j--) - { - byte thisByte = (byte) (highestInt >>> (8 * j)); - if (trailingZeroBytesDone || (thisByte != 0)) - { - trailingZeroBytesDone = true; - temp[barrI++] = thisByte; - } - } - - int barrLen = 4 * (usedLen - 1) + barrI; - byte[] barr = new byte[barrLen]; - for (int j = 0; j < barrI; j++) - { - barr[j] = temp[j]; - } - // Highest value int is done now - - for (int iarrJ = usedLen - 2; iarrJ >= 0; iarrJ--) - { - for (int j = 3; j >= 0; j--) - { - barr[barrI++] = (byte) (m_ints[iarrJ] >>> (8 * j)); - } - } - return new BigInteger(1, barr); - } - - public void shiftLeft() - { - int usedLen = getUsedLength(); - if (usedLen == 0) - { - return; - } - if (m_ints[usedLen - 1] < 0) - { - // highest bit of highest used byte is set, so shifting left will - // make the IntArray one byte longer - usedLen++; - if (usedLen > m_ints.length) - { - // make the m_ints one byte longer, because we need one more - // byte which is not available in m_ints - m_ints = resizedInts(m_ints.length + 1); - } - } - - boolean carry = false; - for (int i = 0; i < usedLen; i++) - { - // nextCarry is true if highest bit is set - boolean nextCarry = m_ints[i] < 0; - m_ints[i] <<= 1; - if (carry) - { - // set lowest bit - m_ints[i] |= 1; - } - carry = nextCarry; - } - } - - public IntArray shiftLeft(int n) - { - int usedLen = getUsedLength(); - if (usedLen == 0) - { - return this; - } - - if (n == 0) - { - return this; - } - - if (n > 31) - { - throw new IllegalArgumentException("shiftLeft() for max 31 bits " - + ", " + n + "bit shift is not possible"); - } - - int[] newInts = new int[usedLen + 1]; - - int nm32 = 32 - n; - newInts[0] = m_ints[0] << n; - for (int i = 1; i < usedLen; i++) - { - newInts[i] = (m_ints[i] << n) | (m_ints[i - 1] >>> nm32); - } - newInts[usedLen] = m_ints[usedLen - 1] >>> nm32; - - return new IntArray(newInts); - } - - public void addShifted(IntArray other, int shift) - { - int usedLenOther = other.getUsedLength(); - int newMinUsedLen = usedLenOther + shift; - if (newMinUsedLen > m_ints.length) - { - m_ints = resizedInts(newMinUsedLen); - //System.out.println("Resize required"); - } - - for (int i = 0; i < usedLenOther; i++) - { - m_ints[i + shift] ^= other.m_ints[i]; - } - } - - public int getLength() - { - return m_ints.length; - } - - public boolean testBit(int n) - { - // theInt = n / 32 - int theInt = n >> 5; - // theBit = n % 32 - int theBit = n & 0x1F; - int tester = 1 << theBit; - return ((m_ints[theInt] & tester) != 0); - } - - public void flipBit(int n) - { - // theInt = n / 32 - int theInt = n >> 5; - // theBit = n % 32 - int theBit = n & 0x1F; - int flipper = 1 << theBit; - m_ints[theInt] ^= flipper; - } - - public void setBit(int n) - { - // theInt = n / 32 - int theInt = n >> 5; - // theBit = n % 32 - int theBit = n & 0x1F; - int setter = 1 << theBit; - m_ints[theInt] |= setter; - } - - public IntArray multiply(IntArray other, int m) - { - // Lenght of c is 2m bits rounded up to the next int (32 bit) - int t = (m + 31) >> 5; - if (m_ints.length < t) - { - m_ints = resizedInts(t); - } - - IntArray b = new IntArray(other.resizedInts(other.getLength() + 1)); - IntArray c = new IntArray((m + m + 31) >> 5); - // IntArray c = new IntArray(t + t); - int testBit = 1; - for (int k = 0; k < 32; k++) - { - for (int j = 0; j < t; j++) - { - if ((m_ints[j] & testBit) != 0) - { - // The kth bit of m_ints[j] is set - c.addShifted(b, j); - } - } - testBit <<= 1; - b.shiftLeft(); - } - return c; - } - - // public IntArray multiplyLeftToRight(IntArray other, int m) { - // // Lenght of c is 2m bits rounded up to the next int (32 bit) - // int t = (m + 31) / 32; - // if (m_ints.length < t) { - // m_ints = resizedInts(t); - // } - // - // IntArray b = new IntArray(other.resizedInts(other.getLength() + 1)); - // IntArray c = new IntArray((m + m + 31) / 32); - // // IntArray c = new IntArray(t + t); - // int testBit = 1 << 31; - // for (int k = 31; k >= 0; k--) { - // for (int j = 0; j < t; j++) { - // if ((m_ints[j] & testBit) != 0) { - // // The kth bit of m_ints[j] is set - // c.addShifted(b, j); - // } - // } - // testBit >>>= 1; - // if (k > 0) { - // c.shiftLeft(); - // } - // } - // return c; - // } - - // TODO note, redPol.length must be 3 for TPB and 5 for PPB - public void reduce(int m, int[] redPol) - { - for (int i = m + m - 2; i >= m; i--) - { - if (testBit(i)) - { - int bit = i - m; - flipBit(bit); - flipBit(i); - int l = redPol.length; - while (--l >= 0) - { - flipBit(redPol[l] + bit); - } - } - } - m_ints = resizedInts((m + 31) >> 5); - } - - public IntArray square(int m) - { - // TODO make the table static final - final int[] table = { 0x0, 0x1, 0x4, 0x5, 0x10, 0x11, 0x14, 0x15, 0x40, - 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55 }; - - int t = (m + 31) >> 5; - if (m_ints.length < t) - { - m_ints = resizedInts(t); - } - - IntArray c = new IntArray(t + t); - - // TODO twice the same code, put in separate private method - for (int i = 0; i < t; i++) - { - int v0 = 0; - for (int j = 0; j < 4; j++) - { - v0 = v0 >>> 8; - int u = (m_ints[i] >>> (j * 4)) & 0xF; - int w = table[u] << 24; - v0 |= w; - } - c.m_ints[i + i] = v0; - - v0 = 0; - int upper = m_ints[i] >>> 16; - for (int j = 0; j < 4; j++) - { - v0 = v0 >>> 8; - int u = (upper >>> (j * 4)) & 0xF; - int w = table[u] << 24; - v0 |= w; - } - c.m_ints[i + i + 1] = v0; - } - return c; - } - - public boolean equals(Object o) - { - if (!(o instanceof IntArray)) - { - return false; - } - IntArray other = (IntArray) o; - int usedLen = getUsedLength(); - if (other.getUsedLength() != usedLen) - { - return false; - } - for (int i = 0; i < usedLen; i++) - { - if (m_ints[i] != other.m_ints[i]) - { - return false; - } - } - return true; - } - - public int hashCode() - { - int usedLen = getUsedLength(); - int hash = 1; - for (int i = 0; i < usedLen; i++) - { - hash = hash * 31 + m_ints[i]; - } - return hash; - } - - public Object clone() - { - return new IntArray(Arrays.clone(m_ints)); - } - - public String toString() - { - int usedLen = getUsedLength(); - if (usedLen == 0) - { - return "0"; - } - - StringBuffer sb = new StringBuffer(Integer - .toBinaryString(m_ints[usedLen - 1])); - for (int iarrJ = usedLen - 2; iarrJ >= 0; iarrJ--) - { - String hexString = Integer.toBinaryString(m_ints[iarrJ]); - - // Add leading zeroes, except for highest significant int - for (int i = hexString.length(); i < 8; i++) - { - hexString = "0" + hexString; - } - sb.append(hexString); - } - return sb.toString(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/PreCompInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/PreCompInfo.java deleted file mode 100644 index fc693dc..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/PreCompInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.math.ec; - -/** - * Interface for classes storing precomputation data for multiplication - * algorithms. Used as a Memento (see GOF patterns) for - * WNafMultiplier. - */ -interface PreCompInfo -{ -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ReferenceMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ReferenceMultiplier.java deleted file mode 100644 index 426b097..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ReferenceMultiplier.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -class ReferenceMultiplier implements ECMultiplier -{ - /** - * Simple shift-and-add multiplication. Serves as reference implementation - * to verify (possibly faster) implementations in - * {@link org.bc.math.ec.ECPoint ECPoint}. - * - * @param p The point to multiply. - * @param k The factor by which to multiply. - * @return The result of the point multiplication k * p. - */ - public ECPoint multiply(ECPoint p, BigInteger k, PreCompInfo preCompInfo) - { - ECPoint q = p.getCurve().getInfinity(); - int t = k.bitLength(); - for (int i = 0; i < t; i++) - { - if (k.testBit(i)) - { - q = q.add(p); - } - p = p.twice(); - } - return q; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/SimpleBigDecimal.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/SimpleBigDecimal.java deleted file mode 100644 index 08d8dd5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/SimpleBigDecimal.java +++ /dev/null @@ -1,253 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class representing a simple version of a big decimal. A - * SimpleBigDecimal is basically a - * {@link java.math.BigInteger BigInteger} with a few digits on the right of - * the decimal point. The number of (binary) digits on the right of the decimal - * point is called the scale of the SimpleBigDecimal. - * Unlike in {@link java.math.BigDecimal BigDecimal}, the scale is not adjusted - * automatically, but must be set manually. All SimpleBigDecimals - * taking part in the same arithmetic operation must have equal scale. The - * result of a multiplication of two SimpleBigDecimals returns a - * SimpleBigDecimal with double scale. - */ -class SimpleBigDecimal - //extends Number // not in J2ME - add compatibility class? -{ - private static final long serialVersionUID = 1L; - - private final BigInteger bigInt; - private final int scale; - - /** - * Returns a SimpleBigDecimal representing the same numerical - * value as value. - * @param value The value of the SimpleBigDecimal to be - * created. - * @param scale The scale of the SimpleBigDecimal to be - * created. - * @return The such created SimpleBigDecimal. - */ - public static SimpleBigDecimal getInstance(BigInteger value, int scale) - { - return new SimpleBigDecimal(value.shiftLeft(scale), scale); - } - - /** - * Constructor for SimpleBigDecimal. The value of the - * constructed SimpleBigDecimal equals bigInt / - * 2scale. - * @param bigInt The bigInt value parameter. - * @param scale The scale of the constructed SimpleBigDecimal. - */ - public SimpleBigDecimal(BigInteger bigInt, int scale) - { - if (scale < 0) - { - throw new IllegalArgumentException("scale may not be negative"); - } - - this.bigInt = bigInt; - this.scale = scale; - } - - private SimpleBigDecimal(SimpleBigDecimal limBigDec) - { - bigInt = limBigDec.bigInt; - scale = limBigDec.scale; - } - - private void checkScale(SimpleBigDecimal b) - { - if (scale != b.scale) - { - throw new IllegalArgumentException("Only SimpleBigDecimal of " + - "same scale allowed in arithmetic operations"); - } - } - - public SimpleBigDecimal adjustScale(int newScale) - { - if (newScale < 0) - { - throw new IllegalArgumentException("scale may not be negative"); - } - - if (newScale == scale) - { - return new SimpleBigDecimal(this); - } - - return new SimpleBigDecimal(bigInt.shiftLeft(newScale - scale), - newScale); - } - - public SimpleBigDecimal add(SimpleBigDecimal b) - { - checkScale(b); - return new SimpleBigDecimal(bigInt.add(b.bigInt), scale); - } - - public SimpleBigDecimal add(BigInteger b) - { - return new SimpleBigDecimal(bigInt.add(b.shiftLeft(scale)), scale); - } - - public SimpleBigDecimal negate() - { - return new SimpleBigDecimal(bigInt.negate(), scale); - } - - public SimpleBigDecimal subtract(SimpleBigDecimal b) - { - return add(b.negate()); - } - - public SimpleBigDecimal subtract(BigInteger b) - { - return new SimpleBigDecimal(bigInt.subtract(b.shiftLeft(scale)), - scale); - } - - public SimpleBigDecimal multiply(SimpleBigDecimal b) - { - checkScale(b); - return new SimpleBigDecimal(bigInt.multiply(b.bigInt), scale + scale); - } - - public SimpleBigDecimal multiply(BigInteger b) - { - return new SimpleBigDecimal(bigInt.multiply(b), scale); - } - - public SimpleBigDecimal divide(SimpleBigDecimal b) - { - checkScale(b); - BigInteger dividend = bigInt.shiftLeft(scale); - return new SimpleBigDecimal(dividend.divide(b.bigInt), scale); - } - - public SimpleBigDecimal divide(BigInteger b) - { - return new SimpleBigDecimal(bigInt.divide(b), scale); - } - - public SimpleBigDecimal shiftLeft(int n) - { - return new SimpleBigDecimal(bigInt.shiftLeft(n), scale); - } - - public int compareTo(SimpleBigDecimal val) - { - checkScale(val); - return bigInt.compareTo(val.bigInt); - } - - public int compareTo(BigInteger val) - { - return bigInt.compareTo(val.shiftLeft(scale)); - } - - public BigInteger floor() - { - return bigInt.shiftRight(scale); - } - - public BigInteger round() - { - SimpleBigDecimal oneHalf = new SimpleBigDecimal(ECConstants.ONE, 1); - return add(oneHalf.adjustScale(scale)).floor(); - } - - public int intValue() - { - return floor().intValue(); - } - - public long longValue() - { - return floor().longValue(); - } - /* NON-J2ME compliant. - public double doubleValue() - { - return Double.valueOf(toString()).doubleValue(); - } - - public float floatValue() - { - return Float.valueOf(toString()).floatValue(); - } - */ - public int getScale() - { - return scale; - } - - public String toString() - { - if (scale == 0) - { - return bigInt.toString(); - } - - BigInteger floorBigInt = floor(); - - BigInteger fract = bigInt.subtract(floorBigInt.shiftLeft(scale)); - if (bigInt.signum() == -1) - { - fract = ECConstants.ONE.shiftLeft(scale).subtract(fract); - } - - if ((floorBigInt.signum() == -1) && (!(fract.equals(ECConstants.ZERO)))) - { - floorBigInt = floorBigInt.add(ECConstants.ONE); - } - String leftOfPoint = floorBigInt.toString(); - - char[] fractCharArr = new char[scale]; - String fractStr = fract.toString(2); - int fractLen = fractStr.length(); - int zeroes = scale - fractLen; - for (int i = 0; i < zeroes; i++) - { - fractCharArr[i] = '0'; - } - for (int j = 0; j < fractLen; j++) - { - fractCharArr[zeroes + j] = fractStr.charAt(j); - } - String rightOfPoint = new String(fractCharArr); - - StringBuffer sb = new StringBuffer(leftOfPoint); - sb.append("."); - sb.append(rightOfPoint); - - return sb.toString(); - } - - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - - if (!(o instanceof SimpleBigDecimal)) - { - return false; - } - - SimpleBigDecimal other = (SimpleBigDecimal)o; - return ((bigInt.equals(other.bigInt)) && (scale == other.scale)); - } - - public int hashCode() - { - return bigInt.hashCode() ^ scale; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/Tnaf.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/Tnaf.java deleted file mode 100644 index a5586e4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/Tnaf.java +++ /dev/null @@ -1,844 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class holding methods for point multiplication based on the window - * τ-adic nonadjacent form (WTNAF). The algorithms are based on the - * paper "Improved Algorithms for Arithmetic on Anomalous Binary Curves" - * by Jerome A. Solinas. The paper first appeared in the Proceedings of - * Crypto 1997. - */ -class Tnaf -{ - private static final BigInteger MINUS_ONE = ECConstants.ONE.negate(); - private static final BigInteger MINUS_TWO = ECConstants.TWO.negate(); - private static final BigInteger MINUS_THREE = ECConstants.THREE.negate(); - - /** - * The window width of WTNAF. The standard value of 4 is slightly less - * than optimal for running time, but keeps space requirements for - * precomputation low. For typical curves, a value of 5 or 6 results in - * a better running time. When changing this value, the - * αu's must be computed differently, see - * e.g. "Guide to Elliptic Curve Cryptography", Darrel Hankerson, - * Alfred Menezes, Scott Vanstone, Springer-Verlag New York Inc., 2004, - * p. 121-122 - */ - public static final byte WIDTH = 4; - - /** - * 24 - */ - public static final byte POW_2_WIDTH = 16; - - /** - * The αu's for a=0 as an array - * of ZTauElements. - */ - public static final ZTauElement[] alpha0 = { - null, - new ZTauElement(ECConstants.ONE, ECConstants.ZERO), null, - new ZTauElement(MINUS_THREE, MINUS_ONE), null, - new ZTauElement(MINUS_ONE, MINUS_ONE), null, - new ZTauElement(ECConstants.ONE, MINUS_ONE), null - }; - - /** - * The αu's for a=0 as an array - * of TNAFs. - */ - public static final byte[][] alpha0Tnaf = { - null, {1}, null, {-1, 0, 1}, null, {1, 0, 1}, null, {-1, 0, 0, 1} - }; - - /** - * The αu's for a=1 as an array - * of ZTauElements. - */ - public static final ZTauElement[] alpha1 = {null, - new ZTauElement(ECConstants.ONE, ECConstants.ZERO), null, - new ZTauElement(MINUS_THREE, ECConstants.ONE), null, - new ZTauElement(MINUS_ONE, ECConstants.ONE), null, - new ZTauElement(ECConstants.ONE, ECConstants.ONE), null - }; - - /** - * The αu's for a=1 as an array - * of TNAFs. - */ - public static final byte[][] alpha1Tnaf = { - null, {1}, null, {-1, 0, 1}, null, {1, 0, 1}, null, {-1, 0, 0, -1} - }; - - /** - * Computes the norm of an element λ of - * Z[τ]. - * @param mu The parameter μ of the elliptic curve. - * @param lambda The element λ of - * Z[τ]. - * @return The norm of λ. - */ - public static BigInteger norm(final byte mu, ZTauElement lambda) - { - BigInteger norm; - - // s1 = u^2 - BigInteger s1 = lambda.u.multiply(lambda.u); - - // s2 = u * v - BigInteger s2 = lambda.u.multiply(lambda.v); - - // s3 = 2 * v^2 - BigInteger s3 = lambda.v.multiply(lambda.v).shiftLeft(1); - - if (mu == 1) - { - norm = s1.add(s2).add(s3); - } - else if (mu == -1) - { - norm = s1.subtract(s2).add(s3); - } - else - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - return norm; - } - - /** - * Computes the norm of an element λ of - * R[τ], where λ = u + vτ - * and u and u are real numbers (elements of - * R). - * @param mu The parameter μ of the elliptic curve. - * @param u The real part of the element λ of - * R[τ]. - * @param v The τ-adic part of the element - * λ of R[τ]. - * @return The norm of λ. - */ - public static SimpleBigDecimal norm(final byte mu, SimpleBigDecimal u, - SimpleBigDecimal v) - { - SimpleBigDecimal norm; - - // s1 = u^2 - SimpleBigDecimal s1 = u.multiply(u); - - // s2 = u * v - SimpleBigDecimal s2 = u.multiply(v); - - // s3 = 2 * v^2 - SimpleBigDecimal s3 = v.multiply(v).shiftLeft(1); - - if (mu == 1) - { - norm = s1.add(s2).add(s3); - } - else if (mu == -1) - { - norm = s1.subtract(s2).add(s3); - } - else - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - return norm; - } - - /** - * Rounds an element λ of R[τ] - * to an element of Z[τ], such that their difference - * has minimal norm. λ is given as - * λ = λ0 + λ1τ. - * @param lambda0 The component λ0. - * @param lambda1 The component λ1. - * @param mu The parameter μ of the elliptic curve. Must - * equal 1 or -1. - * @return The rounded element of Z[τ]. - * @throws IllegalArgumentException if lambda0 and - * lambda1 do not have same scale. - */ - public static ZTauElement round(SimpleBigDecimal lambda0, - SimpleBigDecimal lambda1, byte mu) - { - int scale = lambda0.getScale(); - if (lambda1.getScale() != scale) - { - throw new IllegalArgumentException("lambda0 and lambda1 do not " + - "have same scale"); - } - - if (!((mu == 1) || (mu == -1))) - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - BigInteger f0 = lambda0.round(); - BigInteger f1 = lambda1.round(); - - SimpleBigDecimal eta0 = lambda0.subtract(f0); - SimpleBigDecimal eta1 = lambda1.subtract(f1); - - // eta = 2*eta0 + mu*eta1 - SimpleBigDecimal eta = eta0.add(eta0); - if (mu == 1) - { - eta = eta.add(eta1); - } - else - { - // mu == -1 - eta = eta.subtract(eta1); - } - - // check1 = eta0 - 3*mu*eta1 - // check2 = eta0 + 4*mu*eta1 - SimpleBigDecimal threeEta1 = eta1.add(eta1).add(eta1); - SimpleBigDecimal fourEta1 = threeEta1.add(eta1); - SimpleBigDecimal check1; - SimpleBigDecimal check2; - if (mu == 1) - { - check1 = eta0.subtract(threeEta1); - check2 = eta0.add(fourEta1); - } - else - { - // mu == -1 - check1 = eta0.add(threeEta1); - check2 = eta0.subtract(fourEta1); - } - - byte h0 = 0; - byte h1 = 0; - - // if eta >= 1 - if (eta.compareTo(ECConstants.ONE) >= 0) - { - if (check1.compareTo(MINUS_ONE) < 0) - { - h1 = mu; - } - else - { - h0 = 1; - } - } - else - { - // eta < 1 - if (check2.compareTo(ECConstants.TWO) >= 0) - { - h1 = mu; - } - } - - // if eta < -1 - if (eta.compareTo(MINUS_ONE) < 0) - { - if (check1.compareTo(ECConstants.ONE) >= 0) - { - h1 = (byte)-mu; - } - else - { - h0 = -1; - } - } - else - { - // eta >= -1 - if (check2.compareTo(MINUS_TWO) < 0) - { - h1 = (byte)-mu; - } - } - - BigInteger q0 = f0.add(BigInteger.valueOf(h0)); - BigInteger q1 = f1.add(BigInteger.valueOf(h1)); - return new ZTauElement(q0, q1); - } - - /** - * Approximate division by n. For an integer - * k, the value λ = s k / n is - * computed to c bits of accuracy. - * @param k The parameter k. - * @param s The curve parameter s0 or - * s1. - * @param vm The Lucas Sequence element Vm. - * @param a The parameter a of the elliptic curve. - * @param m The bit length of the finite field - * Fm. - * @param c The number of bits of accuracy, i.e. the scale of the returned - * SimpleBigDecimal. - * @return The value λ = s k / n computed to - * c bits of accuracy. - */ - public static SimpleBigDecimal approximateDivisionByN(BigInteger k, - BigInteger s, BigInteger vm, byte a, int m, int c) - { - int _k = (m + 5)/2 + c; - BigInteger ns = k.shiftRight(m - _k - 2 + a); - - BigInteger gs = s.multiply(ns); - - BigInteger hs = gs.shiftRight(m); - - BigInteger js = vm.multiply(hs); - - BigInteger gsPlusJs = gs.add(js); - BigInteger ls = gsPlusJs.shiftRight(_k-c); - if (gsPlusJs.testBit(_k-c-1)) - { - // round up - ls = ls.add(ECConstants.ONE); - } - - return new SimpleBigDecimal(ls, c); - } - - /** - * Computes the τ-adic NAF (non-adjacent form) of an - * element λ of Z[τ]. - * @param mu The parameter μ of the elliptic curve. - * @param lambda The element λ of - * Z[τ]. - * @return The τ-adic NAF of λ. - */ - public static byte[] tauAdicNaf(byte mu, ZTauElement lambda) - { - if (!((mu == 1) || (mu == -1))) - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - BigInteger norm = norm(mu, lambda); - - // Ceiling of log2 of the norm - int log2Norm = norm.bitLength(); - - // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52 - int maxLength = log2Norm > 30 ? log2Norm + 4 : 34; - - // The array holding the TNAF - byte[] u = new byte[maxLength]; - int i = 0; - - // The actual length of the TNAF - int length = 0; - - BigInteger r0 = lambda.u; - BigInteger r1 = lambda.v; - - while(!((r0.equals(ECConstants.ZERO)) && (r1.equals(ECConstants.ZERO)))) - { - // If r0 is odd - if (r0.testBit(0)) - { - u[i] = (byte) ECConstants.TWO.subtract((r0.subtract(r1.shiftLeft(1))).mod(ECConstants.FOUR)).intValue(); - - // r0 = r0 - u[i] - if (u[i] == 1) - { - r0 = r0.clearBit(0); - } - else - { - // u[i] == -1 - r0 = r0.add(ECConstants.ONE); - } - length = i; - } - else - { - u[i] = 0; - } - - BigInteger t = r0; - BigInteger s = r0.shiftRight(1); - if (mu == 1) - { - r0 = r1.add(s); - } - else - { - // mu == -1 - r0 = r1.subtract(s); - } - - r1 = t.shiftRight(1).negate(); - i++; - } - - length++; - - // Reduce the TNAF array to its actual length - byte[] tnaf = new byte[length]; - System.arraycopy(u, 0, tnaf, 0, length); - return tnaf; - } - - /** - * Applies the operation τ() to an - * ECPoint.F2m. - * @param p The ECPoint.F2m to which τ() is applied. - * @return τ(p) - */ - public static ECPoint.F2m tau(ECPoint.F2m p) - { - if (p.isInfinity()) - { - return p; - } - - ECFieldElement x = p.getX(); - ECFieldElement y = p.getY(); - - return new ECPoint.F2m(p.getCurve(), x.square(), y.square(), p.isCompressed()); - } - - /** - * Returns the parameter μ of the elliptic curve. - * @param curve The elliptic curve from which to obtain μ. - * The curve must be a Koblitz curve, i.e. a equals - * 0 or 1 and b equals - * 1. - * @return μ of the elliptic curve. - * @throws IllegalArgumentException if the given ECCurve is not a Koblitz - * curve. - */ - public static byte getMu(ECCurve.F2m curve) - { - BigInteger a = curve.getA().toBigInteger(); - byte mu; - - if (a.equals(ECConstants.ZERO)) - { - mu = -1; - } - else if (a.equals(ECConstants.ONE)) - { - mu = 1; - } - else - { - throw new IllegalArgumentException("No Koblitz curve (ABC), " + - "TNAF multiplication not possible"); - } - return mu; - } - - /** - * Calculates the Lucas Sequence elements Uk-1 and - * Uk or Vk-1 and - * Vk. - * @param mu The parameter μ of the elliptic curve. - * @param k The index of the second element of the Lucas Sequence to be - * returned. - * @param doV If set to true, computes Vk-1 and - * Vk, otherwise Uk-1 and - * Uk. - * @return An array with 2 elements, containing Uk-1 - * and Uk or Vk-1 - * and Vk. - */ - public static BigInteger[] getLucas(byte mu, int k, boolean doV) - { - if (!((mu == 1) || (mu == -1))) - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - BigInteger u0; - BigInteger u1; - BigInteger u2; - - if (doV) - { - u0 = ECConstants.TWO; - u1 = BigInteger.valueOf(mu); - } - else - { - u0 = ECConstants.ZERO; - u1 = ECConstants.ONE; - } - - for (int i = 1; i < k; i++) - { - // u2 = mu*u1 - 2*u0; - BigInteger s = null; - if (mu == 1) - { - s = u1; - } - else - { - // mu == -1 - s = u1.negate(); - } - - u2 = s.subtract(u0.shiftLeft(1)); - u0 = u1; - u1 = u2; -// System.out.println(i + ": " + u2); -// System.out.println(); - } - - BigInteger[] retVal = {u0, u1}; - return retVal; - } - - /** - * Computes the auxiliary value tw. If the width is - * 4, then for mu = 1, tw = 6 and for - * mu = -1, tw = 10 - * @param mu The parameter μ of the elliptic curve. - * @param w The window width of the WTNAF. - * @return the auxiliary value tw - */ - public static BigInteger getTw(byte mu, int w) - { - if (w == 4) - { - if (mu == 1) - { - return BigInteger.valueOf(6); - } - else - { - // mu == -1 - return BigInteger.valueOf(10); - } - } - else - { - // For w <> 4, the values must be computed - BigInteger[] us = getLucas(mu, w, false); - BigInteger twoToW = ECConstants.ZERO.setBit(w); - BigInteger u1invert = us[1].modInverse(twoToW); - BigInteger tw; - tw = ECConstants.TWO.multiply(us[0]).multiply(u1invert).mod(twoToW); -// System.out.println("mu = " + mu); -// System.out.println("tw = " + tw); - return tw; - } - } - - /** - * Computes the auxiliary values s0 and - * s1 used for partial modular reduction. - * @param curve The elliptic curve for which to compute - * s0 and s1. - * @throws IllegalArgumentException if curve is not a - * Koblitz curve (Anomalous Binary Curve, ABC). - */ - public static BigInteger[] getSi(ECCurve.F2m curve) - { - if (!curve.isKoblitz()) - { - throw new IllegalArgumentException("si is defined for Koblitz curves only"); - } - - int m = curve.getM(); - int a = curve.getA().toBigInteger().intValue(); - byte mu = curve.getMu(); - int h = curve.getH().intValue(); - int index = m + 3 - a; - BigInteger[] ui = getLucas(mu, index, false); - - BigInteger dividend0; - BigInteger dividend1; - if (mu == 1) - { - dividend0 = ECConstants.ONE.subtract(ui[1]); - dividend1 = ECConstants.ONE.subtract(ui[0]); - } - else if (mu == -1) - { - dividend0 = ECConstants.ONE.add(ui[1]); - dividend1 = ECConstants.ONE.add(ui[0]); - } - else - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - BigInteger[] si = new BigInteger[2]; - - if (h == 2) - { - si[0] = dividend0.shiftRight(1); - si[1] = dividend1.shiftRight(1).negate(); - } - else if (h == 4) - { - si[0] = dividend0.shiftRight(2); - si[1] = dividend1.shiftRight(2).negate(); - } - else - { - throw new IllegalArgumentException("h (Cofactor) must be 2 or 4"); - } - - return si; - } - - /** - * Partial modular reduction modulo - * m - 1)/(τ - 1). - * @param k The integer to be reduced. - * @param m The bitlength of the underlying finite field. - * @param a The parameter a of the elliptic curve. - * @param s The auxiliary values s0 and - * s1. - * @param mu The parameter μ of the elliptic curve. - * @param c The precision (number of bits of accuracy) of the partial - * modular reduction. - * @return ρ := k partmod (τm - 1)/(τ - 1) - */ - public static ZTauElement partModReduction(BigInteger k, int m, byte a, - BigInteger[] s, byte mu, byte c) - { - // d0 = s[0] + mu*s[1]; mu is either 1 or -1 - BigInteger d0; - if (mu == 1) - { - d0 = s[0].add(s[1]); - } - else - { - d0 = s[0].subtract(s[1]); - } - - BigInteger[] v = getLucas(mu, m, true); - BigInteger vm = v[1]; - - SimpleBigDecimal lambda0 = approximateDivisionByN( - k, s[0], vm, a, m, c); - - SimpleBigDecimal lambda1 = approximateDivisionByN( - k, s[1], vm, a, m, c); - - ZTauElement q = round(lambda0, lambda1, mu); - - // r0 = n - d0*q0 - 2*s1*q1 - BigInteger r0 = k.subtract(d0.multiply(q.u)).subtract( - BigInteger.valueOf(2).multiply(s[1]).multiply(q.v)); - - // r1 = s1*q0 - s0*q1 - BigInteger r1 = s[1].multiply(q.u).subtract(s[0].multiply(q.v)); - - return new ZTauElement(r0, r1); - } - - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by a BigInteger using the reduced τ-adic - * NAF (RTNAF) method. - * @param p The ECPoint.F2m to multiply. - * @param k The BigInteger by which to multiply p. - * @return k * p - */ - public static ECPoint.F2m multiplyRTnaf(ECPoint.F2m p, BigInteger k) - { - ECCurve.F2m curve = (ECCurve.F2m) p.getCurve(); - int m = curve.getM(); - byte a = (byte) curve.getA().toBigInteger().intValue(); - byte mu = curve.getMu(); - BigInteger[] s = curve.getSi(); - ZTauElement rho = partModReduction(k, m, a, s, mu, (byte)10); - - return multiplyTnaf(p, rho); - } - - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by an element λ of Z[τ] - * using the τ-adic NAF (TNAF) method. - * @param p The ECPoint.F2m to multiply. - * @param lambda The element λ of - * Z[τ]. - * @return λ * p - */ - public static ECPoint.F2m multiplyTnaf(ECPoint.F2m p, ZTauElement lambda) - { - ECCurve.F2m curve = (ECCurve.F2m)p.getCurve(); - byte mu = curve.getMu(); - byte[] u = tauAdicNaf(mu, lambda); - - ECPoint.F2m q = multiplyFromTnaf(p, u); - - return q; - } - - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by an element λ of Z[τ] - * using the τ-adic NAF (TNAF) method, given the TNAF - * of λ. - * @param p The ECPoint.F2m to multiply. - * @param u The the TNAF of λ.. - * @return λ * p - */ - public static ECPoint.F2m multiplyFromTnaf(ECPoint.F2m p, byte[] u) - { - ECCurve.F2m curve = (ECCurve.F2m)p.getCurve(); - ECPoint.F2m q = (ECPoint.F2m) curve.getInfinity(); - for (int i = u.length - 1; i >= 0; i--) - { - q = tau(q); - if (u[i] == 1) - { - q = (ECPoint.F2m)q.addSimple(p); - } - else if (u[i] == -1) - { - q = (ECPoint.F2m)q.subtractSimple(p); - } - } - return q; - } - - /** - * Computes the [τ]-adic window NAF of an element - * λ of Z[τ]. - * @param mu The parameter μ of the elliptic curve. - * @param lambda The element λ of - * Z[τ] of which to compute the - * [τ]-adic NAF. - * @param width The window width of the resulting WNAF. - * @param pow2w 2width. - * @param tw The auxiliary value tw. - * @param alpha The αu's for the window width. - * @return The [τ]-adic window NAF of - * λ. - */ - public static byte[] tauAdicWNaf(byte mu, ZTauElement lambda, - byte width, BigInteger pow2w, BigInteger tw, ZTauElement[] alpha) - { - if (!((mu == 1) || (mu == -1))) - { - throw new IllegalArgumentException("mu must be 1 or -1"); - } - - BigInteger norm = norm(mu, lambda); - - // Ceiling of log2 of the norm - int log2Norm = norm.bitLength(); - - // If length(TNAF) > 30, then length(TNAF) < log2Norm + 3.52 - int maxLength = log2Norm > 30 ? log2Norm + 4 + width : 34 + width; - - // The array holding the TNAF - byte[] u = new byte[maxLength]; - - // 2^(width - 1) - BigInteger pow2wMin1 = pow2w.shiftRight(1); - - // Split lambda into two BigIntegers to simplify calculations - BigInteger r0 = lambda.u; - BigInteger r1 = lambda.v; - int i = 0; - - // while lambda <> (0, 0) - while (!((r0.equals(ECConstants.ZERO))&&(r1.equals(ECConstants.ZERO)))) - { - // if r0 is odd - if (r0.testBit(0)) - { - // uUnMod = r0 + r1*tw mod 2^width - BigInteger uUnMod - = r0.add(r1.multiply(tw)).mod(pow2w); - - byte uLocal; - // if uUnMod >= 2^(width - 1) - if (uUnMod.compareTo(pow2wMin1) >= 0) - { - uLocal = (byte) uUnMod.subtract(pow2w).intValue(); - } - else - { - uLocal = (byte) uUnMod.intValue(); - } - // uLocal is now in [-2^(width-1), 2^(width-1)-1] - - u[i] = uLocal; - boolean s = true; - if (uLocal < 0) - { - s = false; - uLocal = (byte)-uLocal; - } - // uLocal is now >= 0 - - if (s) - { - r0 = r0.subtract(alpha[uLocal].u); - r1 = r1.subtract(alpha[uLocal].v); - } - else - { - r0 = r0.add(alpha[uLocal].u); - r1 = r1.add(alpha[uLocal].v); - } - } - else - { - u[i] = 0; - } - - BigInteger t = r0; - - if (mu == 1) - { - r0 = r1.add(r0.shiftRight(1)); - } - else - { - // mu == -1 - r0 = r1.subtract(r0.shiftRight(1)); - } - r1 = t.shiftRight(1).negate(); - i++; - } - return u; - } - - /** - * Does the precomputation for WTNAF multiplication. - * @param p The ECPoint for which to do the precomputation. - * @param a The parameter a of the elliptic curve. - * @return The precomputation array for p. - */ - public static ECPoint.F2m[] getPreComp(ECPoint.F2m p, byte a) - { - ECPoint.F2m[] pu; - pu = new ECPoint.F2m[16]; - pu[1] = p; - byte[][] alphaTnaf; - if (a == 0) - { - alphaTnaf = Tnaf.alpha0Tnaf; - } - else - { - // a == 1 - alphaTnaf = Tnaf.alpha1Tnaf; - } - - int precompLen = alphaTnaf.length; - for (int i = 3; i < precompLen; i = i + 2) - { - pu[i] = Tnaf.multiplyFromTnaf(p, alphaTnaf[i]); - } - - return pu; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafMultiplier.java deleted file mode 100644 index 6d43abd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafMultiplier.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class implementing the WNAF (Window Non-Adjacent Form) multiplication - * algorithm. - */ -class WNafMultiplier implements ECMultiplier -{ - /** - * Computes the Window NAF (non-adjacent Form) of an integer. - * @param width The width w of the Window NAF. The width is - * defined as the minimal number w, such that for any - * w consecutive digits in the resulting representation, at - * most one is non-zero. - * @param k The integer of which the Window NAF is computed. - * @return The Window NAF of the given width, such that the following holds: - * k = ∑i=0l-1 ki2i - * , where the ki denote the elements of the - * returned byte[]. - */ - public byte[] windowNaf(byte width, BigInteger k) - { - // The window NAF is at most 1 element longer than the binary - // representation of the integer k. byte can be used instead of short or - // int unless the window width is larger than 8. For larger width use - // short or int. However, a width of more than 8 is not efficient for - // m = log2(q) smaller than 2305 Bits. Note: Values for m larger than - // 1000 Bits are currently not used in practice. - byte[] wnaf = new byte[k.bitLength() + 1]; - - // 2^width as short and BigInteger - short pow2wB = (short)(1 << width); - BigInteger pow2wBI = BigInteger.valueOf(pow2wB); - - int i = 0; - - // The actual length of the WNAF - int length = 0; - - // while k >= 1 - while (k.signum() > 0) - { - // if k is odd - if (k.testBit(0)) - { - // k mod 2^width - BigInteger remainder = k.mod(pow2wBI); - - // if remainder > 2^(width - 1) - 1 - if (remainder.testBit(width - 1)) - { - wnaf[i] = (byte)(remainder.intValue() - pow2wB); - } - else - { - wnaf[i] = (byte)remainder.intValue(); - } - // wnaf[i] is now in [-2^(width-1), 2^(width-1)-1] - - k = k.subtract(BigInteger.valueOf(wnaf[i])); - length = i; - } - else - { - wnaf[i] = 0; - } - - // k = k/2 - k = k.shiftRight(1); - i++; - } - - length++; - - // Reduce the WNAF array to its actual length - byte[] wnafShort = new byte[length]; - System.arraycopy(wnaf, 0, wnafShort, 0, length); - return wnafShort; - } - - /** - * Multiplies this by an integer k using the - * Window NAF method. - * @param k The integer by which this is multiplied. - * @return A new ECPoint which equals this - * multiplied by k. - */ - public ECPoint multiply(ECPoint p, BigInteger k, PreCompInfo preCompInfo) - { - WNafPreCompInfo wnafPreCompInfo; - - if ((preCompInfo != null) && (preCompInfo instanceof WNafPreCompInfo)) - { - wnafPreCompInfo = (WNafPreCompInfo)preCompInfo; - } - else - { - // Ignore empty PreCompInfo or PreCompInfo of incorrect type - wnafPreCompInfo = new WNafPreCompInfo(); - } - - // floor(log2(k)) - int m = k.bitLength(); - - // width of the Window NAF - byte width; - - // Required length of precomputation array - int reqPreCompLen; - - // Determine optimal width and corresponding length of precomputation - // array based on literature values - if (m < 13) - { - width = 2; - reqPreCompLen = 1; - } - else - { - if (m < 41) - { - width = 3; - reqPreCompLen = 2; - } - else - { - if (m < 121) - { - width = 4; - reqPreCompLen = 4; - } - else - { - if (m < 337) - { - width = 5; - reqPreCompLen = 8; - } - else - { - if (m < 897) - { - width = 6; - reqPreCompLen = 16; - } - else - { - if (m < 2305) - { - width = 7; - reqPreCompLen = 32; - } - else - { - width = 8; - reqPreCompLen = 127; - } - } - } - } - } - } - - // The length of the precomputation array - int preCompLen = 1; - - ECPoint[] preComp = wnafPreCompInfo.getPreComp(); - ECPoint twiceP = wnafPreCompInfo.getTwiceP(); - - // Check if the precomputed ECPoints already exist - if (preComp == null) - { - // Precomputation must be performed from scratch, create an empty - // precomputation array of desired length - preComp = new ECPoint[]{ p }; - } - else - { - // Take the already precomputed ECPoints to start with - preCompLen = preComp.length; - } - - if (twiceP == null) - { - // Compute twice(p) - twiceP = p.twice(); - } - - if (preCompLen < reqPreCompLen) - { - // Precomputation array must be made bigger, copy existing preComp - // array into the larger new preComp array - ECPoint[] oldPreComp = preComp; - preComp = new ECPoint[reqPreCompLen]; - System.arraycopy(oldPreComp, 0, preComp, 0, preCompLen); - - for (int i = preCompLen; i < reqPreCompLen; i++) - { - // Compute the new ECPoints for the precomputation array. - // The values 1, 3, 5, ..., 2^(width-1)-1 times p are - // computed - preComp[i] = twiceP.add(preComp[i - 1]); - } - } - - // Compute the Window NAF of the desired width - byte[] wnaf = windowNaf(width, k); - int l = wnaf.length; - - // Apply the Window NAF to p using the precomputed ECPoint values. - ECPoint q = p.getCurve().getInfinity(); - for (int i = l - 1; i >= 0; i--) - { - q = q.twice(); - - if (wnaf[i] != 0) - { - if (wnaf[i] > 0) - { - q = q.add(preComp[(wnaf[i] - 1)/2]); - } - else - { - // wnaf[i] < 0 - q = q.subtract(preComp[(-wnaf[i] - 1)/2]); - } - } - } - - // Set PreCompInfo in ECPoint, such that it is available for next - // multiplication. - wnafPreCompInfo.setPreComp(preComp); - wnafPreCompInfo.setTwiceP(twiceP); - p.setPreCompInfo(wnafPreCompInfo); - return q; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafPreCompInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafPreCompInfo.java deleted file mode 100644 index c969bcf..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WNafPreCompInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.bc.math.ec; - -/** - * Class holding precomputation data for the WNAF (Window Non-Adjacent Form) - * algorithm. - */ -class WNafPreCompInfo implements PreCompInfo -{ - /** - * Array holding the precomputed ECPoints used for the Window - * NAF multiplication in - * {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply() - * WNafMultiplier.multiply()}. - */ - private ECPoint[] preComp = null; - - /** - * Holds an ECPoint representing twice(this). Used for the - * Window NAF multiplication in - * {@link org.bouncycastle.math.ec.multiplier.WNafMultiplier.multiply() - * WNafMultiplier.multiply()}. - */ - private ECPoint twiceP = null; - - protected ECPoint[] getPreComp() - { - return preComp; - } - - protected void setPreComp(ECPoint[] preComp) - { - this.preComp = preComp; - } - - protected ECPoint getTwiceP() - { - return twiceP; - } - - protected void setTwiceP(ECPoint twiceThis) - { - this.twiceP = twiceThis; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafMultiplier.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafMultiplier.java deleted file mode 100644 index 6ef0052..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafMultiplier.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class implementing the WTNAF (Window - * τ-adic Non-Adjacent Form) algorithm. - */ -class WTauNafMultiplier implements ECMultiplier -{ - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by k using the reduced τ-adic NAF (RTNAF) - * method. - * @param p The ECPoint.F2m to multiply. - * @param k The integer by which to multiply k. - * @return p multiplied by k. - */ - public ECPoint multiply(ECPoint point, BigInteger k, PreCompInfo preCompInfo) - { - if (!(point instanceof ECPoint.F2m)) - { - throw new IllegalArgumentException("Only ECPoint.F2m can be " + - "used in WTauNafMultiplier"); - } - - ECPoint.F2m p = (ECPoint.F2m)point; - - ECCurve.F2m curve = (ECCurve.F2m) p.getCurve(); - int m = curve.getM(); - byte a = curve.getA().toBigInteger().byteValue(); - byte mu = curve.getMu(); - BigInteger[] s = curve.getSi(); - - ZTauElement rho = Tnaf.partModReduction(k, m, a, s, mu, (byte)10); - - return multiplyWTnaf(p, rho, preCompInfo, a, mu); - } - - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by an element λ of Z[τ] using - * the τ-adic NAF (TNAF) method. - * @param p The ECPoint.F2m to multiply. - * @param lambda The element λ of - * Z[τ] of which to compute the - * [τ]-adic NAF. - * @return p multiplied by λ. - */ - private ECPoint.F2m multiplyWTnaf(ECPoint.F2m p, ZTauElement lambda, - PreCompInfo preCompInfo, byte a, byte mu) - { - ZTauElement[] alpha; - if (a == 0) - { - alpha = Tnaf.alpha0; - } - else - { - // a == 1 - alpha = Tnaf.alpha1; - } - - BigInteger tw = Tnaf.getTw(mu, Tnaf.WIDTH); - - byte[]u = Tnaf.tauAdicWNaf(mu, lambda, Tnaf.WIDTH, - BigInteger.valueOf(Tnaf.POW_2_WIDTH), tw, alpha); - - return multiplyFromWTnaf(p, u, preCompInfo); - } - - /** - * Multiplies a {@link org.bc.math.ec.ECPoint.F2m ECPoint.F2m} - * by an element λ of Z[τ] - * using the window τ-adic NAF (TNAF) method, given the - * WTNAF of λ. - * @param p The ECPoint.F2m to multiply. - * @param u The the WTNAF of λ.. - * @return λ * p - */ - private static ECPoint.F2m multiplyFromWTnaf(ECPoint.F2m p, byte[] u, - PreCompInfo preCompInfo) - { - ECCurve.F2m curve = (ECCurve.F2m)p.getCurve(); - byte a = curve.getA().toBigInteger().byteValue(); - - ECPoint.F2m[] pu; - if ((preCompInfo == null) || !(preCompInfo instanceof WTauNafPreCompInfo)) - { - pu = Tnaf.getPreComp(p, a); - p.setPreCompInfo(new WTauNafPreCompInfo(pu)); - } - else - { - pu = ((WTauNafPreCompInfo)preCompInfo).getPreComp(); - } - - // q = infinity - ECPoint.F2m q = (ECPoint.F2m) p.getCurve().getInfinity(); - for (int i = u.length - 1; i >= 0; i--) - { - q = Tnaf.tau(q); - if (u[i] != 0) - { - if (u[i] > 0) - { - q = q.addSimple(pu[u[i]]); - } - else - { - // u[i] < 0 - q = q.subtractSimple(pu[-u[i]]); - } - } - } - - return q; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafPreCompInfo.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafPreCompInfo.java deleted file mode 100644 index 19b8657..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/WTauNafPreCompInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.bc.math.ec; - -/** - * Class holding precomputation data for the WTNAF (Window - * τ-adic Non-Adjacent Form) algorithm. - */ -class WTauNafPreCompInfo implements PreCompInfo -{ - /** - * Array holding the precomputed ECPoint.F2ms used for the - * WTNAF multiplication in - * {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() - * WTauNafMultiplier.multiply()}. - */ - private ECPoint.F2m[] preComp = null; - - /** - * Constructor for WTauNafPreCompInfo - * @param preComp Array holding the precomputed ECPoint.F2ms - * used for the WTNAF multiplication in - * {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() - * WTauNafMultiplier.multiply()}. - */ - WTauNafPreCompInfo(ECPoint.F2m[] preComp) - { - this.preComp = preComp; - } - - /** - * @return the array holding the precomputed ECPoint.F2ms - * used for the WTNAF multiplication in - * {@link org.bouncycastle.math.ec.multiplier.WTauNafMultiplier.multiply() - * WTauNafMultiplier.multiply()}. - */ - protected ECPoint.F2m[] getPreComp() - { - return preComp; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ZTauElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ZTauElement.java deleted file mode 100644 index 9c13384..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ec/ZTauElement.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.bc.math.ec; - -import java.math.BigInteger; - -/** - * Class representing an element of Z[τ]. Let - * λ be an element of Z[τ]. Then - * λ is given as λ = u + vτ. The - * components u and v may be used directly, there - * are no accessor methods. - * Immutable class. - */ -class ZTauElement -{ - /** - * The "real" part of λ. - */ - public final BigInteger u; - - /** - * The "τ-adic" part of λ. - */ - public final BigInteger v; - - /** - * Constructor for an element λ of - * Z[τ]. - * @param u The "real" part of λ. - * @param v The "τ-adic" part of - * λ. - */ - public ZTauElement(BigInteger u, BigInteger v) - { - this.u = u; - this.v = v; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/BigIntEuclidean.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/BigIntEuclidean.java deleted file mode 100644 index 5938fb8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/BigIntEuclidean.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.bc.math.ntru.euclid; - -import java.math.BigInteger; - -/** - * Extended Euclidean Algorithm in BigIntegers - */ -public class BigIntEuclidean -{ - public BigInteger x, y, gcd; - - private BigIntEuclidean() - { - } - - /** - * Runs the EEA on two BigIntegers
    - * Implemented from pseudocode on Wikipedia. - * - * @param a - * @param b - * @return a BigIntEuclidean object that contains the result in the variables x, y, and gcd - */ - public static BigIntEuclidean calculate(BigInteger a, BigInteger b) - { - BigInteger x = BigInteger.ZERO; - BigInteger lastx = BigInteger.ONE; - BigInteger y = BigInteger.ONE; - BigInteger lasty = BigInteger.ZERO; - while (!b.equals(BigInteger.ZERO)) - { - BigInteger[] quotientAndRemainder = a.divideAndRemainder(b); - BigInteger quotient = quotientAndRemainder[0]; - - BigInteger temp = a; - a = b; - b = quotientAndRemainder[1]; - - temp = x; - x = lastx.subtract(quotient.multiply(x)); - lastx = temp; - - temp = y; - y = lasty.subtract(quotient.multiply(y)); - lasty = temp; - } - - BigIntEuclidean result = new BigIntEuclidean(); - result.x = lastx; - result.y = lasty; - result.gcd = a; - return result; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/IntEuclidean.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/IntEuclidean.java deleted file mode 100644 index d1a8a0e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/euclid/IntEuclidean.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.math.ntru.euclid; - -/** - * Extended Euclidean Algorithm in ints - */ -public class IntEuclidean -{ - public int x, y, gcd; - - private IntEuclidean() - { - } - - /** - * Runs the EEA on two ints
    - * Implemented from pseudocode on Wikipedia. - * - * @param a - * @param b - * @return a IntEuclidean object that contains the result in the variables x, y, and gcd - */ - public static IntEuclidean calculate(int a, int b) - { - int x = 0; - int lastx = 1; - int y = 1; - int lasty = 0; - while (b != 0) - { - int quotient = a / b; - - int temp = a; - a = b; - b = temp % b; - - temp = x; - x = lastx - quotient * x; - lastx = temp; - - temp = y; - y = lasty - quotient * y; - lasty = temp; - } - - IntEuclidean result = new IntEuclidean(); - result.x = lastx; - result.y = lasty; - result.gcd = a; - return result; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigDecimalPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigDecimalPolynomial.java deleted file mode 100644 index 3d3d0c9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigDecimalPolynomial.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.math.BigDecimal; - -/** - * A polynomial with {@link BigDecimal} coefficients. - * Some methods (like add) change the polynomial, others (like mult) do - * not but return the result as a new polynomial. - */ -public class BigDecimalPolynomial -{ - private static final BigDecimal ZERO = new BigDecimal("0"); - private static final BigDecimal ONE_HALF = new BigDecimal("0.5"); - - BigDecimal[] coeffs; - - /** - * Constructs a new polynomial with N coefficients initialized to 0. - * - * @param N the number of coefficients - */ - BigDecimalPolynomial(int N) - { - coeffs = new BigDecimal[N]; - for (int i = 0; i < N; i++) - { - coeffs[i] = ZERO; - } - } - - /** - * Constructs a new polynomial with a given set of coefficients. - * - * @param coeffs the coefficients - */ - BigDecimalPolynomial(BigDecimal[] coeffs) - { - this.coeffs = coeffs; - } - - /** - * Constructs a BigDecimalPolynomial from a BigIntPolynomial. The two polynomials are independent of each other. - * - * @param p the original polynomial - */ - public BigDecimalPolynomial(BigIntPolynomial p) - { - int N = p.coeffs.length; - coeffs = new BigDecimal[N]; - for (int i = 0; i < N; i++) - { - coeffs[i] = new BigDecimal(p.coeffs[i]); - } - } - - /** - * Divides all coefficients by 2. - */ - public void halve() - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = coeffs[i].multiply(ONE_HALF); - } - } - - /** - * Multiplies the polynomial by another. Does not change this polynomial - * but returns the result as a new polynomial. - * - * @param poly2 the polynomial to multiply by - * @return a new polynomial - */ - public BigDecimalPolynomial mult(BigIntPolynomial poly2) - { - return mult(new BigDecimalPolynomial(poly2)); - } - - /** - * Multiplies the polynomial by another, taking the indices mod N. Does not - * change this polynomial but returns the result as a new polynomial. - * - * @param poly2 the polynomial to multiply by - * @return a new polynomial - */ - public BigDecimalPolynomial mult(BigDecimalPolynomial poly2) - { - int N = coeffs.length; - if (poly2.coeffs.length != N) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - BigDecimalPolynomial c = multRecursive(poly2); - - if (c.coeffs.length > N) - { - for (int k = N; k < c.coeffs.length; k++) - { - c.coeffs[k - N] = c.coeffs[k - N].add(c.coeffs[k]); - } - c.coeffs = copyOf(c.coeffs, N); - } - return c; - } - - /** - * Karazuba multiplication - */ - private BigDecimalPolynomial multRecursive(BigDecimalPolynomial poly2) - { - BigDecimal[] a = coeffs; - BigDecimal[] b = poly2.coeffs; - - int n = poly2.coeffs.length; - if (n <= 1) - { - BigDecimal[] c = coeffs.clone(); - for (int i = 0; i < coeffs.length; i++) - { - c[i] = c[i].multiply(poly2.coeffs[0]); - } - return new BigDecimalPolynomial(c); - } - else - { - int n1 = n / 2; - - BigDecimalPolynomial a1 = new BigDecimalPolynomial(copyOf(a, n1)); - BigDecimalPolynomial a2 = new BigDecimalPolynomial(copyOfRange(a, n1, n)); - BigDecimalPolynomial b1 = new BigDecimalPolynomial(copyOf(b, n1)); - BigDecimalPolynomial b2 = new BigDecimalPolynomial(copyOfRange(b, n1, n)); - - BigDecimalPolynomial A = (BigDecimalPolynomial)a1.clone(); - A.add(a2); - BigDecimalPolynomial B = (BigDecimalPolynomial)b1.clone(); - B.add(b2); - - BigDecimalPolynomial c1 = a1.multRecursive(b1); - BigDecimalPolynomial c2 = a2.multRecursive(b2); - BigDecimalPolynomial c3 = A.multRecursive(B); - c3.sub(c1); - c3.sub(c2); - - BigDecimalPolynomial c = new BigDecimalPolynomial(2 * n - 1); - for (int i = 0; i < c1.coeffs.length; i++) - { - c.coeffs[i] = c1.coeffs[i]; - } - for (int i = 0; i < c3.coeffs.length; i++) - { - c.coeffs[n1 + i] = c.coeffs[n1 + i].add(c3.coeffs[i]); - } - for (int i = 0; i < c2.coeffs.length; i++) - { - c.coeffs[2 * n1 + i] = c.coeffs[2 * n1 + i].add(c2.coeffs[i]); - } - return c; - } - } - - /** - * Adds another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - public void add(BigDecimalPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - int N = coeffs.length; - coeffs = copyOf(coeffs, b.coeffs.length); - for (int i = N; i < coeffs.length; i++) - { - coeffs[i] = ZERO; - } - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = coeffs[i].add(b.coeffs[i]); - } - } - - /** - * Subtracts another polynomial which can have a different number of coefficients. - * - * @param b - */ - void sub(BigDecimalPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - int N = coeffs.length; - coeffs = copyOf(coeffs, b.coeffs.length); - for (int i = N; i < coeffs.length; i++) - { - coeffs[i] = ZERO; - } - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = coeffs[i].subtract(b.coeffs[i]); - } - } - - /** - * Rounds all coefficients to the nearest integer. - * - * @return a new polynomial with BigInteger coefficients - */ - public BigIntPolynomial round() - { - int N = coeffs.length; - BigIntPolynomial p = new BigIntPolynomial(N); - for (int i = 0; i < N; i++) - { - p.coeffs[i] = coeffs[i].setScale(0, BigDecimal.ROUND_HALF_EVEN).toBigInteger(); - } - return p; - } - - /** - * Makes a copy of the polynomial that is independent of the original. - */ - public Object clone() - { - return new BigDecimalPolynomial(coeffs.clone()); - } - - private BigDecimal[] copyOf(BigDecimal[] a, int length) - { - BigDecimal[] tmp = new BigDecimal[length]; - - System.arraycopy(a, 0, tmp, 0, a.length < length ? a.length : length); - - return tmp; - } - - private BigDecimal[] copyOfRange(BigDecimal[] a, int from, int to) - { - int newLength = to - from; - BigDecimal[] tmp = new BigDecimal[to - from]; - - System.arraycopy(a, from, tmp, 0, (a.length - from) < newLength ? (a.length - from) : newLength); - - return tmp; - } - - public BigDecimal[] getCoeffs() - { - BigDecimal[] tmp = new BigDecimal[coeffs.length]; - - System.arraycopy(coeffs, 0, tmp, 0, coeffs.length); - - return tmp; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigIntPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigIntPolynomial.java deleted file mode 100644 index 01bc896..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/BigIntPolynomial.java +++ /dev/null @@ -1,394 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.bc.util.Arrays; - -/** - * A polynomial with {@link BigInteger} coefficients.
    - * Some methods (like add) change the polynomial, others (like mult) do - * not but return the result as a new polynomial. - */ -public class BigIntPolynomial -{ - private final static double LOG_10_2 = Math.log10(2); - - BigInteger[] coeffs; - - /** - * Constructs a new polynomial with N coefficients initialized to 0. - * - * @param N the number of coefficients - */ - BigIntPolynomial(int N) - { - coeffs = new BigInteger[N]; - for (int i = 0; i < N; i++) - { - coeffs[i] = Constants.BIGINT_ZERO; - } - } - - /** - * Constructs a new polynomial with a given set of coefficients. - * - * @param coeffs the coefficients - */ - BigIntPolynomial(BigInteger[] coeffs) - { - this.coeffs = coeffs; - } - - /** - * Constructs a BigIntPolynomial from a IntegerPolynomial. The two polynomials are - * independent of each other. - * - * @param p the original polynomial - */ - public BigIntPolynomial(IntegerPolynomial p) - { - coeffs = new BigInteger[p.coeffs.length]; - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = BigInteger.valueOf(p.coeffs[i]); - } - } - - /** - * Generates a random polynomial with numOnes coefficients equal to 1, - * numNegOnes coefficients equal to -1, and the rest equal to 0. - * - * @param N number of coefficients - * @param numOnes number of 1's - * @param numNegOnes number of -1's - * @return - */ - static BigIntPolynomial generateRandomSmall(int N, int numOnes, int numNegOnes) - { - List coeffs = new ArrayList(); - for (int i = 0; i < numOnes; i++) - { - coeffs.add(Constants.BIGINT_ONE); - } - for (int i = 0; i < numNegOnes; i++) - { - coeffs.add(BigInteger.valueOf(-1)); - } - while (coeffs.size() < N) - { - coeffs.add(Constants.BIGINT_ZERO); - } - Collections.shuffle(coeffs, new SecureRandom()); - - BigIntPolynomial poly = new BigIntPolynomial(N); - for (int i = 0; i < coeffs.size(); i++) - { - poly.coeffs[i] = (BigInteger)coeffs.get(i); - } - return poly; - } - - /** - * Multiplies the polynomial by another, taking the indices mod N. Does not - * change this polynomial but returns the result as a new polynomial.
    - * Both polynomials must have the same number of coefficients. - * - * @param poly2 the polynomial to multiply by - * @return a new polynomial - */ - public BigIntPolynomial mult(BigIntPolynomial poly2) - { - int N = coeffs.length; - if (poly2.coeffs.length != N) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - BigIntPolynomial c = multRecursive(poly2); - - if (c.coeffs.length > N) - { - for (int k = N; k < c.coeffs.length; k++) - { - c.coeffs[k - N] = c.coeffs[k - N].add(c.coeffs[k]); - } - c.coeffs = Arrays.copyOf(c.coeffs, N); - } - return c; - } - - /** - * Karazuba multiplication - */ - private BigIntPolynomial multRecursive(BigIntPolynomial poly2) - { - BigInteger[] a = coeffs; - BigInteger[] b = poly2.coeffs; - - int n = poly2.coeffs.length; - if (n <= 1) - { - BigInteger[] c = Arrays.clone(coeffs); - for (int i = 0; i < coeffs.length; i++) - { - c[i] = c[i].multiply(poly2.coeffs[0]); - } - return new BigIntPolynomial(c); - } - else - { - int n1 = n / 2; - - BigIntPolynomial a1 = new BigIntPolynomial(Arrays.copyOf(a, n1)); - BigIntPolynomial a2 = new BigIntPolynomial(Arrays.copyOfRange(a, n1, n)); - BigIntPolynomial b1 = new BigIntPolynomial(Arrays.copyOf(b, n1)); - BigIntPolynomial b2 = new BigIntPolynomial(Arrays.copyOfRange(b, n1, n)); - - BigIntPolynomial A = (BigIntPolynomial)a1.clone(); - A.add(a2); - BigIntPolynomial B = (BigIntPolynomial)b1.clone(); - B.add(b2); - - BigIntPolynomial c1 = a1.multRecursive(b1); - BigIntPolynomial c2 = a2.multRecursive(b2); - BigIntPolynomial c3 = A.multRecursive(B); - c3.sub(c1); - c3.sub(c2); - - BigIntPolynomial c = new BigIntPolynomial(2 * n - 1); - for (int i = 0; i < c1.coeffs.length; i++) - { - c.coeffs[i] = c1.coeffs[i]; - } - for (int i = 0; i < c3.coeffs.length; i++) - { - c.coeffs[n1 + i] = c.coeffs[n1 + i].add(c3.coeffs[i]); - } - for (int i = 0; i < c2.coeffs.length; i++) - { - c.coeffs[2 * n1 + i] = c.coeffs[2 * n1 + i].add(c2.coeffs[i]); - } - return c; - } - } - - /** - * Adds another polynomial which can have a different number of coefficients, - * and takes the coefficient values mod modulus. - * - * @param b another polynomial - */ - void add(BigIntPolynomial b, BigInteger modulus) - { - add(b); - mod(modulus); - } - - /** - * Adds another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - public void add(BigIntPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - int N = coeffs.length; - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - for (int i = N; i < coeffs.length; i++) - { - coeffs[i] = Constants.BIGINT_ZERO; - } - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = coeffs[i].add(b.coeffs[i]); - } - } - - /** - * Subtracts another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - public void sub(BigIntPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - int N = coeffs.length; - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - for (int i = N; i < coeffs.length; i++) - { - coeffs[i] = Constants.BIGINT_ZERO; - } - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = coeffs[i].subtract(b.coeffs[i]); - } - } - - /** - * Multiplies each coefficient by a BigInteger. Does not return a new polynomial but modifies this polynomial. - * - * @param factor - */ - public void mult(BigInteger factor) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = coeffs[i].multiply(factor); - } - } - - /** - * Multiplies each coefficient by a int. Does not return a new polynomial but modifies this polynomial. - * - * @param factor - */ - void mult(int factor) - { - mult(BigInteger.valueOf(factor)); - } - - /** - * Divides each coefficient by a BigInteger and rounds the result to the nearest whole number.
    - * Does not return a new polynomial but modifies this polynomial. - * - * @param divisor the number to divide by - */ - public void div(BigInteger divisor) - { - BigInteger d = divisor.add(Constants.BIGINT_ONE).divide(BigInteger.valueOf(2)); - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = coeffs[i].compareTo(Constants.BIGINT_ZERO) > 0 ? coeffs[i].add(d) : coeffs[i].add(d.negate()); - coeffs[i] = coeffs[i].divide(divisor); - } - } - - /** - * Divides each coefficient by a BigDecimal and rounds the result to decimalPlaces places. - * - * @param divisor the number to divide by - * @param decimalPlaces the number of fractional digits to round the result to - * @return a new BigDecimalPolynomial - */ - public BigDecimalPolynomial div(BigDecimal divisor, int decimalPlaces) - { - BigInteger max = maxCoeffAbs(); - int coeffLength = (int)(max.bitLength() * LOG_10_2) + 1; - // factor = 1/divisor - BigDecimal factor = Constants.BIGDEC_ONE.divide(divisor, coeffLength + decimalPlaces + 1, BigDecimal.ROUND_HALF_EVEN); - - // multiply each coefficient by factor - BigDecimalPolynomial p = new BigDecimalPolynomial(coeffs.length); - for (int i = 0; i < coeffs.length; i++) - // multiply, then truncate after decimalPlaces so subsequent operations aren't slowed down - { - p.coeffs[i] = new BigDecimal(coeffs[i]).multiply(factor).setScale(decimalPlaces, BigDecimal.ROUND_HALF_EVEN); - } - - return p; - } - - /** - * Returns the base10 length of the largest coefficient. - * - * @return length of the longest coefficient - */ - public int getMaxCoeffLength() - { - return (int)(maxCoeffAbs().bitLength() * LOG_10_2) + 1; - } - - private BigInteger maxCoeffAbs() - { - BigInteger max = coeffs[0].abs(); - for (int i = 1; i < coeffs.length; i++) - { - BigInteger coeff = coeffs[i].abs(); - if (coeff.compareTo(max) > 0) - { - max = coeff; - } - } - return max; - } - - /** - * Takes each coefficient modulo a number. - * - * @param modulus - */ - public void mod(BigInteger modulus) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = coeffs[i].mod(modulus); - } - } - - /** - * Returns the sum of all coefficients, i.e. evaluates the polynomial at 0. - * - * @return the sum of all coefficients - */ - BigInteger sumCoeffs() - { - BigInteger sum = Constants.BIGINT_ZERO; - for (int i = 0; i < coeffs.length; i++) - { - sum = sum.add(coeffs[i]); - } - return sum; - } - - /** - * Makes a copy of the polynomial that is independent of the original. - */ - public Object clone() - { - return new BigIntPolynomial(coeffs.clone()); - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(coeffs); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - BigIntPolynomial other = (BigIntPolynomial)obj; - if (!Arrays.areEqual(coeffs, other.coeffs)) - { - return false; - } - return true; - } - - public BigInteger[] getCoeffs() - { - return Arrays.clone(coeffs); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Constants.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Constants.java deleted file mode 100644 index 9f0010a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Constants.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.math.BigDecimal; -import java.math.BigInteger; - -public class Constants -{ - static final BigInteger BIGINT_ZERO = BigInteger.valueOf(0); - static final BigInteger BIGINT_ONE = BigInteger.valueOf(1); - - static final BigDecimal BIGDEC_ONE = BigDecimal.valueOf(1); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/DenseTernaryPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/DenseTernaryPolynomial.java deleted file mode 100644 index cfc4a22..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/DenseTernaryPolynomial.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.security.SecureRandom; - -import org.bc.math.ntru.util.Util; -import org.bc.util.Arrays; - -/** - * A TernaryPolynomial with a "high" number of nonzero coefficients. - */ -public class DenseTernaryPolynomial - extends IntegerPolynomial - implements TernaryPolynomial -{ - - /** - * Constructs a new DenseTernaryPolynomial with N coefficients. - * - * @param N the number of coefficients - */ - DenseTernaryPolynomial(int N) - { - super(N); - checkTernarity(); - } - - /** - * Constructs a DenseTernaryPolynomial from a IntegerPolynomial. The two polynomials are - * independent of each other. - * - * @param intPoly the original polynomial - */ - public DenseTernaryPolynomial(IntegerPolynomial intPoly) - { - this(intPoly.coeffs); - } - - /** - * Constructs a new DenseTernaryPolynomial with a given set of coefficients. - * - * @param coeffs the coefficients - */ - public DenseTernaryPolynomial(int[] coeffs) - { - super(coeffs); - checkTernarity(); - } - - private void checkTernarity() - { - for (int i = 0; i != coeffs.length; i++) - { - int c = coeffs[i]; - if (c < -1 || c > 1) - { - throw new IllegalStateException("Illegal value: " + c + ", must be one of {-1, 0, 1}"); - } - } - } - - /** - * Generates a random polynomial with numOnes coefficients equal to 1, - * numNegOnes coefficients equal to -1, and the rest equal to 0. - * - * @param N number of coefficients - * @param numOnes number of 1's - * @param numNegOnes number of -1's - */ - public static DenseTernaryPolynomial generateRandom(int N, int numOnes, int numNegOnes, SecureRandom random) - { - int[] coeffs = Util.generateRandomTernary(N, numOnes, numNegOnes, random); - return new DenseTernaryPolynomial(coeffs); - } - - /** - * Generates a polynomial with coefficients randomly selected from {-1, 0, 1}. - * - * @param N number of coefficients - */ - public static DenseTernaryPolynomial generateRandom(int N, SecureRandom random) - { - DenseTernaryPolynomial poly = new DenseTernaryPolynomial(N); - for (int i = 0; i < N; i++) - { - poly.coeffs[i] = random.nextInt(3) - 1; - } - return poly; - } - - public IntegerPolynomial mult(IntegerPolynomial poly2, int modulus) - { - // even on 32-bit systems, LongPolynomial5 multiplies faster than IntegerPolynomial - if (modulus == 2048) - { - IntegerPolynomial poly2Pos = (IntegerPolynomial)poly2.clone(); - poly2Pos.modPositive(2048); - LongPolynomial5 poly5 = new LongPolynomial5(poly2Pos); - return poly5.mult(this).toIntegerPolynomial(); - } - else - { - return super.mult(poly2, modulus); - } - } - - public int[] getOnes() - { - int N = coeffs.length; - int[] ones = new int[N]; - int onesIdx = 0; - for (int i = 0; i < N; i++) - { - int c = coeffs[i]; - if (c == 1) - { - ones[onesIdx++] = i; - } - } - return Arrays.copyOf(ones, onesIdx); - } - - public int[] getNegOnes() - { - int N = coeffs.length; - int[] negOnes = new int[N]; - int negOnesIdx = 0; - for (int i = 0; i < N; i++) - { - int c = coeffs[i]; - if (c == -1) - { - negOnes[negOnesIdx++] = i; - } - } - return Arrays.copyOf(negOnes, negOnesIdx); - } - - public int size() - { - return coeffs.length; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/IntegerPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/IntegerPolynomial.java deleted file mode 100644 index b76019d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/IntegerPolynomial.java +++ /dev/null @@ -1,1358 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.LinkedBlockingQueue; - -import org.bc.math.ntru.euclid.BigIntEuclidean; -import org.bc.math.ntru.util.ArrayEncoder; -import org.bc.math.ntru.util.Util; -import org.bc.util.Arrays; - -/** - * A polynomial with int coefficients.
    - * Some methods (like add) change the polynomial, others (like mult) do - * not but return the result as a new polynomial. - */ -public class IntegerPolynomial - implements Polynomial -{ - private static final int NUM_EQUAL_RESULTANTS = 3; - /** - * Prime numbers > 4500 for resultant computation. Starting them below ~4400 causes incorrect results occasionally. - * Fortunately, 4500 is about the optimum number for performance.
    - * This array contains enough prime numbers so primes never have to be computed on-line for any standard {@link org.bc.crypto.params.NTRUSigningParameters}. - */ - private static final int[] PRIMES = new int[]{ - 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, - 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, - 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, - 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, - 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, - 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, - 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, - 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, - 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, - 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, - 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, - 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, - 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, - 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, - 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, - 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, - 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, - 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, - 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, - 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, - 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, - 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, - 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, - 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, - 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, - 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, - 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, - 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, - 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, - 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, - 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, - 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, - 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, - 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, - 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, - 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, - 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, - 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, - 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, - 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, - 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, - 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, - 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, - 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, - 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, - 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, - 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, - 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, - 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, - 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, - 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, - 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, - 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, - 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, - 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, - 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, - 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973}; - private static final List BIGINT_PRIMES; - - static - { - BIGINT_PRIMES = new ArrayList(); - for (int i = 0; i != PRIMES.length; i++) - { - BIGINT_PRIMES.add(BigInteger.valueOf(PRIMES[i])); - } - } - - public int[] coeffs; - - /** - * Constructs a new polynomial with N coefficients initialized to 0. - * - * @param N the number of coefficients - */ - public IntegerPolynomial(int N) - { - coeffs = new int[N]; - } - - /** - * Constructs a new polynomial with a given set of coefficients. - * - * @param coeffs the coefficients - */ - public IntegerPolynomial(int[] coeffs) - { - this.coeffs = coeffs; - } - - /** - * Constructs a IntegerPolynomial from a BigIntPolynomial. The two polynomials are independent of each other. - * - * @param p the original polynomial - */ - public IntegerPolynomial(BigIntPolynomial p) - { - coeffs = new int[p.coeffs.length]; - for (int i = 0; i < p.coeffs.length; i++) - { - coeffs[i] = p.coeffs[i].intValue(); - } - } - - /** - * Decodes a byte array to a polynomial with N ternary coefficients
    - * Ignores any excess bytes. - * - * @param data an encoded ternary polynomial - * @param N number of coefficients - * @return the decoded polynomial - */ - public static IntegerPolynomial fromBinary3Sves(byte[] data, int N) - { - return new IntegerPolynomial(ArrayEncoder.decodeMod3Sves(data, N)); - } - - /** - * Converts a byte array produced by {@link #toBinary3Tight()} to a polynomial. - * - * @param b a byte array - * @param N number of coefficients - * @return the decoded polynomial - */ - public static IntegerPolynomial fromBinary3Tight(byte[] b, int N) - { - return new IntegerPolynomial(ArrayEncoder.decodeMod3Tight(b, N)); - } - - /** - * Reads data produced by {@link #toBinary3Tight()} from an input stream and converts it to a polynomial. - * - * @param is an input stream - * @param N number of coefficients - * @return the decoded polynomial - */ - public static IntegerPolynomial fromBinary3Tight(InputStream is, int N) - throws IOException - { - return new IntegerPolynomial(ArrayEncoder.decodeMod3Tight(is, N)); - } - - /** - * Returns a polynomial with N coefficients between 0 and q-1.
    - * q must be a power of 2.
    - * Ignores any excess bytes. - * - * @param data an encoded ternary polynomial - * @param N number of coefficients - * @param q - * @return the decoded polynomial - */ - public static IntegerPolynomial fromBinary(byte[] data, int N, int q) - { - return new IntegerPolynomial(ArrayEncoder.decodeModQ(data, N, q)); - } - - /** - * Returns a polynomial with N coefficients between 0 and q-1.
    - * q must be a power of 2.
    - * Ignores any excess bytes. - * - * @param is an encoded ternary polynomial - * @param N number of coefficients - * @param q - * @return the decoded polynomial - */ - public static IntegerPolynomial fromBinary(InputStream is, int N, int q) - throws IOException - { - return new IntegerPolynomial(ArrayEncoder.decodeModQ(is, N, q)); - } - - /** - * Encodes a polynomial with ternary coefficients to binary. - * coeffs[2*i] and coeffs[2*i+1] must not both equal -1 for any integer i, - * so this method is only safe to use with polynomials produced by fromBinary3Sves(). - * - * @return the encoded polynomial - */ - public byte[] toBinary3Sves() - { - return ArrayEncoder.encodeMod3Sves(coeffs); - } - - /** - * Converts a polynomial with ternary coefficients to binary. - * - * @return the encoded polynomial - */ - public byte[] toBinary3Tight() - { - BigInteger sum = Constants.BIGINT_ZERO; - for (int i = coeffs.length - 1; i >= 0; i--) - { - sum = sum.multiply(BigInteger.valueOf(3)); - sum = sum.add(BigInteger.valueOf(coeffs[i] + 1)); - } - - int size = (BigInteger.valueOf(3).pow(coeffs.length).bitLength() + 7) / 8; - byte[] arr = sum.toByteArray(); - - if (arr.length < size) - { - // pad with leading zeros so arr.length==size - byte[] arr2 = new byte[size]; - System.arraycopy(arr, 0, arr2, size - arr.length, arr.length); - return arr2; - } - - if (arr.length > size) - // drop sign bit - { - arr = Arrays.copyOfRange(arr, 1, arr.length); - } - return arr; - } - - /** - * Encodes a polynomial whose coefficients are between 0 and q, to binary. q must be a power of 2. - * - * @param q - * @return the encoded polynomial - */ - public byte[] toBinary(int q) - { - return ArrayEncoder.encodeModQ(coeffs, q); - } - - /** - * Multiplies the polynomial with another, taking the values mod modulus and the indices mod N - */ - public IntegerPolynomial mult(IntegerPolynomial poly2, int modulus) - { - IntegerPolynomial c = mult(poly2); - c.mod(modulus); - return c; - } - - /** - * Multiplies the polynomial with another, taking the indices mod N - */ - public IntegerPolynomial mult(IntegerPolynomial poly2) - { - int N = coeffs.length; - if (poly2.coeffs.length != N) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - IntegerPolynomial c = multRecursive(poly2); - - if (c.coeffs.length > N) - { - for (int k = N; k < c.coeffs.length; k++) - { - c.coeffs[k - N] += c.coeffs[k]; - } - c.coeffs = Arrays.copyOf(c.coeffs, N); - } - return c; - } - - public BigIntPolynomial mult(BigIntPolynomial poly2) - { - return new BigIntPolynomial(this).mult(poly2); - } - - /** - * Karazuba multiplication - */ - private IntegerPolynomial multRecursive(IntegerPolynomial poly2) - { - int[] a = coeffs; - int[] b = poly2.coeffs; - - int n = poly2.coeffs.length; - if (n <= 32) - { - int cn = 2 * n - 1; - IntegerPolynomial c = new IntegerPolynomial(new int[cn]); - for (int k = 0; k < cn; k++) - { - for (int i = Math.max(0, k - n + 1); i <= Math.min(k, n - 1); i++) - { - c.coeffs[k] += b[i] * a[k - i]; - } - } - return c; - } - else - { - int n1 = n / 2; - - IntegerPolynomial a1 = new IntegerPolynomial(Arrays.copyOf(a, n1)); - IntegerPolynomial a2 = new IntegerPolynomial(Arrays.copyOfRange(a, n1, n)); - IntegerPolynomial b1 = new IntegerPolynomial(Arrays.copyOf(b, n1)); - IntegerPolynomial b2 = new IntegerPolynomial(Arrays.copyOfRange(b, n1, n)); - - IntegerPolynomial A = (IntegerPolynomial)a1.clone(); - A.add(a2); - IntegerPolynomial B = (IntegerPolynomial)b1.clone(); - B.add(b2); - - IntegerPolynomial c1 = a1.multRecursive(b1); - IntegerPolynomial c2 = a2.multRecursive(b2); - IntegerPolynomial c3 = A.multRecursive(B); - c3.sub(c1); - c3.sub(c2); - - IntegerPolynomial c = new IntegerPolynomial(2 * n - 1); - for (int i = 0; i < c1.coeffs.length; i++) - { - c.coeffs[i] = c1.coeffs[i]; - } - for (int i = 0; i < c3.coeffs.length; i++) - { - c.coeffs[n1 + i] += c3.coeffs[i]; - } - for (int i = 0; i < c2.coeffs.length; i++) - { - c.coeffs[2 * n1 + i] += c2.coeffs[i]; - } - return c; - } - } - - /** - * Computes the inverse mod q; q must be a power of 2.
    - * Returns null if the polynomial is not invertible. - * - * @param q the modulus - * @return a new polynomial - */ - public IntegerPolynomial invertFq(int q) - { - int N = coeffs.length; - int k = 0; - IntegerPolynomial b = new IntegerPolynomial(N + 1); - b.coeffs[0] = 1; - IntegerPolynomial c = new IntegerPolynomial(N + 1); - IntegerPolynomial f = new IntegerPolynomial(N + 1); - f.coeffs = Arrays.copyOf(coeffs, N + 1); - f.modPositive(2); - // set g(x) = x^N − 1 - IntegerPolynomial g = new IntegerPolynomial(N + 1); - g.coeffs[0] = 1; - g.coeffs[N] = 1; - while (true) - { - while (f.coeffs[0] == 0) - { - for (int i = 1; i <= N; i++) - { - f.coeffs[i - 1] = f.coeffs[i]; // f(x) = f(x) / x - c.coeffs[N + 1 - i] = c.coeffs[N - i]; // c(x) = c(x) * x - } - f.coeffs[N] = 0; - c.coeffs[0] = 0; - k++; - if (f.equalsZero()) - { - return null; // not invertible - } - } - if (f.equalsOne()) - { - break; - } - if (f.degree() < g.degree()) - { - // exchange f and g - IntegerPolynomial temp = f; - f = g; - g = temp; - // exchange b and c - temp = b; - b = c; - c = temp; - } - f.add(g, 2); - b.add(c, 2); - } - - if (b.coeffs[N] != 0) - { - return null; - } - // Fq(x) = x^(N-k) * b(x) - IntegerPolynomial Fq = new IntegerPolynomial(N); - int j = 0; - k %= N; - for (int i = N - 1; i >= 0; i--) - { - j = i - k; - if (j < 0) - { - j += N; - } - Fq.coeffs[j] = b.coeffs[i]; - } - - return mod2ToModq(Fq, q); - } - - /** - * Computes the inverse mod q from the inverse mod 2 - * - * @param Fq - * @param q - * @return The inverse of this polynomial mod q - */ - private IntegerPolynomial mod2ToModq(IntegerPolynomial Fq, int q) - { - if (Util.is64BitJVM() && q == 2048) - { - LongPolynomial2 thisLong = new LongPolynomial2(this); - LongPolynomial2 FqLong = new LongPolynomial2(Fq); - int v = 2; - while (v < q) - { - v *= 2; - LongPolynomial2 temp = (LongPolynomial2)FqLong.clone(); - temp.mult2And(v - 1); - FqLong = thisLong.mult(FqLong).mult(FqLong); - temp.subAnd(FqLong, v - 1); - FqLong = temp; - } - return FqLong.toIntegerPolynomial(); - } - else - { - int v = 2; - while (v < q) - { - v *= 2; - IntegerPolynomial temp = new IntegerPolynomial(Arrays.copyOf(Fq.coeffs, Fq.coeffs.length)); - temp.mult2(v); - Fq = mult(Fq, v).mult(Fq, v); - temp.sub(Fq, v); - Fq = temp; - } - return Fq; - } - } - - /** - * Computes the inverse mod 3. - * Returns null if the polynomial is not invertible. - * - * @return a new polynomial - */ - public IntegerPolynomial invertF3() - { - int N = coeffs.length; - int k = 0; - IntegerPolynomial b = new IntegerPolynomial(N + 1); - b.coeffs[0] = 1; - IntegerPolynomial c = new IntegerPolynomial(N + 1); - IntegerPolynomial f = new IntegerPolynomial(N + 1); - f.coeffs = Arrays.copyOf(coeffs, N + 1); - f.modPositive(3); - // set g(x) = x^N − 1 - IntegerPolynomial g = new IntegerPolynomial(N + 1); - g.coeffs[0] = -1; - g.coeffs[N] = 1; - while (true) - { - while (f.coeffs[0] == 0) - { - for (int i = 1; i <= N; i++) - { - f.coeffs[i - 1] = f.coeffs[i]; // f(x) = f(x) / x - c.coeffs[N + 1 - i] = c.coeffs[N - i]; // c(x) = c(x) * x - } - f.coeffs[N] = 0; - c.coeffs[0] = 0; - k++; - if (f.equalsZero()) - { - return null; // not invertible - } - } - if (f.equalsAbsOne()) - { - break; - } - if (f.degree() < g.degree()) - { - // exchange f and g - IntegerPolynomial temp = f; - f = g; - g = temp; - // exchange b and c - temp = b; - b = c; - c = temp; - } - if (f.coeffs[0] == g.coeffs[0]) - { - f.sub(g, 3); - b.sub(c, 3); - } - else - { - f.add(g, 3); - b.add(c, 3); - } - } - - if (b.coeffs[N] != 0) - { - return null; - } - // Fp(x) = [+-] x^(N-k) * b(x) - IntegerPolynomial Fp = new IntegerPolynomial(N); - int j = 0; - k %= N; - for (int i = N - 1; i >= 0; i--) - { - j = i - k; - if (j < 0) - { - j += N; - } - Fp.coeffs[j] = f.coeffs[0] * b.coeffs[i]; - } - - Fp.ensurePositive(3); - return Fp; - } - - /** - * Resultant of this polynomial with x^n-1 using a probabilistic algorithm. - *

    - * Unlike EESS, this implementation does not compute all resultants modulo primes - * such that their product exceeds the maximum possible resultant, but rather stops - * when NUM_EQUAL_RESULTANTS consecutive modular resultants are equal.
    - * This means the return value may be incorrect. Experiments show this happens in - * about 1 out of 100 cases when N=439 and NUM_EQUAL_RESULTANTS=2, - * so the likelyhood of leaving the loop too early is (1/100)^(NUM_EQUAL_RESULTANTS-1). - *

    - * Because of the above, callers must verify the output and try a different polynomial if necessary. - * - * @return (rho, res) satisfying res = rho*this + t*(x^n-1) for some integer t. - */ - public Resultant resultant() - { - int N = coeffs.length; - - // Compute resultants modulo prime numbers. Continue until NUM_EQUAL_RESULTANTS consecutive modular resultants are equal. - LinkedList modResultants = new LinkedList(); - BigInteger prime = null; - BigInteger pProd = Constants.BIGINT_ONE; - BigInteger res = Constants.BIGINT_ONE; - int numEqual = 1; // number of consecutive modular resultants equal to each other - Iterator primes = BIGINT_PRIMES.iterator(); - while (true) - { - prime = primes.hasNext() ? primes.next() : prime.nextProbablePrime(); - ModularResultant crr = resultant(prime.intValue()); - modResultants.add(crr); - - BigInteger temp = pProd.multiply(prime); - BigIntEuclidean er = BigIntEuclidean.calculate(prime, pProd); - BigInteger resPrev = res; - res = res.multiply(er.x.multiply(prime)); - BigInteger res2 = crr.res.multiply(er.y.multiply(pProd)); - res = res.add(res2).mod(temp); - pProd = temp; - - BigInteger pProd2 = pProd.divide(BigInteger.valueOf(2)); - BigInteger pProd2n = pProd2.negate(); - if (res.compareTo(pProd2) > 0) - { - res = res.subtract(pProd); - } - else if (res.compareTo(pProd2n) < 0) - { - res = res.add(pProd); - } - - if (res.equals(resPrev)) - { - numEqual++; - if (numEqual >= NUM_EQUAL_RESULTANTS) - { - break; - } - } - else - { - numEqual = 1; - } - } - - // Combine modular rho's to obtain the final rho. - // For efficiency, first combine all pairs of small resultants to bigger resultants, - // then combine pairs of those, etc. until only one is left. - while (modResultants.size() > 1) - { - ModularResultant modRes1 = modResultants.removeFirst(); - ModularResultant modRes2 = modResultants.removeFirst(); - ModularResultant modRes3 = ModularResultant.combineRho(modRes1, modRes2); - modResultants.addLast(modRes3); - } - BigIntPolynomial rhoP = modResultants.getFirst().rho; - - BigInteger pProd2 = pProd.divide(BigInteger.valueOf(2)); - BigInteger pProd2n = pProd2.negate(); - if (res.compareTo(pProd2) > 0) - { - res = res.subtract(pProd); - } - if (res.compareTo(pProd2n) < 0) - { - res = res.add(pProd); - } - - for (int i = 0; i < N; i++) - { - BigInteger c = rhoP.coeffs[i]; - if (c.compareTo(pProd2) > 0) - { - rhoP.coeffs[i] = c.subtract(pProd); - } - if (c.compareTo(pProd2n) < 0) - { - rhoP.coeffs[i] = c.add(pProd); - } - } - - return new Resultant(rhoP, res); - } - - /** - * Multithreaded version of {@link #resultant()}. - * - * @return (rho, res) satisfying res = rho*this + t*(x^n-1) for some integer t. - */ - public Resultant resultantMultiThread() - { - int N = coeffs.length; - - // upper bound for resultant(f, g) = ||f, 2||^deg(g) * ||g, 2||^deg(f) = squaresum(f)^(N/2) * 2^(deg(f)/2) because g(x)=x^N-1 - // see http://jondalon.mathematik.uni-osnabrueck.de/staff/phpages/brunsw/CompAlg.pdf chapter 3 - BigInteger max = squareSum().pow((N + 1) / 2); - max = max.multiply(BigInteger.valueOf(2).pow((degree() + 1) / 2)); - BigInteger max2 = max.multiply(BigInteger.valueOf(2)); - - // compute resultants modulo prime numbers - BigInteger prime = BigInteger.valueOf(10000); - BigInteger pProd = Constants.BIGINT_ONE; - LinkedBlockingQueue> resultantTasks = new LinkedBlockingQueue>(); - Iterator primes = BIGINT_PRIMES.iterator(); - ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); - while (pProd.compareTo(max2) < 0) - { - if (primes.hasNext()) - { - prime = primes.next(); - } - else - { - prime = prime.nextProbablePrime(); - } - Future task = executor.submit(new ModResultantTask(prime.intValue())); - resultantTasks.add(task); - pProd = pProd.multiply(prime); - } - - // Combine modular resultants to obtain the resultant. - // For efficiency, first combine all pairs of small resultants to bigger resultants, - // then combine pairs of those, etc. until only one is left. - ModularResultant overallResultant = null; - while (!resultantTasks.isEmpty()) - { - try - { - Future modRes1 = resultantTasks.take(); - Future modRes2 = resultantTasks.poll(); - if (modRes2 == null) - { - // modRes1 is the only one left - overallResultant = modRes1.get(); - break; - } - Future newTask = executor.submit(new CombineTask(modRes1.get(), modRes2.get())); - resultantTasks.add(newTask); - } - catch (Exception e) - { - throw new IllegalStateException(e.toString()); - } - } - executor.shutdown(); - BigInteger res = overallResultant.res; - BigIntPolynomial rhoP = overallResultant.rho; - - BigInteger pProd2 = pProd.divide(BigInteger.valueOf(2)); - BigInteger pProd2n = pProd2.negate(); - - if (res.compareTo(pProd2) > 0) - { - res = res.subtract(pProd); - } - if (res.compareTo(pProd2n) < 0) - { - res = res.add(pProd); - } - - for (int i = 0; i < N; i++) - { - BigInteger c = rhoP.coeffs[i]; - if (c.compareTo(pProd2) > 0) - { - rhoP.coeffs[i] = c.subtract(pProd); - } - if (c.compareTo(pProd2n) < 0) - { - rhoP.coeffs[i] = c.add(pProd); - } - } - - return new Resultant(rhoP, res); - } - - /** - * Resultant of this polynomial with x^n-1 mod p.
    - * - * @return (rho, res) satisfying res = rho*this + t*(x^n-1) mod p for some integer t. - */ - public ModularResultant resultant(int p) - { - // Add a coefficient as the following operations involve polynomials of degree deg(f)+1 - int[] fcoeffs = Arrays.copyOf(coeffs, coeffs.length + 1); - IntegerPolynomial f = new IntegerPolynomial(fcoeffs); - int N = fcoeffs.length; - - IntegerPolynomial a = new IntegerPolynomial(N); - a.coeffs[0] = -1; - a.coeffs[N - 1] = 1; - IntegerPolynomial b = new IntegerPolynomial(f.coeffs); - IntegerPolynomial v1 = new IntegerPolynomial(N); - IntegerPolynomial v2 = new IntegerPolynomial(N); - v2.coeffs[0] = 1; - int da = N - 1; - int db = b.degree(); - int ta = da; - int c = 0; - int r = 1; - while (db > 0) - { - c = Util.invert(b.coeffs[db], p); - c = (c * a.coeffs[da]) % p; - a.multShiftSub(b, c, da - db, p); - v1.multShiftSub(v2, c, da - db, p); - - da = a.degree(); - if (da < db) - { - r *= Util.pow(b.coeffs[db], ta - da, p); - r %= p; - if (ta % 2 == 1 && db % 2 == 1) - { - r = (-r) % p; - } - IntegerPolynomial temp = a; - a = b; - b = temp; - int tempdeg = da; - da = db; - temp = v1; - v1 = v2; - v2 = temp; - ta = db; - db = tempdeg; - } - } - r *= Util.pow(b.coeffs[0], da, p); - r %= p; - c = Util.invert(b.coeffs[0], p); - v2.mult(c); - v2.mod(p); - v2.mult(r); - v2.mod(p); - - // drop the highest coefficient so #coeffs matches the original input - v2.coeffs = Arrays.copyOf(v2.coeffs, v2.coeffs.length - 1); - return new ModularResultant(new BigIntPolynomial(v2), BigInteger.valueOf(r), BigInteger.valueOf(p)); - } - - /** - * Computes this-b*c*(x^k) mod p and stores the result in this polynomial.
    - * See steps 4a,4b in EESS algorithm 2.2.7.1. - * - * @param b - * @param c - * @param k - * @param p - */ - private void multShiftSub(IntegerPolynomial b, int c, int k, int p) - { - int N = coeffs.length; - for (int i = k; i < N; i++) - { - coeffs[i] = (coeffs[i] - b.coeffs[i - k] * c) % p; - } - } - - /** - * Adds the squares of all coefficients. - * - * @return the sum of squares - */ - private BigInteger squareSum() - { - BigInteger sum = Constants.BIGINT_ZERO; - for (int i = 0; i < coeffs.length; i++) - { - sum = sum.add(BigInteger.valueOf(coeffs[i] * coeffs[i])); - } - return sum; - } - - /** - * Returns the degree of the polynomial - * - * @return the degree - */ - int degree() - { - int degree = coeffs.length - 1; - while (degree > 0 && coeffs[degree] == 0) - { - degree--; - } - return degree; - } - - /** - * Adds another polynomial which can have a different number of coefficients, - * and takes the coefficient values mod modulus. - * - * @param b another polynomial - */ - public void add(IntegerPolynomial b, int modulus) - { - add(b); - mod(modulus); - } - - /** - * Adds another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - public void add(IntegerPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] += b.coeffs[i]; - } - } - - /** - * Subtracts another polynomial which can have a different number of coefficients, - * and takes the coefficient values mod modulus. - * - * @param b another polynomial - */ - public void sub(IntegerPolynomial b, int modulus) - { - sub(b); - mod(modulus); - } - - /** - * Subtracts another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - public void sub(IntegerPolynomial b) - { - if (b.coeffs.length > coeffs.length) - { - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] -= b.coeffs[i]; - } - } - - /** - * Subtracts a int from each coefficient. Does not return a new polynomial but modifies this polynomial. - * - * @param b - */ - void sub(int b) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] -= b; - } - } - - /** - * Multiplies each coefficient by a int. Does not return a new polynomial but modifies this polynomial. - * - * @param factor - */ - public void mult(int factor) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] *= factor; - } - } - - /** - * Multiplies each coefficient by a 2 and applies a modulus. Does not return a new polynomial but modifies this polynomial. - * - * @param modulus a modulus - */ - private void mult2(int modulus) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] *= 2; - coeffs[i] %= modulus; - } - } - - /** - * Multiplies each coefficient by a 2 and applies a modulus. Does not return a new polynomial but modifies this polynomial. - * - * @param modulus a modulus - */ - public void mult3(int modulus) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] *= 3; - coeffs[i] %= modulus; - } - } - - /** - * Divides each coefficient by k and rounds to the nearest integer. Does not return a new polynomial but modifies this polynomial. - * - * @param k the divisor - */ - public void div(int k) - { - int k2 = (k + 1) / 2; - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] += coeffs[i] > 0 ? k2 : -k2; - coeffs[i] /= k; - } - } - - /** - * Takes each coefficient modulo 3 such that all coefficients are ternary. - */ - public void mod3() - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] %= 3; - if (coeffs[i] > 1) - { - coeffs[i] -= 3; - } - if (coeffs[i] < -1) - { - coeffs[i] += 3; - } - } - } - - /** - * Ensures all coefficients are between 0 and modulus-1 - * - * @param modulus a modulus - */ - public void modPositive(int modulus) - { - mod(modulus); - ensurePositive(modulus); - } - - /** - * Reduces all coefficients to the interval [-modulus/2, modulus/2) - */ - void modCenter(int modulus) - { - mod(modulus); - for (int j = 0; j < coeffs.length; j++) - { - while (coeffs[j] < modulus / 2) - { - coeffs[j] += modulus; - } - while (coeffs[j] >= modulus / 2) - { - coeffs[j] -= modulus; - } - } - } - - /** - * Takes each coefficient modulo modulus. - */ - public void mod(int modulus) - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] %= modulus; - } - } - - /** - * Adds modulus until all coefficients are above 0. - * - * @param modulus a modulus - */ - public void ensurePositive(int modulus) - { - for (int i = 0; i < coeffs.length; i++) - { - while (coeffs[i] < 0) - { - coeffs[i] += modulus; - } - } - } - - /** - * Computes the centered euclidean norm of the polynomial. - * - * @param q a modulus - * @return the centered norm - */ - public long centeredNormSq(int q) - { - int N = coeffs.length; - IntegerPolynomial p = (IntegerPolynomial)clone(); - p.shiftGap(q); - - long sum = 0; - long sqSum = 0; - for (int i = 0; i != p.coeffs.length; i++) - { - int c = p.coeffs[i]; - sum += c; - sqSum += c * c; - } - - long centeredNormSq = sqSum - sum * sum / N; - return centeredNormSq; - } - - /** - * Shifts all coefficients so the largest gap is centered around -q/2. - * - * @param q a modulus - */ - void shiftGap(int q) - { - modCenter(q); - - int[] sorted = Arrays.clone(coeffs); - - sort(sorted); - - int maxrange = 0; - int maxrangeStart = 0; - for (int i = 0; i < sorted.length - 1; i++) - { - int range = sorted[i + 1] - sorted[i]; - if (range > maxrange) - { - maxrange = range; - maxrangeStart = sorted[i]; - } - } - - int pmin = sorted[0]; - int pmax = sorted[sorted.length - 1]; - - int j = q - pmax + pmin; - int shift; - if (j > maxrange) - { - shift = (pmax + pmin) / 2; - } - else - { - shift = maxrangeStart + maxrange / 2 + q / 2; - } - - sub(shift); - } - - private void sort(int[] ints) - { - boolean swap = true; - - while (swap) - { - swap = false; - for (int i = 0; i != ints.length - 1; i++) - { - if (ints[i] > ints[i+1]) - { - int tmp = ints[i]; - ints[i] = ints[i+1]; - ints[i+1] = tmp; - swap = true; - } - } - } - } - - /** - * Shifts the values of all coefficients to the interval [-q/2, q/2]. - * - * @param q a modulus - */ - public void center0(int q) - { - for (int i = 0; i < coeffs.length; i++) - { - while (coeffs[i] < -q / 2) - { - coeffs[i] += q; - } - while (coeffs[i] > q / 2) - { - coeffs[i] -= q; - } - } - } - - /** - * Returns the sum of all coefficients, i.e. evaluates the polynomial at 0. - * - * @return the sum of all coefficients - */ - public int sumCoeffs() - { - int sum = 0; - for (int i = 0; i < coeffs.length; i++) - { - sum += coeffs[i]; - } - return sum; - } - - /** - * Tests if p(x) = 0. - * - * @return true iff all coefficients are zeros - */ - private boolean equalsZero() - { - for (int i = 0; i < coeffs.length; i++) - { - if (coeffs[i] != 0) - { - return false; - } - } - return true; - } - - /** - * Tests if p(x) = 1. - * - * @return true iff all coefficients are equal to zero, except for the lowest coefficient which must equal 1 - */ - public boolean equalsOne() - { - for (int i = 1; i < coeffs.length; i++) - { - if (coeffs[i] != 0) - { - return false; - } - } - return coeffs[0] == 1; - } - - /** - * Tests if |p(x)| = 1. - * - * @return true iff all coefficients are equal to zero, except for the lowest coefficient which must equal 1 or -1 - */ - private boolean equalsAbsOne() - { - for (int i = 1; i < coeffs.length; i++) - { - if (coeffs[i] != 0) - { - return false; - } - } - return Math.abs(coeffs[0]) == 1; - } - - /** - * Counts the number of coefficients equal to an integer - * - * @param value an integer - * @return the number of coefficients equal to value - */ - public int count(int value) - { - int count = 0; - for (int i = 0; i != coeffs.length; i++) - { - if (coeffs[i] == value) - { - count++; - } - } - return count; - } - - /** - * Multiplication by X in Z[X]/Z[X^n-1]. - */ - public void rotate1() - { - int clast = coeffs[coeffs.length - 1]; - for (int i = coeffs.length - 1; i > 0; i--) - { - coeffs[i] = coeffs[i - 1]; - } - coeffs[0] = clast; - } - - public void clear() - { - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = 0; - } - } - - public IntegerPolynomial toIntegerPolynomial() - { - return (IntegerPolynomial)clone(); - } - - public Object clone() - { - return new IntegerPolynomial(coeffs.clone()); - } - - public boolean equals(Object obj) - { - if (obj instanceof IntegerPolynomial) - { - return Arrays.areEqual(coeffs, ((IntegerPolynomial)obj).coeffs); - } - else - { - return false; - } - } - - /** - * Calls {@link IntegerPolynomial#resultant(int) - */ - private class ModResultantTask - implements Callable - { - private int modulus; - - private ModResultantTask(int modulus) - { - this.modulus = modulus; - } - - public ModularResultant call() - { - return resultant(modulus); - } - } - - /** - * Calls {@link ModularResultant#combineRho(ModularResultant, ModularResultant) - */ - private class CombineTask - implements Callable - { - private ModularResultant modRes1; - private ModularResultant modRes2; - - private CombineTask(ModularResultant modRes1, ModularResultant modRes2) - { - this.modRes1 = modRes1; - this.modRes2 = modRes2; - } - - public ModularResultant call() - { - return ModularResultant.combineRho(modRes1, modRes2); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial2.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial2.java deleted file mode 100644 index 8ae1406..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial2.java +++ /dev/null @@ -1,255 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import org.bc.util.Arrays; - -/** - * A polynomial class that combines two coefficients into one long value for - * faster multiplication in 64 bit environments.
    - * Coefficients can be between 0 and 2047 and are stored in pairs in the bits 0..10 and 24..34 of a long number. - */ -public class LongPolynomial2 -{ - private long[] coeffs; // each representing two coefficients in the original IntegerPolynomial - private int numCoeffs; - - /** - * Constructs a LongPolynomial2 from a IntegerPolynomial. The two polynomials are independent of each other. - * - * @param p the original polynomial. Coefficients must be between 0 and 2047. - */ - public LongPolynomial2(IntegerPolynomial p) - { - numCoeffs = p.coeffs.length; - coeffs = new long[(numCoeffs + 1) / 2]; - int idx = 0; - for (int pIdx = 0; pIdx < numCoeffs; ) - { - int c0 = p.coeffs[pIdx++]; - while (c0 < 0) - { - c0 += 2048; - } - long c1 = pIdx < numCoeffs ? p.coeffs[pIdx++] : 0; - while (c1 < 0) - { - c1 += 2048; - } - coeffs[idx] = c0 + (c1 << 24); - idx++; - } - } - - private LongPolynomial2(long[] coeffs) - { - this.coeffs = coeffs; - } - - private LongPolynomial2(int N) - { - coeffs = new long[N]; - } - - /** - * Multiplies the polynomial with another, taking the indices mod N and the values mod 2048. - */ - public LongPolynomial2 mult(LongPolynomial2 poly2) - { - int N = coeffs.length; - if (poly2.coeffs.length != N || numCoeffs != poly2.numCoeffs) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - LongPolynomial2 c = multRecursive(poly2); - - if (c.coeffs.length > N) - { - if (numCoeffs % 2 == 0) - { - for (int k = N; k < c.coeffs.length; k++) - { - c.coeffs[k - N] = (c.coeffs[k - N] + c.coeffs[k]) & 0x7FF0007FFL; - } - c.coeffs = Arrays.copyOf(c.coeffs, N); - } - else - { - for (int k = N; k < c.coeffs.length; k++) - { - c.coeffs[k - N] = c.coeffs[k - N] + (c.coeffs[k - 1] >> 24); - c.coeffs[k - N] = c.coeffs[k - N] + ((c.coeffs[k] & 2047) << 24); - c.coeffs[k - N] &= 0x7FF0007FFL; - } - c.coeffs = Arrays.copyOf(c.coeffs, N); - c.coeffs[c.coeffs.length - 1] &= 2047; - } - } - - c = new LongPolynomial2(c.coeffs); - c.numCoeffs = numCoeffs; - return c; - } - - public IntegerPolynomial toIntegerPolynomial() - { - int[] intCoeffs = new int[numCoeffs]; - int uIdx = 0; - for (int i = 0; i < coeffs.length; i++) - { - intCoeffs[uIdx++] = (int)(coeffs[i] & 2047); - if (uIdx < numCoeffs) - { - intCoeffs[uIdx++] = (int)((coeffs[i] >> 24) & 2047); - } - } - return new IntegerPolynomial(intCoeffs); - } - - /** - * Karazuba multiplication - */ - private LongPolynomial2 multRecursive(LongPolynomial2 poly2) - { - long[] a = coeffs; - long[] b = poly2.coeffs; - - int n = poly2.coeffs.length; - if (n <= 32) - { - int cn = 2 * n; - LongPolynomial2 c = new LongPolynomial2(new long[cn]); - for (int k = 0; k < cn; k++) - { - for (int i = Math.max(0, k - n + 1); i <= Math.min(k, n - 1); i++) - { - long c0 = a[k - i] * b[i]; - long cu = c0 & 0x7FF000000L + (c0 & 2047); - long co = (c0 >>> 48) & 2047; - - c.coeffs[k] = (c.coeffs[k] + cu) & 0x7FF0007FFL; - c.coeffs[k + 1] = (c.coeffs[k + 1] + co) & 0x7FF0007FFL; - } - } - return c; - } - else - { - int n1 = n / 2; - - LongPolynomial2 a1 = new LongPolynomial2(Arrays.copyOf(a, n1)); - LongPolynomial2 a2 = new LongPolynomial2(Arrays.copyOfRange(a, n1, n)); - LongPolynomial2 b1 = new LongPolynomial2(Arrays.copyOf(b, n1)); - LongPolynomial2 b2 = new LongPolynomial2(Arrays.copyOfRange(b, n1, n)); - - LongPolynomial2 A = (LongPolynomial2)a1.clone(); - A.add(a2); - LongPolynomial2 B = (LongPolynomial2)b1.clone(); - B.add(b2); - - LongPolynomial2 c1 = a1.multRecursive(b1); - LongPolynomial2 c2 = a2.multRecursive(b2); - LongPolynomial2 c3 = A.multRecursive(B); - c3.sub(c1); - c3.sub(c2); - - LongPolynomial2 c = new LongPolynomial2(2 * n); - for (int i = 0; i < c1.coeffs.length; i++) - { - c.coeffs[i] = c1.coeffs[i] & 0x7FF0007FFL; - } - for (int i = 0; i < c3.coeffs.length; i++) - { - c.coeffs[n1 + i] = (c.coeffs[n1 + i] + c3.coeffs[i]) & 0x7FF0007FFL; - } - for (int i = 0; i < c2.coeffs.length; i++) - { - c.coeffs[2 * n1 + i] = (c.coeffs[2 * n1 + i] + c2.coeffs[i]) & 0x7FF0007FFL; - } - return c; - } - } - - /** - * Adds another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - private void add(LongPolynomial2 b) - { - if (b.coeffs.length > coeffs.length) - { - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = (coeffs[i] + b.coeffs[i]) & 0x7FF0007FFL; - } - } - - /** - * Subtracts another polynomial which can have a different number of coefficients. - * - * @param b another polynomial - */ - private void sub(LongPolynomial2 b) - { - if (b.coeffs.length > coeffs.length) - { - coeffs = Arrays.copyOf(coeffs, b.coeffs.length); - } - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = (0x0800000800000L + coeffs[i] - b.coeffs[i]) & 0x7FF0007FFL; - } - } - - /** - * Subtracts another polynomial which must have the same number of coefficients, - * and applies an AND mask to the upper and lower halves of each coefficients. - * - * @param b another polynomial - * @param mask a bit mask less than 2048 to apply to each 11-bit coefficient - */ - public void subAnd(LongPolynomial2 b, int mask) - { - long longMask = (((long)mask) << 24) + mask; - for (int i = 0; i < b.coeffs.length; i++) - { - coeffs[i] = (0x0800000800000L + coeffs[i] - b.coeffs[i]) & longMask; - } - } - - /** - * Multiplies this polynomial by 2 and applies an AND mask to the upper and - * lower halves of each coefficients. - * - * @param mask a bit mask less than 2048 to apply to each 11-bit coefficient - */ - public void mult2And(int mask) - { - long longMask = (((long)mask) << 24) + mask; - for (int i = 0; i < coeffs.length; i++) - { - coeffs[i] = (coeffs[i] << 1) & longMask; - } - } - - public Object clone() - { - LongPolynomial2 p = new LongPolynomial2(coeffs.clone()); - p.numCoeffs = numCoeffs; - return p; - } - - public boolean equals(Object obj) - { - if (obj instanceof LongPolynomial2) - { - return Arrays.areEqual(coeffs, ((LongPolynomial2)obj).coeffs); - } - else - { - return false; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial5.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial5.java deleted file mode 100644 index 5e076c2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/LongPolynomial5.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import org.bc.util.Arrays; - -/** - * A polynomial class that combines five coefficients into one long value for - * faster multiplication by a ternary polynomial.
    - * Coefficients can be between 0 and 2047 and are stored in bits 0..11, 12..23, ..., 48..59 of a long number. - */ -public class LongPolynomial5 -{ - private long[] coeffs; // groups of 5 coefficients - private int numCoeffs; - - /** - * Constructs a LongPolynomial5 from a IntegerPolynomial. The two polynomials are independent of each other. - * - * @param p the original polynomial. Coefficients must be between 0 and 2047. - */ - public LongPolynomial5(IntegerPolynomial p) - { - numCoeffs = p.coeffs.length; - - coeffs = new long[(numCoeffs + 4) / 5]; - int cIdx = 0; - int shift = 0; - for (int i = 0; i < numCoeffs; i++) - { - coeffs[cIdx] |= ((long)p.coeffs[i]) << shift; - shift += 12; - if (shift >= 60) - { - shift = 0; - cIdx++; - } - } - } - - private LongPolynomial5(long[] coeffs, int numCoeffs) - { - this.coeffs = coeffs; - this.numCoeffs = numCoeffs; - } - - /** - * Multiplies the polynomial with a TernaryPolynomial, taking the indices mod N and the values mod 2048. - */ - public LongPolynomial5 mult(TernaryPolynomial poly2) - { - long[][] prod = new long[5][coeffs.length + (poly2.size() + 4) / 5 - 1]; // intermediate results, the subarrays are shifted by 0,...,4 coefficients - - // multiply ones - int[] ones = poly2.getOnes(); - for (int idx = 0; idx != ones.length; idx++) - { - int pIdx = ones[idx]; - int cIdx = pIdx / 5; - int m = pIdx - cIdx * 5; // m = pIdx % 5 - for (int i = 0; i < coeffs.length; i++) - { - prod[m][cIdx] = (prod[m][cIdx] + coeffs[i]) & 0x7FF7FF7FF7FF7FFL; - cIdx++; - } - } - - // multiply negative ones - int[] negOnes = poly2.getNegOnes(); - for (int idx = 0; idx != negOnes.length; idx++) - { - int pIdx = negOnes[idx]; - int cIdx = pIdx / 5; - int m = pIdx - cIdx * 5; // m = pIdx % 5 - for (int i = 0; i < coeffs.length; i++) - { - prod[m][cIdx] = (0x800800800800800L + prod[m][cIdx] - coeffs[i]) & 0x7FF7FF7FF7FF7FFL; - cIdx++; - } - } - - // combine shifted coefficients (5 arrays) into a single array of length prod[*].length+1 - long[] cCoeffs = Arrays.copyOf(prod[0], prod[0].length + 1); - for (int m = 1; m <= 4; m++) - { - int shift = m * 12; - int shift60 = 60 - shift; - long mask = (1L << shift60) - 1; - int pLen = prod[m].length; - for (int i = 0; i < pLen; i++) - { - long upper, lower; - upper = prod[m][i] >> shift60; - lower = prod[m][i] & mask; - - cCoeffs[i] = (cCoeffs[i] + (lower << shift)) & 0x7FF7FF7FF7FF7FFL; - int nextIdx = i + 1; - cCoeffs[nextIdx] = (cCoeffs[nextIdx] + upper) & 0x7FF7FF7FF7FF7FFL; - } - } - - // reduce indices of cCoeffs modulo numCoeffs - int shift = 12 * (numCoeffs % 5); - for (int cIdx = coeffs.length - 1; cIdx < cCoeffs.length; cIdx++) - { - long iCoeff; // coefficient to shift into the [0..numCoeffs-1] range - int newIdx; - if (cIdx == coeffs.length - 1) - { - iCoeff = numCoeffs == 5 ? 0 : cCoeffs[cIdx] >> shift; - newIdx = 0; - } - else - { - iCoeff = cCoeffs[cIdx]; - newIdx = cIdx * 5 - numCoeffs; - } - - int base = newIdx / 5; - int m = newIdx - base * 5; // m = newIdx % 5 - long lower = iCoeff << (12 * m); - long upper = iCoeff >> (12 * (5 - m)); - cCoeffs[base] = (cCoeffs[base] + lower) & 0x7FF7FF7FF7FF7FFL; - int base1 = base + 1; - if (base1 < coeffs.length) - { - cCoeffs[base1] = (cCoeffs[base1] + upper) & 0x7FF7FF7FF7FF7FFL; - } - } - - return new LongPolynomial5(cCoeffs, numCoeffs); - } - - public IntegerPolynomial toIntegerPolynomial() - { - int[] intCoeffs = new int[numCoeffs]; - int cIdx = 0; - int shift = 0; - for (int i = 0; i < numCoeffs; i++) - { - intCoeffs[i] = (int)((coeffs[cIdx] >> shift) & 2047); - shift += 12; - if (shift >= 60) - { - shift = 0; - cIdx++; - } - } - return new IntegerPolynomial(intCoeffs); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ModularResultant.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ModularResultant.java deleted file mode 100644 index 94d5a7c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ModularResultant.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.math.BigInteger; - -import org.bc.math.ntru.euclid.BigIntEuclidean; - -/** - * A resultant modulo a BigInteger - */ -public class ModularResultant - extends Resultant -{ - BigInteger modulus; - - ModularResultant(BigIntPolynomial rho, BigInteger res, BigInteger modulus) - { - super(rho, res); - this.modulus = modulus; - } - - /** - * Calculates a rho modulo m1*m2 from - * two resultants whose rhos are modulo m1 and m2.
    - *
    res is set to null. - * - * @param modRes1 - * @param modRes2 - * @return rho modulo modRes1.modulus * modRes2.modulus, and null for res. - */ - static ModularResultant combineRho(ModularResultant modRes1, ModularResultant modRes2) - { - BigInteger mod1 = modRes1.modulus; - BigInteger mod2 = modRes2.modulus; - BigInteger prod = mod1.multiply(mod2); - BigIntEuclidean er = BigIntEuclidean.calculate(mod2, mod1); - - BigIntPolynomial rho1 = (BigIntPolynomial)modRes1.rho.clone(); - rho1.mult(er.x.multiply(mod2)); - BigIntPolynomial rho2 = (BigIntPolynomial)modRes2.rho.clone(); - rho2.mult(er.y.multiply(mod1)); - rho1.add(rho2); - rho1.mod(prod); - - return new ModularResultant(rho1, null, prod); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Polynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Polynomial.java deleted file mode 100644 index 7729a40..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Polynomial.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.bc.math.ntru.polynomial; - -public interface Polynomial -{ - - /** - * Multiplies the polynomial by an IntegerPolynomial, - * taking the indices mod N. - * - * @param poly2 a polynomial - * @return the product of the two polynomials - */ - IntegerPolynomial mult(IntegerPolynomial poly2); - - /** - * Multiplies the polynomial by an IntegerPolynomial, - * taking the coefficient values mod modulus and the indices mod N. - * - * @param poly2 a polynomial - * @param modulus a modulus to apply - * @return the product of the two polynomials - */ - IntegerPolynomial mult(IntegerPolynomial poly2, int modulus); - - /** - * Returns a polynomial that is equal to this polynomial (in the sense that {@link #mult(IntegerPolynomial, int)} - * returns equal IntegerPolynomials). The new polynomial is guaranteed to be independent of the original. - * - * @return a new IntegerPolynomial. - */ - IntegerPolynomial toIntegerPolynomial(); - - /** - * Multiplies the polynomial by a BigIntPolynomial, taking the indices mod N. Does not - * change this polynomial but returns the result as a new polynomial.
    - * Both polynomials must have the same number of coefficients. - * - * @param poly2 the polynomial to multiply by - * @return a new polynomial - */ - BigIntPolynomial mult(BigIntPolynomial poly2); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ProductFormPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ProductFormPolynomial.java deleted file mode 100644 index 6ab212e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/ProductFormPolynomial.java +++ /dev/null @@ -1,153 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.security.SecureRandom; - -import org.bc.util.Arrays; - -/** - * A polynomial of the form f1*f2+f3, where - * f1,f2,f3 are very sparsely populated ternary polynomials. - */ -public class ProductFormPolynomial - implements Polynomial -{ - private SparseTernaryPolynomial f1, f2, f3; - - public ProductFormPolynomial(SparseTernaryPolynomial f1, SparseTernaryPolynomial f2, SparseTernaryPolynomial f3) - { - this.f1 = f1; - this.f2 = f2; - this.f3 = f3; - } - - public static ProductFormPolynomial generateRandom(int N, int df1, int df2, int df3Ones, int df3NegOnes, SecureRandom random) - { - SparseTernaryPolynomial f1 = SparseTernaryPolynomial.generateRandom(N, df1, df1, random); - SparseTernaryPolynomial f2 = SparseTernaryPolynomial.generateRandom(N, df2, df2, random); - SparseTernaryPolynomial f3 = SparseTernaryPolynomial.generateRandom(N, df3Ones, df3NegOnes, random); - return new ProductFormPolynomial(f1, f2, f3); - } - - public static ProductFormPolynomial fromBinary(byte[] data, int N, int df1, int df2, int df3Ones, int df3NegOnes) - throws IOException - { - return fromBinary(new ByteArrayInputStream(data), N, df1, df2, df3Ones, df3NegOnes); - } - - public static ProductFormPolynomial fromBinary(InputStream is, int N, int df1, int df2, int df3Ones, int df3NegOnes) - throws IOException - { - SparseTernaryPolynomial f1; - - f1 = SparseTernaryPolynomial.fromBinary(is, N, df1, df1); - SparseTernaryPolynomial f2 = SparseTernaryPolynomial.fromBinary(is, N, df2, df2); - SparseTernaryPolynomial f3 = SparseTernaryPolynomial.fromBinary(is, N, df3Ones, df3NegOnes); - return new ProductFormPolynomial(f1, f2, f3); - } - - public byte[] toBinary() - { - byte[] f1Bin = f1.toBinary(); - byte[] f2Bin = f2.toBinary(); - byte[] f3Bin = f3.toBinary(); - - byte[] all = Arrays.copyOf(f1Bin, f1Bin.length + f2Bin.length + f3Bin.length); - System.arraycopy(f2Bin, 0, all, f1Bin.length, f2Bin.length); - System.arraycopy(f3Bin, 0, all, f1Bin.length + f2Bin.length, f3Bin.length); - return all; - } - - public IntegerPolynomial mult(IntegerPolynomial b) - { - IntegerPolynomial c = f1.mult(b); - c = f2.mult(c); - c.add(f3.mult(b)); - return c; - } - - public BigIntPolynomial mult(BigIntPolynomial b) - { - BigIntPolynomial c = f1.mult(b); - c = f2.mult(c); - c.add(f3.mult(b)); - return c; - } - - public IntegerPolynomial toIntegerPolynomial() - { - IntegerPolynomial i = f1.mult(f2.toIntegerPolynomial()); - i.add(f3.toIntegerPolynomial()); - return i; - } - - public IntegerPolynomial mult(IntegerPolynomial poly2, int modulus) - { - IntegerPolynomial c = mult(poly2); - c.mod(modulus); - return c; - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((f1 == null) ? 0 : f1.hashCode()); - result = prime * result + ((f2 == null) ? 0 : f2.hashCode()); - result = prime * result + ((f3 == null) ? 0 : f3.hashCode()); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - ProductFormPolynomial other = (ProductFormPolynomial)obj; - if (f1 == null) - { - if (other.f1 != null) - { - return false; - } - } - else if (!f1.equals(other.f1)) - { - return false; - } - if (f2 == null) - { - if (other.f2 != null) - { - return false; - } - } - else if (!f2.equals(other.f2)) - { - return false; - } - if (f3 == null) - { - if (other.f3 != null) - { - return false; - } - } - else if (!f3.equals(other.f3)) - { - return false; - } - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Resultant.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Resultant.java deleted file mode 100644 index 647dc6f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/Resultant.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.math.BigInteger; - -/** - * Contains a resultant and a polynomial rho such that - * res = rho*this + t*(x^n-1) for some integer t. - * - * @see IntegerPolynomial#resultant() - * @see IntegerPolynomial#resultant(int) - */ -public class Resultant -{ - /** - * A polynomial such that res = rho*this + t*(x^n-1) for some integer t - */ - public BigIntPolynomial rho; - /** - * Resultant of a polynomial with x^n-1 - */ - public BigInteger res; - - Resultant(BigIntPolynomial rho, BigInteger res) - { - this.rho = rho; - this.res = res; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/SparseTernaryPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/SparseTernaryPolynomial.java deleted file mode 100644 index 5b87b89..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/SparseTernaryPolynomial.java +++ /dev/null @@ -1,320 +0,0 @@ -package org.bc.math.ntru.polynomial; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.security.SecureRandom; - -import org.bc.math.ntru.util.ArrayEncoder; -import org.bc.math.ntru.util.Util; -import org.bc.util.Arrays; - -/** - * A TernaryPolynomial with a "low" number of nonzero coefficients. - */ -public class SparseTernaryPolynomial - implements TernaryPolynomial -{ - /** - * Number of bits to use for each coefficient. Determines the upper bound for N. - */ - private static final int BITS_PER_INDEX = 11; - - private int N; - private int[] ones; - private int[] negOnes; - - /** - * Constructs a new polynomial. - * - * @param N total number of coefficients including zeros - * @param ones indices of coefficients equal to 1 - * @param negOnes indices of coefficients equal to -1 - */ - SparseTernaryPolynomial(int N, int[] ones, int[] negOnes) - { - this.N = N; - this.ones = ones; - this.negOnes = negOnes; - } - - /** - * Constructs a DenseTernaryPolynomial from a IntegerPolynomial. The two polynomials are - * independent of each other. - * - * @param intPoly the original polynomial - */ - public SparseTernaryPolynomial(IntegerPolynomial intPoly) - { - this(intPoly.coeffs); - } - - /** - * Constructs a new SparseTernaryPolynomial with a given set of coefficients. - * - * @param coeffs the coefficients - */ - public SparseTernaryPolynomial(int[] coeffs) - { - N = coeffs.length; - ones = new int[N]; - negOnes = new int[N]; - int onesIdx = 0; - int negOnesIdx = 0; - for (int i = 0; i < N; i++) - { - int c = coeffs[i]; - switch (c) - { - case 1: - ones[onesIdx++] = i; - break; - case -1: - negOnes[negOnesIdx++] = i; - break; - case 0: - break; - default: - throw new IllegalArgumentException("Illegal value: " + c + ", must be one of {-1, 0, 1}"); - } - } - ones = Arrays.copyOf(ones, onesIdx); - negOnes = Arrays.copyOf(negOnes, negOnesIdx); - } - - /** - * Decodes a byte array encoded with {@link #toBinary()} to a ploynomial. - * - * @param is an input stream containing an encoded polynomial - * @param N number of coefficients including zeros - * @param numOnes number of coefficients equal to 1 - * @param numNegOnes number of coefficients equal to -1 - * @return the decoded polynomial - * @throws IOException - */ - public static SparseTernaryPolynomial fromBinary(InputStream is, int N, int numOnes, int numNegOnes) - throws IOException - { - int maxIndex = 1 << BITS_PER_INDEX; - int bitsPerIndex = 32 - Integer.numberOfLeadingZeros(maxIndex - 1); - - int data1Len = (numOnes * bitsPerIndex + 7) / 8; - byte[] data1 = Util.readFullLength(is, data1Len); - int[] ones = ArrayEncoder.decodeModQ(data1, numOnes, maxIndex); - - int data2Len = (numNegOnes * bitsPerIndex + 7) / 8; - byte[] data2 = Util.readFullLength(is, data2Len); - int[] negOnes = ArrayEncoder.decodeModQ(data2, numNegOnes, maxIndex); - - return new SparseTernaryPolynomial(N, ones, negOnes); - } - - /** - * Generates a random polynomial with numOnes coefficients equal to 1, - * numNegOnes coefficients equal to -1, and the rest equal to 0. - * - * @param N number of coefficients - * @param numOnes number of 1's - * @param numNegOnes number of -1's - */ - public static SparseTernaryPolynomial generateRandom(int N, int numOnes, int numNegOnes, SecureRandom random) - { - int[] coeffs = Util.generateRandomTernary(N, numOnes, numNegOnes, random); - return new SparseTernaryPolynomial(coeffs); - } - - public IntegerPolynomial mult(IntegerPolynomial poly2) - { - int[] b = poly2.coeffs; - if (b.length != N) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - int[] c = new int[N]; - for (int idx = 0; idx != ones.length; idx++) - { - int i = ones[idx]; - int j = N - 1 - i; - for (int k = N - 1; k >= 0; k--) - { - c[k] += b[j]; - j--; - if (j < 0) - { - j = N - 1; - } - } - } - - for (int idx = 0; idx != negOnes.length; idx++) - { - int i = negOnes[idx]; - int j = N - 1 - i; - for (int k = N - 1; k >= 0; k--) - { - c[k] -= b[j]; - j--; - if (j < 0) - { - j = N - 1; - } - } - } - - return new IntegerPolynomial(c); - } - - public IntegerPolynomial mult(IntegerPolynomial poly2, int modulus) - { - IntegerPolynomial c = mult(poly2); - c.mod(modulus); - return c; - } - - public BigIntPolynomial mult(BigIntPolynomial poly2) - { - BigInteger[] b = poly2.coeffs; - if (b.length != N) - { - throw new IllegalArgumentException("Number of coefficients must be the same"); - } - - BigInteger[] c = new BigInteger[N]; - for (int i = 0; i < N; i++) - { - c[i] = BigInteger.ZERO; - } - - for (int idx = 0; idx != ones.length; idx++) - { - int i = ones[idx]; - int j = N - 1 - i; - for (int k = N - 1; k >= 0; k--) - { - c[k] = c[k].add(b[j]); - j--; - if (j < 0) - { - j = N - 1; - } - } - } - - for (int idx = 0; idx != negOnes.length; idx++) - { - int i = negOnes[idx]; - int j = N - 1 - i; - for (int k = N - 1; k >= 0; k--) - { - c[k] = c[k].subtract(b[j]); - j--; - if (j < 0) - { - j = N - 1; - } - } - } - - return new BigIntPolynomial(c); - } - - public int[] getOnes() - { - return ones; - } - - public int[] getNegOnes() - { - return negOnes; - } - - /** - * Encodes the polynomial to a byte array writing BITS_PER_INDEX bits for each coefficient. - * - * @return the encoded polynomial - */ - public byte[] toBinary() - { - int maxIndex = 1 << BITS_PER_INDEX; - byte[] bin1 = ArrayEncoder.encodeModQ(ones, maxIndex); - byte[] bin2 = ArrayEncoder.encodeModQ(negOnes, maxIndex); - - byte[] bin = Arrays.copyOf(bin1, bin1.length + bin2.length); - System.arraycopy(bin2, 0, bin, bin1.length, bin2.length); - return bin; - } - - public IntegerPolynomial toIntegerPolynomial() - { - int[] coeffs = new int[N]; - for (int idx = 0; idx != ones.length; idx++) - { - int i = ones[idx]; - coeffs[i] = 1; - } - for (int idx = 0; idx != negOnes.length; idx++) - { - int i = negOnes[idx]; - coeffs[i] = -1; - } - return new IntegerPolynomial(coeffs); - } - - public int size() - { - return N; - } - - public void clear() - { - for (int i = 0; i < ones.length; i++) - { - ones[i] = 0; - } - for (int i = 0; i < negOnes.length; i++) - { - negOnes[i] = 0; - } - } - - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + N; - result = prime * result + Arrays.hashCode(negOnes); - result = prime * result + Arrays.hashCode(ones); - return result; - } - - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (getClass() != obj.getClass()) - { - return false; - } - SparseTernaryPolynomial other = (SparseTernaryPolynomial)obj; - if (N != other.N) - { - return false; - } - if (!Arrays.areEqual(negOnes, other.negOnes)) - { - return false; - } - if (!Arrays.areEqual(ones, other.ones)) - { - return false; - } - return true; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/TernaryPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/TernaryPolynomial.java deleted file mode 100644 index 19243ed..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/polynomial/TernaryPolynomial.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.math.ntru.polynomial; - -/** - * A polynomial whose coefficients are all equal to -1, 0, or 1 - */ -public interface TernaryPolynomial - extends Polynomial -{ - - /** - * Multiplies the polynomial by an IntegerPolynomial, taking the indices mod N - */ - IntegerPolynomial mult(IntegerPolynomial poly2); - - int[] getOnes(); - - int[] getNegOnes(); - - /** - * Returns the maximum number of coefficients the polynomial can have - */ - int size(); - - void clear(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/ArrayEncoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/ArrayEncoder.java deleted file mode 100644 index 2436962..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/ArrayEncoder.java +++ /dev/null @@ -1,292 +0,0 @@ -package org.bc.math.ntru.util; - -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; - -import org.bc.util.Arrays; - -/** - * Converts a coefficient array to a compact byte array and vice versa. - */ -public class ArrayEncoder -{ - /** - * Bit string to coefficient conversion table from P1363.1. Also found at - * {@link http://stackoverflow.com/questions/1562548/how-to-make-a-message-into-a-polynomial} - *

    - * Convert each three-bit quantity to two ternary coefficients as follows, and concatenate the resulting - * ternary quantities to obtain [the output]. - *

    - * - * {0, 0, 0} -> {0, 0}
    - * {0, 0, 1} -> {0, 1}
    - * {0, 1, 0} -> {0, -1}
    - * {0, 1, 1} -> {1, 0}
    - * {1, 0, 0} -> {1, 1}
    - * {1, 0, 1} -> {1, -1}
    - * {1, 1, 0} -> {-1, 0}
    - * {1, 1, 1} -> {-1, 1}
    - *
    - */ - private static final int[] COEFF1_TABLE = {0, 0, 0, 1, 1, 1, -1, -1}; - private static final int[] COEFF2_TABLE = {0, 1, -1, 0, 1, -1, 0, 1}; - /** - * Coefficient to bit string conversion table from P1363.1. Also found at - * {@link http://stackoverflow.com/questions/1562548/how-to-make-a-message-into-a-polynomial} - *

    - * Convert each set of two ternary coefficients to three bits as follows, and concatenate the resulting bit - * quantities to obtain [the output]: - *

    - * - * {-1, -1} -> set "fail" to 1 and set bit string to {1, 1, 1} - * {-1, 0} -> {1, 1, 0}
    - * {-1, 1} -> {1, 1, 1}
    - * {0, -1} -> {0, 1, 0}
    - * {0, 0} -> {0, 0, 0}
    - * {0, 1} -> {0, 0, 1}
    - * {1, -1} -> {1, 0, 1}
    - * {1, 0} -> {0, 1, 1}
    - * {1, 1} -> {1, 0, 0}
    - *
    - */ - private static final int[] BIT1_TABLE = {1, 1, 1, 0, 0, 0, 1, 0, 1}; - private static final int[] BIT2_TABLE = {1, 1, 1, 1, 0, 0, 0, 1, 0}; - private static final int[] BIT3_TABLE = {1, 0, 1, 0, 0, 1, 1, 1, 0}; - - /** - * Encodes an int array whose elements are between 0 and q, - * to a byte array leaving no gaps between bits.
    - * q must be a power of 2. - * - * @param a the input array - * @param q the modulus - * @return the encoded array - */ - public static byte[] encodeModQ(int[] a, int q) - { - int bitsPerCoeff = 31 - Integer.numberOfLeadingZeros(q); - int numBits = a.length * bitsPerCoeff; - int numBytes = (numBits + 7) / 8; - byte[] data = new byte[numBytes]; - int bitIndex = 0; - int byteIndex = 0; - for (int i = 0; i < a.length; i++) - { - for (int j = 0; j < bitsPerCoeff; j++) - { - int currentBit = (a[i] >> j) & 1; - data[byteIndex] |= currentBit << bitIndex; - if (bitIndex == 7) - { - bitIndex = 0; - byteIndex++; - } - else - { - bitIndex++; - } - } - } - return data; - } - - /** - * Decodes a byte array encoded with {@link #encodeModQ(int[], int)} back to an int array.
    - * N is the number of coefficients. q must be a power of 2.
    - * Ignores any excess bytes. - * - * @param data an encoded ternary polynomial - * @param N number of coefficients - * @param q - * @return an array containing N coefficients between 0 and q-1 - */ - public static int[] decodeModQ(byte[] data, int N, int q) - { - int[] coeffs = new int[N]; - int bitsPerCoeff = 31 - Integer.numberOfLeadingZeros(q); - int numBits = N * bitsPerCoeff; - int coeffIndex = 0; - for (int bitIndex = 0; bitIndex < numBits; bitIndex++) - { - if (bitIndex > 0 && bitIndex % bitsPerCoeff == 0) - { - coeffIndex++; - } - int bit = getBit(data, bitIndex); - coeffs[coeffIndex] += bit << (bitIndex % bitsPerCoeff); - } - return coeffs; - } - - /** - * Decodes data encoded with {@link #encodeModQ(int[], int)} back to an int array.
    - * N is the number of coefficients. q must be a power of 2.
    - * Ignores any excess bytes. - * - * @param is an encoded ternary polynomial - * @param N number of coefficients - * @param q - * @return the decoded polynomial - */ - public static int[] decodeModQ(InputStream is, int N, int q) - throws IOException - { - int qBits = 31 - Integer.numberOfLeadingZeros(q); - int size = (N * qBits + 7) / 8; - byte[] arr = Util.readFullLength(is, size); - return decodeModQ(arr, N, q); - } - - /** - * Decodes a byte array encoded with {@link #encodeMod3Sves(int[])} back to an int array - * with N coefficients between -1 and 1.
    - * Ignores any excess bytes.
    - * See P1363.1 section 9.2.2. - * - * @param data an encoded ternary polynomial - * @param N number of coefficients - * @return the decoded coefficients - */ - public static int[] decodeMod3Sves(byte[] data, int N) - { - int[] coeffs = new int[N]; - int coeffIndex = 0; - for (int bitIndex = 0; bitIndex < data.length * 8; ) - { - int bit1 = getBit(data, bitIndex++); - int bit2 = getBit(data, bitIndex++); - int bit3 = getBit(data, bitIndex++); - int coeffTableIndex = bit1 * 4 + bit2 * 2 + bit3; - coeffs[coeffIndex++] = COEFF1_TABLE[coeffTableIndex]; - coeffs[coeffIndex++] = COEFF2_TABLE[coeffTableIndex]; - // ignore bytes that can't fit - if (coeffIndex > N - 2) - { - break; - } - } - return coeffs; - } - - /** - * Encodes an int array whose elements are between -1 and 1, to a byte array. - * coeffs[2*i] and coeffs[2*i+1] must not both equal -1 for any integer i, - * so this method is only safe to use with arrays produced by {@link #decodeMod3Sves(byte[], int)}.
    - * See P1363.1 section 9.2.3. - * - * @param arr - * @return the encoded array - */ - public static byte[] encodeMod3Sves(int[] arr) - { - int numBits = (arr.length * 3 + 1) / 2; - int numBytes = (numBits + 7) / 8; - byte[] data = new byte[numBytes]; - int bitIndex = 0; - int byteIndex = 0; - for (int i = 0; i < arr.length / 2 * 2; ) - { // if length is an odd number, throw away the highest coeff - int coeff1 = arr[i++] + 1; - int coeff2 = arr[i++] + 1; - if (coeff1 == 0 && coeff2 == 0) - { - throw new IllegalStateException("Illegal encoding!"); - } - int bitTableIndex = coeff1 * 3 + coeff2; - int[] bits = new int[]{BIT1_TABLE[bitTableIndex], BIT2_TABLE[bitTableIndex], BIT3_TABLE[bitTableIndex]}; - for (int j = 0; j < 3; j++) - { - data[byteIndex] |= bits[j] << bitIndex; - if (bitIndex == 7) - { - bitIndex = 0; - byteIndex++; - } - else - { - bitIndex++; - } - } - } - return data; - } - - /** - * Encodes an int array whose elements are between -1 and 1, to a byte array. - * - * @return the encoded array - */ - public static byte[] encodeMod3Tight(int[] intArray) - { - BigInteger sum = BigInteger.ZERO; - for (int i = intArray.length - 1; i >= 0; i--) - { - sum = sum.multiply(BigInteger.valueOf(3)); - sum = sum.add(BigInteger.valueOf(intArray[i] + 1)); - } - - int size = (BigInteger.valueOf(3).pow(intArray.length).bitLength() + 7) / 8; - byte[] arr = sum.toByteArray(); - - if (arr.length < size) - { - // pad with leading zeros so arr.length==size - byte[] arr2 = new byte[size]; - System.arraycopy(arr, 0, arr2, size - arr.length, arr.length); - return arr2; - } - - if (arr.length > size) - // drop sign bit - { - arr = Arrays.copyOfRange(arr, 1, arr.length); - } - return arr; - } - - /** - * Converts a byte array produced by {@link #encodeMod3Tight(int[])} back to an int array. - * - * @param b a byte array - * @param N number of coefficients - * @return the decoded array - */ - public static int[] decodeMod3Tight(byte[] b, int N) - { - BigInteger sum = new BigInteger(1, b); - int[] coeffs = new int[N]; - for (int i = 0; i < N; i++) - { - coeffs[i] = sum.mod(BigInteger.valueOf(3)).intValue() - 1; - if (coeffs[i] > 1) - { - coeffs[i] -= 3; - } - sum = sum.divide(BigInteger.valueOf(3)); - } - return coeffs; - } - - /** - * Converts data produced by {@link #encodeMod3Tight(int[])} back to an int array. - * - * @param is an input stream containing the data to decode - * @param N number of coefficients - * @return the decoded array - */ - public static int[] decodeMod3Tight(InputStream is, int N) - throws IOException - { - int size = (int)Math.ceil(N * Math.log(3) / Math.log(2) / 8); - byte[] arr = Util.readFullLength(is, size); - return decodeMod3Tight(arr, N); - } - - private static int getBit(byte[] arr, int bitIndex) - { - int byteIndex = bitIndex / 8; - int arrElem = arr[byteIndex] & 0xFF; - return (arrElem >> (bitIndex % 8)) & 1; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/Util.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/Util.java deleted file mode 100644 index a254bf4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/math/ntru/util/Util.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.math.ntru.util; - -import java.io.IOException; -import java.io.InputStream; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.bc.math.ntru.euclid.IntEuclidean; -import org.bc.math.ntru.polynomial.DenseTernaryPolynomial; -import org.bc.math.ntru.polynomial.SparseTernaryPolynomial; -import org.bc.math.ntru.polynomial.TernaryPolynomial; -import org.bc.util.Integers; - -public class Util -{ - private static volatile boolean IS_64_BITNESS_KNOWN; - private static volatile boolean IS_64_BIT_JVM; - - /** - * Calculates the inverse of n mod modulus - */ - public static int invert(int n, int modulus) - { - n %= modulus; - if (n < 0) - { - n += modulus; - } - return IntEuclidean.calculate(n, modulus).x; - } - - /** - * Calculates a^b mod modulus - */ - public static int pow(int a, int b, int modulus) - { - int p = 1; - for (int i = 0; i < b; i++) - { - p = (p * a) % modulus; - } - return p; - } - - /** - * Calculates a^b mod modulus - */ - public static long pow(long a, int b, long modulus) - { - long p = 1; - for (int i = 0; i < b; i++) - { - p = (p * a) % modulus; - } - return p; - } - - /** - * Generates a "sparse" or "dense" polynomial containing numOnes ints equal to 1, - * numNegOnes int equal to -1, and the rest equal to 0. - * - * @param N - * @param numOnes - * @param numNegOnes - * @param sparse whether to create a {@link SparseTernaryPolynomial} or {@link DenseTernaryPolynomial} - * @return a ternary polynomial - */ - public static TernaryPolynomial generateRandomTernary(int N, int numOnes, int numNegOnes, boolean sparse, SecureRandom random) - { - if (sparse) - { - return SparseTernaryPolynomial.generateRandom(N, numOnes, numNegOnes, random); - } - else - { - return DenseTernaryPolynomial.generateRandom(N, numOnes, numNegOnes, random); - } - } - - /** - * Generates an array containing numOnes ints equal to 1, - * numNegOnes int equal to -1, and the rest equal to 0. - * - * @param N - * @param numOnes - * @param numNegOnes - * @return an array of integers - */ - public static int[] generateRandomTernary(int N, int numOnes, int numNegOnes, SecureRandom random) - { - Integer one = Integers.valueOf(1); - Integer minusOne = Integers.valueOf(-1); - Integer zero = Integers.valueOf(0); - - List list = new ArrayList(); - for (int i = 0; i < numOnes; i++) - { - list.add(one); - } - for (int i = 0; i < numNegOnes; i++) - { - list.add(minusOne); - } - while (list.size() < N) - { - list.add(zero); - } - - Collections.shuffle(list, random); - - int[] arr = new int[N]; - for (int i = 0; i < N; i++) - { - arr[i] = ((Integer)list.get(i)).intValue(); - } - return arr; - } - - /** - * Takes an educated guess as to whether 64 bits are supported by the JVM. - * - * @return true if 64-bit support detected, false otherwise - */ - public static boolean is64BitJVM() - { - if (!IS_64_BITNESS_KNOWN) - { - String arch = System.getProperty("os.arch"); - String sunModel = System.getProperty("sun.arch.data.model"); - IS_64_BIT_JVM = "amd64".equals(arch) || "x86_64".equals(arch) || "ppc64".equals(arch) || "64".equals(sunModel); - IS_64_BITNESS_KNOWN = true; - } - return IS_64_BIT_JVM; - } - - /** - * Reads a given number of bytes from an InputStream. - * If there are not enough bytes in the stream, an IOException - * is thrown. - * - * @param is - * @param length - * @return an array of length length - * @throws IOException - */ - public static byte[] readFullLength(InputStream is, int length) - throws IOException - { - byte[] arr = new byte[length]; - if (is.read(arr) != arr.length) - { - throw new IOException("Not enough bytes to read."); - } - return arr; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPrivateKey.java deleted file mode 100644 index 5b420bd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPrivateKey.java +++ /dev/null @@ -1,1314 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; -import java.util.Vector; - -import org.bc.asn1.ASN1Encodable; -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERIA5String; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.asn1.x509.AlgorithmIdentifier; -import org.bc.crypto.Digest; -import org.bc.pqc.crypto.gmss.GMSSLeaf; -import org.bc.pqc.crypto.gmss.GMSSParameters; -import org.bc.pqc.crypto.gmss.GMSSRootCalc; -import org.bc.pqc.crypto.gmss.GMSSRootSig; -import org.bc.pqc.crypto.gmss.Treehash; - -public class GMSSPrivateKey - extends ASN1Object -{ - private ASN1Primitive primitive; - - private GMSSPrivateKey(ASN1Sequence mtsPrivateKey) - { - // --- Decode . - ASN1Sequence indexPart = (ASN1Sequence)mtsPrivateKey.getObjectAt(0); - int[] index = new int[indexPart.size()]; - for (int i = 0; i < indexPart.size(); i++) - { - index[i] = checkBigIntegerInIntRange(indexPart.getObjectAt(i)); - } - - // --- Decode . - ASN1Sequence curSeedsPart = (ASN1Sequence)mtsPrivateKey.getObjectAt(1); - byte[][] curSeeds = new byte[curSeedsPart.size()][]; - for (int i = 0; i < curSeeds.length; i++) - { - curSeeds[i] = ((DEROctetString)curSeedsPart.getObjectAt(i)).getOctets(); - } - - // --- Decode . - ASN1Sequence nextNextSeedsPart = (ASN1Sequence)mtsPrivateKey.getObjectAt(2); - byte[][] nextNextSeeds = new byte[nextNextSeedsPart.size()][]; - for (int i = 0; i < nextNextSeeds.length; i++) - { - nextNextSeeds[i] = ((DEROctetString)nextNextSeedsPart.getObjectAt(i)).getOctets(); - } - - // --- Decode . - ASN1Sequence curAuthPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(3); - ASN1Sequence curAuthPart1; - - byte[][][] curAuth = new byte[curAuthPart0.size()][][]; - for (int i = 0; i < curAuth.length; i++) - { - curAuthPart1 = (ASN1Sequence)curAuthPart0.getObjectAt(i); - curAuth[i] = new byte[curAuthPart1.size()][]; - for (int j = 0; j < curAuth[i].length; j++) - { - curAuth[i][j] = ((DEROctetString)curAuthPart1.getObjectAt(j)).getOctets(); - } - } - - // --- Decode . - ASN1Sequence nextAuthPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(4); - ASN1Sequence nextAuthPart1; - - byte[][][] nextAuth = new byte[nextAuthPart0.size()][][]; - for (int i = 0; i < nextAuth.length; i++) - { - nextAuthPart1 = (ASN1Sequence)nextAuthPart0.getObjectAt(i); - nextAuth[i] = new byte[nextAuthPart1.size()][]; - for (int j = 0; j < nextAuth[i].length; j++) - { - nextAuth[i][j] = ((DEROctetString)nextAuthPart1.getObjectAt(j)).getOctets(); - } - } - - // --- Decode . - ASN1Sequence seqOfcurTreehash0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(5); - ASN1Sequence seqOfcurTreehash1; - ASN1Sequence seqOfcurTreehashStat; - ASN1Sequence seqOfcurTreehashBytes; - ASN1Sequence seqOfcurTreehashInts; - ASN1Sequence seqOfcurTreehashString; - - Treehash[][] curTreehash = new Treehash[seqOfcurTreehash0.size()][]; - /* - for (int i = 0; i < curTreehash.length; i++) - { - seqOfcurTreehash1 = (ASN1Sequence)seqOfcurTreehash0.getObjectAt(i); - curTreehash[i] = new Treehash[seqOfcurTreehash1.size()]; - for (int j = 0; j < curTreehash[i].length; j++) - { - seqOfcurTreehashStat = (ASN1Sequence)seqOfcurTreehash1.getObjectAt(j); - seqOfcurTreehashString = (ASN1Sequence)seqOfcurTreehashStat - .getObjectAt(0); - seqOfcurTreehashBytes = (ASN1Sequence)seqOfcurTreehashStat - .getObjectAt(1); - seqOfcurTreehashInts = (ASN1Sequence)seqOfcurTreehashStat - .getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfcurTreehashString.getObjectAt(0)).getString(); - name[1] = ((DERIA5String)seqOfcurTreehashString.getObjectAt(1)).getString(); - - int tailLength = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(1)); - byte[][] statByte = new byte[3 + tailLength][]; - statByte[0] = ((DEROctetString)seqOfcurTreehashBytes.getObjectAt(0)).getOctets(); - - if (statByte[0].length == 0) - { // if null was encoded - statByte[0] = null; - } - - statByte[1] = ((DEROctetString)seqOfcurTreehashBytes.getObjectAt(1)).getOctets(); - statByte[2] = ((DEROctetString)seqOfcurTreehashBytes.getObjectAt(2)).getOctets(); - for (int k = 0; k < tailLength; k++) - { - statByte[3 + k] = ((DEROctetString)seqOfcurTreehashBytes - .getObjectAt(3 + k)).getOctets(); - } - int[] statInt = new int[6 + tailLength]; - statInt[0] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(0)); - statInt[1] = tailLength; - statInt[2] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(3)); - statInt[4] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(4)); - statInt[5] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(5)); - for (int k = 0; k < tailLength; k++) - { - statInt[6 + k] = checkBigIntegerInIntRange(seqOfcurTreehashInts.getObjectAt(6 + k)); - } - - // TODO: Check if we can do better than throwing away name[1] !!! - curTreehash[i][j] = new Treehash(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - } - - - // --- Decode . - ASN1Sequence seqOfNextTreehash0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(6); - ASN1Sequence seqOfNextTreehash1; - ASN1Sequence seqOfNextTreehashStat; - ASN1Sequence seqOfNextTreehashBytes; - ASN1Sequence seqOfNextTreehashInts; - ASN1Sequence seqOfNextTreehashString; - - Treehash[][] nextTreehash = new Treehash[seqOfNextTreehash0.size()][]; - - for (int i = 0; i < nextTreehash.length; i++) - { - seqOfNextTreehash1 = (ASN1Sequence)seqOfNextTreehash0.getObjectAt(i); - nextTreehash[i] = new Treehash[seqOfNextTreehash1.size()]; - for (int j = 0; j < nextTreehash[i].length; j++) - { - seqOfNextTreehashStat = (ASN1Sequence)seqOfNextTreehash1 - .getObjectAt(j); - seqOfNextTreehashString = (ASN1Sequence)seqOfNextTreehashStat - .getObjectAt(0); - seqOfNextTreehashBytes = (ASN1Sequence)seqOfNextTreehashStat - .getObjectAt(1); - seqOfNextTreehashInts = (ASN1Sequence)seqOfNextTreehashStat - .getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfNextTreehashString.getObjectAt(0)) - .getString(); - name[1] = ((DERIA5String)seqOfNextTreehashString.getObjectAt(1)) - .getString(); - - int tailLength = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(1)); - - byte[][] statByte = new byte[3 + tailLength][]; - statByte[0] = ((DEROctetString)seqOfNextTreehashBytes.getObjectAt(0)).getOctets(); - if (statByte[0].length == 0) - { // if null was encoded - statByte[0] = null; - } - - statByte[1] = ((DEROctetString)seqOfNextTreehashBytes.getObjectAt(1)).getOctets(); - statByte[2] = ((DEROctetString)seqOfNextTreehashBytes.getObjectAt(2)).getOctets(); - for (int k = 0; k < tailLength; k++) - { - statByte[3 + k] = ((DEROctetString)seqOfNextTreehashBytes - .getObjectAt(3 + k)).getOctets(); - } - int[] statInt = new int[6 + tailLength]; - statInt[0] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(0)); - - statInt[1] = tailLength; - statInt[2] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(2)); - - statInt[3] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(3)); - - statInt[4] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(4)); - - statInt[5] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(5)); - - for (int k = 0; k < tailLength; k++) - { - statInt[6 + k] = checkBigIntegerInIntRange(seqOfNextTreehashInts.getObjectAt(6 + k)); - - } - nextTreehash[i][j] = new Treehash(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - } - - - // --- Decode . - ASN1Sequence keepPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(7); - ASN1Sequence keepPart1; - - byte[][][] keep = new byte[keepPart0.size()][][]; - for (int i = 0; i < keep.length; i++) - { - keepPart1 = (ASN1Sequence)keepPart0.getObjectAt(i); - keep[i] = new byte[keepPart1.size()][]; - for (int j = 0; j < keep[i].length; j++) - { - keep[i][j] = ((DEROctetString)keepPart1.getObjectAt(j)).getOctets(); - } - } - - // --- Decode . - ASN1Sequence curStackPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(8); - ASN1Sequence curStackPart1; - - Vector[] curStack = new Vector[curStackPart0.size()]; - for (int i = 0; i < curStack.length; i++) - { - curStackPart1 = (ASN1Sequence)curStackPart0.getObjectAt(i); - curStack[i] = new Vector(); - for (int j = 0; j < curStackPart1.size(); j++) - { - curStack[i].addElement(((DEROctetString)curStackPart1.getObjectAt(j)).getOctets()); - } - } - - // --- Decode . - ASN1Sequence nextStackPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(9); - ASN1Sequence nextStackPart1; - - Vector[] nextStack = new Vector[nextStackPart0.size()]; - for (int i = 0; i < nextStack.length; i++) - { - nextStackPart1 = (ASN1Sequence)nextStackPart0.getObjectAt(i); - nextStack[i] = new Vector(); - for (int j = 0; j < nextStackPart1.size(); j++) - { - nextStack[i].addElement(((DEROctetString)nextStackPart1 - .getObjectAt(j)).getOctets()); - } - } - - // --- Decode . - ASN1Sequence curRetainPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(10); - ASN1Sequence curRetainPart1; - ASN1Sequence curRetainPart2; - - Vector[][] curRetain = new Vector[curRetainPart0.size()][]; - for (int i = 0; i < curRetain.length; i++) - { - curRetainPart1 = (ASN1Sequence)curRetainPart0.getObjectAt(i); - curRetain[i] = new Vector[curRetainPart1.size()]; - for (int j = 0; j < curRetain[i].length; j++) - { - curRetainPart2 = (ASN1Sequence)curRetainPart1.getObjectAt(j); - curRetain[i][j] = new Vector(); - for (int k = 0; k < curRetainPart2.size(); k++) - { - curRetain[i][j] - .addElement(((DEROctetString)curRetainPart2 - .getObjectAt(k)).getOctets()); - } - } - } - - // --- Decode . - ASN1Sequence nextRetainPart0 = (ASN1Sequence)mtsPrivateKey.getObjectAt(11); - ASN1Sequence nextRetainPart1; - ASN1Sequence nextRetainPart2; - - Vector[][] nextRetain = new Vector[nextRetainPart0.size()][]; - for (int i = 0; i < nextRetain.length; i++) - { - nextRetainPart1 = (ASN1Sequence)nextRetainPart0.getObjectAt(i); - nextRetain[i] = new Vector[nextRetainPart1.size()]; - for (int j = 0; j < nextRetain[i].length; j++) - { - nextRetainPart2 = (ASN1Sequence)nextRetainPart1.getObjectAt(j); - nextRetain[i][j] = new Vector(); - for (int k = 0; k < nextRetainPart2.size(); k++) - { - nextRetain[i][j] - .addElement(((DEROctetString)nextRetainPart2 - .getObjectAt(k)).getOctets()); - } - } - } - - // --- Decode . - ASN1Sequence seqOfLeafs = (ASN1Sequence)mtsPrivateKey.getObjectAt(12); - ASN1Sequence seqOfLeafStat; - ASN1Sequence seqOfLeafBytes; - ASN1Sequence seqOfLeafInts; - ASN1Sequence seqOfLeafString; - - GMSSLeaf[] nextNextLeaf = new GMSSLeaf[seqOfLeafs.size()]; - - for (int i = 0; i < nextNextLeaf.length; i++) - { - seqOfLeafStat = (ASN1Sequence)seqOfLeafs.getObjectAt(i); - // nextNextAuth[i]= new byte[nextNextAuthPart1.size()][]; - seqOfLeafString = (ASN1Sequence)seqOfLeafStat.getObjectAt(0); - seqOfLeafBytes = (ASN1Sequence)seqOfLeafStat.getObjectAt(1); - seqOfLeafInts = (ASN1Sequence)seqOfLeafStat.getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfLeafString.getObjectAt(0)).getString(); - name[1] = ((DERIA5String)seqOfLeafString.getObjectAt(1)).getString(); - byte[][] statByte = new byte[4][]; - statByte[0] = ((DEROctetString)seqOfLeafBytes.getObjectAt(0)) - .getOctets(); - statByte[1] = ((DEROctetString)seqOfLeafBytes.getObjectAt(1)) - .getOctets(); - statByte[2] = ((DEROctetString)seqOfLeafBytes.getObjectAt(2)) - .getOctets(); - statByte[3] = ((DEROctetString)seqOfLeafBytes.getObjectAt(3)) - .getOctets(); - int[] statInt = new int[4]; - statInt[0] = checkBigIntegerInIntRange(seqOfLeafInts.getObjectAt(0)); - statInt[1] = checkBigIntegerInIntRange(seqOfLeafInts.getObjectAt(1)); - statInt[2] = checkBigIntegerInIntRange(seqOfLeafInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfLeafInts.getObjectAt(3)); - nextNextLeaf[i] = new GMSSLeaf(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - - // --- Decode . - ASN1Sequence seqOfUpperLeafs = (ASN1Sequence)mtsPrivateKey.getObjectAt(13); - ASN1Sequence seqOfUpperLeafStat; - ASN1Sequence seqOfUpperLeafBytes; - ASN1Sequence seqOfUpperLeafInts; - ASN1Sequence seqOfUpperLeafString; - - GMSSLeaf[] upperLeaf = new GMSSLeaf[seqOfUpperLeafs.size()]; - - for (int i = 0; i < upperLeaf.length; i++) - { - seqOfUpperLeafStat = (ASN1Sequence)seqOfUpperLeafs.getObjectAt(i); - seqOfUpperLeafString = (ASN1Sequence)seqOfUpperLeafStat.getObjectAt(0); - seqOfUpperLeafBytes = (ASN1Sequence)seqOfUpperLeafStat.getObjectAt(1); - seqOfUpperLeafInts = (ASN1Sequence)seqOfUpperLeafStat.getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfUpperLeafString.getObjectAt(0)).getString(); - name[1] = ((DERIA5String)seqOfUpperLeafString.getObjectAt(1)).getString(); - byte[][] statByte = new byte[4][]; - statByte[0] = ((DEROctetString)seqOfUpperLeafBytes.getObjectAt(0)) - .getOctets(); - statByte[1] = ((DEROctetString)seqOfUpperLeafBytes.getObjectAt(1)) - .getOctets(); - statByte[2] = ((DEROctetString)seqOfUpperLeafBytes.getObjectAt(2)) - .getOctets(); - statByte[3] = ((DEROctetString)seqOfUpperLeafBytes.getObjectAt(3)) - .getOctets(); - int[] statInt = new int[4]; - statInt[0] = checkBigIntegerInIntRange(seqOfUpperLeafInts.getObjectAt(0)); - statInt[1] = checkBigIntegerInIntRange(seqOfUpperLeafInts.getObjectAt(1)); - statInt[2] = checkBigIntegerInIntRange(seqOfUpperLeafInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfUpperLeafInts.getObjectAt(3)); - upperLeaf[i] = new GMSSLeaf(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - - // --- Decode . - ASN1Sequence seqOfUpperTHLeafs = (ASN1Sequence)mtsPrivateKey.getObjectAt(14); - ASN1Sequence seqOfUpperTHLeafStat; - ASN1Sequence seqOfUpperTHLeafBytes; - ASN1Sequence seqOfUpperTHLeafInts; - ASN1Sequence seqOfUpperTHLeafString; - - GMSSLeaf[] upperTHLeaf = new GMSSLeaf[seqOfUpperTHLeafs.size()]; - - for (int i = 0; i < upperTHLeaf.length; i++) - { - seqOfUpperTHLeafStat = (ASN1Sequence)seqOfUpperTHLeafs.getObjectAt(i); - seqOfUpperTHLeafString = (ASN1Sequence)seqOfUpperTHLeafStat.getObjectAt(0); - seqOfUpperTHLeafBytes = (ASN1Sequence)seqOfUpperTHLeafStat.getObjectAt(1); - seqOfUpperTHLeafInts = (ASN1Sequence)seqOfUpperTHLeafStat.getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfUpperTHLeafString.getObjectAt(0)) - .getString(); - name[1] = ((DERIA5String)seqOfUpperTHLeafString.getObjectAt(1)) - .getString(); - byte[][] statByte = new byte[4][]; - statByte[0] = ((DEROctetString)seqOfUpperTHLeafBytes.getObjectAt(0)) - .getOctets(); - statByte[1] = ((DEROctetString)seqOfUpperTHLeafBytes.getObjectAt(1)) - .getOctets(); - statByte[2] = ((DEROctetString)seqOfUpperTHLeafBytes.getObjectAt(2)) - .getOctets(); - statByte[3] = ((DEROctetString)seqOfUpperTHLeafBytes.getObjectAt(3)) - .getOctets(); - int[] statInt = new int[4]; - statInt[0] = checkBigIntegerInIntRange(seqOfUpperTHLeafInts.getObjectAt(0)); - statInt[1] = checkBigIntegerInIntRange(seqOfUpperTHLeafInts.getObjectAt(1)); - statInt[2] = checkBigIntegerInIntRange(seqOfUpperTHLeafInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfUpperTHLeafInts.getObjectAt(3)); - upperTHLeaf[i] = new GMSSLeaf(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - - // --- Decode . - ASN1Sequence minTreehashPart = (ASN1Sequence)mtsPrivateKey.getObjectAt(15); - int[] minTreehash = new int[minTreehashPart.size()]; - for (int i = 0; i < minTreehashPart.size(); i++) - { - minTreehash[i] = checkBigIntegerInIntRange(minTreehashPart.getObjectAt(i)); - } - - // --- Decode . - ASN1Sequence seqOfnextRoots = (ASN1Sequence)mtsPrivateKey.getObjectAt(16); - byte[][] nextRoot = new byte[seqOfnextRoots.size()][]; - for (int i = 0; i < nextRoot.length; i++) - { - nextRoot[i] = ((DEROctetString)seqOfnextRoots.getObjectAt(i)) - .getOctets(); - } - - // --- Decode . - ASN1Sequence seqOfnextNextRoot = (ASN1Sequence)mtsPrivateKey.getObjectAt(17); - ASN1Sequence seqOfnextNextRootStat; - ASN1Sequence seqOfnextNextRootBytes; - ASN1Sequence seqOfnextNextRootInts; - ASN1Sequence seqOfnextNextRootString; - ASN1Sequence seqOfnextNextRootTreeH; - ASN1Sequence seqOfnextNextRootRetain; - - GMSSRootCalc[] nextNextRoot = new GMSSRootCalc[seqOfnextNextRoot.size()]; - - for (int i = 0; i < nextNextRoot.length; i++) - { - seqOfnextNextRootStat = (ASN1Sequence)seqOfnextNextRoot.getObjectAt(i); - seqOfnextNextRootString = (ASN1Sequence)seqOfnextNextRootStat - .getObjectAt(0); - seqOfnextNextRootBytes = (ASN1Sequence)seqOfnextNextRootStat - .getObjectAt(1); - seqOfnextNextRootInts = (ASN1Sequence)seqOfnextNextRootStat.getObjectAt(2); - seqOfnextNextRootTreeH = (ASN1Sequence)seqOfnextNextRootStat - .getObjectAt(3); - seqOfnextNextRootRetain = (ASN1Sequence)seqOfnextNextRootStat - .getObjectAt(4); - - // decode treehash of nextNextRoot - // --------------------------------- - ASN1Sequence seqOfnextNextRootTreeHStat; - ASN1Sequence seqOfnextNextRootTreeHBytes; - ASN1Sequence seqOfnextNextRootTreeHInts; - ASN1Sequence seqOfnextNextRootTreeHString; - - Treehash[] nnRTreehash = new Treehash[seqOfnextNextRootTreeH.size()]; - - for (int k = 0; k < nnRTreehash.length; k++) - { - seqOfnextNextRootTreeHStat = (ASN1Sequence)seqOfnextNextRootTreeH - .getObjectAt(k); - seqOfnextNextRootTreeHString = (ASN1Sequence)seqOfnextNextRootTreeHStat - .getObjectAt(0); - seqOfnextNextRootTreeHBytes = (ASN1Sequence)seqOfnextNextRootTreeHStat - .getObjectAt(1); - seqOfnextNextRootTreeHInts = (ASN1Sequence)seqOfnextNextRootTreeHStat - .getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfnextNextRootTreeHString.getObjectAt(0)) - .getString(); - name[1] = ((DERIA5String)seqOfnextNextRootTreeHString.getObjectAt(1)) - .getString(); - - int tailLength = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(1)); - - byte[][] statByte = new byte[3 + tailLength][]; - statByte[0] = ((DEROctetString)seqOfnextNextRootTreeHBytes - .getObjectAt(0)).getOctets(); - if (statByte[0].length == 0) - { // if null was encoded - statByte[0] = null; - } - - statByte[1] = ((DEROctetString)seqOfnextNextRootTreeHBytes - .getObjectAt(1)).getOctets(); - statByte[2] = ((DEROctetString)seqOfnextNextRootTreeHBytes - .getObjectAt(2)).getOctets(); - for (int j = 0; j < tailLength; j++) - { - statByte[3 + j] = ((DEROctetString)seqOfnextNextRootTreeHBytes - .getObjectAt(3 + j)).getOctets(); - } - int[] statInt = new int[6 + tailLength]; - statInt[0] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(0)); - - statInt[1] = tailLength; - statInt[2] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(2)); - - statInt[3] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(3)); - - statInt[4] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(4)); - - statInt[5] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts.getObjectAt(5)); - - for (int j = 0; j < tailLength; j++) - { - statInt[6 + j] = checkBigIntegerInIntRange(seqOfnextNextRootTreeHInts - .getObjectAt(6 + j)); - } - nnRTreehash[k] = new Treehash(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - // --------------------------------- - - // decode retain of nextNextRoot - // --------------------------------- - // ASN1Sequence seqOfnextNextRootRetainPart0 = - // (ASN1Sequence)seqOfnextNextRootRetain.get(0); - ASN1Sequence seqOfnextNextRootRetainPart1; - - Vector[] nnRRetain = new Vector[seqOfnextNextRootRetain.size()]; - for (int j = 0; j < nnRRetain.length; j++) - { - seqOfnextNextRootRetainPart1 = (ASN1Sequence)seqOfnextNextRootRetain - .getObjectAt(j); - nnRRetain[j] = new Vector(); - for (int k = 0; k < seqOfnextNextRootRetainPart1.size(); k++) - { - nnRRetain[j] - .addElement(((DEROctetString)seqOfnextNextRootRetainPart1 - .getObjectAt(k)).getOctets()); - } - } - // --------------------------------- - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfnextNextRootString.getObjectAt(0)) - .getString(); - name[1] = ((DERIA5String)seqOfnextNextRootString.getObjectAt(1)) - .getString(); - - int heightOfTree = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(0)); - int tailLength = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(7)); - byte[][] statByte = new byte[1 + heightOfTree + tailLength][]; - statByte[0] = ((DEROctetString)seqOfnextNextRootBytes.getObjectAt(0)) - .getOctets(); - for (int j = 0; j < heightOfTree; j++) - { - statByte[1 + j] = ((DEROctetString)seqOfnextNextRootBytes - .getObjectAt(1 + j)).getOctets(); - } - for (int j = 0; j < tailLength; j++) - { - statByte[1 + heightOfTree + j] = ((DEROctetString)seqOfnextNextRootBytes - .getObjectAt(1 + heightOfTree + j)).getOctets(); - } - int[] statInt = new int[8 + heightOfTree + tailLength]; - statInt[0] = heightOfTree; - statInt[1] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(1)); - statInt[2] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(3)); - statInt[4] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(4)); - statInt[5] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(5)); - statInt[6] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(6)); - statInt[7] = tailLength; - for (int j = 0; j < heightOfTree; j++) - { - statInt[8 + j] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(8 + j)); - } - for (int j = 0; j < tailLength; j++) - { - statInt[8 + heightOfTree + j] = checkBigIntegerInIntRange(seqOfnextNextRootInts.getObjectAt(8 - + heightOfTree + j)); - } - nextNextRoot[i] = new GMSSRootCalc(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt, - nnRTreehash, nnRRetain); - } - - // --- Decode . - ASN1Sequence seqOfcurRootSig = (ASN1Sequence)mtsPrivateKey.getObjectAt(18); - byte[][] curRootSig = new byte[seqOfcurRootSig.size()][]; - for (int i = 0; i < curRootSig.length; i++) - { - curRootSig[i] = ((DEROctetString)seqOfcurRootSig.getObjectAt(i)) - .getOctets(); - } - - // --- Decode . - ASN1Sequence seqOfnextRootSigs = (ASN1Sequence)mtsPrivateKey.getObjectAt(19); - ASN1Sequence seqOfnRSStats; - ASN1Sequence seqOfnRSStrings; - ASN1Sequence seqOfnRSInts; - ASN1Sequence seqOfnRSBytes; - - GMSSRootSig[] nextRootSig = new GMSSRootSig[seqOfnextRootSigs.size()]; - - for (int i = 0; i < nextRootSig.length; i++) - { - seqOfnRSStats = (ASN1Sequence)seqOfnextRootSigs.getObjectAt(i); - // nextNextAuth[i]= new byte[nextNextAuthPart1.size()][]; - seqOfnRSStrings = (ASN1Sequence)seqOfnRSStats.getObjectAt(0); - seqOfnRSBytes = (ASN1Sequence)seqOfnRSStats.getObjectAt(1); - seqOfnRSInts = (ASN1Sequence)seqOfnRSStats.getObjectAt(2); - - String[] name = new String[2]; - name[0] = ((DERIA5String)seqOfnRSStrings.getObjectAt(0)).getString(); - name[1] = ((DERIA5String)seqOfnRSStrings.getObjectAt(1)).getString(); - byte[][] statByte = new byte[5][]; - statByte[0] = ((DEROctetString)seqOfnRSBytes.getObjectAt(0)) - .getOctets(); - statByte[1] = ((DEROctetString)seqOfnRSBytes.getObjectAt(1)) - .getOctets(); - statByte[2] = ((DEROctetString)seqOfnRSBytes.getObjectAt(2)) - .getOctets(); - statByte[3] = ((DEROctetString)seqOfnRSBytes.getObjectAt(3)) - .getOctets(); - statByte[4] = ((DEROctetString)seqOfnRSBytes.getObjectAt(4)) - .getOctets(); - int[] statInt = new int[9]; - statInt[0] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(0)); - statInt[1] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(1)); - statInt[2] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(2)); - statInt[3] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(3)); - statInt[4] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(4)); - statInt[5] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(5)); - statInt[6] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(6)); - statInt[7] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(7)); - statInt[8] = checkBigIntegerInIntRange(seqOfnRSInts.getObjectAt(8)); - nextRootSig[i] = new GMSSRootSig(DigestFactory.getDigest(name[0]).getClass(), statByte, statInt); - } - - // --- Decode . - - // TODO: Really check, why there are multiple algorithms, we only - // use the first one!!! - ASN1Sequence namePart = (ASN1Sequence)mtsPrivateKey.getObjectAt(20); - String[] name = new String[namePart.size()]; - for (int i = 0; i < name.length; i++) - { - name[i] = ((DERIA5String)namePart.getObjectAt(i)).getString(); - } - */ - } - - public GMSSPrivateKey(int[] index, byte[][] currentSeed, - byte[][] nextNextSeed, byte[][][] currentAuthPath, - byte[][][] nextAuthPath, Treehash[][] currentTreehash, - Treehash[][] nextTreehash, Vector[] currentStack, - Vector[] nextStack, Vector[][] currentRetain, - Vector[][] nextRetain, byte[][][] keep, GMSSLeaf[] nextNextLeaf, - GMSSLeaf[] upperLeaf, GMSSLeaf[] upperTreehashLeaf, - int[] minTreehash, byte[][] nextRoot, GMSSRootCalc[] nextNextRoot, - byte[][] currentRootSig, GMSSRootSig[] nextRootSig, - GMSSParameters gmssParameterset, AlgorithmIdentifier digestAlg) - { - AlgorithmIdentifier[] names = new AlgorithmIdentifier[] { digestAlg }; - this.primitive = encode(index, currentSeed, nextNextSeed, currentAuthPath, nextAuthPath, keep, currentTreehash, nextTreehash, currentStack, nextStack, currentRetain, nextRetain, nextNextLeaf, upperLeaf, upperTreehashLeaf, minTreehash, nextRoot, nextNextRoot, currentRootSig, nextRootSig, gmssParameterset, names); - } - - - // TODO: change method signature to something more integrated into BouncyCastle - - /** - * @param index tree indices - * @param currentSeeds seed for the generation of private OTS keys for the - * current subtrees (TREE) - * @param nextNextSeeds seed for the generation of private OTS keys for the - * subtrees after next (TREE++) - * @param currentAuthPaths array of current authentication paths (AUTHPATH) - * @param nextAuthPaths array of next authentication paths (AUTHPATH+) - * @param keep keep array for the authPath algorithm - * @param currentTreehash treehash for authPath algorithm of current tree - * @param nextTreehash treehash for authPath algorithm of next tree (TREE+) - * @param currentStack shared stack for authPath algorithm of current tree - * @param nextStack shared stack for authPath algorithm of next tree (TREE+) - * @param currentRetain retain stack for authPath algorithm of current tree - * @param nextRetain retain stack for authPath algorithm of next tree (TREE+) - * @param nextNextLeaf array of upcoming leafs of the tree after next (LEAF++) of - * each layer - * @param upperLeaf needed for precomputation of upper nodes - * @param upperTreehashLeaf needed for precomputation of upper treehash nodes - * @param minTreehash index of next treehash instance to receive an update - * @param nextRoot the roots of the next trees (ROOT+) - * @param nextNextRoot the roots of the tree after next (ROOT++) - * @param currentRootSig array of signatures of the roots of the current subtrees - * (SIG) - * @param nextRootSig array of signatures of the roots of the next subtree - * (SIG+) - * @param gmssParameterset the GMSS Parameterset - * @param algorithms An array of algorithm identifiers, containing the hash function details - */ - private ASN1Primitive encode(int[] index, byte[][] currentSeeds, - byte[][] nextNextSeeds, byte[][][] currentAuthPaths, - byte[][][] nextAuthPaths, byte[][][] keep, - Treehash[][] currentTreehash, Treehash[][] nextTreehash, - Vector[] currentStack, Vector[] nextStack, - Vector[][] currentRetain, Vector[][] nextRetain, - GMSSLeaf[] nextNextLeaf, GMSSLeaf[] upperLeaf, - GMSSLeaf[] upperTreehashLeaf, int[] minTreehash, byte[][] nextRoot, - GMSSRootCalc[] nextNextRoot, byte[][] currentRootSig, - GMSSRootSig[] nextRootSig, GMSSParameters gmssParameterset, - AlgorithmIdentifier[] algorithms) - { - - ASN1EncodableVector result = new ASN1EncodableVector(); - - // --- Encode . - ASN1EncodableVector indexPart = new ASN1EncodableVector(); - for (int i = 0; i < index.length; i++) - { - indexPart.add(new ASN1Integer(index[i])); - } - result.add(new DERSequence(indexPart)); - - // --- Encode . - ASN1EncodableVector curSeedsPart = new ASN1EncodableVector(); - for (int i = 0; i < currentSeeds.length; i++) - { - curSeedsPart.add(new DEROctetString(currentSeeds[i])); - } - result.add(new DERSequence(curSeedsPart)); - - // --- Encode . - ASN1EncodableVector nextNextSeedsPart = new ASN1EncodableVector(); - for (int i = 0; i < nextNextSeeds.length; i++) - { - nextNextSeedsPart.add(new DEROctetString(nextNextSeeds[i])); - } - result.add(new DERSequence(nextNextSeedsPart)); - - // --- Encode . - ASN1EncodableVector curAuthPart0 = new ASN1EncodableVector(); - ASN1EncodableVector curAuthPart1 = new ASN1EncodableVector(); - for (int i = 0; i < currentAuthPaths.length; i++) - { - for (int j = 0; j < currentAuthPaths[i].length; j++) - { - curAuthPart0.add(new DEROctetString(currentAuthPaths[i][j])); - } - curAuthPart1.add(new DERSequence(curAuthPart0)); - curAuthPart0 = new ASN1EncodableVector(); - } - result.add(new DERSequence(curAuthPart1)); - - // --- Encode . - ASN1EncodableVector nextAuthPart0 = new ASN1EncodableVector(); - ASN1EncodableVector nextAuthPart1 = new ASN1EncodableVector(); - for (int i = 0; i < nextAuthPaths.length; i++) - { - for (int j = 0; j < nextAuthPaths[i].length; j++) - { - nextAuthPart0.add(new DEROctetString(nextAuthPaths[i][j])); - } - nextAuthPart1.add(new DERSequence(nextAuthPart0)); - nextAuthPart0 = new ASN1EncodableVector(); - } - result.add(new DERSequence(nextAuthPart1)); - - // --- Encode . - ASN1EncodableVector seqOfTreehash0 = new ASN1EncodableVector(); - ASN1EncodableVector seqOfTreehash1 = new ASN1EncodableVector(); - ASN1EncodableVector seqOfStat = new ASN1EncodableVector(); - ASN1EncodableVector seqOfByte = new ASN1EncodableVector(); - ASN1EncodableVector seqOfInt = new ASN1EncodableVector(); - - for (int i = 0; i < currentTreehash.length; i++) - { - for (int j = 0; j < currentTreehash[i].length; j++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - int tailLength = currentTreehash[i][j].getStatInt()[1]; - - seqOfByte.add(new DEROctetString(currentTreehash[i][j] - .getStatByte()[0])); - seqOfByte.add(new DEROctetString(currentTreehash[i][j] - .getStatByte()[1])); - seqOfByte.add(new DEROctetString(currentTreehash[i][j] - .getStatByte()[2])); - for (int k = 0; k < tailLength; k++) - { - seqOfByte.add(new DEROctetString(currentTreehash[i][j] - .getStatByte()[3 + k])); - } - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - seqOfInt.add(new ASN1Integer( - currentTreehash[i][j].getStatInt()[0])); - seqOfInt.add(new ASN1Integer(tailLength)); - seqOfInt.add(new ASN1Integer( - currentTreehash[i][j].getStatInt()[2])); - seqOfInt.add(new ASN1Integer( - currentTreehash[i][j].getStatInt()[3])); - seqOfInt.add(new ASN1Integer( - currentTreehash[i][j].getStatInt()[4])); - seqOfInt.add(new ASN1Integer( - currentTreehash[i][j].getStatInt()[5])); - for (int k = 0; k < tailLength; k++) - { - seqOfInt.add(new ASN1Integer(currentTreehash[i][j] - .getStatInt()[6 + k])); - } - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfTreehash1.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - seqOfTreehash0.add(new DERSequence(seqOfTreehash1)); - seqOfTreehash1 = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfTreehash0)); - - // --- Encode . - seqOfTreehash0 = new ASN1EncodableVector(); - seqOfTreehash1 = new ASN1EncodableVector(); - seqOfStat = new ASN1EncodableVector(); - seqOfByte = new ASN1EncodableVector(); - seqOfInt = new ASN1EncodableVector(); - - for (int i = 0; i < nextTreehash.length; i++) - { - for (int j = 0; j < nextTreehash[i].length; j++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - int tailLength = nextTreehash[i][j].getStatInt()[1]; - - seqOfByte.add(new DEROctetString(nextTreehash[i][j] - .getStatByte()[0])); - seqOfByte.add(new DEROctetString(nextTreehash[i][j] - .getStatByte()[1])); - seqOfByte.add(new DEROctetString(nextTreehash[i][j] - .getStatByte()[2])); - for (int k = 0; k < tailLength; k++) - { - seqOfByte.add(new DEROctetString(nextTreehash[i][j] - .getStatByte()[3 + k])); - } - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - seqOfInt - .add(new ASN1Integer(nextTreehash[i][j].getStatInt()[0])); - seqOfInt.add(new ASN1Integer(tailLength)); - seqOfInt - .add(new ASN1Integer(nextTreehash[i][j].getStatInt()[2])); - seqOfInt - .add(new ASN1Integer(nextTreehash[i][j].getStatInt()[3])); - seqOfInt - .add(new ASN1Integer(nextTreehash[i][j].getStatInt()[4])); - seqOfInt - .add(new ASN1Integer(nextTreehash[i][j].getStatInt()[5])); - for (int k = 0; k < tailLength; k++) - { - seqOfInt.add(new ASN1Integer(nextTreehash[i][j] - .getStatInt()[6 + k])); - } - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfTreehash1.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - seqOfTreehash0.add(new DERSequence(new DERSequence(seqOfTreehash1))); - seqOfTreehash1 = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfTreehash0)); - - // --- Encode . - ASN1EncodableVector keepPart0 = new ASN1EncodableVector(); - ASN1EncodableVector keepPart1 = new ASN1EncodableVector(); - for (int i = 0; i < keep.length; i++) - { - for (int j = 0; j < keep[i].length; j++) - { - keepPart0.add(new DEROctetString(keep[i][j])); - } - keepPart1.add(new DERSequence(keepPart0)); - keepPart0 = new ASN1EncodableVector(); - } - result.add(new DERSequence(keepPart1)); - - // --- Encode . - ASN1EncodableVector curStackPart0 = new ASN1EncodableVector(); - ASN1EncodableVector curStackPart1 = new ASN1EncodableVector(); - for (int i = 0; i < currentStack.length; i++) - { - for (int j = 0; j < currentStack[i].size(); j++) - { - curStackPart0.add(new DEROctetString((byte[])currentStack[i] - .elementAt(j))); - } - curStackPart1.add(new DERSequence(curStackPart0)); - curStackPart0 = new ASN1EncodableVector(); - } - result.add(new DERSequence(curStackPart1)); - - // --- Encode . - ASN1EncodableVector nextStackPart0 = new ASN1EncodableVector(); - ASN1EncodableVector nextStackPart1 = new ASN1EncodableVector(); - for (int i = 0; i < nextStack.length; i++) - { - for (int j = 0; j < nextStack[i].size(); j++) - { - nextStackPart0.add(new DEROctetString((byte[])nextStack[i] - .elementAt(j))); - } - nextStackPart1.add(new DERSequence(nextStackPart0)); - nextStackPart0 = new ASN1EncodableVector(); - } - result.add(new DERSequence(nextStackPart1)); - - // --- Encode . - ASN1EncodableVector currentRetainPart0 = new ASN1EncodableVector(); - ASN1EncodableVector currentRetainPart1 = new ASN1EncodableVector(); - ASN1EncodableVector currentRetainPart2 = new ASN1EncodableVector(); - for (int i = 0; i < currentRetain.length; i++) - { - for (int j = 0; j < currentRetain[i].length; j++) - { - for (int k = 0; k < currentRetain[i][j].size(); k++) - { - currentRetainPart0.add(new DEROctetString( - (byte[])currentRetain[i][j].elementAt(k))); - } - currentRetainPart1.add(new DERSequence(currentRetainPart0)); - currentRetainPart0 = new ASN1EncodableVector(); - } - currentRetainPart2.add(new DERSequence(currentRetainPart1)); - currentRetainPart1 = new ASN1EncodableVector(); - } - result.add(new DERSequence(currentRetainPart2)); - - // --- Encode . - ASN1EncodableVector nextRetainPart0 = new ASN1EncodableVector(); - ASN1EncodableVector nextRetainPart1 = new ASN1EncodableVector(); - ASN1EncodableVector nextRetainPart2 = new ASN1EncodableVector(); - for (int i = 0; i < nextRetain.length; i++) - { - for (int j = 0; j < nextRetain[i].length; j++) - { - for (int k = 0; k < nextRetain[i][j].size(); k++) - { - nextRetainPart0.add(new DEROctetString( - (byte[])nextRetain[i][j].elementAt(k))); - } - nextRetainPart1.add(new DERSequence(nextRetainPart0)); - nextRetainPart0 = new ASN1EncodableVector(); - } - nextRetainPart2.add(new DERSequence(nextRetainPart1)); - nextRetainPart1 = new ASN1EncodableVector(); - } - result.add(new DERSequence(nextRetainPart2)); - - // --- Encode . - ASN1EncodableVector seqOfLeaf = new ASN1EncodableVector(); - seqOfStat = new ASN1EncodableVector(); - seqOfByte = new ASN1EncodableVector(); - seqOfInt = new ASN1EncodableVector(); - - for (int i = 0; i < nextNextLeaf.length; i++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - byte[][] tempByte = nextNextLeaf[i].getStatByte(); - seqOfByte.add(new DEROctetString(tempByte[0])); - seqOfByte.add(new DEROctetString(tempByte[1])); - seqOfByte.add(new DEROctetString(tempByte[2])); - seqOfByte.add(new DEROctetString(tempByte[3])); - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - int[] tempInt = nextNextLeaf[i].getStatInt(); - seqOfInt.add(new ASN1Integer(tempInt[0])); - seqOfInt.add(new ASN1Integer(tempInt[1])); - seqOfInt.add(new ASN1Integer(tempInt[2])); - seqOfInt.add(new ASN1Integer(tempInt[3])); - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfLeaf.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfLeaf)); - - // --- Encode . - ASN1EncodableVector seqOfUpperLeaf = new ASN1EncodableVector(); - seqOfStat = new ASN1EncodableVector(); - seqOfByte = new ASN1EncodableVector(); - seqOfInt = new ASN1EncodableVector(); - - for (int i = 0; i < upperLeaf.length; i++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - byte[][] tempByte = upperLeaf[i].getStatByte(); - seqOfByte.add(new DEROctetString(tempByte[0])); - seqOfByte.add(new DEROctetString(tempByte[1])); - seqOfByte.add(new DEROctetString(tempByte[2])); - seqOfByte.add(new DEROctetString(tempByte[3])); - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - int[] tempInt = upperLeaf[i].getStatInt(); - seqOfInt.add(new ASN1Integer(tempInt[0])); - seqOfInt.add(new ASN1Integer(tempInt[1])); - seqOfInt.add(new ASN1Integer(tempInt[2])); - seqOfInt.add(new ASN1Integer(tempInt[3])); - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfUpperLeaf.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfUpperLeaf)); - - // encode - ASN1EncodableVector seqOfUpperTreehashLeaf = new ASN1EncodableVector(); - seqOfStat = new ASN1EncodableVector(); - seqOfByte = new ASN1EncodableVector(); - seqOfInt = new ASN1EncodableVector(); - - for (int i = 0; i < upperTreehashLeaf.length; i++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - byte[][] tempByte = upperTreehashLeaf[i].getStatByte(); - seqOfByte.add(new DEROctetString(tempByte[0])); - seqOfByte.add(new DEROctetString(tempByte[1])); - seqOfByte.add(new DEROctetString(tempByte[2])); - seqOfByte.add(new DEROctetString(tempByte[3])); - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - int[] tempInt = upperTreehashLeaf[i].getStatInt(); - seqOfInt.add(new ASN1Integer(tempInt[0])); - seqOfInt.add(new ASN1Integer(tempInt[1])); - seqOfInt.add(new ASN1Integer(tempInt[2])); - seqOfInt.add(new ASN1Integer(tempInt[3])); - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfUpperTreehashLeaf.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfUpperTreehashLeaf)); - - // --- Encode . - ASN1EncodableVector minTreehashPart = new ASN1EncodableVector(); - for (int i = 0; i < minTreehash.length; i++) - { - minTreehashPart.add(new ASN1Integer(minTreehash[i])); - } - result.add(new DERSequence(minTreehashPart)); - - // --- Encode . - ASN1EncodableVector nextRootPart = new ASN1EncodableVector(); - for (int i = 0; i < nextRoot.length; i++) - { - nextRootPart.add(new DEROctetString(nextRoot[i])); - } - result.add(new DERSequence(nextRootPart)); - - // --- Encode . - ASN1EncodableVector seqOfnextNextRoot = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRStats = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRStrings = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRBytes = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRInts = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRTreehash = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnnRRetain = new ASN1EncodableVector(); - - for (int i = 0; i < nextNextRoot.length; i++) - { - seqOfnnRStats.add(new DERSequence(algorithms[0])); - seqOfnnRStrings = new ASN1EncodableVector(); - - int heightOfTree = nextNextRoot[i].getStatInt()[0]; - int tailLength = nextNextRoot[i].getStatInt()[7]; - - seqOfnnRBytes.add(new DEROctetString( - nextNextRoot[i].getStatByte()[0])); - for (int j = 0; j < heightOfTree; j++) - { - seqOfnnRBytes.add(new DEROctetString(nextNextRoot[i] - .getStatByte()[1 + j])); - } - for (int j = 0; j < tailLength; j++) - { - seqOfnnRBytes.add(new DEROctetString(nextNextRoot[i] - .getStatByte()[1 + heightOfTree + j])); - } - - seqOfnnRStats.add(new DERSequence(seqOfnnRBytes)); - seqOfnnRBytes = new ASN1EncodableVector(); - - seqOfnnRInts.add(new ASN1Integer(heightOfTree)); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[1])); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[2])); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[3])); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[4])); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[5])); - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[6])); - seqOfnnRInts.add(new ASN1Integer(tailLength)); - for (int j = 0; j < heightOfTree; j++) - { - seqOfnnRInts.add(new ASN1Integer( - nextNextRoot[i].getStatInt()[8 + j])); - } - for (int j = 0; j < tailLength; j++) - { - seqOfnnRInts.add(new ASN1Integer(nextNextRoot[i].getStatInt()[8 - + heightOfTree + j])); - } - - seqOfnnRStats.add(new DERSequence(seqOfnnRInts)); - seqOfnnRInts = new ASN1EncodableVector(); - - // add treehash of nextNextRoot object - // ---------------------------- - seqOfStat = new ASN1EncodableVector(); - seqOfByte = new ASN1EncodableVector(); - seqOfInt = new ASN1EncodableVector(); - - if (nextNextRoot[i].getTreehash() != null) - { - for (int j = 0; j < nextNextRoot[i].getTreehash().length; j++) - { - seqOfStat.add(new DERSequence(algorithms[0])); - - tailLength = nextNextRoot[i].getTreehash()[j].getStatInt()[1]; - - seqOfByte.add(new DEROctetString(nextNextRoot[i] - .getTreehash()[j].getStatByte()[0])); - seqOfByte.add(new DEROctetString(nextNextRoot[i] - .getTreehash()[j].getStatByte()[1])); - seqOfByte.add(new DEROctetString(nextNextRoot[i] - .getTreehash()[j].getStatByte()[2])); - for (int k = 0; k < tailLength; k++) - { - seqOfByte.add(new DEROctetString(nextNextRoot[i] - .getTreehash()[j].getStatByte()[3 + k])); - } - seqOfStat.add(new DERSequence(seqOfByte)); - seqOfByte = new ASN1EncodableVector(); - - seqOfInt.add(new ASN1Integer( - nextNextRoot[i].getTreehash()[j].getStatInt()[0])); - seqOfInt.add(new ASN1Integer(tailLength)); - seqOfInt.add(new ASN1Integer( - nextNextRoot[i].getTreehash()[j].getStatInt()[2])); - seqOfInt.add(new ASN1Integer( - nextNextRoot[i].getTreehash()[j].getStatInt()[3])); - seqOfInt.add(new ASN1Integer( - nextNextRoot[i].getTreehash()[j].getStatInt()[4])); - seqOfInt.add(new ASN1Integer( - nextNextRoot[i].getTreehash()[j].getStatInt()[5])); - for (int k = 0; k < tailLength; k++) - { - seqOfInt.add(new ASN1Integer(nextNextRoot[i] - .getTreehash()[j].getStatInt()[6 + k])); - } - seqOfStat.add(new DERSequence(seqOfInt)); - seqOfInt = new ASN1EncodableVector(); - - seqOfnnRTreehash.add(new DERSequence(seqOfStat)); - seqOfStat = new ASN1EncodableVector(); - } - } - // ---------------------------- - seqOfnnRStats.add(new DERSequence(seqOfnnRTreehash)); - seqOfnnRTreehash = new ASN1EncodableVector(); - - // encode retain of nextNextRoot - // ---------------------------- - // --- Encode . - currentRetainPart0 = new ASN1EncodableVector(); - if (nextNextRoot[i].getRetain() != null) - { - for (int j = 0; j < nextNextRoot[i].getRetain().length; j++) - { - for (int k = 0; k < nextNextRoot[i].getRetain()[j].size(); k++) - { - currentRetainPart0.add(new DEROctetString( - (byte[])nextNextRoot[i].getRetain()[j] - .elementAt(k))); - } - seqOfnnRRetain.add(new DERSequence(currentRetainPart0)); - currentRetainPart0 = new ASN1EncodableVector(); - } - } - // ---------------------------- - seqOfnnRStats.add(new DERSequence(seqOfnnRRetain)); - seqOfnnRRetain = new ASN1EncodableVector(); - - seqOfnextNextRoot.add(new DERSequence(seqOfnnRStats)); - seqOfnnRStats = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfnextNextRoot)); - - // --- Encode . - ASN1EncodableVector curRootSigPart = new ASN1EncodableVector(); - for (int i = 0; i < currentRootSig.length; i++) - { - curRootSigPart.add(new DEROctetString(currentRootSig[i])); - } - result.add(new DERSequence(curRootSigPart)); - - // --- Encode . - ASN1EncodableVector seqOfnextRootSigs = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnRSStats = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnRSStrings = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnRSBytes = new ASN1EncodableVector(); - ASN1EncodableVector seqOfnRSInts = new ASN1EncodableVector(); - - for (int i = 0; i < nextRootSig.length; i++) - { - seqOfnRSStats.add(new DERSequence(algorithms[0])); - seqOfnRSStrings = new ASN1EncodableVector(); - - seqOfnRSBytes.add(new DEROctetString( - nextRootSig[i].getStatByte()[0])); - seqOfnRSBytes.add(new DEROctetString( - nextRootSig[i].getStatByte()[1])); - seqOfnRSBytes.add(new DEROctetString( - nextRootSig[i].getStatByte()[2])); - seqOfnRSBytes.add(new DEROctetString( - nextRootSig[i].getStatByte()[3])); - seqOfnRSBytes.add(new DEROctetString( - nextRootSig[i].getStatByte()[4])); - - seqOfnRSStats.add(new DERSequence(seqOfnRSBytes)); - seqOfnRSBytes = new ASN1EncodableVector(); - - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[0])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[1])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[2])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[3])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[4])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[5])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[6])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[7])); - seqOfnRSInts.add(new ASN1Integer(nextRootSig[i].getStatInt()[8])); - - seqOfnRSStats.add(new DERSequence(seqOfnRSInts)); - seqOfnRSInts = new ASN1EncodableVector(); - - seqOfnextRootSigs.add(new DERSequence(seqOfnRSStats)); - seqOfnRSStats = new ASN1EncodableVector(); - } - result.add(new DERSequence(seqOfnextRootSigs)); - - // --- Encode . - ASN1EncodableVector parSetPart0 = new ASN1EncodableVector(); - ASN1EncodableVector parSetPart1 = new ASN1EncodableVector(); - ASN1EncodableVector parSetPart2 = new ASN1EncodableVector(); - ASN1EncodableVector parSetPart3 = new ASN1EncodableVector(); - - for (int i = 0; i < gmssParameterset.getHeightOfTrees().length; i++) - { - parSetPart1.add(new ASN1Integer( - gmssParameterset.getHeightOfTrees()[i])); - parSetPart2.add(new ASN1Integer(gmssParameterset - .getWinternitzParameter()[i])); - parSetPart3.add(new ASN1Integer(gmssParameterset.getK()[i])); - } - parSetPart0.add(new ASN1Integer(gmssParameterset.getNumOfLayers())); - parSetPart0.add(new DERSequence(parSetPart1)); - parSetPart0.add(new DERSequence(parSetPart2)); - parSetPart0.add(new DERSequence(parSetPart3)); - result.add(new DERSequence(parSetPart0)); - - // --- Encode . - ASN1EncodableVector namesPart = new ASN1EncodableVector(); - - for (int i = 0; i < algorithms.length; i++) - { - namesPart.add(algorithms[i]); - } - - result.add(new DERSequence(namesPart)); - return new DERSequence(result); - - } - - private static int checkBigIntegerInIntRange(ASN1Encodable a) - { - BigInteger b = ((ASN1Integer)a).getValue(); - if ((b.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0) || - (b.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) < 0)) - { - throw new IllegalArgumentException("BigInteger not in Range: " + b.toString()); - } - return b.intValue(); - } - - - public ASN1Primitive toASN1Primitive() - { - return this.primitive; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPublicKey.java deleted file mode 100644 index 158fdcd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/GMSSPublicKey.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.bc.pqc.asn1; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.util.Arrays; - -/** - * This class implements an ASN.1 encoded GMSS public key. The ASN.1 definition - * of this structure is: - *

    - *

    - *  GMSSPublicKey        ::= SEQUENCE{
    - *      version         INTEGER
    - *      publicKey       OCTET STRING
    - *  }
    - * 
    - */ -public class GMSSPublicKey - extends ASN1Object -{ - private ASN1Integer version; - private byte[] publicKey; - - private GMSSPublicKey(ASN1Sequence seq) - { - if (seq.size() != 2) - { - throw new IllegalArgumentException("size of seq = " + seq.size()); - } - - this.version = ASN1Integer.getInstance(seq.getObjectAt(0)); - this.publicKey = ASN1OctetString.getInstance(seq.getObjectAt(1)).getOctets(); - } - - public GMSSPublicKey(byte[] publicKeyBytes) - { - this.version = new ASN1Integer(0); - this.publicKey = publicKeyBytes; - } - - public static GMSSPublicKey getInstance(Object o) - { - if (o instanceof GMSSPublicKey) - { - return (GMSSPublicKey)o; - } - else if (o != null) - { - return new GMSSPublicKey(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public byte[] getPublicKey() - { - return Arrays.clone(publicKey); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(version); - v.add(new DEROctetString(publicKey)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PrivateKey.java deleted file mode 100644 index 83e1dda..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PrivateKey.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; - - -public class McElieceCCA2PrivateKey - extends ASN1Object -{ - private ASN1ObjectIdentifier oid; - private int n; - private int k; - private byte[] encField; - private byte[] encGp; - private byte[] encP; - private byte[] encH; - private byte[][] encqInv; - - - public McElieceCCA2PrivateKey(ASN1ObjectIdentifier oid, int n, int k, GF2mField field, PolynomialGF2mSmallM goppaPoly, Permutation p, GF2Matrix h, PolynomialGF2mSmallM[] qInv) - { - this.oid = oid; - this.n = n; - this.k = k; - this.encField = field.getEncoded(); - this.encGp = goppaPoly.getEncoded(); - this.encP = p.getEncoded(); - this.encH = h.getEncoded(); - this.encqInv = new byte[qInv.length][]; - - for (int i = 0; i != qInv.length; i++) - { - encqInv[i] = qInv[i].getEncoded(); - } - } - - private McElieceCCA2PrivateKey(ASN1Sequence seq) - { - oid = ((ASN1ObjectIdentifier)seq.getObjectAt(0)); - - BigInteger bigN = ((ASN1Integer)seq.getObjectAt(1)).getValue(); - n = bigN.intValue(); - - BigInteger bigK = ((ASN1Integer)seq.getObjectAt(2)).getValue(); - k = bigK.intValue(); - - encField = ((ASN1OctetString)seq.getObjectAt(3)).getOctets(); - - encGp = ((ASN1OctetString)seq.getObjectAt(4)).getOctets(); - - encP = ((ASN1OctetString)seq.getObjectAt(5)).getOctets(); - - encH = ((ASN1OctetString)seq.getObjectAt(6)).getOctets(); - - ASN1Sequence asnQInv = (ASN1Sequence)seq.getObjectAt(7); - encqInv = new byte[asnQInv.size()][]; - for (int i = 0; i < asnQInv.size(); i++) - { - encqInv[i] = ((ASN1OctetString)asnQInv.getObjectAt(i)).getOctets(); - } - } - - public ASN1ObjectIdentifier getOID() - { - return oid; - } - - public int getN() - { - return n; - } - - public int getK() - { - return k; - } - - public GF2mField getField() - { - return new GF2mField(encField); - } - - public PolynomialGF2mSmallM getGoppaPoly() - { - return new PolynomialGF2mSmallM(this.getField(), encGp); - } - - public Permutation getP() - { - return new Permutation(encP); - } - - public GF2Matrix getH() - { - return new GF2Matrix(encH); - } - - public PolynomialGF2mSmallM[] getQInv() - { - PolynomialGF2mSmallM[] qInv = new PolynomialGF2mSmallM[encqInv.length]; - GF2mField field = this.getField(); - - for (int i = 0; i < encqInv.length; i++) - { - qInv[i] = new PolynomialGF2mSmallM(field, encqInv[i]); - } - - return qInv; - } - - public ASN1Primitive toASN1Primitive() - { - - ASN1EncodableVector v = new ASN1EncodableVector(); - // encode - v.add(oid); - // encode - v.add(new ASN1Integer(n)); - - // encode - v.add(new ASN1Integer(k)); - - // encode - v.add(new DEROctetString(encField)); - - // encode - v.add(new DEROctetString(encGp)); - - // encode

    - v.add(new DEROctetString(encP)); - - // encode - v.add(new DEROctetString(encH)); - - // encode - ASN1EncodableVector asnQInv = new ASN1EncodableVector(); - for (int i = 0; i < encqInv.length; i++) - { - asnQInv.add(new DEROctetString(encqInv[i])); - } - - v.add(new DERSequence(asnQInv)); - - return new DERSequence(v); - } - - public static McElieceCCA2PrivateKey getInstance(Object o) - { - if (o instanceof McElieceCCA2PrivateKey) - { - return (McElieceCCA2PrivateKey)o; - } - else if (o != null) - { - return new McElieceCCA2PrivateKey(ASN1Sequence.getInstance(o)); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PublicKey.java deleted file mode 100644 index 982d7a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McElieceCCA2PublicKey.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.math.linearalgebra.GF2Matrix; - -public class McElieceCCA2PublicKey - extends ASN1Object -{ - private ASN1ObjectIdentifier oid; - private int n; - private int t; - - private byte[] matrixG; - - public McElieceCCA2PublicKey(ASN1ObjectIdentifier oid, int n, int t, GF2Matrix g) - { - this.oid = oid; - this.n = n; - this.t = t; - this.matrixG = g.getEncoded(); - } - - private McElieceCCA2PublicKey(ASN1Sequence seq) - { - oid = ((ASN1ObjectIdentifier)seq.getObjectAt(0)); - BigInteger bigN = ((ASN1Integer)seq.getObjectAt(1)).getValue(); - n = bigN.intValue(); - - BigInteger bigT = ((ASN1Integer)seq.getObjectAt(2)).getValue(); - t = bigT.intValue(); - - matrixG = ((ASN1OctetString)seq.getObjectAt(3)).getOctets(); - } - - public ASN1ObjectIdentifier getOID() - { - return oid; - } - - public int getN() - { - return n; - } - - public int getT() - { - return t; - } - - public GF2Matrix getG() - { - return new GF2Matrix(matrixG); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - // encode - v.add(oid); - - // encode - v.add(new ASN1Integer(n)); - - // encode - v.add(new ASN1Integer(t)); - - // encode - v.add(new DEROctetString(matrixG)); - - return new DERSequence(v); - } - - public static McElieceCCA2PublicKey getInstance(Object o) - { - if (o instanceof McElieceCCA2PublicKey) - { - return (McElieceCCA2PublicKey)o; - } - else if (o != null) - { - return new McElieceCCA2PublicKey(ASN1Sequence.getInstance(o)); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePrivateKey.java deleted file mode 100644 index 4103991..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePrivateKey.java +++ /dev/null @@ -1,197 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; - -public class McEliecePrivateKey - extends ASN1Object -{ - private ASN1ObjectIdentifier oid; - private int n; - private int k; - private byte[] encField; - private byte[] encGp; - private byte[] encSInv; - private byte[] encP1; - private byte[] encP2; - private byte[] encH; - private byte[][] encqInv; - - - public McEliecePrivateKey(ASN1ObjectIdentifier oid, int n, int k, GF2mField field, PolynomialGF2mSmallM goppaPoly, GF2Matrix sInv, Permutation p1, Permutation p2, GF2Matrix h, PolynomialGF2mSmallM[] qInv) - { - this.oid = oid; - this.n = n; - this.k = k; - this.encField = field.getEncoded(); - this.encGp = goppaPoly.getEncoded(); - this.encSInv = sInv.getEncoded(); - this.encP1 = p1.getEncoded(); - this.encP2 = p2.getEncoded(); - this.encH = h.getEncoded(); - this.encqInv = new byte[qInv.length][]; - - for (int i = 0; i != qInv.length; i++) - { - encqInv[i] = qInv[i].getEncoded(); - } - } - - public static McEliecePrivateKey getInstance(Object o) - { - if (o instanceof McEliecePrivateKey) - { - return (McEliecePrivateKey)o; - } - else if (o != null) - { - return new McEliecePrivateKey(ASN1Sequence.getInstance(o)); - } - - return null; - } - - private McEliecePrivateKey(ASN1Sequence seq) - { - // - oid = ((ASN1ObjectIdentifier)seq.getObjectAt(0)); - - BigInteger bigN = ((ASN1Integer)seq.getObjectAt(1)).getValue(); - n = bigN.intValue(); - - BigInteger bigK = ((ASN1Integer)seq.getObjectAt(2)).getValue(); - k = bigK.intValue(); - - encField = ((ASN1OctetString)seq.getObjectAt(3)).getOctets(); - - encGp = ((ASN1OctetString)seq.getObjectAt(4)).getOctets(); - - encSInv = ((ASN1OctetString)seq.getObjectAt(5)).getOctets(); - - encP1 = ((ASN1OctetString)seq.getObjectAt(6)).getOctets(); - - encP2 = ((ASN1OctetString)seq.getObjectAt(7)).getOctets(); - - encH = ((ASN1OctetString)seq.getObjectAt(8)).getOctets(); - - ASN1Sequence asnQInv = (ASN1Sequence)seq.getObjectAt(9); - encqInv = new byte[asnQInv.size()][]; - for (int i = 0; i < asnQInv.size(); i++) - { - encqInv[i] = ((ASN1OctetString)asnQInv.getObjectAt(i)).getOctets(); - } - } - - public ASN1ObjectIdentifier getOID() - { - return oid; - } - - public int getN() - { - return n; - } - - public int getK() - { - return k; - } - - public GF2mField getField() - { - return new GF2mField(encField); - } - - public PolynomialGF2mSmallM getGoppaPoly() - { - return new PolynomialGF2mSmallM(this.getField(), encGp); - } - - public GF2Matrix getSInv() - { - return new GF2Matrix(encSInv); - } - - public Permutation getP1() - { - return new Permutation(encP1); - } - - public Permutation getP2() - { - return new Permutation(encP2); - } - - public GF2Matrix getH() - { - return new GF2Matrix(encH); - } - - public PolynomialGF2mSmallM[] getQInv() - { - PolynomialGF2mSmallM[] qInv = new PolynomialGF2mSmallM[encqInv.length]; - GF2mField field = this.getField(); - - for (int i = 0; i < encqInv.length; i++) - { - qInv[i] = new PolynomialGF2mSmallM(field, encqInv[i]); - } - - return qInv; - } - - public ASN1Primitive toASN1Primitive() - { - - ASN1EncodableVector v = new ASN1EncodableVector(); - // encode - v.add(oid); - // encode - v.add(new ASN1Integer(n)); - - // encode - v.add(new ASN1Integer(k)); - - // encode - v.add(new DEROctetString(encField)); - - // encode - v.add(new DEROctetString(encGp)); - - // encode - v.add(new DEROctetString(encSInv)); - - // encode - v.add(new DEROctetString(encP1)); - - // encode - v.add(new DEROctetString(encP2)); - - // encode - v.add(new DEROctetString(encH)); - - // encode - ASN1EncodableVector asnQInv = new ASN1EncodableVector(); - for (int i = 0; i < encqInv.length; i++) - { - asnQInv.add(new DEROctetString(encqInv[i])); - } - - v.add(new DERSequence(asnQInv)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePublicKey.java deleted file mode 100644 index b9cdfdd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/McEliecePublicKey.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.math.linearalgebra.GF2Matrix; - -public class McEliecePublicKey - extends ASN1Object -{ - - private ASN1ObjectIdentifier oid; - private int n; - private int t; - - private byte[] matrixG; - - public McEliecePublicKey(ASN1ObjectIdentifier oid, int n, int t, GF2Matrix g) - { - this.oid = oid; - this.n = n; - this.t = t; - this.matrixG = g.getEncoded(); - } - - private McEliecePublicKey(ASN1Sequence seq) - { - oid = ((ASN1ObjectIdentifier)seq.getObjectAt(0)); - BigInteger bigN = ((ASN1Integer)seq.getObjectAt(1)).getValue(); - n = bigN.intValue(); - - BigInteger bigT = ((ASN1Integer)seq.getObjectAt(2)).getValue(); - t = bigT.intValue(); - - matrixG = ((ASN1OctetString)seq.getObjectAt(3)).getOctets(); - } - - public ASN1ObjectIdentifier getOID() - { - return oid; - } - - public int getN() - { - return n; - } - - public int getT() - { - return t; - } - - public GF2Matrix getG() - { - return new GF2Matrix(matrixG); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - // encode - v.add(oid); - - // encode - v.add(new ASN1Integer(n)); - - // encode - v.add(new ASN1Integer(t)); - - // encode - v.add(new DEROctetString(matrixG)); - - return new DERSequence(v); - } - - public static McEliecePublicKey getInstance(Object o) - { - if (o instanceof McEliecePublicKey) - { - return (McEliecePublicKey)o; - } - else if (o != null) - { - return new McEliecePublicKey(ASN1Sequence.getInstance(o)); - } - - return null; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/PQCObjectIdentifiers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/PQCObjectIdentifiers.java deleted file mode 100644 index d1d7cbd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/PQCObjectIdentifiers.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.bc.pqc.asn1; - -import org.bc.asn1.ASN1ObjectIdentifier; - -public interface PQCObjectIdentifiers -{ - public static final ASN1ObjectIdentifier rainbow = new ASN1ObjectIdentifier("1.3.6.1.4.1.8301.3.1.3.5.3.2"); - - public static final ASN1ObjectIdentifier rainbowWithSha1 = rainbow.branch("1"); - public static final ASN1ObjectIdentifier rainbowWithSha224 = rainbow.branch("2"); - public static final ASN1ObjectIdentifier rainbowWithSha256 = rainbow.branch("3"); - public static final ASN1ObjectIdentifier rainbowWithSha384 = rainbow.branch("4"); - public static final ASN1ObjectIdentifier rainbowWithSha512 = rainbow.branch("5"); - - public static final ASN1ObjectIdentifier gmss = new ASN1ObjectIdentifier("1.3.6.1.4.1.8301.3.1.3.3"); - - public static final ASN1ObjectIdentifier gmssWithSha1 = gmss.branch("1"); - public static final ASN1ObjectIdentifier gmssWithSha224 = gmss.branch("2"); - public static final ASN1ObjectIdentifier gmssWithSha256 = gmss.branch("3"); - public static final ASN1ObjectIdentifier gmssWithSha384 = gmss.branch("4"); - public static final ASN1ObjectIdentifier gmssWithSha512 = gmss.branch("5"); - - public static final ASN1ObjectIdentifier mcEliece = new ASN1ObjectIdentifier("1.3.6.1.4.1.8301.3.1.3.4.1"); - - public static final ASN1ObjectIdentifier mcElieceCca2 = new ASN1ObjectIdentifier("1.3.6.1.4.1.8301.3.1.3.4.2"); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/ParSet.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/ParSet.java deleted file mode 100644 index 6204b1f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/ParSet.java +++ /dev/null @@ -1,140 +0,0 @@ -package org.bc.pqc.asn1; - -import java.math.BigInteger; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DERSequence; -import org.bc.util.Arrays; - -/** - *

    - *  ParSet              ::= SEQUENCE {
    - *      T               INTEGER
    - *      h               SEQUENCE OF INTEGER
    - *      w               SEQUENCE OF INTEGER
    - *      K               SEQUENCE OF INTEGER
    - *  }
    - * 
    - */ -public class ParSet - extends ASN1Object -{ - private static final BigInteger ZERO = BigInteger.valueOf(0); - - private int t; - private int[] h; - private int[] w; - private int[] k; - - private static int checkBigIntegerInIntRangeAndPositive(BigInteger b) - { - if ((b.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0) || - (b.compareTo(ZERO) <= 0)) - { - throw new IllegalArgumentException("BigInteger not in Range: " + b.toString()); - } - return b.intValue(); - } - - private ParSet(ASN1Sequence seq) - { - if (seq.size() != 4) - { - throw new IllegalArgumentException("sie of seqOfParams = " + seq.size()); - } - BigInteger asn1int = ((ASN1Integer)seq.getObjectAt(0)).getValue(); - - t = checkBigIntegerInIntRangeAndPositive(asn1int); - - ASN1Sequence seqOfPSh = (ASN1Sequence)seq.getObjectAt(1); - ASN1Sequence seqOfPSw = (ASN1Sequence)seq.getObjectAt(2); - ASN1Sequence seqOfPSK = (ASN1Sequence)seq.getObjectAt(3); - - if ((seqOfPSh.size() != t) || - (seqOfPSw.size() != t) || - (seqOfPSK.size() != t)) - { - throw new IllegalArgumentException("invalid size of sequences"); - } - - h = new int[seqOfPSh.size()]; - w = new int[seqOfPSw.size()]; - k = new int[seqOfPSK.size()]; - - for (int i = 0; i < t; i++) - { - h[i] = checkBigIntegerInIntRangeAndPositive((((ASN1Integer)seqOfPSh.getObjectAt(i))).getValue()); - w[i] = checkBigIntegerInIntRangeAndPositive((((ASN1Integer)seqOfPSw.getObjectAt(i))).getValue()); - k[i] = checkBigIntegerInIntRangeAndPositive((((ASN1Integer)seqOfPSK.getObjectAt(i))).getValue()); - } - } - - public ParSet(int t, int[] h, int[] w, int[] k) - { - this.t = t; - this.h = h; - this.w = w; - this.k = k; - } - - public static ParSet getInstance(Object o) - { - if (o instanceof ParSet) - { - return (ParSet)o; - } - else if (o != null) - { - return new ParSet(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public int getT() - { - return t; - } - - public int[] getH() - { - return Arrays.clone(h); - } - - public int[] getW() - { - return Arrays.clone(w); - } - - public int[] getK() - { - return Arrays.clone(k); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector seqOfPSh = new ASN1EncodableVector(); - ASN1EncodableVector seqOfPSw = new ASN1EncodableVector(); - ASN1EncodableVector seqOfPSK = new ASN1EncodableVector(); - - for (int i = 0; i < h.length; i++) - { - seqOfPSh.add(new ASN1Integer(h[i])); - seqOfPSw.add(new ASN1Integer(w[i])); - seqOfPSK.add(new ASN1Integer(k[i])); - } - - ASN1EncodableVector v = new ASN1EncodableVector(); - - v.add(new ASN1Integer(t)); - v.add(new DERSequence(seqOfPSh)); - v.add(new DERSequence(seqOfPSw)); - v.add(new DERSequence(seqOfPSK)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPrivateKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPrivateKey.java deleted file mode 100644 index 5dd1958..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPrivateKey.java +++ /dev/null @@ -1,350 +0,0 @@ -package org.bc.pqc.asn1; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.crypto.rainbow.Layer; -import org.bc.pqc.crypto.rainbow.util.RainbowUtil; - -/** - * Return the key data to encode in the PrivateKeyInfo structure. - *

    - * The ASN.1 definition of the key structure is - *

    - *

    - *   RainbowPrivateKey ::= SEQUENCE {
    - *         CHOICE
    - *         {
    - *         oid        OBJECT IDENTIFIER         -- OID identifying the algorithm
    - *         version    INTEGER                    -- 0
    - *         }
    - *     A1inv      SEQUENCE OF OCTET STRING  -- inversed matrix of L1
    - *     b1         OCTET STRING              -- translation vector of L1
    - *     A2inv      SEQUENCE OF OCTET STRING  -- inversed matrix of L2
    - *     b2         OCTET STRING              -- translation vector of L2
    - *     vi         OCTET STRING              -- num of elmts in each Set S
    - *     layers     SEQUENCE OF Layer         -- layers of F
    - *   }
    - *
    - *   Layer             ::= SEQUENCE OF Poly
    - *
    - *   Poly              ::= SEQUENCE {
    - *     alpha      SEQUENCE OF OCTET STRING
    - *     beta       SEQUENCE OF OCTET STRING
    - *     gamma      OCTET STRING
    - *     eta        INTEGER
    - *   }
    - * 
    - */ -public class RainbowPrivateKey - extends ASN1Object -{ - private ASN1Integer version; - private ASN1ObjectIdentifier oid; - - private byte[][] invA1; - private byte[] b1; - private byte[][] invA2; - private byte[] b2; - private byte[] vi; - private Layer[] layers; - - private RainbowPrivateKey(ASN1Sequence seq) - { - // or version - if (seq.getObjectAt(0) instanceof ASN1Integer) - { - version = ASN1Integer.getInstance(seq.getObjectAt(0)); - } - else - { - oid = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - } - - // - ASN1Sequence asnA1 = (ASN1Sequence)seq.getObjectAt(1); - invA1 = new byte[asnA1.size()][]; - for (int i = 0; i < asnA1.size(); i++) - { - invA1[i] = ((ASN1OctetString)asnA1.getObjectAt(i)).getOctets(); - } - - // - ASN1Sequence asnb1 = (ASN1Sequence)seq.getObjectAt(2); - b1 = ((ASN1OctetString)asnb1.getObjectAt(0)).getOctets(); - - // - ASN1Sequence asnA2 = (ASN1Sequence)seq.getObjectAt(3); - invA2 = new byte[asnA2.size()][]; - for (int j = 0; j < asnA2.size(); j++) - { - invA2[j] = ((ASN1OctetString)asnA2.getObjectAt(j)).getOctets(); - } - - // - ASN1Sequence asnb2 = (ASN1Sequence)seq.getObjectAt(4); - b2 = ((ASN1OctetString)asnb2.getObjectAt(0)).getOctets(); - - // - ASN1Sequence asnvi = (ASN1Sequence)seq.getObjectAt(5); - vi = ((ASN1OctetString)asnvi.getObjectAt(0)).getOctets(); - - // - ASN1Sequence asnLayers = (ASN1Sequence)seq.getObjectAt(6); - - byte[][][][] alphas = new byte[asnLayers.size()][][][]; - byte[][][][] betas = new byte[asnLayers.size()][][][]; - byte[][][] gammas = new byte[asnLayers.size()][][]; - byte[][] etas = new byte[asnLayers.size()][]; - // a layer: - for (int l = 0; l < asnLayers.size(); l++) - { - ASN1Sequence asnLayer = (ASN1Sequence)asnLayers.getObjectAt(l); - - // alphas (num of alpha-2d-array = oi) - ASN1Sequence alphas3d = (ASN1Sequence)asnLayer.getObjectAt(0); - alphas[l] = new byte[alphas3d.size()][][]; - for (int m = 0; m < alphas3d.size(); m++) - { - ASN1Sequence alphas2d = (ASN1Sequence)alphas3d.getObjectAt(m); - alphas[l][m] = new byte[alphas2d.size()][]; - for (int n = 0; n < alphas2d.size(); n++) - { - alphas[l][m][n] = ((ASN1OctetString)alphas2d.getObjectAt(n)).getOctets(); - } - } - - // betas .... - ASN1Sequence betas3d = (ASN1Sequence)asnLayer.getObjectAt(1); - betas[l] = new byte[betas3d.size()][][]; - for (int mb = 0; mb < betas3d.size(); mb++) - { - ASN1Sequence betas2d = (ASN1Sequence)betas3d.getObjectAt(mb); - betas[l][mb] = new byte[betas2d.size()][]; - for (int nb = 0; nb < betas2d.size(); nb++) - { - betas[l][mb][nb] = ((ASN1OctetString)betas2d.getObjectAt(nb)).getOctets(); - } - } - - // gammas ... - ASN1Sequence gammas2d = (ASN1Sequence)asnLayer.getObjectAt(2); - gammas[l] = new byte[gammas2d.size()][]; - for (int mg = 0; mg < gammas2d.size(); mg++) - { - gammas[l][mg] = ((ASN1OctetString)gammas2d.getObjectAt(mg)).getOctets(); - } - - // eta ... - etas[l] = ((ASN1OctetString)asnLayer.getObjectAt(3)).getOctets(); - } - - int numOfLayers = vi.length - 1; - this.layers = new Layer[numOfLayers]; - for (int i = 0; i < numOfLayers; i++) - { - Layer l = new Layer(vi[i], vi[i + 1], RainbowUtil.convertArray(alphas[i]), - RainbowUtil.convertArray(betas[i]), RainbowUtil.convertArray(gammas[i]), RainbowUtil.convertArray(etas[i])); - this.layers[i] = l; - - } - } - - public RainbowPrivateKey(short[][] invA1, short[] b1, short[][] invA2, - short[] b2, int[] vi, Layer[] layers) - { - this.version = new ASN1Integer(1); - this.invA1 = RainbowUtil.convertArray(invA1); - this.b1 = RainbowUtil.convertArray(b1); - this.invA2 = RainbowUtil.convertArray(invA2); - this.b2 = RainbowUtil.convertArray(b2); - this.vi = RainbowUtil.convertIntArray(vi); - this.layers = layers; - } - - public static RainbowPrivateKey getInstance(Object o) - { - if (o instanceof RainbowPrivateKey) - { - return (RainbowPrivateKey)o; - } - else if (o != null) - { - return new RainbowPrivateKey(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - /** - * Getter for the inverse matrix of A1. - * - * @return the A1inv inverse - */ - public short[][] getInvA1() - { - return RainbowUtil.convertArray(invA1); - } - - /** - * Getter for the translation part of the private quadratic map L1. - * - * @return b1 the translation part of L1 - */ - public short[] getB1() - { - return RainbowUtil.convertArray(b1); - } - - /** - * Getter for the translation part of the private quadratic map L2. - * - * @return b2 the translation part of L2 - */ - public short[] getB2() - { - return RainbowUtil.convertArray(b2); - } - - /** - * Getter for the inverse matrix of A2 - * - * @return the A2inv - */ - public short[][] getInvA2() - { - return RainbowUtil.convertArray(invA2); - } - - /** - * Returns the layers contained in the private key - * - * @return layers - */ - public Layer[] getLayers() - { - return this.layers; - } - - /** - * Returns the array of vi-s - * - * @return the vi - */ - public int[] getVi() - { - return RainbowUtil.convertArraytoInt(vi); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - // encode or version - if (version != null) - { - v.add(version); - } - else - { - v.add(oid); - } - - // encode - ASN1EncodableVector asnA1 = new ASN1EncodableVector(); - for (int i = 0; i < invA1.length; i++) - { - asnA1.add(new DEROctetString(invA1[i])); - } - v.add(new DERSequence(asnA1)); - - // encode - ASN1EncodableVector asnb1 = new ASN1EncodableVector(); - asnb1.add(new DEROctetString(b1)); - v.add(new DERSequence(asnb1)); - - // encode - ASN1EncodableVector asnA2 = new ASN1EncodableVector(); - for (int i = 0; i < invA2.length; i++) - { - asnA2.add(new DEROctetString(invA2[i])); - } - v.add(new DERSequence(asnA2)); - - // encode - ASN1EncodableVector asnb2 = new ASN1EncodableVector(); - asnb2.add(new DEROctetString(b2)); - v.add(new DERSequence(asnb2)); - - // encode - ASN1EncodableVector asnvi = new ASN1EncodableVector(); - asnvi.add(new DEROctetString(vi)); - v.add(new DERSequence(asnvi)); - - // encode - ASN1EncodableVector asnLayers = new ASN1EncodableVector(); - // a layer: - for (int l = 0; l < layers.length; l++) - { - ASN1EncodableVector aLayer = new ASN1EncodableVector(); - - // alphas (num of alpha-2d-array = oi) - byte[][][] alphas = RainbowUtil.convertArray(layers[l].getCoeffAlpha()); - ASN1EncodableVector alphas3d = new ASN1EncodableVector(); - for (int i = 0; i < alphas.length; i++) - { - ASN1EncodableVector alphas2d = new ASN1EncodableVector(); - for (int j = 0; j < alphas[i].length; j++) - { - alphas2d.add(new DEROctetString(alphas[i][j])); - } - alphas3d.add(new DERSequence(alphas2d)); - } - aLayer.add(new DERSequence(alphas3d)); - - // betas .... - byte[][][] betas = RainbowUtil.convertArray(layers[l].getCoeffBeta()); - ASN1EncodableVector betas3d = new ASN1EncodableVector(); - for (int i = 0; i < betas.length; i++) - { - ASN1EncodableVector betas2d = new ASN1EncodableVector(); - for (int j = 0; j < betas[i].length; j++) - { - betas2d.add(new DEROctetString(betas[i][j])); - } - betas3d.add(new DERSequence(betas2d)); - } - aLayer.add(new DERSequence(betas3d)); - - // gammas ... - byte[][] gammas = RainbowUtil.convertArray(layers[l].getCoeffGamma()); - ASN1EncodableVector asnG = new ASN1EncodableVector(); - for (int i = 0; i < gammas.length; i++) - { - asnG.add(new DEROctetString(gammas[i])); - } - aLayer.add(new DERSequence(asnG)); - - // eta - aLayer.add(new DEROctetString(RainbowUtil.convertArray(layers[l].getCoeffEta()))); - - // now, layer built up. add it! - asnLayers.add(new DERSequence(aLayer)); - } - - v.add(new DERSequence(asnLayers)); - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPublicKey.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPublicKey.java deleted file mode 100644 index 9050418..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/asn1/RainbowPublicKey.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.bc.pqc.asn1; - -import org.bc.asn1.ASN1EncodableVector; -import org.bc.asn1.ASN1Integer; -import org.bc.asn1.ASN1Object; -import org.bc.asn1.ASN1ObjectIdentifier; -import org.bc.asn1.ASN1OctetString; -import org.bc.asn1.ASN1Primitive; -import org.bc.asn1.ASN1Sequence; -import org.bc.asn1.DEROctetString; -import org.bc.asn1.DERSequence; -import org.bc.pqc.crypto.rainbow.util.RainbowUtil; - -/** - * This class implements an ASN.1 encoded Rainbow public key. The ASN.1 definition - * of this structure is: - *

    - *

    - *       RainbowPublicKey ::= SEQUENCE {
    - *         CHOICE
    - *         {
    - *         oid        OBJECT IDENTIFIER         -- OID identifying the algorithm
    - *         version    INTEGER                    -- 0
    - *         }
    - *         docLength        Integer      	     -- length of the code
    - *         coeffquadratic   SEQUENCE OF OCTET STRING -- quadratic (mixed) coefficients
    - *         coeffsingular	SEQUENCE OF OCTET STRING -- singular coefficients
    - *         coeffscalar	SEQUENCE OF OCTET STRING -- scalar coefficients
    - *       }
    - * 
    - */ -public class RainbowPublicKey - extends ASN1Object -{ - private ASN1Integer version; - private ASN1ObjectIdentifier oid; - private ASN1Integer docLength; - private byte[][] coeffQuadratic; - private byte[][] coeffSingular; - private byte[] coeffScalar; - - private RainbowPublicKey(ASN1Sequence seq) - { - // or version - if (seq.getObjectAt(0) instanceof ASN1Integer) - { - version = ASN1Integer.getInstance(seq.getObjectAt(0)); - } - else - { - oid = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); - } - - docLength = ASN1Integer.getInstance(seq.getObjectAt(1)); - - ASN1Sequence asnCoeffQuad = ASN1Sequence.getInstance(seq.getObjectAt(2)); - coeffQuadratic = new byte[asnCoeffQuad.size()][]; - for (int quadSize = 0; quadSize < asnCoeffQuad.size(); quadSize++) - { - coeffQuadratic[quadSize] = ASN1OctetString.getInstance(asnCoeffQuad.getObjectAt(quadSize)).getOctets(); - } - - ASN1Sequence asnCoeffSing = (ASN1Sequence)seq.getObjectAt(3); - coeffSingular = new byte[asnCoeffSing.size()][]; - for (int singSize = 0; singSize < asnCoeffSing.size(); singSize++) - { - coeffSingular[singSize] = ASN1OctetString.getInstance(asnCoeffSing.getObjectAt(singSize)).getOctets(); - } - - ASN1Sequence asnCoeffScalar = (ASN1Sequence)seq.getObjectAt(4); - coeffScalar = ASN1OctetString.getInstance(asnCoeffScalar.getObjectAt(0)).getOctets(); - } - - public RainbowPublicKey(int docLength, short[][] coeffQuadratic, short[][] coeffSingular, short[] coeffScalar) - { - this.version = new ASN1Integer(0); - this.docLength = new ASN1Integer(docLength); - this.coeffQuadratic = RainbowUtil.convertArray(coeffQuadratic); - this.coeffSingular = RainbowUtil.convertArray(coeffSingular); - this.coeffScalar = RainbowUtil.convertArray(coeffScalar); - } - - public static RainbowPublicKey getInstance(Object o) - { - if (o instanceof RainbowPublicKey) - { - return (RainbowPublicKey)o; - } - else if (o != null) - { - return new RainbowPublicKey(ASN1Sequence.getInstance(o)); - } - - return null; - } - - public ASN1Integer getVersion() - { - return version; - } - - /** - * @return the docLength - */ - public int getDocLength() - { - return this.docLength.getValue().intValue(); - } - - /** - * @return the coeffquadratic - */ - public short[][] getCoeffQuadratic() - { - return RainbowUtil.convertArray(coeffQuadratic); - } - - /** - * @return the coeffsingular - */ - public short[][] getCoeffSingular() - { - return RainbowUtil.convertArray(coeffSingular); - } - - /** - * @return the coeffscalar - */ - public short[] getCoeffScalar() - { - return RainbowUtil.convertArray(coeffScalar); - } - - public ASN1Primitive toASN1Primitive() - { - ASN1EncodableVector v = new ASN1EncodableVector(); - - // encode or version - if (version != null) - { - v.add(version); - } - else - { - v.add(oid); - } - - // encode - v.add(docLength); - - // encode - ASN1EncodableVector asnCoeffQuad = new ASN1EncodableVector(); - for (int i = 0; i < coeffQuadratic.length; i++) - { - asnCoeffQuad.add(new DEROctetString(coeffQuadratic[i])); - } - v.add(new DERSequence(asnCoeffQuad)); - - // encode - ASN1EncodableVector asnCoeffSing = new ASN1EncodableVector(); - for (int i = 0; i < coeffSingular.length; i++) - { - asnCoeffSing.add(new DEROctetString(coeffSingular[i])); - } - v.add(new DERSequence(asnCoeffSing)); - - // encode - ASN1EncodableVector asnCoeffScalar = new ASN1EncodableVector(); - asnCoeffScalar.add(new DEROctetString(coeffScalar)); - v.add(new DERSequence(asnCoeffScalar)); - - - return new DERSequence(v); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/DigestingMessageSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/DigestingMessageSigner.java deleted file mode 100644 index cbaee7d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/DigestingMessageSigner.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.pqc.crypto; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.Signer; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; - - -/** - * Implements the sign and verify functions for a Signature Scheme which can use a hash function. - */ -public class DigestingMessageSigner - implements Signer -{ - private final Digest messDigest; - private final MessageSigner messSigner; - private boolean forSigning; - - public DigestingMessageSigner(MessageSigner messSigner, Digest messDigest) - { - this.messSigner = messSigner; - this.messDigest = messDigest; - } - - public void init(boolean forSigning, - CipherParameters param) - { - - this.forSigning = forSigning; - AsymmetricKeyParameter k; - - if (param instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)param).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)param; - } - - if (forSigning && !k.isPrivate()) - { - throw new IllegalArgumentException("Signing Requires Private Key."); - } - - if (!forSigning && k.isPrivate()) - { - throw new IllegalArgumentException("Verification Requires Public Key."); - } - - reset(); - - messSigner.init(forSigning, param); - } - - - /** - * This function signs the message that has been updated, making use of the - * private key. - * - * @return the signature of the message. - */ - public byte[] generateSignature() - { - if (!forSigning) - { - throw new IllegalStateException("RainbowDigestSigner not initialised for signature generation."); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - - return messSigner.generateSignature(hash); - } - - /** - * This function verifies the signature of the message that has been - * updated, with the aid of the public key. - * - * @param signature the signature of the message is given as a byte array. - * @return true if the signature has been verified, false otherwise. - */ - public boolean verify(byte[] signature) - { - if (forSigning) - { - throw new IllegalStateException("RainbowDigestSigner not initialised for verification"); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - - return messSigner.verifySignature(hash, signature); - - } - - public void update(byte b) - { - messDigest.update(b); - } - - public void update(byte[] in, int off, int len) - { - messDigest.update(in, off, len); - } - - public void reset() - { - messDigest.reset(); - } - - public boolean verifySignature(byte[] signature) - { - return this.verify(signature); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageEncryptor.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageEncryptor.java deleted file mode 100644 index a62d62c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageEncryptor.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.bc.pqc.crypto; - - -import org.bc.crypto.CipherParameters; - -public interface MessageEncryptor -{ - - /** - * - * @param forEncrypting true if we are encrypting a signature, false - * otherwise. - * @param param key parameters for encryption or decryption. - */ - public void init(boolean forEncrypting, CipherParameters param); - - /** - * - * @param message the message to be signed. - * @throws Exception - */ - public byte[] messageEncrypt(byte[] message) throws Exception; - - /** - * - * @param cipher the cipher text of the message - * @throws Exception - */ - public byte[] messageDecrypt(byte[] cipher) throws Exception; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageSigner.java deleted file mode 100644 index 4db35a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/MessageSigner.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bc.pqc.crypto; - -import org.bc.crypto.CipherParameters; - -public interface MessageSigner -{ - /** - * initialise the signer for signature generation or signature - * verification. - * - * @param forSigning true if we are generating a signature, false - * otherwise. - * @param param key parameters for signature generation. - */ - public void init(boolean forSigning, CipherParameters param); - - /** - * sign the passed in message (usually the output of a hash function). - * - * @param message the message to be signed. - * @return the signature of the message - */ - public byte[] generateSignature(byte[] message); - - /** - * verify the message message against the signature values r and s. - * - * @param message the message that was supposed to have been signed. - * @param signature the signature of the message - */ - public boolean verifySignature(byte[] message, byte[] signature); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSDigestProvider.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSDigestProvider.java deleted file mode 100644 index d49e0d1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSDigestProvider.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import org.bc.crypto.Digest; - -public interface GMSSDigestProvider -{ - Digest get(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyGenerationParameters.java deleted file mode 100644 index 4975a5f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyGenerationParameters.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class GMSSKeyGenerationParameters - extends KeyGenerationParameters -{ - - private GMSSParameters params; - - public GMSSKeyGenerationParameters( - SecureRandom random, - GMSSParameters params) - { - // XXX key size? - super(random, 1); - this.params = params; - } - - public GMSSParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyPairGenerator.java deleted file mode 100644 index 15a1ea8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyPairGenerator.java +++ /dev/null @@ -1,477 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.security.SecureRandom; -import java.util.Vector; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.Digest; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.pqc.crypto.gmss.util.WinternitzOTSVerify; -import org.bc.pqc.crypto.gmss.util.WinternitzOTSignature; - - -/** - * This class implements key pair generation of the generalized Merkle signature - * scheme (GMSS). - * - * @see GMSSSigner - */ -public class GMSSKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - /** - * The source of randomness for OTS private key generation - */ - private GMSSRandom gmssRandom; - - /** - * The hash function used for the construction of the authentication trees - */ - private Digest messDigestTree; - - /** - * An array of the seeds for the PRGN (for main tree, and all current - * subtrees) - */ - private byte[][] currentSeeds; - - /** - * An array of seeds for the PRGN (for all subtrees after next) - */ - private byte[][] nextNextSeeds; - - /** - * An array of the RootSignatures - */ - private byte[][] currentRootSigs; - - /** - * Class of hash function to use - */ - private GMSSDigestProvider digestProvider; - - /** - * The length of the seed for the PRNG - */ - private int mdLength; - - /** - * the number of Layers - */ - private int numLayer; - - - /** - * Flag indicating if the class already has been initialized - */ - private boolean initialized = false; - - /** - * Instance of GMSSParameterset - */ - private GMSSParameters gmssPS; - - /** - * An array of the heights of the authentication trees of each layer - */ - private int[] heightOfTrees; - - /** - * An array of the Winternitz parameter 'w' of each layer - */ - private int[] otsIndex; - - /** - * The parameter K needed for the authentication path computation - */ - private int[] K; - - private GMSSKeyGenerationParameters gmssParams; - - /** - * The GMSS OID. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.3"; - - /** - * The standard constructor tries to generate the GMSS algorithm identifier - * with the corresponding OID. - *

    - * - * @param digestProvider provider for digest implementations. - */ - public GMSSKeyPairGenerator(GMSSDigestProvider digestProvider) - { - this.digestProvider = digestProvider; - messDigestTree = digestProvider.get(); - - // set mdLength - this.mdLength = messDigestTree.getDigestSize(); - // construct randomizer - this.gmssRandom = new GMSSRandom(messDigestTree); - - } - - /** - * Generates the GMSS key pair. The public key is an instance of - * JDKGMSSPublicKey, the private key is an instance of JDKGMSSPrivateKey. - * - * @return Key pair containing a JDKGMSSPublicKey and a JDKGMSSPrivateKey - */ - private AsymmetricCipherKeyPair genKeyPair() - { - if (!initialized) - { - initializeDefault(); - } - - // initialize authenticationPaths and treehash instances - byte[][][] currentAuthPaths = new byte[numLayer][][]; - byte[][][] nextAuthPaths = new byte[numLayer - 1][][]; - Treehash[][] currentTreehash = new Treehash[numLayer][]; - Treehash[][] nextTreehash = new Treehash[numLayer - 1][]; - - Vector[] currentStack = new Vector[numLayer]; - Vector[] nextStack = new Vector[numLayer - 1]; - - Vector[][] currentRetain = new Vector[numLayer][]; - Vector[][] nextRetain = new Vector[numLayer - 1][]; - - for (int i = 0; i < numLayer; i++) - { - currentAuthPaths[i] = new byte[heightOfTrees[i]][mdLength]; - currentTreehash[i] = new Treehash[heightOfTrees[i] - K[i]]; - - if (i > 0) - { - nextAuthPaths[i - 1] = new byte[heightOfTrees[i]][mdLength]; - nextTreehash[i - 1] = new Treehash[heightOfTrees[i] - K[i]]; - } - - currentStack[i] = new Vector(); - if (i > 0) - { - nextStack[i - 1] = new Vector(); - } - } - - // initialize roots - byte[][] currentRoots = new byte[numLayer][mdLength]; - byte[][] nextRoots = new byte[numLayer - 1][mdLength]; - // initialize seeds - byte[][] seeds = new byte[numLayer][mdLength]; - // initialize seeds[] by copying starting-seeds of first trees of each - // layer - for (int i = 0; i < numLayer; i++) - { - System.arraycopy(currentSeeds[i], 0, seeds[i], 0, mdLength); - } - - // initialize rootSigs - currentRootSigs = new byte[numLayer - 1][mdLength]; - - // ------------------------- - // ------------------------- - // --- calculation of current authpaths and current rootsigs (AUTHPATHS, - // SIG)------ - // from bottom up to the root - for (int h = numLayer - 1; h >= 0; h--) - { - GMSSRootCalc tree = new GMSSRootCalc(this.heightOfTrees[h], this.K[h], digestProvider); - try - { - // on lowest layer no lower root is available, so just call - // the method with null as first parameter - if (h == numLayer - 1) - { - tree = this.generateCurrentAuthpathAndRoot(null, currentStack[h], seeds[h], h); - } - else - // otherwise call the method with the former computed root - // value - { - tree = this.generateCurrentAuthpathAndRoot(currentRoots[h + 1], currentStack[h], seeds[h], h); - } - - } - catch (Exception e1) - { - e1.printStackTrace(); - } - - // set initial values needed for the private key construction - for (int i = 0; i < heightOfTrees[h]; i++) - { - System.arraycopy(tree.getAuthPath()[i], 0, currentAuthPaths[h][i], 0, mdLength); - } - currentRetain[h] = tree.getRetain(); - currentTreehash[h] = tree.getTreehash(); - System.arraycopy(tree.getRoot(), 0, currentRoots[h], 0, mdLength); - } - - // --- calculation of next authpaths and next roots (AUTHPATHS+, ROOTS+) - // ------ - for (int h = numLayer - 2; h >= 0; h--) - { - GMSSRootCalc tree = this.generateNextAuthpathAndRoot(nextStack[h], seeds[h + 1], h + 1); - - // set initial values needed for the private key construction - for (int i = 0; i < heightOfTrees[h + 1]; i++) - { - System.arraycopy(tree.getAuthPath()[i], 0, nextAuthPaths[h][i], 0, mdLength); - } - nextRetain[h] = tree.getRetain(); - nextTreehash[h] = tree.getTreehash(); - System.arraycopy(tree.getRoot(), 0, nextRoots[h], 0, mdLength); - - // create seed for the Merkle tree after next (nextNextSeeds) - // SEEDs++ - System.arraycopy(seeds[h + 1], 0, this.nextNextSeeds[h], 0, mdLength); - } - // ------------ - - // generate JDKGMSSPublicKey - GMSSPublicKeyParameters publicKey = new GMSSPublicKeyParameters(currentRoots[0], gmssPS); - - // generate the JDKGMSSPrivateKey - GMSSPrivateKeyParameters privateKey = new GMSSPrivateKeyParameters(currentSeeds, nextNextSeeds, currentAuthPaths, - nextAuthPaths, currentTreehash, nextTreehash, currentStack, nextStack, currentRetain, nextRetain, nextRoots, currentRootSigs, gmssPS, digestProvider); - - // return the KeyPair - return (new AsymmetricCipherKeyPair(publicKey, privateKey)); - } - - /** - * calculates the authpath for tree in layer h which starts with seed[h] - * additionally computes the rootSignature of underlaying root - * - * @param currentStack stack used for the treehash instance created by this method - * @param lowerRoot stores the root of the lower tree - * @param seed starting seeds - * @param h actual layer - */ - private GMSSRootCalc generateCurrentAuthpathAndRoot(byte[] lowerRoot, Vector currentStack, byte[] seed, int h) - { - byte[] help = new byte[mdLength]; - - byte[] OTSseed = new byte[mdLength]; - OTSseed = gmssRandom.nextSeed(seed); - - WinternitzOTSignature ots; - - // data structure that constructs the whole tree and stores - // the initial values for treehash, Auth and retain - GMSSRootCalc treeToConstruct = new GMSSRootCalc(this.heightOfTrees[h], this.K[h], digestProvider); - - treeToConstruct.initialize(currentStack); - - // generate the first leaf - if (h == numLayer - 1) - { - ots = new WinternitzOTSignature(OTSseed, digestProvider.get(), otsIndex[h]); - help = ots.getPublicKey(); - } - else - { - // for all layers except the lowest, generate the signature of the - // underlying root - // and reuse this signature to compute the first leaf of acual layer - // more efficiently (by verifiing the signature) - ots = new WinternitzOTSignature(OTSseed, digestProvider.get(), otsIndex[h]); - currentRootSigs[h] = ots.getSignature(lowerRoot); - WinternitzOTSVerify otsver = new WinternitzOTSVerify(digestProvider.get(), otsIndex[h]); - help = otsver.Verify(lowerRoot, currentRootSigs[h]); - } - // update the tree with the first leaf - treeToConstruct.update(help); - - int seedForTreehashIndex = 3; - int count = 0; - - // update the tree 2^(H) - 1 times, from the second to the last leaf - for (int i = 1; i < (1 << this.heightOfTrees[h]); i++) - { - // initialize the seeds for the leaf generation with index 3 * 2^h - if (i == seedForTreehashIndex && count < this.heightOfTrees[h] - this.K[h]) - { - treeToConstruct.initializeTreehashSeed(seed, count); - seedForTreehashIndex *= 2; - count++; - } - - OTSseed = gmssRandom.nextSeed(seed); - ots = new WinternitzOTSignature(OTSseed, digestProvider.get(), otsIndex[h]); - treeToConstruct.update(ots.getPublicKey()); - } - - if (treeToConstruct.wasFinished()) - { - return treeToConstruct; - } - System.err.println("Baum noch nicht fertig konstruiert!!!"); - return null; - } - - /** - * calculates the authpath and root for tree in layer h which starts with - * seed[h] - * - * @param nextStack stack used for the treehash instance created by this method - * @param seed starting seeds - * @param h actual layer - */ - private GMSSRootCalc generateNextAuthpathAndRoot(Vector nextStack, byte[] seed, int h) - { - byte[] OTSseed = new byte[numLayer]; - WinternitzOTSignature ots; - - // data structure that constructs the whole tree and stores - // the initial values for treehash, Auth and retain - GMSSRootCalc treeToConstruct = new GMSSRootCalc(this.heightOfTrees[h], this.K[h], this.digestProvider); - treeToConstruct.initialize(nextStack); - - int seedForTreehashIndex = 3; - int count = 0; - - // update the tree 2^(H) times, from the first to the last leaf - for (int i = 0; i < (1 << this.heightOfTrees[h]); i++) - { - // initialize the seeds for the leaf generation with index 3 * 2^h - if (i == seedForTreehashIndex && count < this.heightOfTrees[h] - this.K[h]) - { - treeToConstruct.initializeTreehashSeed(seed, count); - seedForTreehashIndex *= 2; - count++; - } - - OTSseed = gmssRandom.nextSeed(seed); - ots = new WinternitzOTSignature(OTSseed, digestProvider.get(), otsIndex[h]); - treeToConstruct.update(ots.getPublicKey()); - } - - if (treeToConstruct.wasFinished()) - { - return treeToConstruct; - } - System.err.println("N�chster Baum noch nicht fertig konstruiert!!!"); - return null; - } - - /** - * This method initializes the GMSS KeyPairGenerator using an integer value - * keySize as input. It provides a simple use of the GMSS for - * testing demands. - *

    - * A given keysize of less than 10 creates an amount 2^10 - * signatures. A keySize between 10 and 20 creates 2^20 signatures. Given an - * integer greater than 20 the key pair generator creates 2^40 signatures. - * - * @param keySize Assigns the parameters used for the GMSS signatures. There are - * 3 choices:
    - * 1. keysize <= 10: creates 2^10 signatures using the - * parameterset
    - * P = (2, (5, 5), (3, 3), (3, 3))
    - * 2. keysize > 10 and <= 20: creates 2^20 signatures using the - * parameterset
    - * P = (2, (10, 10), (5, 4), (2, 2))
    - * 3. keysize > 20: creates 2^40 signatures using the - * parameterset
    - * P = (2, (10, 10, 10, 10), (9, 9, 9, 3), (2, 2, 2, 2)) - * @param secureRandom not used by GMSS, the SHA1PRNG of the SUN Provider is always - * used - */ - public void initialize(int keySize, SecureRandom secureRandom) - { - - KeyGenerationParameters kgp; - if (keySize <= 10) - { // create 2^10 keys - int[] defh = {10}; - int[] defw = {3}; - int[] defk = {2}; - // XXX sec random neede? - kgp = new GMSSKeyGenerationParameters(secureRandom, new GMSSParameters(defh.length, defh, defw, defk)); - } - else if (keySize <= 20) - { // create 2^20 keys - int[] defh = {10, 10}; - int[] defw = {5, 4}; - int[] defk = {2, 2}; - kgp = new GMSSKeyGenerationParameters(secureRandom, new GMSSParameters(defh.length, defh, defw, defk)); - } - else - { // create 2^40 keys, keygen lasts around 80 seconds - int[] defh = {10, 10, 10, 10}; - int[] defw = {9, 9, 9, 3}; - int[] defk = {2, 2, 2, 2}; - kgp = new GMSSKeyGenerationParameters(secureRandom, new GMSSParameters(defh.length, defh, defw, defk)); - } - - // call the initializer with the chosen parameters - this.initialize(kgp); - - } - - - /** - * Initalizes the key pair generator using a parameter set as input - */ - public void initialize(KeyGenerationParameters param) - { - - this.gmssParams = (GMSSKeyGenerationParameters)param; - - // generate GMSSParameterset - this.gmssPS = new GMSSParameters(gmssParams.getParameters().getNumOfLayers(), gmssParams.getParameters().getHeightOfTrees(), - gmssParams.getParameters().getWinternitzParameter(), gmssParams.getParameters().getK()); - - this.numLayer = gmssPS.getNumOfLayers(); - this.heightOfTrees = gmssPS.getHeightOfTrees(); - this.otsIndex = gmssPS.getWinternitzParameter(); - this.K = gmssPS.getK(); - - // seeds - this.currentSeeds = new byte[numLayer][mdLength]; - this.nextNextSeeds = new byte[numLayer - 1][mdLength]; - - // construct SecureRandom for initial seed generation - SecureRandom secRan = new SecureRandom(); - - // generation of initial seeds - for (int i = 0; i < numLayer; i++) - { - secRan.nextBytes(currentSeeds[i]); - gmssRandom.nextSeed(currentSeeds[i]); - } - - this.initialized = true; - } - - /** - * This method is called by generateKeyPair() in case that no other - * initialization method has been called by the user - */ - private void initializeDefault() - { - int[] defh = {10, 10, 10, 10}; - int[] defw = {3, 3, 3, 3}; - int[] defk = {2, 2, 2, 2}; - - KeyGenerationParameters kgp = new GMSSKeyGenerationParameters(new SecureRandom(), new GMSSParameters(defh.length, defh, defw, defk)); - this.initialize(kgp); - - } - - public void init(KeyGenerationParameters param) - { - this.initialize(param); - - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - return genKeyPair(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyParameters.java deleted file mode 100644 index 3af78cb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSKeyParameters.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -public class GMSSKeyParameters - extends AsymmetricKeyParameter -{ - private GMSSParameters params; - - public GMSSKeyParameters( - boolean isPrivate, - GMSSParameters params) - { - super(isPrivate); - this.params = params; - } - - public GMSSParameters getParameters() - { - return params; - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSLeaf.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSLeaf.java deleted file mode 100644 index 626bac5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSLeaf.java +++ /dev/null @@ -1,315 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import org.bc.crypto.Digest; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.util.Arrays; -import org.bc.util.encoders.Hex; - - -/** - * This class implements the distributed computation of the public key of the - * Winternitz one-time signature scheme (OTSS). The class is used by the GMSS - * classes for calculation of upcoming leafs. - */ -public class GMSSLeaf -{ - - /** - * The hash function used by the OTS and the PRNG - */ - private Digest messDigestOTS; - - /** - * The length of the message digest and private key - */ - private int mdsize, keysize; - - /** - * The source of randomness for OTS private key generation - */ - private GMSSRandom gmssRandom; - - /** - * Byte array for distributed coputation of the upcoming leaf - */ - private byte[] leaf; - - /** - * Byte array for storing the concatenated hashes of private key parts - */ - private byte[] concHashs; - - /** - * indices for distributed computation - */ - private int i, j; - - /** - * storing 2^w - */ - private int two_power_w; - - /** - * Winternitz parameter w - */ - private int w; - - /** - * the amount of distributed computation steps when updateLeaf is called - */ - private int steps; - - /** - * the internal seed - */ - private byte[] seed; - - /** - * the OTS privateKey parts - */ - byte[] privateKeyOTS; - - /** - * This constructor regenerates a prior GMSSLeaf object - * - * @param digest an array of strings, containing the name of the used hash - * function and PRNG and the name of the corresponding - * provider - * @param otsIndex status bytes - * @param numLeafs status ints - */ - public GMSSLeaf(Digest digest, byte[][] otsIndex, int[] numLeafs) - { - this.i = numLeafs[0]; - this.j = numLeafs[1]; - this.steps = numLeafs[2]; - this.w = numLeafs[3]; - - messDigestOTS = digest; - - gmssRandom = new GMSSRandom(messDigestOTS); - - // calulate keysize for private key and the help array - mdsize = messDigestOTS.getDigestSize(); - int mdsizeBit = mdsize << 3; - int messagesize = (int)Math.ceil((double)(mdsizeBit) / (double)w); - int checksumsize = getLog((messagesize << w) + 1); - this.keysize = messagesize - + (int)Math.ceil((double)checksumsize / (double)w); - this.two_power_w = 1 << w; - - // calculate steps - // ((2^w)-1)*keysize + keysize + 1 / (2^h -1) - - // initialize arrays - this.privateKeyOTS = otsIndex[0]; - this.seed = otsIndex[1]; - this.concHashs = otsIndex[2]; - this.leaf = otsIndex[3]; - } - - /** - * The constructor precomputes some needed variables for distributed leaf - * calculation - * - * @param digest an array of strings, containing the digest of the used hash - * function and PRNG and the digest of the corresponding - * provider - * @param w the winterniz parameter of that tree the leaf is computed - * for - * @param numLeafs the number of leafs of the tree from where the distributed - * computation is called - */ - public GMSSLeaf(Digest digest, int w, int numLeafs) - { - this.w = w; - - messDigestOTS = digest; - - gmssRandom = new GMSSRandom(messDigestOTS); - - // calulate keysize for private key and the help array - mdsize = messDigestOTS.getDigestSize(); - int mdsizeBit = mdsize << 3; - int messagesize = (int)Math.ceil((double)(mdsizeBit) / (double)w); - int checksumsize = getLog((messagesize << w) + 1); - this.keysize = messagesize - + (int)Math.ceil((double)checksumsize / (double)w); - this.two_power_w = 1 << w; - - // calculate steps - // ((2^w)-1)*keysize + keysize + 1 / (2^h -1) - this.steps = (int)Math - .ceil((double)(((1 << w) - 1) * keysize + 1 + keysize) - / (double)(numLeafs)); - - // initialize arrays - this.seed = new byte[mdsize]; - this.leaf = new byte[mdsize]; - this.privateKeyOTS = new byte[mdsize]; - this.concHashs = new byte[mdsize * keysize]; - } - - /** - * initialize the distributed leaf calculation reset i,j and compute OTSseed - * with seed0 - * - * @param seed0 the starting seed - */ - public void initLeafCalc(byte[] seed0) - { - this.i = 0; - this.j = 0; - byte[] dummy = new byte[mdsize]; - System.arraycopy(seed0, 0, dummy, 0, seed.length); - this.seed = gmssRandom.nextSeed(dummy); - } - - /** - * Processes steps steps of distributed leaf calculation - * - * @return true if leaf is completed, else false - */ - public boolean updateLeafCalc() - { - // steps times do - for (int s = 0; s < steps; s++) - { - - if (i == keysize && j == two_power_w - 1) - { // [3] at last hash the - // concatenation - messDigestOTS.update(concHashs, 0, concHashs.length); - leaf = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(leaf, 0); - return true; // leaf fineshed - } - else if (i == 0 || j == two_power_w - 1) - { // [1] at the - // beginning and - // when [2] is - // finished: get the - // next private key - // part - i++; - j = 0; - // get next privKey part - this.privateKeyOTS = gmssRandom.nextSeed(seed); - } - else - { // [2] hash the privKey part - messDigestOTS.update(privateKeyOTS, 0, privateKeyOTS.length); - privateKeyOTS = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(privateKeyOTS, 0); - j++; - if (j == two_power_w - 1) - { // after w hashes add to the - // concatenated array - System.arraycopy(privateKeyOTS, 0, concHashs, mdsize - * (i - 1), mdsize); - } - } - } - - return false; // leaf not finished yet - } - - /** - * Returns the leaf value. - * - * @return the leaf value - */ - public byte[] getLeaf() - { - return Arrays.clone(leaf); - } - - /** - * This method returns the least integer that is greater or equal to the - * logarithm to the base 2 of an integer intValue. - * - * @param intValue an integer - * @return The least integer greater or equal to the logarithm to the base 2 - * of intValue - */ - private int getLog(int intValue) - { - int log = 1; - int i = 2; - while (i < intValue) - { - i <<= 1; - log++; - } - return log; - } - - /** - * Returns the status byte array used by the GMSSPrivateKeyASN.1 class - * - * @return The status bytes - */ - public byte[][] getStatByte() - { - - byte[][] statByte = new byte[4][]; - statByte[0] = new byte[mdsize]; - statByte[1] = new byte[mdsize]; - statByte[2] = new byte[mdsize * keysize]; - statByte[3] = new byte[mdsize]; - statByte[0] = privateKeyOTS; - statByte[1] = seed; - statByte[2] = concHashs; - statByte[3] = leaf; - - return statByte; - } - - /** - * Returns the status int array used by the GMSSPrivateKeyASN.1 class - * - * @return The status ints - */ - public int[] getStatInt() - { - - int[] statInt = new int[4]; - statInt[0] = i; - statInt[1] = j; - statInt[2] = steps; - statInt[3] = w; - return statInt; - } - - /** - * Returns a String representation of the main part of this element - * - * @return a String representation of the main part of this element - */ - public String toString() - { - String out = ""; - - for (int i = 0; i < 4; i++) - { - out = out + this.getStatInt()[i] + " "; - } - out = out + " " + this.mdsize + " " + this.keysize + " " - + this.two_power_w + " "; - - byte[][] temp = this.getStatByte(); - for (int i = 0; i < 4; i++) - { - if (temp[i] != null) - { - out = out + new String(Hex.encode(temp[i])) + " "; - } - else - { - out = out + "null "; - } - } - return out; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSParameters.java deleted file mode 100644 index 001e275..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSParameters.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import org.bc.util.Arrays; - -/** - * This class provides a specification for the GMSS parameters that are used by - * the GMSSKeyPairGenerator and GMSSSignature classes. - * - * @see org.bc.pqc.crypto.gmss.GMSSKeyPairGenerator - */ -public class GMSSParameters -{ - /** - * The number of authentication tree layers. - */ - private int numOfLayers; - - /** - * The height of the authentication trees of each layer. - */ - private int[] heightOfTrees; - - /** - * The Winternitz Parameter 'w' of each layer. - */ - private int[] winternitzParameter; - - /** - * The parameter K needed for the authentication path computation - */ - private int[] K; - - /** - * The constructor for the parameters of the GMSSKeyPairGenerator. - *

    - * - * @param layers the number of authentication tree layers - * @param heightOfTrees the height of the authentication trees - * @param winternitzParameter the Winternitz Parameter 'w' of each layer - * @param K parameter for authpath computation - */ - public GMSSParameters(int layers, int[] heightOfTrees, int[] winternitzParameter, int[] K) - throws IllegalArgumentException - { - init(layers, heightOfTrees, winternitzParameter, K); - } - - private void init(int layers, int[] heightOfTrees, - int[] winternitzParameter, int[] K) - throws IllegalArgumentException - { - boolean valid = true; - String errMsg = ""; - this.numOfLayers = layers; - if ((numOfLayers != winternitzParameter.length) - || (numOfLayers != heightOfTrees.length) - || (numOfLayers != K.length)) - { - valid = false; - errMsg = "Unexpected parameterset format"; - } - for (int i = 0; i < numOfLayers; i++) - { - if ((K[i] < 2) || ((heightOfTrees[i] - K[i]) % 2 != 0)) - { - valid = false; - errMsg = "Wrong parameter K (K >= 2 and H-K even required)!"; - } - - if ((heightOfTrees[i] < 4) || (winternitzParameter[i] < 2)) - { - valid = false; - errMsg = "Wrong parameter H or w (H > 3 and w > 1 required)!"; - } - } - - if (valid) - { - this.heightOfTrees = Arrays.clone(heightOfTrees); - this.winternitzParameter = Arrays.clone(winternitzParameter); - this.K = Arrays.clone(K); - } - else - { - throw new IllegalArgumentException(errMsg); - } - } - - public GMSSParameters(int keySize) - throws IllegalArgumentException - { - if (keySize <= 10) - { // create 2^10 keys - int[] defh = {10}; - int[] defw = {3}; - int[] defk = {2}; - this.init(defh.length, defh, defw, defk); - } - else if (keySize <= 20) - { // create 2^20 keys - int[] defh = {10, 10}; - int[] defw = {5, 4}; - int[] defk = {2, 2}; - this.init(defh.length, defh, defw, defk); - } - else - { // create 2^40 keys, keygen lasts around 80 seconds - int[] defh = {10, 10, 10, 10}; - int[] defw = {9, 9, 9, 3}; - int[] defk = {2, 2, 2, 2}; - this.init(defh.length, defh, defw, defk); - } - } - - /** - * Returns the number of levels of the authentication trees. - * - * @return The number of levels of the authentication trees. - */ - public int getNumOfLayers() - { - return numOfLayers; - } - - /** - * Returns the array of height (for each layer) of the authentication trees - * - * @return The array of height (for each layer) of the authentication trees - */ - public int[] getHeightOfTrees() - { - return Arrays.clone(heightOfTrees); - } - - /** - * Returns the array of WinternitzParameter (for each layer) of the - * authentication trees - * - * @return The array of WinternitzParameter (for each layer) of the - * authentication trees - */ - public int[] getWinternitzParameter() - { - return Arrays.clone(winternitzParameter); - } - - /** - * Returns the parameter K needed for authentication path computation - * - * @return The parameter K needed for authentication path computation - */ - public int[] getK() - { - return Arrays.clone(K); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPrivateKeyParameters.java deleted file mode 100644 index f4a802e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPrivateKeyParameters.java +++ /dev/null @@ -1,1092 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.util.Vector; - -import org.bc.crypto.Digest; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.pqc.crypto.gmss.util.WinternitzOTSignature; - - -/** - * This class provides a specification for a GMSS private key. - */ -public class GMSSPrivateKeyParameters - extends GMSSKeyParameters -{ - - private int[] index; - - private byte[][] currentSeeds; - private byte[][] nextNextSeeds; - - private byte[][][] currentAuthPaths; - private byte[][][] nextAuthPaths; - - private Treehash[][] currentTreehash; - private Treehash[][] nextTreehash; - - private Vector[] currentStack; - private Vector[] nextStack; - - private Vector[][] currentRetain; - private Vector[][] nextRetain; - - private byte[][][] keep; - - private GMSSLeaf[] nextNextLeaf; - private GMSSLeaf[] upperLeaf; - private GMSSLeaf[] upperTreehashLeaf; - - private int[] minTreehash; - - private GMSSParameters gmssPS; - - private byte[][] nextRoot; - private GMSSRootCalc[] nextNextRoot; - - private byte[][] currentRootSig; - private GMSSRootSig[] nextRootSig; - - private GMSSDigestProvider digestProvider; - - - /** - * An array of the heights of the authentication trees of each layer - */ - private int[] heightOfTrees; - - /** - * An array of the Winternitz parameter 'w' of each layer - */ - private int[] otsIndex; - - /** - * The parameter K needed for the authentication path computation - */ - private int[] K; - - /** - * the number of Layers - */ - private int numLayer; - - /** - * The hash function used to construct the authentication trees - */ - private Digest messDigestTrees; - - /** - * The message digest length - */ - private int mdLength; - - /** - * The PRNG used for private key generation - */ - private GMSSRandom gmssRandom; - - - /** - * The number of leafs of one tree of each layer - */ - private int[] numLeafs; - - - /** - * Generates a new GMSS private key - * - * @param currentSeed seed for the generation of private OTS keys for the - * current subtrees - * @param nextNextSeed seed for the generation of private OTS keys for the next - * subtrees - * @param currentAuthPath array of current authentication paths - * @param nextAuthPath array of next authentication paths - * @param currentTreehash array of current treehash instances - * @param nextTreehash array of next treehash instances - * @param currentStack array of current shared stacks - * @param nextStack array of next shared stacks - * @param currentRetain array of current retain stacks - * @param nextRetain array of next retain stacks - * @param nextRoot the roots of the next subtree - * @param currentRootSig array of signatures of the roots of the current subtrees - * @param gmssParameterset the GMSS Parameterset - * @param digest An array of strings, containing the name of the used hash - * function and the name of the corresponding provider - * @see org.bc.pqc.crypto.gmss.GMSSKeyPairGenerator - */ - - public GMSSPrivateKeyParameters(byte[][] currentSeed, byte[][] nextNextSeed, - byte[][][] currentAuthPath, byte[][][] nextAuthPath, - Treehash[][] currentTreehash, Treehash[][] nextTreehash, - Vector[] currentStack, Vector[] nextStack, - Vector[][] currentRetain, Vector[][] nextRetain, byte[][] nextRoot, - byte[][] currentRootSig, GMSSParameters gmssParameterset, - GMSSDigestProvider digestProvider) - { - this(null, currentSeed, nextNextSeed, currentAuthPath, nextAuthPath, - null, currentTreehash, nextTreehash, currentStack, nextStack, - currentRetain, nextRetain, null, null, null, null, nextRoot, - null, currentRootSig, null, gmssParameterset, digestProvider); - } - - /** - * /** - * - * @param index tree indices - * @param currentSeed seed for the generation of private OTS keys for the - * current subtrees (TREE) - * @param nextNextSeed seed for the generation of private OTS keys for the - * subtrees after next (TREE++) - * @param currentAuthPath array of current authentication paths (AUTHPATH) - * @param nextAuthPath array of next authentication paths (AUTHPATH+) - * @param keep keep array for the authPath algorithm - * @param currentTreehash treehash for authPath algorithm of current tree - * @param nextTreehash treehash for authPath algorithm of next tree (TREE+) - * @param currentStack shared stack for authPath algorithm of current tree - * @param nextStack shared stack for authPath algorithm of next tree (TREE+) - * @param currentRetain retain stack for authPath algorithm of current tree - * @param nextRetain retain stack for authPath algorithm of next tree (TREE+) - * @param nextNextLeaf array of upcoming leafs of the tree after next (LEAF++) of - * each layer - * @param upperLeaf needed for precomputation of upper nodes - * @param upperTreehashLeaf needed for precomputation of upper treehash nodes - * @param minTreehash index of next treehash instance to receive an update - * @param nextRoot the roots of the next trees (ROOT+) - * @param nextNextRoot the roots of the tree after next (ROOT++) - * @param currentRootSig array of signatures of the roots of the current subtrees - * (SIG) - * @param nextRootSig array of signatures of the roots of the next subtree - * (SIG+) - * @param gmssParameterset the GMSS Parameterset - * @param digestClass An array of strings, containing the name of the used hash - * function and the name of the corresponding provider - */ - public GMSSPrivateKeyParameters(int[] index, byte[][] currentSeeds, - byte[][] nextNextSeeds, byte[][][] currentAuthPaths, - byte[][][] nextAuthPaths, byte[][][] keep, - Treehash[][] currentTreehash, Treehash[][] nextTreehash, - Vector[] currentStack, Vector[] nextStack, - Vector[][] currentRetain, Vector[][] nextRetain, - GMSSLeaf[] nextNextLeaf, GMSSLeaf[] upperLeaf, - GMSSLeaf[] upperTreehashLeaf, int[] minTreehash, byte[][] nextRoot, - GMSSRootCalc[] nextNextRoot, byte[][] currentRootSig, - GMSSRootSig[] nextRootSig, GMSSParameters gmssParameterset, - GMSSDigestProvider digestProvider) - { - - super(true, gmssParameterset); - - // construct message digest - - this.messDigestTrees = digestProvider.get(); - this.mdLength = messDigestTrees.getDigestSize(); - - - // Parameter - this.gmssPS = gmssParameterset; - this.otsIndex = gmssParameterset.getWinternitzParameter(); - this.K = gmssParameterset.getK(); - this.heightOfTrees = gmssParameterset.getHeightOfTrees(); - // initialize numLayer - this.numLayer = gmssPS.getNumOfLayers(); - - // initialize index if null - if (index == null) - { - this.index = new int[numLayer]; - for (int i = 0; i < numLayer; i++) - { - this.index[i] = 0; - } - } - else - { - this.index = index; - } - - this.currentSeeds = currentSeeds; - this.nextNextSeeds = nextNextSeeds; - - this.currentAuthPaths = currentAuthPaths; - this.nextAuthPaths = nextAuthPaths; - - // initialize keep if null - if (keep == null) - { - this.keep = new byte[numLayer][][]; - for (int i = 0; i < numLayer; i++) - { - this.keep[i] = new byte[(int)Math.floor(heightOfTrees[i] / 2)][mdLength]; - } - } - else - { - this.keep = keep; - } - - // initialize stack if null - if (currentStack == null) - { - this.currentStack = new Vector[numLayer]; - for (int i = 0; i < numLayer; i++) - { - this.currentStack[i] = new Vector(); - } - } - else - { - this.currentStack = currentStack; - } - - // initialize nextStack if null - if (nextStack == null) - { - this.nextStack = new Vector[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - this.nextStack[i] = new Vector(); - } - } - else - { - this.nextStack = nextStack; - } - - this.currentTreehash = currentTreehash; - this.nextTreehash = nextTreehash; - - this.currentRetain = currentRetain; - this.nextRetain = nextRetain; - - this.nextRoot = nextRoot; - - this.digestProvider = digestProvider; - - if (nextNextRoot == null) - { - this.nextNextRoot = new GMSSRootCalc[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - this.nextNextRoot[i] = new GMSSRootCalc( - this.heightOfTrees[i + 1], this.K[i + 1], this.digestProvider); - } - } - else - { - this.nextNextRoot = nextNextRoot; - } - this.currentRootSig = currentRootSig; - - // calculate numLeafs - numLeafs = new int[numLayer]; - for (int i = 0; i < numLayer; i++) - { - numLeafs[i] = 1 << heightOfTrees[i]; - } - // construct PRNG - this.gmssRandom = new GMSSRandom(messDigestTrees); - - if (numLayer > 1) - { - // construct the nextNextLeaf (LEAFs++) array for upcoming leafs in - // tree after next (TREE++) - if (nextNextLeaf == null) - { - this.nextNextLeaf = new GMSSLeaf[numLayer - 2]; - for (int i = 0; i < numLayer - 2; i++) - { - this.nextNextLeaf[i] = new GMSSLeaf(digestProvider.get(), otsIndex[i + 1], numLeafs[i + 2]); - this.nextNextLeaf[i].initLeafCalc(this.nextNextSeeds[i]); - } - } - else - { - this.nextNextLeaf = nextNextLeaf; - } - } - else - { - this.nextNextLeaf = new GMSSLeaf[0]; - } - - // construct the upperLeaf array for upcoming leafs in tree over the - // actual - if (upperLeaf == null) - { - this.upperLeaf = new GMSSLeaf[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - this.upperLeaf[i] = new GMSSLeaf(digestProvider.get(), otsIndex[i], - numLeafs[i + 1]); - this.upperLeaf[i].initLeafCalc(this.currentSeeds[i]); - } - } - else - { - this.upperLeaf = upperLeaf; - } - - // construct the leafs for upcoming leafs in treehashs in tree over the - // actual - if (upperTreehashLeaf == null) - { - this.upperTreehashLeaf = new GMSSLeaf[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - this.upperTreehashLeaf[i] = new GMSSLeaf(digestProvider.get(), otsIndex[i], - numLeafs[i + 1]); - } - } - else - { - this.upperTreehashLeaf = upperTreehashLeaf; - } - - if (minTreehash == null) - { - this.minTreehash = new int[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - this.minTreehash[i] = -1; - } - } - else - { - this.minTreehash = minTreehash; - } - - // construct the nextRootSig (RootSig++) - byte[] dummy = new byte[mdLength]; - byte[] OTSseed = new byte[mdLength]; - if (nextRootSig == null) - { - this.nextRootSig = new GMSSRootSig[numLayer - 1]; - for (int i = 0; i < numLayer - 1; i++) - { - System.arraycopy(currentSeeds[i], 0, dummy, 0, mdLength); - gmssRandom.nextSeed(dummy); - OTSseed = gmssRandom.nextSeed(dummy); - this.nextRootSig[i] = new GMSSRootSig(digestProvider.get(), otsIndex[i], - heightOfTrees[i + 1]); - this.nextRootSig[i].initSign(OTSseed, nextRoot[i]); - } - } - else - { - this.nextRootSig = nextRootSig; - } - } - - /** - * This method updates the GMSS private key for the next signature - * - * @param layer the layer where the next key is processed - */ - public void nextKey(int layer) - { - // only for lowest layer ( other layers indices are raised in nextTree() - // method ) - if (layer == numLayer - 1) - { - index[layer]++; - } // else System.out.println(" --- nextKey on layer " + layer + " - // index is now : " + index[layer]); - - // if tree of this layer is depleted - if (index[layer] == numLeafs[layer]) - { - if (numLayer != 1) - { - nextTree(layer); - index[layer] = 0; - } - } - else - { - updateKey(layer); - } - } - - /** - * Switch to next subtree if the current one is depleted - * - * @param layer the layer where the next tree is processed - */ - private void nextTree(int layer) - { - // System.out.println("NextTree method called on layer " + layer); - // dont create next tree for the top layer - if (layer > 0) - { - // raise index for upper layer - index[layer - 1]++; - - // test if it is already the last tree - boolean lastTree = true; - int z = layer; - do - { - z--; - if (index[z] < numLeafs[z]) - { - lastTree = false; - } - } - while (lastTree && (z > 0)); - - // only construct next subtree if last one is not already in use - if (!lastTree) - { - gmssRandom.nextSeed(currentSeeds[layer]); - - // last step of distributed signature calculation - nextRootSig[layer - 1].updateSign(); - - // last step of distributed leaf calculation for nextNextLeaf - if (layer > 1) - { - nextNextLeaf[layer - 1 - 1].updateLeafCalc(); - } - - // last step of distributed leaf calculation for upper leaf - upperLeaf[layer - 1].updateLeafCalc(); - - // last step of distributed leaf calculation for all treehashs - - if (minTreehash[layer - 1] >= 0) - { - this.upperTreehashLeaf[layer - 1].updateLeafCalc(); - byte[] leaf = this.upperTreehashLeaf[layer - 1].getLeaf(); - // if update is required use the precomputed leaf to update - // treehash - try - { - currentTreehash[layer - 1][minTreehash[layer - 1]] - .update(this.gmssRandom, leaf); - // System.out.println("UUUpdated TH " + - // minTreehash[layer - 1]); - if (currentTreehash[layer - 1][minTreehash[layer - 1]] - .wasFinished()) - { - // System.out.println("FFFinished TH " + - // minTreehash[layer - 1]); - } - } - catch (Exception e) - { - System.out.println(e); - } - } - - // last step of nextNextAuthRoot calculation - this.updateNextNextAuthRoot(layer); - - // ******************************************************** / - - // NOW: advance to next tree on layer 'layer' - - // NextRootSig --> currentRootSigs - this.currentRootSig[layer - 1] = nextRootSig[layer - 1] - .getSig(); - - // ----------------------- - - // nextTreehash --> currentTreehash - // nextNextTreehash --> nextTreehash - for (int i = 0; i < heightOfTrees[layer] - K[layer]; i++) - { - this.currentTreehash[layer][i] = this.nextTreehash[layer - 1][i]; - this.nextTreehash[layer - 1][i] = this.nextNextRoot[layer - 1] - .getTreehash()[i]; - } - - // NextAuthPath --> currentAuthPath - // nextNextAuthPath --> nextAuthPath - for (int i = 0; i < heightOfTrees[layer]; i++) - { - System.arraycopy(nextAuthPaths[layer - 1][i], 0, - currentAuthPaths[layer][i], 0, mdLength); - System.arraycopy(nextNextRoot[layer - 1].getAuthPath()[i], - 0, nextAuthPaths[layer - 1][i], 0, mdLength); - } - - // nextRetain --> currentRetain - // nextNextRetain --> nextRetain - for (int i = 0; i < K[layer] - 1; i++) - { - this.currentRetain[layer][i] = this.nextRetain[layer - 1][i]; - this.nextRetain[layer - 1][i] = this.nextNextRoot[layer - 1] - .getRetain()[i]; - } - - // nextStack --> currentStack - this.currentStack[layer] = this.nextStack[layer - 1]; - // nextNextStack --> nextStack - this.nextStack[layer - 1] = this.nextNextRoot[layer - 1] - .getStack(); - - // nextNextRoot --> nextRoot - this.nextRoot[layer - 1] = this.nextNextRoot[layer - 1] - .getRoot(); - // ----------------------- - - // ----------------- - byte[] OTSseed = new byte[mdLength]; - byte[] dummy = new byte[mdLength]; - // gmssRandom.setSeed(currentSeeds[layer]); - System - .arraycopy(currentSeeds[layer - 1], 0, dummy, 0, - mdLength); - OTSseed = gmssRandom.nextSeed(dummy); // only need OTSSeed - OTSseed = gmssRandom.nextSeed(dummy); - OTSseed = gmssRandom.nextSeed(dummy); - // nextWinSig[layer-1]=new - // GMSSWinSig(OTSseed,algNames,otsIndex[layer-1],heightOfTrees[layer],nextRoot[layer-1]); - nextRootSig[layer - 1].initSign(OTSseed, nextRoot[layer - 1]); - - // nextKey for upper layer - nextKey(layer - 1); - } - } - } - - /** - * This method computes the authpath (AUTH) for the current tree, - * Additionally the root signature for the next tree (SIG+), the authpath - * (AUTH++) and root (ROOT++) for the tree after next in layer - * layer, and the LEAF++^1 for the next next tree in the - * layer above are updated This method is used by nextKey() - * - * @param layer - */ - private void updateKey(int layer) - { - // ----------current tree processing of actual layer--------- - // compute upcoming authpath for current Tree (AUTH) - computeAuthPaths(layer); - - // -----------distributed calculations part------------ - // not for highest tree layer - if (layer > 0) - { - - // compute (partial) next leaf on TREE++ (not on layer 1 and 0) - if (layer > 1) - { - nextNextLeaf[layer - 1 - 1].updateLeafCalc(); - } - - // compute (partial) next leaf on tree above (not on layer 0) - upperLeaf[layer - 1].updateLeafCalc(); - - // compute (partial) next leaf for all treehashs on tree above (not - // on layer 0) - - int t = (int)Math - .floor((double)(this.getNumLeafs(layer) * 2) - / (double)(this.heightOfTrees[layer - 1] - this.K[layer - 1])); - - if (index[layer] % t == 1) - { - // System.out.println(" layer: " + layer + " index: " + - // index[layer] + " t : " + t); - - // take precomputed node for treehash update - // ------------------------------------------------ - if (index[layer] > 1 && minTreehash[layer - 1] >= 0) - { - byte[] leaf = this.upperTreehashLeaf[layer - 1].getLeaf(); - // if update is required use the precomputed leaf to update - // treehash - try - { - currentTreehash[layer - 1][minTreehash[layer - 1]] - .update(this.gmssRandom, leaf); - // System.out.println("Updated TH " + minTreehash[layer - // - 1]); - if (currentTreehash[layer - 1][minTreehash[layer - 1]] - .wasFinished()) - { - // System.out.println("Finished TH " + - // minTreehash[layer - 1]); - } - } - catch (Exception e) - { - System.out.println(e); - } - // ------------------------------------------------ - } - - // initialize next leaf precomputation - // ------------------------------------------------ - - // get lowest index of treehashs - this.minTreehash[layer - 1] = getMinTreehashIndex(layer - 1); - - if (this.minTreehash[layer - 1] >= 0) - { - // initialize leaf - byte[] seed = this.currentTreehash[layer - 1][this.minTreehash[layer - 1]] - .getSeedActive(); - this.upperTreehashLeaf[layer - 1] = new GMSSLeaf( - this.digestProvider.get(), this.otsIndex[layer - 1], t); - this.upperTreehashLeaf[layer - 1].initLeafCalc(seed); - this.upperTreehashLeaf[layer - 1].updateLeafCalc(); - // System.out.println("restarted treehashleaf (" + (layer - - // 1) + "," + this.minTreehash[layer - 1] + ")"); - } - // ------------------------------------------------ - - } - else - { - // update the upper leaf for the treehash one step - if (this.minTreehash[layer - 1] >= 0) - { - this.upperTreehashLeaf[layer - 1].updateLeafCalc(); - // if (minTreehash[layer - 1] > 3) - // System.out.print("#"); - } - } - - // compute (partial) the signature of ROOT+ (RootSig+) (not on top - // layer) - nextRootSig[layer - 1].updateSign(); - - // compute (partial) AUTHPATH++ & ROOT++ (not on top layer) - if (index[layer] == 1) - { - // init root and authpath calculation for tree after next - // (AUTH++, ROOT++) - this.nextNextRoot[layer - 1].initialize(new Vector()); - } - - // update root and authpath calculation for tree after next (AUTH++, - // ROOT++) - this.updateNextNextAuthRoot(layer); - } - // ----------- end distributed calculations part----------------- - } - - /** - * This method returns the index of the next Treehash instance that should - * receive an update - * - * @param layer the layer of the GMSS tree - * @return index of the treehash instance that should get the update - */ - private int getMinTreehashIndex(int layer) - { - int minTreehash = -1; - for (int h = 0; h < heightOfTrees[layer] - K[layer]; h++) - { - if (currentTreehash[layer][h].wasInitialized() - && !currentTreehash[layer][h].wasFinished()) - { - if (minTreehash == -1) - { - minTreehash = h; - } - else if (currentTreehash[layer][h].getLowestNodeHeight() < currentTreehash[layer][minTreehash] - .getLowestNodeHeight()) - { - minTreehash = h; - } - } - } - return minTreehash; - } - - /** - * Computes the upcoming currentAuthpath of layer layer using - * the revisited authentication path computation of Dahmen/Schneider 2008 - * - * @param layer the actual layer - */ - private void computeAuthPaths(int layer) - { - - int Phi = index[layer]; - int H = heightOfTrees[layer]; - int K = this.K[layer]; - - // update all nextSeeds for seed scheduling - for (int i = 0; i < H - K; i++) - { - currentTreehash[layer][i].updateNextSeed(gmssRandom); - } - - // STEP 1 of Algorithm - int Tau = heightOfPhi(Phi); - - byte[] OTSseed = new byte[mdLength]; - OTSseed = gmssRandom.nextSeed(currentSeeds[layer]); - - // STEP 2 of Algorithm - // if phi's parent on height tau + 1 if left node, store auth_tau - // in keep_tau. - // TODO check it, formerly was - // int L = Phi / (int) Math.floor(Math.pow(2, Tau + 1)); - // L %= 2; - int L = (Phi >>> (Tau + 1)) & 1; - - byte[] tempKeep = new byte[mdLength]; - // store the keep node not in keep[layer][tau/2] because it might be in - // use - // wait until the space is freed in step 4a - if (Tau < H - 1 && L == 0) - { - System.arraycopy(currentAuthPaths[layer][Tau], 0, tempKeep, 0, - mdLength); - } - - byte[] help = new byte[mdLength]; - // STEP 3 of Algorithm - // if phi is left child, compute and store leaf for next currentAuthPath - // path, - // (obtained by veriying current signature) - if (Tau == 0) - { - // LEAFCALC !!! - if (layer == numLayer - 1) - { // lowest layer computes the - // necessary leaf completely at this - // time - WinternitzOTSignature ots = new WinternitzOTSignature(OTSseed, - digestProvider.get(), otsIndex[layer]); - help = ots.getPublicKey(); - } - else - { // other layers use the precomputed leafs in - // nextNextLeaf - byte[] dummy = new byte[mdLength]; - System.arraycopy(currentSeeds[layer], 0, dummy, 0, mdLength); - gmssRandom.nextSeed(dummy); - help = upperLeaf[layer].getLeaf(); - this.upperLeaf[layer].initLeafCalc(dummy); - - // WinternitzOTSVerify otsver = new - // WinternitzOTSVerify(algNames, otsIndex[layer]); - // byte[] help2 = otsver.Verify(currentRoot[layer], - // currentRootSig[layer]); - // System.out.println(" --- " + layer + " " + - // ByteUtils.toHexString(help) + " " + - // ByteUtils.toHexString(help2)); - } - System.arraycopy(help, 0, currentAuthPaths[layer][0], 0, mdLength); - } - else - { - // STEP 4a of Algorithm - // get new left currentAuthPath node on height tau - byte[] toBeHashed = new byte[mdLength << 1]; - System.arraycopy(currentAuthPaths[layer][Tau - 1], 0, toBeHashed, - 0, mdLength); - // free the shared keep[layer][tau/2] - System.arraycopy(keep[layer][(int)Math.floor((Tau - 1) / 2)], 0, - toBeHashed, mdLength, mdLength); - messDigestTrees.update(toBeHashed, 0, toBeHashed.length); - currentAuthPaths[layer][Tau] = new byte[messDigestTrees.getDigestSize()]; - messDigestTrees.doFinal(currentAuthPaths[layer][Tau], 0); - - // STEP 4b and 4c of Algorithm - // copy right nodes to currentAuthPath on height 0..Tau-1 - for (int i = 0; i < Tau; i++) - { - - // STEP 4b of Algorithm - // 1st: copy from treehashs - if (i < H - K) - { - if (currentTreehash[layer][i].wasFinished()) - { - System.arraycopy(currentTreehash[layer][i] - .getFirstNode(), 0, currentAuthPaths[layer][i], - 0, mdLength); - currentTreehash[layer][i].destroy(); - } - else - { - System.err - .println("Treehash (" - + layer - + "," - + i - + ") not finished when needed in AuthPathComputation"); - } - } - - // 2nd: copy precomputed values from Retain - if (i < H - 1 && i >= H - K) - { - if (currentRetain[layer][i - (H - K)].size() > 0) - { - // pop element from retain - System.arraycopy(currentRetain[layer][i - (H - K)] - .lastElement(), 0, currentAuthPaths[layer][i], - 0, mdLength); - currentRetain[layer][i - (H - K)] - .removeElementAt(currentRetain[layer][i - - (H - K)].size() - 1); - } - } - - // STEP 4c of Algorithm - // initialize new stack at heights 0..Tau-1 - if (i < H - K) - { - // create stacks anew - int startPoint = Phi + 3 * (1 << i); - if (startPoint < numLeafs[layer]) - { - // if (layer < 2) { - // System.out.println("initialized TH " + i + " on layer - // " + layer); - // } - currentTreehash[layer][i].initialize(); - } - } - } - } - - // now keep space is free to use - if (Tau < H - 1 && L == 0) - { - System.arraycopy(tempKeep, 0, - keep[layer][(int)Math.floor(Tau / 2)], 0, mdLength); - } - - // only update empty stack at height h if all other stacks have - // tailnodes with height >h - // finds active stack with lowest node height, choses lower index in - // case of tie - - // on the lowest layer leafs must be computed at once, no precomputation - // is possible. So all treehash updates are done at once here - if (layer == numLayer - 1) - { - for (int tmp = 1; tmp <= (H - K) / 2; tmp++) - { - // index of the treehash instance that receives the next update - int minTreehash = getMinTreehashIndex(layer); - - // if active treehash is found update with a leaf - if (minTreehash >= 0) - { - try - { - byte[] seed = new byte[mdLength]; - System.arraycopy( - this.currentTreehash[layer][minTreehash] - .getSeedActive(), 0, seed, 0, mdLength); - byte[] seed2 = gmssRandom.nextSeed(seed); - WinternitzOTSignature ots = new WinternitzOTSignature( - seed2, this.digestProvider.get(), this.otsIndex[layer]); - byte[] leaf = ots.getPublicKey(); - currentTreehash[layer][minTreehash].update( - this.gmssRandom, leaf); - } - catch (Exception e) - { - System.out.println(e); - } - } - } - } - else - { // on higher layers the updates are done later - this.minTreehash[layer] = getMinTreehashIndex(layer); - } - } - - /** - * Returns the largest h such that 2^h | Phi - * - * @param Phi the leaf index - * @return The largest h with 2^h | Phi if - * Phi!=0 else return -1 - */ - private int heightOfPhi(int Phi) - { - if (Phi == 0) - { - return -1; - } - int Tau = 0; - int modul = 1; - while (Phi % modul == 0) - { - modul *= 2; - Tau += 1; - } - return Tau - 1; - } - - /** - * Updates the authentication path and root calculation for the tree after - * next (AUTH++, ROOT++) in layer layer - * - * @param layer - */ - private void updateNextNextAuthRoot(int layer) - { - - byte[] OTSseed = new byte[mdLength]; - OTSseed = gmssRandom.nextSeed(nextNextSeeds[layer - 1]); - - // get the necessary leaf - if (layer == numLayer - 1) - { // lowest layer computes the necessary - // leaf completely at this time - WinternitzOTSignature ots = new WinternitzOTSignature(OTSseed, - digestProvider.get(), otsIndex[layer]); - this.nextNextRoot[layer - 1].update(nextNextSeeds[layer - 1], ots - .getPublicKey()); - } - else - { // other layers use the precomputed leafs in nextNextLeaf - this.nextNextRoot[layer - 1].update(nextNextSeeds[layer - 1], - nextNextLeaf[layer - 1].getLeaf()); - this.nextNextLeaf[layer - 1].initLeafCalc(nextNextSeeds[layer - 1]); - } - } - - public int[] getIndex() - { - return index; - } - - /** - * @return The current index of layer i - */ - public int getIndex(int i) - { - return index[i]; - } - - public byte[][] getCurrentSeeds() - { - return currentSeeds; - } - - public byte[][] getNextNextSeeds() - { - return nextNextSeeds; - } - - public byte[][][] getCurrentAuthPaths() - { - return currentAuthPaths; - } - - public byte[][][] getNextAuthPaths() - { - return nextAuthPaths; - } - - public Treehash[][] getCurrentTreehash() - { - return currentTreehash; - } - - public Treehash[][] getNextTreehash() - { - return nextTreehash; - } - - public byte[][][] getKeep() - { - return keep; - } - - public Vector[] getCurrentStack() - { - return currentStack; - } - - public Vector[] getNextStack() - { - return nextStack; - } - - public Vector[][] getCurrentRetain() - { - return currentRetain; - } - - public Vector[][] getNextRetain() - { - return nextRetain; - } - - public GMSSLeaf[] getNextNextLeaf() - { - return nextNextLeaf; - } - - public GMSSLeaf[] getUpperLeaf() - { - return upperLeaf; - } - - public GMSSLeaf[] getUpperTreehashLeaf() - { - return upperTreehashLeaf; - } - - public int[] getMinTreehash() - { - return minTreehash; - } - - public GMSSRootSig[] getNextRootSig() - { - return nextRootSig; - } - - public byte[][] getNextRoot() - { - return nextRoot; - } - - public GMSSRootCalc[] getNextNextRoot() - { - return nextNextRoot; - } - - public byte[][] getCurrentRootSig() - { - return currentRootSig; - } - - /** - * @return The one-time signature of the root of the current subtree - */ - public byte[] getSubtreeRootSig(int i) - { - return currentRootSig[i]; - } - - - public GMSSDigestProvider getName() - { - return digestProvider; - } - - /** - * @return The number of leafs of each tree of layer i - */ - public int getNumLeafs(int i) - { - return numLeafs[i]; - } - - /** - * @return The array of number of leafs of a tree of each layer - */ - public int[] getNumLeafs() - { - return numLeafs; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPublicKeyParameters.java deleted file mode 100644 index 9f7e0f4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSPublicKeyParameters.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.bc.pqc.crypto.gmss; - - -public class GMSSPublicKeyParameters - extends GMSSKeyParameters -{ - /** - * The GMSS public key - */ - private byte[] gmssPublicKey; - - /** - * The constructor. - * - * @param key a raw GMSS public key - * @param gmssParameterSet an instance of GMSSParameterset - */ - public GMSSPublicKeyParameters(byte[] key, GMSSParameters gmssParameterSet) - { - super(false, gmssParameterSet); - this.gmssPublicKey = key; - } - - /** - * Returns the GMSS public key - * - * @return The GMSS public key - */ - public byte[] getPublicKey() - { - return gmssPublicKey; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootCalc.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootCalc.java deleted file mode 100644 index 192e414..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootCalc.java +++ /dev/null @@ -1,596 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.crypto.Digest; -import org.bc.util.Arrays; -import org.bc.util.Integers; -import org.bc.util.encoders.Hex; - - -/** - * This class computes a whole Merkle tree and saves the needed values for - * AuthPath computation. It is used for precomputation of the root of a - * following tree. After initialization, 2^H updates are required to complete - * the root. Every update requires one leaf value as parameter. While computing - * the root all initial values for the authentication path algorithm (treehash, - * auth, retain) are stored for later use. - */ -public class GMSSRootCalc -{ - - /** - * max height of the tree - */ - private int heightOfTree; - - /** - * length of the messageDigest - */ - private int mdLength; - - /** - * the treehash instances of the tree - */ - private Treehash[] treehash; - - /** - * stores the retain nodes for authPath computation - */ - private Vector[] retain; - - /** - * finally stores the root of the tree when finished - */ - private byte[] root; - - /** - * stores the authentication path y_1(i), i = 0..H-1 - */ - private byte[][] AuthPath; - - /** - * the value K for the authentication path computation - */ - private int K; - - /** - * Vector element that stores the nodes on the stack - */ - private Vector tailStack; - - /** - * stores the height of all nodes laying on the tailStack - */ - private Vector heightOfNodes; - /** - * The hash function used for the construction of the authentication trees - */ - private Digest messDigestTree; - - /** - * An array of strings containing the name of the hash function used to - * construct the authentication trees and used by the OTS. - */ - private GMSSDigestProvider digestProvider; - - /** - * stores the index of the current node on each height of the tree - */ - private int[] index; - - /** - * true if instance was already initialized, false otherwise - */ - private boolean isInitialized; - - /** - * true it instance was finished - */ - private boolean isFinished; - - /** - * Integer that stores the index of the next seed that has to be omitted to - * the treehashs - */ - private int indexForNextSeed; - - /** - * temporary integer that stores the height of the next treehash instance - * that gets initialized with a seed - */ - private int heightOfNextSeed; - - /** - * This constructor regenerates a prior treehash object - * - * @param digest an array of strings, containing the digest of the used hash - * function and PRNG and the digest of the corresponding - * provider - * @param statByte status bytes - * @param statInt status ints - */ - public GMSSRootCalc(Digest digest, byte[][] statByte, int[] statInt, - Treehash[] treeH, Vector[] ret) - { - this.messDigestTree = digestProvider.get(); - this.digestProvider = digestProvider; - // decode statInt - this.heightOfTree = statInt[0]; - this.mdLength = statInt[1]; - this.K = statInt[2]; - this.indexForNextSeed = statInt[3]; - this.heightOfNextSeed = statInt[4]; - if (statInt[5] == 1) - { - this.isFinished = true; - } - else - { - this.isFinished = false; - } - if (statInt[6] == 1) - { - this.isInitialized = true; - } - else - { - this.isInitialized = false; - } - - int tailLength = statInt[7]; - - this.index = new int[heightOfTree]; - for (int i = 0; i < heightOfTree; i++) - { - this.index[i] = statInt[8 + i]; - } - - this.heightOfNodes = new Vector(); - for (int i = 0; i < tailLength; i++) - { - this.heightOfNodes.addElement(Integers.valueOf(statInt[8 + heightOfTree - + i])); - } - - // decode statByte - this.root = statByte[0]; - - this.AuthPath = new byte[heightOfTree][mdLength]; - for (int i = 0; i < heightOfTree; i++) - { - this.AuthPath[i] = statByte[1 + i]; - } - - this.tailStack = new Vector(); - for (int i = 0; i < tailLength; i++) - { - this.tailStack.addElement(statByte[1 + heightOfTree + i]); - } - - // decode treeH - this.treehash = GMSSUtils.clone(treeH); - - // decode ret - this.retain = GMSSUtils.clone(ret); - } - - /** - * Constructor - * - * @param heightOfTree maximal height of the tree - * @param digestProvider an array of strings, containing the name of the used hash - * function and PRNG and the name of the corresponding - * provider - */ - public GMSSRootCalc(int heightOfTree, int K, GMSSDigestProvider digestProvider) - { - this.heightOfTree = heightOfTree; - this.digestProvider = digestProvider; - this.messDigestTree = digestProvider.get(); - this.mdLength = messDigestTree.getDigestSize(); - this.K = K; - this.index = new int[heightOfTree]; - this.AuthPath = new byte[heightOfTree][mdLength]; - this.root = new byte[mdLength]; - // this.treehash = new Treehash[this.heightOfTree - this.K]; - this.retain = new Vector[this.K - 1]; - for (int i = 0; i < K - 1; i++) - { - this.retain[i] = new Vector(); - } - - } - - /** - * Initializes the calculation of a new root - * - * @param sharedStack the stack shared by all treehash instances of this tree - */ - public void initialize(Vector sharedStack) - { - this.treehash = new Treehash[this.heightOfTree - this.K]; - for (int i = 0; i < this.heightOfTree - this.K; i++) - { - this.treehash[i] = new Treehash(sharedStack, i, this.digestProvider.get()); - } - - this.index = new int[heightOfTree]; - this.AuthPath = new byte[heightOfTree][mdLength]; - this.root = new byte[mdLength]; - - this.tailStack = new Vector(); - this.heightOfNodes = new Vector(); - this.isInitialized = true; - this.isFinished = false; - - for (int i = 0; i < heightOfTree; i++) - { - this.index[i] = -1; - } - - this.retain = new Vector[this.K - 1]; - for (int i = 0; i < K - 1; i++) - { - this.retain[i] = new Vector(); - } - - this.indexForNextSeed = 3; - this.heightOfNextSeed = 0; - } - - /** - * updates the root with one leaf and stores needed values in retain, - * treehash or authpath. Additionally counts the seeds used. This method is - * used when performing the updates for TREE++. - * - * @param seed the initial seed for treehash: seedNext - * @param leaf the height of the treehash - */ - public void update(byte[] seed, byte[] leaf) - { - if (this.heightOfNextSeed < (this.heightOfTree - this.K) - && this.indexForNextSeed - 2 == index[0]) - { - this.initializeTreehashSeed(seed, this.heightOfNextSeed); - this.heightOfNextSeed++; - this.indexForNextSeed *= 2; - } - // now call the simple update - this.update(leaf); - } - - /** - * Updates the root with one leaf and stores the needed values in retain, - * treehash or authpath - */ - public void update(byte[] leaf) - { - - if (isFinished) - { - System.out.print("Too much updates for Tree!!"); - return; - } - if (!isInitialized) - { - System.err.println("GMSSRootCalc not initialized!"); - return; - } - - // a new leaf was omitted, so raise index on lowest layer - index[0]++; - - // store the nodes on the lowest layer in treehash or authpath - if (index[0] == 1) - { - System.arraycopy(leaf, 0, AuthPath[0], 0, mdLength); - } - else if (index[0] == 3) - { - // store in treehash only if K < H - if (heightOfTree > K) - { - treehash[0].setFirstNode(leaf); - } - } - - if ((index[0] - 3) % 2 == 0 && index[0] >= 3) - { - // store in retain if K = H - if (heightOfTree == K) - // TODO: check it - { - retain[0].insertElementAt(leaf, 0); - } - } - - // if first update to this tree is made - if (index[0] == 0) - { - tailStack.addElement(leaf); - heightOfNodes.addElement(Integers.valueOf(0)); - } - else - { - - byte[] help = new byte[mdLength]; - byte[] toBeHashed = new byte[mdLength << 1]; - - // store the new leaf in help - System.arraycopy(leaf, 0, help, 0, mdLength); - int helpHeight = 0; - // while top to nodes have same height - while (tailStack.size() > 0 - && helpHeight == ((Integer)heightOfNodes.lastElement()) - .intValue()) - { - - // help <-- hash(stack top element || help) - System.arraycopy(tailStack.lastElement(), 0, toBeHashed, 0, - mdLength); - tailStack.removeElementAt(tailStack.size() - 1); - heightOfNodes.removeElementAt(heightOfNodes.size() - 1); - System.arraycopy(help, 0, toBeHashed, mdLength, mdLength); - - messDigestTree.update(toBeHashed, 0, toBeHashed.length); - help = new byte[messDigestTree.getDigestSize()]; - messDigestTree.doFinal(help, 0); - - // the new help node is one step higher - helpHeight++; - if (helpHeight < heightOfTree) - { - index[helpHeight]++; - - // add index 1 element to initial authpath - if (index[helpHeight] == 1) - { - System.arraycopy(help, 0, AuthPath[helpHeight], 0, - mdLength); - } - - if (helpHeight >= heightOfTree - K) - { - if (helpHeight == 0) - { - System.out.println("M���P"); - } - // add help element to retain stack if it is a right - // node - // and not stored in treehash - if ((index[helpHeight] - 3) % 2 == 0 - && index[helpHeight] >= 3) - // TODO: check it - { - retain[helpHeight - (heightOfTree - K)] - .insertElementAt(help, 0); - } - } - else - { - // if element is third in his line add it to treehash - if (index[helpHeight] == 3) - { - treehash[helpHeight].setFirstNode(help); - } - } - } - } - // push help element to the stack - tailStack.addElement(help); - heightOfNodes.addElement(Integers.valueOf(helpHeight)); - - // is the root calculation finished? - if (helpHeight == heightOfTree) - { - isFinished = true; - isInitialized = false; - root = (byte[])tailStack.lastElement(); - } - } - - } - - /** - * initializes the seeds for the treehashs of the tree precomputed by this - * class - * - * @param seed the initial seed for treehash: seedNext - * @param index the height of the treehash - */ - public void initializeTreehashSeed(byte[] seed, int index) - { - treehash[index].initializeSeed(seed); - } - - /** - * Method to check whether the instance has been initialized or not - * - * @return true if treehash was already initialized - */ - public boolean wasInitialized() - { - return isInitialized; - } - - /** - * Method to check whether the instance has been finished or not - * - * @return true if tree has reached its maximum height - */ - public boolean wasFinished() - { - return isFinished; - } - - /** - * returns the authentication path of the first leaf of the tree - * - * @return the authentication path of the first leaf of the tree - */ - public byte[][] getAuthPath() - { - return GMSSUtils.clone(AuthPath); - } - - /** - * returns the initial treehash instances, storing value y_3(i) - * - * @return the initial treehash instances, storing value y_3(i) - */ - public Treehash[] getTreehash() - { - return GMSSUtils.clone(treehash); - } - - /** - * returns the retain stacks storing all right nodes near to the root - * - * @return the retain stacks storing all right nodes near to the root - */ - public Vector[] getRetain() - { - return GMSSUtils.clone(retain); - } - - /** - * returns the finished root value - * - * @return the finished root value - */ - public byte[] getRoot() - { - return Arrays.clone(root); - } - - /** - * returns the shared stack - * - * @return the shared stack - */ - public Vector getStack() - { - Vector copy = new Vector(); - for (Enumeration en = tailStack.elements(); en.hasMoreElements();) - { - copy.addElement(en.nextElement()); - } - return copy; - } - - /** - * Returns the status byte array used by the GMSSPrivateKeyASN.1 class - * - * @return The status bytes - */ - public byte[][] getStatByte() - { - - int tailLength; - if (tailStack == null) - { - tailLength = 0; - } - else - { - tailLength = tailStack.size(); - } - byte[][] statByte = new byte[1 + heightOfTree + tailLength][64]; //FIXME: messDigestTree.getByteLength() - statByte[0] = root; - - for (int i = 0; i < heightOfTree; i++) - { - statByte[1 + i] = AuthPath[i]; - } - for (int i = 0; i < tailLength; i++) - { - statByte[1 + heightOfTree + i] = (byte[])tailStack.elementAt(i); - } - - return statByte; - } - - /** - * Returns the status int array used by the GMSSPrivateKeyASN.1 class - * - * @return The status ints - */ - public int[] getStatInt() - { - - int tailLength; - if (tailStack == null) - { - tailLength = 0; - } - else - { - tailLength = tailStack.size(); - } - int[] statInt = new int[8 + heightOfTree + tailLength]; - statInt[0] = heightOfTree; - statInt[1] = mdLength; - statInt[2] = K; - statInt[3] = indexForNextSeed; - statInt[4] = heightOfNextSeed; - if (isFinished) - { - statInt[5] = 1; - } - else - { - statInt[5] = 0; - } - if (isInitialized) - { - statInt[6] = 1; - } - else - { - statInt[6] = 0; - } - statInt[7] = tailLength; - - for (int i = 0; i < heightOfTree; i++) - { - statInt[8 + i] = index[i]; - } - for (int i = 0; i < tailLength; i++) - { - statInt[8 + heightOfTree + i] = ((Integer)heightOfNodes - .elementAt(i)).intValue(); - } - - return statInt; - } - - /** - * @return a human readable version of the structure - */ - public String toString() - { - String out = ""; - int tailLength; - if (tailStack == null) - { - tailLength = 0; - } - else - { - tailLength = tailStack.size(); - } - - for (int i = 0; i < 8 + heightOfTree + tailLength; i++) - { - out = out + getStatInt()[i] + " "; - } - for (int i = 0; i < 1 + heightOfTree + tailLength; i++) - { - out = out + new String(Hex.encode(getStatByte()[i])) + " "; - } - out = out + " " + digestProvider.get().getDigestSize(); - return out; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootSig.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootSig.java deleted file mode 100644 index a0d502c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSRootSig.java +++ /dev/null @@ -1,666 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import org.bc.crypto.Digest; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.util.encoders.Hex; - - -/** - * This class implements the distributed signature generation of the Winternitz - * one-time signature scheme (OTSS), described in C.Dods, N.P. Smart, and M. - * Stam, "Hash Based Digital Signature Schemes", LNCS 3796, pages 96–115, - * 2005. The class is used by the GMSS classes. - */ -public class GMSSRootSig -{ - - /** - * The hash function used by the OTS - */ - private Digest messDigestOTS; - - /** - * The length of the message digest and private key - */ - private int mdsize, keysize; - - /** - * The private key - */ - private byte[] privateKeyOTS; - - /** - * The message bytes - */ - private byte[] hash; - - /** - * The signature bytes - */ - private byte[] sign; - - /** - * The Winternitz parameter - */ - private int w; - - /** - * The source of randomness for OTS private key generation - */ - private GMSSRandom gmssRandom; - - /** - * Sizes of the message - */ - private int messagesize; - - /** - * Some precalculated values - */ - private int k; - - /** - * Some variables for storing the actual status of distributed signing - */ - private int r, test, counter, ii; - - /** - * variables for storing big numbers for the actual status of distributed - * signing - */ - private long test8, big8; - - /** - * The necessary steps of each updateSign() call - */ - private int steps; - - /** - * The checksum part - */ - private int checksum; - - /** - * The height of the tree - */ - private int height; - - /** - * The current intern OTSseed - */ - private byte[] seed; - - /** - * This constructor regenerates a prior GMSSRootSig object used by the - * GMSSPrivateKeyASN.1 class - * - * @param digest an array of strings, containing the digest of the used hash - * function, the digest of the PRGN and the names of the - * corresponding providers - * @param statByte status byte array - * @param statInt status int array - */ - public GMSSRootSig(Digest digest, byte[][] statByte, int[] statInt) - { - messDigestOTS = digest; - gmssRandom = new GMSSRandom(messDigestOTS); - - this.counter = statInt[0]; - this.test = statInt[1]; - this.ii = statInt[2]; - this.r = statInt[3]; - this.steps = statInt[4]; - this.keysize = statInt[5]; - this.height = statInt[6]; - this.w = statInt[7]; - this.checksum = statInt[8]; - - this.mdsize = messDigestOTS.getDigestSize(); - - this.k = (1 << w) - 1; - - int mdsizeBit = mdsize << 3; - this.messagesize = (int)Math.ceil((double)(mdsizeBit) / (double)w); - - this.privateKeyOTS = statByte[0]; - this.seed = statByte[1]; - this.hash = statByte[2]; - - this.sign = statByte[3]; - - this.test8 = ((statByte[4][0] & 0xff)) - | ((long)(statByte[4][1] & 0xff) << 8) - | ((long)(statByte[4][2] & 0xff) << 16) - | ((long)(statByte[4][3] & 0xff)) << 24 - | ((long)(statByte[4][4] & 0xff)) << 32 - | ((long)(statByte[4][5] & 0xff)) << 40 - | ((long)(statByte[4][6] & 0xff)) << 48 - | ((long)(statByte[4][7] & 0xff)) << 56; - - this.big8 = ((statByte[4][8] & 0xff)) - | ((long)(statByte[4][9] & 0xff) << 8) - | ((long)(statByte[4][10] & 0xff) << 16) - | ((long)(statByte[4][11] & 0xff)) << 24 - | ((long)(statByte[4][12] & 0xff)) << 32 - | ((long)(statByte[4][13] & 0xff)) << 40 - | ((long)(statByte[4][14] & 0xff)) << 48 - | ((long)(statByte[4][15] & 0xff)) << 56; - } - - /** - * The constructor generates the PRNG and initializes some variables - * - * @param digest an array of strings, containing the digest of the used hash - * function, the digest of the PRGN and the names of the - * corresponding providers - * @param w the winternitz parameter - * @param height the heigth of the tree - */ - public GMSSRootSig(Digest digest, int w, int height) - { - messDigestOTS = digest; - gmssRandom = new GMSSRandom(messDigestOTS); - - this.mdsize = messDigestOTS.getDigestSize(); - this.w = w; - this.height = height; - - this.k = (1 << w) - 1; - - int mdsizeBit = mdsize << 3; - this.messagesize = (int)Math.ceil((double)(mdsizeBit) / (double)w); - } - - /** - * This method initializes the distributed sigature calculation. Variables - * are reseted and necessary steps are calculated - * - * @param seed0 the initial OTSseed - * @param message the massage which will be signed - */ - public void initSign(byte[] seed0, byte[] message) - { - - // create hash of message m - this.hash = new byte[mdsize]; - messDigestOTS.update(message, 0, message.length); - this.hash = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(this.hash, 0); - - // variables for calculation of steps - byte[] messPart = new byte[mdsize]; - System.arraycopy(hash, 0, messPart, 0, mdsize); - int checkPart = 0; - int sumH = 0; - int checksumsize = getLog((messagesize << w) + 1); - - // ------- calculation of necessary steps ------ - if (8 % w == 0) - { - int dt = 8 / w; - // message part - for (int a = 0; a < mdsize; a++) - { - // count necessary hashs in 'sumH' - for (int b = 0; b < dt; b++) - { - sumH += messPart[a] & k; - messPart[a] = (byte)(messPart[a] >>> w); - } - } - // checksum part - this.checksum = (messagesize << w) - sumH; - checkPart = checksum; - // count necessary hashs in 'sumH' - for (int b = 0; b < checksumsize; b += w) - { - sumH += checkPart & k; - checkPart >>>= w; - } - } // end if ( 8 % w == 0 ) - else if (w < 8) - { - long big8; - int ii = 0; - int dt = mdsize / w; - - // first d*w bytes of hash (main message part) - for (int i = 0; i < dt; i++) - { - big8 = 0; - for (int j = 0; j < w; j++) - { - big8 ^= (messPart[ii] & 0xff) << (j << 3); - ii++; - } - // count necessary hashs in 'sumH' - for (int j = 0; j < 8; j++) - { - sumH += (int)(big8 & k); - big8 >>>= w; - } - } - // rest of message part - dt = mdsize % w; - big8 = 0; - for (int j = 0; j < dt; j++) - { - big8 ^= (messPart[ii] & 0xff) << (j << 3); - ii++; - } - dt <<= 3; - // count necessary hashs in 'sumH' - for (int j = 0; j < dt; j += w) - { - sumH += (int)(big8 & k); - big8 >>>= w; - } - // checksum part - this.checksum = (messagesize << w) - sumH; - checkPart = checksum; - // count necessary hashs in 'sumH' - for (int i = 0; i < checksumsize; i += w) - { - sumH += checkPart & k; - checkPart >>>= w; - } - }// end if(w<8) - else if (w < 57) - { - long big8; - int r = 0; - int s, f, rest, ii; - - // first a*w bits of hash where a*w <= 8*mdsize < (a+1)*w (main - // message part) - while (r <= ((mdsize << 3) - w)) - { - s = r >>> 3; - rest = r % 8; - r += w; - f = (r + 7) >>> 3; - big8 = 0; - ii = 0; - for (int j = s; j < f; j++) - { - big8 ^= (messPart[j] & 0xff) << (ii << 3); - ii++; - } - big8 >>>= rest; - // count necessary hashs in 'sumH' - sumH += (big8 & k); - - } - // rest of message part - s = r >>> 3; - if (s < mdsize) - { - rest = r % 8; - big8 = 0; - ii = 0; - for (int j = s; j < mdsize; j++) - { - big8 ^= (messPart[j] & 0xff) << (ii << 3); - ii++; - } - - big8 >>>= rest; - // count necessary hashs in 'sumH' - sumH += (big8 & k); - } - // checksum part - this.checksum = (messagesize << w) - sumH; - checkPart = checksum; - // count necessary hashs in 'sumH' - for (int i = 0; i < checksumsize; i += w) - { - sumH += (checkPart & k); - checkPart >>>= w; - } - }// end if(w<57) - - // calculate keysize - this.keysize = messagesize - + (int)Math.ceil((double)checksumsize / (double)w); - - // calculate steps: 'keysize' times PRNG, 'sumH' times hashing, - // (1<steps steps of distributed signature - * calculaion - * - * @return true if signature is generated completly, else false - */ - public boolean updateSign() - { - // steps times do - - for (int s = 0; s < steps; s++) - { // do 'step' times - - if (counter < keysize) - { // generate the private key or perform - // the next hash - oneStep(); - } - if (counter == keysize) - {// finish - return true; - } - } - - return false; // leaf not finished yet - } - - /** - * @return The private OTS key - */ - public byte[] getSig() - { - - return sign; - } - - /** - * @return The one-time signature of the message, generated step by step - */ - private void oneStep() - { - // -------- if (8 % w == 0) ---------- - if (8 % w == 0) - { - if (test == 0) - { - // get current OTSprivateKey - this.privateKeyOTS = gmssRandom.nextSeed(seed); - // System.arraycopy(privateKeyOTS, 0, hlp, 0, mdsize); - - if (ii < mdsize) - { // for main message part - test = hash[ii] & k; - hash[ii] = (byte)(hash[ii] >>> w); - } - else - { // for checksum part - test = checksum & k; - checksum >>>= w; - } - } - else if (test > 0) - { // hash the private Key 'test' times (on - // time each step) - messDigestOTS.update(privateKeyOTS, 0, privateKeyOTS.length); - privateKeyOTS = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(privateKeyOTS, 0); - test--; - } - if (test == 0) - { // if all hashes done copy result to siganture - // array - System.arraycopy(privateKeyOTS, 0, sign, counter * mdsize, - mdsize); - counter++; - - if (counter % (8 / w) == 0) - { // raise array index for main - // massage part - ii++; - } - } - - }// ----- end if (8 % w == 0) ----- - // ---------- if ( w < 8 ) ---------------- - else if (w < 8) - { - - if (test == 0) - { - if (counter % 8 == 0 && ii < mdsize) - { // after every 8th "add - // to signature"-step - big8 = 0; - if (counter < ((mdsize / w) << 3)) - {// main massage - // (generate w*8 Bits - // every time) part - for (int j = 0; j < w; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - } - else - { // rest of massage part (once) - for (int j = 0; j < mdsize % w; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - } - } - if (counter == messagesize) - { // checksum part (once) - big8 = checksum; - } - - test = (int)(big8 & k); - // generate current OTSprivateKey - this.privateKeyOTS = gmssRandom.nextSeed(seed); - // System.arraycopy(privateKeyOTS, 0, hlp, 0, mdsize); - - } - else if (test > 0) - { // hash the private Key 'test' times (on - // time each step) - messDigestOTS.update(privateKeyOTS, 0, privateKeyOTS.length); - privateKeyOTS = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(privateKeyOTS, 0); - test--; - } - if (test == 0) - { // if all hashes done copy result to siganture - // array - System.arraycopy(privateKeyOTS, 0, sign, counter * mdsize, - mdsize); - big8 >>>= w; - counter++; - } - - }// ------- end if(w<8)-------------------------------- - // --------- if w < 57 ----------------------------- - else if (w < 57) - { - - if (test8 == 0) - { - int s, f, rest; - big8 = 0; - ii = 0; - rest = r % 8; - s = r >>> 3; - // --- message part--- - if (s < mdsize) - { - if (r <= ((mdsize << 3) - w)) - { // first message part - r += w; - f = (r + 7) >>> 3; - } - else - { // rest of message part (once) - f = mdsize; - r += w; - } - // generate long 'big8' with minimum w next bits of the - // message array - for (int i = s; i < f; i++) - { - big8 ^= (hash[i] & 0xff) << (ii << 3); - ii++; - } - // delete bits on the right side, which were used already by - // the last loop - big8 >>>= rest; - test8 = (big8 & k); - } - // --- checksum part - else - { - test8 = (checksum & k); - checksum >>>= w; - } - // generate current OTSprivateKey - this.privateKeyOTS = gmssRandom.nextSeed(seed); - // System.arraycopy(privateKeyOTS, 0, hlp, 0, mdsize); - - } - else if (test8 > 0) - { // hash the private Key 'test' times (on - // time each step) - messDigestOTS.update(privateKeyOTS, 0, privateKeyOTS.length); - privateKeyOTS = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(privateKeyOTS, 0); - test8--; - } - if (test8 == 0) - { // if all hashes done copy result to siganture - // array - System.arraycopy(privateKeyOTS, 0, sign, counter * mdsize, - mdsize); - counter++; - } - - } - } - - /** - * This method returns the least integer that is greater or equal to the - * logarithm to the base 2 of an integer intValue. - * - * @param intValue an integer - * @return The least integer greater or equal to the logarithm to the base 2 - * of intValue - */ - public int getLog(int intValue) - { - int log = 1; - int i = 2; - while (i < intValue) - { - i <<= 1; - log++; - } - return log; - } - - /** - * This method returns the status byte array - * - * @return statBytes - */ - public byte[][] getStatByte() - { - - byte[][] statByte = new byte[5][mdsize]; - statByte[0] = privateKeyOTS; - statByte[1] = seed; - statByte[2] = hash; - statByte[3] = sign; - statByte[4] = this.getStatLong(); - - return statByte; - } - - /** - * This method returns the status int array - * - * @return statInt - */ - public int[] getStatInt() - { - int[] statInt = new int[9]; - statInt[0] = counter; - statInt[1] = test; - statInt[2] = ii; - statInt[3] = r; - statInt[4] = steps; - statInt[5] = keysize; - statInt[6] = height; - statInt[7] = w; - statInt[8] = checksum; - return statInt; - } - - /** - * Converts the long parameters into byte arrays to store it in - * statByte-Array - */ - public byte[] getStatLong() - { - byte[] bytes = new byte[16]; - - bytes[0] = (byte)((test8) & 0xff); - bytes[1] = (byte)((test8 >> 8) & 0xff); - bytes[2] = (byte)((test8 >> 16) & 0xff); - bytes[3] = (byte)((test8 >> 24) & 0xff); - bytes[4] = (byte)((test8) >> 32 & 0xff); - bytes[5] = (byte)((test8 >> 40) & 0xff); - bytes[6] = (byte)((test8 >> 48) & 0xff); - bytes[7] = (byte)((test8 >> 56) & 0xff); - - bytes[8] = (byte)((big8) & 0xff); - bytes[9] = (byte)((big8 >> 8) & 0xff); - bytes[10] = (byte)((big8 >> 16) & 0xff); - bytes[11] = (byte)((big8 >> 24) & 0xff); - bytes[12] = (byte)((big8) >> 32 & 0xff); - bytes[13] = (byte)((big8 >> 40) & 0xff); - bytes[14] = (byte)((big8 >> 48) & 0xff); - bytes[15] = (byte)((big8 >> 56) & 0xff); - - return bytes; - } - - /** - * returns a string representation of the instance - * - * @return a string representation of the instance - */ - public String toString() - { - String out = "" + this.big8 + " "; - int[] statInt = new int[9]; - statInt = this.getStatInt(); - byte[][] statByte = new byte[5][mdsize]; - statByte = this.getStatByte(); - for (int i = 0; i < 9; i++) - { - out = out + statInt[i] + " "; - } - for (int i = 0; i < 5; i++) - { - out = out + new String(Hex.encode(statByte[i])) + " "; - } - - return out; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSSigner.java deleted file mode 100644 index 51ec2f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSSigner.java +++ /dev/null @@ -1,403 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageSigner; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.pqc.crypto.gmss.util.GMSSUtil; -import org.bc.pqc.crypto.gmss.util.WinternitzOTSVerify; -import org.bc.pqc.crypto.gmss.util.WinternitzOTSignature; -import org.bc.util.Arrays; - -/** - * This class implements the GMSS signature scheme. - */ -public class GMSSSigner - implements MessageSigner -{ - - /** - * Instance of GMSSParameterSpec - */ - //private GMSSParameterSpec gmssParameterSpec; - - /** - * Instance of GMSSUtilities - */ - private GMSSUtil gmssUtil = new GMSSUtil(); - - - /** - * The raw GMSS public key - */ - private byte[] pubKeyBytes; - - /** - * Hash function for the construction of the authentication trees - */ - private Digest messDigestTrees; - - /** - * The length of the hash function output - */ - private int mdLength; - - /** - * The number of tree layers - */ - private int numLayer; - - /** - * The hash function used by the OTS - */ - private Digest messDigestOTS; - - /** - * An instance of the Winternitz one-time signature - */ - private WinternitzOTSignature ots; - - /** - * Array of strings containing the name of the hash function used by the OTS - * and the corresponding provider name - */ - private GMSSDigestProvider digestProvider; - - /** - * The current main tree and subtree indices - */ - private int[] index; - - /** - * Array of the authentication paths for the current trees of all layers - */ - private byte[][][] currentAuthPaths; - - /** - * The one-time signature of the roots of the current subtrees - */ - private byte[][] subtreeRootSig; - - - /** - * The GMSSParameterset - */ - private GMSSParameters gmssPS; - - /** - * The PRNG - */ - private GMSSRandom gmssRandom; - - GMSSKeyParameters key; - - // XXX needed? Source of randomness - private SecureRandom random; - - - /** - * The standard constructor tries to generate the MerkleTree Algorithm - * identifier with the corresponding OID. - * - * @param digest the digest to use - */ - // TODO - public GMSSSigner(GMSSDigestProvider digest) - { - digestProvider = digest; - messDigestTrees = digest.get(); - messDigestOTS = messDigestTrees; - mdLength = messDigestTrees.getDigestSize(); - gmssRandom = new GMSSRandom(messDigestTrees); - } - - public void init(boolean forSigning, - CipherParameters param) - { - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - // XXX random needed? - this.random = rParam.getRandom(); - this.key = (GMSSPrivateKeyParameters)rParam.getParameters(); - initSign(); - - } - else - { - - this.random = new SecureRandom(); - this.key = (GMSSPrivateKeyParameters)param; - initSign(); - } - } - else - { - this.key = (GMSSPublicKeyParameters)param; - initVerify(); - - } - - } - - - /** - * Initializes the signature algorithm for signing a message. - */ - private void initSign() - { - - messDigestTrees.reset(); - // set private key and take from it ots key, auth, tree and key - // counter, rootSign - GMSSPrivateKeyParameters gmssPrivateKey = (GMSSPrivateKeyParameters)key; - - // check if last signature has been generated - if (gmssPrivateKey.getIndex(0) >= gmssPrivateKey.getNumLeafs(0)) - { - throw new RuntimeException("No more signatures can be generated"); - } - - // get Parameterset - this.gmssPS = gmssPrivateKey.getParameters(); - // get numLayer - this.numLayer = gmssPS.getNumOfLayers(); - - // get OTS Instance of lowest layer - byte[] seed = gmssPrivateKey.getCurrentSeeds()[numLayer - 1]; - byte[] OTSSeed = new byte[mdLength]; - byte[] dummy = new byte[mdLength]; - System.arraycopy(seed, 0, dummy, 0, mdLength); - OTSSeed = gmssRandom.nextSeed(dummy); // secureRandom.nextBytes(currentSeeds[currentSeeds.length-1]);secureRandom.nextBytes(OTSseed); - this.ots = new WinternitzOTSignature(OTSSeed, digestProvider.get(), gmssPS.getWinternitzParameter()[numLayer - 1]); - - byte[][][] helpCurrentAuthPaths = gmssPrivateKey.getCurrentAuthPaths(); - currentAuthPaths = new byte[numLayer][][]; - - // copy the main tree authentication path - for (int j = 0; j < numLayer; j++) - { - currentAuthPaths[j] = new byte[helpCurrentAuthPaths[j].length][mdLength]; - for (int i = 0; i < helpCurrentAuthPaths[j].length; i++) - { - System.arraycopy(helpCurrentAuthPaths[j][i], 0, currentAuthPaths[j][i], 0, mdLength); - } - } - - // copy index - index = new int[numLayer]; - System.arraycopy(gmssPrivateKey.getIndex(), 0, index, 0, numLayer); - - // copy subtreeRootSig - byte[] helpSubtreeRootSig; - subtreeRootSig = new byte[numLayer - 1][]; - for (int i = 0; i < numLayer - 1; i++) - { - helpSubtreeRootSig = gmssPrivateKey.getSubtreeRootSig(i); - subtreeRootSig[i] = new byte[helpSubtreeRootSig.length]; - System.arraycopy(helpSubtreeRootSig, 0, subtreeRootSig[i], 0, helpSubtreeRootSig.length); - } - - // change private key for next signature - gmssPrivateKey.nextKey(numLayer - 1); - - - } - - /** - * Signs a message. - *

    - * - * @return the signature. - */ - public byte[] generateSignature(byte[] message) - { - - byte[] otsSig = new byte[mdLength]; - byte[] authPathBytes; - byte[] indexBytes; - - otsSig = ots.getSignature(message); - - // get concatenated lowest layer tree authentication path - authPathBytes = gmssUtil.concatenateArray(currentAuthPaths[numLayer - 1]); - - // put lowest layer index into a byte array - indexBytes = gmssUtil.intToBytesLittleEndian(index[numLayer - 1]); - - // create first part of GMSS signature - byte[] gmssSigFirstPart = new byte[indexBytes.length + otsSig.length + authPathBytes.length]; - System.arraycopy(indexBytes, 0, gmssSigFirstPart, 0, indexBytes.length); - System.arraycopy(otsSig, 0, gmssSigFirstPart, indexBytes.length, otsSig.length); - System.arraycopy(authPathBytes, 0, gmssSigFirstPart, (indexBytes.length + otsSig.length), authPathBytes.length); - // --- end first part - - // --- next parts of the signature - // create initial array with length 0 for iteration - byte[] gmssSigNextPart = new byte[0]; - - for (int i = numLayer - 1 - 1; i >= 0; i--) - { - - // get concatenated next tree authentication path - authPathBytes = gmssUtil.concatenateArray(currentAuthPaths[i]); - - // put next tree index into a byte array - indexBytes = gmssUtil.intToBytesLittleEndian(index[i]); - - // create next part of GMSS signature - - // create help array and copy actual gmssSig into it - byte[] helpGmssSig = new byte[gmssSigNextPart.length]; - System.arraycopy(gmssSigNextPart, 0, helpGmssSig, 0, gmssSigNextPart.length); - // adjust length of gmssSigNextPart for adding next part - gmssSigNextPart = new byte[helpGmssSig.length + indexBytes.length + subtreeRootSig[i].length + authPathBytes.length]; - - // copy old data (help array) and new data in gmssSigNextPart - System.arraycopy(helpGmssSig, 0, gmssSigNextPart, 0, helpGmssSig.length); - System.arraycopy(indexBytes, 0, gmssSigNextPart, helpGmssSig.length, indexBytes.length); - System.arraycopy(subtreeRootSig[i], 0, gmssSigNextPart, (helpGmssSig.length + indexBytes.length), subtreeRootSig[i].length); - System.arraycopy(authPathBytes, 0, gmssSigNextPart, (helpGmssSig.length + indexBytes.length + subtreeRootSig[i].length), authPathBytes.length); - - } - // --- end next parts - - // concatenate the two parts of the GMSS signature - byte[] gmssSig = new byte[gmssSigFirstPart.length + gmssSigNextPart.length]; - System.arraycopy(gmssSigFirstPart, 0, gmssSig, 0, gmssSigFirstPart.length); - System.arraycopy(gmssSigNextPart, 0, gmssSig, gmssSigFirstPart.length, gmssSigNextPart.length); - - // return the GMSS signature - return gmssSig; - } - - /** - * Initializes the signature algorithm for verifying a signature. - */ - private void initVerify() - { - messDigestTrees.reset(); - - GMSSPublicKeyParameters gmssPublicKey = (GMSSPublicKeyParameters)key; - pubKeyBytes = gmssPublicKey.getPublicKey(); - gmssPS = gmssPublicKey.getParameters(); - // get numLayer - this.numLayer = gmssPS.getNumOfLayers(); - - - } - - /** - * This function verifies the signature of the message that has been - * updated, with the aid of the public key. - * - * @param message the message - * @param signature the signature associated with the message - * @return true if the signature has been verified, false otherwise. - */ - public boolean verifySignature(byte[] message, byte[] signature) - { - - boolean success = false; - // int halfSigLength = signature.length >>> 1; - messDigestOTS.reset(); - WinternitzOTSVerify otsVerify; - int otsSigLength; - - byte[] help = message; - - byte[] otsSig; - byte[] otsPublicKey; - byte[][] authPath; - byte[] dest; - int nextEntry = 0; - int index; - // Verify signature - - // --- begin with message = 'message that was signed' - // and then in each step message = subtree root - for (int j = numLayer - 1; j >= 0; j--) - { - otsVerify = new WinternitzOTSVerify(digestProvider.get(), gmssPS.getWinternitzParameter()[j]); - otsSigLength = otsVerify.getSignatureLength(); - - message = help; - // get the subtree index - index = gmssUtil.bytesToIntLittleEndian(signature, nextEntry); - - // 4 is the number of bytes in integer - nextEntry += 4; - - // get one-time signature - otsSig = new byte[otsSigLength]; - System.arraycopy(signature, nextEntry, otsSig, 0, otsSigLength); - nextEntry += otsSigLength; - - // compute public OTS key from the one-time signature - otsPublicKey = otsVerify.Verify(message, otsSig); - - // test if OTSsignature is correct - if (otsPublicKey == null) - { - System.err.println("OTS Public Key is null in GMSSSignature.verify"); - return false; - } - - // get authentication path from the signature - authPath = new byte[gmssPS.getHeightOfTrees()[j]][mdLength]; - for (int i = 0; i < authPath.length; i++) - { - System.arraycopy(signature, nextEntry, authPath[i], 0, mdLength); - nextEntry = nextEntry + mdLength; - } - - // compute the root of the subtree from the authentication path - help = new byte[mdLength]; - - help = otsPublicKey; - - int count = 1 << authPath.length; - count = count + index; - - for (int i = 0; i < authPath.length; i++) - { - dest = new byte[mdLength << 1]; - - if ((count % 2) == 0) - { - System.arraycopy(help, 0, dest, 0, mdLength); - System.arraycopy(authPath[i], 0, dest, mdLength, mdLength); - count = count / 2; - } - else - { - System.arraycopy(authPath[i], 0, dest, 0, mdLength); - System.arraycopy(help, 0, dest, mdLength, help.length); - count = (count - 1) / 2; - } - messDigestTrees.update(dest, 0, dest.length); - help = new byte[messDigestTrees.getDigestSize()]; - messDigestTrees.doFinal(help, 0); - } - } - - // now help contains the root of the maintree - - // test if help is equal to the GMSS public key - if (Arrays.areEqual(pubKeyBytes, help)) - { - success = true; - } - - return success; - } - - -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSUtils.java deleted file mode 100644 index 444715d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/GMSSUtils.java +++ /dev/null @@ -1,145 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.util.Enumeration; -import java.util.Vector; - -import org.bc.util.Arrays; - -class GMSSUtils -{ - static GMSSLeaf[] clone(GMSSLeaf[] data) - { - if (data == null) - { - return null; - } - GMSSLeaf[] copy = new GMSSLeaf[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - static GMSSRootCalc[] clone(GMSSRootCalc[] data) - { - if (data == null) - { - return null; - } - GMSSRootCalc[] copy = new GMSSRootCalc[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - static GMSSRootSig[] clone(GMSSRootSig[] data) - { - if (data == null) - { - return null; - } - GMSSRootSig[] copy = new GMSSRootSig[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - static byte[][] clone(byte[][] data) - { - if (data == null) - { - return null; - } - byte[][] copy = new byte[data.length][]; - - for (int i = 0; i != data.length; i++) - { - copy[i] = Arrays.clone(data[i]); - } - - return copy; - } - - static byte[][][] clone(byte[][][] data) - { - if (data == null) - { - return null; - } - byte[][][] copy = new byte[data.length][][]; - - for (int i = 0; i != data.length; i++) - { - copy[i] = clone(data[i]); - } - - return copy; - } - - static Treehash[] clone(Treehash[] data) - { - if (data == null) - { - return null; - } - Treehash[] copy = new Treehash[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - static Treehash[][] clone(Treehash[][] data) - { - if (data == null) - { - return null; - } - Treehash[][] copy = new Treehash[data.length][]; - - for (int i = 0; i != data.length; i++) - { - copy[i] = clone(data[i]); - } - - return copy; - } - - static Vector[] clone(Vector[] data) - { - if (data == null) - { - return null; - } - Vector[] copy = new Vector[data.length]; - - for (int i = 0; i != data.length; i++) - { - copy[i] = new Vector(); - for (Enumeration en = data[i].elements(); en.hasMoreElements();) - { - copy[i].addElement(en.nextElement()); - } - } - - return copy; - } - - static Vector[][] clone(Vector[][] data) - { - if (data == null) - { - return null; - } - Vector[][] copy = new Vector[data.length][]; - - for (int i = 0; i != data.length; i++) - { - copy[i] = clone(data[i]); - } - - return copy; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/Treehash.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/Treehash.java deleted file mode 100644 index e1a483d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/Treehash.java +++ /dev/null @@ -1,525 +0,0 @@ -package org.bc.pqc.crypto.gmss; - -import java.util.Vector; - -import org.bc.crypto.Digest; -import org.bc.pqc.crypto.gmss.util.GMSSRandom; -import org.bc.util.Integers; -import org.bc.util.encoders.Hex; - - -/** - * This class implements a treehash instance for the Merkle tree traversal - * algorithm. The first node of the stack is stored in this instance itself, - * additional tail nodes are stored on a tailstack. - */ -public class Treehash -{ - - /** - * max height of current treehash instance. - */ - private int maxHeight; - - /** - * Vector element that stores the nodes on the stack - */ - private Vector tailStack; - - /** - * Vector element that stores the height of the nodes on the stack - */ - private Vector heightOfNodes; - - /** - * the first node is stored in the treehash instance itself, not on stack - */ - private byte[] firstNode; - - /** - * seedActive needed for the actual node - */ - private byte[] seedActive; - - /** - * the seed needed for the next re-initialization of the treehash instance - */ - private byte[] seedNext; - - /** - * number of nodes stored on the stack and belonging to this treehash - * instance - */ - private int tailLength; - - /** - * the height in the tree of the first node stored in treehash - */ - private int firstNodeHeight; - - /** - * true if treehash instance was already initialized, false otherwise - */ - private boolean isInitialized; - - /** - * true if the first node's height equals the maxHeight of the treehash - */ - private boolean isFinished; - - /** - * true if the nextSeed has been initialized with index 3*2^h needed for the - * seed scheduling - */ - private boolean seedInitialized; - - /** - * denotes the Message Digest used by the tree to create nodes - */ - private Digest messDigestTree; - - /** - * This constructor regenerates a prior treehash object - * - * @param name an array of strings, containing the name of the used hash - * function and PRNG and the name of the corresponding provider - * @param statByte status bytes - * @param statInt status ints - */ - public Treehash(Digest name, byte[][] statByte, int[] statInt) - { - this.messDigestTree = name; - - // decode statInt - this.maxHeight = statInt[0]; - this.tailLength = statInt[1]; - this.firstNodeHeight = statInt[2]; - - if (statInt[3] == 1) - { - this.isFinished = true; - } - else - { - this.isFinished = false; - } - if (statInt[4] == 1) - { - this.isInitialized = true; - } - else - { - this.isInitialized = false; - } - if (statInt[5] == 1) - { - this.seedInitialized = true; - } - else - { - this.seedInitialized = false; - } - - this.heightOfNodes = new Vector(); - for (int i = 0; i < tailLength; i++) - { - this.heightOfNodes.addElement(Integers.valueOf(statInt[6 + i])); - } - - // decode statByte - this.firstNode = statByte[0]; - this.seedActive = statByte[1]; - this.seedNext = statByte[2]; - - this.tailStack = new Vector(); - for (int i = 0; i < tailLength; i++) - { - this.tailStack.addElement(statByte[3 + i]); - } - } - - /** - * Constructor - * - * @param tailStack a vector element where the stack nodes are stored - * @param maxHeight maximal height of the treehash instance - * @param digest an array of strings, containing the name of the used hash - * function and PRNG and the name of the corresponding provider - */ - public Treehash(Vector tailStack, int maxHeight, Digest digest) - { - this.tailStack = tailStack; - this.maxHeight = maxHeight; - this.firstNode = null; - this.isInitialized = false; - this.isFinished = false; - this.seedInitialized = false; - this.messDigestTree = digest; - - this.seedNext = new byte[messDigestTree.getDigestSize()]; - this.seedActive = new byte[messDigestTree.getDigestSize()]; - } - - /** - * Method to initialize the seeds needed for the precomputation of right - * nodes. Should be initialized with index 3*2^i for treehash_i - * - * @param seedIn - */ - public void initializeSeed(byte[] seedIn) - { - System.arraycopy(seedIn, 0, this.seedNext, 0, this.messDigestTree - .getDigestSize()); - this.seedInitialized = true; - } - - /** - * initializes the treehash instance. The seeds must already have been - * initialized to work correctly. - */ - public void initialize() - { - if (!this.seedInitialized) - { - System.err.println("Seed " + this.maxHeight + " not initialized"); - return; - } - - this.heightOfNodes = new Vector(); - this.tailLength = 0; - this.firstNode = null; - this.firstNodeHeight = -1; - this.isInitialized = true; - System.arraycopy(this.seedNext, 0, this.seedActive, 0, messDigestTree - .getDigestSize()); - } - - /** - * Calculates one update of the treehash instance, i.e. creates a new leaf - * and hashes if possible - * - * @param gmssRandom an instance of the PRNG - * @param leaf The byte value of the leaf needed for the update - */ - public void update(GMSSRandom gmssRandom, byte[] leaf) - { - - if (this.isFinished) - { - System.err - .println("No more update possible for treehash instance!"); - return; - } - if (!this.isInitialized) - { - System.err - .println("Treehash instance not initialized before update"); - return; - } - - byte[] help = new byte[this.messDigestTree.getDigestSize()]; - int helpHeight = -1; - - gmssRandom.nextSeed(this.seedActive); - - // if treehash gets first update - if (this.firstNode == null) - { - this.firstNode = leaf; - this.firstNodeHeight = 0; - } - else - { - // store the new node in help array, do not push it on the stack - help = leaf; - helpHeight = 0; - - // hash the nodes on the stack if possible - while (this.tailLength > 0 - && helpHeight == ((Integer)heightOfNodes.lastElement()) - .intValue()) - { - // put top element of the stack and help node in array - // 'tobehashed' - // and hash them together, put result again in help array - byte[] toBeHashed = new byte[this.messDigestTree - .getDigestSize() << 1]; - - // pop element from stack - System.arraycopy(this.tailStack.lastElement(), 0, toBeHashed, - 0, this.messDigestTree.getDigestSize()); - this.tailStack.removeElementAt(this.tailStack.size() - 1); - this.heightOfNodes - .removeElementAt(this.heightOfNodes.size() - 1); - - System.arraycopy(help, 0, toBeHashed, this.messDigestTree - .getDigestSize(), this.messDigestTree - .getDigestSize()); - messDigestTree.update(toBeHashed, 0, toBeHashed.length); - help = new byte[messDigestTree.getDigestSize()]; - messDigestTree.doFinal(help, 0); - - // increase help height, stack was reduced by one element - helpHeight++; - this.tailLength--; - } - - // push the new node on the stack - this.tailStack.addElement(help); - this.heightOfNodes.addElement(Integers.valueOf(helpHeight)); - this.tailLength++; - - // finally check whether the top node on stack and the first node - // in treehash have same height. If so hash them together - // and store them in treehash - if (((Integer)heightOfNodes.lastElement()).intValue() == this.firstNodeHeight) - { - byte[] toBeHashed = new byte[this.messDigestTree - .getDigestSize() << 1]; - System.arraycopy(this.firstNode, 0, toBeHashed, 0, - this.messDigestTree.getDigestSize()); - - // pop element from tailStack and copy it into help2 array - System.arraycopy(this.tailStack.lastElement(), 0, toBeHashed, - this.messDigestTree.getDigestSize(), - this.messDigestTree.getDigestSize()); - this.tailStack.removeElementAt(this.tailStack.size() - 1); - this.heightOfNodes - .removeElementAt(this.heightOfNodes.size() - 1); - - // store new element in firstNode, stack is then empty - messDigestTree.update(toBeHashed, 0, toBeHashed.length); - this.firstNode = new byte[messDigestTree.getDigestSize()]; - messDigestTree.doFinal(this.firstNode, 0); - this.firstNodeHeight++; - - // empty the stack - this.tailLength = 0; - } - } - - // check if treehash instance is completed - if (this.firstNodeHeight == this.maxHeight) - { - this.isFinished = true; - } - } - - /** - * Destroys a treehash instance after the top node was taken for - * authentication path. - */ - public void destroy() - { - this.isInitialized = false; - this.isFinished = false; - this.firstNode = null; - this.tailLength = 0; - this.firstNodeHeight = -1; - } - - /** - * Returns the height of the lowest node stored either in treehash or on the - * stack. It must not be set to infinity (as mentioned in the paper) because - * this cases are considered in the computeAuthPaths method of - * JDKGMSSPrivateKey - * - * @return Height of the lowest node - */ - public int getLowestNodeHeight() - { - if (this.firstNode == null) - { - return this.maxHeight; - } - else if (this.tailLength == 0) - { - return this.firstNodeHeight; - } - else - { - return Math.min(this.firstNodeHeight, ((Integer)heightOfNodes - .lastElement()).intValue()); - } - } - - /** - * Returns the top node height - * - * @return Height of the first node, the top node - */ - public int getFirstNodeHeight() - { - if (firstNode == null) - { - return maxHeight; - } - return firstNodeHeight; - } - - /** - * Method to check whether the instance has been initialized or not - * - * @return true if treehash was already initialized - */ - public boolean wasInitialized() - { - return this.isInitialized; - } - - /** - * Method to check whether the instance has been finished or not - * - * @return true if treehash has reached its maximum height - */ - public boolean wasFinished() - { - return this.isFinished; - } - - /** - * returns the first node stored in treehash instance itself - * - * @return the first node stored in treehash instance itself - */ - public byte[] getFirstNode() - { - return this.firstNode; - } - - /** - * returns the active seed - * - * @return the active seed - */ - public byte[] getSeedActive() - { - return this.seedActive; - } - - /** - * This method sets the first node stored in the treehash instance itself - * - * @param hash - */ - public void setFirstNode(byte[] hash) - { - if (!this.isInitialized) - { - this.initialize(); - } - this.firstNode = hash; - this.firstNodeHeight = this.maxHeight; - this.isFinished = true; - } - - /** - * updates the nextSeed of this treehash instance one step needed for the - * schedulng of the seeds - * - * @param gmssRandom the prng used for the seeds - */ - public void updateNextSeed(GMSSRandom gmssRandom) - { - gmssRandom.nextSeed(seedNext); - } - - /** - * Returns the tailstack - * - * @return the tailstack - */ - public Vector getTailStack() - { - return this.tailStack; - } - - /** - * Returns the status byte array used by the GMSSPrivateKeyASN.1 class - * - * @return The status bytes - */ - public byte[][] getStatByte() - { - - byte[][] statByte = new byte[3 + tailLength][this.messDigestTree - .getDigestSize()]; - statByte[0] = firstNode; - statByte[1] = seedActive; - statByte[2] = seedNext; - for (int i = 0; i < tailLength; i++) - { - statByte[3 + i] = (byte[])tailStack.elementAt(i); - } - return statByte; - } - - /** - * Returns the status int array used by the GMSSPrivateKeyASN.1 class - * - * @return The status ints - */ - public int[] getStatInt() - { - - int[] statInt = new int[6 + tailLength]; - statInt[0] = maxHeight; - statInt[1] = tailLength; - statInt[2] = firstNodeHeight; - if (this.isFinished) - { - statInt[3] = 1; - } - else - { - statInt[3] = 0; - } - if (this.isInitialized) - { - statInt[4] = 1; - } - else - { - statInt[4] = 0; - } - if (this.seedInitialized) - { - statInt[5] = 1; - } - else - { - statInt[5] = 0; - } - for (int i = 0; i < tailLength; i++) - { - statInt[6 + i] = ((Integer)heightOfNodes.elementAt(i)).intValue(); - } - return statInt; - } - - /** - * returns a String representation of the treehash instance - */ - public String toString() - { - String out = "Treehash : "; - for (int i = 0; i < 6 + tailLength; i++) - { - out = out + this.getStatInt()[i] + " "; - } - for (int i = 0; i < 3 + tailLength; i++) - { - if (this.getStatByte()[i] != null) - { - out = out + new String(Hex.encode((this.getStatByte()[i]))) + " "; - } - else - { - out = out + "null "; - } - } - out = out + " " + this.messDigestTree.getDigestSize(); - return out; - } - -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSRandom.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSRandom.java deleted file mode 100644 index b6db5c9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSRandom.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.bc.pqc.crypto.gmss.util; - -import org.bc.crypto.Digest; - -/** - * This class provides a PRNG for GMSS - */ -public class GMSSRandom -{ - /** - * Hash function for the construction of the authentication trees - */ - private Digest messDigestTree; - - /** - * Constructor - * - * @param messDigestTree2 - */ - public GMSSRandom(Digest messDigestTree2) - { - - this.messDigestTree = messDigestTree2; - } - - /** - * computes the next seed value, returns a random byte array and sets - * outseed to the next value - * - * @param outseed byte array in which ((1 + SEEDin +RAND) mod 2^n) will be - * stored - * @return byte array of H(SEEDin) - */ - public byte[] nextSeed(byte[] outseed) - { - // RAND <-- H(SEEDin) - byte[] rand = new byte[outseed.length]; - messDigestTree.update(outseed, 0, outseed.length); - rand = new byte[messDigestTree.getDigestSize()]; - messDigestTree.doFinal(rand, 0); - - // SEEDout <-- (1 + SEEDin +RAND) mod 2^n - addByteArrays(outseed, rand); - addOne(outseed); - - // System.arraycopy(outseed, 0, outseed, 0, outseed.length); - - return rand; - } - - private void addByteArrays(byte[] a, byte[] b) - { - - byte overflow = 0; - int temp; - - for (int i = 0; i < a.length; i++) - { - temp = (0xFF & a[i]) + (0xFF & b[i]) + overflow; - a[i] = (byte)temp; - overflow = (byte)(temp >> 8); - } - } - - private void addOne(byte[] a) - { - - byte overflow = 1; - int temp; - - for (int i = 0; i < a.length; i++) - { - temp = (0xFF & a[i]) + overflow; - a[i] = (byte)temp; - overflow = (byte)(temp >> 8); - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSUtil.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSUtil.java deleted file mode 100644 index cc63ca9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/GMSSUtil.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.pqc.crypto.gmss.util; - -/** - * This class provides several methods that are required by the GMSS classes. - */ -public class GMSSUtil -{ - /** - * Converts a 32 bit integer into a byte array beginning at - * offset (little-endian representation) - * - * @param value the integer to convert - */ - public byte[] intToBytesLittleEndian(int value) - { - byte[] bytes = new byte[4]; - - bytes[0] = (byte)((value) & 0xff); - bytes[1] = (byte)((value >> 8) & 0xff); - bytes[2] = (byte)((value >> 16) & 0xff); - bytes[3] = (byte)((value >> 24) & 0xff); - return bytes; - } - - /** - * Converts a byte array beginning at offset into a 32 bit - * integer (little-endian representation) - * - * @param bytes the byte array - * @return The resulting integer - */ - public int bytesToIntLittleEndian(byte[] bytes) - { - - return ((bytes[0] & 0xff)) | ((bytes[1] & 0xff) << 8) - | ((bytes[2] & 0xff) << 16) | ((bytes[3] & 0xff)) << 24; - } - - /** - * Converts a byte array beginning at offset into a 32 bit - * integer (little-endian representation) - * - * @param bytes the byte array - * @param offset the integer offset into the byte array - * @return The resulting integer - */ - public int bytesToIntLittleEndian(byte[] bytes, int offset) - { - return ((bytes[offset++] & 0xff)) | ((bytes[offset++] & 0xff) << 8) - | ((bytes[offset++] & 0xff) << 16) - | ((bytes[offset] & 0xff)) << 24; - } - - /** - * This method concatenates a 2-dimensional byte array into a 1-dimensional - * byte array - * - * @param arraycp a 2-dimensional byte array. - * @return 1-dimensional byte array with concatenated input array - */ - public byte[] concatenateArray(byte[][] arraycp) - { - byte[] dest = new byte[arraycp.length * arraycp[0].length]; - int indx = 0; - for (int i = 0; i < arraycp.length; i++) - { - System.arraycopy(arraycp[i], 0, dest, indx, arraycp[i].length); - indx = indx + arraycp[i].length; - } - return dest; - } - - /** - * This method prints the values of a 2-dimensional byte array - * - * @param text a String - * @param array a 2-dimensional byte array - */ - public void printArray(String text, byte[][] array) - { - System.out.println(text); - int counter = 0; - for (int i = 0; i < array.length; i++) - { - for (int j = 0; j < array[0].length; j++) - { - System.out.println(counter + "; " + array[i][j]); - counter++; - } - } - } - - /** - * This method prints the values of a 1-dimensional byte array - * - * @param text a String - * @param array a 1-dimensional byte array. - */ - public void printArray(String text, byte[] array) - { - System.out.println(text); - int counter = 0; - for (int i = 0; i < array.length; i++) - { - System.out.println(counter + "; " + array[i]); - counter++; - } - } - - /** - * This method tests if an integer is a power of 2. - * - * @param testValue an integer - * @return TRUE if testValue is a power of 2, - * FALSE otherwise - */ - public boolean testPowerOfTwo(int testValue) - { - int a = 1; - while (a < testValue) - { - a <<= 1; - } - if (testValue == a) - { - return true; - } - - return false; - } - - /** - * This method returns the least integer that is greater or equal to the - * logarithm to the base 2 of an integer intValue. - * - * @param intValue an integer - * @return The least integer greater or equal to the logarithm to the base 2 - * of intValue - */ - public int getLog(int intValue) - { - int log = 1; - int i = 2; - while (i < intValue) - { - i <<= 1; - log++; - } - return log; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSVerify.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSVerify.java deleted file mode 100644 index 8175670..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSVerify.java +++ /dev/null @@ -1,345 +0,0 @@ -package org.bc.pqc.crypto.gmss.util; - -import org.bc.crypto.Digest; - -/** - * This class implements signature verification of the Winternitz one-time - * signature scheme (OTSS), described in C.Dods, N.P. Smart, and M. Stam, "Hash - * Based Digital Signature Schemes", LNCS 3796, pages 96–115, 2005. The - * class is used by the GMSS classes. - */ -public class WinternitzOTSVerify -{ - - private Digest messDigestOTS; - - /** - * The Winternitz parameter - */ - private int w; - - /** - * The constructor - *

    - * - * @param digest the name of the hash function used by the OTS and the provider - * name of the hash function - * @param w the Winternitz parameter - */ - public WinternitzOTSVerify(Digest digest, int w) - { - this.w = w; - - messDigestOTS = digest; - } - - /** - * @return The length of the one-time signature - */ - public int getSignatureLength() - { - int mdsize = messDigestOTS.getDigestSize(); - int size = ((mdsize << 3) + (w - 1)) / w; - int logs = getLog((size << w) + 1); - size += (logs + w - 1) / w; - - return mdsize * size; - } - - /** - * This method computes the public OTS key from the one-time signature of a - * message. This is *NOT* a complete OTS signature verification, but it - * suffices for usage with CMSS. - * - * @param message the message - * @param signature the one-time signature - * @return The public OTS key - */ - public byte[] Verify(byte[] message, byte[] signature) - { - - int mdsize = messDigestOTS.getDigestSize(); - byte[] hash = new byte[mdsize]; // hash of message m - - // create hash of message m - messDigestOTS.update(message, 0, message.length); - hash = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hash, 0); - - int size = ((mdsize << 3) + (w - 1)) / w; - int logs = getLog((size << w) + 1); - int keysize = size + (logs + w - 1) / w; - - int testKeySize = mdsize * keysize; - - if (testKeySize != signature.length) - { - return null; - } - - byte[] testKey = new byte[testKeySize]; - - int c = 0; - int counter = 0; - int test; - - if (8 % w == 0) - { - int d = 8 / w; - int k = (1 << w) - 1; - byte[] hlp = new byte[mdsize]; - - // verify signature - for (int i = 0; i < hash.length; i++) - { - for (int j = 0; j < d; j++) - { - test = hash[i] & k; - c += test; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - hash[i] = (byte)(hash[i] >>> w); - counter++; - } - } - - c = (size << w) - c; - for (int i = 0; i < logs; i += w) - { - test = c & k; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test++; - } - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - } - else if (w < 8) - { - int d = mdsize / w; - int k = (1 << w) - 1; - byte[] hlp = new byte[mdsize]; - long big8; - int ii = 0; - // create signature - // first d*w bytes of hash - for (int i = 0; i < d; i++) - { - big8 = 0; - for (int j = 0; j < w; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - for (int j = 0; j < 8; j++) - { - test = (int)(big8 & k); - c += test; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - big8 >>>= w; - counter++; - } - } - // rest of hash - d = mdsize % w; - big8 = 0; - for (int j = 0; j < d; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - d <<= 3; - for (int j = 0; j < d; j += w) - { - test = (int)(big8 & k); - c += test; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - big8 >>>= w; - counter++; - } - - // check bytes - c = (size << w) - c; - for (int i = 0; i < logs; i += w) - { - test = c & k; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - }// end if(w<8) - else if (w < 57) - { - int d = (mdsize << 3) - w; - int k = (1 << w) - 1; - byte[] hlp = new byte[mdsize]; - long big8, test8; - int r = 0; - int s, f, rest, ii; - // create signature - // first a*w bits of hash where a*w <= 8*mdsize < (a+1)*w - while (r <= d) - { - s = r >>> 3; - rest = r % 8; - r += w; - f = (r + 7) >>> 3; - big8 = 0; - ii = 0; - for (int j = s; j < f; j++) - { - big8 ^= (hash[j] & 0xff) << (ii << 3); - ii++; - } - - big8 >>>= rest; - test8 = (big8 & k); - c += test8; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test8 < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - counter++; - - } - // rest of hash - s = r >>> 3; - if (s < mdsize) - { - rest = r % 8; - big8 = 0; - ii = 0; - for (int j = s; j < mdsize; j++) - { - big8 ^= (hash[j] & 0xff) << (ii << 3); - ii++; - } - - big8 >>>= rest; - test8 = (big8 & k); - c += test8; - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test8 < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - counter++; - } - // check bytes - c = (size << w) - c; - for (int i = 0; i < logs; i += w) - { - test8 = (c & k); - - System.arraycopy(signature, counter * mdsize, hlp, 0, mdsize); - - while (test8 < k) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8++; - } - - System.arraycopy(hlp, 0, testKey, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - }// end if(w<57) - - byte[] TKey = new byte[mdsize]; - messDigestOTS.update(testKey, 0, testKey.length); - TKey = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(TKey, 0); - - return TKey; - - } - - /** - * This method returns the least integer that is greater or equal to the - * logarithm to the base 2 of an integer intValue. - * - * @param intValue an integer - * @return The least integer greater or equal to the logarithm to the base - * 256 of intValue - */ - public int getLog(int intValue) - { - int log = 1; - int i = 2; - while (i < intValue) - { - i <<= 1; - log++; - } - return log; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSignature.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSignature.java deleted file mode 100644 index b0a9f58..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/gmss/util/WinternitzOTSignature.java +++ /dev/null @@ -1,405 +0,0 @@ -package org.bc.pqc.crypto.gmss.util; - -import org.bc.crypto.Digest; - -/** - * This class implements key pair generation and signature generation of the - * Winternitz one-time signature scheme (OTSS), described in C.Dods, N.P. Smart, - * and M. Stam, "Hash Based Digital Signature Schemes", LNCS 3796, pages - * 96–115, 2005. The class is used by the GMSS classes. - */ - -public class WinternitzOTSignature -{ - - /** - * The hash function used by the OTS - */ - private Digest messDigestOTS; - - /** - * The length of the message digest and private key - */ - private int mdsize, keysize; - - /** - * An array of strings, containing the name of the used hash function, the - * name of the PRGN and the names of the corresponding providers - */ - // private String[] name = new String[2]; - /** - * The private key - */ - private byte[][] privateKeyOTS; - - /** - * The Winternitz parameter - */ - private int w; - - /** - * The source of randomness for OTS private key generation - */ - private GMSSRandom gmssRandom; - - /** - * Sizes of the message and the checksum, both - */ - private int messagesize, checksumsize; - - /** - * The constructor generates an OTS key pair, using seed0 and - * the PRNG - *

    - * - * @param seed0 the seed for the PRGN - * @param digest an array of strings, containing the name of the used hash - * function, the name of the PRGN and the names of the - * corresponding providers - * @param w the Winternitz parameter - */ - public WinternitzOTSignature(byte[] seed0, Digest digest, int w) - { - // this.name = name; - this.w = w; - - messDigestOTS = digest; - - gmssRandom = new GMSSRandom(messDigestOTS); - - // calulate keysize for private and public key and also the help - // array - - mdsize = messDigestOTS.getDigestSize(); - int mdsizeBit = mdsize << 3; - messagesize = (int)Math.ceil((double)(mdsizeBit) / (double)w); - - checksumsize = getLog((messagesize << w) + 1); - - keysize = messagesize - + (int)Math.ceil((double)checksumsize / (double)w); - - /* - * mdsize = messDigestOTS.getDigestLength(); messagesize = - * ((mdsize<<3)+(w-1))/w; - * - * checksumsize = getlog((messagesize< 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - hash[i] = (byte)(hash[i] >>> w); - counter++; - } - } - - c = (messagesize << w) - c; - for (int i = 0; i < checksumsize; i += w) - { - test = c & k; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - - while (test > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - } - else if (w < 8) - { - int d = mdsize / w; - int k = (1 << w) - 1; - byte[] hlp = new byte[mdsize]; - long big8; - int ii = 0; - // create signature - // first d*w bytes of hash - for (int i = 0; i < d; i++) - { - big8 = 0; - for (int j = 0; j < w; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - for (int j = 0; j < 8; j++) - { - test = (int)(big8 & k); - c += test; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - - while (test > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - big8 >>>= w; - counter++; - } - } - // rest of hash - d = mdsize % w; - big8 = 0; - for (int j = 0; j < d; j++) - { - big8 ^= (hash[ii] & 0xff) << (j << 3); - ii++; - } - d <<= 3; - for (int j = 0; j < d; j += w) - { - test = (int)(big8 & k); - c += test; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - - while (test > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - big8 >>>= w; - counter++; - } - - // check bytes - c = (messagesize << w) - c; - for (int i = 0; i < checksumsize; i += w) - { - test = c & k; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - - while (test > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - }// end if(w<8) - else if (w < 57) - { - int d = (mdsize << 3) - w; - int k = (1 << w) - 1; - byte[] hlp = new byte[mdsize]; - long big8, test8; - int r = 0; - int s, f, rest, ii; - // create signature - // first a*w bits of hash where a*w <= 8*mdsize < (a+1)*w - while (r <= d) - { - s = r >>> 3; - rest = r % 8; - r += w; - f = (r + 7) >>> 3; - big8 = 0; - ii = 0; - for (int j = s; j < f; j++) - { - big8 ^= (hash[j] & 0xff) << (ii << 3); - ii++; - } - - big8 >>>= rest; - test8 = (big8 & k); - c += test8; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - while (test8 > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - counter++; - - } - // rest of hash - s = r >>> 3; - if (s < mdsize) - { - rest = r % 8; - big8 = 0; - ii = 0; - for (int j = s; j < mdsize; j++) - { - big8 ^= (hash[j] & 0xff) << (ii << 3); - ii++; - } - - big8 >>>= rest; - test8 = (big8 & k); - c += test8; - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - while (test8 > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - counter++; - } - // check bytes - c = (messagesize << w) - c; - for (int i = 0; i < checksumsize; i += w) - { - test8 = (c & k); - - System.arraycopy(privateKeyOTS[counter], 0, hlp, 0, mdsize); - - while (test8 > 0) - { - messDigestOTS.update(hlp, 0, hlp.length); - hlp = new byte[messDigestOTS.getDigestSize()]; - messDigestOTS.doFinal(hlp, 0); - test8--; - } - System.arraycopy(hlp, 0, sign, counter * mdsize, mdsize); - c >>>= w; - counter++; - } - }// end if(w<57) - - return sign; - } - - /** - * This method returns the least integer that is greater or equal to the - * logarithm to the base 2 of an integer intValue. - * - * @param intValue an integer - * @return The least integer greater or equal to the logarithm to the base 2 - * of intValue - */ - public int getLog(int intValue) - { - int log = 1; - int i = 2; - while (i < intValue) - { - i <<= 1; - log++; - } - return log; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/Conversions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/Conversions.java deleted file mode 100644 index fd5a468..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/Conversions.java +++ /dev/null @@ -1,236 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.math.BigInteger; - -import org.bc.pqc.math.linearalgebra.BigIntUtils; -import org.bc.pqc.math.linearalgebra.GF2Vector; -import org.bc.pqc.math.linearalgebra.IntegerFunctions; - - -/** - * Provides methods for CCA2-Secure Conversions of McEliece PKCS - */ -final class Conversions -{ - private static final BigInteger ZERO = BigInteger.valueOf(0); - private static final BigInteger ONE = BigInteger.valueOf(1); - - /** - * Default constructor (private). - */ - private Conversions() - { - } - - /** - * Encode a number between 0 and (n|t) (binomial coefficient) into a binary - * vector of length n with weight t. The number is given as a byte array. - * Only the first s bits are used, where s = floor[log(n|t)]. - * - * @param n integer - * @param t integer - * @param m the message as a byte array - * @return the encoded message as {@link GF2Vector} - */ - public static GF2Vector encode(final int n, final int t, final byte[] m) - { - if (n < t) - { - throw new IllegalArgumentException("n < t"); - } - - // compute the binomial c = (n|t) - BigInteger c = IntegerFunctions.binomial(n, t); - // get the number encoded in m - BigInteger i = new BigInteger(1, m); - // compare - if (i.compareTo(c) >= 0) - { - throw new IllegalArgumentException("Encoded number too large."); - } - - GF2Vector result = new GF2Vector(n); - - int nn = n; - int tt = t; - for (int j = 0; j < n; j++) - { - c = c.multiply(BigInteger.valueOf(nn - tt)).divide( - BigInteger.valueOf(nn)); - nn--; - if (c.compareTo(i) <= 0) - { - result.setBit(j); - i = i.subtract(c); - tt--; - if (nn == tt) - { - c = ONE; - } - else - { - c = (c.multiply(BigInteger.valueOf(tt + 1))) - .divide(BigInteger.valueOf(nn - tt)); - } - } - } - - return result; - } - - /** - * Decode a binary vector of length n and weight t into a number between 0 - * and (n|t) (binomial coefficient). The result is given as a byte array of - * length floor[(s+7)/8], where s = floor[log(n|t)]. - * - * @param n integer - * @param t integer - * @param vec the binary vector - * @return the decoded vector as a byte array - */ - public static byte[] decode(int n, int t, GF2Vector vec) - { - if ((vec.getLength() != n) || (vec.getHammingWeight() != t)) - { - throw new IllegalArgumentException( - "vector has wrong length or hamming weight"); - } - int[] vecArray = vec.getVecArray(); - - BigInteger bc = IntegerFunctions.binomial(n, t); - BigInteger d = ZERO; - int nn = n; - int tt = t; - for (int i = 0; i < n; i++) - { - bc = bc.multiply(BigInteger.valueOf(nn - tt)).divide( - BigInteger.valueOf(nn)); - nn--; - - int q = i >> 5; - int e = vecArray[q] & (1 << (i & 0x1f)); - if (e != 0) - { - d = d.add(bc); - tt--; - if (nn == tt) - { - bc = ONE; - } - else - { - bc = bc.multiply(BigInteger.valueOf(tt + 1)).divide( - BigInteger.valueOf(nn - tt)); - } - - } - } - - return BigIntUtils.toMinimalByteArray(d); - } - - /** - * Compute a message representative of a message given as a vector of length - * n bit and of hamming weight t. The result is a - * byte array of length (s+7)/8, where - * s = floor[log(n|t)]. - * - * @param n integer - * @param t integer - * @param m the message vector as a byte array - * @return a message representative for m - */ - public static byte[] signConversion(int n, int t, byte[] m) - { - if (n < t) - { - throw new IllegalArgumentException("n < t"); - } - - BigInteger bc = IntegerFunctions.binomial(n, t); - // finds s = floor[log(binomial(n,t))] - int s = bc.bitLength() - 1; - // s = sq*8 + sr; - int sq = s >> 3; - int sr = s & 7; - if (sr == 0) - { - sq--; - sr = 8; - } - - // n = nq*8+nr; - int nq = n >> 3; - int nr = n & 7; - if (nr == 0) - { - nq--; - nr = 8; - } - // take s bit from m - byte[] data = new byte[nq + 1]; - if (m.length < data.length) - { - System.arraycopy(m, 0, data, 0, m.length); - for (int i = m.length; i < data.length; i++) - { - data[i] = 0; - } - } - else - { - System.arraycopy(m, 0, data, 0, nq); - int h = (1 << nr) - 1; - data[nq] = (byte)(h & m[nq]); - } - - BigInteger d = ZERO; - int nn = n; - int tt = t; - for (int i = 0; i < n; i++) - { - bc = (bc.multiply(new BigInteger(Integer.toString(nn - tt)))) - .divide(new BigInteger(Integer.toString(nn))); - nn--; - - int q = i >>> 3; - int r = i & 7; - r = 1 << r; - byte e = (byte)(r & data[q]); - if (e != 0) - { - d = d.add(bc); - tt--; - if (nn == tt) - { - bc = ONE; - } - else - { - bc = (bc - .multiply(new BigInteger(Integer.toString(tt + 1)))) - .divide(new BigInteger(Integer.toString(nn - tt))); - } - } - } - - byte[] result = new byte[sq + 1]; - byte[] help = d.toByteArray(); - if (help.length < result.length) - { - System.arraycopy(help, 0, result, 0, help.length); - for (int i = help.length; i < result.length; i++) - { - result[i] = 0; - } - } - else - { - System.arraycopy(help, 0, result, 0, sq); - result[sq] = (byte)(((1 << sr) - 1) & help[sq]); - } - - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyGenerationParameters.java deleted file mode 100644 index 3778317..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyGenerationParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class McElieceCCA2KeyGenerationParameters - extends KeyGenerationParameters -{ - private McElieceCCA2Parameters params; - - public McElieceCCA2KeyGenerationParameters( - SecureRandom random, - McElieceCCA2Parameters params) - { - // XXX key size? - super(random, 128); - this.params = params; - } - - public McElieceCCA2Parameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyPairGenerator.java deleted file mode 100644 index b24f57f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyPairGenerator.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.GoppaCode; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; -import org.bc.pqc.math.linearalgebra.PolynomialRingGF2m; -import org.bc.pqc.math.linearalgebra.GoppaCode.MaMaPe; - - -/** - * This class implements key pair generation of the McEliece Public Key - * Cryptosystem (McEliecePKC). - */ -public class McElieceCCA2KeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - - - /** - * The OID of the algorithm. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.2"; - - private McElieceCCA2KeyGenerationParameters mcElieceCCA2Params; - - // the extension degree of the finite field GF(2^m) - private int m; - - // the length of the code - private int n; - - // the error correction capability - private int t; - - // the field polynomial - private int fieldPoly; - - // the source of randomness - private SecureRandom random; - - // flag indicating whether the key pair generator has been initialized - private boolean initialized = false; - - /** - * Default initialization of the key pair generator. - */ - private void initializeDefault() - { - McElieceCCA2KeyGenerationParameters mcCCA2Params = new McElieceCCA2KeyGenerationParameters(new SecureRandom(), new McElieceCCA2Parameters()); - init(mcCCA2Params); - } - - // TODO - public void init( - KeyGenerationParameters param) - { - this.mcElieceCCA2Params = (McElieceCCA2KeyGenerationParameters)param; - - // set source of randomness - this.random = new SecureRandom(); - - this.m = this.mcElieceCCA2Params.getParameters().getM(); - this.n = this.mcElieceCCA2Params.getParameters().getN(); - this.t = this.mcElieceCCA2Params.getParameters().getT(); - this.fieldPoly = this.mcElieceCCA2Params.getParameters().getFieldPoly(); - this.initialized = true; - } - - - public AsymmetricCipherKeyPair generateKeyPair() - { - - if (!initialized) - { - initializeDefault(); - } - - // finite field GF(2^m) - GF2mField field = new GF2mField(m, fieldPoly); - - // irreducible Goppa polynomial - PolynomialGF2mSmallM gp = new PolynomialGF2mSmallM(field, t, - PolynomialGF2mSmallM.RANDOM_IRREDUCIBLE_POLYNOMIAL, random); - PolynomialRingGF2m ring = new PolynomialRingGF2m(field, gp); - - // matrix for computing square roots in (GF(2^m))^t - PolynomialGF2mSmallM[] qInv = ring.getSquareRootMatrix(); - - // generate canonical check matrix - GF2Matrix h = GoppaCode.createCanonicalCheckMatrix(field, gp); - - // compute short systematic form of check matrix - MaMaPe mmp = GoppaCode.computeSystematicForm(h, random); - GF2Matrix shortH = mmp.getSecondMatrix(); - Permutation p = mmp.getPermutation(); - - // compute short systematic form of generator matrix - GF2Matrix shortG = (GF2Matrix)shortH.computeTranspose(); - - // obtain number of rows of G (= dimension of the code) - int k = shortG.getNumRows(); - - // generate keys - McElieceCCA2PublicKeyParameters pubKey = new McElieceCCA2PublicKeyParameters(OID, n, t, shortG, mcElieceCCA2Params.getParameters()); - McElieceCCA2PrivateKeyParameters privKey = new McElieceCCA2PrivateKeyParameters(OID, n, k, - field, gp, p, h, qInv, mcElieceCCA2Params.getParameters()); - - // return key pair - return new AsymmetricCipherKeyPair(pubKey, privKey); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyParameters.java deleted file mode 100644 index 3a157f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2KeyParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.crypto.params.AsymmetricKeyParameter; - - -public class McElieceCCA2KeyParameters - extends AsymmetricKeyParameter -{ - private McElieceCCA2Parameters params; - - public McElieceCCA2KeyParameters( - boolean isPrivate, - McElieceCCA2Parameters params) - { - super(isPrivate); - this.params = params; - } - - - public McElieceCCA2Parameters getParameters() - { - return params; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Parameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Parameters.java deleted file mode 100644 index c21d987..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Parameters.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA256Digest; - -/** - * This class provides a specification for the parameters of the CCA2-secure - * variants of the McEliece PKCS that are used with - * {@link McElieceFujisakiCipher}, {@link McElieceKobaraImaiCipher}, and - * {@link McEliecePointchevalCipher}. - * - * @see McElieceFujisakiCipher - * @see McElieceKobaraImaiCipher - * @see McEliecePointchevalCipher - */ -public class McElieceCCA2Parameters - extends McElieceParameters -{ - - - public Digest digest; - - - /** - * Construct the default parameters. - * The default message digest is SHA256. - */ - public McElieceCCA2Parameters() - { - this.digest = new SHA256Digest(); - } - - public McElieceCCA2Parameters(int m, int t) - { - super(m, t); - this.digest = new SHA256Digest(); - } - - public McElieceCCA2Parameters(Digest digest) - { - this.digest = digest; - } - - public Digest getDigest() - { - return this.digest; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Primitives.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Primitives.java deleted file mode 100644 index ae309b5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2Primitives.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2Vector; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.GoppaCode; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; -import org.bc.pqc.math.linearalgebra.Vector; - -/** - * Core operations for the CCA-secure variants of McEliece. - */ -public final class McElieceCCA2Primitives -{ - - /** - * Default constructor (private). - */ - private McElieceCCA2Primitives() - { - } - - /** - * The McEliece encryption primitive. - * - * @param pubKey the public key - * @param m the message vector - * @param z the error vector - * @return m*G + z - */ - - - public static GF2Vector encryptionPrimitive(McElieceCCA2PublicKeyParameters pubKey, - GF2Vector m, GF2Vector z) - { - - GF2Matrix matrixG = pubKey.getMatrixG(); - Vector mG = matrixG.leftMultiplyLeftCompactForm(m); - return (GF2Vector)mG.add(z); - } - - /** - * The McEliece decryption primitive. - * - * @param privKey the private key - * @param c the ciphertext vector c = m*G + z - * @return the message vector m and the error vector z - */ - public static GF2Vector[] decryptionPrimitive( - McElieceCCA2PrivateKeyParameters privKey, GF2Vector c) - { - - // obtain values from private key - int k = privKey.getK(); - Permutation p = privKey.getP(); - GF2mField field = privKey.getField(); - PolynomialGF2mSmallM gp = privKey.getGoppaPoly(); - GF2Matrix h = privKey.getH(); - PolynomialGF2mSmallM[] q = privKey.getQInv(); - - // compute inverse permutation P^-1 - Permutation pInv = p.computeInverse(); - - // multiply c with permutation P^-1 - GF2Vector cPInv = (GF2Vector)c.multiply(pInv); - - // compute syndrome of cP^-1 - GF2Vector syndVec = (GF2Vector)h.rightMultiply(cPInv); - - // decode syndrome - GF2Vector errors = GoppaCode.syndromeDecode(syndVec, field, gp, q); - GF2Vector mG = (GF2Vector)cPInv.add(errors); - - // multiply codeword and error vector with P - mG = (GF2Vector)mG.multiply(p); - errors = (GF2Vector)errors.multiply(p); - - // extract plaintext vector (last k columns of mG) - GF2Vector m = mG.extractRightVector(k); - - // return vectors - return new GF2Vector[]{m, errors}; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PrivateKeyParameters.java deleted file mode 100644 index 6db5bef..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PrivateKeyParameters.java +++ /dev/null @@ -1,172 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; - -/** - * - * - * - */ -public class McElieceCCA2PrivateKeyParameters - extends McElieceCCA2KeyParameters -{ - - // the OID of the algorithm - private String oid; - - // the length of the code - private int n; - - // the dimension of the code - private int k; - - // the finte field GF(2^m) - private GF2mField field; - - // the irreducible Goppa polynomial - private PolynomialGF2mSmallM goppaPoly; - - // the permutation - private Permutation p; - - // the canonical check matrix - private GF2Matrix h; - - // the matrix used to compute square roots in (GF(2^m))^t - private PolynomialGF2mSmallM[] qInv; - - /** - * Constructor. - * - * @param n the length of the code - * @param k the dimension of the code - * @param field the finite field GF(2m) - * @param gp the irreducible Goppa polynomial - * @param p the permutation - * @param h the canonical check matrix - * @param qInv the matrix used to compute square roots in - * (GF(2^m))^t - * @param params McElieceCCA2Parameters - */ - public McElieceCCA2PrivateKeyParameters(String oid, int n, int k, GF2mField field, - PolynomialGF2mSmallM gp, Permutation p, GF2Matrix h, - PolynomialGF2mSmallM[] qInv, McElieceCCA2Parameters params) - { - super(true, params); - this.oid = oid; - this.n = n; - this.k = k; - this.field = field; - this.goppaPoly = gp; - this.p = p; - this.h = h; - this.qInv = qInv; - } - - /** - * Constructor used by the {@link McElieceKeyFactory}. - * - * @param n the length of the code - * @param k the dimension of the code - * @param encFieldPoly the encoded field polynomial defining the finite field - * GF(2m) - * @param encGoppaPoly the encoded irreducible Goppa polynomial - * @param encP the encoded permutation - * @param encH the encoded canonical check matrix - * @param encQInv the encoded matrix used to compute square roots in - * (GF(2^m))^t - * @param params McElieceCCA2Parameters - */ - public McElieceCCA2PrivateKeyParameters(String oid, int n, int k, byte[] encFieldPoly, - byte[] encGoppaPoly, byte[] encP, byte[] encH, byte[][] encQInv, McElieceCCA2Parameters params) - { - super(true, params); - this.oid = oid; - this.n = n; - this.k = k; - field = new GF2mField(encFieldPoly); - goppaPoly = new PolynomialGF2mSmallM(field, encGoppaPoly); - p = new Permutation(encP); - h = new GF2Matrix(encH); - qInv = new PolynomialGF2mSmallM[encQInv.length]; - for (int i = 0; i < encQInv.length; i++) - { - qInv[i] = new PolynomialGF2mSmallM(field, encQInv[i]); - } - } - - /** - * @return the length of the code - */ - public int getN() - { - return n; - } - - /** - * @return the dimension of the code - */ - public int getK() - { - return k; - } - - /** - * @return the degree of the Goppa polynomial (error correcting capability) - */ - public int getT() - { - return goppaPoly.getDegree(); - } - - /** - * @return the finite field - */ - public GF2mField getField() - { - return field; - } - - /** - * @return the irreducible Goppa polynomial - */ - public PolynomialGF2mSmallM getGoppaPoly() - { - return goppaPoly; - } - - /** - * @return the permutation P - */ - public Permutation getP() - { - return p; - } - - /** - * @return the canonical check matrix H - */ - public GF2Matrix getH() - { - return h; - } - - /** - * @return the matrix used to compute square roots in (GF(2^m))^t - */ - public PolynomialGF2mSmallM[] getQInv() - { - return qInv; - } - - public String getOIDString() - { - return oid; - - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PublicKeyParameters.java deleted file mode 100644 index 6803907..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceCCA2PublicKeyParameters.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.pqc.math.linearalgebra.GF2Matrix; - -/** - * - * - * - */ -public class McElieceCCA2PublicKeyParameters - extends McElieceCCA2KeyParameters -{ - - // the OID of the algorithm - private String oid; - - // the length of the code - private int n; - - // the error correction capability of the code - private int t; - - // the generator matrix - private GF2Matrix matrixG; - - /** - * Constructor. - * - * @param n length of the code - * @param t error correction capability - * @param matrix generator matrix - * @param params McElieceCCA2Parameters - */ - public McElieceCCA2PublicKeyParameters(String oid, int n, int t, GF2Matrix matrix, McElieceCCA2Parameters params) - { - super(false, params); - this.oid = oid; - this.n = n; - this.t = t; - this.matrixG = new GF2Matrix(matrix); - } - - /** - * Constructor (used by {@link McElieceKeyFactory}). - * - * @param n length of the code - * @param t error correction capability of the code - * @param encMatrix encoded generator matrix - * @param params McElieceCCA2Parameters - */ - public McElieceCCA2PublicKeyParameters(String oid, int n, int t, byte[] encMatrix, McElieceCCA2Parameters params) - { - super(false, params); - this.oid = oid; - this.n = n; - this.t = t; - this.matrixG = new GF2Matrix(encMatrix); - } - - /** - * @return the length of the code - */ - public int getN() - { - return n; - } - - /** - * @return the error correction capability of the code - */ - public int getT() - { - return t; - } - - /** - * @return the generator matrix - */ - public GF2Matrix getMatrixG() - { - return matrixG; - } - - /** - * @return the dimension of the code - */ - public int getK() - { - return matrixG.getNumRows(); - } - - public String getOIDString() - { - return oid; - - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiCipher.java deleted file mode 100644 index 2d78230..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiCipher.java +++ /dev/null @@ -1,218 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.prng.DigestRandomGenerator; -import org.bc.pqc.crypto.MessageEncryptor; -import org.bc.pqc.math.linearalgebra.ByteUtils; -import org.bc.pqc.math.linearalgebra.GF2Vector; - -/** - * This class implements the Fujisaki/Okamoto conversion of the McEliecePKCS. - * Fujisaki and Okamoto propose hybrid encryption that merges a symmetric - * encryption scheme which is secure in the find-guess model with an asymmetric - * one-way encryption scheme which is sufficiently probabilistic to obtain a - * public key cryptosystem which is CCA2-secure. For details, see D. Engelbert, - * R. Overbeck, A. Schmidt, "A summary of the development of the McEliece - * Cryptosystem", technical report. - */ -public class McElieceFujisakiCipher - implements MessageEncryptor -{ - - - /** - * The OID of the algorithm. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.2.1"; - - private static final String DEFAULT_PRNG_NAME = "SHA1PRNG"; - - private Digest messDigest; - - private SecureRandom sr; - - /** - * The McEliece main parameters - */ - private int n, k, t; - - McElieceCCA2KeyParameters key; - - - public void init(boolean forSigning, - CipherParameters param) - { - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.sr = rParam.getRandom(); - this.key = (McElieceCCA2PublicKeyParameters)rParam.getParameters(); - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - - } - else - { - this.sr = new SecureRandom(); - this.key = (McElieceCCA2PublicKeyParameters)param; - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - } - } - else - { - this.key = (McElieceCCA2PrivateKeyParameters)param; - this.initCipherDecrypt((McElieceCCA2PrivateKeyParameters)key); - } - - } - - - public int getKeySize(McElieceCCA2KeyParameters key) - throws IllegalArgumentException - { - - if (key instanceof McElieceCCA2PublicKeyParameters) - { - return ((McElieceCCA2PublicKeyParameters)key).getN(); - - } - if (key instanceof McElieceCCA2PrivateKeyParameters) - { - return ((McElieceCCA2PrivateKeyParameters)key).getN(); - } - throw new IllegalArgumentException("unsupported type"); - - } - - - private void initCipherEncrypt(McElieceCCA2PublicKeyParameters pubKey) - { - this.sr = sr != null ? sr : new SecureRandom(); - this.messDigest = pubKey.getParameters().getDigest(); - n = pubKey.getN(); - k = pubKey.getK(); - t = pubKey.getT(); - } - - - public void initCipherDecrypt(McElieceCCA2PrivateKeyParameters privKey) - { - this.messDigest = privKey.getParameters().getDigest(); - n = privKey.getN(); - t = privKey.getT(); - } - - - public byte[] messageEncrypt(byte[] input) - throws Exception - { - - // generate random vector r of length k bits - GF2Vector r = new GF2Vector(k, sr); - - // convert r to byte array - byte[] rBytes = r.getEncoded(); - - // compute (r||input) - byte[] rm = ByteUtils.concatenate(rBytes, input); - - // compute H(r||input) - messDigest.update(rm, 0, rm.length); - byte[] hrm = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hrm, 0); - - // convert H(r||input) to error vector z - GF2Vector z = Conversions.encode(n, t, hrm); - - // compute c1 = E(r, z) - byte[] c1 = McElieceCCA2Primitives.encryptionPrimitive((McElieceCCA2PublicKeyParameters)key, r, z) - .getEncoded(); - - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(rBytes); - - // generate random c2 - byte[] c2 = new byte[input.length]; - sr0.nextBytes(c2); - - // XOR with input - for (int i = 0; i < input.length; i++) - { - c2[i] ^= input[i]; - } - - // return (c1||c2) - return ByteUtils.concatenate(c1, c2); - } - - public byte[] messageDecrypt(byte[] input) - throws Exception - { - - int c1Len = (n + 7) >> 3; - int c2Len = input.length - c1Len; - - // split ciphertext (c1||c2) - byte[][] c1c2 = ByteUtils.split(input, c1Len); - byte[] c1 = c1c2[0]; - byte[] c2 = c1c2[1]; - - // decrypt c1 ... - GF2Vector hrmVec = GF2Vector.OS2VP(n, c1); - GF2Vector[] decC1 = McElieceCCA2Primitives.decryptionPrimitive((McElieceCCA2PrivateKeyParameters)key, - hrmVec); - byte[] rBytes = decC1[0].getEncoded(); - // ... and obtain error vector z - GF2Vector z = decC1[1]; - - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(rBytes); - - // generate random sequence - byte[] mBytes = new byte[c2Len]; - sr0.nextBytes(mBytes); - - // XOR with c2 to obtain m - for (int i = 0; i < c2Len; i++) - { - mBytes[i] ^= c2[i]; - } - - // compute H(r||m) - byte[] rmBytes = ByteUtils.concatenate(rBytes, mBytes); - byte[] hrm = new byte[messDigest.getDigestSize()]; - messDigest.update(rmBytes, 0, rmBytes.length); - messDigest.doFinal(hrm, 0); - - - // compute Conv(H(r||m)) - hrmVec = Conversions.encode(n, t, hrm); - - // check that Conv(H(m||r)) = z - if (!hrmVec.equals(z)) - { - - throw new Exception("Bad Padding: invalid ciphertext"); - - } - - // return plaintext m - return mBytes; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiDigestCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiDigestCipher.java deleted file mode 100644 index 70fbc8f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceFujisakiDigestCipher.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageEncryptor; - -// TODO should implement some interface? -public class McElieceFujisakiDigestCipher -{ - - private final Digest messDigest; - - private final MessageEncryptor mcElieceCCA2Cipher; - - private boolean forEncrypting; - - - public McElieceFujisakiDigestCipher(MessageEncryptor mcElieceCCA2Cipher, Digest messDigest) - { - this.mcElieceCCA2Cipher = mcElieceCCA2Cipher; - this.messDigest = messDigest; - } - - - public void init(boolean forEncrypting, - CipherParameters param) - { - - this.forEncrypting = forEncrypting; - AsymmetricKeyParameter k; - - if (param instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)param).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)param; - } - - if (forEncrypting && k.isPrivate()) - { - throw new IllegalArgumentException("Encrypting Requires Public Key."); - } - - if (!forEncrypting && !k.isPrivate()) - { - throw new IllegalArgumentException("Decrypting Requires Private Key."); - } - - reset(); - - mcElieceCCA2Cipher.init(forEncrypting, param); - } - - - public byte[] messageEncrypt() - { - if (!forEncrypting) - { - throw new IllegalStateException("McElieceFujisakiDigestCipher not initialised for encrypting."); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - byte[] enc = null; - - try - { - enc = mcElieceCCA2Cipher.messageEncrypt(hash); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return enc; - } - - - public byte[] messageDecrypt(byte[] ciphertext) - { - byte[] output = null; - if (forEncrypting) - { - throw new IllegalStateException("McElieceFujisakiDigestCipher not initialised for decrypting."); - } - - - try - { - output = mcElieceCCA2Cipher.messageDecrypt(ciphertext); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return output; - } - - - public void update(byte b) - { - messDigest.update(b); - - } - - public void update(byte[] in, int off, int len) - { - messDigest.update(in, off, len); - - } - - - public void reset() - { - messDigest.reset(); - - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyGenerationParameters.java deleted file mode 100644 index a762e10..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyGenerationParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class McElieceKeyGenerationParameters - extends KeyGenerationParameters -{ - private McElieceParameters params; - - public McElieceKeyGenerationParameters( - SecureRandom random, - McElieceParameters params) - { - // XXX key size? - super(random, 256); - this.params = params; - } - - public McElieceParameters getParameters() - { - return params; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyPairGenerator.java deleted file mode 100644 index 94aa017..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyPairGenerator.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.GoppaCode; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; -import org.bc.pqc.math.linearalgebra.PolynomialRingGF2m; -import org.bc.pqc.math.linearalgebra.GoppaCode.MaMaPe; - - -/** - * This class implements key pair generation of the McEliece Public Key - * Cryptosystem (McEliecePKC). - */ -public class McElieceKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - - - public McElieceKeyPairGenerator() - { - - } - - - /** - * The OID of the algorithm. - */ - private static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.1"; - - private McElieceKeyGenerationParameters mcElieceParams; - - // the extension degree of the finite field GF(2^m) - private int m; - - // the length of the code - private int n; - - // the error correction capability - private int t; - - // the field polynomial - private int fieldPoly; - - // the source of randomness - private SecureRandom random; - - // flag indicating whether the key pair generator has been initialized - private boolean initialized = false; - - - /** - * Default initialization of the key pair generator. - */ - private void initializeDefault() - { - McElieceKeyGenerationParameters mcParams = new McElieceKeyGenerationParameters(new SecureRandom(), new McElieceParameters()); - initialize(mcParams); - } - - private void initialize( - KeyGenerationParameters param) - { - this.mcElieceParams = (McElieceKeyGenerationParameters)param; - - // set source of randomness - this.random = new SecureRandom(); - - this.m = this.mcElieceParams.getParameters().getM(); - this.n = this.mcElieceParams.getParameters().getN(); - this.t = this.mcElieceParams.getParameters().getT(); - this.fieldPoly = this.mcElieceParams.getParameters().getFieldPoly(); - this.initialized = true; - } - - - private AsymmetricCipherKeyPair genKeyPair() - { - - if (!initialized) - { - initializeDefault(); - } - - // finite field GF(2^m) - GF2mField field = new GF2mField(m, fieldPoly); - - // irreducible Goppa polynomial - PolynomialGF2mSmallM gp = new PolynomialGF2mSmallM(field, t, - PolynomialGF2mSmallM.RANDOM_IRREDUCIBLE_POLYNOMIAL, random); - PolynomialRingGF2m ring = new PolynomialRingGF2m(field, gp); - - // matrix used to compute square roots in (GF(2^m))^t - PolynomialGF2mSmallM[] sqRootMatrix = ring.getSquareRootMatrix(); - - // generate canonical check matrix - GF2Matrix h = GoppaCode.createCanonicalCheckMatrix(field, gp); - - // compute short systematic form of check matrix - MaMaPe mmp = GoppaCode.computeSystematicForm(h, random); - GF2Matrix shortH = mmp.getSecondMatrix(); - Permutation p1 = mmp.getPermutation(); - - // compute short systematic form of generator matrix - GF2Matrix shortG = (GF2Matrix)shortH.computeTranspose(); - - // extend to full systematic form - GF2Matrix gPrime = shortG.extendLeftCompactForm(); - - // obtain number of rows of G (= dimension of the code) - int k = shortG.getNumRows(); - - // generate random invertible (k x k)-matrix S and its inverse S^-1 - GF2Matrix[] matrixSandInverse = GF2Matrix - .createRandomRegularMatrixAndItsInverse(k, random); - - // generate random permutation P2 - Permutation p2 = new Permutation(n, random); - - // compute public matrix G=S*G'*P2 - GF2Matrix g = (GF2Matrix)matrixSandInverse[0].rightMultiply(gPrime); - g = (GF2Matrix)g.rightMultiply(p2); - - - // generate keys - McEliecePublicKeyParameters pubKey = new McEliecePublicKeyParameters(OID, n, t, g, mcElieceParams.getParameters()); - McEliecePrivateKeyParameters privKey = new McEliecePrivateKeyParameters(OID, n, k, - field, gp, matrixSandInverse[1], p1, p2, h, sqRootMatrix, mcElieceParams.getParameters()); - - // return key pair - return new AsymmetricCipherKeyPair(pubKey, privKey); - } - - public void init(KeyGenerationParameters param) - { - this.initialize(param); - - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - return genKeyPair(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyParameters.java deleted file mode 100644 index 4c2826d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKeyParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.crypto.params.AsymmetricKeyParameter; - - -public class McElieceKeyParameters - extends AsymmetricKeyParameter -{ - private McElieceParameters params; - - public McElieceKeyParameters( - boolean isPrivate, - McElieceParameters params) - { - super(isPrivate); - this.params = params; - } - - - public McElieceParameters getParameters() - { - return params; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiCipher.java deleted file mode 100644 index eceae65..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiCipher.java +++ /dev/null @@ -1,319 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.prng.DigestRandomGenerator; -import org.bc.pqc.crypto.MessageEncryptor; -import org.bc.pqc.math.linearalgebra.ByteUtils; -import org.bc.pqc.math.linearalgebra.GF2Vector; -import org.bc.pqc.math.linearalgebra.IntegerFunctions; - -/** - * This class implements the Kobara/Imai conversion of the McEliecePKCS. This is - * a conversion of the McEliecePKCS which is CCA2-secure. For details, see D. - * Engelbert, R. Overbeck, A. Schmidt, "A summary of the development of the - * McEliece Cryptosystem", technical report. - */ -public class McElieceKobaraImaiCipher - implements MessageEncryptor -{ - - /** - * The OID of the algorithm. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.2.3"; - - private static final String DEFAULT_PRNG_NAME = "SHA1PRNG"; - - /** - * A predetermined public constant. - */ - public static final byte[] PUBLIC_CONSTANT = "a predetermined public constant" - .getBytes(); - - - private Digest messDigest; - - private SecureRandom sr; - - McElieceCCA2KeyParameters key; - - /** - * The McEliece main parameters - */ - private int n, k, t; - - - public void init(boolean forSigning, - CipherParameters param) - { - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.sr = rParam.getRandom(); - this.key = (McElieceCCA2PublicKeyParameters)rParam.getParameters(); - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - - } - else - { - this.sr = new SecureRandom(); - this.key = (McElieceCCA2PublicKeyParameters)param; - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - } - } - else - { - this.key = (McElieceCCA2PrivateKeyParameters)param; - this.initCipherDecrypt((McElieceCCA2PrivateKeyParameters)key); - } - - } - - /** - * Return the key size of the given key object. - * - * @param key the McElieceCCA2KeyParameters object - * @return the key size of the given key object - */ - public int getKeySize(McElieceCCA2KeyParameters key) - { - if (key instanceof McElieceCCA2PublicKeyParameters) - { - return ((McElieceCCA2PublicKeyParameters)key).getN(); - - } - if (key instanceof McElieceCCA2PrivateKeyParameters) - { - return ((McElieceCCA2PrivateKeyParameters)key).getN(); - } - throw new IllegalArgumentException("unsupported type"); - } - - private void initCipherEncrypt(McElieceCCA2PublicKeyParameters pubKey) - { - this.messDigest = pubKey.getParameters().getDigest(); - n = pubKey.getN(); - k = pubKey.getK(); - t = pubKey.getT(); - - } - - public void initCipherDecrypt(McElieceCCA2PrivateKeyParameters privKey) - { - this.messDigest = privKey.getParameters().getDigest(); - n = privKey.getN(); - k = privKey.getK(); - t = privKey.getT(); - } - - public byte[] messageEncrypt(byte[] input) - throws Exception - { - - int c2Len = messDigest.getDigestSize(); - int c4Len = k >> 3; - int c5Len = (IntegerFunctions.binomial(n, t).bitLength() - 1) >> 3; - - - int mLen = c4Len + c5Len - c2Len - PUBLIC_CONSTANT.length; - if (input.length > mLen) - { - mLen = input.length; - } - - int c1Len = mLen + PUBLIC_CONSTANT.length; - int c6Len = c1Len + c2Len - c4Len - c5Len; - - // compute (m||const) - byte[] mConst = new byte[c1Len]; - System.arraycopy(input, 0, mConst, 0, input.length); - System.arraycopy(PUBLIC_CONSTANT, 0, mConst, mLen, - PUBLIC_CONSTANT.length); - - // generate random r of length c2Len bytes - byte[] r = new byte[c2Len]; - sr.nextBytes(r); - - // get PRNG object - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(r); - - // generate random sequence ... - byte[] c1 = new byte[c1Len]; - sr0.nextBytes(c1); - - // ... and XOR with (m||const) to obtain c1 - for (int i = c1Len - 1; i >= 0; i--) - { - c1[i] ^= mConst[i]; - } - - // compute H(c1) ... - byte[] c2 = new byte[messDigest.getDigestSize()]; - messDigest.update(c1, 0, c1.length); - messDigest.doFinal(c2, 0); - - // ... and XOR with r - for (int i = c2Len - 1; i >= 0; i--) - { - c2[i] ^= r[i]; - } - - // compute (c2||c1) - byte[] c2c1 = ByteUtils.concatenate(c2, c1); - - // split (c2||c1) into (c6||c5||c4), where c4Len is k/8 bytes, c5Len is - // floor[log(n|t)]/8 bytes, and c6Len is c1Len+c2Len-c4Len-c5Len (may be - // 0). - byte[] c6 = new byte[0]; - if (c6Len > 0) - { - c6 = new byte[c6Len]; - System.arraycopy(c2c1, 0, c6, 0, c6Len); - } - - byte[] c5 = new byte[c5Len]; - System.arraycopy(c2c1, c6Len, c5, 0, c5Len); - - byte[] c4 = new byte[c4Len]; - System.arraycopy(c2c1, c6Len + c5Len, c4, 0, c4Len); - - // convert c4 to vector over GF(2) - GF2Vector c4Vec = GF2Vector.OS2VP(k, c4); - - // convert c5 to error vector z - GF2Vector z = Conversions.encode(n, t, c5); - - // compute encC4 = E(c4, z) - byte[] encC4 = McElieceCCA2Primitives.encryptionPrimitive((McElieceCCA2PublicKeyParameters)key, - c4Vec, z).getEncoded(); - - // if c6Len > 0 - if (c6Len > 0) - { - // return (c6||encC4) - return ByteUtils.concatenate(c6, encC4); - } - // else, return encC4 - return encC4; - } - - - public byte[] messageDecrypt(byte[] input) - throws Exception - { - - int nDiv8 = n >> 3; - - if (input.length < nDiv8) - { - throw new Exception("Bad Padding: Ciphertext too short."); - } - - int c2Len = messDigest.getDigestSize(); - int c4Len = k >> 3; - int c6Len = input.length - nDiv8; - - // split cipher text (c6||encC4), where c6 may be empty - byte[] c6, encC4; - if (c6Len > 0) - { - byte[][] c6EncC4 = ByteUtils.split(input, c6Len); - c6 = c6EncC4[0]; - encC4 = c6EncC4[1]; - } - else - { - c6 = new byte[0]; - encC4 = input; - } - - // convert encC4 into vector over GF(2) - GF2Vector encC4Vec = GF2Vector.OS2VP(n, encC4); - - // decrypt encC4Vec to obtain c4 and error vector z - GF2Vector[] c4z = McElieceCCA2Primitives.decryptionPrimitive((McElieceCCA2PrivateKeyParameters)key, - encC4Vec); - byte[] c4 = c4z[0].getEncoded(); - GF2Vector z = c4z[1]; - - // if length of c4 is greater than c4Len (because of padding) ... - if (c4.length > c4Len) - { - // ... truncate the padding bytes - c4 = ByteUtils.subArray(c4, 0, c4Len); - } - - // compute c5 = Conv^-1(z) - byte[] c5 = Conversions.decode(n, t, z); - - // compute (c6||c5||c4) - byte[] c6c5c4 = ByteUtils.concatenate(c6, c5); - c6c5c4 = ByteUtils.concatenate(c6c5c4, c4); - - // split (c6||c5||c4) into (c2||c1), where c2Len = mdLen and c1Len = - // input.length-c2Len bytes. - int c1Len = c6c5c4.length - c2Len; - byte[][] c2c1 = ByteUtils.split(c6c5c4, c2Len); - byte[] c2 = c2c1[0]; - byte[] c1 = c2c1[1]; - - // compute H(c1) ... - byte[] rPrime = new byte[messDigest.getDigestSize()]; - messDigest.update(c1, 0, c1.length); - messDigest.doFinal(rPrime, 0); - - // ... and XOR with c2 to obtain r' - for (int i = c2Len - 1; i >= 0; i--) - { - rPrime[i] ^= c2[i]; - } - - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(rPrime); - - // generate random sequence R(r') ... - byte[] mConstPrime = new byte[c1Len]; - sr0.nextBytes(mConstPrime); - - // ... and XOR with c1 to obtain (m||const') - for (int i = c1Len - 1; i >= 0; i--) - { - mConstPrime[i] ^= c1[i]; - } - - if (mConstPrime.length < c1Len) - { - throw new Exception("Bad Padding: invalid ciphertext"); - } - - byte[][] temp = ByteUtils.split(mConstPrime, c1Len - - PUBLIC_CONSTANT.length); - byte[] mr = temp[0]; - byte[] constPrime = temp[1]; - - if (!ByteUtils.equals(constPrime, PUBLIC_CONSTANT)) - { - throw new Exception("Bad Padding: invalid ciphertext"); - } - - return mr; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiDigestCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiDigestCipher.java deleted file mode 100644 index 0c72588..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceKobaraImaiDigestCipher.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageEncryptor; - -// TODO should implement some interface? -public class McElieceKobaraImaiDigestCipher -{ - - private final Digest messDigest; - - private final MessageEncryptor mcElieceCCA2Cipher; - - private boolean forEncrypting; - - - public McElieceKobaraImaiDigestCipher(MessageEncryptor mcElieceCCA2Cipher, Digest messDigest) - { - this.mcElieceCCA2Cipher = mcElieceCCA2Cipher; - this.messDigest = messDigest; - } - - - public void init(boolean forEncrypting, - CipherParameters param) - { - - this.forEncrypting = forEncrypting; - AsymmetricKeyParameter k; - - if (param instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)param).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)param; - } - - if (forEncrypting && k.isPrivate()) - { - throw new IllegalArgumentException("Encrypting Requires Public Key."); - } - - if (!forEncrypting && !k.isPrivate()) - { - throw new IllegalArgumentException("Decrypting Requires Private Key."); - } - - reset(); - - mcElieceCCA2Cipher.init(forEncrypting, param); - } - - - public byte[] messageEncrypt() - { - if (!forEncrypting) - { - throw new IllegalStateException("McElieceKobaraImaiDigestCipher not initialised for encrypting."); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - byte[] enc = null; - - try - { - enc = mcElieceCCA2Cipher.messageEncrypt(hash); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return enc; - } - - - public byte[] messageDecrypt(byte[] ciphertext) - { - byte[] output = null; - if (forEncrypting) - { - throw new IllegalStateException("McElieceKobaraImaiDigestCipher not initialised for decrypting."); - } - - - try - { - output = mcElieceCCA2Cipher.messageDecrypt(ciphertext); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return output; - } - - - public void update(byte b) - { - messDigest.update(b); - - } - - public void update(byte[] in, int off, int len) - { - messDigest.update(in, off, len); - - } - - - public void reset() - { - messDigest.reset(); - - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSCipher.java deleted file mode 100644 index f08c304..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSCipher.java +++ /dev/null @@ -1,224 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageEncryptor; -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2Vector; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.GoppaCode; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; -import org.bc.pqc.math.linearalgebra.Vector; - -/** - * This class implements the McEliece Public Key cryptosystem (McEliecePKCS). It - * was first described in R.J. McEliece, "A public key cryptosystem based on - * algebraic coding theory", DSN progress report, 42-44:114-116, 1978. The - * McEliecePKCS is the first cryptosystem which is based on error correcting - * codes. The trapdoor for the McEliece cryptosystem using Goppa codes is the - * knowledge of the Goppa polynomial used to generate the code. - */ -public class McEliecePKCSCipher - implements MessageEncryptor -{ - - /** - * The OID of the algorithm. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.1"; - - - // the source of randomness - private SecureRandom sr; - - // the McEliece main parameters - private int n, k, t; - - // The maximum number of bytes the cipher can decrypt - public int maxPlainTextSize; - - // The maximum number of bytes the cipher can encrypt - public int cipherTextSize; - - McElieceKeyParameters key; - - - public void init(boolean forSigning, - CipherParameters param) - { - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.sr = rParam.getRandom(); - this.key = (McEliecePublicKeyParameters)rParam.getParameters(); - this.initCipherEncrypt((McEliecePublicKeyParameters)key); - - } - else - { - this.sr = new SecureRandom(); - this.key = (McEliecePublicKeyParameters)param; - this.initCipherEncrypt((McEliecePublicKeyParameters)key); - } - } - else - { - this.key = (McEliecePrivateKeyParameters)param; - this.initCipherDecrypt((McEliecePrivateKeyParameters)key); - } - - } - - - /** - * Return the key size of the given key object. - * - * @param key the McElieceKeyParameters object - * @return the keysize of the given key object - */ - - public int getKeySize(McElieceKeyParameters key) - { - - if (key instanceof McEliecePublicKeyParameters) - { - return ((McEliecePublicKeyParameters)key).getN(); - - } - if (key instanceof McEliecePrivateKeyParameters) - { - return ((McEliecePrivateKeyParameters)key).getN(); - } - throw new IllegalArgumentException("unsupported type"); - - } - - - public void initCipherEncrypt(McEliecePublicKeyParameters pubKey) - { - this.sr = sr != null ? sr : new SecureRandom(); - n = pubKey.getN(); - k = pubKey.getK(); - t = pubKey.getT(); - cipherTextSize = n >> 3; - maxPlainTextSize = (k >> 3); - } - - - public void initCipherDecrypt(McEliecePrivateKeyParameters privKey) - { - n = privKey.getN(); - k = privKey.getK(); - - maxPlainTextSize = (k >> 3); - cipherTextSize = n >> 3; - } - - /** - * Encrypt a plain text. - * - * @param input the plain text - * @return the cipher text - */ - public byte[] messageEncrypt(byte[] input) - { - GF2Vector m = computeMessageRepresentative(input); - GF2Vector z = new GF2Vector(n, t, sr); - - GF2Matrix g = ((McEliecePublicKeyParameters)key).getG(); - Vector mG = g.leftMultiply(m); - GF2Vector mGZ = (GF2Vector)mG.add(z); - - return mGZ.getEncoded(); - } - - private GF2Vector computeMessageRepresentative(byte[] input) - { - byte[] data = new byte[maxPlainTextSize + ((k & 0x07) != 0 ? 1 : 0)]; - System.arraycopy(input, 0, data, 0, input.length); - data[input.length] = 0x01; - return GF2Vector.OS2VP(k, data); - } - - /** - * Decrypt a cipher text. - * - * @param input the cipher text - * @return the plain text - * @throws Exception if the cipher text is invalid. - */ - public byte[] messageDecrypt(byte[] input) - throws Exception - { - GF2Vector vec = GF2Vector.OS2VP(n, input); - McEliecePrivateKeyParameters privKey = (McEliecePrivateKeyParameters)key; - GF2mField field = privKey.getField(); - PolynomialGF2mSmallM gp = privKey.getGoppaPoly(); - GF2Matrix sInv = privKey.getSInv(); - Permutation p1 = privKey.getP1(); - Permutation p2 = privKey.getP2(); - GF2Matrix h = privKey.getH(); - PolynomialGF2mSmallM[] qInv = privKey.getQInv(); - - // compute permutation P = P1 * P2 - Permutation p = p1.rightMultiply(p2); - - // compute P^-1 - Permutation pInv = p.computeInverse(); - - // compute c P^-1 - GF2Vector cPInv = (GF2Vector)vec.multiply(pInv); - - // compute syndrome of c P^-1 - GF2Vector syndrome = (GF2Vector)h.rightMultiply(cPInv); - - // decode syndrome - GF2Vector z = GoppaCode.syndromeDecode(syndrome, field, gp, qInv); - GF2Vector mSG = (GF2Vector)cPInv.add(z); - - // multiply codeword with P1 and error vector with P - mSG = (GF2Vector)mSG.multiply(p1); - z = (GF2Vector)z.multiply(p); - - // extract mS (last k columns of mSG) - GF2Vector mS = mSG.extractRightVector(k); - - // compute plaintext vector - GF2Vector mVec = (GF2Vector)sInv.leftMultiply(mS); - - // compute and return plaintext - return computeMessage(mVec); - } - - private byte[] computeMessage(GF2Vector mr) - throws Exception - { - byte[] mrBytes = mr.getEncoded(); - // find first non-zero byte - int index; - for (index = mrBytes.length - 1; index >= 0 && mrBytes[index] == 0; index--) - { - ; - } - - // check if padding byte is valid - if (mrBytes[index] != 0x01) - { - throw new Exception("Bad Padding: invalid ciphertext"); - } - - // extract and return message - byte[] mBytes = new byte[index]; - System.arraycopy(mrBytes, 0, mBytes, 0, index); - return mBytes; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSDigestCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSDigestCipher.java deleted file mode 100644 index 1c02b10..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePKCSDigestCipher.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageEncryptor; - -// TODO should implement some interface? -public class McEliecePKCSDigestCipher -{ - - private final Digest messDigest; - - private final MessageEncryptor mcElieceCipher; - - private boolean forEncrypting; - - - public McEliecePKCSDigestCipher(MessageEncryptor mcElieceCipher, Digest messDigest) - { - this.mcElieceCipher = mcElieceCipher; - this.messDigest = messDigest; - } - - - public void init(boolean forEncrypting, - CipherParameters param) - { - - this.forEncrypting = forEncrypting; - AsymmetricKeyParameter k; - - if (param instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)param).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)param; - } - - if (forEncrypting && k.isPrivate()) - { - throw new IllegalArgumentException("Encrypting Requires Public Key."); - } - - if (!forEncrypting && !k.isPrivate()) - { - throw new IllegalArgumentException("Decrypting Requires Private Key."); - } - - reset(); - - mcElieceCipher.init(forEncrypting, param); - } - - - public byte[] messageEncrypt() - { - if (!forEncrypting) - { - throw new IllegalStateException("McEliecePKCSDigestCipher not initialised for encrypting."); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - byte[] enc = null; - - try - { - enc = mcElieceCipher.messageEncrypt(hash); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return enc; - } - - - public byte[] messageDecrypt(byte[] ciphertext) - { - byte[] output = null; - if (forEncrypting) - { - throw new IllegalStateException("McEliecePKCSDigestCipher not initialised for decrypting."); - } - - - try - { - output = mcElieceCipher.messageDecrypt(ciphertext); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return output; - } - - - public void update(byte b) - { - messDigest.update(b); - - } - - public void update(byte[] in, int off, int len) - { - messDigest.update(in, off, len); - - } - - - public void reset() - { - messDigest.reset(); - - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceParameters.java deleted file mode 100644 index 797d213..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McElieceParameters.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.crypto.CipherParameters; -import org.bc.pqc.math.linearalgebra.PolynomialRingGF2; - -public class McElieceParameters - implements CipherParameters -{ - - /** - * The default extension degree - */ - public static final int DEFAULT_M = 11; - - /** - * The default error correcting capability. - */ - public static final int DEFAULT_T = 50; - - /** - * extension degree of the finite field GF(2^m) - */ - private int m; - - /** - * error correction capability of the code - */ - private int t; - - /** - * length of the code - */ - private int n; - - /** - * the field polynomial - */ - private int fieldPoly; - - /** - * Constructor. Set the default parameters: extension degree. - */ - public McElieceParameters() - { - this(DEFAULT_M, DEFAULT_T); - } - - /** - * Constructor. - * - * @param keysize the length of a Goppa code - * @throws IllegalArgumentException if keysize < 1. - */ - public McElieceParameters(int keysize) - throws IllegalArgumentException - { - if (keysize < 1) - { - throw new IllegalArgumentException("key size must be positive"); - } - m = 0; - n = 1; - while (n < keysize) - { - n <<= 1; - m++; - } - t = n >>> 1; - t /= m; - fieldPoly = PolynomialRingGF2.getIrreduciblePolynomial(m); - } - - /** - * Constructor. - * - * @param m degree of the finite field GF(2^m) - * @param t error correction capability of the code - * @throws IllegalArgumentException if m < 1 or m > 32 or - * t < 0 or t > n. - */ - public McElieceParameters(int m, int t) - throws IllegalArgumentException - { - if (m < 1) - { - throw new IllegalArgumentException("m must be positive"); - } - if (m > 32) - { - throw new IllegalArgumentException("m is too large"); - } - this.m = m; - n = 1 << m; - if (t < 0) - { - throw new IllegalArgumentException("t must be positive"); - } - if (t > n) - { - throw new IllegalArgumentException("t must be less than n = 2^m"); - } - this.t = t; - fieldPoly = PolynomialRingGF2.getIrreduciblePolynomial(m); - } - - /** - * Constructor. - * - * @param m degree of the finite field GF(2^m) - * @param t error correction capability of the code - * @param poly the field polynomial - * @throws IllegalArgumentException if m < 1 or m > 32 or - * t < 0 or t > n or - * poly is not an irreducible field polynomial. - */ - public McElieceParameters(int m, int t, int poly) - throws IllegalArgumentException - { - this.m = m; - if (m < 1) - { - throw new IllegalArgumentException("m must be positive"); - } - if (m > 32) - { - throw new IllegalArgumentException(" m is too large"); - } - this.n = 1 << m; - this.t = t; - if (t < 0) - { - throw new IllegalArgumentException("t must be positive"); - } - if (t > n) - { - throw new IllegalArgumentException("t must be less than n = 2^m"); - } - if ((PolynomialRingGF2.degree(poly) == m) - && (PolynomialRingGF2.isIrreducible(poly))) - { - this.fieldPoly = poly; - } - else - { - throw new IllegalArgumentException( - "polynomial is not a field polynomial for GF(2^m)"); - } - } - - /** - * @return the extension degree of the finite field GF(2^m) - */ - public int getM() - { - return m; - } - - /** - * @return the length of the code - */ - public int getN() - { - return n; - } - - /** - * @return the error correction capability of the code - */ - public int getT() - { - return t; - } - - /** - * @return the field polynomial - */ - public int getFieldPoly() - { - return fieldPoly; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalCipher.java deleted file mode 100644 index d039b04..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalCipher.java +++ /dev/null @@ -1,241 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.digests.SHA1Digest; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.crypto.prng.DigestRandomGenerator; -import org.bc.pqc.crypto.MessageEncryptor; -import org.bc.pqc.math.linearalgebra.ByteUtils; -import org.bc.pqc.math.linearalgebra.GF2Vector; - -/** - * This class implements the Pointcheval conversion of the McEliecePKCS. - * Pointcheval presents a generic technique to make a CCA2-secure cryptosystem - * from any partially trapdoor one-way function in the random oracle model. For - * details, see D. Engelbert, R. Overbeck, A. Schmidt, "A summary of the - * development of the McEliece Cryptosystem", technical report. - */ -public class McEliecePointchevalCipher - implements MessageEncryptor -{ - - - /** - * The OID of the algorithm. - */ - public static final String OID = "1.3.6.1.4.1.8301.3.1.3.4.2.2"; - - private Digest messDigest; - - private SecureRandom sr; - - /** - * The McEliece main parameters - */ - private int n, k, t; - - McElieceCCA2KeyParameters key; - - public void init(boolean forSigning, - CipherParameters param) - { - - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.sr = rParam.getRandom(); - this.key = (McElieceCCA2PublicKeyParameters)rParam.getParameters(); - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - - } - else - { - this.sr = new SecureRandom(); - this.key = (McElieceCCA2PublicKeyParameters)param; - this.initCipherEncrypt((McElieceCCA2PublicKeyParameters)key); - } - } - else - { - this.key = (McElieceCCA2PrivateKeyParameters)param; - this.initCipherDecrypt((McElieceCCA2PrivateKeyParameters)key); - } - - } - - /** - * Return the key size of the given key object. - * - * @param key the McElieceCCA2KeyParameters object - * @return the key size of the given key object - * @throws IllegalArgumentException if the key is invalid - */ - public int getKeySize(McElieceCCA2KeyParameters key) - throws IllegalArgumentException - { - - if (key instanceof McElieceCCA2PublicKeyParameters) - { - return ((McElieceCCA2PublicKeyParameters)key).getN(); - - } - if (key instanceof McElieceCCA2PrivateKeyParameters) - { - return ((McElieceCCA2PrivateKeyParameters)key).getN(); - } - throw new IllegalArgumentException("unsupported type"); - - } - - - protected int decryptOutputSize(int inLen) - { - return 0; - } - - protected int encryptOutputSize(int inLen) - { - return 0; - } - - - public void initCipherEncrypt(McElieceCCA2PublicKeyParameters pubKey) - { - this.sr = sr != null ? sr : new SecureRandom(); - this.messDigest = pubKey.getParameters().getDigest(); - n = pubKey.getN(); - k = pubKey.getK(); - t = pubKey.getT(); - } - - public void initCipherDecrypt(McElieceCCA2PrivateKeyParameters privKey) - { - this.messDigest = privKey.getParameters().getDigest(); - n = privKey.getN(); - k = privKey.getK(); - t = privKey.getT(); - } - - public byte[] messageEncrypt(byte[] input) - throws Exception - { - - int kDiv8 = k >> 3; - - // generate random r of length k div 8 bytes - byte[] r = new byte[kDiv8]; - sr.nextBytes(r); - - // generate random vector r' of length k bits - GF2Vector rPrime = new GF2Vector(k, sr); - - // convert r' to byte array - byte[] rPrimeBytes = rPrime.getEncoded(); - - // compute (input||r) - byte[] mr = ByteUtils.concatenate(input, r); - - // compute H(input||r) - messDigest.update(mr, 0, mr.length); - byte[] hmr = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hmr, 0); - - - // convert H(input||r) to error vector z - GF2Vector z = Conversions.encode(n, t, hmr); - - // compute c1 = E(rPrime, z) - byte[] c1 = McElieceCCA2Primitives.encryptionPrimitive((McElieceCCA2PublicKeyParameters)key, rPrime, - z).getEncoded(); - - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(rPrimeBytes); - - // generate random c2 - byte[] c2 = new byte[input.length + kDiv8]; - sr0.nextBytes(c2); - - // XOR with input - for (int i = 0; i < input.length; i++) - { - c2[i] ^= input[i]; - } - // XOR with r - for (int i = 0; i < kDiv8; i++) - { - c2[input.length + i] ^= r[i]; - } - - // return (c1||c2) - return ByteUtils.concatenate(c1, c2); - } - - public byte[] messageDecrypt(byte[] input) - throws Exception - { - - int c1Len = (n + 7) >> 3; - int c2Len = input.length - c1Len; - - // split cipher text (c1||c2) - byte[][] c1c2 = ByteUtils.split(input, c1Len); - byte[] c1 = c1c2[0]; - byte[] c2 = c1c2[1]; - - // decrypt c1 ... - GF2Vector c1Vec = GF2Vector.OS2VP(n, c1); - GF2Vector[] c1Dec = McElieceCCA2Primitives.decryptionPrimitive((McElieceCCA2PrivateKeyParameters)key, - c1Vec); - byte[] rPrimeBytes = c1Dec[0].getEncoded(); - // ... and obtain error vector z - GF2Vector z = c1Dec[1]; - - // get PRNG object - DigestRandomGenerator sr0 = new DigestRandomGenerator(new SHA1Digest()); - - // seed PRNG with r' - sr0.addSeedMaterial(rPrimeBytes); - - // generate random sequence - byte[] mrBytes = new byte[c2Len]; - sr0.nextBytes(mrBytes); - - // XOR with c2 to obtain (m||r) - for (int i = 0; i < c2Len; i++) - { - mrBytes[i] ^= c2[i]; - } - - // compute H(m||r) - messDigest.update(mrBytes, 0, mrBytes.length); - byte[] hmr = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hmr, 0); - - // compute Conv(H(m||r)) - c1Vec = Conversions.encode(n, t, hmr); - - // check that Conv(H(m||r)) = z - if (!c1Vec.equals(z)) - { - throw new Exception("Bad Padding: Invalid ciphertext."); - } - - // split (m||r) to obtain m - int kDiv8 = k >> 3; - byte[][] mr = ByteUtils.split(mrBytes, c2Len - kDiv8); - - // return plain text m - return mr[0]; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalDigestCipher.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalDigestCipher.java deleted file mode 100644 index 5205266..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePointchevalDigestCipher.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.Digest; -import org.bc.crypto.params.AsymmetricKeyParameter; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageEncryptor; - -// TODO should implement some interface? -public class McEliecePointchevalDigestCipher -{ - - private final Digest messDigest; - - private final MessageEncryptor mcElieceCCA2Cipher; - - private boolean forEncrypting; - - - public McEliecePointchevalDigestCipher(MessageEncryptor mcElieceCCA2Cipher, Digest messDigest) - { - this.mcElieceCCA2Cipher = mcElieceCCA2Cipher; - this.messDigest = messDigest; - } - - - public void init(boolean forEncrypting, - CipherParameters param) - { - - this.forEncrypting = forEncrypting; - AsymmetricKeyParameter k; - - if (param instanceof ParametersWithRandom) - { - k = (AsymmetricKeyParameter)((ParametersWithRandom)param).getParameters(); - } - else - { - k = (AsymmetricKeyParameter)param; - } - - if (forEncrypting && k.isPrivate()) - { - throw new IllegalArgumentException("Encrypting Requires Public Key."); - } - - if (!forEncrypting && !k.isPrivate()) - { - throw new IllegalArgumentException("Decrypting Requires Private Key."); - } - - reset(); - - mcElieceCCA2Cipher.init(forEncrypting, param); - } - - - public byte[] messageEncrypt() - { - if (!forEncrypting) - { - throw new IllegalStateException("McEliecePointchevalDigestCipher not initialised for encrypting."); - } - - byte[] hash = new byte[messDigest.getDigestSize()]; - messDigest.doFinal(hash, 0); - byte[] enc = null; - - try - { - enc = mcElieceCCA2Cipher.messageEncrypt(hash); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return enc; - } - - - public byte[] messageDecrypt(byte[] ciphertext) - { - byte[] output = null; - if (forEncrypting) - { - throw new IllegalStateException("McEliecePointchevalDigestCipher not initialised for decrypting."); - } - - - try - { - output = mcElieceCCA2Cipher.messageDecrypt(ciphertext); - } - catch (Exception e) - { - e.printStackTrace(); - } - - - return output; - } - - - public void update(byte b) - { - messDigest.update(b); - - } - - public void update(byte[] in, int off, int len) - { - messDigest.update(in, off, len); - - } - - - public void reset() - { - messDigest.reset(); - - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePrivateKeyParameters.java deleted file mode 100644 index fec426e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePrivateKeyParameters.java +++ /dev/null @@ -1,197 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.pqc.math.linearalgebra.GF2Matrix; -import org.bc.pqc.math.linearalgebra.GF2mField; -import org.bc.pqc.math.linearalgebra.Permutation; -import org.bc.pqc.math.linearalgebra.PolynomialGF2mSmallM; - - -public class McEliecePrivateKeyParameters - extends McElieceKeyParameters -{ - - // the OID of the algorithm - private String oid; - - // the length of the code - private int n; - - // the dimension of the code, where k >= n - mt - private int k; - - // the underlying finite field - private GF2mField field; - - // the irreducible Goppa polynomial - private PolynomialGF2mSmallM goppaPoly; - - // a k x k random binary non-singular matrix - private GF2Matrix sInv; - - // the permutation used to generate the systematic check matrix - private Permutation p1; - - // the permutation used to compute the public generator matrix - private Permutation p2; - - // the canonical check matrix of the code - private GF2Matrix h; - - // the matrix used to compute square roots in (GF(2^m))^t - private PolynomialGF2mSmallM[] qInv; - - /** - * Constructor. - * - * @param oid - * @param n the length of the code - * @param k the dimension of the code - * @param field the field polynomial defining the finite field - * GF(2m) - * @param goppaPoly the irreducible Goppa polynomial - * @param sInv the matrix S-1 - * @param p1 the permutation used to generate the systematic check - * matrix - * @param p2 the permutation used to compute the public generator - * matrix - * @param h the canonical check matrix - * @param qInv the matrix used to compute square roots in - * (GF(2m))t - * @param params McElieceParameters - */ - public McEliecePrivateKeyParameters(String oid, int n, int k, GF2mField field, - PolynomialGF2mSmallM goppaPoly, GF2Matrix sInv, Permutation p1, - Permutation p2, GF2Matrix h, PolynomialGF2mSmallM[] qInv, McElieceParameters params) - { - super(true, params); - this.oid = oid; - this.k = k; - this.n = n; - this.field = field; - this.goppaPoly = goppaPoly; - this.sInv = sInv; - this.p1 = p1; - this.p2 = p2; - this.h = h; - this.qInv = qInv; - } - - /** - * Constructor (used by the {@link McElieceKeyFactory}). - * - * @param oid - * @param n the length of the code - * @param k the dimension of the code - * @param encField the encoded field polynomial defining the finite field - * GF(2m) - * @param encGoppaPoly the encoded irreducible Goppa polynomial - * @param encSInv the encoded matrix S-1 - * @param encP1 the encoded permutation used to generate the systematic - * check matrix - * @param encP2 the encoded permutation used to compute the public - * generator matrix - * @param encH the encoded canonical check matrix - * @param encQInv the encoded matrix used to compute square roots in - * (GF(2m))t - * @param params McElieceParameters - */ - public McEliecePrivateKeyParameters(String oid, int n, int k, byte[] encField, - byte[] encGoppaPoly, byte[] encSInv, byte[] encP1, byte[] encP2, - byte[] encH, byte[][] encQInv, McElieceParameters params) - { - super(true, params); - this.oid = oid; - this.n = n; - this.k = k; - field = new GF2mField(encField); - goppaPoly = new PolynomialGF2mSmallM(field, encGoppaPoly); - sInv = new GF2Matrix(encSInv); - p1 = new Permutation(encP1); - p2 = new Permutation(encP2); - h = new GF2Matrix(encH); - qInv = new PolynomialGF2mSmallM[encQInv.length]; - for (int i = 0; i < encQInv.length; i++) - { - qInv[i] = new PolynomialGF2mSmallM(field, encQInv[i]); - } - } - - /** - * @return the length of the code - */ - public int getN() - { - return n; - } - - /** - * @return the dimension of the code - */ - public int getK() - { - return k; - } - - /** - * @return the finite field GF(2m) - */ - public GF2mField getField() - { - return field; - } - - /** - * @return the irreducible Goppa polynomial - */ - public PolynomialGF2mSmallM getGoppaPoly() - { - return goppaPoly; - } - - /** - * @return the k x k random binary non-singular matrix S^-1 - */ - public GF2Matrix getSInv() - { - return sInv; - } - - /** - * @return the permutation used to generate the systematic check matrix - */ - public Permutation getP1() - { - return p1; - } - - /** - * @return the permutation used to compute the public generator matrix - */ - public Permutation getP2() - { - return p2; - } - - /** - * @return the canonical check matrix H - */ - public GF2Matrix getH() - { - return h; - } - - /** - * @return the matrix used to compute square roots in - * (GF(2m))t - */ - public PolynomialGF2mSmallM[] getQInv() - { - return qInv; - } - - public String getOIDString() - { - return oid; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePublicKeyParameters.java deleted file mode 100644 index 5b862e4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/mceliece/McEliecePublicKeyParameters.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.pqc.crypto.mceliece; - -import org.bc.pqc.math.linearalgebra.GF2Matrix; - - -public class McEliecePublicKeyParameters - extends McElieceKeyParameters -{ - - // the OID of the algorithm - private String oid; - - // the length of the code - private int n; - - // the error correction capability of the code - private int t; - - // the generator matrix - private GF2Matrix g; - - /** - * Constructor (used by {@link McElieceKeyFactory}). - * - * @param oid - * @param n the length of the code - * @param t the error correction capability of the code - * @param g the generator matrix - * @param params McElieceParameters - */ - public McEliecePublicKeyParameters(String oid, int n, int t, GF2Matrix g, McElieceParameters params) - { - super(false, params); - this.oid = oid; - this.n = n; - this.t = t; - this.g = new GF2Matrix(g); - } - - /** - * Constructor (used by {@link McElieceKeyFactory}). - * - * @param oid - * @param n the length of the code - * @param t the error correction capability of the code - * @param encG the encoded generator matrix - * @param params McElieceParameters - */ - public McEliecePublicKeyParameters(String oid, int t, int n, byte[] encG, McElieceParameters params) - { - super(false, params); - this.oid = oid; - this.n = n; - this.t = t; - this.g = new GF2Matrix(encG); - } - - /** - * @return the length of the code - */ - public int getN() - { - return n; - } - - /** - * @return the error correction capability of the code - */ - public int getT() - { - return t; - } - - /** - * @return the generator matrix - */ - public GF2Matrix getG() - { - return g; - } - - public String getOIDString() - { - return oid; - - } - - /** - * @return the dimension of the code - */ - public int getK() - { - return g.getNumRows(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/Layer.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/Layer.java deleted file mode 100644 index b869b86..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/Layer.java +++ /dev/null @@ -1,322 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import java.security.SecureRandom; - -import org.bc.pqc.crypto.rainbow.util.GF2Field; -import org.bc.pqc.crypto.rainbow.util.RainbowUtil; -import org.bc.util.Arrays; - - -/** - * This class represents a layer of the Rainbow Oil- and Vinegar Map. Each Layer - * consists of oi polynomials with their coefficients, generated at random. - *

    - * To sign a document, we solve a LES (linear equation system) for each layer in - * order to find the oil variables of that layer and to be able to use the - * variables to compute the signature. This functionality is implemented in the - * RainbowSignature-class, by the aid of the private key. - *

    - * Each layer is a part of the private key. - *

    - * More information about the layer can be found in the paper of Jintai Ding, - * Dieter Schmidt: Rainbow, a New Multivariable Polynomial Signature Scheme. - * ACNS 2005: 164-175 (http://dx.doi.org/10.1007/11496137_12) - */ -public class Layer -{ - private int vi; // number of vinegars in this layer - private int viNext; // number of vinegars in next layer - private int oi; // number of oils in this layer - - /* - * k : index of polynomial - * - * i,j : indices of oil and vinegar variables - */ - private short[/* k */][/* i */][/* j */] coeff_alpha; - private short[/* k */][/* i */][/* j */] coeff_beta; - private short[/* k */][/* i */] coeff_gamma; - private short[/* k */] coeff_eta; - - /** - * Constructor - * - * @param vi number of vinegar variables of this layer - * @param viNext number of vinegar variables of next layer. It's the same as - * (num of oils) + (num of vinegars) of this layer. - * @param coeffAlpha alpha-coefficients in the polynomials of this layer - * @param coeffBeta beta-coefficients in the polynomials of this layer - * @param coeffGamma gamma-coefficients in the polynomials of this layer - * @param coeffEta eta-coefficients in the polynomials of this layer - */ - public Layer(byte vi, byte viNext, short[][][] coeffAlpha, - short[][][] coeffBeta, short[][] coeffGamma, short[] coeffEta) - { - this.vi = vi & 0xff; - this.viNext = viNext & 0xff; - this.oi = this.viNext - this.vi; - - // the secret coefficients of all polynomials in this layer - this.coeff_alpha = coeffAlpha; - this.coeff_beta = coeffBeta; - this.coeff_gamma = coeffGamma; - this.coeff_eta = coeffEta; - } - - /** - * This function generates the coefficients of all polynomials in this layer - * at random using random generator. - * - * @param sr the random generator which is to be used - */ - public Layer(int vi, int viNext, SecureRandom sr) - { - this.vi = vi; - this.viNext = viNext; - this.oi = viNext - vi; - - // the coefficients of all polynomials in this layer - this.coeff_alpha = new short[this.oi][this.oi][this.vi]; - this.coeff_beta = new short[this.oi][this.vi][this.vi]; - this.coeff_gamma = new short[this.oi][this.viNext]; - this.coeff_eta = new short[this.oi]; - - int numOfPoly = this.oi; // number of polynomials per layer - - // Alpha coeffs - for (int k = 0; k < numOfPoly; k++) - { - for (int i = 0; i < this.oi; i++) - { - for (int j = 0; j < this.vi; j++) - { - coeff_alpha[k][i][j] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - } - // Beta coeffs - for (int k = 0; k < numOfPoly; k++) - { - for (int i = 0; i < this.vi; i++) - { - for (int j = 0; j < this.vi; j++) - { - coeff_beta[k][i][j] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - } - // Gamma coeffs - for (int k = 0; k < numOfPoly; k++) - { - for (int i = 0; i < this.viNext; i++) - { - coeff_gamma[k][i] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - // Eta - for (int k = 0; k < numOfPoly; k++) - { - coeff_eta[k] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - - /** - * This method plugs in the vinegar variables into the polynomials of this - * layer and computes the coefficients of the Oil-variables as well as the - * free coefficient in each polynomial. - *

    - * It is needed for computing the Oil variables while signing. - * - * @param x vinegar variables of this layer that should be plugged into - * the polynomials. - * @return coeff the coefficients of Oil variables and the free coeff in the - * polynomials of this layer. - */ - public short[][] plugInVinegars(short[] x) - { - // temporary variable needed for the multiplication - short tmpMult = 0; - // coeff: 1st index = which polynomial, 2nd index=which variable - short[][] coeff = new short[oi][oi + 1]; // gets returned - // free coefficient per polynomial - short[] sum = new short[oi]; - - /* - * evaluate the beta-part of the polynomials (it contains no oil - * variables) - */ - for (int k = 0; k < oi; k++) - { - for (int i = 0; i < vi; i++) - { - for (int j = 0; j < vi; j++) - { - // tmp = beta * xi (plug in) - tmpMult = GF2Field.multElem(coeff_beta[k][i][j], x[i]); - // tmp = tmp * xj - tmpMult = GF2Field.multElem(tmpMult, x[j]); - // accumulate into the array for the free coefficients. - sum[k] = GF2Field.addElem(sum[k], tmpMult); - } - } - } - - /* evaluate the alpha-part (it contains oils) */ - for (int k = 0; k < oi; k++) - { - for (int i = 0; i < oi; i++) - { - for (int j = 0; j < vi; j++) - { - // alpha * xj (plug in) - tmpMult = GF2Field.multElem(coeff_alpha[k][i][j], x[j]); - // accumulate - coeff[k][i] = GF2Field.addElem(coeff[k][i], tmpMult); - } - } - } - /* evaluate the gama-part of the polynomial (containing no oils) */ - for (int k = 0; k < oi; k++) - { - for (int i = 0; i < vi; i++) - { - // gamma * xi (plug in) - tmpMult = GF2Field.multElem(coeff_gamma[k][i], x[i]); - // accumulate in the array for the free coefficients (per - // polynomial). - sum[k] = GF2Field.addElem(sum[k], tmpMult); - } - } - /* evaluate the gama-part of the polynomial (but containing oils) */ - for (int k = 0; k < oi; k++) - { - for (int i = vi; i < viNext; i++) - { // oils - // accumulate the coefficients of the oil variables (per - // polynomial). - coeff[k][i - vi] = GF2Field.addElem(coeff_gamma[k][i], - coeff[k][i - vi]); - } - } - /* evaluate the eta-part of the polynomial */ - for (int k = 0; k < oi; k++) - { - // accumulate in the array for the free coefficients per polynomial. - sum[k] = GF2Field.addElem(sum[k], coeff_eta[k]); - } - - /* put the free coefficients (sum) into the coeff-array as last column */ - for (int k = 0; k < oi; k++) - { - coeff[k][oi] = sum[k]; - } - return coeff; - } - - /** - * Getter for the number of vinegar variables of this layer. - * - * @return the number of vinegar variables of this layer. - */ - public int getVi() - { - return vi; - } - - /** - * Getter for the number of vinegar variables of the next layer. - * - * @return the number of vinegar variables of the next layer. - */ - public int getViNext() - { - return viNext; - } - - /** - * Getter for the number of Oil variables of this layer. - * - * @return the number of oil variables of this layer. - */ - public int getOi() - { - return oi; - } - - /** - * Getter for the alpha-coefficients of the polynomials in this layer. - * - * @return the coefficients of alpha-terms of this layer. - */ - public short[][][] getCoeffAlpha() - { - return coeff_alpha; - } - - /** - * Getter for the beta-coefficients of the polynomials in this layer. - * - * @return the coefficients of beta-terms of this layer. - */ - - public short[][][] getCoeffBeta() - { - return coeff_beta; - } - - /** - * Getter for the gamma-coefficients of the polynomials in this layer. - * - * @return the coefficients of gamma-terms of this layer - */ - public short[][] getCoeffGamma() - { - return coeff_gamma; - } - - /** - * Getter for the eta-coefficients of the polynomials in this layer. - * - * @return the coefficients eta of this layer - */ - public short[] getCoeffEta() - { - return coeff_eta; - } - - /** - * This function compares this Layer with another object. - * - * @param other the other object - * @return the result of the comparison - */ - public boolean equals(Object other) - { - if (other == null || !(other instanceof Layer)) - { - return false; - } - Layer otherLayer = (Layer)other; - - return vi == otherLayer.getVi() - && viNext == otherLayer.getViNext() - && oi == otherLayer.getOi() - && RainbowUtil.equals(coeff_alpha, otherLayer.getCoeffAlpha()) - && RainbowUtil.equals(coeff_beta, otherLayer.getCoeffBeta()) - && RainbowUtil.equals(coeff_gamma, otherLayer.getCoeffGamma()) - && RainbowUtil.equals(coeff_eta, otherLayer.getCoeffEta()); - } - - public int hashCode() - { - int hash = vi; - hash = hash * 37 + viNext; - hash = hash * 37 + oi; - hash = hash * 37 + Arrays.hashCode(coeff_alpha); - hash = hash * 37 + Arrays.hashCode(coeff_beta); - hash = hash * 37 + Arrays.hashCode(coeff_gamma); - hash = hash * 37 + Arrays.hashCode(coeff_eta); - - return hash; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyGenerationParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyGenerationParameters.java deleted file mode 100644 index 838a55c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyGenerationParameters.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import java.security.SecureRandom; - -import org.bc.crypto.KeyGenerationParameters; - -public class RainbowKeyGenerationParameters - extends KeyGenerationParameters -{ - private RainbowParameters params; - - public RainbowKeyGenerationParameters( - SecureRandom random, - RainbowParameters params) - { - // TODO: key size? - super(random, params.getVi()[params.getVi().length - 1] - params.getVi()[0]); - this.params = params; - } - - public RainbowParameters getParameters() - { - return params; - } -} - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyPairGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyPairGenerator.java deleted file mode 100644 index 4f457c7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyPairGenerator.java +++ /dev/null @@ -1,414 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import java.security.SecureRandom; - -import org.bc.crypto.AsymmetricCipherKeyPair; -import org.bc.crypto.AsymmetricCipherKeyPairGenerator; -import org.bc.crypto.KeyGenerationParameters; -import org.bc.pqc.crypto.rainbow.util.ComputeInField; -import org.bc.pqc.crypto.rainbow.util.GF2Field; - -/** - * This class implements AsymmetricCipherKeyPairGenerator. It is used - * as a generator for the private and public key of the Rainbow Signature - * Scheme. - *

    - * Detailed information about the key generation is to be found in the paper of - * Jintai Ding, Dieter Schmidt: Rainbow, a New Multivariable Polynomial - * Signature Scheme. ACNS 2005: 164-175 (http://dx.doi.org/10.1007/11496137_12) - */ -public class RainbowKeyPairGenerator - implements AsymmetricCipherKeyPairGenerator -{ - private boolean initialized = false; - private SecureRandom sr; - private RainbowKeyGenerationParameters rainbowParams; - - /* linear affine map L1: */ - private short[][] A1; // matrix of the lin. affine map L1(n-v1 x n-v1 matrix) - private short[][] A1inv; // inverted A1 - private short[] b1; // translation element of the lin.affine map L1 - - /* linear affine map L2: */ - private short[][] A2; // matrix of the lin. affine map (n x n matrix) - private short[][] A2inv; // inverted A2 - private short[] b2; // translation elemt of the lin.affine map L2 - - /* components of F: */ - private int numOfLayers; // u (number of sets S) - private Layer layers[]; // layers of polynomials of F - private int[] vi; // set of vinegar vars per layer. - - /* components of Public Key */ - private short[][] pub_quadratic; // quadratic(mixed) coefficients - private short[][] pub_singular; // singular coefficients - private short[] pub_scalar; // scalars - - // TODO - - /** - * The standard constructor tries to generate the Rainbow algorithm identifier - * with the corresponding OID. - *

    - */ - public RainbowKeyPairGenerator() - { - } - - - /** - * This function generates a Rainbow key pair. - * - * @return the generated key pair - */ - public AsymmetricCipherKeyPair genKeyPair() - { - RainbowPrivateKeyParameters privKey; - RainbowPublicKeyParameters pubKey; - - if (!initialized) - { - initializeDefault(); - } - - /* choose all coefficients at random */ - keygen(); - - /* now marshall them to PrivateKey */ - privKey = new RainbowPrivateKeyParameters(A1inv, b1, A2inv, b2, vi, layers); - - - /* marshall to PublicKey */ - pubKey = new RainbowPublicKeyParameters(vi[vi.length - 1] - vi[0], pub_quadratic, pub_singular, pub_scalar); - - return new AsymmetricCipherKeyPair(pubKey, privKey); - } - - // TODO - public void initialize( - KeyGenerationParameters param) - { - this.rainbowParams = (RainbowKeyGenerationParameters)param; - - // set source of randomness - this.sr = new SecureRandom(); - - // unmarshalling: - this.vi = this.rainbowParams.getParameters().getVi(); - this.numOfLayers = this.rainbowParams.getParameters().getNumOfLayers(); - - this.initialized = true; - } - - private void initializeDefault() - { - RainbowKeyGenerationParameters rbKGParams = new RainbowKeyGenerationParameters(new SecureRandom(), new RainbowParameters()); - initialize(rbKGParams); - } - - /** - * This function calls the functions for the random generation of the coefficients - * and the matrices needed for the private key and the method for computing the public key. - */ - private void keygen() - { - generateL1(); - generateL2(); - generateF(); - computePublicKey(); - } - - /** - * This function generates the invertible affine linear map L1 = A1*x + b1 - *

    - * The translation part b1, is stored in a separate array. The inverse of - * the matrix-part of L1 A1inv is also computed here. - *

    - * This linear map hides the output of the map F. It is on k^(n-v1). - */ - private void generateL1() - { - - // dimension = n-v1 = vi[last] - vi[first] - int dim = vi[vi.length - 1] - vi[0]; - this.A1 = new short[dim][dim]; - this.A1inv = null; - ComputeInField c = new ComputeInField(); - - /* generation of A1 at random */ - while (A1inv == null) - { - for (int i = 0; i < dim; i++) - { - for (int j = 0; j < dim; j++) - { - A1[i][j] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - A1inv = c.inverse(A1); - } - - /* generation of the translation vector at random */ - b1 = new short[dim]; - for (int i = 0; i < dim; i++) - { - b1[i] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - - /** - * This function generates the invertible affine linear map L2 = A2*x + b2 - *

    - * The translation part b2, is stored in a separate array. The inverse of - * the matrix-part of L2 A2inv is also computed here. - *

    - * This linear map hides the output of the map F. It is on k^(n). - */ - private void generateL2() - { - - // dimension = n = vi[last] - int dim = vi[vi.length - 1]; - this.A2 = new short[dim][dim]; - this.A2inv = null; - ComputeInField c = new ComputeInField(); - - /* generation of A2 at random */ - while (this.A2inv == null) - { - for (int i = 0; i < dim; i++) - { - for (int j = 0; j < dim; j++) - { // one col extra for b - A2[i][j] = (short)(sr.nextInt() & GF2Field.MASK); - } - } - this.A2inv = c.inverse(A2); - } - /* generation of the translation vector at random */ - b2 = new short[dim]; - for (int i = 0; i < dim; i++) - { - b2[i] = (short)(sr.nextInt() & GF2Field.MASK); - } - - } - - /** - * This function generates the private map F, which consists of u-1 layers. - * Each layer consists of oi polynomials where oi = vi[i+1]-vi[i]. - *

    - * The methods for the generation of the coefficients of these polynomials - * are called here. - */ - private void generateF() - { - - this.layers = new Layer[this.numOfLayers]; - for (int i = 0; i < this.numOfLayers; i++) - { - layers[i] = new Layer(this.vi[i], this.vi[i + 1], sr); - } - } - - /** - * This function computes the public key from the private key. - *

    - * The composition of F with L2 is computed, followed by applying L1 to the - * composition's result. The singular and scalar values constitute to the - * public key as is, the quadratic terms are compacted in - * compactPublicKey() - */ - private void computePublicKey() - { - - ComputeInField c = new ComputeInField(); - int rows = this.vi[this.vi.length - 1] - this.vi[0]; - int vars = this.vi[this.vi.length - 1]; - // Fpub - short[][][] coeff_quadratic_3dim = new short[rows][vars][vars]; - this.pub_singular = new short[rows][vars]; - this.pub_scalar = new short[rows]; - - // Coefficients of layers of Private Key F - short[][][] coeff_alpha; - short[][][] coeff_beta; - short[][] coeff_gamma; - short[] coeff_eta; - - // Needed for counters; - int oils = 0; - int vins = 0; - int crnt_row = 0; // current row (polynomial) - - short vect_tmp[] = new short[vars]; // vector tmp; - short sclr_tmp = 0; - - // Composition of F and L2: Insert L2 = A2*x+b2 in F - for (int l = 0; l < this.layers.length; l++) - { - // get coefficients of current layer - coeff_alpha = this.layers[l].getCoeffAlpha(); - coeff_beta = this.layers[l].getCoeffBeta(); - coeff_gamma = this.layers[l].getCoeffGamma(); - coeff_eta = this.layers[l].getCoeffEta(); - oils = coeff_alpha[0].length;// this.layers[l].getOi(); - vins = coeff_beta[0].length;// this.layers[l].getVi(); - // compute polynomials of layer - for (int p = 0; p < oils; p++) - { - // multiply alphas - for (int x1 = 0; x1 < oils; x1++) - { - for (int x2 = 0; x2 < vins; x2++) - { - // multiply polynomial1 with polynomial2 - vect_tmp = c.multVect(coeff_alpha[p][x1][x2], - this.A2[x1 + vins]); - coeff_quadratic_3dim[crnt_row + p] = c.addSquareMatrix( - coeff_quadratic_3dim[crnt_row + p], c - .multVects(vect_tmp, this.A2[x2])); - // mul poly1 with scalar2 - vect_tmp = c.multVect(this.b2[x2], vect_tmp); - this.pub_singular[crnt_row + p] = c.addVect(vect_tmp, - this.pub_singular[crnt_row + p]); - // mul scalar1 with poly2 - vect_tmp = c.multVect(coeff_alpha[p][x1][x2], - this.A2[x2]); - vect_tmp = c.multVect(b2[x1 + vins], vect_tmp); - this.pub_singular[crnt_row + p] = c.addVect(vect_tmp, - this.pub_singular[crnt_row + p]); - // mul scalar1 with scalar2 - sclr_tmp = GF2Field.multElem(coeff_alpha[p][x1][x2], - this.b2[x1 + vins]); - this.pub_scalar[crnt_row + p] = GF2Field.addElem( - this.pub_scalar[crnt_row + p], GF2Field - .multElem(sclr_tmp, this.b2[x2])); - } - } - // multiply betas - for (int x1 = 0; x1 < vins; x1++) - { - for (int x2 = 0; x2 < vins; x2++) - { - // multiply polynomial1 with polynomial2 - vect_tmp = c.multVect(coeff_beta[p][x1][x2], - this.A2[x1]); - coeff_quadratic_3dim[crnt_row + p] = c.addSquareMatrix( - coeff_quadratic_3dim[crnt_row + p], c - .multVects(vect_tmp, this.A2[x2])); - // mul poly1 with scalar2 - vect_tmp = c.multVect(this.b2[x2], vect_tmp); - this.pub_singular[crnt_row + p] = c.addVect(vect_tmp, - this.pub_singular[crnt_row + p]); - // mul scalar1 with poly2 - vect_tmp = c.multVect(coeff_beta[p][x1][x2], - this.A2[x2]); - vect_tmp = c.multVect(this.b2[x1], vect_tmp); - this.pub_singular[crnt_row + p] = c.addVect(vect_tmp, - this.pub_singular[crnt_row + p]); - // mul scalar1 with scalar2 - sclr_tmp = GF2Field.multElem(coeff_beta[p][x1][x2], - this.b2[x1]); - this.pub_scalar[crnt_row + p] = GF2Field.addElem( - this.pub_scalar[crnt_row + p], GF2Field - .multElem(sclr_tmp, this.b2[x2])); - } - } - // multiply gammas - for (int n = 0; n < vins + oils; n++) - { - // mul poly with scalar - vect_tmp = c.multVect(coeff_gamma[p][n], this.A2[n]); - this.pub_singular[crnt_row + p] = c.addVect(vect_tmp, - this.pub_singular[crnt_row + p]); - // mul scalar with scalar - this.pub_scalar[crnt_row + p] = GF2Field.addElem( - this.pub_scalar[crnt_row + p], GF2Field.multElem( - coeff_gamma[p][n], this.b2[n])); - } - // add eta - this.pub_scalar[crnt_row + p] = GF2Field.addElem( - this.pub_scalar[crnt_row + p], coeff_eta[p]); - } - crnt_row = crnt_row + oils; - } - - // Apply L1 = A1*x+b1 to composition of F and L2 - { - // temporary coefficient arrays - short[][][] tmp_c_quad = new short[rows][vars][vars]; - short[][] tmp_c_sing = new short[rows][vars]; - short[] tmp_c_scal = new short[rows]; - for (int r = 0; r < rows; r++) - { - for (int q = 0; q < A1.length; q++) - { - tmp_c_quad[r] = c.addSquareMatrix(tmp_c_quad[r], c - .multMatrix(A1[r][q], coeff_quadratic_3dim[q])); - tmp_c_sing[r] = c.addVect(tmp_c_sing[r], c.multVect( - A1[r][q], this.pub_singular[q])); - tmp_c_scal[r] = GF2Field.addElem(tmp_c_scal[r], GF2Field - .multElem(A1[r][q], this.pub_scalar[q])); - } - tmp_c_scal[r] = GF2Field.addElem(tmp_c_scal[r], b1[r]); - } - // set public key - coeff_quadratic_3dim = tmp_c_quad; - this.pub_singular = tmp_c_sing; - this.pub_scalar = tmp_c_scal; - } - compactPublicKey(coeff_quadratic_3dim); - } - - /** - * The quadratic (or mixed) terms of the public key are compacted from a n x - * n matrix per polynomial to an upper diagonal matrix stored in one integer - * array of n (n + 1) / 2 elements per polynomial. The ordering of elements - * is lexicographic and the result is updating this.pub_quadratic, - * which stores the quadratic elements of the public key. - * - * @param coeff_quadratic_to_compact 3-dimensional array containing a n x n Matrix for each of the - * n - v1 polynomials - */ - private void compactPublicKey(short[][][] coeff_quadratic_to_compact) - { - int polynomials = coeff_quadratic_to_compact.length; - int n = coeff_quadratic_to_compact[0].length; - int entries = n * (n + 1) / 2;// the small gauss - this.pub_quadratic = new short[polynomials][entries]; - int offset = 0; - - for (int p = 0; p < polynomials; p++) - { - offset = 0; - for (int x = 0; x < n; x++) - { - for (int y = x; y < n; y++) - { - if (y == x) - { - this.pub_quadratic[p][offset] = coeff_quadratic_to_compact[p][x][y]; - } - else - { - this.pub_quadratic[p][offset] = GF2Field.addElem( - coeff_quadratic_to_compact[p][x][y], - coeff_quadratic_to_compact[p][y][x]); - } - offset++; - } - } - } - } - - public void init(KeyGenerationParameters param) - { - this.initialize(param); - } - - public AsymmetricCipherKeyPair generateKeyPair() - { - return genKeyPair(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyParameters.java deleted file mode 100644 index 0a8caa8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowKeyParameters.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import org.bc.crypto.params.AsymmetricKeyParameter; - -public class RainbowKeyParameters - extends AsymmetricKeyParameter -{ - private int docLength; - - public RainbowKeyParameters( - boolean isPrivate, - int docLength) - { - super(isPrivate); - this.docLength = docLength; - } - - /** - * @return the docLength - */ - public int getDocLength() - { - return this.docLength; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowParameters.java deleted file mode 100644 index c80a040..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowParameters.java +++ /dev/null @@ -1,111 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import org.bc.crypto.CipherParameters; - -public class RainbowParameters - implements CipherParameters -{ - - /** - * DEFAULT PARAMS - */ - /* - * Vi = vinegars per layer whereas n is vu (vu = 33 = n) such that - * - * v1 = 6; o1 = 12-6 = 6 - * - * v2 = 12; o2 = 17-12 = 5 - * - * v3 = 17; o3 = 22-17 = 5 - * - * v4 = 22; o4 = 33-22 = 11 - * - * v5 = 33; (o5 = 0) - */ - private final int[] DEFAULT_VI = {6, 12, 17, 22, 33}; - - private int[] vi;// set of vinegar vars per layer. - - /** - * Default Constructor The elements of the array containing the number of - * Vinegar variables in each layer are set to the default values here. - */ - public RainbowParameters() - { - this.vi = this.DEFAULT_VI; - } - - /** - * Constructor with parameters - * - * @param vi The elements of the array containing the number of Vinegar - * variables per layer are set to the values of the input array. - */ - public RainbowParameters(int[] vi) - { - this.vi = vi; - try - { - checkParams(); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - private void checkParams() - throws Exception - { - if (vi == null) - { - throw new Exception("no layers defined."); - } - if (vi.length > 1) - { - for (int i = 0; i < vi.length - 1; i++) - { - if (vi[i] >= vi[i + 1]) - { - throw new Exception( - "v[i] has to be smaller than v[i+1]"); - } - } - } - else - { - throw new Exception( - "Rainbow needs at least 1 layer, such that v1 < v2."); - } - } - - /** - * Getter for the number of layers - * - * @return the number of layers - */ - public int getNumOfLayers() - { - return this.vi.length - 1; - } - - /** - * Getter for the number of all the polynomials in Rainbow - * - * @return the number of the polynomials - */ - public int getDocLength() - { - return vi[vi.length - 1] - vi[0]; - } - - /** - * Getter for the array containing the number of Vinegar-variables per layer - * - * @return the numbers of vinegars per layer - */ - public int[] getVi() - { - return this.vi; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPrivateKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPrivateKeyParameters.java deleted file mode 100644 index 36207ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPrivateKeyParameters.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -public class RainbowPrivateKeyParameters - extends RainbowKeyParameters -{ - /** - * Constructor - * - * @param A1inv the inverse of A1(the matrix part of the affine linear map L1) - * (n-v1 x n-v1 matrix) - * @param b1 translation vector, part of the linear affine map L1 - * @param A2inv the inverse of A2(the matrix part of the affine linear map L2) - * (n x n matrix) - * @param b2 translation vector, part of the linear affine map L2 - * @param vi the number of Vinegar-variables per layer - * @param layers the polynomials with their coefficients of private map F - */ - public RainbowPrivateKeyParameters(short[][] A1inv, short[] b1, - short[][] A2inv, short[] b2, int[] vi, Layer[] layers) - { - super(true, vi[vi.length - 1] - vi[0]); - - this.A1inv = A1inv; - this.b1 = b1; - this.A2inv = A2inv; - this.b2 = b2; - this.vi = vi; - this.layers = layers; - } - - /* - * invertible affine linear map L1 - */ - // the inverse of A1, (n-v1 x n-v1 matrix) - private short[][] A1inv; - - // translation vector of L1 - private short[] b1; - - /* - * invertible affine linear map L2 - */ - // the inverse of A2, (n x n matrix) - private short[][] A2inv; - - // translation vector of L2 - private short[] b2; - - /* - * components of F - */ - // the number of Vinegar-variables per layer. - private int[] vi; - - // contains the polynomials with their coefficients of private map F - private Layer[] layers; - - /** - * Getter for the translation part of the private quadratic map L1. - * - * @return b1 the translation part of L1 - */ - public short[] getB1() - { - return this.b1; - } - - /** - * Getter for the inverse matrix of A1. - * - * @return the A1inv inverse - */ - public short[][] getInvA1() - { - return this.A1inv; - } - - /** - * Getter for the translation part of the private quadratic map L2. - * - * @return b2 the translation part of L2 - */ - public short[] getB2() - { - return this.b2; - } - - /** - * Getter for the inverse matrix of A2 - * - * @return the A2inv - */ - public short[][] getInvA2() - { - return this.A2inv; - } - - /** - * Returns the layers contained in the private key - * - * @return layers - */ - public Layer[] getLayers() - { - return this.layers; - } - - /** - * /** Returns the array of vi-s - * - * @return the vi - */ - public int[] getVi() - { - return vi; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPublicKeyParameters.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPublicKeyParameters.java deleted file mode 100644 index dd131a0..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowPublicKeyParameters.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -public class RainbowPublicKeyParameters - extends RainbowKeyParameters -{ - private short[][] coeffquadratic; - private short[][] coeffsingular; - private short[] coeffscalar; - - /** - * Constructor - * - * @param docLength - * @param coeffQuadratic - * @param coeffSingular - * @param coeffScalar - */ - public RainbowPublicKeyParameters(int docLength, - short[][] coeffQuadratic, short[][] coeffSingular, - short[] coeffScalar) - { - super(false, docLength); - - this.coeffquadratic = coeffQuadratic; - this.coeffsingular = coeffSingular; - this.coeffscalar = coeffScalar; - - } - - /** - * @return the coeffquadratic - */ - public short[][] getCoeffQuadratic() - { - return coeffquadratic; - } - - /** - * @return the coeffsingular - */ - public short[][] getCoeffSingular() - { - return coeffsingular; - } - - /** - * @return the coeffscalar - */ - public short[] getCoeffScalar() - { - return coeffscalar; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowSigner.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowSigner.java deleted file mode 100644 index 6b34f3a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/RainbowSigner.java +++ /dev/null @@ -1,301 +0,0 @@ -package org.bc.pqc.crypto.rainbow; - -import java.security.SecureRandom; - -import org.bc.crypto.CipherParameters; -import org.bc.crypto.params.ParametersWithRandom; -import org.bc.pqc.crypto.MessageSigner; -import org.bc.pqc.crypto.rainbow.util.ComputeInField; -import org.bc.pqc.crypto.rainbow.util.GF2Field; - -/** - * It implements the sign and verify functions for the Rainbow Signature Scheme. - * Here the message, which has to be signed, is updated. The use of - * different hash functions is possible. - *

    - * Detailed information about the signature and the verify-method is to be found - * in the paper of Jintai Ding, Dieter Schmidt: Rainbow, a New Multivariable - * Polynomial Signature Scheme. ACNS 2005: 164-175 - * (http://dx.doi.org/10.1007/11496137_12) - */ -public class RainbowSigner - implements MessageSigner -{ - // Source of randomness - private SecureRandom random; - - // The length of a document that can be signed with the privKey - int signableDocumentLength; - - // Container for the oil and vinegar variables of all the layers - private short[] x; - - private ComputeInField cf = new ComputeInField(); - - RainbowKeyParameters key; - - public void init(boolean forSigning, - CipherParameters param) - { - if (forSigning) - { - if (param instanceof ParametersWithRandom) - { - ParametersWithRandom rParam = (ParametersWithRandom)param; - - this.random = rParam.getRandom(); - this.key = (RainbowPrivateKeyParameters)rParam.getParameters(); - - } - else - { - - this.random = new SecureRandom(); - this.key = (RainbowPrivateKeyParameters)param; - } - } - else - { - this.key = (RainbowPublicKeyParameters)param; - } - - this.signableDocumentLength = this.key.getDocLength(); - } - - - /** - * initial operations before solving the Linear equation system. - * - * @param layer the current layer for which a LES is to be solved. - * @param msg the message that should be signed. - * @return Y_ the modified document needed for solving LES, (Y_ = - * A1^{-1}*(Y-b1)) linear map L1 = A1 x + b1. - */ - private short[] initSign(Layer[] layer, short[] msg) - { - - /* preparation: Modifies the document with the inverse of L1 */ - // tmp = Y - b1: - short[] tmpVec = new short[msg.length]; - - tmpVec = cf.addVect(((RainbowPrivateKeyParameters)this.key).getB1(), msg); - - // Y_ = A1^{-1} * (Y - b1) : - short[] Y_ = cf.multiplyMatrix(((RainbowPrivateKeyParameters)this.key).getInvA1(), tmpVec); - - /* generates the vinegar vars of the first layer at random */ - for (int i = 0; i < layer[0].getVi(); i++) - { - x[i] = (short)random.nextInt(); - x[i] = (short)(x[i] & GF2Field.MASK); - } - - return Y_; - } - - /** - * This function signs the message that has been updated, making use of the - * private key. - *

    - * For computing the signature, L1 and L2 are needed, as well as LES should - * be solved for each layer in order to find the Oil-variables in the layer. - *

    - * The Vinegar-variables of the first layer are random generated. - * - * @param message the message - * @return the signature of the message. - */ - public byte[] generateSignature(byte[] message) - { - Layer[] layer = ((RainbowPrivateKeyParameters)this.key).getLayers(); - int numberOfLayers = layer.length; - - x = new short[((RainbowPrivateKeyParameters)this.key).getInvA2().length]; // all variables - - short[] Y_; // modified document - short[] y_i; // part of Y_ each polynomial - int counter; // index of the current part of the doc - - short[] solVec; // the solution of LES pro layer - short[] tmpVec; - - // the signature as an array of shorts: - short[] signature; - // the signature as a byte-array: - byte[] S = new byte[layer[numberOfLayers - 1].getViNext()]; - - short[] msgHashVals = makeMessageRepresentative(message); - - // shows if an exception is caught - boolean ok; - do - { - ok = true; - counter = 0; - try - { - Y_ = initSign(layer, msgHashVals); - - for (int i = 0; i < numberOfLayers; i++) - { - - y_i = new short[layer[i].getOi()]; - solVec = new short[layer[i].getOi()]; // solution of LES - - /* copy oi elements of Y_ into y_i */ - for (int k = 0; k < layer[i].getOi(); k++) - { - y_i[k] = Y_[counter]; - counter++; // current index of Y_ - } - - /* - * plug in the vars of the previous layer in order to get - * the vars of the current layer - */ - solVec = cf.solveEquation(layer[i].plugInVinegars(x), y_i); - - if (solVec == null) - { // LES is not solveable - throw new Exception("LES is not solveable!"); - } - - /* copy the new vars into the x-array */ - for (int j = 0; j < solVec.length; j++) - { - x[layer[i].getVi() + j] = solVec[j]; - } - } - - /* apply the inverse of L2: (signature = A2^{-1}*(b2+x)) */ - tmpVec = cf.addVect(((RainbowPrivateKeyParameters)this.key).getB2(), x); - signature = cf.multiplyMatrix(((RainbowPrivateKeyParameters)this.key).getInvA2(), tmpVec); - - /* cast signature from short[] to byte[] */ - for (int i = 0; i < S.length; i++) - { - S[i] = ((byte)signature[i]); - } - } - catch (Exception se) - { - // if one of the LESs was not solveable - sign again - ok = false; - } - } - while (!ok); - /* return the signature in bytes */ - return S; - } - - /** - * This function verifies the signature of the message that has been - * updated, with the aid of the public key. - * - * @param message the message - * @param signature the signature of the message - * @return true if the signature has been verified, false otherwise. - */ - public boolean verifySignature(byte[] message, byte[] signature) - { - short[] sigInt = new short[signature.length]; - short tmp; - - for (int i = 0; i < signature.length; i++) - { - tmp = (short)signature[i]; - tmp &= (short)0xff; - sigInt[i] = tmp; - } - - short[] msgHashVal = makeMessageRepresentative(message); - - // verify - short[] verificationResult = verifySignatureIntern(sigInt); - - // compare - boolean verified = true; - if (msgHashVal.length != verificationResult.length) - { - return false; - } - for (int i = 0; i < msgHashVal.length; i++) - { - verified = verified && msgHashVal[i] == verificationResult[i]; - } - - return verified; - } - - /** - * Signature verification using public key - * - * @param signature vector of dimension n - * @return document hash of length n - v1 - */ - private short[] verifySignatureIntern(short[] signature) - { - - short[][] coeff_quadratic = ((RainbowPublicKeyParameters)this.key).getCoeffQuadratic(); - short[][] coeff_singular = ((RainbowPublicKeyParameters)this.key).getCoeffSingular(); - short[] coeff_scalar = ((RainbowPublicKeyParameters)this.key).getCoeffScalar(); - - short[] rslt = new short[coeff_quadratic.length];// n - v1 - int n = coeff_singular[0].length; - int offset = 0; // array position - short tmp = 0; // for scalar - - for (int p = 0; p < coeff_quadratic.length; p++) - { // no of polynomials - offset = 0; - for (int x = 0; x < n; x++) - { - // calculate quadratic terms - for (int y = x; y < n; y++) - { - tmp = GF2Field.multElem(coeff_quadratic[p][offset], - GF2Field.multElem(signature[x], signature[y])); - rslt[p] = GF2Field.addElem(rslt[p], tmp); - offset++; - } - // calculate singular terms - tmp = GF2Field.multElem(coeff_singular[p][x], signature[x]); - rslt[p] = GF2Field.addElem(rslt[p], tmp); - } - // add scalar - rslt[p] = GF2Field.addElem(rslt[p], coeff_scalar[p]); - } - - return rslt; - } - - /** - * This function creates the representative of the message which gets signed - * or verified. - * - * @param message the message - * @return message representative - */ - private short[] makeMessageRepresentative(byte[] message) - { - // the message representative - short[] output = new short[this.signableDocumentLength]; - - int h = 0; - int i = 0; - do - { - if (i >= message.length) - { - break; - } - output[i] = (short)message[h]; - output[i] &= (short)0xff; - h++; - i++; - } - while (i < output.length); - - return output; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/ComputeInField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/ComputeInField.java deleted file mode 100644 index 9b8b4de..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/ComputeInField.java +++ /dev/null @@ -1,490 +0,0 @@ -package org.bc.pqc.crypto.rainbow.util; - -/** - * This class offers different operations on matrices in field GF2^8. - *

    - * Implemented are functions: - * - finding inverse of a matrix - * - solving linear equation systems using the Gauss-Elimination method - * - basic operations like matrix multiplication, addition and so on. - */ - -public class ComputeInField -{ - - private short[][] A; // used by solveEquation and inverse - short[] x; - - /** - * Constructor with no parameters - */ - public ComputeInField() - { - } - - - /** - * This function finds a solution of the equation Bx = b. - * Exception is thrown if the linear equation system has no solution - * - * @param B this matrix is the left part of the - * equation (B in the equation above) - * @param b the right part of the equation - * (b in the equation above) - * @return x the solution of the equation if it is solvable - * null otherwise - * @throws RuntimeException if LES is not solvable - */ - public short[] solveEquation(short[][] B, short[] b) - { - try - { - - if (B.length != b.length) - { - throw new RuntimeException( - "The equation system is not solvable"); - } - - /** initialize **/ - // this matrix stores B and b from the equation B*x = b - // b is stored as the last column. - // B contains one column more than rows. - // In this column we store a free coefficient that should be later subtracted from b - A = new short[B.length][B.length + 1]; - // stores the solution of the LES - x = new short[B.length]; - - /** copy B into the global matrix A **/ - for (int i = 0; i < B.length; i++) - { // rows - for (int j = 0; j < B[0].length; j++) - { // cols - A[i][j] = B[i][j]; - } - } - - /** copy the vector b into the global A **/ - //the free coefficient, stored in the last column of A( A[i][b.length] - // is to be subtracted from b - for (int i = 0; i < b.length; i++) - { - A[i][b.length] = GF2Field.addElem(b[i], A[i][b.length]); - } - - /** call the methods for gauss elimination and backward substitution **/ - computeZerosUnder(false); // obtain zeros under the diagonal - substitute(); - - return x; - - } - catch (RuntimeException rte) - { - return null; // the LES is not solvable! - } - } - - /** - * This function computes the inverse of a given matrix using the Gauss- - * Elimination method. - *

    - * An exception is thrown if the matrix has no inverse - * - * @param coef the matrix which inverse matrix is needed - * @return inverse matrix of the input matrix. - * If the matrix is singular, null is returned. - * @throws RuntimeException if the given matrix is not invertible - */ - public short[][] inverse(short[][] coef) - { - try - { - /** Initialization: **/ - short factor; - short[][] inverse; - A = new short[coef.length][2 * coef.length]; - if (coef.length != coef[0].length) - { - throw new RuntimeException( - "The matrix is not invertible. Please choose another one!"); - } - - /** prepare: Copy coef and the identity matrix into the global A. **/ - for (int i = 0; i < coef.length; i++) - { - for (int j = 0; j < coef.length; j++) - { - //copy the input matrix coef into A - A[i][j] = coef[i][j]; - } - // copy the identity matrix into A. - for (int j = coef.length; j < 2 * coef.length; j++) - { - A[i][j] = 0; - } - A[i][i + A.length] = 1; - } - - /** Elimination operations to get the identity matrix from the left side of A. **/ - // modify A to get 0s under the diagonal. - computeZerosUnder(true); - - // modify A to get only 1s on the diagonal: A[i][j] =A[i][j]/A[i][i]. - for (int i = 0; i < A.length; i++) - { - factor = GF2Field.invElem(A[i][i]); - for (int j = i; j < 2 * A.length; j++) - { - A[i][j] = GF2Field.multElem(A[i][j], factor); - } - } - - //modify A to get only 0s above the diagonal. - computeZerosAbove(); - - // copy the result (the second half of A) in the matrix inverse. - inverse = new short[A.length][A.length]; - for (int i = 0; i < A.length; i++) - { - for (int j = A.length; j < 2 * A.length; j++) - { - inverse[i][j - A.length] = A[i][j]; - } - } - return inverse; - - } - catch (RuntimeException rte) - { - // The matrix is not invertible! A new one should be generated! - return null; - } - } - - /** - * Elimination under the diagonal. - * This function changes a matrix so that it contains only zeros under the - * diagonal(Ai,i) using only Gauss-Elimination operations. - *

    - * It is used in solveEquaton as well as in the function for - * finding an inverse of a matrix: {@link}inverse. Both of them use the - * Gauss-Elimination Method. - *

    - * The result is stored in the global matrix A - * - * @param usedForInverse This parameter shows if the function is used by the - * solveEquation-function or by the inverse-function and according - * to this creates matrices of different sizes. - * @throws RuntimeException in case a multiplicative inverse of 0 is needed - */ - private void computeZerosUnder(boolean usedForInverse) - throws RuntimeException - { - - //the number of columns in the global A where the tmp results are stored - int length; - short tmp = 0; - - //the function is used in inverse() - A should have 2 times more columns than rows - if (usedForInverse) - { - length = 2 * A.length; - } - //the function is used in solveEquation - A has 1 column more than rows - else - { - length = A.length + 1; - } - - //elimination operations to modify A so that that it contains only 0s under the diagonal - for (int k = 0; k < A.length - 1; k++) - { // the fixed row - for (int i = k + 1; i < A.length; i++) - { // rows - short factor1 = A[i][k]; - short factor2 = GF2Field.invElem(A[k][k]); - - //The element which multiplicative inverse is needed, is 0 - //in this case is the input matrix not invertible - if (factor2 == 0) - { - throw new RuntimeException("Matrix not invertible! We have to choose another one!"); - } - - for (int j = k; j < length; j++) - {// columns - // tmp=A[k,j] / A[k,k] - tmp = GF2Field.multElem(A[k][j], factor2); - // tmp = A[i,k] * A[k,j] / A[k,k] - tmp = GF2Field.multElem(factor1, tmp); - // A[i,j]=A[i,j]-A[i,k]/A[k,k]*A[k,j]; - A[i][j] = GF2Field.addElem(A[i][j], tmp); - } - } - } - } - - /** - * Elimination above the diagonal. - * This function changes a matrix so that it contains only zeros above the - * diagonal(Ai,i) using only Gauss-Elimination operations. - *

    - * It is used in the inverse-function - * The result is stored in the global matrix A - * - * @throws RuntimeException in case a multiplicative inverse of 0 is needed - */ - private void computeZerosAbove() - throws RuntimeException - { - short tmp = 0; - for (int k = A.length - 1; k > 0; k--) - { // the fixed row - for (int i = k - 1; i >= 0; i--) - { // rows - short factor1 = A[i][k]; - short factor2 = GF2Field.invElem(A[k][k]); - if (factor2 == 0) - { - throw new RuntimeException("The matrix is not invertible"); - } - for (int j = k; j < 2 * A.length; j++) - { // columns - // tmp = A[k,j] / A[k,k] - tmp = GF2Field.multElem(A[k][j], factor2); - // tmp = A[i,k] * A[k,j] / A[k,k] - tmp = GF2Field.multElem(factor1, tmp); - // A[i,j] = A[i,j] - A[i,k] / A[k,k] * A[k,j]; - A[i][j] = GF2Field.addElem(A[i][j], tmp); - } - } - } - } - - - /** - * This function uses backward substitution to find x - * of the linear equation system (LES) B*x = b, - * where A a triangle-matrix is (contains only zeros under the diagonal) - * and b is a vector - *

    - * If the multiplicative inverse of 0 is needed, an exception is thrown. - * In this case is the LES not solvable - * - * @throws RuntimeException in case a multiplicative inverse of 0 is needed - */ - private void substitute() - throws RuntimeException - { - - // for the temporary results of the operations in field - short tmp, temp; - - temp = GF2Field.invElem(A[A.length - 1][A.length - 1]); - if (temp == 0) - { - throw new RuntimeException("The equation system is not solvable"); - } - - /** backward substitution **/ - x[A.length - 1] = GF2Field.multElem(A[A.length - 1][A.length], temp); - for (int i = A.length - 2; i >= 0; i--) - { - tmp = A[i][A.length]; - for (int j = A.length - 1; j > i; j--) - { - temp = GF2Field.multElem(A[i][j], x[j]); - tmp = GF2Field.addElem(tmp, temp); - } - - temp = GF2Field.invElem(A[i][i]); - if (temp == 0) - { - throw new RuntimeException("Not solvable equation system"); - } - x[i] = GF2Field.multElem(tmp, temp); - } - } - - - /** - * This function multiplies two given matrices. - * If the given matrices cannot be multiplied due - * to different sizes, an exception is thrown. - * - * @param M1 -the 1st matrix - * @param M2 -the 2nd matrix - * @return A = M1*M2 - * @throws RuntimeException in case the given matrices cannot be multiplied - * due to different dimensions. - */ - public short[][] multiplyMatrix(short[][] M1, short[][] M2) - throws RuntimeException - { - - if (M1[0].length != M2.length) - { - throw new RuntimeException("Multiplication is not possible!"); - } - short tmp = 0; - A = new short[M1.length][M2[0].length]; - for (int i = 0; i < M1.length; i++) - { - for (int j = 0; j < M2.length; j++) - { - for (int k = 0; k < M2[0].length; k++) - { - tmp = GF2Field.multElem(M1[i][j], M2[j][k]); - A[i][k] = GF2Field.addElem(A[i][k], tmp); - } - } - } - return A; - } - - /** - * This function multiplies a given matrix with a one-dimensional array. - *

    - * An exception is thrown, if the number of columns in the matrix and - * the number of rows in the one-dim. array differ. - * - * @param M1 the matrix to be multiplied - * @param m the one-dimensional array to be multiplied - * @return M1*m - * @throws RuntimeException in case of dimension inconsistency - */ - public short[] multiplyMatrix(short[][] M1, short[] m) - throws RuntimeException - { - if (M1[0].length != m.length) - { - throw new RuntimeException("Multiplication is not possible!"); - } - short tmp = 0; - short[] B = new short[M1.length]; - for (int i = 0; i < M1.length; i++) - { - for (int j = 0; j < m.length; j++) - { - tmp = GF2Field.multElem(M1[i][j], m[j]); - B[i] = GF2Field.addElem(B[i], tmp); - } - } - return B; - } - - /** - * Addition of two vectors - * - * @param vector1 first summand, always of dim n - * @param vector2 second summand, always of dim n - * @return addition of vector1 and vector2 - * @throws RuntimeException in case the addition is impossible - * due to inconsistency in the dimensions - */ - public short[] addVect(short[] vector1, short[] vector2) - { - if (vector1.length != vector2.length) - { - throw new RuntimeException("Multiplication is not possible!"); - } - short rslt[] = new short[vector1.length]; - for (int n = 0; n < rslt.length; n++) - { - rslt[n] = GF2Field.addElem(vector1[n], vector2[n]); - } - return rslt; - } - - /** - * Multiplication of column vector with row vector - * - * @param vector1 column vector, always n x 1 - * @param vector2 row vector, always 1 x n - * @return resulting n x n matrix of multiplication - * @throws RuntimeException in case the multiplication is impossible due to - * inconsistency in the dimensions - */ - public short[][] multVects(short[] vector1, short[] vector2) - { - if (vector1.length != vector2.length) - { - throw new RuntimeException("Multiplication is not possible!"); - } - short rslt[][] = new short[vector1.length][vector2.length]; - for (int i = 0; i < vector1.length; i++) - { - for (int j = 0; j < vector2.length; j++) - { - rslt[i][j] = GF2Field.multElem(vector1[i], vector2[j]); - } - } - return rslt; - } - - /** - * Multiplies vector with scalar - * - * @param scalar galois element to multiply vector with - * @param vector vector to be multiplied - * @return vector multiplied with scalar - */ - public short[] multVect(short scalar, short[] vector) - { - short rslt[] = new short[vector.length]; - for (int n = 0; n < rslt.length; n++) - { - rslt[n] = GF2Field.multElem(scalar, vector[n]); - } - return rslt; - } - - /** - * Multiplies matrix with scalar - * - * @param scalar galois element to multiply matrix with - * @param matrix 2-dim n x n matrix to be multiplied - * @return matrix multiplied with scalar - */ - public short[][] multMatrix(short scalar, short[][] matrix) - { - short[][] rslt = new short[matrix.length][matrix[0].length]; - for (int i = 0; i < matrix.length; i++) - { - for (int j = 0; j < matrix[0].length; j++) - { - rslt[i][j] = GF2Field.multElem(scalar, matrix[i][j]); - } - } - return rslt; - } - - /** - * Adds the n x n matrices matrix1 and matrix2 - * - * @param matrix1 first summand - * @param matrix2 second summand - * @return addition of matrix1 and matrix2; both having the dimensions n x n - * @throws RuntimeException in case the addition is not possible because of - * different dimensions of the matrices - */ - public short[][] addSquareMatrix(short[][] matrix1, short[][] matrix2) - { - if (matrix1.length != matrix2.length || matrix1[0].length != matrix2[0].length) - { - throw new RuntimeException("Addition is not possible!"); - } - - short[][] rslt = new short[matrix1.length][matrix1.length];// - for (int i = 0; i < matrix1.length; i++) - { - for (int j = 0; j < matrix2.length; j++) - { - rslt[i][j] = GF2Field.addElem(matrix1[i][j], matrix2[i][j]); - } - } - return rslt; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/GF2Field.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/GF2Field.java deleted file mode 100644 index d8bdc52..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/GF2Field.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.bc.pqc.crypto.rainbow.util; - -/** - * This class provides the basic operations like addition, multiplication and - * finding the multiplicative inverse of an element in GF2^8. - *

    - * The operations are implemented using the irreducible polynomial - * 1+x^2+x^3+x^6+x^8 ( 1 0100 1101 = 0x14d ) - *

    - * This class makes use of lookup tables(exps and logs) for implementing the - * operations in order to increase the efficiency of Rainbow. - */ -public class GF2Field -{ - - public static final int MASK = 0xff; - - /* - * this lookup table is needed for multiplication and computing the - * multiplicative inverse - */ - static final short exps[] = {1, 2, 4, 8, 16, 32, 64, 128, 77, 154, 121, 242, - 169, 31, 62, 124, 248, 189, 55, 110, 220, 245, 167, 3, 6, 12, 24, - 48, 96, 192, 205, 215, 227, 139, 91, 182, 33, 66, 132, 69, 138, 89, - 178, 41, 82, 164, 5, 10, 20, 40, 80, 160, 13, 26, 52, 104, 208, - 237, 151, 99, 198, 193, 207, 211, 235, 155, 123, 246, 161, 15, 30, - 60, 120, 240, 173, 23, 46, 92, 184, 61, 122, 244, 165, 7, 14, 28, - 56, 112, 224, 141, 87, 174, 17, 34, 68, 136, 93, 186, 57, 114, 228, - 133, 71, 142, 81, 162, 9, 18, 36, 72, 144, 109, 218, 249, 191, 51, - 102, 204, 213, 231, 131, 75, 150, 97, 194, 201, 223, 243, 171, 27, - 54, 108, 216, 253, 183, 35, 70, 140, 85, 170, 25, 50, 100, 200, - 221, 247, 163, 11, 22, 44, 88, 176, 45, 90, 180, 37, 74, 148, 101, - 202, 217, 255, 179, 43, 86, 172, 21, 42, 84, 168, 29, 58, 116, 232, - 157, 119, 238, 145, 111, 222, 241, 175, 19, 38, 76, 152, 125, 250, - 185, 63, 126, 252, 181, 39, 78, 156, 117, 234, 153, 127, 254, 177, - 47, 94, 188, 53, 106, 212, 229, 135, 67, 134, 65, 130, 73, 146, - 105, 210, 233, 159, 115, 230, 129, 79, 158, 113, 226, 137, 95, 190, - 49, 98, 196, 197, 199, 195, 203, 219, 251, 187, 59, 118, 236, 149, - 103, 206, 209, 239, 147, 107, 214, 225, 143, 83, 166, 1}; - - /* - * this lookup table is needed for multiplication and computing the - * multiplicative inverse - */ - static final short logs[] = {0, 0, 1, 23, 2, 46, 24, 83, 3, 106, 47, 147, - 25, 52, 84, 69, 4, 92, 107, 182, 48, 166, 148, 75, 26, 140, 53, - 129, 85, 170, 70, 13, 5, 36, 93, 135, 108, 155, 183, 193, 49, 43, - 167, 163, 149, 152, 76, 202, 27, 230, 141, 115, 54, 205, 130, 18, - 86, 98, 171, 240, 71, 79, 14, 189, 6, 212, 37, 210, 94, 39, 136, - 102, 109, 214, 156, 121, 184, 8, 194, 223, 50, 104, 44, 253, 168, - 138, 164, 90, 150, 41, 153, 34, 77, 96, 203, 228, 28, 123, 231, 59, - 142, 158, 116, 244, 55, 216, 206, 249, 131, 111, 19, 178, 87, 225, - 99, 220, 172, 196, 241, 175, 72, 10, 80, 66, 15, 186, 190, 199, 7, - 222, 213, 120, 38, 101, 211, 209, 95, 227, 40, 33, 137, 89, 103, - 252, 110, 177, 215, 248, 157, 243, 122, 58, 185, 198, 9, 65, 195, - 174, 224, 219, 51, 68, 105, 146, 45, 82, 254, 22, 169, 12, 139, - 128, 165, 74, 91, 181, 151, 201, 42, 162, 154, 192, 35, 134, 78, - 188, 97, 239, 204, 17, 229, 114, 29, 61, 124, 235, 232, 233, 60, - 234, 143, 125, 159, 236, 117, 30, 245, 62, 56, 246, 217, 63, 207, - 118, 250, 31, 132, 160, 112, 237, 20, 144, 179, 126, 88, 251, 226, - 32, 100, 208, 221, 119, 173, 218, 197, 64, 242, 57, 176, 247, 73, - 180, 11, 127, 81, 21, 67, 145, 16, 113, 187, 238, 191, 133, 200, - 161}; - - /** - * This function calculates the sum of two elements as an operation in GF2^8 - * - * @param x the first element that is to be added - * @param y the second element that should be add - * @return the sum of the two elements x and y in GF2^8 - */ - public static short addElem(short x, short y) - { - return (short)(x ^ y); - } - - /** - * This function computes the multiplicative inverse of a given element in - * GF2^8 The 0 has no multiplicative inverse and in this case 0 is returned. - * - * @param x the element which multiplicative inverse is to be computed - * @return the multiplicative inverse of the given element, in case it - * exists or 0, otherwise - */ - public static short invElem(short x) - { - if (x == 0) - { - return 0; - } - return (exps[255 - logs[x]]); - } - - /** - * This function multiplies two elements in GF2^8. If one of the two - * elements is 0, 0 is returned. - * - * @param x the first element to be multiplied. - * @param y the second element to be multiplied. - * @return the product of the two input elements in GF2^8. - */ - public static short multElem(short x, short y) - { - if (x == 0 || y == 0) - { - return 0; - } - else - { - return (exps[(logs[x] + logs[y]) % 255]); - } - } - - /** - * This function returns the values of exps-lookup table which correspond to - * the input - * - * @param x the index in the lookup table exps - * @return exps-value, corresponding to the input - */ - public static short getExp(short x) - { - return exps[x]; - } - - /** - * This function returns the values of logs-lookup table which correspond to - * the input - * - * @param x the index in the lookup table logs - * @return logs-value, corresponding to the input - */ - public static short getLog(short x) - { - return logs[x]; - } - - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/RainbowUtil.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/RainbowUtil.java deleted file mode 100644 index 6a0a635..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/crypto/rainbow/util/RainbowUtil.java +++ /dev/null @@ -1,230 +0,0 @@ -package org.bc.pqc.crypto.rainbow.util; - -/** - * This class is needed for the conversions while encoding and decoding, as well as for - * comparison between arrays of some dimensions - */ -public class RainbowUtil -{ - - /** - * This function converts an one-dimensional array of bytes into a - * one-dimensional array of int - * - * @param in the array to be converted - * @return out - * the one-dimensional int-array that corresponds the input - */ - public static int[] convertArraytoInt(byte[] in) - { - int[] out = new int[in.length]; - for (int i = 0; i < in.length; i++) - { - out[i] = in[i] & GF2Field.MASK; - } - return out; - } - - /** - * This function converts an one-dimensional array of bytes into a - * one-dimensional array of type short - * - * @param in the array to be converted - * @return out - * one-dimensional short-array that corresponds the input - */ - public static short[] convertArray(byte[] in) - { - short[] out = new short[in.length]; - for (int i = 0; i < in.length; i++) - { - out[i] = (short)(in[i] & GF2Field.MASK); - } - return out; - } - - /** - * This function converts a matrix of bytes into a matrix of type short - * - * @param in the matrix to be converted - * @return out - * short-matrix that corresponds the input - */ - public static short[][] convertArray(byte[][] in) - { - short[][] out = new short[in.length][in[0].length]; - for (int i = 0; i < in.length; i++) - { - for (int j = 0; j < in[0].length; j++) - { - out[i][j] = (short)(in[i][j] & GF2Field.MASK); - } - } - return out; - } - - /** - * This function converts a 3-dimensional array of bytes into a 3-dimensional array of type short - * - * @param in the array to be converted - * @return out - * short-array that corresponds the input - */ - public static short[][][] convertArray(byte[][][] in) - { - short[][][] out = new short[in.length][in[0].length][in[0][0].length]; - for (int i = 0; i < in.length; i++) - { - for (int j = 0; j < in[0].length; j++) - { - for (int k = 0; k < in[0][0].length; k++) - { - out[i][j][k] = (short)(in[i][j][k] & GF2Field.MASK); - } - } - } - return out; - } - - /** - * This function converts an array of type int into an array of type byte - * - * @param in the array to be converted - * @return out - * the byte-array that corresponds the input - */ - public static byte[] convertIntArray(int[] in) - { - byte[] out = new byte[in.length]; - for (int i = 0; i < in.length; i++) - { - out[i] = (byte)in[i]; - } - return out; - } - - - /** - * This function converts an array of type short into an array of type byte - * - * @param in the array to be converted - * @return out - * the byte-array that corresponds the input - */ - public static byte[] convertArray(short[] in) - { - byte[] out = new byte[in.length]; - for (int i = 0; i < in.length; i++) - { - out[i] = (byte)in[i]; - } - return out; - } - - /** - * This function converts a matrix of type short into a matrix of type byte - * - * @param in the matrix to be converted - * @return out - * the byte-matrix that corresponds the input - */ - public static byte[][] convertArray(short[][] in) - { - byte[][] out = new byte[in.length][in[0].length]; - for (int i = 0; i < in.length; i++) - { - for (int j = 0; j < in[0].length; j++) - { - out[i][j] = (byte)in[i][j]; - } - } - return out; - } - - /** - * This function converts a 3-dimensional array of type short into a 3-dimensional array of type byte - * - * @param in the array to be converted - * @return out - * the byte-array that corresponds the input - */ - public static byte[][][] convertArray(short[][][] in) - { - byte[][][] out = new byte[in.length][in[0].length][in[0][0].length]; - for (int i = 0; i < in.length; i++) - { - for (int j = 0; j < in[0].length; j++) - { - for (int k = 0; k < in[0][0].length; k++) - { - out[i][j][k] = (byte)in[i][j][k]; - } - } - } - return out; - } - - /** - * Compare two short arrays. No null checks are performed. - * - * @param left the first short array - * @param right the second short array - * @return the result of the comparison - */ - public static boolean equals(short[] left, short[] right) - { - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= left[i] == right[i]; - } - return result; - } - - /** - * Compare two two-dimensional short arrays. No null checks are performed. - * - * @param left the first short array - * @param right the second short array - * @return the result of the comparison - */ - public static boolean equals(short[][] left, short[][] right) - { - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= equals(left[i], right[i]); - } - return result; - } - - /** - * Compare two three-dimensional short arrays. No null checks are performed. - * - * @param left the first short array - * @param right the second short array - * @return the result of the comparison - */ - public static boolean equals(short[][][] left, short[][][] right) - { - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= equals(left[i], right[i]); - } - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigEndianConversions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigEndianConversions.java deleted file mode 100644 index 6d92639..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigEndianConversions.java +++ /dev/null @@ -1,306 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -/** - * This is a utility class containing data type conversions using big-endian - * byte order. - * - * @see LittleEndianConversions - */ -public final class BigEndianConversions -{ - - /** - * Default constructor (private). - */ - private BigEndianConversions() - { - // empty - } - - /** - * Convert an integer to an octet string of length 4 according to IEEE 1363, - * Section 5.5.3. - * - * @param x the integer to convert - * @return the converted integer - */ - public static byte[] I2OSP(int x) - { - byte[] result = new byte[4]; - result[0] = (byte)(x >>> 24); - result[1] = (byte)(x >>> 16); - result[2] = (byte)(x >>> 8); - result[3] = (byte)x; - return result; - } - - /** - * Convert an integer to an octet string according to IEEE 1363, Section - * 5.5.3. Length checking is performed. - * - * @param x the integer to convert - * @param oLen the desired length of the octet string - * @return an octet string of length oLen representing the - * integer x, or null if the integer is - * negative - * @throws ArithmeticException if x can't be encoded into oLen - * octets. - */ - public static byte[] I2OSP(int x, int oLen) - throws ArithmeticException - { - if (x < 0) - { - return null; - } - int octL = IntegerFunctions.ceilLog256(x); - if (octL > oLen) - { - throw new ArithmeticException( - "Cannot encode given integer into specified number of octets."); - } - byte[] result = new byte[oLen]; - for (int i = oLen - 1; i >= oLen - octL; i--) - { - result[i] = (byte)(x >>> (8 * (oLen - 1 - i))); - } - return result; - } - - /** - * Convert an integer to an octet string of length 4 according to IEEE 1363, - * Section 5.5.3. - * - * @param input the integer to convert - * @param output byte array holding the output - * @param outOff offset in output array where the result is stored - */ - public static void I2OSP(int input, byte[] output, int outOff) - { - output[outOff++] = (byte)(input >>> 24); - output[outOff++] = (byte)(input >>> 16); - output[outOff++] = (byte)(input >>> 8); - output[outOff] = (byte)input; - } - - /** - * Convert an integer to an octet string of length 8 according to IEEE 1363, - * Section 5.5.3. - * - * @param input the integer to convert - * @return the converted integer - */ - public static byte[] I2OSP(long input) - { - byte[] output = new byte[8]; - output[0] = (byte)(input >>> 56); - output[1] = (byte)(input >>> 48); - output[2] = (byte)(input >>> 40); - output[3] = (byte)(input >>> 32); - output[4] = (byte)(input >>> 24); - output[5] = (byte)(input >>> 16); - output[6] = (byte)(input >>> 8); - output[7] = (byte)input; - return output; - } - - /** - * Convert an integer to an octet string of length 8 according to IEEE 1363, - * Section 5.5.3. - * - * @param input the integer to convert - * @param output byte array holding the output - * @param outOff offset in output array where the result is stored - */ - public static void I2OSP(long input, byte[] output, int outOff) - { - output[outOff++] = (byte)(input >>> 56); - output[outOff++] = (byte)(input >>> 48); - output[outOff++] = (byte)(input >>> 40); - output[outOff++] = (byte)(input >>> 32); - output[outOff++] = (byte)(input >>> 24); - output[outOff++] = (byte)(input >>> 16); - output[outOff++] = (byte)(input >>> 8); - output[outOff] = (byte)input; - } - - /** - * Convert an integer to an octet string of the specified length according - * to IEEE 1363, Section 5.5.3. No length checking is performed (i.e., if - * the integer cannot be encoded into length octets, it is - * truncated). - * - * @param input the integer to convert - * @param output byte array holding the output - * @param outOff offset in output array where the result is stored - * @param length the length of the encoding - */ - public static void I2OSP(int input, byte[] output, int outOff, int length) - { - for (int i = length - 1; i >= 0; i--) - { - output[outOff + i] = (byte)(input >>> (8 * (length - 1 - i))); - } - } - - /** - * Convert an octet string to an integer according to IEEE 1363, Section - * 5.5.3. - * - * @param input the byte array holding the octet string - * @return an integer representing the octet string input, or - * 0 if the represented integer is negative or too large - * or the byte array is empty - * @throws ArithmeticException if the length of the given octet string is larger than 4. - */ - public static int OS2IP(byte[] input) - { - if (input.length > 4) - { - throw new ArithmeticException("invalid input length"); - } - if (input.length == 0) - { - return 0; - } - int result = 0; - for (int j = 0; j < input.length; j++) - { - result |= (input[j] & 0xff) << (8 * (input.length - 1 - j)); - } - return result; - } - - /** - * Convert a byte array of length 4 beginning at offset into an - * integer. - * - * @param input the byte array - * @param inOff the offset into the byte array - * @return the resulting integer - */ - public static int OS2IP(byte[] input, int inOff) - { - int result = (input[inOff++] & 0xff) << 24; - result |= (input[inOff++] & 0xff) << 16; - result |= (input[inOff++] & 0xff) << 8; - result |= input[inOff] & 0xff; - return result; - } - - /** - * Convert an octet string to an integer according to IEEE 1363, Section - * 5.5.3. - * - * @param input the byte array holding the octet string - * @param inOff the offset in the input byte array where the octet string - * starts - * @param inLen the length of the encoded integer - * @return an integer representing the octet string bytes, or - * 0 if the represented integer is negative or too large - * or the byte array is empty - */ - public static int OS2IP(byte[] input, int inOff, int inLen) - { - if ((input.length == 0) || input.length < inOff + inLen - 1) - { - return 0; - } - int result = 0; - for (int j = 0; j < inLen; j++) - { - result |= (input[inOff + j] & 0xff) << (8 * (inLen - j - 1)); - } - return result; - } - - /** - * Convert a byte array of length 8 beginning at inOff into a - * long integer. - * - * @param input the byte array - * @param inOff the offset into the byte array - * @return the resulting long integer - */ - public static long OS2LIP(byte[] input, int inOff) - { - long result = ((long)input[inOff++] & 0xff) << 56; - result |= ((long)input[inOff++] & 0xff) << 48; - result |= ((long)input[inOff++] & 0xff) << 40; - result |= ((long)input[inOff++] & 0xff) << 32; - result |= ((long)input[inOff++] & 0xff) << 24; - result |= (input[inOff++] & 0xff) << 16; - result |= (input[inOff++] & 0xff) << 8; - result |= input[inOff] & 0xff; - return result; - } - - /** - * Convert an int array into a byte array. - * - * @param input the int array - * @return the converted array - */ - public static byte[] toByteArray(final int[] input) - { - byte[] result = new byte[input.length << 2]; - for (int i = 0; i < input.length; i++) - { - I2OSP(input[i], result, i << 2); - } - return result; - } - - /** - * Convert an int array into a byte array of the specified length. No length - * checking is performed (i.e., if the last integer cannot be encoded into - * length % 4 octets, it is truncated). - * - * @param input the int array - * @param length the length of the converted array - * @return the converted array - */ - public static byte[] toByteArray(final int[] input, int length) - { - final int intLen = input.length; - byte[] result = new byte[length]; - int index = 0; - for (int i = 0; i <= intLen - 2; i++, index += 4) - { - I2OSP(input[i], result, index); - } - I2OSP(input[intLen - 1], result, index, length - index); - return result; - } - - /** - * Convert a byte array into an int array. - * - * @param input the byte array - * @return the converted array - */ - public static int[] toIntArray(byte[] input) - { - final int intLen = (input.length + 3) / 4; - final int lastLen = input.length & 0x03; - int[] result = new int[intLen]; - - int index = 0; - for (int i = 0; i <= intLen - 2; i++, index += 4) - { - result[i] = OS2IP(input, index); - } - if (lastLen != 0) - { - result[intLen - 1] = OS2IP(input, index, lastLen); - } - else - { - result[intLen - 1] = OS2IP(input, index); - } - - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigIntUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigIntUtils.java deleted file mode 100644 index ed1feda..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/BigIntUtils.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.math.BigInteger; - -/** - * FIXME: is this really necessary?! - */ -public final class BigIntUtils -{ - - /** - * Default constructor (private). - */ - private BigIntUtils() - { - // empty - } - - /** - * Checks if two BigInteger arrays contain the same entries - * - * @param a first BigInteger array - * @param b second BigInteger array - * @return true or false - */ - public static boolean equals(BigInteger[] a, BigInteger[] b) - { - int flag = 0; - - if (a.length != b.length) - { - return false; - } - for (int i = 0; i < a.length; i++) - { - // avoid branches here! - // problem: compareTo on BigIntegers is not - // guaranteed constant-time! - flag |= a[i].compareTo(b[i]); - } - return flag == 0; - } - - /** - * Fill the given BigInteger array with the given value. - * - * @param array the array - * @param value the value - */ - public static void fill(BigInteger[] array, BigInteger value) - { - for (int i = array.length - 1; i >= 0; i--) - { - array[i] = value; - } - } - - /** - * Generates a subarray of a given BigInteger array. - * - * @param input - - * the input BigInteger array - * @param start - - * the start index - * @param end - - * the end index - * @return a subarray of input, ranging from start to - * end - */ - public static BigInteger[] subArray(BigInteger[] input, int start, int end) - { - BigInteger[] result = new BigInteger[end - start]; - System.arraycopy(input, start, result, 0, end - start); - return result; - } - - /** - * Converts a BigInteger array into an integer array - * - * @param input - - * the BigInteger array - * @return the integer array - */ - public static int[] toIntArray(BigInteger[] input) - { - int[] result = new int[input.length]; - for (int i = 0; i < input.length; i++) - { - result[i] = input[i].intValue(); - } - return result; - } - - /** - * Converts a BigInteger array into an integer array, reducing all - * BigIntegers mod q. - * - * @param q - - * the modulus - * @param input - - * the BigInteger array - * @return the integer array - */ - public static int[] toIntArrayModQ(int q, BigInteger[] input) - { - BigInteger bq = BigInteger.valueOf(q); - int[] result = new int[input.length]; - for (int i = 0; i < input.length; i++) - { - result[i] = input[i].mod(bq).intValue(); - } - return result; - } - - /** - * Return the value of big as a byte array. Although BigInteger - * has such a method, it uses an extra bit to indicate the sign of the - * number. For elliptic curve cryptography, the numbers usually are - * positive. Thus, this helper method returns a byte array of minimal - * length, ignoring the sign of the number. - * - * @param value the BigInteger value to be converted to a byte - * array - * @return the value big as byte array - */ - public static byte[] toMinimalByteArray(BigInteger value) - { - byte[] valBytes = value.toByteArray(); - if ((valBytes.length == 1) || (value.bitLength() & 0x07) != 0) - { - return valBytes; - } - byte[] result = new byte[value.bitLength() >> 3]; - System.arraycopy(valBytes, 1, result, 0, result.length); - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/ByteUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/ByteUtils.java deleted file mode 100644 index d4905ec..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/ByteUtils.java +++ /dev/null @@ -1,414 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This class is a utility class for manipulating byte arrays. - */ -public final class ByteUtils -{ - - private static final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', - '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - - /** - * Default constructor (private) - */ - private ByteUtils() - { - // empty - } - - /** - * Compare two byte arrays (perform null checks beforehand). - * - * @param left the first byte array - * @param right the second byte array - * @return the result of the comparison - */ - public static boolean equals(byte[] left, byte[] right) - { - if (left == null) - { - return right == null; - } - if (right == null) - { - return false; - } - - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= left[i] == right[i]; - } - return result; - } - - /** - * Compare two two-dimensional byte arrays. No null checks are performed. - * - * @param left the first byte array - * @param right the second byte array - * @return the result of the comparison - */ - public static boolean equals(byte[][] left, byte[][] right) - { - if (left.length != right.length) - { - return false; - } - - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= ByteUtils.equals(left[i], right[i]); - } - - return result; - } - - /** - * Compare two three-dimensional byte arrays. No null checks are performed. - * - * @param left the first byte array - * @param right the second byte array - * @return the result of the comparison - */ - public static boolean equals(byte[][][] left, byte[][][] right) - { - if (left.length != right.length) - { - return false; - } - - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - if (left[i].length != right[i].length) - { - return false; - } - for (int j = left[i].length - 1; j >= 0; j--) - { - result &= ByteUtils.equals(left[i][j], right[i][j]); - } - } - - return result; - } - - /** - * Computes a hashcode based on the contents of a one-dimensional byte array - * rather than its identity. - * - * @param array the array to compute the hashcode of - * @return the hashcode - */ - public static int deepHashCode(byte[] array) - { - int result = 1; - for (int i = 0; i < array.length; i++) - { - result = 31 * result + array[i]; - } - return result; - } - - /** - * Computes a hashcode based on the contents of a two-dimensional byte array - * rather than its identity. - * - * @param array the array to compute the hashcode of - * @return the hashcode - */ - public static int deepHashCode(byte[][] array) - { - int result = 1; - for (int i = 0; i < array.length; i++) - { - result = 31 * result + deepHashCode(array[i]); - } - return result; - } - - /** - * Computes a hashcode based on the contents of a three-dimensional byte - * array rather than its identity. - * - * @param array the array to compute the hashcode of - * @return the hashcode - */ - public static int deepHashCode(byte[][][] array) - { - int result = 1; - for (int i = 0; i < array.length; i++) - { - result = 31 * result + deepHashCode(array[i]); - } - return result; - } - - - /** - * Return a clone of the given byte array (performs null check beforehand). - * - * @param array the array to clone - * @return the clone of the given array, or null if the array is - * null - */ - public static byte[] clone(byte[] array) - { - if (array == null) - { - return null; - } - byte[] result = new byte[array.length]; - System.arraycopy(array, 0, result, 0, array.length); - return result; - } - - /** - * Convert a string containing hexadecimal characters to a byte-array. - * - * @param s a hex string - * @return a byte array with the corresponding value - */ - public static byte[] fromHexString(String s) - { - char[] rawChars = s.toUpperCase().toCharArray(); - - int hexChars = 0; - for (int i = 0; i < rawChars.length; i++) - { - if ((rawChars[i] >= '0' && rawChars[i] <= '9') - || (rawChars[i] >= 'A' && rawChars[i] <= 'F')) - { - hexChars++; - } - } - - byte[] byteString = new byte[(hexChars + 1) >> 1]; - - int pos = hexChars & 1; - - for (int i = 0; i < rawChars.length; i++) - { - if (rawChars[i] >= '0' && rawChars[i] <= '9') - { - byteString[pos >> 1] <<= 4; - byteString[pos >> 1] |= rawChars[i] - '0'; - } - else if (rawChars[i] >= 'A' && rawChars[i] <= 'F') - { - byteString[pos >> 1] <<= 4; - byteString[pos >> 1] |= rawChars[i] - 'A' + 10; - } - else - { - continue; - } - pos++; - } - - return byteString; - } - - /** - * Convert a byte array to the corresponding hexstring. - * - * @param input the byte array to be converted - * @return the corresponding hexstring - */ - public static String toHexString(byte[] input) - { - String result = ""; - for (int i = 0; i < input.length; i++) - { - result += HEX_CHARS[(input[i] >>> 4) & 0x0f]; - result += HEX_CHARS[(input[i]) & 0x0f]; - } - return result; - } - - /** - * Convert a byte array to the corresponding hex string. - * - * @param input the byte array to be converted - * @param prefix the prefix to put at the beginning of the hex string - * @param seperator a separator string - * @return the corresponding hex string - */ - public static String toHexString(byte[] input, String prefix, - String seperator) - { - String result = new String(prefix); - for (int i = 0; i < input.length; i++) - { - result += HEX_CHARS[(input[i] >>> 4) & 0x0f]; - result += HEX_CHARS[(input[i]) & 0x0f]; - if (i < input.length - 1) - { - result += seperator; - } - } - return result; - } - - /** - * Convert a byte array to the corresponding bit string. - * - * @param input the byte array to be converted - * @return the corresponding bit string - */ - public static String toBinaryString(byte[] input) - { - String result = ""; - int i; - for (i = 0; i < input.length; i++) - { - int e = input[i]; - for (int ii = 0; ii < 8; ii++) - { - int b = (e >>> ii) & 1; - result += b; - } - if (i != input.length - 1) - { - result += " "; - } - } - return result; - } - - /** - * Compute the bitwise XOR of two arrays of bytes. The arrays have to be of - * same length. No length checking is performed. - * - * @param x1 the first array - * @param x2 the second array - * @return x1 XOR x2 - */ - public static byte[] xor(byte[] x1, byte[] x2) - { - byte[] out = new byte[x1.length]; - - for (int i = x1.length - 1; i >= 0; i--) - { - out[i] = (byte)(x1[i] ^ x2[i]); - } - return out; - } - - /** - * Concatenate two byte arrays. No null checks are performed. - * - * @param x1 the first array - * @param x2 the second array - * @return (x2||x1) (little-endian order, i.e. x1 is at lower memory - * addresses) - */ - public static byte[] concatenate(byte[] x1, byte[] x2) - { - byte[] result = new byte[x1.length + x2.length]; - - System.arraycopy(x1, 0, result, 0, x1.length); - System.arraycopy(x2, 0, result, x1.length, x2.length); - - return result; - } - - /** - * Convert a 2-dimensional byte array into a 1-dimensional byte array by - * concatenating all entries. - * - * @param array a 2-dimensional byte array - * @return the concatenated input array - */ - public static byte[] concatenate(byte[][] array) - { - int rowLength = array[0].length; - byte[] result = new byte[array.length * rowLength]; - int index = 0; - for (int i = 0; i < array.length; i++) - { - System.arraycopy(array[i], 0, result, index, rowLength); - index += rowLength; - } - return result; - } - - /** - * Split a byte array input into two arrays at index, - * i.e. the first array will have the lower index bytes, the - * second one the higher input.length - index bytes. - * - * @param input the byte array to be split - * @param index the index where the byte array is split - * @return the splitted input array as an array of two byte arrays - * @throws ArrayIndexOutOfBoundsException if index is out of bounds - */ - public static byte[][] split(byte[] input, int index) - throws ArrayIndexOutOfBoundsException - { - if (index > input.length) - { - throw new ArrayIndexOutOfBoundsException(); - } - byte[][] result = new byte[2][]; - result[0] = new byte[index]; - result[1] = new byte[input.length - index]; - System.arraycopy(input, 0, result[0], 0, index); - System.arraycopy(input, index, result[1], 0, input.length - index); - return result; - } - - /** - * Generate a subarray of a given byte array. - * - * @param input the input byte array - * @param start the start index - * @param end the end index - * @return a subarray of input, ranging from start - * (inclusively) to end (exclusively) - */ - public static byte[] subArray(byte[] input, int start, int end) - { - byte[] result = new byte[end - start]; - System.arraycopy(input, start, result, 0, end - start); - return result; - } - - /** - * Generate a subarray of a given byte array. - * - * @param input the input byte array - * @param start the start index - * @return a subarray of input, ranging from start to - * the end of the array - */ - public static byte[] subArray(byte[] input, int start) - { - return subArray(input, start, input.length); - } - - /** - * Rewrite a byte array as a char array - * - * @param input - - * the byte array - * @return char array - */ - public static char[] toCharArray(byte[] input) - { - char[] result = new char[input.length]; - for (int i = 0; i < input.length; i++) - { - result[i] = (char)input[i]; - } - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/CharUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/CharUtils.java deleted file mode 100644 index acf948e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/CharUtils.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -public final class CharUtils -{ - - /** - * Default constructor (private) - */ - private CharUtils() - { - // empty - } - - /** - * Return a clone of the given char array. No null checks are performed. - * - * @param array the array to clone - * @return the clone of the given array - */ - public static char[] clone(char[] array) - { - char[] result = new char[array.length]; - System.arraycopy(array, 0, result, 0, array.length); - return result; - } - - /** - * Convert the given char array into a byte array. - * - * @param chars the char array - * @return the converted array - */ - public static byte[] toByteArray(char[] chars) - { - byte[] result = new byte[chars.length]; - for (int i = chars.length - 1; i >= 0; i--) - { - result[i] = (byte)chars[i]; - } - return result; - } - - /** - * Convert the given char array into a - * byte array for use with PBE encryption. - * - * @param chars the char array - * @return the converted array - */ - public static byte[] toByteArrayForPBE(char[] chars) - { - - byte[] out = new byte[chars.length]; - - for (int i = 0; i < chars.length; i++) - { - out[i] = (byte)chars[i]; - } - - int length = out.length * 2; - byte[] ret = new byte[length + 2]; - - int j = 0; - for (int i = 0; i < out.length; i++) - { - j = i * 2; - ret[j] = 0; - ret[j + 1] = out[i]; - } - - ret[length] = 0; - ret[length + 1] = 0; - - return ret; - } - - /** - * Compare two char arrays. No null checks are performed. - * - * @param left the char byte array - * @param right the second char array - * @return the result of the comparison - */ - public static boolean equals(char[] left, char[] right) - { - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= left[i] == right[i]; - } - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Matrix.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Matrix.java deleted file mode 100644 index 147747d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Matrix.java +++ /dev/null @@ -1,1323 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class describes some operations with matrices over finite field GF(2) - * and is used in ecc and MQ-PKC (also has some specific methods and - * implementation) - */ -public class GF2Matrix - extends Matrix -{ - - /** - * For the matrix representation the array of type int[][] is used, thus one - * element of the array keeps 32 elements of the matrix (from one row and 32 - * columns) - */ - private int[][] matrix; - - /** - * the length of each array representing a row of this matrix, computed as - * (numColumns + 31) / 32 - */ - private int length; - - /** - * Create the matrix from encoded form. - * - * @param enc the encoded matrix - */ - public GF2Matrix(byte[] enc) - { - if (enc.length < 9) - { - throw new ArithmeticException( - "given array is not an encoded matrix over GF(2)"); - } - - numRows = LittleEndianConversions.OS2IP(enc, 0); - numColumns = LittleEndianConversions.OS2IP(enc, 4); - - int n = ((numColumns + 7) >>> 3) * numRows; - - if ((numRows <= 0) || (n != (enc.length - 8))) - { - throw new ArithmeticException( - "given array is not an encoded matrix over GF(2)"); - } - - length = (numColumns + 31) >>> 5; - matrix = new int[numRows][length]; - - // number of "full" integer - int q = numColumns >> 5; - // number of bits in non-full integer - int r = numColumns & 0x1f; - - int count = 8; - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < q; j++, count += 4) - { - matrix[i][j] = LittleEndianConversions.OS2IP(enc, count); - } - for (int j = 0; j < r; j += 8) - { - matrix[i][q] ^= (enc[count++] & 0xff) << j; - } - } - } - - /** - * Create the matrix with the contents of the given array. The matrix is not - * copied. Unused coefficients are masked out. - * - * @param numColumns the number of columns - * @param matrix the element array - */ - public GF2Matrix(int numColumns, int[][] matrix) - { - if (matrix[0].length != (numColumns + 31) >> 5) - { - throw new ArithmeticException( - "Int array does not match given number of columns."); - } - this.numColumns = numColumns; - numRows = matrix.length; - length = matrix[0].length; - int rest = numColumns & 0x1f; - int bitMask; - if (rest == 0) - { - bitMask = 0xffffffff; - } - else - { - bitMask = (1 << rest) - 1; - } - for (int i = 0; i < numRows; i++) - { - matrix[i][length - 1] &= bitMask; - } - this.matrix = matrix; - } - - /** - * Create an nxn matrix of the given type. - * - * @param n the number of rows (and columns) - * @param typeOfMatrix the martix type (see {@link Matrix} for predefined - * constants) - */ - public GF2Matrix(int n, char typeOfMatrix) - { - this(n, typeOfMatrix, new java.security.SecureRandom()); - } - - /** - * Create an nxn matrix of the given type. - * - * @param n the matrix size - * @param typeOfMatrix the matrix type - * @param sr the source of randomness - */ - public GF2Matrix(int n, char typeOfMatrix, SecureRandom sr) - { - if (n <= 0) - { - throw new ArithmeticException("Size of matrix is non-positive."); - } - - switch (typeOfMatrix) - { - - case Matrix.MATRIX_TYPE_ZERO: - assignZeroMatrix(n, n); - break; - - case Matrix.MATRIX_TYPE_UNIT: - assignUnitMatrix(n); - break; - - case Matrix.MATRIX_TYPE_RANDOM_LT: - assignRandomLowerTriangularMatrix(n, sr); - break; - - case Matrix.MATRIX_TYPE_RANDOM_UT: - assignRandomUpperTriangularMatrix(n, sr); - break; - - case Matrix.MATRIX_TYPE_RANDOM_REGULAR: - assignRandomRegularMatrix(n, sr); - break; - - default: - throw new ArithmeticException("Unknown matrix type."); - } - } - - /** - * Copy constructor. - * - * @param a another {@link GF2Matrix} - */ - public GF2Matrix(GF2Matrix a) - { - numColumns = a.getNumColumns(); - numRows = a.getNumRows(); - length = a.length; - matrix = new int[a.matrix.length][]; - for (int i = 0; i < matrix.length; i++) - { - matrix[i] = IntUtils.clone(a.matrix[i]); - } - - } - - /** - * create the mxn zero matrix - */ - private GF2Matrix(int m, int n) - { - if ((n <= 0) || (m <= 0)) - { - throw new ArithmeticException("size of matrix is non-positive"); - } - - assignZeroMatrix(m, n); - } - - /** - * Create the mxn zero matrix. - * - * @param m number of rows - * @param n number of columns - */ - private void assignZeroMatrix(int m, int n) - { - numRows = m; - numColumns = n; - length = (n + 31) >>> 5; - matrix = new int[numRows][length]; - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < length; j++) - { - matrix[i][j] = 0; - } - } - } - - /** - * Create the mxn unit matrix. - * - * @param n number of rows (and columns) - */ - private void assignUnitMatrix(int n) - { - numRows = n; - numColumns = n; - length = (n + 31) >>> 5; - matrix = new int[numRows][length]; - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < length; j++) - { - matrix[i][j] = 0; - } - } - for (int i = 0; i < numRows; i++) - { - int rest = i & 0x1f; - matrix[i][i >>> 5] = 1 << rest; - } - } - - /** - * Create a nxn random lower triangular matrix. - * - * @param n number of rows (and columns) - * @param sr source of randomness - */ - private void assignRandomLowerTriangularMatrix(int n, SecureRandom sr) - { - numRows = n; - numColumns = n; - length = (n + 31) >>> 5; - matrix = new int[numRows][length]; - for (int i = 0; i < numRows; i++) - { - int q = i >>> 5; - int r = i & 0x1f; - int s = 31 - r; - r = 1 << r; - for (int j = 0; j < q; j++) - { - matrix[i][j] = sr.nextInt(); - } - matrix[i][q] = (sr.nextInt() >>> s) | r; - for (int j = q + 1; j < length; j++) - { - matrix[i][j] = 0; - } - - } - - } - - /** - * Create a nxn random upper triangular matrix. - * - * @param n number of rows (and columns) - * @param sr source of randomness - */ - private void assignRandomUpperTriangularMatrix(int n, SecureRandom sr) - { - numRows = n; - numColumns = n; - length = (n + 31) >>> 5; - matrix = new int[numRows][length]; - int rest = n & 0x1f; - int help; - if (rest == 0) - { - help = 0xffffffff; - } - else - { - help = (1 << rest) - 1; - } - for (int i = 0; i < numRows; i++) - { - int q = i >>> 5; - int r = i & 0x1f; - int s = r; - r = 1 << r; - for (int j = 0; j < q; j++) - { - matrix[i][j] = 0; - } - matrix[i][q] = (sr.nextInt() << s) | r; - for (int j = q + 1; j < length; j++) - { - matrix[i][j] = sr.nextInt(); - } - matrix[i][length - 1] &= help; - } - - } - - /** - * Create an nxn random regular matrix. - * - * @param n number of rows (and columns) - * @param sr source of randomness - */ - private void assignRandomRegularMatrix(int n, SecureRandom sr) - { - numRows = n; - numColumns = n; - length = (n + 31) >>> 5; - matrix = new int[numRows][length]; - GF2Matrix lm = new GF2Matrix(n, Matrix.MATRIX_TYPE_RANDOM_LT, sr); - GF2Matrix um = new GF2Matrix(n, Matrix.MATRIX_TYPE_RANDOM_UT, sr); - GF2Matrix rm = (GF2Matrix)lm.rightMultiply(um); - Permutation perm = new Permutation(n, sr); - int[] p = perm.getVector(); - for (int i = 0; i < n; i++) - { - System.arraycopy(rm.matrix[i], 0, matrix[p[i]], 0, length); - } - } - - /** - * Create a nxn random regular matrix and its inverse. - * - * @param n number of rows (and columns) - * @param sr source of randomness - * @return the created random regular matrix and its inverse - */ - public static GF2Matrix[] createRandomRegularMatrixAndItsInverse(int n, - SecureRandom sr) - { - - GF2Matrix[] result = new GF2Matrix[2]; - - // ------------------------------------ - // First part: create regular matrix - // ------------------------------------ - - // ------ - int length = (n + 31) >> 5; - GF2Matrix lm = new GF2Matrix(n, Matrix.MATRIX_TYPE_RANDOM_LT, sr); - GF2Matrix um = new GF2Matrix(n, Matrix.MATRIX_TYPE_RANDOM_UT, sr); - GF2Matrix rm = (GF2Matrix)lm.rightMultiply(um); - Permutation p = new Permutation(n, sr); - int[] pVec = p.getVector(); - - int[][] matrix = new int[n][length]; - for (int i = 0; i < n; i++) - { - System.arraycopy(rm.matrix[pVec[i]], 0, matrix[i], 0, length); - } - - result[0] = new GF2Matrix(n, matrix); - - // ------------------------------------ - // Second part: create inverse matrix - // ------------------------------------ - - // inverse to lm - GF2Matrix invLm = new GF2Matrix(n, Matrix.MATRIX_TYPE_UNIT); - for (int i = 0; i < n; i++) - { - int rest = i & 0x1f; - int q = i >>> 5; - int r = 1 << rest; - for (int j = i + 1; j < n; j++) - { - int b = (lm.matrix[j][q]) & r; - if (b != 0) - { - for (int k = 0; k <= q; k++) - { - invLm.matrix[j][k] ^= invLm.matrix[i][k]; - } - } - } - } - // inverse to um - GF2Matrix invUm = new GF2Matrix(n, Matrix.MATRIX_TYPE_UNIT); - for (int i = n - 1; i >= 0; i--) - { - int rest = i & 0x1f; - int q = i >>> 5; - int r = 1 << rest; - for (int j = i - 1; j >= 0; j--) - { - int b = (um.matrix[j][q]) & r; - if (b != 0) - { - for (int k = q; k < length; k++) - { - invUm.matrix[j][k] ^= invUm.matrix[i][k]; - } - } - } - } - - // inverse matrix - result[1] = (GF2Matrix)invUm.rightMultiply(invLm.rightMultiply(p)); - - return result; - } - - /** - * @return the array keeping the matrix elements - */ - public int[][] getIntArray() - { - return matrix; - } - - /** - * @return the length of each array representing a row of this matrix - */ - public int getLength() - { - return length; - } - - /** - * Return the row of this matrix with the given index. - * - * @param index the index - * @return the row of this matrix with the given index - */ - public int[] getRow(int index) - { - return matrix[index]; - } - - /** - * Returns encoded matrix, i.e., this matrix in byte array form - * - * @return the encoded matrix - */ - public byte[] getEncoded() - { - int n = (numColumns + 7) >>> 3; - n *= numRows; - n += 8; - byte[] enc = new byte[n]; - - LittleEndianConversions.I2OSP(numRows, enc, 0); - LittleEndianConversions.I2OSP(numColumns, enc, 4); - - // number of "full" integer - int q = numColumns >>> 5; - // number of bits in non-full integer - int r = numColumns & 0x1f; - - int count = 8; - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < q; j++, count += 4) - { - LittleEndianConversions.I2OSP(matrix[i][j], enc, count); - } - for (int j = 0; j < r; j += 8) - { - enc[count++] = (byte)((matrix[i][q] >>> j) & 0xff); - } - - } - return enc; - } - - - /** - * Returns the percentage of the number of "ones" in this matrix. - * - * @return the Hamming weight of this matrix (as a ratio). - */ - public double getHammingWeight() - { - double counter = 0.0; - double elementCounter = 0.0; - int rest = numColumns & 0x1f; - int d; - if (rest == 0) - { - d = length; - } - else - { - d = length - 1; - } - - for (int i = 0; i < numRows; i++) - { - - for (int j = 0; j < d; j++) - { - int a = matrix[i][j]; - for (int k = 0; k < 32; k++) - { - int b = (a >>> k) & 1; - counter = counter + b; - elementCounter = elementCounter + 1; - } - } - int a = matrix[i][length - 1]; - for (int k = 0; k < rest; k++) - { - int b = (a >>> k) & 1; - counter = counter + b; - elementCounter = elementCounter + 1; - } - } - - return counter / elementCounter; - } - - /** - * Check if this is the zero matrix (i.e., all entries are zero). - * - * @return true if this is the zero matrix - */ - public boolean isZero() - { - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < length; j++) - { - if (matrix[i][j] != 0) - { - return false; - } - } - } - return true; - } - - /** - * Get the quadratic submatrix of this matrix consisting of the leftmost - * numRows columns. - * - * @return the (numRows x numRows) submatrix - */ - public GF2Matrix getLeftSubMatrix() - { - if (numColumns <= numRows) - { - throw new ArithmeticException("empty submatrix"); - } - int length = (numRows + 31) >> 5; - int[][] result = new int[numRows][length]; - int bitMask = (1 << (numRows & 0x1f)) - 1; - if (bitMask == 0) - { - bitMask = -1; - } - for (int i = numRows - 1; i >= 0; i--) - { - System.arraycopy(matrix[i], 0, result[i], 0, length); - result[i][length - 1] &= bitMask; - } - return new GF2Matrix(numRows, result); - } - - /** - * Compute the full form matrix (this | Id) from this matrix in - * left compact form, where Id is the k x k identity - * matrix and k is the number of rows of this matrix. - * - * @return (this | Id) - */ - public GF2Matrix extendLeftCompactForm() - { - int newNumColumns = numColumns + numRows; - GF2Matrix result = new GF2Matrix(numRows, newNumColumns); - - int ind = numRows - 1 + numColumns; - for (int i = numRows - 1; i >= 0; i--, ind--) - { - // copy this matrix to first columns - System.arraycopy(matrix[i], 0, result.matrix[i], 0, length); - // store the identity in last columns - result.matrix[i][ind >> 5] |= 1 << (ind & 0x1f); - } - - return result; - } - - /** - * Get the submatrix of this matrix consisting of the rightmost - * numColumns-numRows columns. - * - * @return the (numRows x (numColumns-numRows)) submatrix - */ - public GF2Matrix getRightSubMatrix() - { - if (numColumns <= numRows) - { - throw new ArithmeticException("empty submatrix"); - } - - int q = numRows >> 5; - int r = numRows & 0x1f; - - GF2Matrix result = new GF2Matrix(numRows, numColumns - numRows); - - for (int i = numRows - 1; i >= 0; i--) - { - // if words have to be shifted - if (r != 0) - { - int ind = q; - // process all but last word - for (int j = 0; j < result.length - 1; j++) - { - // shift to correct position - result.matrix[i][j] = (matrix[i][ind++] >>> r) - | (matrix[i][ind] << (32 - r)); - } - // process last word - result.matrix[i][result.length - 1] = matrix[i][ind++] >>> r; - if (ind < length) - { - result.matrix[i][result.length - 1] |= matrix[i][ind] << (32 - r); - } - } - else - { - // no shifting necessary - System.arraycopy(matrix[i], q, result.matrix[i], 0, - result.length); - } - } - return result; - } - - /** - * Compute the full form matrix (Id | this) from this matrix in - * right compact form, where Id is the k x k identity - * matrix and k is the number of rows of this matrix. - * - * @return (Id | this) - */ - public GF2Matrix extendRightCompactForm() - { - GF2Matrix result = new GF2Matrix(numRows, numRows + numColumns); - - int q = numRows >> 5; - int r = numRows & 0x1f; - - for (int i = numRows - 1; i >= 0; i--) - { - // store the identity in first columns - result.matrix[i][i >> 5] |= 1 << (i & 0x1f); - - // copy this matrix to last columns - - // if words have to be shifted - if (r != 0) - { - int ind = q; - // process all but last word - for (int j = 0; j < length - 1; j++) - { - // obtain matrix word - int mw = matrix[i][j]; - // shift to correct position - result.matrix[i][ind++] |= mw << r; - result.matrix[i][ind] |= mw >>> (32 - r); - } - // process last word - int mw = matrix[i][length - 1]; - result.matrix[i][ind++] |= mw << r; - if (ind < result.length) - { - result.matrix[i][ind] |= mw >>> (32 - r); - } - } - else - { - // no shifting necessary - System.arraycopy(matrix[i], 0, result.matrix[i], q, length); - } - } - - return result; - } - - /** - * Compute the transpose of this matrix. - * - * @return (this)T - */ - public Matrix computeTranspose() - { - int[][] result = new int[numColumns][(numRows + 31) >>> 5]; - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < numColumns; j++) - { - int qs = j >>> 5; - int rs = j & 0x1f; - int b = (matrix[i][qs] >>> rs) & 1; - int qt = i >>> 5; - int rt = i & 0x1f; - if (b == 1) - { - result[j][qt] |= 1 << rt; - } - } - } - - return new GF2Matrix(numRows, result); - } - - /** - * Compute the inverse of this matrix. - * - * @return the inverse of this matrix (newly created). - * @throws ArithmeticException if this matrix is not invertible. - */ - public Matrix computeInverse() - { - if (numRows != numColumns) - { - throw new ArithmeticException("Matrix is not invertible."); - } - - // clone this matrix - int[][] tmpMatrix = new int[numRows][length]; - for (int i = numRows - 1; i >= 0; i--) - { - tmpMatrix[i] = IntUtils.clone(matrix[i]); - } - - // initialize inverse matrix as unit matrix - int[][] invMatrix = new int[numRows][length]; - for (int i = numRows - 1; i >= 0; i--) - { - int q = i >> 5; - int r = i & 0x1f; - invMatrix[i][q] = 1 << r; - } - - // simultaneously compute Gaussian reduction of tmpMatrix and unit - // matrix - for (int i = 0; i < numRows; i++) - { - // i = q * 32 + (i mod 32) - int q = i >> 5; - int bitMask = 1 << (i & 0x1f); - // if diagonal element is zero - if ((tmpMatrix[i][q] & bitMask) == 0) - { - boolean foundNonZero = false; - // find a non-zero element in the same column - for (int j = i + 1; j < numRows; j++) - { - if ((tmpMatrix[j][q] & bitMask) != 0) - { - // found it, swap rows ... - foundNonZero = true; - swapRows(tmpMatrix, i, j); - swapRows(invMatrix, i, j); - // ... and quit searching - j = numRows; - continue; - } - } - // if no non-zero element was found ... - if (!foundNonZero) - { - // ... the matrix is not invertible - throw new ArithmeticException("Matrix is not invertible."); - } - } - - // normalize all but i-th row - for (int j = numRows - 1; j >= 0; j--) - { - if ((j != i) && ((tmpMatrix[j][q] & bitMask) != 0)) - { - addToRow(tmpMatrix[i], tmpMatrix[j], q); - addToRow(invMatrix[i], invMatrix[j], 0); - } - } - } - - return new GF2Matrix(numColumns, invMatrix); - } - - /** - * Compute the product of a permutation matrix (which is generated from an - * n-permutation) and this matrix. - * - * @param p the permutation - * @return {@link GF2Matrix} P*this - */ - public Matrix leftMultiply(Permutation p) - { - int[] pVec = p.getVector(); - if (pVec.length != numRows) - { - throw new ArithmeticException("length mismatch"); - } - - int[][] result = new int[numRows][]; - - for (int i = numRows - 1; i >= 0; i--) - { - result[i] = IntUtils.clone(matrix[pVec[i]]); - } - - return new GF2Matrix(numRows, result); - } - - /** - * compute product a row vector and this matrix - * - * @param vec a vector over GF(2) - * @return Vector product a*matrix - */ - public Vector leftMultiply(Vector vec) - { - - if (!(vec instanceof GF2Vector)) - { - throw new ArithmeticException("vector is not defined over GF(2)"); - } - - if (vec.length != numRows) - { - throw new ArithmeticException("length mismatch"); - } - - int[] v = ((GF2Vector)vec).getVecArray(); - int[] res = new int[length]; - - int q = numRows >> 5; - int r = 1 << (numRows & 0x1f); - - // compute scalar products with full words of vector - int row = 0; - for (int i = 0; i < q; i++) - { - int bitMask = 1; - do - { - int b = v[i] & bitMask; - if (b != 0) - { - for (int j = 0; j < length; j++) - { - res[j] ^= matrix[row][j]; - } - } - row++; - bitMask <<= 1; - } - while (bitMask != 0); - } - - // compute scalar products with last word of vector - int bitMask = 1; - while (bitMask != r) - { - int b = v[q] & bitMask; - if (b != 0) - { - for (int j = 0; j < length; j++) - { - res[j] ^= matrix[row][j]; - } - } - row++; - bitMask <<= 1; - } - - return new GF2Vector(res, numColumns); - } - - /** - * Compute the product of the matrix (this | Id) and a column - * vector, where Id is a (numRows x numRows) unit - * matrix. - * - * @param vec the vector over GF(2) - * @return (this | Id)*vector - */ - public Vector leftMultiplyLeftCompactForm(Vector vec) - { - if (!(vec instanceof GF2Vector)) - { - throw new ArithmeticException("vector is not defined over GF(2)"); - } - - if (vec.length != numRows) - { - throw new ArithmeticException("length mismatch"); - } - - int[] v = ((GF2Vector)vec).getVecArray(); - int[] res = new int[(numRows + numColumns + 31) >>> 5]; - - // process full words of vector - int words = numRows >>> 5; - int row = 0; - for (int i = 0; i < words; i++) - { - int bitMask = 1; - do - { - int b = v[i] & bitMask; - if (b != 0) - { - // compute scalar product part - for (int j = 0; j < length; j++) - { - res[j] ^= matrix[row][j]; - } - // set last bit - int q = (numColumns + row) >>> 5; - int r = (numColumns + row) & 0x1f; - res[q] |= 1 << r; - } - row++; - bitMask <<= 1; - } - while (bitMask != 0); - } - - // process last word of vector - int rem = 1 << (numRows & 0x1f); - int bitMask = 1; - while (bitMask != rem) - { - int b = v[words] & bitMask; - if (b != 0) - { - // compute scalar product part - for (int j = 0; j < length; j++) - { - res[j] ^= matrix[row][j]; - } - // set last bit - int q = (numColumns + row) >>> 5; - int r = (numColumns + row) & 0x1f; - res[q] |= 1 << r; - } - row++; - bitMask <<= 1; - } - - return new GF2Vector(res, numRows + numColumns); - } - - /** - * Compute the product of this matrix and a matrix A over GF(2). - * - * @param mat a matrix A over GF(2) - * @return matrix product this*matrixA - */ - public Matrix rightMultiply(Matrix mat) - { - if (!(mat instanceof GF2Matrix)) - { - throw new ArithmeticException("matrix is not defined over GF(2)"); - } - - if (mat.numRows != numColumns) - { - throw new ArithmeticException("length mismatch"); - } - - GF2Matrix a = (GF2Matrix)mat; - GF2Matrix result = new GF2Matrix(numRows, mat.numColumns); - - int d; - int rest = numColumns & 0x1f; - if (rest == 0) - { - d = length; - } - else - { - d = length - 1; - } - for (int i = 0; i < numRows; i++) - { - int count = 0; - for (int j = 0; j < d; j++) - { - int e = matrix[i][j]; - for (int h = 0; h < 32; h++) - { - int b = e & (1 << h); - if (b != 0) - { - for (int g = 0; g < a.length; g++) - { - result.matrix[i][g] ^= a.matrix[count][g]; - } - } - count++; - } - } - int e = matrix[i][length - 1]; - for (int h = 0; h < rest; h++) - { - int b = e & (1 << h); - if (b != 0) - { - for (int g = 0; g < a.length; g++) - { - result.matrix[i][g] ^= a.matrix[count][g]; - } - } - count++; - } - - } - - return result; - } - - /** - * Compute the product of this matrix and a permutation matrix which is - * generated from an n-permutation. - * - * @param p the permutation - * @return {@link GF2Matrix} this*P - */ - public Matrix rightMultiply(Permutation p) - { - - int[] pVec = p.getVector(); - if (pVec.length != numColumns) - { - throw new ArithmeticException("length mismatch"); - } - - GF2Matrix result = new GF2Matrix(numRows, numColumns); - - for (int i = numColumns - 1; i >= 0; i--) - { - int q = i >>> 5; - int r = i & 0x1f; - int pq = pVec[i] >>> 5; - int pr = pVec[i] & 0x1f; - for (int j = numRows - 1; j >= 0; j--) - { - result.matrix[j][q] |= ((matrix[j][pq] >>> pr) & 1) << r; - } - } - - return result; - } - - /** - * Compute the product of this matrix and the given column vector. - * - * @param vec the vector over GF(2) - * @return this*vector - */ - public Vector rightMultiply(Vector vec) - { - if (!(vec instanceof GF2Vector)) - { - throw new ArithmeticException("vector is not defined over GF(2)"); - } - - if (vec.length != numColumns) - { - throw new ArithmeticException("length mismatch"); - } - - int[] v = ((GF2Vector)vec).getVecArray(); - int[] res = new int[(numRows + 31) >>> 5]; - - for (int i = 0; i < numRows; i++) - { - // compute full word scalar products - int help = 0; - for (int j = 0; j < length; j++) - { - help ^= matrix[i][j] & v[j]; - } - // compute single word scalar product - int bitValue = 0; - for (int j = 0; j < 32; j++) - { - bitValue ^= (help >>> j) & 1; - } - // set result bit - if (bitValue == 1) - { - res[i >>> 5] |= 1 << (i & 0x1f); - } - } - - return new GF2Vector(res, numRows); - } - - /** - * Compute the product of the matrix (Id | this) and a column - * vector, where Id is a (numRows x numRows) unit - * matrix. - * - * @param vec the vector over GF(2) - * @return (Id | this)*vector - */ - public Vector rightMultiplyRightCompactForm(Vector vec) - { - if (!(vec instanceof GF2Vector)) - { - throw new ArithmeticException("vector is not defined over GF(2)"); - } - - if (vec.length != numColumns + numRows) - { - throw new ArithmeticException("length mismatch"); - } - - int[] v = ((GF2Vector)vec).getVecArray(); - int[] res = new int[(numRows + 31) >>> 5]; - - int q = numRows >> 5; - int r = numRows & 0x1f; - - // for all rows - for (int i = 0; i < numRows; i++) - { - // get vector bit - int help = (v[i >> 5] >>> (i & 0x1f)) & 1; - - // compute full word scalar products - int vInd = q; - // if words have to be shifted - if (r != 0) - { - int vw = 0; - // process all but last word - for (int j = 0; j < length - 1; j++) - { - // shift to correct position - vw = (v[vInd++] >>> r) | (v[vInd] << (32 - r)); - help ^= matrix[i][j] & vw; - } - // process last word - vw = v[vInd++] >>> r; - if (vInd < v.length) - { - vw |= v[vInd] << (32 - r); - } - help ^= matrix[i][length - 1] & vw; - } - else - { - // no shifting necessary - for (int j = 0; j < length; j++) - { - help ^= matrix[i][j] & v[vInd++]; - } - } - - // compute single word scalar product - int bitValue = 0; - for (int j = 0; j < 32; j++) - { - bitValue ^= help & 1; - help >>>= 1; - } - - // set result bit - if (bitValue == 1) - { - res[i >> 5] |= 1 << (i & 0x1f); - } - } - - return new GF2Vector(res, numRows); - } - - /** - * Compare this matrix with another object. - * - * @param other another object - * @return the result of the comparison - */ - public boolean equals(Object other) - { - - if (!(other instanceof GF2Matrix)) - { - return false; - } - GF2Matrix otherMatrix = (GF2Matrix)other; - - if ((numRows != otherMatrix.numRows) - || (numColumns != otherMatrix.numColumns) - || (length != otherMatrix.length)) - { - return false; - } - - for (int i = 0; i < numRows; i++) - { - if (!IntUtils.equals(matrix[i], otherMatrix.matrix[i])) - { - return false; - } - } - - return true; - } - - /** - * @return the hash code of this matrix - */ - public int hashCode() - { - int hash = (numRows * 31 + numColumns) * 31 + length; - for (int i = 0; i < numRows; i++) - { - hash = hash * 31 + matrix[i].hashCode(); - } - return hash; - } - - /** - * @return a human readable form of the matrix - */ - public String toString() - { - int rest = numColumns & 0x1f; - int d; - if (rest == 0) - { - d = length; - } - else - { - d = length - 1; - } - - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < numRows; i++) - { - buf.append(i + ": "); - for (int j = 0; j < d; j++) - { - int a = matrix[i][j]; - for (int k = 0; k < 32; k++) - { - int b = (a >>> k) & 1; - if (b == 0) - { - buf.append('0'); - } - else - { - buf.append('1'); - } - } - buf.append(' '); - } - int a = matrix[i][length - 1]; - for (int k = 0; k < rest; k++) - { - int b = (a >>> k) & 1; - if (b == 0) - { - buf.append('0'); - } - else - { - buf.append('1'); - } - } - buf.append('\n'); - } - - return buf.toString(); - } - - /** - * Swap two rows of the given matrix. - * - * @param matrix the matrix - * @param first the index of the first row - * @param second the index of the second row - */ - private static void swapRows(int[][] matrix, int first, int second) - { - int[] tmp = matrix[first]; - matrix[first] = matrix[second]; - matrix[second] = tmp; - } - - /** - * Partially add one row to another. - * - * @param fromRow the addend - * @param toRow the row to add to - * @param startIndex the array index to start from - */ - private static void addToRow(int[] fromRow, int[] toRow, int startIndex) - { - for (int i = toRow.length - 1; i >= startIndex; i--) - { - toRow[i] = fromRow[i] ^ toRow[i]; - } - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Polynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Polynomial.java deleted file mode 100644 index dff31b5..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Polynomial.java +++ /dev/null @@ -1,2039 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.math.BigInteger; -import java.util.Random; - - -/** - * This class stores very long strings of bits and does some basic arithmetics. - * It is used by GF2nField, GF2nPolynomialField and - * GFnPolynomialElement. - * - * @see GF2nPolynomialElement - * @see GF2nField - */ -public class GF2Polynomial -{ - - // number of bits stored in this GF2Polynomial - private int len; - - // number of int used in value - private int blocks; - - // storage - private int[] value; - - // Random source - private static Random rand = new Random(); - - // Lookup-Table for vectorMult: parity[a]= #1(a) mod 2 == 1 - private static final boolean[] parity = {false, true, true, false, true, - false, false, true, true, false, false, true, false, true, true, - false, true, false, false, true, false, true, true, false, false, - true, true, false, true, false, false, true, true, false, false, - true, false, true, true, false, false, true, true, false, true, - false, false, true, false, true, true, false, true, false, false, - true, true, false, false, true, false, true, true, false, true, - false, false, true, false, true, true, false, false, true, true, - false, true, false, false, true, false, true, true, false, true, - false, false, true, true, false, false, true, false, true, true, - false, false, true, true, false, true, false, false, true, true, - false, false, true, false, true, true, false, true, false, false, - true, false, true, true, false, false, true, true, false, true, - false, false, true, true, false, false, true, false, true, true, - false, false, true, true, false, true, false, false, true, false, - true, true, false, true, false, false, true, true, false, false, - true, false, true, true, false, false, true, true, false, true, - false, false, true, true, false, false, true, false, true, true, - false, true, false, false, true, false, true, true, false, false, - true, true, false, true, false, false, true, false, true, true, - false, true, false, false, true, true, false, false, true, false, - true, true, false, true, false, false, true, false, true, true, - false, false, true, true, false, true, false, false, true, true, - false, false, true, false, true, true, false, false, true, true, - false, true, false, false, true, false, true, true, false, true, - false, false, true, true, false, false, true, false, true, true, - false}; - - // Lookup-Table for Squaring: squaringTable[a]=a^2 - private static final short[] squaringTable = {0x0000, 0x0001, 0x0004, - 0x0005, 0x0010, 0x0011, 0x0014, 0x0015, 0x0040, 0x0041, 0x0044, - 0x0045, 0x0050, 0x0051, 0x0054, 0x0055, 0x0100, 0x0101, 0x0104, - 0x0105, 0x0110, 0x0111, 0x0114, 0x0115, 0x0140, 0x0141, 0x0144, - 0x0145, 0x0150, 0x0151, 0x0154, 0x0155, 0x0400, 0x0401, 0x0404, - 0x0405, 0x0410, 0x0411, 0x0414, 0x0415, 0x0440, 0x0441, 0x0444, - 0x0445, 0x0450, 0x0451, 0x0454, 0x0455, 0x0500, 0x0501, 0x0504, - 0x0505, 0x0510, 0x0511, 0x0514, 0x0515, 0x0540, 0x0541, 0x0544, - 0x0545, 0x0550, 0x0551, 0x0554, 0x0555, 0x1000, 0x1001, 0x1004, - 0x1005, 0x1010, 0x1011, 0x1014, 0x1015, 0x1040, 0x1041, 0x1044, - 0x1045, 0x1050, 0x1051, 0x1054, 0x1055, 0x1100, 0x1101, 0x1104, - 0x1105, 0x1110, 0x1111, 0x1114, 0x1115, 0x1140, 0x1141, 0x1144, - 0x1145, 0x1150, 0x1151, 0x1154, 0x1155, 0x1400, 0x1401, 0x1404, - 0x1405, 0x1410, 0x1411, 0x1414, 0x1415, 0x1440, 0x1441, 0x1444, - 0x1445, 0x1450, 0x1451, 0x1454, 0x1455, 0x1500, 0x1501, 0x1504, - 0x1505, 0x1510, 0x1511, 0x1514, 0x1515, 0x1540, 0x1541, 0x1544, - 0x1545, 0x1550, 0x1551, 0x1554, 0x1555, 0x4000, 0x4001, 0x4004, - 0x4005, 0x4010, 0x4011, 0x4014, 0x4015, 0x4040, 0x4041, 0x4044, - 0x4045, 0x4050, 0x4051, 0x4054, 0x4055, 0x4100, 0x4101, 0x4104, - 0x4105, 0x4110, 0x4111, 0x4114, 0x4115, 0x4140, 0x4141, 0x4144, - 0x4145, 0x4150, 0x4151, 0x4154, 0x4155, 0x4400, 0x4401, 0x4404, - 0x4405, 0x4410, 0x4411, 0x4414, 0x4415, 0x4440, 0x4441, 0x4444, - 0x4445, 0x4450, 0x4451, 0x4454, 0x4455, 0x4500, 0x4501, 0x4504, - 0x4505, 0x4510, 0x4511, 0x4514, 0x4515, 0x4540, 0x4541, 0x4544, - 0x4545, 0x4550, 0x4551, 0x4554, 0x4555, 0x5000, 0x5001, 0x5004, - 0x5005, 0x5010, 0x5011, 0x5014, 0x5015, 0x5040, 0x5041, 0x5044, - 0x5045, 0x5050, 0x5051, 0x5054, 0x5055, 0x5100, 0x5101, 0x5104, - 0x5105, 0x5110, 0x5111, 0x5114, 0x5115, 0x5140, 0x5141, 0x5144, - 0x5145, 0x5150, 0x5151, 0x5154, 0x5155, 0x5400, 0x5401, 0x5404, - 0x5405, 0x5410, 0x5411, 0x5414, 0x5415, 0x5440, 0x5441, 0x5444, - 0x5445, 0x5450, 0x5451, 0x5454, 0x5455, 0x5500, 0x5501, 0x5504, - 0x5505, 0x5510, 0x5511, 0x5514, 0x5515, 0x5540, 0x5541, 0x5544, - 0x5545, 0x5550, 0x5551, 0x5554, 0x5555}; - - // pre-computed Bitmask for fast masking, bitMask[a]=0x1 << a - private static final int[] bitMask = {0x00000001, 0x00000002, 0x00000004, - 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, - 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, - 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, - 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x00000000}; - - // pre-computed Bitmask for fast masking, rightMask[a]=0xffffffff >>> (32-a) - private static final int[] reverseRightMask = {0x00000000, 0x00000001, - 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, - 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, - 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, 0x001fffff, - 0x003fffff, 0x007fffff, 0x00ffffff, 0x01ffffff, 0x03ffffff, - 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, - 0xffffffff}; - - /** - * Creates a new GF2Polynomial of the given length and value zero. - * - * @param length the desired number of bits to store - */ - public GF2Polynomial(int length) - { - int l = length; - if (l < 1) - { - l = 1; - } - blocks = ((l - 1) >> 5) + 1; - value = new int[blocks]; - len = l; - } - - /** - * Creates a new GF2Polynomial of the given length and random value. - * - * @param length the desired number of bits to store - * @param rand SecureRandom to use for randomization - */ - public GF2Polynomial(int length, Random rand) - { - int l = length; - if (l < 1) - { - l = 1; - } - blocks = ((l - 1) >> 5) + 1; - value = new int[blocks]; - len = l; - randomize(rand); - } - - /** - * Creates a new GF2Polynomial of the given length and value - * selected by value: - *

      - *
    • ZERO
    • - *
    • ONE
    • - *
    • RANDOM
    • - *
    • X
    • - *
    • ALL
    • - *
    - * - * @param length the desired number of bits to store - * @param value the value described by a String - */ - public GF2Polynomial(int length, String value) - { - int l = length; - if (l < 1) - { - l = 1; - } - blocks = ((l - 1) >> 5) + 1; - this.value = new int[blocks]; - len = l; - if (value.equalsIgnoreCase("ZERO")) - { - assignZero(); - } - else if (value.equalsIgnoreCase("ONE")) - { - assignOne(); - } - else if (value.equalsIgnoreCase("RANDOM")) - { - randomize(); - } - else if (value.equalsIgnoreCase("X")) - { - assignX(); - } - else if (value.equalsIgnoreCase("ALL")) - { - assignAll(); - } - else - { - throw new IllegalArgumentException( - "Error: GF2Polynomial was called using " + value - + " as value!"); - } - - } - - /** - * Creates a new GF2Polynomial of the given length using the given - * int[]. LSB is contained in bs[0]. - * - * @param length the desired number of bits to store - * @param bs contains the desired value, LSB in bs[0] - */ - public GF2Polynomial(int length, int[] bs) - { - int leng = length; - if (leng < 1) - { - leng = 1; - } - blocks = ((leng - 1) >> 5) + 1; - value = new int[blocks]; - len = leng; - int l = Math.min(blocks, bs.length); - System.arraycopy(bs, 0, value, 0, l); - zeroUnusedBits(); - } - - /** - * Creates a new GF2Polynomial by converting the given byte[] os - * according to 1363 and using the given length. - * - * @param length the intended length of this polynomial - * @param os the octet string to assign to this polynomial - * @see "P1363 5.5.2 p22f, OS2BSP" - */ - public GF2Polynomial(int length, byte[] os) - { - int l = length; - if (l < 1) - { - l = 1; - } - blocks = ((l - 1) >> 5) + 1; - value = new int[blocks]; - len = l; - int i, m; - int k = Math.min(((os.length - 1) >> 2) + 1, blocks); - for (i = 0; i < k - 1; i++) - { - m = os.length - (i << 2) - 1; - value[i] = (os[m]) & 0x000000ff; - value[i] |= (os[m - 1] << 8) & 0x0000ff00; - value[i] |= (os[m - 2] << 16) & 0x00ff0000; - value[i] |= (os[m - 3] << 24) & 0xff000000; - } - i = k - 1; - m = os.length - (i << 2) - 1; - value[i] = os[m] & 0x000000ff; - if (m > 0) - { - value[i] |= (os[m - 1] << 8) & 0x0000ff00; - } - if (m > 1) - { - value[i] |= (os[m - 2] << 16) & 0x00ff0000; - } - if (m > 2) - { - value[i] |= (os[m - 3] << 24) & 0xff000000; - } - zeroUnusedBits(); - reduceN(); - } - - /** - * Creates a new GF2Polynomial by converting the given FlexiBigInt bi - * according to 1363 and using the given length. - * - * @param length the intended length of this polynomial - * @param bi the FlexiBigInt to assign to this polynomial - * @see "P1363 5.5.1 p22, I2BSP" - */ - public GF2Polynomial(int length, BigInteger bi) - { - int l = length; - if (l < 1) - { - l = 1; - } - blocks = ((l - 1) >> 5) + 1; - value = new int[blocks]; - len = l; - int i; - byte[] val = bi.toByteArray(); - if (val[0] == 0) - { - byte[] dummy = new byte[val.length - 1]; - System.arraycopy(val, 1, dummy, 0, dummy.length); - val = dummy; - } - int ov = val.length & 0x03; - int k = ((val.length - 1) >> 2) + 1; - for (i = 0; i < ov; i++) - { - value[k - 1] |= (val[i] & 0x000000ff) << ((ov - 1 - i) << 3); - } - int m = 0; - for (i = 0; i <= (val.length - 4) >> 2; i++) - { - m = val.length - 1 - (i << 2); - value[i] = (val[m]) & 0x000000ff; - value[i] |= ((val[m - 1]) << 8) & 0x0000ff00; - value[i] |= ((val[m - 2]) << 16) & 0x00ff0000; - value[i] |= ((val[m - 3]) << 24) & 0xff000000; - } - if ((len & 0x1f) != 0) - { - value[blocks - 1] &= reverseRightMask[len & 0x1f]; - } - reduceN(); - } - - /** - * Creates a new GF2Polynomial by cloneing the given GF2Polynomial b. - * - * @param b the GF2Polynomial to clone - */ - public GF2Polynomial(GF2Polynomial b) - { - len = b.len; - blocks = b.blocks; - value = IntUtils.clone(b.value); - } - - /** - * @return a copy of this GF2Polynomial - */ - public Object clone() - { - return new GF2Polynomial(this); - } - - /** - * Returns the length of this GF2Polynomial. The length can be greater than - * the degree. To get the degree call reduceN() before calling getLength(). - * - * @return the length of this GF2Polynomial - */ - public int getLength() - { - return len; - } - - /** - * Returns the value of this GF2Polynomial in an int[]. - * - * @return the value of this GF2Polynomial in a new int[], LSB in int[0] - */ - public int[] toIntegerArray() - { - int[] result; - result = new int[blocks]; - System.arraycopy(value, 0, result, 0, blocks); - return result; - } - - /** - * Returns a string representing this GF2Polynomials value using hexadecimal - * or binary radix in MSB-first order. - * - * @param radix the radix to use (2 or 16, otherwise 2 is used) - * @return a String representing this GF2Polynomials value. - */ - public String toString(int radix) - { - final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - final String[] BIN_CHARS = {"0000", "0001", "0010", "0011", "0100", - "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", - "1101", "1110", "1111"}; - String res; - int i; - res = new String(); - if (radix == 16) - { - for (i = blocks - 1; i >= 0; i--) - { - res += HEX_CHARS[(value[i] >>> 28) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 24) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 20) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 16) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 12) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 8) & 0x0f]; - res += HEX_CHARS[(value[i] >>> 4) & 0x0f]; - res += HEX_CHARS[(value[i]) & 0x0f]; - res += " "; - } - } - else - { - for (i = blocks - 1; i >= 0; i--) - { - res += BIN_CHARS[(value[i] >>> 28) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 24) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 20) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 16) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 12) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 8) & 0x0f]; - res += BIN_CHARS[(value[i] >>> 4) & 0x0f]; - res += BIN_CHARS[(value[i]) & 0x0f]; - res += " "; - } - } - return res; - } - - /** - * Converts this polynomial to a byte[] (octet string) according to 1363. - * - * @return a byte[] representing the value of this polynomial - * @see "P1363 5.5.2 p22f, BS2OSP" - */ - public byte[] toByteArray() - { - int k = ((len - 1) >> 3) + 1; - int ov = k & 0x03; - int m; - byte[] res = new byte[k]; - int i; - for (i = 0; i < (k >> 2); i++) - { - m = k - (i << 2) - 1; - res[m] = (byte)((value[i] & 0x000000ff)); - res[m - 1] = (byte)((value[i] & 0x0000ff00) >>> 8); - res[m - 2] = (byte)((value[i] & 0x00ff0000) >>> 16); - res[m - 3] = (byte)((value[i] & 0xff000000) >>> 24); - } - for (i = 0; i < ov; i++) - { - m = (ov - i - 1) << 3; - res[i] = (byte)((value[blocks - 1] & (0x000000ff << m)) >>> m); - } - return res; - } - - /** - * Converts this polynomial to an integer according to 1363. - * - * @return a FlexiBigInt representing the value of this polynomial - * @see "P1363 5.5.1 p22, BS2IP" - */ - public BigInteger toFlexiBigInt() - { - if (len == 0 || isZero()) - { - return new BigInteger(0, new byte[0]); - } - return new BigInteger(1, toByteArray()); - } - - /** - * Sets the LSB to 1 and all other to 0, assigning 'one' to this - * GF2Polynomial. - */ - public void assignOne() - { - int i; - for (i = 1; i < blocks; i++) - { - value[i] = 0x00; - } - value[0] = 0x01; - } - - /** - * Sets Bit 1 to 1 and all other to 0, assigning 'x' to this GF2Polynomial. - */ - public void assignX() - { - int i; - for (i = 1; i < blocks; i++) - { - value[i] = 0x00; - } - value[0] = 0x02; - } - - /** - * Sets all Bits to 1. - */ - public void assignAll() - { - int i; - for (i = 0; i < blocks; i++) - { - value[i] = 0xffffffff; - } - zeroUnusedBits(); - } - - /** - * Resets all bits to zero. - */ - public void assignZero() - { - int i; - for (i = 0; i < blocks; i++) - { - value[i] = 0x00; - } - } - - /** - * Fills all len bits of this GF2Polynomial with random values. - */ - public void randomize() - { - int i; - for (i = 0; i < blocks; i++) - { - value[i] = rand.nextInt(); - } - zeroUnusedBits(); - } - - /** - * Fills all len bits of this GF2Polynomial with random values using the - * specified source of randomness. - * - * @param rand the source of randomness - */ - public void randomize(Random rand) - { - int i; - for (i = 0; i < blocks; i++) - { - value[i] = rand.nextInt(); - } - zeroUnusedBits(); - } - - /** - * Returns true if two GF2Polynomials have the same size and value and thus - * are equal. - * - * @param other the other GF2Polynomial - * @return true if this GF2Polynomial equals b (this == - * b) - */ - public boolean equals(Object other) - { - if (other == null || !(other instanceof GF2Polynomial)) - { - return false; - } - - GF2Polynomial otherPol = (GF2Polynomial)other; - - if (len != otherPol.len) - { - return false; - } - for (int i = 0; i < blocks; i++) - { - if (value[i] != otherPol.value[i]) - { - return false; - } - } - return true; - } - - /** - * @return the hash code of this polynomial - */ - public int hashCode() - { - return len + value.hashCode(); - } - - /** - * Tests if all bits equal zero. - * - * @return true if this GF2Polynomial equals 'zero' (this == 0) - */ - public boolean isZero() - { - int i; - if (len == 0) - { - return true; - } - for (i = 0; i < blocks; i++) - { - if (value[i] != 0) - { - return false; - } - } - return true; - } - - /** - * Tests if all bits are reset to 0 and LSB is set to 1. - * - * @return true if this GF2Polynomial equals 'one' (this == 1) - */ - public boolean isOne() - { - int i; - for (i = 1; i < blocks; i++) - { - if (value[i] != 0) - { - return false; - } - } - if (value[0] != 0x01) - { - return false; - } - return true; - } - - /** - * Adds b to this GF2Polynomial and assigns the result to this - * GF2Polynomial. b can be of different size. - * - * @param b GF2Polynomial to add to this GF2Polynomial - */ - public void addToThis(GF2Polynomial b) - { - expandN(b.len); - xorThisBy(b); - } - - /** - * Adds two GF2Polynomials, this and b, and returns the - * result. this and b can be of different size. - * - * @param b a GF2Polynomial - * @return a new GF2Polynomial (this + b) - */ - public GF2Polynomial add(GF2Polynomial b) - { - return xor(b); - } - - /** - * Subtracts b from this GF2Polynomial and assigns the result to - * this GF2Polynomial. b can be of different size. - * - * @param b a GF2Polynomial - */ - public void subtractFromThis(GF2Polynomial b) - { - expandN(b.len); - xorThisBy(b); - } - - /** - * Subtracts two GF2Polynomials, this and b, and returns the - * result in a new GF2Polynomial. this and b can be of - * different size. - * - * @param b a GF2Polynomial - * @return a new GF2Polynomial (this - b) - */ - public GF2Polynomial subtract(GF2Polynomial b) - { - return xor(b); - } - - /** - * Toggles the LSB of this GF2Polynomial, increasing its value by 'one'. - */ - public void increaseThis() - { - xorBit(0); - } - - /** - * Toggles the LSB of this GF2Polynomial, increasing the value by 'one' and - * returns the result in a new GF2Polynomial. - * - * @return this + 1 - */ - public GF2Polynomial increase() - { - GF2Polynomial result = new GF2Polynomial(this); - result.increaseThis(); - return result; - } - - /** - * Multiplies this GF2Polynomial with b and returns the result in a - * new GF2Polynomial. This method does not reduce the result in GF(2^N). - * This method uses classic multiplication (schoolbook). - * - * @param b a GF2Polynomial - * @return a new GF2Polynomial (this * b) - */ - public GF2Polynomial multiplyClassic(GF2Polynomial b) - { - GF2Polynomial result = new GF2Polynomial(Math.max(len, b.len) << 1); - GF2Polynomial[] m = new GF2Polynomial[32]; - int i, j; - m[0] = new GF2Polynomial(this); - for (i = 1; i <= 31; i++) - { - m[i] = m[i - 1].shiftLeft(); - } - for (i = 0; i < b.blocks; i++) - { - for (j = 0; j <= 31; j++) - { - if ((b.value[i] & bitMask[j]) != 0) - { - result.xorThisBy(m[j]); - } - } - for (j = 0; j <= 31; j++) - { - m[j].shiftBlocksLeft(); - } - } - return result; - } - - /** - * Multiplies this GF2Polynomial with b and returns the result in a - * new GF2Polynomial. This method does not reduce the result in GF(2^N). - * This method uses Karatzuba multiplication. - * - * @param b a GF2Polynomial - * @return a new GF2Polynomial (this * b) - */ - public GF2Polynomial multiply(GF2Polynomial b) - { - int n = Math.max(len, b.len); - expandN(n); - b.expandN(n); - return karaMult(b); - } - - /** - * Does the recursion for Karatzuba multiplication. - */ - private GF2Polynomial karaMult(GF2Polynomial b) - { - GF2Polynomial result = new GF2Polynomial(len << 1); - if (len <= 32) - { - result.value = mult32(value[0], b.value[0]); - return result; - } - if (len <= 64) - { - result.value = mult64(value, b.value); - return result; - } - if (len <= 128) - { - result.value = mult128(value, b.value); - return result; - } - if (len <= 256) - { - result.value = mult256(value, b.value); - return result; - } - if (len <= 512) - { - result.value = mult512(value, b.value); - return result; - } - - int n = IntegerFunctions.floorLog(len - 1); - n = bitMask[n]; - - GF2Polynomial a0 = lower(((n - 1) >> 5) + 1); - GF2Polynomial a1 = upper(((n - 1) >> 5) + 1); - GF2Polynomial b0 = b.lower(((n - 1) >> 5) + 1); - GF2Polynomial b1 = b.upper(((n - 1) >> 5) + 1); - - GF2Polynomial c = a1.karaMult(b1); // c = a1*b1 - GF2Polynomial e = a0.karaMult(b0); // e = a0*b0 - a0.addToThis(a1); // a0 = a0 + a1 - b0.addToThis(b1); // b0 = b0 + b1 - GF2Polynomial d = a0.karaMult(b0); // d = (a0+a1)*(b0+b1) - - result.shiftLeftAddThis(c, n << 1); - result.shiftLeftAddThis(c, n); - result.shiftLeftAddThis(d, n); - result.shiftLeftAddThis(e, n); - result.addToThis(e); - return result; - } - - /** - * 16-Integer Version of Karatzuba multiplication. - */ - private static int[] mult512(int[] a, int[] b) - { - int[] result = new int[32]; - int[] a0 = new int[8]; - System.arraycopy(a, 0, a0, 0, Math.min(8, a.length)); - int[] a1 = new int[8]; - if (a.length > 8) - { - System.arraycopy(a, 8, a1, 0, Math.min(8, a.length - 8)); - } - int[] b0 = new int[8]; - System.arraycopy(b, 0, b0, 0, Math.min(8, b.length)); - int[] b1 = new int[8]; - if (b.length > 8) - { - System.arraycopy(b, 8, b1, 0, Math.min(8, b.length - 8)); - } - int[] c = mult256(a1, b1); - result[31] ^= c[15]; - result[30] ^= c[14]; - result[29] ^= c[13]; - result[28] ^= c[12]; - result[27] ^= c[11]; - result[26] ^= c[10]; - result[25] ^= c[9]; - result[24] ^= c[8]; - result[23] ^= c[7] ^ c[15]; - result[22] ^= c[6] ^ c[14]; - result[21] ^= c[5] ^ c[13]; - result[20] ^= c[4] ^ c[12]; - result[19] ^= c[3] ^ c[11]; - result[18] ^= c[2] ^ c[10]; - result[17] ^= c[1] ^ c[9]; - result[16] ^= c[0] ^ c[8]; - result[15] ^= c[7]; - result[14] ^= c[6]; - result[13] ^= c[5]; - result[12] ^= c[4]; - result[11] ^= c[3]; - result[10] ^= c[2]; - result[9] ^= c[1]; - result[8] ^= c[0]; - a1[0] ^= a0[0]; - a1[1] ^= a0[1]; - a1[2] ^= a0[2]; - a1[3] ^= a0[3]; - a1[4] ^= a0[4]; - a1[5] ^= a0[5]; - a1[6] ^= a0[6]; - a1[7] ^= a0[7]; - b1[0] ^= b0[0]; - b1[1] ^= b0[1]; - b1[2] ^= b0[2]; - b1[3] ^= b0[3]; - b1[4] ^= b0[4]; - b1[5] ^= b0[5]; - b1[6] ^= b0[6]; - b1[7] ^= b0[7]; - int[] d = mult256(a1, b1); - result[23] ^= d[15]; - result[22] ^= d[14]; - result[21] ^= d[13]; - result[20] ^= d[12]; - result[19] ^= d[11]; - result[18] ^= d[10]; - result[17] ^= d[9]; - result[16] ^= d[8]; - result[15] ^= d[7]; - result[14] ^= d[6]; - result[13] ^= d[5]; - result[12] ^= d[4]; - result[11] ^= d[3]; - result[10] ^= d[2]; - result[9] ^= d[1]; - result[8] ^= d[0]; - int[] e = mult256(a0, b0); - result[23] ^= e[15]; - result[22] ^= e[14]; - result[21] ^= e[13]; - result[20] ^= e[12]; - result[19] ^= e[11]; - result[18] ^= e[10]; - result[17] ^= e[9]; - result[16] ^= e[8]; - result[15] ^= e[7] ^ e[15]; - result[14] ^= e[6] ^ e[14]; - result[13] ^= e[5] ^ e[13]; - result[12] ^= e[4] ^ e[12]; - result[11] ^= e[3] ^ e[11]; - result[10] ^= e[2] ^ e[10]; - result[9] ^= e[1] ^ e[9]; - result[8] ^= e[0] ^ e[8]; - result[7] ^= e[7]; - result[6] ^= e[6]; - result[5] ^= e[5]; - result[4] ^= e[4]; - result[3] ^= e[3]; - result[2] ^= e[2]; - result[1] ^= e[1]; - result[0] ^= e[0]; - return result; - } - - /** - * 8-Integer Version of Karatzuba multiplication. - */ - private static int[] mult256(int[] a, int[] b) - { - int[] result = new int[16]; - int[] a0 = new int[4]; - System.arraycopy(a, 0, a0, 0, Math.min(4, a.length)); - int[] a1 = new int[4]; - if (a.length > 4) - { - System.arraycopy(a, 4, a1, 0, Math.min(4, a.length - 4)); - } - int[] b0 = new int[4]; - System.arraycopy(b, 0, b0, 0, Math.min(4, b.length)); - int[] b1 = new int[4]; - if (b.length > 4) - { - System.arraycopy(b, 4, b1, 0, Math.min(4, b.length - 4)); - } - if (a1[3] == 0 && a1[2] == 0 && b1[3] == 0 && b1[2] == 0) - { - if (a1[1] == 0 && b1[1] == 0) - { - if (a1[0] != 0 || b1[0] != 0) - { // [3]=[2]=[1]=0, [0]!=0 - int[] c = mult32(a1[0], b1[0]); - result[9] ^= c[1]; - result[8] ^= c[0]; - result[5] ^= c[1]; - result[4] ^= c[0]; - } - } - else - { // [3]=[2]=0 [1]!=0, [0]!=0 - int[] c = mult64(a1, b1); - result[11] ^= c[3]; - result[10] ^= c[2]; - result[9] ^= c[1]; - result[8] ^= c[0]; - result[7] ^= c[3]; - result[6] ^= c[2]; - result[5] ^= c[1]; - result[4] ^= c[0]; - } - } - else - { // [3]!=0 [2]!=0 [1]!=0, [0]!=0 - int[] c = mult128(a1, b1); - result[15] ^= c[7]; - result[14] ^= c[6]; - result[13] ^= c[5]; - result[12] ^= c[4]; - result[11] ^= c[3] ^ c[7]; - result[10] ^= c[2] ^ c[6]; - result[9] ^= c[1] ^ c[5]; - result[8] ^= c[0] ^ c[4]; - result[7] ^= c[3]; - result[6] ^= c[2]; - result[5] ^= c[1]; - result[4] ^= c[0]; - } - a1[0] ^= a0[0]; - a1[1] ^= a0[1]; - a1[2] ^= a0[2]; - a1[3] ^= a0[3]; - b1[0] ^= b0[0]; - b1[1] ^= b0[1]; - b1[2] ^= b0[2]; - b1[3] ^= b0[3]; - int[] d = mult128(a1, b1); - result[11] ^= d[7]; - result[10] ^= d[6]; - result[9] ^= d[5]; - result[8] ^= d[4]; - result[7] ^= d[3]; - result[6] ^= d[2]; - result[5] ^= d[1]; - result[4] ^= d[0]; - int[] e = mult128(a0, b0); - result[11] ^= e[7]; - result[10] ^= e[6]; - result[9] ^= e[5]; - result[8] ^= e[4]; - result[7] ^= e[3] ^ e[7]; - result[6] ^= e[2] ^ e[6]; - result[5] ^= e[1] ^ e[5]; - result[4] ^= e[0] ^ e[4]; - result[3] ^= e[3]; - result[2] ^= e[2]; - result[1] ^= e[1]; - result[0] ^= e[0]; - return result; - } - - /** - * 4-Integer Version of Karatzuba multiplication. - */ - private static int[] mult128(int[] a, int[] b) - { - int[] result = new int[8]; - int[] a0 = new int[2]; - System.arraycopy(a, 0, a0, 0, Math.min(2, a.length)); - int[] a1 = new int[2]; - if (a.length > 2) - { - System.arraycopy(a, 2, a1, 0, Math.min(2, a.length - 2)); - } - int[] b0 = new int[2]; - System.arraycopy(b, 0, b0, 0, Math.min(2, b.length)); - int[] b1 = new int[2]; - if (b.length > 2) - { - System.arraycopy(b, 2, b1, 0, Math.min(2, b.length - 2)); - } - if (a1[1] == 0 && b1[1] == 0) - { - if (a1[0] != 0 || b1[0] != 0) - { - int[] c = mult32(a1[0], b1[0]); - result[5] ^= c[1]; - result[4] ^= c[0]; - result[3] ^= c[1]; - result[2] ^= c[0]; - } - } - else - { - int[] c = mult64(a1, b1); - result[7] ^= c[3]; - result[6] ^= c[2]; - result[5] ^= c[1] ^ c[3]; - result[4] ^= c[0] ^ c[2]; - result[3] ^= c[1]; - result[2] ^= c[0]; - } - a1[0] ^= a0[0]; - a1[1] ^= a0[1]; - b1[0] ^= b0[0]; - b1[1] ^= b0[1]; - if (a1[1] == 0 && b1[1] == 0) - { - int[] d = mult32(a1[0], b1[0]); - result[3] ^= d[1]; - result[2] ^= d[0]; - } - else - { - int[] d = mult64(a1, b1); - result[5] ^= d[3]; - result[4] ^= d[2]; - result[3] ^= d[1]; - result[2] ^= d[0]; - } - if (a0[1] == 0 && b0[1] == 0) - { - int[] e = mult32(a0[0], b0[0]); - result[3] ^= e[1]; - result[2] ^= e[0]; - result[1] ^= e[1]; - result[0] ^= e[0]; - } - else - { - int[] e = mult64(a0, b0); - result[5] ^= e[3]; - result[4] ^= e[2]; - result[3] ^= e[1] ^ e[3]; - result[2] ^= e[0] ^ e[2]; - result[1] ^= e[1]; - result[0] ^= e[0]; - } - return result; - } - - /** - * 2-Integer Version of Karatzuba multiplication. - */ - private static int[] mult64(int[] a, int[] b) - { - int[] result = new int[4]; - int a0 = a[0]; - int a1 = 0; - if (a.length > 1) - { - a1 = a[1]; - } - int b0 = b[0]; - int b1 = 0; - if (b.length > 1) - { - b1 = b[1]; - } - if (a1 != 0 || b1 != 0) - { - int[] c = mult32(a1, b1); - result[3] ^= c[1]; - result[2] ^= c[0] ^ c[1]; - result[1] ^= c[0]; - } - int[] d = mult32(a0 ^ a1, b0 ^ b1); - result[2] ^= d[1]; - result[1] ^= d[0]; - int[] e = mult32(a0, b0); - result[2] ^= e[1]; - result[1] ^= e[0] ^ e[1]; - result[0] ^= e[0]; - return result; - } - - /** - * 4-Byte Version of Karatzuba multiplication. Here the actual work is done. - */ - private static int[] mult32(int a, int b) - { - int[] result = new int[2]; - if (a == 0 || b == 0) - { - return result; - } - long b2 = b; - b2 &= 0x00000000ffffffffL; - int i; - long h = 0; - for (i = 1; i <= 32; i++) - { - if ((a & bitMask[i - 1]) != 0) - { - h ^= b2; - } - b2 <<= 1; - } - result[1] = (int)(h >>> 32); - result[0] = (int)(h & 0x00000000ffffffffL); - return result; - } - - /** - * Returns a new GF2Polynomial containing the upper k bytes of this - * GF2Polynomial. - * - * @param k - * @return a new GF2Polynomial containing the upper k bytes of this - * GF2Polynomial - * @see GF2Polynomial#karaMult - */ - private GF2Polynomial upper(int k) - { - int j = Math.min(k, blocks - k); - GF2Polynomial result = new GF2Polynomial(j << 5); - if (blocks >= k) - { - System.arraycopy(value, k, result.value, 0, j); - } - return result; - } - - /** - * Returns a new GF2Polynomial containing the lower k bytes of this - * GF2Polynomial. - * - * @param k - * @return a new GF2Polynomial containing the lower k bytes of this - * GF2Polynomial - * @see GF2Polynomial#karaMult - */ - private GF2Polynomial lower(int k) - { - GF2Polynomial result = new GF2Polynomial(k << 5); - System.arraycopy(value, 0, result.value, 0, Math.min(k, blocks)); - return result; - } - - /** - * Returns the remainder of this divided by g in a new - * GF2Polynomial. - * - * @param g GF2Polynomial != 0 - * @return a new GF2Polynomial (this % g) - * @throws PolynomialIsZeroException if g equals zero - */ - public GF2Polynomial remainder(GF2Polynomial g) - throws RuntimeException - { - /* a div b = q / r */ - GF2Polynomial a = new GF2Polynomial(this); - GF2Polynomial b = new GF2Polynomial(g); - GF2Polynomial j; - int i; - if (b.isZero()) - { - throw new RuntimeException(); - } - a.reduceN(); - b.reduceN(); - if (a.len < b.len) - { - return a; - } - i = a.len - b.len; - while (i >= 0) - { - j = b.shiftLeft(i); - a.subtractFromThis(j); - a.reduceN(); - i = a.len - b.len; - } - return a; - } - - /** - * Returns the absolute quotient of this divided by g in a - * new GF2Polynomial. - * - * @param g GF2Polynomial != 0 - * @return a new GF2Polynomial |_ this / g _| - * @throws PolynomialIsZeroException if g equals zero - */ - public GF2Polynomial quotient(GF2Polynomial g) - throws RuntimeException - { - /* a div b = q / r */ - GF2Polynomial q = new GF2Polynomial(len); - GF2Polynomial a = new GF2Polynomial(this); - GF2Polynomial b = new GF2Polynomial(g); - GF2Polynomial j; - int i; - if (b.isZero()) - { - throw new RuntimeException(); - } - a.reduceN(); - b.reduceN(); - if (a.len < b.len) - { - return new GF2Polynomial(0); - } - i = a.len - b.len; - q.expandN(i + 1); - - while (i >= 0) - { - j = b.shiftLeft(i); - a.subtractFromThis(j); - a.reduceN(); - q.xorBit(i); - i = a.len - b.len; - } - - return q; - } - - /** - * Divides this by g and returns the quotient and remainder - * in a new GF2Polynomial[2], quotient in [0], remainder in [1]. - * - * @param g GF2Polynomial != 0 - * @return a new GF2Polynomial[2] containing quotient and remainder - * @throws PolynomialIsZeroException if g equals zero - */ - public GF2Polynomial[] divide(GF2Polynomial g) - throws RuntimeException - { - /* a div b = q / r */ - GF2Polynomial[] result = new GF2Polynomial[2]; - GF2Polynomial q = new GF2Polynomial(len); - GF2Polynomial a = new GF2Polynomial(this); - GF2Polynomial b = new GF2Polynomial(g); - GF2Polynomial j; - int i; - if (b.isZero()) - { - throw new RuntimeException(); - } - a.reduceN(); - b.reduceN(); - if (a.len < b.len) - { - result[0] = new GF2Polynomial(0); - result[1] = a; - return result; - } - i = a.len - b.len; - q.expandN(i + 1); - - while (i >= 0) - { - j = b.shiftLeft(i); - a.subtractFromThis(j); - a.reduceN(); - q.xorBit(i); - i = a.len - b.len; - } - - result[0] = q; - result[1] = a; - return result; - } - - /** - * Returns the greatest common divisor of this and g in a - * new GF2Polynomial. - * - * @param g GF2Polynomial != 0 - * @return a new GF2Polynomial gcd(this,g) - * @throws ArithmeticException if this and g both are equal to zero - * @throws PolynomialIsZeroException to be API-compliant (should never be thrown). - */ - public GF2Polynomial gcd(GF2Polynomial g) - throws RuntimeException - { - if (isZero() && g.isZero()) - { - throw new ArithmeticException("Both operands of gcd equal zero."); - } - if (isZero()) - { - return new GF2Polynomial(g); - } - if (g.isZero()) - { - return new GF2Polynomial(this); - } - GF2Polynomial a = new GF2Polynomial(this); - GF2Polynomial b = new GF2Polynomial(g); - GF2Polynomial c; - - while (!b.isZero()) - { - c = a.remainder(b); - a = b; - b = c; - } - - return a; - } - - /** - * Checks if this is irreducible, according to IEEE P1363, A.5.5, - * p103.
    - * Note: The algorithm from IEEE P1363, A5.5 can be used to check a - * polynomial with coefficients in GF(2^r) for irreducibility. As this class - * only represents polynomials with coefficients in GF(2), the algorithm is - * adapted to the case r=1. - * - * @return true if this is irreducible - * @see "P1363, A.5.5, p103" - */ - public boolean isIrreducible() - { - if (isZero()) - { - return false; - } - GF2Polynomial f = new GF2Polynomial(this); - int d, i; - GF2Polynomial u, g; - GF2Polynomial dummy; - f.reduceN(); - d = f.len - 1; - u = new GF2Polynomial(f.len, "X"); - - for (i = 1; i <= (d >> 1); i++) - { - u.squareThisPreCalc(); - u = u.remainder(f); - dummy = u.add(new GF2Polynomial(32, "X")); - if (!dummy.isZero()) - { - g = f.gcd(dummy); - if (!g.isOne()) - { - return false; - } - } - else - { - return false; - } - } - - return true; - } - - /** - * Reduces this GF2Polynomial using the trinomial x^m + x^tc + - * 1. - * - * @param m the degree of the used field - * @param tc degree of the middle x in the trinomial - */ - void reduceTrinomial(int m, int tc) - { - int i; - int p0, p1; - int q0, q1; - long t; - p0 = m >>> 5; // block which contains 2^m - q0 = 32 - (m & 0x1f); // (32-index) of 2^m within block p0 - p1 = (m - tc) >>> 5; // block which contains 2^tc - q1 = 32 - ((m - tc) & 0x1f); // (32-index) of 2^tc within block q1 - int max = ((m << 1) - 2) >>> 5; // block which contains 2^(2m-2) - int min = p0; // block which contains 2^m - for (i = max; i > min; i--) - { // for i = maxBlock to minBlock - // reduce coefficients contained in t - // t = block[i] - t = value[i] & 0x00000000ffffffffL; - // block[i-p0-1] ^= t << q0 - value[i - p0 - 1] ^= (int)(t << q0); - // block[i-p0] ^= t >>> (32-q0) - value[i - p0] ^= t >>> (32 - q0); - // block[i-p1-1] ^= << q1 - value[i - p1 - 1] ^= (int)(t << q1); - // block[i-p1] ^= t >>> (32-q1) - value[i - p1] ^= t >>> (32 - q1); - value[i] = 0x00; - } - // reduce last coefficients in block containing 2^m - t = value[min] & 0x00000000ffffffffL & (0xffffffffL << (m & 0x1f)); // t - // contains the last coefficients > m - value[0] ^= t >>> (32 - q0); - if (min - p1 - 1 >= 0) - { - value[min - p1 - 1] ^= (int)(t << q1); - } - value[min - p1] ^= t >>> (32 - q1); - - value[min] &= reverseRightMask[m & 0x1f]; - blocks = ((m - 1) >>> 5) + 1; - len = m; - } - - /** - * Reduces this GF2Polynomial using the pentanomial x^m + x^pc[2] + - * x^pc[1] + x^pc[0] + 1. - * - * @param m the degree of the used field - * @param pc degrees of the middle x's in the pentanomial - */ - void reducePentanomial(int m, int[] pc) - { - int i; - int p0, p1, p2, p3; - int q0, q1, q2, q3; - long t; - p0 = m >>> 5; - q0 = 32 - (m & 0x1f); - p1 = (m - pc[0]) >>> 5; - q1 = 32 - ((m - pc[0]) & 0x1f); - p2 = (m - pc[1]) >>> 5; - q2 = 32 - ((m - pc[1]) & 0x1f); - p3 = (m - pc[2]) >>> 5; - q3 = 32 - ((m - pc[2]) & 0x1f); - int max = ((m << 1) - 2) >>> 5; - int min = p0; - for (i = max; i > min; i--) - { - t = value[i] & 0x00000000ffffffffL; - value[i - p0 - 1] ^= (int)(t << q0); - value[i - p0] ^= t >>> (32 - q0); - value[i - p1 - 1] ^= (int)(t << q1); - value[i - p1] ^= t >>> (32 - q1); - value[i - p2 - 1] ^= (int)(t << q2); - value[i - p2] ^= t >>> (32 - q2); - value[i - p3 - 1] ^= (int)(t << q3); - value[i - p3] ^= t >>> (32 - q3); - value[i] = 0; - } - t = value[min] & 0x00000000ffffffffL & (0xffffffffL << (m & 0x1f)); - value[0] ^= t >>> (32 - q0); - if (min - p1 - 1 >= 0) - { - value[min - p1 - 1] ^= (int)(t << q1); - } - value[min - p1] ^= t >>> (32 - q1); - if (min - p2 - 1 >= 0) - { - value[min - p2 - 1] ^= (int)(t << q2); - } - value[min - p2] ^= t >>> (32 - q2); - if (min - p3 - 1 >= 0) - { - value[min - p3 - 1] ^= (int)(t << q3); - } - value[min - p3] ^= t >>> (32 - q3); - value[min] &= reverseRightMask[m & 0x1f]; - - blocks = ((m - 1) >>> 5) + 1; - len = m; - } - - /** - * Reduces len by finding the most significant bit set to one and reducing - * len and blocks. - */ - public void reduceN() - { - int i, j, h; - i = blocks - 1; - while ((value[i] == 0) && (i > 0)) - { - i--; - } - h = value[i]; - j = 0; - while (h != 0) - { - h >>>= 1; - j++; - } - len = (i << 5) + j; - blocks = i + 1; - } - - /** - * Expands len and int[] value to i. This is useful before adding - * two GF2Polynomials of different size. - * - * @param i the intended length - */ - public void expandN(int i) - { - int k; - int[] bs; - if (len >= i) - { - return; - } - len = i; - k = ((i - 1) >>> 5) + 1; - if (blocks >= k) - { - return; - } - if (value.length >= k) - { - int j; - for (j = blocks; j < k; j++) - { - value[j] = 0; - } - blocks = k; - return; - } - bs = new int[k]; - System.arraycopy(value, 0, bs, 0, blocks); - blocks = k; - value = null; - value = bs; - } - - /** - * Squares this GF2Polynomial and expands it accordingly. This method does - * not reduce the result in GF(2^N). There exists a faster method for - * squaring in GF(2^N). - * - * @see GF2nPolynomialElement#square - */ - public void squareThisBitwise() - { - int i, h, j, k; - if (isZero()) - { - return; - } - int[] result = new int[blocks << 1]; - for (i = blocks - 1; i >= 0; i--) - { - h = value[i]; - j = 0x00000001; - for (k = 0; k < 16; k++) - { - if ((h & 0x01) != 0) - { - result[i << 1] |= j; - } - if ((h & 0x00010000) != 0) - { - result[(i << 1) + 1] |= j; - } - j <<= 2; - h >>>= 1; - } - } - value = null; - value = result; - blocks = result.length; - len = (len << 1) - 1; - } - - /** - * Squares this GF2Polynomial by using precomputed values of squaringTable. - * This method does not reduce the result in GF(2^N). - */ - public void squareThisPreCalc() - { - int i; - if (isZero()) - { - return; - } - if (value.length >= (blocks << 1)) - { - for (i = blocks - 1; i >= 0; i--) - { - value[(i << 1) + 1] = GF2Polynomial.squaringTable[(value[i] & 0x00ff0000) >>> 16] - | (GF2Polynomial.squaringTable[(value[i] & 0xff000000) >>> 24] << 16); - value[i << 1] = GF2Polynomial.squaringTable[value[i] & 0x000000ff] - | (GF2Polynomial.squaringTable[(value[i] & 0x0000ff00) >>> 8] << 16); - } - blocks <<= 1; - len = (len << 1) - 1; - } - else - { - int[] result = new int[blocks << 1]; - for (i = 0; i < blocks; i++) - { - result[i << 1] = GF2Polynomial.squaringTable[value[i] & 0x000000ff] - | (GF2Polynomial.squaringTable[(value[i] & 0x0000ff00) >>> 8] << 16); - result[(i << 1) + 1] = GF2Polynomial.squaringTable[(value[i] & 0x00ff0000) >>> 16] - | (GF2Polynomial.squaringTable[(value[i] & 0xff000000) >>> 24] << 16); - } - value = null; - value = result; - blocks <<= 1; - len = (len << 1) - 1; - } - } - - /** - * Does a vector-multiplication modulo 2 and returns the result as boolean. - * - * @param b GF2Polynomial - * @return this x b as boolean (1->true, 0->false) - * @throws PolynomialsHaveDifferentLengthException if this and b have a different length and - * thus cannot be vector-multiplied - */ - public boolean vectorMult(GF2Polynomial b) - throws RuntimeException - { - int i; - int h; - boolean result = false; - if (len != b.len) - { - throw new RuntimeException(); - } - for (i = 0; i < blocks; i++) - { - h = value[i] & b.value[i]; - result ^= parity[h & 0x000000ff]; - result ^= parity[(h >>> 8) & 0x000000ff]; - result ^= parity[(h >>> 16) & 0x000000ff]; - result ^= parity[(h >>> 24) & 0x000000ff]; - } - return result; - } - - /** - * Returns the bitwise exclusive-or of this and b in a new - * GF2Polynomial. this and b can be of different size. - * - * @param b GF2Polynomial - * @return a new GF2Polynomial (this ^ b) - */ - public GF2Polynomial xor(GF2Polynomial b) - { - int i; - GF2Polynomial result; - int k = Math.min(blocks, b.blocks); - if (len >= b.len) - { - result = new GF2Polynomial(this); - for (i = 0; i < k; i++) - { - result.value[i] ^= b.value[i]; - } - } - else - { - result = new GF2Polynomial(b); - for (i = 0; i < k; i++) - { - result.value[i] ^= value[i]; - } - } - // If we xor'ed some bits too many by proceeding blockwise, - // restore them to zero: - result.zeroUnusedBits(); - return result; - } - - /** - * Computes the bitwise exclusive-or of this GF2Polynomial and b and - * stores the result in this GF2Polynomial. b can be of different - * size. - * - * @param b GF2Polynomial - */ - public void xorThisBy(GF2Polynomial b) - { - int i; - for (i = 0; i < Math.min(blocks, b.blocks); i++) - { - value[i] ^= b.value[i]; - } - // If we xor'ed some bits too many by proceeding blockwise, - // restore them to zero: - zeroUnusedBits(); - } - - /** - * If {@link #len} is not a multiple of the block size (32), some extra bits - * of the last block might have been modified during a blockwise operation. - * This method compensates for that by restoring these "extra" bits to zero. - */ - private void zeroUnusedBits() - { - if ((len & 0x1f) != 0) - { - value[blocks - 1] &= reverseRightMask[len & 0x1f]; - } - } - - /** - * Sets the bit at position i. - * - * @param i int - * @throws BitDoesNotExistException if (i < 0) || (i > (len - 1)) - */ - public void setBit(int i) - throws RuntimeException - { - if (i < 0 || i > (len - 1)) - { - throw new RuntimeException(); - } - if (i > (len - 1)) - { - return; - } - value[i >>> 5] |= bitMask[i & 0x1f]; - return; - } - - /** - * Returns the bit at position i. - * - * @param i int - * @return the bit at position i if i is a valid position, 0 - * otherwise. - */ - public int getBit(int i) - { - if (i < 0 || i > (len - 1)) - { - return 0; - } - return ((value[i >>> 5] & bitMask[i & 0x1f]) != 0) ? 1 : 0; - } - - /** - * Resets the bit at position i. - * - * @param i int - * @throws BitDoesNotExistException if (i < 0) || (i > (len - 1)) - */ - public void resetBit(int i) - throws RuntimeException - { - if (i < 0 || i > (len - 1)) - { - throw new RuntimeException(); - } - if (i > (len - 1)) - { - return; - } - value[i >>> 5] &= ~bitMask[i & 0x1f]; - } - - /** - * Xors the bit at position i. - * - * @param i int - * @throws BitDoesNotExistException if (i < 0) || (i > (len - 1)) - */ - public void xorBit(int i) - throws RuntimeException - { - if (i < 0 || i > (len - 1)) - { - throw new RuntimeException(); - } - if (i > (len - 1)) - { - return; - } - value[i >>> 5] ^= bitMask[i & 0x1f]; - } - - /** - * Tests the bit at position i. - * - * @param i the position of the bit to be tested - * @return true if the bit at position i is set (a(i) == - * 1). False if (i < 0) || (i > (len - 1)) - */ - public boolean testBit(int i) - { - if (i < 0 || i > (len - 1)) - { - return false; - } - return (value[i >>> 5] & bitMask[i & 0x1f]) != 0; - } - - /** - * Returns this GF2Polynomial shift-left by 1 in a new GF2Polynomial. - * - * @return a new GF2Polynomial (this << 1) - */ - public GF2Polynomial shiftLeft() - { - GF2Polynomial result = new GF2Polynomial(len + 1, value); - int i; - for (i = result.blocks - 1; i >= 1; i--) - { - result.value[i] <<= 1; - result.value[i] |= result.value[i - 1] >>> 31; - } - result.value[0] <<= 1; - return result; - } - - /** - * Shifts-left this by one and enlarges the size of value if necesary. - */ - public void shiftLeftThis() - { - /** @todo This is untested. */ - int i; - if ((len & 0x1f) == 0) - { // check if blocks increases - len += 1; - blocks += 1; - if (blocks > value.length) - { // enlarge value - int[] bs = new int[blocks]; - System.arraycopy(value, 0, bs, 0, value.length); - value = null; - value = bs; - } - for (i = blocks - 1; i >= 1; i--) - { - value[i] |= value[i - 1] >>> 31; - value[i - 1] <<= 1; - } - } - else - { - len += 1; - for (i = blocks - 1; i >= 1; i--) - { - value[i] <<= 1; - value[i] |= value[i - 1] >>> 31; - } - value[0] <<= 1; - } - } - - /** - * Returns this GF2Polynomial shift-left by k in a new - * GF2Polynomial. - * - * @param k int - * @return a new GF2Polynomial (this << k) - */ - public GF2Polynomial shiftLeft(int k) - { - // Variant 2, requiring a modified shiftBlocksLeft(k) - // In case of modification, consider a rename to doShiftBlocksLeft() - // with an explicit note that this method assumes that the polynomial - // has already been resized. Or consider doing things inline. - // Construct the resulting polynomial of appropriate length: - GF2Polynomial result = new GF2Polynomial(len + k, value); - // Shift left as many multiples of the block size as possible: - if (k >= 32) - { - result.doShiftBlocksLeft(k >>> 5); - } - // Shift left by the remaining (<32) amount: - final int remaining = k & 0x1f; - if (remaining != 0) - { - for (int i = result.blocks - 1; i >= 1; i--) - { - result.value[i] <<= remaining; - result.value[i] |= result.value[i - 1] >>> (32 - remaining); - } - result.value[0] <<= remaining; - } - return result; - } - - /** - * Shifts left b and adds the result to Its a fast version of - * this = add(b.shl(k)); - * - * @param b GF2Polynomial to shift and add to this - * @param k the amount to shift - * @see GF2nPolynomialElement#invertEEA - */ - public void shiftLeftAddThis(GF2Polynomial b, int k) - { - if (k == 0) - { - addToThis(b); - return; - } - int i; - expandN(b.len + k); - int d = k >>> 5; - for (i = b.blocks - 1; i >= 0; i--) - { - if ((i + d + 1 < blocks) && ((k & 0x1f) != 0)) - { - value[i + d + 1] ^= b.value[i] >>> (32 - (k & 0x1f)); - } - value[i + d] ^= b.value[i] << (k & 0x1f); - } - } - - /** - * Shifts-left this GF2Polynomial's value blockwise 1 block resulting in a - * shift-left by 32. - * - * @see GF2Polynomial#multiply - */ - void shiftBlocksLeft() - { - blocks += 1; - len += 32; - if (blocks <= value.length) - { - int i; - for (i = blocks - 1; i >= 1; i--) - { - value[i] = value[i - 1]; - } - value[0] = 0x00; - } - else - { - int[] result = new int[blocks]; - System.arraycopy(value, 0, result, 1, blocks - 1); - value = null; - value = result; - } - } - - /** - * Shifts left this GF2Polynomial's value blockwise b blocks - * resulting in a shift-left by b*32. This method assumes that {@link #len} - * and {@link #blocks} have already been updated to reflect the final state. - * - * @param b shift amount (in blocks) - */ - private void doShiftBlocksLeft(int b) - { - if (blocks <= value.length) - { - int i; - for (i = blocks - 1; i >= b; i--) - { - value[i] = value[i - b]; - } - for (i = 0; i < b; i++) - { - value[i] = 0x00; - } - } - else - { - int[] result = new int[blocks]; - System.arraycopy(value, 0, result, b, blocks - b); - value = null; - value = result; - } - } - - /** - * Returns this GF2Polynomial shift-right by 1 in a new GF2Polynomial. - * - * @return a new GF2Polynomial (this << 1) - */ - public GF2Polynomial shiftRight() - { - GF2Polynomial result = new GF2Polynomial(len - 1); - int i; - System.arraycopy(value, 0, result.value, 0, result.blocks); - for (i = 0; i <= result.blocks - 2; i++) - { - result.value[i] >>>= 1; - result.value[i] |= result.value[i + 1] << 31; - } - result.value[result.blocks - 1] >>>= 1; - if (result.blocks < blocks) - { - result.value[result.blocks - 1] |= value[result.blocks] << 31; - } - return result; - } - - /** - * Shifts-right this GF2Polynomial by 1. - */ - public void shiftRightThis() - { - int i; - len -= 1; - blocks = ((len - 1) >>> 5) + 1; - for (i = 0; i <= blocks - 2; i++) - { - value[i] >>>= 1; - value[i] |= value[i + 1] << 31; - } - value[blocks - 1] >>>= 1; - if ((len & 0x1f) == 0) - { - value[blocks - 1] |= value[blocks] << 31; - } - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Vector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Vector.java deleted file mode 100644 index c6323b2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2Vector.java +++ /dev/null @@ -1,539 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class implements the abstract class Vector for the case of - * vectors over the finite field GF(2).
    - * For the vector representation the array of type int[] is used, thus one - * element of the array holds 32 elements of the vector. - * - * @see Vector - */ -public class GF2Vector - extends Vector -{ - - /** - * holds the elements of this vector - */ - private int[] v; - - /** - * Construct the zero vector of the given length. - * - * @param length the length of the vector - */ - public GF2Vector(int length) - { - if (length < 0) - { - throw new ArithmeticException("Negative length."); - } - this.length = length; - v = new int[(length + 31) >> 5]; - } - - /** - * Construct a random GF2Vector of the given length. - * - * @param length the length of the vector - * @param sr the source of randomness - */ - public GF2Vector(int length, SecureRandom sr) - { - this.length = length; - - int size = (length + 31) >> 5; - v = new int[size]; - - // generate random elements - for (int i = size - 1; i >= 0; i--) - { - v[i] = sr.nextInt(); - } - - // erase unused bits - int r = length & 0x1f; - if (r != 0) - { - // erase unused bits - v[size - 1] &= (1 << r) - 1; - } - } - - /** - * Construct a random GF2Vector of the given length with the specified - * number of non-zero coefficients. - * - * @param length the length of the vector - * @param t the number of non-zero coefficients - * @param sr the source of randomness - */ - public GF2Vector(int length, int t, SecureRandom sr) - { - if (t > length) - { - throw new ArithmeticException( - "The hamming weight is greater than the length of vector."); - } - this.length = length; - - int size = (length + 31) >> 5; - v = new int[size]; - - int[] help = new int[length]; - for (int i = 0; i < length; i++) - { - help[i] = i; - } - - int m = length; - for (int i = 0; i < t; i++) - { - int j = RandUtils.nextInt(sr, m); - setBit(help[j]); - m--; - help[j] = help[m]; - } - } - - /** - * Construct a GF2Vector of the given length and with elements from the - * given array. The array is copied and unused bits are masked out. - * - * @param length the length of the vector - * @param v the element array - */ - public GF2Vector(int length, int[] v) - { - if (length < 0) - { - throw new ArithmeticException("negative length"); - } - this.length = length; - - int size = (length + 31) >> 5; - - if (v.length != size) - { - throw new ArithmeticException("length mismatch"); - } - - this.v = IntUtils.clone(v); - - int r = length & 0x1f; - if (r != 0) - { - // erase unused bits - this.v[size - 1] &= (1 << r) - 1; - } - } - - /** - * Copy constructor. - * - * @param other another {@link GF2Vector} - */ - public GF2Vector(GF2Vector other) - { - this.length = other.length; - this.v = IntUtils.clone(other.v); - } - - /** - * Construct a new {@link GF2Vector} of the given length and with the given - * element array. The array is not changed and only a reference to the array - * is stored. No length checking is performed either. - * - * @param v the element array - * @param length the length of the vector - */ - protected GF2Vector(int[] v, int length) - { - this.v = v; - this.length = length; - } - - /** - * Construct a new GF2Vector with the given length out of the encoded - * vector. - * - * @param length the length of the vector - * @param encVec the encoded vector - * @return the decoded vector - */ - public static GF2Vector OS2VP(int length, byte[] encVec) - { - if (length < 0) - { - throw new ArithmeticException("negative length"); - } - - int byteLen = (length + 7) >> 3; - - if (encVec.length > byteLen) - { - throw new ArithmeticException("length mismatch"); - } - - return new GF2Vector(length, LittleEndianConversions.toIntArray(encVec)); - } - - /** - * Encode this vector as byte array. - * - * @return the encoded vector - */ - public byte[] getEncoded() - { - int byteLen = (length + 7) >> 3; - return LittleEndianConversions.toByteArray(v, byteLen); - } - - /** - * @return the int array representation of this vector - */ - public int[] getVecArray() - { - return v; - } - - /** - * Return the Hamming weight of this vector, i.e., compute the number of - * units of this vector. - * - * @return the Hamming weight of this vector - */ - public int getHammingWeight() - { - int weight = 0; - for (int i = 0; i < v.length; i++) - { - int e = v[i]; - for (int j = 0; j < 32; j++) - { - int b = e & 1; - if (b != 0) - { - weight++; - } - e >>>= 1; - } - } - return weight; - } - - /** - * @return whether this is the zero vector (i.e., all elements are zero) - */ - public boolean isZero() - { - for (int i = v.length - 1; i >= 0; i--) - { - if (v[i] != 0) - { - return false; - } - } - return true; - } - - /** - * Return the value of the bit of this vector at the specified index. - * - * @param index the index - * @return the value of the bit (0 or 1) - */ - public int getBit(int index) - { - if (index >= length) - { - throw new IndexOutOfBoundsException(); - } - int q = index >> 5; - int r = index & 0x1f; - return (v[q] & (1 << r)) >>> r; - } - - /** - * Set the coefficient at the given index to 1. If the index is out of - * bounds, do nothing. - * - * @param index the index of the coefficient to set - */ - public void setBit(int index) - { - if (index >= length) - { - throw new IndexOutOfBoundsException(); - } - v[index >> 5] |= 1 << (index & 0x1f); - } - - /** - * Adds another GF2Vector to this vector. - * - * @param other another GF2Vector - * @return this + other - * @throws ArithmeticException if the other vector is not a GF2Vector or has another - * length. - */ - public Vector add(Vector other) - { - if (!(other instanceof GF2Vector)) - { - throw new ArithmeticException("vector is not defined over GF(2)"); - } - - GF2Vector otherVec = (GF2Vector)other; - if (length != otherVec.length) - { - throw new ArithmeticException("length mismatch"); - } - - int[] vec = IntUtils.clone(((GF2Vector)other).v); - - for (int i = vec.length - 1; i >= 0; i--) - { - vec[i] ^= v[i]; - } - - return new GF2Vector(length, vec); - } - - /** - * Multiply this vector with a permutation. - * - * @param p the permutation - * @return this*p = p*this - */ - public Vector multiply(Permutation p) - { - int[] pVec = p.getVector(); - if (length != pVec.length) - { - throw new ArithmeticException("length mismatch"); - } - - GF2Vector result = new GF2Vector(length); - - for (int i = 0; i < pVec.length; i++) - { - int e = v[pVec[i] >> 5] & (1 << (pVec[i] & 0x1f)); - if (e != 0) - { - result.v[i >> 5] |= 1 << (i & 0x1f); - } - } - - return result; - } - - /** - * Return a new vector consisting of the elements of this vector with the - * indices given by the set setJ. - * - * @param setJ the set of indices of elements to extract - * @return the new {@link GF2Vector} - * [this_setJ[0], this_setJ[1], ..., this_setJ[#setJ-1]] - */ - public GF2Vector extractVector(int[] setJ) - { - int k = setJ.length; - if (setJ[k - 1] > length) - { - throw new ArithmeticException("invalid index set"); - } - - GF2Vector result = new GF2Vector(k); - - for (int i = 0; i < k; i++) - { - int e = v[setJ[i] >> 5] & (1 << (setJ[i] & 0x1f)); - if (e != 0) - { - result.v[i >> 5] |= 1 << (i & 0x1f); - } - } - - return result; - } - - /** - * Return a new vector consisting of the first k elements of this - * vector. - * - * @param k the number of elements to extract - * @return a new {@link GF2Vector} consisting of the first k - * elements of this vector - */ - public GF2Vector extractLeftVector(int k) - { - if (k > length) - { - throw new ArithmeticException("invalid length"); - } - - if (k == length) - { - return new GF2Vector(this); - } - - GF2Vector result = new GF2Vector(k); - - int q = k >> 5; - int r = k & 0x1f; - - System.arraycopy(v, 0, result.v, 0, q); - if (r != 0) - { - result.v[q] = v[q] & ((1 << r) - 1); - } - - return result; - } - - /** - * Return a new vector consisting of the last k elements of this - * vector. - * - * @param k the number of elements to extract - * @return a new {@link GF2Vector} consisting of the last k - * elements of this vector - */ - public GF2Vector extractRightVector(int k) - { - if (k > length) - { - throw new ArithmeticException("invalid length"); - } - - if (k == length) - { - return new GF2Vector(this); - } - - GF2Vector result = new GF2Vector(k); - - int q = (length - k) >> 5; - int r = (length - k) & 0x1f; - int length = (k + 31) >> 5; - - int ind = q; - // if words have to be shifted - if (r != 0) - { - // process all but last word - for (int i = 0; i < length - 1; i++) - { - result.v[i] = (v[ind++] >>> r) | (v[ind] << (32 - r)); - } - // process last word - result.v[length - 1] = v[ind++] >>> r; - if (ind < v.length) - { - result.v[length - 1] |= v[ind] << (32 - r); - } - } - else - { - // no shift necessary - System.arraycopy(v, q, result.v, 0, length); - } - - return result; - } - - /** - * Rewrite this vector as a vector over GF(2m) with - * t elements. - * - * @param field the finite field GF(2m) - * @return the converted vector over GF(2m) - */ - public GF2mVector toExtensionFieldVector(GF2mField field) - { - int m = field.getDegree(); - if ((length % m) != 0) - { - throw new ArithmeticException("conversion is impossible"); - } - - int t = length / m; - int[] result = new int[t]; - int count = 0; - for (int i = t - 1; i >= 0; i--) - { - for (int j = field.getDegree() - 1; j >= 0; j--) - { - int q = count >>> 5; - int r = count & 0x1f; - - int e = (v[q] >>> r) & 1; - if (e == 1) - { - result[i] ^= 1 << j; - } - count++; - } - } - return new GF2mVector(field, result); - } - - /** - * Check if the given object is equal to this vector. - * - * @param other vector - * @return the result of the comparison - */ - public boolean equals(Object other) - { - - if (!(other instanceof GF2Vector)) - { - return false; - } - GF2Vector otherVec = (GF2Vector)other; - - return (length == otherVec.length) && IntUtils.equals(v, otherVec.v); - } - - /** - * @return the hash code of this vector - */ - public int hashCode() - { - int hash = length; - hash = hash * 31 + v.hashCode(); - return hash; - } - - /** - * @return a human readable form of this vector - */ - public String toString() - { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < length; i++) - { - if ((i != 0) && ((i & 0x1f) == 0)) - { - buf.append(' '); - } - int q = i >> 5; - int r = i & 0x1f; - int bit = v[q] & (1 << r); - if (bit == 0) - { - buf.append('0'); - } - else - { - buf.append('1'); - } - } - return buf.toString(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mField.java deleted file mode 100644 index b3a45f7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mField.java +++ /dev/null @@ -1,366 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class describes operations with elements from the finite field F = - * GF(2^m). ( GF(2^m)= GF(2)[A] where A is a root of irreducible polynomial with - * degree m, each field element B has a polynomial basis representation, i.e. it - * is represented by a different binary polynomial of degree less than m, B = - * poly(A) ) All operations are defined only for field with 1< m <32. For the - * representation of field elements the map f: F->Z, poly(A)->poly(2) is used, - * where integers have the binary representation. For example: A^7+A^3+A+1 -> - * (00...0010001011)=139 Also for elements type Integer is used. - * - * @see PolynomialRingGF2 - */ -public class GF2mField -{ - - /* - * degree - degree of the field polynomial - the field polynomial ring - - * polynomial ring over the finite field GF(2) - */ - - private int degree = 0; - - private int polynomial; - - /** - * create a finite field GF(2^m) - * - * @param degree the degree of the field - */ - public GF2mField(int degree) - { - if (degree >= 32) - { - throw new IllegalArgumentException( - " Error: the degree of field is too large "); - } - if (degree < 1) - { - throw new IllegalArgumentException( - " Error: the degree of field is non-positive "); - } - this.degree = degree; - polynomial = PolynomialRingGF2.getIrreduciblePolynomial(degree); - } - - /** - * create a finite field GF(2^m) with the fixed field polynomial - * - * @param degree the degree of the field - * @param poly the field polynomial - */ - public GF2mField(int degree, int poly) - { - if (degree != PolynomialRingGF2.degree(poly)) - { - throw new IllegalArgumentException( - " Error: the degree is not correct"); - } - if (!PolynomialRingGF2.isIrreducible(poly)) - { - throw new IllegalArgumentException( - " Error: given polynomial is reducible"); - } - this.degree = degree; - polynomial = poly; - - } - - public GF2mField(byte[] enc) - { - if (enc.length != 4) - { - throw new IllegalArgumentException( - "byte array is not an encoded finite field"); - } - polynomial = LittleEndianConversions.OS2IP(enc); - if (!PolynomialRingGF2.isIrreducible(polynomial)) - { - throw new IllegalArgumentException( - "byte array is not an encoded finite field"); - } - - degree = PolynomialRingGF2.degree(polynomial); - } - - public GF2mField(GF2mField field) - { - degree = field.degree; - polynomial = field.polynomial; - } - - /** - * return degree of the field - * - * @return degree of the field - */ - public int getDegree() - { - return degree; - } - - /** - * return the field polynomial - * - * @return the field polynomial - */ - public int getPolynomial() - { - return polynomial; - } - - /** - * return the encoded form of this field - * - * @return the field in byte array form - */ - public byte[] getEncoded() - { - return LittleEndianConversions.I2OSP(polynomial); - } - - /** - * Return sum of two elements - * - * @param a - * @param b - * @return a+b - */ - public int add(int a, int b) - { - return a ^ b; - } - - /** - * Return product of two elements - * - * @param a - * @param b - * @return a*b - */ - public int mult(int a, int b) - { - return PolynomialRingGF2.modMultiply(a, b, polynomial); - } - - /** - * compute exponentiation a^k - * - * @param a a field element a - * @param k k degree - * @return a^k - */ - public int exp(int a, int k) - { - if (a == 0) - { - return 0; - } - if (a == 1) - { - return 1; - } - int result = 1; - if (k < 0) - { - a = inverse(a); - k = -k; - } - while (k != 0) - { - if ((k & 1) == 1) - { - result = mult(result, a); - } - a = mult(a, a); - k >>>= 1; - } - return result; - } - - /** - * compute the multiplicative inverse of a - * - * @param a a field element a - * @return a-1 - */ - public int inverse(int a) - { - int d = (1 << degree) - 2; - - return exp(a, d); - } - - /** - * compute the square root of an integer - * - * @param a a field element a - * @return a1/2 - */ - public int sqRoot(int a) - { - for (int i = 1; i < degree; i++) - { - a = mult(a, a); - } - return a; - } - - /** - * create a random field element using PRNG sr - * - * @param sr SecureRandom - * @return a random element - */ - public int getRandomElement(SecureRandom sr) - { - int result = RandUtils.nextInt(sr, 1 << degree); - return result; - } - - /** - * create a random non-zero field element - * - * @return a random element - */ - public int getRandomNonZeroElement() - { - return getRandomNonZeroElement(new SecureRandom()); - } - - /** - * create a random non-zero field element using PRNG sr - * - * @param sr SecureRandom - * @return a random non-zero element - */ - public int getRandomNonZeroElement(SecureRandom sr) - { - int controltime = 1 << 20; - int count = 0; - int result = RandUtils.nextInt(sr, 1 << degree); - while ((result == 0) && (count < controltime)) - { - result = RandUtils.nextInt(sr, 1 << degree); - count++; - } - if (count == controltime) - { - result = 1; - } - return result; - } - - /** - * @return true if e is encoded element of this field and false otherwise - */ - public boolean isElementOfThisField(int e) - { - // e is encoded element of this field iff 0<= e < |2^m| - if (degree == 31) - { - return e >= 0; - } - return e >= 0 && e < (1 << degree); - } - - /* - * help method for visual control - */ - public String elementToStr(int a) - { - String s = ""; - for (int i = 0; i < degree; i++) - { - if (((byte)a & 0x01) == 0) - { - s = "0" + s; - } - else - { - s = "1" + s; - } - a >>>= 1; - } - return s; - } - - /** - * checks if given object is equal to this field. - *

    - * The method returns false whenever the given object is not GF2m. - * - * @param other object - * @return true or false - */ - public boolean equals(Object other) - { - if ((other == null) || !(other instanceof GF2mField)) - { - return false; - } - - GF2mField otherField = (GF2mField)other; - - if ((degree == otherField.degree) - && (polynomial == otherField.polynomial)) - { - return true; - } - - return false; - } - - public int hashCode() - { - return polynomial; - } - - /** - * Returns a human readable form of this field. - *

    - * - * @return a human readable form of this field. - */ - public String toString() - { - String str = "Finite Field GF(2^" + degree + ") = " + "GF(2)[X]/<" - + polyToString(polynomial) + "> "; - return str; - } - - private static String polyToString(int p) - { - String str = ""; - if (p == 0) - { - str = "0"; - } - else - { - byte b = (byte)(p & 0x01); - if (b == 1) - { - str = "1"; - } - p >>>= 1; - int i = 1; - while (p != 0) - { - b = (byte)(p & 0x01); - if (b == 1) - { - str = str + "+x^" + i; - } - p >>>= 1; - i++; - } - } - return str; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mMatrix.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mMatrix.java deleted file mode 100644 index d3b55e2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mMatrix.java +++ /dev/null @@ -1,377 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This class describes some operations with matrices over finite field GF(2m) - * with small m (1< m <32). - * - * @see Matrix - */ -public class GF2mMatrix - extends Matrix -{ - - /** - * finite field GF(2^m) - */ - protected GF2mField field; - - /** - * For the matrix representation the array of type int[][] is used, thus - * every element of the array keeps one element of the matrix (element from - * finite field GF(2^m)) - */ - protected int[][] matrix; - - /** - * Constructor. - * - * @param field a finite field GF(2^m) - * @param enc byte[] matrix in byte array form - */ - public GF2mMatrix(GF2mField field, byte[] enc) - { - - this.field = field; - - // decode matrix - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - if (enc.length < 5) - { - throw new IllegalArgumentException( - " Error: given array is not encoded matrix over GF(2^m)"); - } - - this.numRows = ((enc[3] & 0xff) << 24) ^ ((enc[2] & 0xff) << 16) - ^ ((enc[1] & 0xff) << 8) ^ (enc[0] & 0xff); - - int n = count * this.numRows; - - if ((this.numRows <= 0) || (((enc.length - 4) % n) != 0)) - { - throw new IllegalArgumentException( - " Error: given array is not encoded matrix over GF(2^m)"); - } - - this.numColumns = (enc.length - 4) / n; - - matrix = new int[this.numRows][this.numColumns]; - count = 4; - for (int i = 0; i < this.numRows; i++) - { - for (int j = 0; j < this.numColumns; j++) - { - for (int jj = 0; jj < d; jj += 8) - { - matrix[i][j] ^= (enc[count++] & 0x000000ff) << jj; - } - if (!this.field.isElementOfThisField(matrix[i][j])) - { - throw new IllegalArgumentException( - " Error: given array is not encoded matrix over GF(2^m)"); - } - } - } - } - - /** - * Copy constructor. - * - * @param other another {@link GF2mMatrix} - */ - public GF2mMatrix(GF2mMatrix other) - { - numRows = other.numRows; - numColumns = other.numColumns; - field = other.field; - matrix = new int[numRows][]; - for (int i = 0; i < numRows; i++) - { - matrix[i] = IntUtils.clone(other.matrix[i]); - } - } - - /** - * Constructor. - * - * @param field a finite field GF(2^m) - * @param matrix the matrix as int array. Only the reference is copied. - */ - protected GF2mMatrix(GF2mField field, int[][] matrix) - { - this.field = field; - this.matrix = matrix; - numRows = matrix.length; - numColumns = matrix[0].length; - } - - /** - * @return a byte array encoding of this matrix - */ - public byte[] getEncoded() - { - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - byte[] bf = new byte[this.numRows * this.numColumns * count + 4]; - bf[0] = (byte)(this.numRows & 0xff); - bf[1] = (byte)((this.numRows >>> 8) & 0xff); - bf[2] = (byte)((this.numRows >>> 16) & 0xff); - bf[3] = (byte)((this.numRows >>> 24) & 0xff); - - count = 4; - for (int i = 0; i < this.numRows; i++) - { - for (int j = 0; j < this.numColumns; j++) - { - for (int jj = 0; jj < d; jj += 8) - { - bf[count++] = (byte)(matrix[i][j] >>> jj); - } - } - } - - return bf; - } - - /** - * Check if this is the zero matrix (i.e., all entries are zero). - * - * @return true if this is the zero matrix - */ - public boolean isZero() - { - for (int i = 0; i < numRows; i++) - { - for (int j = 0; j < numColumns; j++) - { - if (matrix[i][j] != 0) - { - return false; - } - } - } - return true; - } - - /** - * Compute the inverse of this matrix. - * - * @return the inverse of this matrix (newly created). - */ - public Matrix computeInverse() - { - if (numRows != numColumns) - { - throw new ArithmeticException("Matrix is not invertible."); - } - - // clone this matrix - int[][] tmpMatrix = new int[numRows][numRows]; - for (int i = numRows - 1; i >= 0; i--) - { - tmpMatrix[i] = IntUtils.clone(matrix[i]); - } - - // initialize inverse matrix as unit matrix - int[][] invMatrix = new int[numRows][numRows]; - for (int i = numRows - 1; i >= 0; i--) - { - invMatrix[i][i] = 1; - } - - // simultaneously compute Gaussian reduction of tmpMatrix and unit - // matrix - for (int i = 0; i < numRows; i++) - { - // if diagonal element is zero - if (tmpMatrix[i][i] == 0) - { - boolean foundNonZero = false; - // find a non-zero element in the same column - for (int j = i + 1; j < numRows; j++) - { - if (tmpMatrix[j][i] != 0) - { - // found it, swap rows ... - foundNonZero = true; - swapColumns(tmpMatrix, i, j); - swapColumns(invMatrix, i, j); - // ... and quit searching - j = numRows; - continue; - } - } - // if no non-zero element was found - if (!foundNonZero) - { - // the matrix is not invertible - throw new ArithmeticException("Matrix is not invertible."); - } - } - - // normalize i-th row - int coef = tmpMatrix[i][i]; - int invCoef = field.inverse(coef); - multRowWithElementThis(tmpMatrix[i], invCoef); - multRowWithElementThis(invMatrix[i], invCoef); - - // normalize all other rows - for (int j = 0; j < numRows; j++) - { - if (j != i) - { - coef = tmpMatrix[j][i]; - if (coef != 0) - { - int[] tmpRow = multRowWithElement(tmpMatrix[i], coef); - int[] tmpInvRow = multRowWithElement(invMatrix[i], coef); - addToRow(tmpRow, tmpMatrix[j]); - addToRow(tmpInvRow, invMatrix[j]); - } - } - } - } - - return new GF2mMatrix(field, invMatrix); - } - - private static void swapColumns(int[][] matrix, int first, int second) - { - int[] tmp = matrix[first]; - matrix[first] = matrix[second]; - matrix[second] = tmp; - } - - private void multRowWithElementThis(int[] row, int element) - { - for (int i = row.length - 1; i >= 0; i--) - { - row[i] = field.mult(row[i], element); - } - } - - private int[] multRowWithElement(int[] row, int element) - { - int[] result = new int[row.length]; - for (int i = row.length - 1; i >= 0; i--) - { - result[i] = field.mult(row[i], element); - } - return result; - } - - /** - * Add one row to another. - * - * @param fromRow the addend - * @param toRow the row to add to - */ - private void addToRow(int[] fromRow, int[] toRow) - { - for (int i = toRow.length - 1; i >= 0; i--) - { - toRow[i] = field.add(fromRow[i], toRow[i]); - } - } - - public Matrix rightMultiply(Matrix a) - { - throw new RuntimeException("Not implemented."); - } - - public Matrix rightMultiply(Permutation perm) - { - throw new RuntimeException("Not implemented."); - } - - public Vector leftMultiply(Vector vector) - { - throw new RuntimeException("Not implemented."); - } - - public Vector rightMultiply(Vector vector) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Checks if given object is equal to this matrix. The method returns false - * whenever the given object is not a matrix over GF(2^m). - * - * @param other object - * @return true or false - */ - public boolean equals(Object other) - { - - if (other == null || !(other instanceof GF2mMatrix)) - { - return false; - } - - GF2mMatrix otherMatrix = (GF2mMatrix)other; - - if ((!this.field.equals(otherMatrix.field)) - || (otherMatrix.numRows != this.numColumns) - || (otherMatrix.numColumns != this.numColumns)) - { - return false; - } - - for (int i = 0; i < this.numRows; i++) - { - for (int j = 0; j < this.numColumns; j++) - { - if (this.matrix[i][j] != otherMatrix.matrix[i][j]) - { - return false; - } - } - } - - return true; - } - - public int hashCode() - { - int hash = (this.field.hashCode() * 31 + numRows) * 31 + numColumns; - for (int i = 0; i < this.numRows; i++) - { - for (int j = 0; j < this.numColumns; j++) - { - hash = hash * 31 + matrix[i][j]; - } - } - return hash; - } - - public String toString() - { - String str = this.numRows + " x " + this.numColumns + " Matrix over " - + this.field.toString() + ": \n"; - - for (int i = 0; i < this.numRows; i++) - { - for (int j = 0; j < this.numColumns; j++) - { - str = str + this.field.elementToStr(matrix[i][j]) + " : "; - } - str = str + "\n"; - } - - return str; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mVector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mVector.java deleted file mode 100644 index 485f984..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2mVector.java +++ /dev/null @@ -1,256 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -/** - * This class implements vectors over the finite field - * GF(2m) for small m (i.e., - * 1<m<32). It extends the abstract class {@link Vector}. - */ -public class GF2mVector - extends Vector -{ - - /** - * the finite field this vector is defined over - */ - private GF2mField field; - - /** - * the element array - */ - private int[] vector; - - /** - * creates the vector over GF(2^m) of given length and with elements from - * array v (beginning at the first bit) - * - * @param field finite field - * @param v array with elements of vector - */ - public GF2mVector(GF2mField field, byte[] v) - { - this.field = new GF2mField(field); - - // decode vector - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - if ((v.length % count) != 0) - { - throw new IllegalArgumentException( - "Byte array is not an encoded vector over the given finite field."); - } - - length = v.length / count; - vector = new int[length]; - count = 0; - for (int i = 0; i < vector.length; i++) - { - for (int j = 0; j < d; j += 8) - { - vector[i] |= (v[count++] & 0xff) << j; - } - if (!field.isElementOfThisField(vector[i])) - { - throw new IllegalArgumentException( - "Byte array is not an encoded vector over the given finite field."); - } - } - } - - /** - * Create a new vector over GF(2m) of the given - * length and element array. - * - * @param field the finite field GF(2m) - * @param vector the element array - */ - public GF2mVector(GF2mField field, int[] vector) - { - this.field = field; - length = vector.length; - for (int i = vector.length - 1; i >= 0; i--) - { - if (!field.isElementOfThisField(vector[i])) - { - throw new ArithmeticException( - "Element array is not specified over the given finite field."); - } - } - this.vector = IntUtils.clone(vector); - } - - /** - * Copy constructor. - * - * @param other another {@link GF2mVector} - */ - public GF2mVector(GF2mVector other) - { - field = new GF2mField(other.field); - length = other.length; - vector = IntUtils.clone(other.vector); - } - - /** - * @return the finite field this vector is defined over - */ - public GF2mField getField() - { - return field; - } - - /** - * @return int[] form of this vector - */ - public int[] getIntArrayForm() - { - return IntUtils.clone(vector); - } - - /** - * @return a byte array encoding of this vector - */ - public byte[] getEncoded() - { - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - byte[] res = new byte[vector.length * count]; - count = 0; - for (int i = 0; i < vector.length; i++) - { - for (int j = 0; j < d; j += 8) - { - res[count++] = (byte)(vector[i] >>> j); - } - } - - return res; - } - - /** - * @return whether this is the zero vector (i.e., all elements are zero) - */ - public boolean isZero() - { - for (int i = vector.length - 1; i >= 0; i--) - { - if (vector[i] != 0) - { - return false; - } - } - return true; - } - - /** - * Add another vector to this vector. Method is not yet implemented. - * - * @param addend the other vector - * @return this + addend - * @throws ArithmeticException if the other vector is not defined over the same field as - * this vector. - *

    - * TODO: implement this method - */ - public Vector add(Vector addend) - { - throw new RuntimeException("not implemented"); - } - - /** - * Multiply this vector with a permutation. - * - * @param p the permutation - * @return this*p = p*this - */ - public Vector multiply(Permutation p) - { - int[] pVec = p.getVector(); - if (length != pVec.length) - { - throw new ArithmeticException( - "permutation size and vector size mismatch"); - } - - int[] result = new int[length]; - for (int i = 0; i < pVec.length; i++) - { - result[i] = vector[pVec[i]]; - } - - return new GF2mVector(field, result); - } - - /** - * Compare this vector with another object. - * - * @param other the other object - * @return the result of the comparison - */ - public boolean equals(Object other) - { - - if (!(other instanceof GF2mVector)) - { - return false; - } - GF2mVector otherVec = (GF2mVector)other; - - if (!field.equals(otherVec.field)) - { - return false; - } - - return IntUtils.equals(vector, otherVec.vector); - } - - /** - * @return the hash code of this vector - */ - public int hashCode() - { - int hash = this.field.hashCode(); - hash = hash * 31 + vector.hashCode(); - return hash; - } - - /** - * @return a human readable form of this vector - */ - public String toString() - { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < vector.length; i++) - { - for (int j = 0; j < field.getDegree(); j++) - { - int r = j & 0x1f; - int bitMask = 1 << r; - int coeff = vector[i] & bitMask; - if (coeff != 0) - { - buf.append('1'); - } - else - { - buf.append('0'); - } - } - buf.append(' '); - } - return buf.toString(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nElement.java deleted file mode 100644 index 1f0105c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nElement.java +++ /dev/null @@ -1,186 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -/** - * This abstract class implements an element of the finite field GF(2)n - * in either optimal normal basis representation (ONB) - * or in polynomial representation. It is extended by the classes GF2nONBElement and GF2nPolynomialElement . - * - * @see GF2nPolynomialElement - * @see GF2nONBElement - * @see GF2nONBField - */ -public abstract class GF2nElement - implements GFElement -{ - - // ///////////////////////////////////////////////////////////////////// - // member variables - // ///////////////////////////////////////////////////////////////////// - - /** - * holds a pointer to this element's corresponding field. - */ - protected GF2nField mField; - - /** - * holds the extension degree n of this element's corresponding - * field. - */ - protected int mDegree; - - // ///////////////////////////////////////////////////////////////////// - // pseudo-constructors - // ///////////////////////////////////////////////////////////////////// - - /** - * @return a copy of this GF2nElement - */ - public abstract Object clone(); - - // ///////////////////////////////////////////////////////////////////// - // assignments - // ///////////////////////////////////////////////////////////////////// - - /** - * Assign the value 0 to this element. - */ - abstract void assignZero(); - - /** - * Assigns the value 1 to this element. - */ - abstract void assignOne(); - - // ///////////////////////////////////////////////////////////////////// - // access - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns whether the rightmost bit of the bit representation is set. This - * is needed for data conversion according to 1363. - * - * @return true if the rightmost bit of this element is set - */ - public abstract boolean testRightmostBit(); - - /** - * Checks whether the indexed bit of the bit representation is set - * - * @param index the index of the bit to test - * @return true if the indexed bit is set - */ - abstract boolean testBit(int index); - - /** - * Returns the field of this element. - * - * @return the field of this element - */ - public final GF2nField getField() - { - return mField; - } - - // ///////////////////////////////////////////////////////////////////// - // arithmetic - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns this element + 1. - * - * @return this + 1 - */ - public abstract GF2nElement increase(); - - /** - * Increases this element by one. - */ - public abstract void increaseThis(); - - /** - * Compute the difference of this element and minuend. - * - * @param minuend the minuend - * @return this - minuend (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - public final GFElement subtract(GFElement minuend) - throws RuntimeException - { - return add(minuend); - } - - /** - * Compute the difference of this element and minuend, - * overwriting this element. - * - * @param minuend the minuend - * @throws DifferentFieldsException if the elements are of different fields. - */ - public final void subtractFromThis(GFElement minuend) - { - addToThis(minuend); - } - - /** - * Returns this element to the power of 2. - * - * @return this2 - */ - public abstract GF2nElement square(); - - /** - * Squares this element. - */ - public abstract void squareThis(); - - /** - * Compute the square root of this element and return the result in a new - * {@link GF2nElement}. - * - * @return this1/2 (newly created) - */ - public abstract GF2nElement squareRoot(); - - /** - * Compute the square root of this element. - */ - public abstract void squareRootThis(); - - /** - * Performs a basis transformation of this element to the given GF2nField - * basis. - * - * @param basis the GF2nField representation to transform this element to - * @return this element in the representation of basis - * @throws DifferentFieldsException if this cannot be converted according to - * basis. - */ - public final GF2nElement convert(GF2nField basis) - throws RuntimeException - { - return mField.convert(this, basis); - } - - /** - * Returns the trace of this element. - * - * @return the trace of this element - */ - public abstract int trace(); - - /** - * Solves a quadratic equation.
    - * Let z2 + z = this. Then this method returns z. - * - * @return z with z2 + z = this - * @throws NoSolutionException if z2 + z = this does not have a - * solution - */ - public abstract GF2nElement solveQuadraticEquation() - throws RuntimeException; - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nField.java deleted file mode 100644 index 315e560..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nField.java +++ /dev/null @@ -1,292 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.util.Vector; - - -/** - * This abstract class defines the finite field GF(2n). It - * holds the extension degree n, the characteristic, the irreducible - * fieldpolynomial and conversion matrices. GF2nField is implemented by the - * classes GF2nPolynomialField and GF2nONBField. - * - * @see GF2nONBField - * @see GF2nPolynomialField - */ -public abstract class GF2nField -{ - - /** - * the degree of this field - */ - protected int mDegree; - - /** - * the irreducible fieldPolynomial stored in normal order (also for ONB) - */ - protected GF2Polynomial fieldPolynomial; - - /** - * holds a list of GF2nFields to which elements have been converted and thus - * a COB-Matrix exists - */ - protected Vector fields; - - /** - * the COB matrices - */ - protected Vector matrices; - - /** - * Returns the degree n of this field. - * - * @return the degree n of this field - */ - public final int getDegree() - { - return mDegree; - } - - /** - * Returns the fieldpolynomial as a new Bitstring. - * - * @return a copy of the fieldpolynomial as a new Bitstring - */ - public final GF2Polynomial getFieldPolynomial() - { - if (fieldPolynomial == null) - { - computeFieldPolynomial(); - } - return new GF2Polynomial(fieldPolynomial); - } - - /** - * Decides whether the given object other is the same as this - * field. - * - * @param other another object - * @return (this == other) - */ - public final boolean equals(Object other) - { - if (other == null || !(other instanceof GF2nField)) - { - return false; - } - - GF2nField otherField = (GF2nField)other; - - if (otherField.mDegree != mDegree) - { - return false; - } - if (!fieldPolynomial.equals(otherField.fieldPolynomial)) - { - return false; - } - if ((this instanceof GF2nPolynomialField) - && !(otherField instanceof GF2nPolynomialField)) - { - return false; - } - if ((this instanceof GF2nONBField) - && !(otherField instanceof GF2nONBField)) - { - return false; - } - return true; - } - - /** - * @return the hash code of this field - */ - public int hashCode() - { - return mDegree + fieldPolynomial.hashCode(); - } - - /** - * Computes a random root from the given irreducible fieldpolynomial - * according to IEEE 1363 algorithm A.5.6. This cal take very long for big - * degrees. - * - * @param B0FieldPolynomial the fieldpolynomial if the other basis as a Bitstring - * @return a random root of BOFieldPolynomial in representation according to - * this field - * @see "P1363 A.5.6, p103f" - */ - protected abstract GF2nElement getRandomRoot(GF2Polynomial B0FieldPolynomial); - - /** - * Computes the change-of-basis matrix for basis conversion according to - * 1363. The result is stored in the lists fields and matrices. - * - * @param B1 the GF2nField to convert to - * @see "P1363 A.7.3, p111ff" - */ - protected abstract void computeCOBMatrix(GF2nField B1); - - /** - * Computes the fieldpolynomial. This can take a long time for big degrees. - */ - protected abstract void computeFieldPolynomial(); - - /** - * Inverts the given matrix represented as bitstrings. - * - * @param matrix the matrix to invert as a Bitstring[] - * @return matrix^(-1) - */ - protected final GF2Polynomial[] invertMatrix(GF2Polynomial[] matrix) - { - GF2Polynomial[] a = new GF2Polynomial[matrix.length]; - GF2Polynomial[] inv = new GF2Polynomial[matrix.length]; - GF2Polynomial dummy; - int i, j; - // initialize a as a copy of matrix and inv as E(inheitsmatrix) - for (i = 0; i < mDegree; i++) - { - try - { - a[i] = new GF2Polynomial(matrix[i]); - inv[i] = new GF2Polynomial(mDegree); - inv[i].setBit(mDegree - 1 - i); - } - catch (RuntimeException BDNEExc) - { - BDNEExc.printStackTrace(); - } - } - // construct triangle matrix so that for each a[i] the first i bits are - // zero - for (i = 0; i < mDegree - 1; i++) - { - // find column where bit i is set - j = i; - while ((j < mDegree) && !a[j].testBit(mDegree - 1 - i)) - { - j++; - } - if (j >= mDegree) - { - throw new RuntimeException( - "GF2nField.invertMatrix: Matrix cannot be inverted!"); - } - if (i != j) - { // swap a[i]/a[j] and inv[i]/inv[j] - dummy = a[i]; - a[i] = a[j]; - a[j] = dummy; - dummy = inv[i]; - inv[i] = inv[j]; - inv[j] = dummy; - } - for (j = i + 1; j < mDegree; j++) - { // add column i to all columns>i - // having their i-th bit set - if (a[j].testBit(mDegree - 1 - i)) - { - a[j].addToThis(a[i]); - inv[j].addToThis(inv[i]); - } - } - } - // construct Einheitsmatrix from a - for (i = mDegree - 1; i > 0; i--) - { - for (j = i - 1; j >= 0; j--) - { // eliminate the i-th bit in all - // columns < i - if (a[j].testBit(mDegree - 1 - i)) - { - a[j].addToThis(a[i]); - inv[j].addToThis(inv[i]); - } - } - } - return inv; - } - - /** - * Converts the given element in representation according to this field to a - * new element in representation according to B1 using the change-of-basis - * matrix calculated by computeCOBMatrix. - * - * @param elem the GF2nElement to convert - * @param basis the basis to convert elem to - * @return elem converted to a new element representation - * according to basis - * @throws DifferentFieldsException if elem cannot be converted according to - * basis. - * @see GF2nField#computeCOBMatrix - * @see GF2nField#getRandomRoot - * @see GF2nPolynomial - * @see "P1363 A.7 p109ff" - */ - public final GF2nElement convert(GF2nElement elem, GF2nField basis) - throws RuntimeException - { - if (basis == this) - { - return (GF2nElement)elem.clone(); - } - if (fieldPolynomial.equals(basis.fieldPolynomial)) - { - return (GF2nElement)elem.clone(); - } - if (mDegree != basis.mDegree) - { - throw new RuntimeException("GF2nField.convert: B1 has a" - + " different degree and thus cannot be coverted to!"); - } - - int i; - GF2Polynomial[] COBMatrix; - i = fields.indexOf(basis); - if (i == -1) - { - computeCOBMatrix(basis); - i = fields.indexOf(basis); - } - COBMatrix = (GF2Polynomial[])matrices.elementAt(i); - - GF2nElement elemCopy = (GF2nElement)elem.clone(); - if (elemCopy instanceof GF2nONBElement) - { - // remember: ONB treats its bits in reverse order - ((GF2nONBElement)elemCopy).reverseOrder(); - } - GF2Polynomial bs = new GF2Polynomial(mDegree, elemCopy.toFlexiBigInt()); - bs.expandN(mDegree); - GF2Polynomial result = new GF2Polynomial(mDegree); - for (i = 0; i < mDegree; i++) - { - if (bs.vectorMult(COBMatrix[i])) - { - result.setBit(mDegree - 1 - i); - } - } - if (basis instanceof GF2nPolynomialField) - { - return new GF2nPolynomialElement((GF2nPolynomialField)basis, - result); - } - else if (basis instanceof GF2nONBField) - { - GF2nONBElement res = new GF2nONBElement((GF2nONBField)basis, - result.toFlexiBigInt()); - // TODO Remember: ONB treats its Bits in reverse order !!! - res.reverseOrder(); - return res; - } - else - { - throw new RuntimeException( - "GF2nField.convert: B1 must be an instance of " - + "GF2nPolynomialField or GF2nONBField!"); - } - - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBElement.java deleted file mode 100644 index 061393c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBElement.java +++ /dev/null @@ -1,1154 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.math.BigInteger; -import java.util.Random; - -/** - * This class implements an element of the finite field GF(2n ). - * It is represented in an optimal normal basis representation and holds the - * pointer mField to its corresponding field. - * - * @see GF2nField - * @see GF2nElement - */ -public class GF2nONBElement - extends GF2nElement -{ - - // ///////////////////////////////////////////////////////////////////// - // member variables - // ///////////////////////////////////////////////////////////////////// - - private static final long[] mBitmask = new long[]{0x0000000000000001L, - 0x0000000000000002L, 0x0000000000000004L, 0x0000000000000008L, - 0x0000000000000010L, 0x0000000000000020L, 0x0000000000000040L, - 0x0000000000000080L, 0x0000000000000100L, 0x0000000000000200L, - 0x0000000000000400L, 0x0000000000000800L, 0x0000000000001000L, - 0x0000000000002000L, 0x0000000000004000L, 0x0000000000008000L, - 0x0000000000010000L, 0x0000000000020000L, 0x0000000000040000L, - 0x0000000000080000L, 0x0000000000100000L, 0x0000000000200000L, - 0x0000000000400000L, 0x0000000000800000L, 0x0000000001000000L, - 0x0000000002000000L, 0x0000000004000000L, 0x0000000008000000L, - 0x0000000010000000L, 0x0000000020000000L, 0x0000000040000000L, - 0x0000000080000000L, 0x0000000100000000L, 0x0000000200000000L, - 0x0000000400000000L, 0x0000000800000000L, 0x0000001000000000L, - 0x0000002000000000L, 0x0000004000000000L, 0x0000008000000000L, - 0x0000010000000000L, 0x0000020000000000L, 0x0000040000000000L, - 0x0000080000000000L, 0x0000100000000000L, 0x0000200000000000L, - 0x0000400000000000L, 0x0000800000000000L, 0x0001000000000000L, - 0x0002000000000000L, 0x0004000000000000L, 0x0008000000000000L, - 0x0010000000000000L, 0x0020000000000000L, 0x0040000000000000L, - 0x0080000000000000L, 0x0100000000000000L, 0x0200000000000000L, - 0x0400000000000000L, 0x0800000000000000L, 0x1000000000000000L, - 0x2000000000000000L, 0x4000000000000000L, 0x8000000000000000L}; - - private static final long[] mMaxmask = new long[]{0x0000000000000001L, - 0x0000000000000003L, 0x0000000000000007L, 0x000000000000000FL, - 0x000000000000001FL, 0x000000000000003FL, 0x000000000000007FL, - 0x00000000000000FFL, 0x00000000000001FFL, 0x00000000000003FFL, - 0x00000000000007FFL, 0x0000000000000FFFL, 0x0000000000001FFFL, - 0x0000000000003FFFL, 0x0000000000007FFFL, 0x000000000000FFFFL, - 0x000000000001FFFFL, 0x000000000003FFFFL, 0x000000000007FFFFL, - 0x00000000000FFFFFL, 0x00000000001FFFFFL, 0x00000000003FFFFFL, - 0x00000000007FFFFFL, 0x0000000000FFFFFFL, 0x0000000001FFFFFFL, - 0x0000000003FFFFFFL, 0x0000000007FFFFFFL, 0x000000000FFFFFFFL, - 0x000000001FFFFFFFL, 0x000000003FFFFFFFL, 0x000000007FFFFFFFL, - 0x00000000FFFFFFFFL, 0x00000001FFFFFFFFL, 0x00000003FFFFFFFFL, - 0x00000007FFFFFFFFL, 0x0000000FFFFFFFFFL, 0x0000001FFFFFFFFFL, - 0x0000003FFFFFFFFFL, 0x0000007FFFFFFFFFL, 0x000000FFFFFFFFFFL, - 0x000001FFFFFFFFFFL, 0x000003FFFFFFFFFFL, 0x000007FFFFFFFFFFL, - 0x00000FFFFFFFFFFFL, 0x00001FFFFFFFFFFFL, 0x00003FFFFFFFFFFFL, - 0x00007FFFFFFFFFFFL, 0x0000FFFFFFFFFFFFL, 0x0001FFFFFFFFFFFFL, - 0x0003FFFFFFFFFFFFL, 0x0007FFFFFFFFFFFFL, 0x000FFFFFFFFFFFFFL, - 0x001FFFFFFFFFFFFFL, 0x003FFFFFFFFFFFFFL, 0x007FFFFFFFFFFFFFL, - 0x00FFFFFFFFFFFFFFL, 0x01FFFFFFFFFFFFFFL, 0x03FFFFFFFFFFFFFFL, - 0x07FFFFFFFFFFFFFFL, 0x0FFFFFFFFFFFFFFFL, 0x1FFFFFFFFFFFFFFFL, - 0x3FFFFFFFFFFFFFFFL, 0x7FFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL}; - - // mIBy64[j * 16 + i] = (j * 16 + i)/64 - // i = - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - // - private static final int[] mIBY64 = new int[]{ - // j = - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 8 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 9 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 10 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 11 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 12 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 13 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 14 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 15 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 16 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 17 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 18 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 19 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 20 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 21 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 22 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 // 23 - }; - - private static final int MAXLONG = 64; - - /** - * holds the lenght of the polynomial with 64 bit sized fields. - */ - private int mLength; - - /** - * holds the value of mDeg % MAXLONG. - */ - private int mBit; - - /** - * holds this element in ONB representation. - */ - private long[] mPol; - - // ///////////////////////////////////////////////////////////////////// - // constructors - // ///////////////////////////////////////////////////////////////////// - - /** - * Construct a random element over the field gf2n, using the - * specified source of randomness. - * - * @param gf2n the field - * @param rand the source of randomness - */ - public GF2nONBElement(GF2nONBField gf2n, Random rand) - { - mField = gf2n; - mDegree = mField.getDegree(); - mLength = gf2n.getONBLength(); - mBit = gf2n.getONBBit(); - mPol = new long[mLength]; - if (mLength > 1) - { - for (int j = 0; j < mLength - 1; j++) - { - mPol[j] = rand.nextLong(); - } - long last = rand.nextLong(); - mPol[mLength - 1] = last >>> (MAXLONG - mBit); - } - else - { - mPol[0] = rand.nextLong(); - mPol[0] = mPol[0] >>> (MAXLONG - mBit); - } - } - - /** - * Construct a new GF2nONBElement from its encoding. - * - * @param gf2n the field - * @param e the encoded element - */ - public GF2nONBElement(GF2nONBField gf2n, byte[] e) - { - mField = gf2n; - mDegree = mField.getDegree(); - mLength = gf2n.getONBLength(); - mBit = gf2n.getONBBit(); - mPol = new long[mLength]; - assign(e); - } - - /** - * Construct the element of the field gf2n with the specified - * value val. - * - * @param gf2n the field - * @param val the value represented by a BigInteger - */ - public GF2nONBElement(GF2nONBField gf2n, BigInteger val) - { - mField = gf2n; - mDegree = mField.getDegree(); - mLength = gf2n.getONBLength(); - mBit = gf2n.getONBBit(); - mPol = new long[mLength]; - assign(val); - } - - /** - * Construct the element of the field gf2n with the specified - * value val. - * - * @param gf2n the field - * @param val the value in ONB representation - */ - private GF2nONBElement(GF2nONBField gf2n, long[] val) - { - mField = gf2n; - mDegree = mField.getDegree(); - mLength = gf2n.getONBLength(); - mBit = gf2n.getONBBit(); - mPol = val; - } - - // ///////////////////////////////////////////////////////////////////// - // pseudo-constructors - // ///////////////////////////////////////////////////////////////////// - - /** - * Copy constructor. - * - * @param gf2n the field - */ - public GF2nONBElement(GF2nONBElement gf2n) - { - - mField = gf2n.mField; - mDegree = mField.getDegree(); - mLength = ((GF2nONBField)mField).getONBLength(); - mBit = ((GF2nONBField)mField).getONBBit(); - mPol = new long[mLength]; - assign(gf2n.getElement()); - } - - /** - * Create a new GF2nONBElement by cloning this GF2nPolynomialElement. - * - * @return a copy of this element - */ - public Object clone() - { - return new GF2nONBElement(this); - } - - /** - * Create the zero element. - * - * @param gf2n the finite field - * @return the zero element in the given finite field - */ - public static GF2nONBElement ZERO(GF2nONBField gf2n) - { - long[] polynomial = new long[gf2n.getONBLength()]; - return new GF2nONBElement(gf2n, polynomial); - } - - /** - * Create the one element. - * - * @param gf2n the finite field - * @return the one element in the given finite field - */ - public static GF2nONBElement ONE(GF2nONBField gf2n) - { - int mLength = gf2n.getONBLength(); - long[] polynomial = new long[mLength]; - - // fill mDegree coefficients with one's - for (int i = 0; i < mLength - 1; i++) - { - polynomial[i] = 0xffffffffffffffffL; - } - polynomial[mLength - 1] = mMaxmask[gf2n.getONBBit() - 1]; - - return new GF2nONBElement(gf2n, polynomial); - } - - // ///////////////////////////////////////////////////////////////////// - // assignments - // ///////////////////////////////////////////////////////////////////// - - /** - * assigns to this element the zero element - */ - void assignZero() - { - mPol = new long[mLength]; - } - - /** - * assigns to this element the one element - */ - void assignOne() - { - // fill mDegree coefficients with one's - for (int i = 0; i < mLength - 1; i++) - { - mPol[i] = 0xffffffffffffffffL; - } - mPol[mLength - 1] = mMaxmask[mBit - 1]; - } - - /** - * assigns to this element the value val. - * - * @param val the value represented by a BigInteger - */ - private void assign(BigInteger val) - { - assign(val.toByteArray()); - } - - /** - * assigns to this element the value val. - * - * @param val the value in ONB representation - */ - private void assign(long[] val) - { - System.arraycopy(val, 0, mPol, 0, mLength); - } - - /** - * assigns to this element the value val. First: inverting the - * order of val into reversed[]. That means: reversed[0] = val[length - 1], - * ..., reversed[reversed.length - 1] = val[0]. Second: mPol[0] = sum{i = 0, - * ... 7} (val[i]<<(i*8)) .... mPol[1] = sum{i = 8, ... 15} (val[i]<<(i*8)) - * - * @param val the value in ONB representation - */ - private void assign(byte[] val) - { - int j; - mPol = new long[mLength]; - for (j = 0; j < val.length; j++) - { - mPol[j >>> 3] |= (val[val.length - 1 - j] & 0x00000000000000ffL) << ((j & 0x07) << 3); - } - } - - // ///////////////////////////////////////////////////////////////// - // comparison - // ///////////////////////////////////////////////////////////////// - - /** - * Checks whether this element is zero. - * - * @return true if this is the zero element - */ - public boolean isZero() - { - - boolean result = true; - - for (int i = 0; i < mLength && result; i++) - { - result = result && ((mPol[i] & 0xFFFFFFFFFFFFFFFFL) == 0); - } - - return result; - } - - /** - * Checks whether this element is one. - * - * @return true if this is the one element - */ - public boolean isOne() - { - - boolean result = true; - - for (int i = 0; i < mLength - 1 && result; i++) - { - result = result - && ((mPol[i] & 0xFFFFFFFFFFFFFFFFL) == 0xFFFFFFFFFFFFFFFFL); - } - - if (result) - { - result = result - && ((mPol[mLength - 1] & mMaxmask[mBit - 1]) == mMaxmask[mBit - 1]); - } - - return result; - } - - /** - * Compare this element with another object. - * - * @param other the other object - * @return true if the two objects are equal, false - * otherwise - */ - public boolean equals(Object other) - { - if (other == null || !(other instanceof GF2nONBElement)) - { - return false; - } - - GF2nONBElement otherElem = (GF2nONBElement)other; - - for (int i = 0; i < mLength; i++) - { - if (mPol[i] != otherElem.mPol[i]) - { - return false; - } - } - - return true; - } - - /** - * @return the hash code of this element - */ - public int hashCode() - { - return mPol.hashCode(); - } - - // ///////////////////////////////////////////////////////////////////// - // access - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns whether the highest bit of the bit representation is set - * - * @return true, if the highest bit of mPol is set, false, otherwise - */ - public boolean testRightmostBit() - { - // due to the reverse bit order (compared to 1363) this method returns - // the value of the leftmost bit - return (mPol[mLength - 1] & mBitmask[mBit - 1]) != 0L; - } - - /** - * Checks whether the indexed bit of the bit representation is set. Warning: - * GF2nONBElement currently stores its bits in reverse order (compared to - * 1363) !!! - * - * @param index the index of the bit to test - * @return true if the indexed bit of mPol is set, false - * otherwise. - */ - boolean testBit(int index) - { - if (index < 0 || index > mDegree) - { - return false; - } - long test = mPol[index >>> 6] & mBitmask[index & 0x3f]; - return test != 0x0L; - } - - /** - * @return this element in its ONB representation - */ - private long[] getElement() - { - - long[] result = new long[mPol.length]; - System.arraycopy(mPol, 0, result, 0, mPol.length); - - return result; - } - - /** - * Returns the ONB representation of this element. The Bit-Order is - * exchanged (according to 1363)! - * - * @return this element in its representation and reverse bit-order - */ - private long[] getElementReverseOrder() - { - long[] result = new long[mPol.length]; - for (int i = 0; i < mDegree; i++) - { - if (testBit(mDegree - i - 1)) - { - result[i >>> 6] |= mBitmask[i & 0x3f]; - } - } - return result; - } - - /** - * Reverses the bit-order in this element(according to 1363). This is a - * hack! - */ - void reverseOrder() - { - mPol = getElementReverseOrder(); - } - - // ///////////////////////////////////////////////////////////////////// - // arithmetic - // ///////////////////////////////////////////////////////////////////// - - /** - * Compute the sum of this element and addend. - * - * @param addend the addend - * @return this + other (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - public GFElement add(GFElement addend) - throws RuntimeException - { - GF2nONBElement result = new GF2nONBElement(this); - result.addToThis(addend); - return result; - } - - /** - * Compute this + addend (overwrite this). - * - * @param addend the addend - * @throws DifferentFieldsException if the elements are of different fields. - */ - public void addToThis(GFElement addend) - throws RuntimeException - { - if (!(addend instanceof GF2nONBElement)) - { - throw new RuntimeException(); - } - if (!mField.equals(((GF2nONBElement)addend).mField)) - { - throw new RuntimeException(); - } - - for (int i = 0; i < mLength; i++) - { - mPol[i] ^= ((GF2nONBElement)addend).mPol[i]; - } - } - - /** - * returns this element + 1. - * - * @return this + 1 - */ - public GF2nElement increase() - { - GF2nONBElement result = new GF2nONBElement(this); - result.increaseThis(); - return result; - } - - /** - * increases this element. - */ - public void increaseThis() - { - addToThis(ONE((GF2nONBField)mField)); - } - - /** - * Compute the product of this element and factor. - * - * @param factor the factor - * @return this * factor (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - public GFElement multiply(GFElement factor) - throws RuntimeException - { - GF2nONBElement result = new GF2nONBElement(this); - result.multiplyThisBy(factor); - return result; - } - - /** - * Compute this * factor (overwrite this). - * - * @param factor the factor - * @throws DifferentFieldsException if the elements are of different fields. - */ - public void multiplyThisBy(GFElement factor) - throws RuntimeException - { - - if (!(factor instanceof GF2nONBElement)) - { - throw new RuntimeException("The elements have different" - + " representation: not yet" + " implemented"); - } - if (!mField.equals(((GF2nONBElement)factor).mField)) - { - throw new RuntimeException(); - } - - if (equals(factor)) - { - squareThis(); - } - else - { - - long[] a = mPol; - long[] b = ((GF2nONBElement)factor).mPol; - long[] c = new long[mLength]; - - int[][] m = ((GF2nONBField)mField).mMult; - - int degf, degb, s, fielda, fieldb, bita, bitb; - degf = mLength - 1; - degb = mBit - 1; - s = 0; - - long TWOTOMAXLONGM1 = mBitmask[MAXLONG - 1]; - long TWOTODEGB = mBitmask[degb]; - - boolean old, now; - - // the product c of a and b (a*b = c) is calculated in mDegree - // cicles - // in every cicle one coefficient of c is calculated and stored - // k indicates the coefficient - // - for (int k = 0; k < mDegree; k++) - { - - s = 0; - - for (int i = 0; i < mDegree; i++) - { - - // fielda = i / MAXLONG - // - fielda = mIBY64[i]; - - // bita = i % MAXLONG - // - bita = i & (MAXLONG - 1); - - // fieldb = m[i][0] / MAXLONG - // - fieldb = mIBY64[m[i][0]]; - - // bitb = m[i][0] % MAXLONG - // - bitb = m[i][0] & (MAXLONG - 1); - - if ((a[fielda] & mBitmask[bita]) != 0) - { - - if ((b[fieldb] & mBitmask[bitb]) != 0) - { - s ^= 1; - } - - if (m[i][1] != -1) - { - - // fieldb = m[i][1] / MAXLONG - // - fieldb = mIBY64[m[i][1]]; - - // bitb = m[i][1] % MAXLONG - // - bitb = m[i][1] & (MAXLONG - 1); - - if ((b[fieldb] & mBitmask[bitb]) != 0) - { - s ^= 1; - } - - } - } - } - fielda = mIBY64[k]; - bita = k & (MAXLONG - 1); - - if (s != 0) - { - c[fielda] ^= mBitmask[bita]; - } - - // Circular shift of x and y one bit to the right, - // respectively. - - if (mLength > 1) - { - - // Shift x. - // - old = (a[degf] & 1) == 1; - - for (int i = degf - 1; i >= 0; i--) - { - now = (a[i] & 1) != 0; - - a[i] = a[i] >>> 1; - - if (old) - { - a[i] ^= TWOTOMAXLONGM1; - } - - old = now; - } - a[degf] = a[degf] >>> 1; - - if (old) - { - a[degf] ^= TWOTODEGB; - } - - // Shift y. - // - old = (b[degf] & 1) == 1; - - for (int i = degf - 1; i >= 0; i--) - { - now = (b[i] & 1) != 0; - - b[i] = b[i] >>> 1; - - if (old) - { - b[i] ^= TWOTOMAXLONGM1; - } - - old = now; - } - - b[degf] = b[degf] >>> 1; - - if (old) - { - b[degf] ^= TWOTODEGB; - } - } - else - { - old = (a[0] & 1) == 1; - a[0] = a[0] >>> 1; - - if (old) - { - a[0] ^= TWOTODEGB; - } - - old = (b[0] & 1) == 1; - b[0] = b[0] >>> 1; - - if (old) - { - b[0] ^= TWOTODEGB; - } - } - } - assign(c); - } - } - - /** - * returns this element to the power of 2. - * - * @return this2 - */ - public GF2nElement square() - { - GF2nONBElement result = new GF2nONBElement(this); - result.squareThis(); - return result; - } - - /** - * squares this element. - */ - public void squareThis() - { - - long[] pol = getElement(); - - int f = mLength - 1; - int b = mBit - 1; - - // Shift the coefficients one bit to the left. - // - long TWOTOMAXLONGM1 = mBitmask[MAXLONG - 1]; - boolean old, now; - - old = (pol[f] & mBitmask[b]) != 0; - - for (int i = 0; i < f; i++) - { - - now = (pol[i] & TWOTOMAXLONGM1) != 0; - - pol[i] = pol[i] << 1; - - if (old) - { - pol[i] ^= 1; - } - - old = now; - } - now = (pol[f] & mBitmask[b]) != 0; - - pol[f] = pol[f] << 1; - - if (old) - { - pol[f] ^= 1; - } - - // Set the bit with index mDegree to zero. - // - if (now) - { - pol[f] ^= mBitmask[b + 1]; - } - - assign(pol); - } - - /** - * Compute the multiplicative inverse of this element. - * - * @return this-1 (newly created) - * @throws ArithmeticException if this is the zero element. - */ - public GFElement invert() - throws ArithmeticException - { - GF2nONBElement result = new GF2nONBElement(this); - result.invertThis(); - return result; - } - - /** - * Multiplicatively invert of this element (overwrite this). - * - * @throws ArithmeticException if this is the zero element. - */ - public void invertThis() - throws ArithmeticException - { - - if (isZero()) - { - throw new ArithmeticException(); - } - int r = 31; // mDegree kann nur 31 Bits lang sein!!! - - // Bitlaenge von mDegree: - for (boolean found = false; !found && r >= 0; r--) - { - - if (((mDegree - 1) & mBitmask[r]) != 0) - { - found = true; - } - } - r++; - - GF2nElement m = ZERO((GF2nONBField)mField); - GF2nElement n = new GF2nONBElement(this); - - int k = 1; - - for (int i = r - 1; i >= 0; i--) - { - m = (GF2nElement)n.clone(); - for (int j = 1; j <= k; j++) - { - m.squareThis(); - } - - n.multiplyThisBy(m); - - k <<= 1; - if (((mDegree - 1) & mBitmask[i]) != 0) - { - n.squareThis(); - - n.multiplyThisBy(this); - - k++; - } - } - n.squareThis(); - } - - /** - * returns the root ofthis element. - * - * @return this1/2 - */ - public GF2nElement squareRoot() - { - GF2nONBElement result = new GF2nONBElement(this); - result.squareRootThis(); - return result; - } - - /** - * square roots this element. - */ - public void squareRootThis() - { - - long[] pol = getElement(); - - int f = mLength - 1; - int b = mBit - 1; - - // Shift the coefficients one bit to the right. - // - long TWOTOMAXLONGM1 = mBitmask[MAXLONG - 1]; - boolean old, now; - - old = (pol[0] & 1) != 0; - - for (int i = f; i >= 0; i--) - { - now = (pol[i] & 1) != 0; - pol[i] = pol[i] >>> 1; - - if (old) - { - if (i == f) - { - pol[i] ^= mBitmask[b]; - } - else - { - pol[i] ^= TWOTOMAXLONGM1; - } - } - old = now; - } - assign(pol); - } - - /** - * Returns the trace of this element. - * - * @return the trace of this element - */ - public int trace() - { - - // trace = sum of coefficients - // - - int result = 0; - - int max = mLength - 1; - - for (int i = 0; i < max; i++) - { - - for (int j = 0; j < MAXLONG; j++) - { - - if ((mPol[i] & mBitmask[j]) != 0) - { - result ^= 1; - } - } - } - - int b = mBit; - - for (int j = 0; j < b; j++) - { - - if ((mPol[max] & mBitmask[j]) != 0) - { - result ^= 1; - } - } - return result; - } - - /** - * Solves a quadratic equation.
    - * Let z2 + z = this. Then this method returns z. - * - * @return z with z2 + z = this - * @throws NoSolutionException if z2 + z = this does not have a - * solution - */ - public GF2nElement solveQuadraticEquation() - throws RuntimeException - { - - if (trace() == 1) - { - throw new RuntimeException(); - } - - long TWOTOMAXLONGM1 = mBitmask[MAXLONG - 1]; - long ZERO = 0L; - long ONE = 1L; - - long[] p = new long[mLength]; - long z = 0L; - int j = 1; - for (int i = 0; i < mLength - 1; i++) - { - - for (j = 1; j < MAXLONG; j++) - { - - // - if (!((((mBitmask[j] & mPol[i]) != ZERO) && ((z & mBitmask[j - 1]) != ZERO)) || (((mPol[i] & mBitmask[j]) == ZERO) && ((z & mBitmask[j - 1]) == ZERO)))) - { - z ^= mBitmask[j]; - } - } - p[i] = z; - - if (((TWOTOMAXLONGM1 & z) != ZERO && (ONE & mPol[i + 1]) == ONE) - || ((TWOTOMAXLONGM1 & z) == ZERO && (ONE & mPol[i + 1]) == ZERO)) - { - z = ZERO; - } - else - { - z = ONE; - } - } - - int b = mDegree & (MAXLONG - 1); - - long LASTLONG = mPol[mLength - 1]; - - for (j = 1; j < b; j++) - { - if (!((((mBitmask[j] & LASTLONG) != ZERO) && ((mBitmask[j - 1] & z) != ZERO)) || (((mBitmask[j] & LASTLONG) == ZERO) && ((mBitmask[j - 1] & z) == ZERO)))) - { - z ^= mBitmask[j]; - } - } - p[mLength - 1] = z; - return new GF2nONBElement((GF2nONBField)mField, p); - } - - // ///////////////////////////////////////////////////////////////// - // conversion - // ///////////////////////////////////////////////////////////////// - - /** - * Returns a String representation of this element. - * - * @return String representation of this element with the specified radix - */ - public String toString() - { - return toString(16); - } - - /** - * Returns a String representation of this element. radix - * specifies the radix of the String representation.
    - * NOTE: ONLY radix = 2 or radix = 16 IS IMPLEMENTED> - * - * @param radix specifies the radix of the String representation - * @return String representation of this element with the specified radix - */ - public String toString(int radix) - { - String s = ""; - - long[] a = getElement(); - int b = mBit; - - if (radix == 2) - { - - for (int j = b - 1; j >= 0; j--) - { - if ((a[a.length - 1] & ((long)1 << j)) == 0) - { - s += "0"; - } - else - { - s += "1"; - } - } - - for (int i = a.length - 2; i >= 0; i--) - { - for (int j = MAXLONG - 1; j >= 0; j--) - { - if ((a[i] & mBitmask[j]) == 0) - { - s += "0"; - } - else - { - s += "1"; - } - } - } - } - else if (radix == 16) - { - final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - for (int i = a.length - 1; i >= 0; i--) - { - s += HEX_CHARS[(int)(a[i] >>> 60) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 56) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 52) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 48) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 44) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 40) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 36) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 32) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 28) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 24) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 20) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 16) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 12) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 8) & 0x0f]; - s += HEX_CHARS[(int)(a[i] >>> 4) & 0x0f]; - s += HEX_CHARS[(int)(a[i]) & 0x0f]; - s += " "; - } - } - return s; - } - - /** - * Returns this element as FlexiBigInt. The conversion is P1363-conform. - * - * @return this element as BigInteger - */ - public BigInteger toFlexiBigInt() - { - /** @todo this method does not reverse the bit-order as it should!!! */ - - return new BigInteger(1, toByteArray()); - } - - /** - * Returns this element as byte array. The conversion is P1363-conform. - * - * @return this element as byte array - */ - public byte[] toByteArray() - { - /** @todo this method does not reverse the bit-order as it should!!! */ - - int k = ((mDegree - 1) >> 3) + 1; - byte[] result = new byte[k]; - int i; - for (i = 0; i < k; i++) - { - result[k - i - 1] = (byte)((mPol[i >>> 3] & (0x00000000000000ffL << ((i & 0x07) << 3))) >>> ((i & 0x07) << 3)); - } - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBField.java deleted file mode 100644 index d63adf1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nONBField.java +++ /dev/null @@ -1,546 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.util.Random; -import java.util.Vector; - - -/** - * This class implements the abstract class GF2nField for ONB - * representation. It computes the fieldpolynomial, multiplication matrix and - * one of its roots mONBRoot, (see for example Certicoms Whitepapers). - * GF2nField is used by GF2nONBElement which implements the elements of this - * field. - * - * @see GF2nField - * @see GF2nONBElement - */ -public class GF2nONBField - extends GF2nField -{ - - // /////////////////////////////////////////////////////////////////// - // Hashtable for irreducible normal polynomials // - // /////////////////////////////////////////////////////////////////// - - // i*5 + 0 i*5 + 1 i*5 + 2 i*5 + 3 i*5 + 4 - /* - * private static int[][] mNB = {{0, 0, 0}, {0, 0, 0}, {1, 0, 0}, {1, 0, 0}, - * {1, 0, 0}, // i = 0 {2, 0, 0}, {1, 0, 0}, {1, 0, 0}, {4, 3, 1}, {1, 0, - * 0}, // i = 1 {3, 0, 0}, {2, 0, 0}, {3, 0, 0}, {4, 3, 1}, {5, 0, 0}, // i = - * 2 {1, 0, 0}, {5, 3, 1}, {3, 0, 0}, {3, 0, 0}, {5, 2, 1}, // i = 3 {3, 0, - * 0}, {2, 0, 0}, {1, 0, 0}, {5, 0, 0}, {4, 3, 1}, // i = 4 {3, 0, 0}, {4, - * 3, 1}, {5, 2, 1}, {1, 0, 0}, {2, 0, 0}, // i = 5 {1, 0, 0}, {3, 0, 0}, - * {7, 3, 2}, {10, 0, 0}, {7, 0, 0}, // i = 6 {2, 0, 0}, {9, 0, 0}, {6, 4, - * 1}, {6, 5, 1}, {4, 0, 0}, // i = 7 {5, 4, 3}, {3, 0, 0}, {7, 0, 0}, {6, - * 4, 3}, {5, 0, 0}, // i = 8 {4, 3, 1}, {1, 0, 0}, {5, 0, 0}, {5, 3, 2}, - * {9, 0, 0}, // i = 9 {4, 3, 2}, {6, 3, 1}, {3, 0, 0}, {6, 2, 1}, {9, 0, - * 0}, // i = 10 {7, 0, 0}, {7, 4, 2}, {4, 0, 0}, {19, 0, 0}, {7, 4, 2}, // - * i = 11 {1, 0, 0}, {5, 2, 1}, {29, 0, 0}, {1, 0, 0}, {4, 3, 1}, // i = 12 - * {18, 0, 0}, {3, 0, 0}, {5, 2, 1}, {9, 0, 0}, {6, 5, 2}, // i = 13 {5, 3, - * 1}, {6, 0, 0}, {10, 9, 3}, {25, 0, 0}, {35, 0, 0}, // i = 14 {6, 3, 1}, - * {21, 0, 0}, {6, 5, 2}, {6, 5, 3}, {9, 0, 0}, // i = 15 {9, 4, 2}, {4, 0, - * 0}, {8, 3, 1}, {7, 4, 2}, {5, 0, 0}, // i = 16 {8, 2, 1}, {21, 0, 0}, - * {13, 0, 0}, {7, 6, 2}, {38, 0, 0}, // i = 17 {27, 0, 0}, {8, 5, 1}, {21, - * 0, 0}, {2, 0, 0}, {21, 0, 0}, // i = 18 {11, 0, 0}, {10, 9, 6}, {6, 0, - * 0}, {11, 0, 0}, {6, 3, 1}, // i = 19 {15, 0, 0}, {7, 6, 1}, {29, 0, 0}, - * {9, 0, 0}, {4, 3, 1}, // i = 20 {4, 0, 0}, {15, 0, 0}, {9, 7, 4}, {17, 0, - * 0}, {5, 4, 2}, // i = 21 {33, 0, 0}, {10, 0, 0}, {5, 4, 3}, {9, 0, 0}, - * {5, 3, 2}, // i = 22 {8, 7, 5}, {4, 2, 1}, {5, 2, 1}, {33, 0, 0}, {8, 0, - * 0}, // i = 23 {4, 3, 1}, {18, 0, 0}, {6, 2, 1}, {2, 0, 0}, {19, 0, 0}, // - * i = 24 {7, 6, 5}, {21, 0, 0}, {1, 0, 0}, {7, 2, 1}, {5, 0, 0}, // i = 25 - * {3, 0, 0}, {8, 3, 2}, {17, 0, 0}, {9, 8, 2}, {57, 0, 0}, // i = 26 {11, - * 0, 0}, {5, 3, 2}, {21, 0, 0}, {8, 7, 1}, {8, 5, 3}, // i = 27 {15, 0, 0}, - * {10, 4, 1}, {21, 0, 0}, {5, 3, 2}, {7, 4, 2}, // i = 28 {52, 0, 0}, {71, - * 0, 0}, {14, 0, 0}, {27, 0, 0}, {10, 9, 7}, // i = 29 {53, 0, 0}, {3, 0, - * 0}, {6, 3, 2}, {1, 0, 0}, {15, 0, 0}, // i = 30 {62, 0, 0}, {9, 0, 0}, - * {6, 5, 2}, {8, 6, 5}, {31, 0, 0}, // i = 31 {5, 3, 2}, {18, 0, 0 }, {27, - * 0, 0}, {7, 6, 3}, {10, 8, 7}, // i = 32 {9, 8, 3}, {37, 0, 0}, {6, 0, 0}, - * {15, 3, 2}, {34, 0, 0}, // i = 33 {11, 0, 0}, {6, 5, 2}, {1, 0, 0}, {8, - * 5, 2}, {13, 0, 0}, // i = 34 {6, 0, 0}, {11, 3, 2}, {8, 0, 0}, {31, 0, - * 0}, {4, 2, 1}, // i = 35 {3, 0, 0}, {7, 6, 1}, {81, 0, 0}, {56, 0, 0}, - * {9, 8, 7}, // i = 36 {24, 0, 0}, {11, 0, 0}, {7, 6, 5}, {6, 5, 2}, {6, 5, - * 2}, // i = 37 {8, 7, 6}, {9, 0, 0}, {7, 2, 1}, {15, 0, 0}, {87, 0, 0}, // - * i = 38 {8, 3, 2}, {3, 0, 0}, {9, 4, 2}, {9, 0, 0}, {34, 0, 0}, // i = 39 - * {5, 3, 2}, {14, 0, 0}, {55, 0, 0}, {8, 7, 1}, {27, 0, 0}, // i = 40 {9, - * 5, 2}, {10, 9, 5}, {43, 0, 0}, {8, 6, 2}, {6, 0, 0}, // i = 41 {7, 0, 0}, - * {11, 10, 8}, {105, 0, 0}, {6, 5, 2}, {73, 0, 0}}; // i = 42 - */ - // ///////////////////////////////////////////////////////////////////// - // member variables - // ///////////////////////////////////////////////////////////////////// - private static final int MAXLONG = 64; - - /** - * holds the length of the array-representation of degree mDegree. - */ - private int mLength; - - /** - * holds the number of relevant bits in mONBPol[mLength-1]. - */ - private int mBit; - - /** - * holds the type of mONB - */ - private int mType; - - /** - * holds the multiplication matrix - */ - int[][] mMult; - - // ///////////////////////////////////////////////////////////////////// - // constructors - // ///////////////////////////////////////////////////////////////////// - - /** - * constructs an instance of the finite field with 2deg - * elements and characteristic 2. - * - * @param deg - - * the extention degree of this field - * @throws NoSuchBasisException if an ONB-implementation other than type 1 or type 2 is - * requested. - */ - public GF2nONBField(int deg) - throws RuntimeException - { - if (deg < 3) - { - throw new IllegalArgumentException("k must be at least 3"); - } - - mDegree = deg; - mLength = mDegree / MAXLONG; - mBit = mDegree & (MAXLONG - 1); - if (mBit == 0) - { - mBit = MAXLONG; - } - else - { - mLength++; - } - - computeType(); - - // only ONB-implementations for type 1 and type 2 - // - if (mType < 3) - { - mMult = new int[mDegree][2]; - for (int i = 0; i < mDegree; i++) - { - mMult[i][0] = -1; - mMult[i][1] = -1; - } - computeMultMatrix(); - } - else - { - throw new RuntimeException("\nThe type of this field is " - + mType); - } - computeFieldPolynomial(); - fields = new Vector(); - matrices = new Vector(); - } - - // ///////////////////////////////////////////////////////////////////// - // access - // ///////////////////////////////////////////////////////////////////// - - int getONBLength() - { - return mLength; - } - - int getONBBit() - { - return mBit; - } - - // ///////////////////////////////////////////////////////////////////// - // arithmetic - // ///////////////////////////////////////////////////////////////////// - - /** - * Computes a random root of the given polynomial. - * - * @param polynomial a polynomial - * @return a random root of the polynomial - * @see "P1363 A.5.6, p103f" - */ - protected GF2nElement getRandomRoot(GF2Polynomial polynomial) - { - // We are in B1!!! - GF2nPolynomial c; - GF2nPolynomial ut; - GF2nElement u; - GF2nPolynomial h; - int hDegree; - // 1. Set g(t) <- f(t) - GF2nPolynomial g = new GF2nPolynomial(polynomial, this); - int gDegree = g.getDegree(); - int i; - - // 2. while deg(g) > 1 - while (gDegree > 1) - { - do - { - // 2.1 choose random u (element of) GF(2^m) - u = new GF2nONBElement(this, new Random()); - ut = new GF2nPolynomial(2, GF2nONBElement.ZERO(this)); - // 2.2 Set c(t) <- ut - ut.set(1, u); - c = new GF2nPolynomial(ut); - // 2.3 For i from 1 to m-1 do - for (i = 1; i <= mDegree - 1; i++) - { - // 2.3.1 c(t) <- (c(t)^2 + ut) mod g(t) - c = c.multiplyAndReduce(c, g); - c = c.add(ut); - } - // 2.4 set h(t) <- GCD(c(t), g(t)) - h = c.gcd(g); - // 2.5 if h(t) is constant or deg(g) = deg(h) then go to - // step 2.1 - hDegree = h.getDegree(); - gDegree = g.getDegree(); - } - while ((hDegree == 0) || (hDegree == gDegree)); - // 2.6 If 2deg(h) > deg(g) then set g(t) <- g(t)/h(t) ... - if ((hDegree << 1) > gDegree) - { - g = g.quotient(h); - } - else - { - // ... else g(t) <- h(t) - g = new GF2nPolynomial(h); - } - gDegree = g.getDegree(); - } - // 3. Output g(0) - return g.at(0); - - } - - /** - * Computes the change-of-basis matrix for basis conversion according to - * 1363. The result is stored in the lists fields and matrices. - * - * @param B1 the GF2nField to convert to - * @see "P1363 A.7.3, p111ff" - */ - protected void computeCOBMatrix(GF2nField B1) - { - // we are in B0 here! - if (mDegree != B1.mDegree) - { - throw new IllegalArgumentException( - "GF2nField.computeCOBMatrix: B1 has a " - + "different degree and thus cannot be coverted to!"); - } - int i, j; - GF2nElement[] gamma; - GF2nElement u; - GF2Polynomial[] COBMatrix = new GF2Polynomial[mDegree]; - for (i = 0; i < mDegree; i++) - { - COBMatrix[i] = new GF2Polynomial(mDegree); - } - - // find Random Root - do - { - // u is in representation according to B1 - u = B1.getRandomRoot(fieldPolynomial); - } - while (u.isZero()); - - gamma = new GF2nPolynomialElement[mDegree]; - // build gamma matrix by squaring - gamma[0] = (GF2nElement)u.clone(); - for (i = 1; i < mDegree; i++) - { - gamma[i] = gamma[i - 1].square(); - } - // convert horizontal gamma matrix by vertical Bitstrings - for (i = 0; i < mDegree; i++) - { - for (j = 0; j < mDegree; j++) - { - if (gamma[i].testBit(j)) - { - COBMatrix[mDegree - j - 1].setBit(mDegree - i - 1); - } - } - } - - fields.addElement(B1); - matrices.addElement(COBMatrix); - B1.fields.addElement(this); - B1.matrices.addElement(invertMatrix(COBMatrix)); - } - - /** - * Computes the field polynomial for a ONB according to IEEE 1363 A.7.2 - * (p110f). - * - * @see "P1363 A.7.2, p110f" - */ - protected void computeFieldPolynomial() - { - if (mType == 1) - { - fieldPolynomial = new GF2Polynomial(mDegree + 1, "ALL"); - } - else if (mType == 2) - { - // 1. q = 1 - GF2Polynomial q = new GF2Polynomial(mDegree + 1, "ONE"); - // 2. p = t+1 - GF2Polynomial p = new GF2Polynomial(mDegree + 1, "X"); - p.addToThis(q); - GF2Polynomial r; - int i; - // 3. for i = 1 to (m-1) do - for (i = 1; i < mDegree; i++) - { - // r <- q - r = q; - // q <- p - q = p; - // p = tq+r - p = q.shiftLeft(); - p.addToThis(r); - } - fieldPolynomial = p; - } - } - - /** - * Compute the inverse of a matrix a. - * - * @param a the matrix - * @return a-1 - */ - int[][] invMatrix(int[][] a) - { - - int[][] A = new int[mDegree][mDegree]; - A = a; - int[][] inv = new int[mDegree][mDegree]; - - for (int i = 0; i < mDegree; i++) - { - inv[i][i] = 1; - } - - for (int i = 0; i < mDegree; i++) - { - for (int j = i; j < mDegree; j++) - { - A[mDegree - 1 - i][j] = A[i][i]; - } - } - return null; - } - - private void computeType() - throws RuntimeException - { - if ((mDegree & 7) == 0) - { - throw new RuntimeException( - "The extension degree is divisible by 8!"); - } - // checking for the type - int s = 0; - int k = 0; - mType = 1; - for (int d = 0; d != 1; mType++) - { - s = mType * mDegree + 1; - if (IntegerFunctions.isPrime(s)) - { - k = IntegerFunctions.order(2, s); - d = IntegerFunctions.gcd(mType * mDegree / k, mDegree); - } - } - mType--; - if (mType == 1) - { - s = (mDegree << 1) + 1; - if (IntegerFunctions.isPrime(s)) - { - k = IntegerFunctions.order(2, s); - int d = IntegerFunctions.gcd((mDegree << 1) / k, mDegree); - if (d == 1) - { - mType++; - } - } - } - } - - private void computeMultMatrix() - { - - if ((mType & 7) != 0) - { - int p = mType * mDegree + 1; - - // compute sequence F[1] ... F[p-1] via A.3.7. of 1363. - // F[0] will not be filled! - // - int[] F = new int[p]; - - int u; - if (mType == 1) - { - u = 1; - } - else if (mType == 2) - { - u = p - 1; - } - else - { - u = elementOfOrder(mType, p); - } - - int w = 1; - int n; - for (int j = 0; j < mType; j++) - { - n = w; - - for (int i = 0; i < mDegree; i++) - { - F[n] = i; - n = (n << 1) % p; - if (n < 0) - { - n += p; - } - } - w = u * w % p; - if (w < 0) - { - w += p; - } - } - - // building the matrix (mDegree * 2) - // - if (mType == 1) - { - for (int k = 1; k < p - 1; k++) - { - if (mMult[F[k + 1]][0] == -1) - { - mMult[F[k + 1]][0] = F[p - k]; - } - else - { - mMult[F[k + 1]][1] = F[p - k]; - } - } - - int m_2 = mDegree >> 1; - for (int k = 1; k <= m_2; k++) - { - - if (mMult[k - 1][0] == -1) - { - mMult[k - 1][0] = m_2 + k - 1; - } - else - { - mMult[k - 1][1] = m_2 + k - 1; - } - - if (mMult[m_2 + k - 1][0] == -1) - { - mMult[m_2 + k - 1][0] = k - 1; - } - else - { - mMult[m_2 + k - 1][1] = k - 1; - } - } - } - else if (mType == 2) - { - for (int k = 1; k < p - 1; k++) - { - if (mMult[F[k + 1]][0] == -1) - { - mMult[F[k + 1]][0] = F[p - k]; - } - else - { - mMult[F[k + 1]][1] = F[p - k]; - } - } - } - else - { - throw new RuntimeException("only type 1 or type 2 implemented"); - } - } - else - { - throw new RuntimeException("bisher nur fuer Gausssche Normalbasen" - + " implementiert"); - } - } - - private int elementOfOrder(int k, int p) - { - Random random = new Random(); - int m = 0; - while (m == 0) - { - m = random.nextInt(); - m %= p - 1; - if (m < 0) - { - m += p - 1; - } - } - - int l = IntegerFunctions.order(m, p); - - while (l % k != 0 || l == 0) - { - while (m == 0) - { - m = random.nextInt(); - m %= p - 1; - if (m < 0) - { - m += p - 1; - } - } - l = IntegerFunctions.order(m, p); - } - int r = m; - - l = k / l; - - for (int i = 2; i <= l; i++) - { - r *= m; - } - - return r; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomial.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomial.java deleted file mode 100644 index 596cf68..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomial.java +++ /dev/null @@ -1,587 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -/** - * This class implements polynomials over GF2nElements. - * - * @see GF2nElement - */ - -public class GF2nPolynomial -{ - - private GF2nElement[] coeff; // keeps the coefficients of this polynomial - - private int size; // the size of this polynomial - - /** - * Creates a new PolynomialGF2n of size deg and elem as - * coefficients. - * - * @param deg - - * the maximum degree + 1 - * @param elem - - * a GF2nElement - */ - public GF2nPolynomial(int deg, GF2nElement elem) - { - size = deg; - coeff = new GF2nElement[size]; - for (int i = 0; i < size; i++) - { - coeff[i] = (GF2nElement)elem.clone(); - } - } - - /** - * Creates a new PolynomialGF2n of size deg. - * - * @param deg the maximum degree + 1 - */ - private GF2nPolynomial(int deg) - { - size = deg; - coeff = new GF2nElement[size]; - } - - /** - * Creates a new PolynomialGF2n by cloning the given PolynomialGF2n a. - * - * @param a the PolynomialGF2n to clone - */ - public GF2nPolynomial(GF2nPolynomial a) - { - int i; - coeff = new GF2nElement[a.size]; - size = a.size; - for (i = 0; i < size; i++) - { - coeff[i] = (GF2nElement)a.coeff[i].clone(); - } - } - - /** - * Creates a new PolynomialGF2n from the given Bitstring polynomial - * over the GF2nField B1. - * - * @param polynomial the Bitstring to use - * @param B1 the field - */ - public GF2nPolynomial(GF2Polynomial polynomial, GF2nField B1) - { - size = B1.getDegree() + 1; - coeff = new GF2nElement[size]; - int i; - if (B1 instanceof GF2nONBField) - { - for (i = 0; i < size; i++) - { - if (polynomial.testBit(i)) - { - coeff[i] = GF2nONBElement.ONE((GF2nONBField)B1); - } - else - { - coeff[i] = GF2nONBElement.ZERO((GF2nONBField)B1); - } - } - } - else if (B1 instanceof GF2nPolynomialField) - { - for (i = 0; i < size; i++) - { - if (polynomial.testBit(i)) - { - coeff[i] = GF2nPolynomialElement - .ONE((GF2nPolynomialField)B1); - } - else - { - coeff[i] = GF2nPolynomialElement - .ZERO((GF2nPolynomialField)B1); - } - } - } - else - { - throw new IllegalArgumentException( - "PolynomialGF2n(Bitstring, GF2nField): B1 must be " - + "an instance of GF2nONBField or GF2nPolynomialField!"); - } - } - - public final void assignZeroToElements() - { - int i; - for (i = 0; i < size; i++) - { - coeff[i].assignZero(); - } - } - - /** - * Returns the size (=maximum degree + 1) of this PolynomialGF2n. This is - * not the degree, use getDegree instead. - * - * @return the size (=maximum degree + 1) of this PolynomialGF2n. - */ - public final int size() - { - return size; - } - - /** - * Returns the degree of this PolynomialGF2n. - * - * @return the degree of this PolynomialGF2n. - */ - public final int getDegree() - { - int i; - for (i = size - 1; i >= 0; i--) - { - if (!coeff[i].isZero()) - { - return i; - } - } - return -1; - } - - /** - * Enlarges the size of this PolynomialGF2n to k + 1. - * - * @param k the new maximum degree - */ - public final void enlarge(int k) - { - if (k <= size) - { - return; - } - int i; - GF2nElement[] res = new GF2nElement[k]; - System.arraycopy(coeff, 0, res, 0, size); - GF2nField f = coeff[0].getField(); - if (coeff[0] instanceof GF2nPolynomialElement) - { - for (i = size; i < k; i++) - { - res[i] = GF2nPolynomialElement.ZERO((GF2nPolynomialField)f); - } - } - else if (coeff[0] instanceof GF2nONBElement) - { - for (i = size; i < k; i++) - { - res[i] = GF2nONBElement.ZERO((GF2nONBField)f); - } - } - size = k; - coeff = res; - } - - public final void shrink() - { - int i = size - 1; - while (coeff[i].isZero() && (i > 0)) - { - i--; - } - i++; - if (i < size) - { - GF2nElement[] res = new GF2nElement[i]; - System.arraycopy(coeff, 0, res, 0, i); - coeff = res; - size = i; - } - } - - /** - * Sets the coefficient at index to elem. - * - * @param index the index - * @param elem the GF2nElement to store as coefficient index - */ - public final void set(int index, GF2nElement elem) - { - if (!(elem instanceof GF2nPolynomialElement) - && !(elem instanceof GF2nONBElement)) - { - throw new IllegalArgumentException( - "PolynomialGF2n.set f must be an " - + "instance of either GF2nPolynomialElement or GF2nONBElement!"); - } - coeff[index] = (GF2nElement)elem.clone(); - } - - /** - * Returns the coefficient at index. - * - * @param index the index - * @return the GF2nElement stored as coefficient index - */ - public final GF2nElement at(int index) - { - return coeff[index]; - } - - /** - * Returns true if all coefficients equal zero. - * - * @return true if all coefficients equal zero. - */ - public final boolean isZero() - { - int i; - for (i = 0; i < size; i++) - { - if (coeff[i] != null) - { - if (!coeff[i].isZero()) - { - return false; - } - } - } - return true; - } - - public final boolean equals(Object other) - { - if (other == null || !(other instanceof GF2nPolynomial)) - { - return false; - } - - GF2nPolynomial otherPol = (GF2nPolynomial)other; - - if (getDegree() != otherPol.getDegree()) - { - return false; - } - int i; - for (i = 0; i < size; i++) - { - if (!coeff[i].equals(otherPol.coeff[i])) - { - return false; - } - } - return true; - } - - /** - * @return the hash code of this polynomial - */ - public int hashCode() - { - return getDegree() + coeff.hashCode(); - } - - /** - * Adds the PolynomialGF2n b to this and returns the - * result in a new PolynomialGF2n. - * - * @param b - - * the PolynomialGF2n to add - * @return this + b - * @throws DifferentFieldsException if this and b are not defined over - * the same field. - */ - public final GF2nPolynomial add(GF2nPolynomial b) - throws RuntimeException - { - GF2nPolynomial result; - if (size() >= b.size()) - { - result = new GF2nPolynomial(size()); - int i; - for (i = 0; i < b.size(); i++) - { - result.coeff[i] = (GF2nElement)coeff[i].add(b.coeff[i]); - } - for (; i < size(); i++) - { - result.coeff[i] = coeff[i]; - } - } - else - { - result = new GF2nPolynomial(b.size()); - int i; - for (i = 0; i < size(); i++) - { - result.coeff[i] = (GF2nElement)coeff[i].add(b.coeff[i]); - } - for (; i < b.size(); i++) - { - result.coeff[i] = b.coeff[i]; - } - } - return result; - } - - /** - * Multiplies the scalar s to each coefficient of this - * PolynomialGF2n and returns the result in a new PolynomialGF2n. - * - * @param s the scalar to multiply - * @return this x s - * @throws DifferentFieldsException if this and s are not defined over - * the same field. - */ - public final GF2nPolynomial scalarMultiply(GF2nElement s) - throws RuntimeException - { - GF2nPolynomial result = new GF2nPolynomial(size()); - int i; - for (i = 0; i < size(); i++) - { - result.coeff[i] = (GF2nElement)coeff[i].multiply(s); // result[i] - // = - // a[i]*s - } - return result; - } - - /** - * Multiplies this by b and returns the result in a new - * PolynomialGF2n. - * - * @param b the PolynomialGF2n to multiply - * @return this * b - * @throws DifferentFieldsException if this and b are not defined over - * the same field. - */ - public final GF2nPolynomial multiply(GF2nPolynomial b) - throws RuntimeException - { - int i, j; - int aDegree = size(); - int bDegree = b.size(); - if (aDegree != bDegree) - { - throw new IllegalArgumentException( - "PolynomialGF2n.multiply: this and b must " - + "have the same size!"); - } - GF2nPolynomial result = new GF2nPolynomial((aDegree << 1) - 1); - for (i = 0; i < size(); i++) - { - for (j = 0; j < b.size(); j++) - { - if (result.coeff[i + j] == null) - { - result.coeff[i + j] = (GF2nElement)coeff[i] - .multiply(b.coeff[j]); - } - else - { - result.coeff[i + j] = (GF2nElement)result.coeff[i + j] - .add(coeff[i].multiply(b.coeff[j])); - } - } - } - return result; - } - - /** - * Multiplies this by b, reduces the result by g and - * returns it in a new PolynomialGF2n. - * - * @param b the PolynomialGF2n to multiply - * @param g the modul - * @return this * b mod g - * @throws DifferentFieldsException if this, b and g are - * not all defined over the same field. - */ - public final GF2nPolynomial multiplyAndReduce(GF2nPolynomial b, - GF2nPolynomial g) - throws RuntimeException, - ArithmeticException - { - return multiply(b).reduce(g); - } - - /** - * Reduces this by g and returns the result in a new - * PolynomialGF2n. - * - * @param g - - * the modulus - * @return this % g - * @throws DifferentFieldsException if this and g are not defined over - * the same field. - */ - public final GF2nPolynomial reduce(GF2nPolynomial g) - throws RuntimeException, ArithmeticException - { - return remainder(g); // return this % g - } - - /** - * Shifts left this by amount and stores the result in - * this PolynomialGF2n. - * - * @param amount the amount to shift the coefficients - */ - public final void shiftThisLeft(int amount) - { - if (amount > 0) - { - int i; - int oldSize = size; - GF2nField f = coeff[0].getField(); - enlarge(size + amount); - for (i = oldSize - 1; i >= 0; i--) - { - coeff[i + amount] = coeff[i]; - } - if (coeff[0] instanceof GF2nPolynomialElement) - { - for (i = amount - 1; i >= 0; i--) - { - coeff[i] = GF2nPolynomialElement - .ZERO((GF2nPolynomialField)f); - } - } - else if (coeff[0] instanceof GF2nONBElement) - { - for (i = amount - 1; i >= 0; i--) - { - coeff[i] = GF2nONBElement.ZERO((GF2nONBField)f); - } - } - } - } - - public final GF2nPolynomial shiftLeft(int amount) - { - if (amount <= 0) - { - return new GF2nPolynomial(this); - } - GF2nPolynomial result = new GF2nPolynomial(size + amount, coeff[0]); - result.assignZeroToElements(); - for (int i = 0; i < size; i++) - { - result.coeff[i + amount] = coeff[i]; - } - return result; - } - - /** - * Divides this by b and stores the result in a new - * PolynomialGF2n[2], quotient in result[0] and remainder in result[1]. - * - * @param b the divisor - * @return the quotient and remainder of this / b - * @throws DifferentFieldsException if this and b are not defined over - * the same field. - */ - public final GF2nPolynomial[] divide(GF2nPolynomial b) - throws RuntimeException, ArithmeticException - { - GF2nPolynomial[] result = new GF2nPolynomial[2]; - GF2nPolynomial a = new GF2nPolynomial(this); - a.shrink(); - GF2nPolynomial shift; - GF2nElement factor; - int bDegree = b.getDegree(); - GF2nElement inv = (GF2nElement)b.coeff[bDegree].invert(); - if (a.getDegree() < bDegree) - { - result[0] = new GF2nPolynomial(this); - result[0].assignZeroToElements(); - result[0].shrink(); - result[1] = new GF2nPolynomial(this); - result[1].shrink(); - return result; - } - result[0] = new GF2nPolynomial(this); - result[0].assignZeroToElements(); - int i = a.getDegree() - bDegree; - while (i >= 0) - { - factor = (GF2nElement)a.coeff[a.getDegree()].multiply(inv); - shift = b.scalarMultiply(factor); - shift.shiftThisLeft(i); - a = a.add(shift); - a.shrink(); - result[0].coeff[i] = (GF2nElement)factor.clone(); - i = a.getDegree() - bDegree; - } - result[1] = a; - result[0].shrink(); - return result; - } - - /** - * Divides this by b and stores the remainder in a new - * PolynomialGF2n. - * - * @param b the divisor - * @return the remainder this % b - * @throws DifferentFieldsException if this and b are not defined over - * the same field. - */ - public final GF2nPolynomial remainder(GF2nPolynomial b) - throws RuntimeException, ArithmeticException - { - GF2nPolynomial[] result = new GF2nPolynomial[2]; - result = divide(b); - return result[1]; - } - - /** - * Divides this by b and stores the quotient in a new - * PolynomialGF2n. - * - * @param b the divisor - * @return the quotient this / b - * @throws DifferentFieldsException if this and b are not defined over - * the same field. - */ - public final GF2nPolynomial quotient(GF2nPolynomial b) - throws RuntimeException, ArithmeticException - { - GF2nPolynomial[] result = new GF2nPolynomial[2]; - result = divide(b); - return result[0]; - } - - /** - * Computes the greatest common divisor of this and g and - * returns the result in a new PolynomialGF2n. - * - * @param g - - * a GF2nPolynomial - * @return gcd(this, g) - * @throws DifferentFieldsException if the coefficients of this and g use - * different fields - * @throws ArithmeticException if coefficients are zero. - */ - public final GF2nPolynomial gcd(GF2nPolynomial g) - throws RuntimeException, ArithmeticException - { - GF2nPolynomial a = new GF2nPolynomial(this); - GF2nPolynomial b = new GF2nPolynomial(g); - a.shrink(); - b.shrink(); - GF2nPolynomial c; - GF2nPolynomial result; - GF2nElement alpha; - while (!b.isZero()) - { - c = a.remainder(b); - a = b; - b = c; - } - alpha = a.coeff[a.getDegree()]; - result = a.scalarMultiply((GF2nElement)alpha.invert()); - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialElement.java deleted file mode 100644 index d51b856..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialElement.java +++ /dev/null @@ -1,1021 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.math.BigInteger; -import java.util.Random; - - -/** - * This class implements elements of finite binary fields GF(2n) - * using polynomial representation. For more information on the arithmetic see - * for example IEEE Standard 1363 or Certicom online-tutorial. - * - * @see "GF2nField" - * @see GF2nPolynomialField - * @see GF2nONBElement - * @see GF2Polynomial - */ -public class GF2nPolynomialElement - extends GF2nElement -{ - - // pre-computed Bitmask for fast masking, bitMask[a]=0x1 << a - private static final int[] bitMask = {0x00000001, 0x00000002, 0x00000004, - 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, - 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000, - 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, - 0x00800000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x00000000}; - - // the used GF2Polynomial which stores the coefficients - private GF2Polynomial polynomial; - - /** - * Create a new random GF2nPolynomialElement using the given field and - * source of randomness. - * - * @param f the GF2nField to use - * @param rand the source of randomness - */ - public GF2nPolynomialElement(GF2nPolynomialField f, Random rand) - { - mField = f; - mDegree = mField.getDegree(); - polynomial = new GF2Polynomial(mDegree); - randomize(rand); - } - - /** - * Creates a new GF2nPolynomialElement using the given field and Bitstring. - * - * @param f the GF2nPolynomialField to use - * @param bs the desired value as Bitstring - */ - public GF2nPolynomialElement(GF2nPolynomialField f, GF2Polynomial bs) - { - mField = f; - mDegree = mField.getDegree(); - polynomial = new GF2Polynomial(bs); - polynomial.expandN(mDegree); - } - - /** - * Creates a new GF2nPolynomialElement using the given field f and - * byte[] os as value. The conversion is done according to 1363. - * - * @param f the GF2nField to use - * @param os the octet string to assign to this GF2nPolynomialElement - * @see "P1363 5.5.5 p23, OS2FEP/OS2BSP" - */ - public GF2nPolynomialElement(GF2nPolynomialField f, byte[] os) - { - mField = f; - mDegree = mField.getDegree(); - polynomial = new GF2Polynomial(mDegree, os); - polynomial.expandN(mDegree); - } - - /** - * Creates a new GF2nPolynomialElement using the given field f and - * int[] is as value. - * - * @param f the GF2nField to use - * @param is the integer string to assign to this GF2nPolynomialElement - */ - public GF2nPolynomialElement(GF2nPolynomialField f, int[] is) - { - mField = f; - mDegree = mField.getDegree(); - polynomial = new GF2Polynomial(mDegree, is); - polynomial.expandN(f.mDegree); - } - - /** - * Creates a new GF2nPolynomialElement by cloning the given - * GF2nPolynomialElement b. - * - * @param other the GF2nPolynomialElement to clone - */ - public GF2nPolynomialElement(GF2nPolynomialElement other) - { - mField = other.mField; - mDegree = other.mDegree; - polynomial = new GF2Polynomial(other.polynomial); - } - - // ///////////////////////////////////////////////////////////////////// - // pseudo-constructors - // ///////////////////////////////////////////////////////////////////// - - /** - * Creates a new GF2nPolynomialElement by cloning this - * GF2nPolynomialElement. - * - * @return a copy of this element - */ - public Object clone() - { - return new GF2nPolynomialElement(this); - } - - // ///////////////////////////////////////////////////////////////////// - // assignments - // ///////////////////////////////////////////////////////////////////// - - /** - * Assigns the value 'zero' to this Polynomial. - */ - void assignZero() - { - polynomial.assignZero(); - } - - /** - * Create the zero element. - * - * @param f the finite field - * @return the zero element in the given finite field - */ - public static GF2nPolynomialElement ZERO(GF2nPolynomialField f) - { - GF2Polynomial polynomial = new GF2Polynomial(f.getDegree()); - return new GF2nPolynomialElement(f, polynomial); - } - - /** - * Create the one element. - * - * @param f the finite field - * @return the one element in the given finite field - */ - public static GF2nPolynomialElement ONE(GF2nPolynomialField f) - { - GF2Polynomial polynomial = new GF2Polynomial(f.getDegree(), - new int[]{1}); - return new GF2nPolynomialElement(f, polynomial); - } - - /** - * Assigns the value 'one' to this Polynomial. - */ - void assignOne() - { - polynomial.assignOne(); - } - - /** - * Assign a random value to this GF2nPolynomialElement using the specified - * source of randomness. - * - * @param rand the source of randomness - */ - private void randomize(Random rand) - { - polynomial.expandN(mDegree); - polynomial.randomize(rand); - } - - // ///////////////////////////////////////////////////////////////////// - // comparison - // ///////////////////////////////////////////////////////////////////// - - /** - * Checks whether this element is zero. - * - * @return true if this is the zero element - */ - public boolean isZero() - { - return polynomial.isZero(); - } - - /** - * Tests if the GF2nPolynomialElement has 'one' as value. - * - * @return true if this equals one (this == 1) - */ - public boolean isOne() - { - return polynomial.isOne(); - } - - /** - * Compare this element with another object. - * - * @param other the other object - * @return true if the two objects are equal, false - * otherwise - */ - public boolean equals(Object other) - { - if (other == null || !(other instanceof GF2nPolynomialElement)) - { - return false; - } - GF2nPolynomialElement otherElem = (GF2nPolynomialElement)other; - - if (mField != otherElem.mField) - { - if (!mField.getFieldPolynomial().equals( - otherElem.mField.getFieldPolynomial())) - { - return false; - } - } - - return polynomial.equals(otherElem.polynomial); - } - - /** - * @return the hash code of this element - */ - public int hashCode() - { - return mField.hashCode() + polynomial.hashCode(); - } - - // ///////////////////////////////////////////////////////////////////// - // access - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns the value of this GF2nPolynomialElement in a new Bitstring. - * - * @return the value of this GF2nPolynomialElement in a new Bitstring - */ - private GF2Polynomial getGF2Polynomial() - { - return new GF2Polynomial(polynomial); - } - - /** - * Checks whether the indexed bit of the bit representation is set. - * - * @param index the index of the bit to test - * @return true if the indexed bit is set - */ - boolean testBit(int index) - { - return polynomial.testBit(index); - } - - /** - * Returns whether the rightmost bit of the bit representation is set. This - * is needed for data conversion according to 1363. - * - * @return true if the rightmost bit of this element is set - */ - public boolean testRightmostBit() - { - return polynomial.testBit(0); - } - - /** - * Compute the sum of this element and addend. - * - * @param addend the addend - * @return this + other (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - public GFElement add(GFElement addend) - throws RuntimeException - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.addToThis(addend); - return result; - } - - /** - * Compute this + addend (overwrite this). - * - * @param addend the addend - * @throws DifferentFieldsException if the elements are of different fields. - */ - public void addToThis(GFElement addend) - throws RuntimeException - { - if (!(addend instanceof GF2nPolynomialElement)) - { - throw new RuntimeException(); - } - if (!mField.equals(((GF2nPolynomialElement)addend).mField)) - { - throw new RuntimeException(); - } - polynomial.addToThis(((GF2nPolynomialElement)addend).polynomial); - } - - /** - * Returns this element + 'one". - * - * @return this + 'one' - */ - public GF2nElement increase() - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.increaseThis(); - return result; - } - - /** - * Increases this element by 'one'. - */ - public void increaseThis() - { - polynomial.increaseThis(); - } - - /** - * Compute the product of this element and factor. - * - * @param factor the factor - * @return this * factor (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - public GFElement multiply(GFElement factor) - throws RuntimeException - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.multiplyThisBy(factor); - return result; - } - - /** - * Compute this * factor (overwrite this). - * - * @param factor the factor - * @throws DifferentFieldsException if the elements are of different fields. - */ - public void multiplyThisBy(GFElement factor) - throws RuntimeException - { - if (!(factor instanceof GF2nPolynomialElement)) - { - throw new RuntimeException(); - } - if (!mField.equals(((GF2nPolynomialElement)factor).mField)) - { - throw new RuntimeException(); - } - if (equals(factor)) - { - squareThis(); - return; - } - polynomial = polynomial - .multiply(((GF2nPolynomialElement)factor).polynomial); - reduceThis(); - } - - /** - * Compute the multiplicative inverse of this element. - * - * @return this-1 (newly created) - * @throws ArithmeticException if this is the zero element. - * @see GF2nPolynomialElement#invertMAIA - * @see GF2nPolynomialElement#invertEEA - * @see GF2nPolynomialElement#invertSquare - */ - public GFElement invert() - throws ArithmeticException - { - return invertMAIA(); - } - - /** - * Calculates the multiplicative inverse of this and returns the - * result in a new GF2nPolynomialElement. - * - * @return this^(-1) - * @throws ArithmeticException if this equals zero - */ - public GF2nPolynomialElement invertEEA() - throws ArithmeticException - { - if (isZero()) - { - throw new ArithmeticException(); - } - GF2Polynomial b = new GF2Polynomial(mDegree + 32, "ONE"); - b.reduceN(); - GF2Polynomial c = new GF2Polynomial(mDegree + 32); - c.reduceN(); - GF2Polynomial u = getGF2Polynomial(); - GF2Polynomial v = mField.getFieldPolynomial(); - GF2Polynomial h; - int j; - u.reduceN(); - while (!u.isOne()) - { - u.reduceN(); - v.reduceN(); - j = u.getLength() - v.getLength(); - if (j < 0) - { - h = u; - u = v; - v = h; - h = b; - b = c; - c = h; - j = -j; - c.reduceN(); // this increases the performance - } - u.shiftLeftAddThis(v, j); - b.shiftLeftAddThis(c, j); - } - b.reduceN(); - return new GF2nPolynomialElement((GF2nPolynomialField)mField, b); - } - - /** - * Calculates the multiplicative inverse of this and returns the - * result in a new GF2nPolynomialElement. - * - * @return this^(-1) - * @throws ArithmeticException if this equals zero - */ - public GF2nPolynomialElement invertSquare() - throws ArithmeticException - { - GF2nPolynomialElement n; - GF2nPolynomialElement u; - int i, j, k, b; - - if (isZero()) - { - throw new ArithmeticException(); - } - // b = (n-1) - b = mField.getDegree() - 1; - // n = a - n = new GF2nPolynomialElement(this); - n.polynomial.expandN((mDegree << 1) + 32); // increase performance - n.polynomial.reduceN(); - // k = 1 - k = 1; - - // for i = (r-1) downto 0 do, r=bitlength(b) - for (i = IntegerFunctions.floorLog(b) - 1; i >= 0; i--) - { - // u = n - u = new GF2nPolynomialElement(n); - // for j = 1 to k do - for (j = 1; j <= k; j++) - { - // u = u^2 - u.squareThisPreCalc(); - } - // n = nu - n.multiplyThisBy(u); - // k = 2k - k <<= 1; - // if b(i)==1 - if ((b & bitMask[i]) != 0) - { - // n = n^2 * b - n.squareThisPreCalc(); - n.multiplyThisBy(this); - // k = k+1 - k += 1; - } - } - - // outpur n^2 - n.squareThisPreCalc(); - return n; - } - - /** - * Calculates the multiplicative inverse of this using the modified - * almost inverse algorithm and returns the result in a new - * GF2nPolynomialElement. - * - * @return this^(-1) - * @throws ArithmeticException if this equals zero - */ - public GF2nPolynomialElement invertMAIA() - throws ArithmeticException - { - if (isZero()) - { - throw new ArithmeticException(); - } - GF2Polynomial b = new GF2Polynomial(mDegree, "ONE"); - GF2Polynomial c = new GF2Polynomial(mDegree); - GF2Polynomial u = getGF2Polynomial(); - GF2Polynomial v = mField.getFieldPolynomial(); - GF2Polynomial h; - while (true) - { - while (!u.testBit(0)) - { // x|u (x divides u) - u.shiftRightThis(); // u = u / x - if (!b.testBit(0)) - { - b.shiftRightThis(); - } - else - { - b.addToThis(mField.getFieldPolynomial()); - b.shiftRightThis(); - } - } - if (u.isOne()) - { - return new GF2nPolynomialElement((GF2nPolynomialField)mField, - b); - } - u.reduceN(); - v.reduceN(); - if (u.getLength() < v.getLength()) - { - h = u; - u = v; - v = h; - h = b; - b = c; - c = h; - } - u.addToThis(v); - b.addToThis(c); - } - } - - /** - * This method is used internally to map the square()-calls within - * GF2nPolynomialElement to one of the possible squaring methods. - * - * @return this2 (newly created) - * @see GF2nPolynomialElement#squarePreCalc - */ - public GF2nElement square() - { - return squarePreCalc(); - } - - /** - * This method is used internally to map the square()-calls within - * GF2nPolynomialElement to one of the possible squaring methods. - */ - public void squareThis() - { - squareThisPreCalc(); - } - - /** - * Squares this GF2nPolynomialElement using GF2nField's squaring matrix. - * This is supposed to be fast when using a polynomial (no tri- or - * pentanomial) as fieldpolynomial. Use squarePreCalc when using a tri- or - * pentanomial as fieldpolynomial instead. - * - * @return this2 (newly created) - * @see GF2Polynomial#vectorMult - * @see GF2nPolynomialElement#squarePreCalc - * @see GF2nPolynomialElement#squareBitwise - */ - public GF2nPolynomialElement squareMatrix() - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.squareThisMatrix(); - result.reduceThis(); - return result; - } - - /** - * Squares this GF2nPolynomialElement using GF2nFields squaring matrix. This - * is supposed to be fast when using a polynomial (no tri- or pentanomial) - * as fieldpolynomial. Use squarePreCalc when using a tri- or pentanomial as - * fieldpolynomial instead. - * - * @see GF2Polynomial#vectorMult - * @see GF2nPolynomialElement#squarePreCalc - * @see GF2nPolynomialElement#squareBitwise - */ - public void squareThisMatrix() - { - GF2Polynomial result = new GF2Polynomial(mDegree); - for (int i = 0; i < mDegree; i++) - { - if (polynomial - .vectorMult(((GF2nPolynomialField)mField).squaringMatrix[mDegree - - i - 1])) - { - result.setBit(i); - - } - } - polynomial = result; - } - - /** - * Squares this GF2nPolynomialElement by shifting left its Bitstring and - * reducing. This is supposed to be the slowest method. Use squarePreCalc or - * squareMatrix instead. - * - * @return this2 (newly created) - * @see GF2nPolynomialElement#squareMatrix - * @see GF2nPolynomialElement#squarePreCalc - * @see GF2Polynomial#squareThisBitwise - */ - public GF2nPolynomialElement squareBitwise() - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.squareThisBitwise(); - result.reduceThis(); - return result; - } - - /** - * Squares this GF2nPolynomialElement by shifting left its Bitstring and - * reducing. This is supposed to be the slowest method. Use squarePreCalc or - * squareMatrix instead. - * - * @see GF2nPolynomialElement#squareMatrix - * @see GF2nPolynomialElement#squarePreCalc - * @see GF2Polynomial#squareThisBitwise - */ - public void squareThisBitwise() - { - polynomial.squareThisBitwise(); - reduceThis(); - } - - /** - * Squares this GF2nPolynomialElement by using precalculated values and - * reducing. This is supposed to de fastest when using a trinomial or - * pentanomial as field polynomial. Use squareMatrix when using a ordinary - * polynomial as field polynomial. - * - * @return this2 (newly created) - * @see GF2nPolynomialElement#squareMatrix - * @see GF2Polynomial#squareThisPreCalc - */ - public GF2nPolynomialElement squarePreCalc() - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.squareThisPreCalc(); - result.reduceThis(); - return result; - } - - /** - * Squares this GF2nPolynomialElement by using precalculated values and - * reducing. This is supposed to de fastest when using a tri- or pentanomial - * as fieldpolynomial. Use squareMatrix when using a ordinary polynomial as - * fieldpolynomial. - * - * @see GF2nPolynomialElement#squareMatrix - * @see GF2Polynomial#squareThisPreCalc - */ - public void squareThisPreCalc() - { - polynomial.squareThisPreCalc(); - reduceThis(); - } - - /** - * Calculates this to the power of k and returns the result - * in a new GF2nPolynomialElement. - * - * @param k the power - * @return this^k in a new GF2nPolynomialElement - */ - public GF2nPolynomialElement power(int k) - { - if (k == 1) - { - return new GF2nPolynomialElement(this); - } - - GF2nPolynomialElement result = GF2nPolynomialElement - .ONE((GF2nPolynomialField)mField); - if (k == 0) - { - return result; - } - - GF2nPolynomialElement x = new GF2nPolynomialElement(this); - x.polynomial.expandN((x.mDegree << 1) + 32); // increase performance - x.polynomial.reduceN(); - - for (int i = 0; i < mDegree; i++) - { - if ((k & (1 << i)) != 0) - { - result.multiplyThisBy(x); - } - x.square(); - } - - return result; - } - - /** - * Compute the square root of this element and return the result in a new - * {@link GF2nPolynomialElement}. - * - * @return this1/2 (newly created) - */ - public GF2nElement squareRoot() - { - GF2nPolynomialElement result = new GF2nPolynomialElement(this); - result.squareRootThis(); - return result; - } - - /** - * Compute the square root of this element. - */ - public void squareRootThis() - { - // increase performance - polynomial.expandN((mDegree << 1) + 32); - polynomial.reduceN(); - for (int i = 0; i < mField.getDegree() - 1; i++) - { - squareThis(); - } - } - - /** - * Solves the quadratic equation z2 + z = this if - * such a solution exists. This method returns one of the two possible - * solutions. The other solution is z + 1. Use z.increase() to - * compute this solution. - * - * @return a GF2nPolynomialElement representing one z satisfying the - * equation z2 + z = this - * @throws NoSolutionException if no solution exists - * @see "IEEE 1363, Annex A.4.7" - */ - public GF2nElement solveQuadraticEquation() - throws RuntimeException - { - if (isZero()) - { - return ZERO((GF2nPolynomialField)mField); - } - - if ((mDegree & 1) == 1) - { - return halfTrace(); - } - - // TODO this can be sped-up by precomputation of p and w's - GF2nPolynomialElement z, w; - do - { - // step 1. - GF2nPolynomialElement p = new GF2nPolynomialElement( - (GF2nPolynomialField)mField, new Random()); - // step 2. - z = ZERO((GF2nPolynomialField)mField); - w = (GF2nPolynomialElement)p.clone(); - // step 3. - for (int i = 1; i < mDegree; i++) - { - // compute z = z^2 + w^2 * this - // and w = w^2 + p - z.squareThis(); - w.squareThis(); - z.addToThis(w.multiply(this)); - w.addToThis(p); - } - } - while (w.isZero()); // step 4. - - if (!equals(z.square().add(z))) - { - throw new RuntimeException(); - } - - // step 5. - return z; - } - - /** - * Returns the trace of this GF2nPolynomialElement. - * - * @return the trace of this GF2nPolynomialElement - */ - public int trace() - { - GF2nPolynomialElement t = new GF2nPolynomialElement(this); - int i; - - for (i = 1; i < mDegree; i++) - { - t.squareThis(); - t.addToThis(this); - } - - if (t.isOne()) - { - return 1; - } - return 0; - } - - /** - * Returns the half-trace of this GF2nPolynomialElement. - * - * @return a GF2nPolynomialElement representing the half-trace of this - * GF2nPolynomialElement. - * @throws DegreeIsEvenException if the degree of this GF2nPolynomialElement is even. - */ - private GF2nPolynomialElement halfTrace() - throws RuntimeException - { - if ((mDegree & 0x01) == 0) - { - throw new RuntimeException(); - } - int i; - GF2nPolynomialElement h = new GF2nPolynomialElement(this); - - for (i = 1; i <= ((mDegree - 1) >> 1); i++) - { - h.squareThis(); - h.squareThis(); - h.addToThis(this); - } - - return h; - } - - /** - * Reduces this GF2nPolynomialElement modulo the field-polynomial. - * - * @see GF2Polynomial#reduceTrinomial - * @see GF2Polynomial#reducePentanomial - */ - private void reduceThis() - { - if (polynomial.getLength() > mDegree) - { // really reduce ? - if (((GF2nPolynomialField)mField).isTrinomial()) - { // fieldpolonomial - // is trinomial - int tc; - try - { - tc = ((GF2nPolynomialField)mField).getTc(); - } - catch (RuntimeException NATExc) - { - throw new RuntimeException( - "GF2nPolynomialElement.reduce: the field" - + " polynomial is not a trinomial"); - } - if (((mDegree - tc) <= 32) // do we have to use slow - // bitwise reduction ? - || (polynomial.getLength() > (mDegree << 1))) - { - reduceTrinomialBitwise(tc); - return; - } - polynomial.reduceTrinomial(mDegree, tc); - return; - } - else if (((GF2nPolynomialField)mField).isPentanomial()) - { // fieldpolynomial - // is - // pentanomial - int[] pc; - try - { - pc = ((GF2nPolynomialField)mField).getPc(); - } - catch (RuntimeException NATExc) - { - throw new RuntimeException( - "GF2nPolynomialElement.reduce: the field" - + " polynomial is not a pentanomial"); - } - if (((mDegree - pc[2]) <= 32) // do we have to use slow - // bitwise reduction ? - || (polynomial.getLength() > (mDegree << 1))) - { - reducePentanomialBitwise(pc); - return; - } - polynomial.reducePentanomial(mDegree, pc); - return; - } - else - { // fieldpolynomial is something else - polynomial = polynomial.remainder(mField.getFieldPolynomial()); - polynomial.expandN(mDegree); - return; - } - } - if (polynomial.getLength() < mDegree) - { - polynomial.expandN(mDegree); - } - } - - /** - * Reduce this GF2nPolynomialElement using the trinomial x^n + x^tc + 1 as - * fieldpolynomial. The coefficients are reduced bit by bit. - */ - private void reduceTrinomialBitwise(int tc) - { - int i; - int k = mDegree - tc; - for (i = polynomial.getLength() - 1; i >= mDegree; i--) - { - if (polynomial.testBit(i)) - { - - polynomial.xorBit(i); - polynomial.xorBit(i - k); - polynomial.xorBit(i - mDegree); - - } - } - polynomial.reduceN(); - polynomial.expandN(mDegree); - } - - /** - * Reduce this GF2nPolynomialElement using the pentanomial x^n + x^pc[2] + - * x^pc[1] + x^pc[0] + 1 as fieldpolynomial. The coefficients are reduced - * bit by bit. - */ - private void reducePentanomialBitwise(int[] pc) - { - int i; - int k = mDegree - pc[2]; - int l = mDegree - pc[1]; - int m = mDegree - pc[0]; - for (i = polynomial.getLength() - 1; i >= mDegree; i--) - { - if (polynomial.testBit(i)) - { - polynomial.xorBit(i); - polynomial.xorBit(i - k); - polynomial.xorBit(i - l); - polynomial.xorBit(i - m); - polynomial.xorBit(i - mDegree); - - } - } - polynomial.reduceN(); - polynomial.expandN(mDegree); - } - - // ///////////////////////////////////////////////////////////////////// - // conversion - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns a string representing this Bitstrings value using hexadecimal - * radix in MSB-first order. - * - * @return a String representing this Bitstrings value. - */ - public String toString() - { - return polynomial.toString(16); - } - - /** - * Returns a string representing this Bitstrings value using hexadecimal or - * binary radix in MSB-first order. - * - * @param radix the radix to use (2 or 16, otherwise 2 is used) - * @return a String representing this Bitstrings value. - */ - public String toString(int radix) - { - return polynomial.toString(radix); - } - - /** - * Converts this GF2nPolynomialElement to a byte[] according to 1363. - * - * @return a byte[] representing the value of this GF2nPolynomialElement - * @see "P1363 5.5.2 p22f BS2OSP, FE2OSP" - */ - public byte[] toByteArray() - { - return polynomial.toByteArray(); - } - - /** - * Converts this GF2nPolynomialElement to an integer according to 1363. - * - * @return a BigInteger representing the value of this - * GF2nPolynomialElement - * @see "P1363 5.5.1 p22 BS2IP" - */ - public BigInteger toFlexiBigInt() - { - return polynomial.toFlexiBigInt(); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialField.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialField.java deleted file mode 100644 index c0b9fab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GF2nPolynomialField.java +++ /dev/null @@ -1,553 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - - -import java.util.Random; -import java.util.Vector; - - -/** - * This class implements the abstract class GF2nField for polynomial - * representation. It computes the field polynomial and the squaring matrix. - * GF2nField is used by GF2nPolynomialElement which implements the elements of - * this field. - * - * @see GF2nField - * @see GF2nPolynomialElement - */ -public class GF2nPolynomialField - extends GF2nField -{ - - /** - * Matrix used for fast squaring - */ - GF2Polynomial[] squaringMatrix; - - // field polynomial is a trinomial - private boolean isTrinomial = false; - - // field polynomial is a pentanomial - private boolean isPentanomial = false; - - // middle coefficient of the field polynomial in case it is a trinomial - private int tc; - - // middle 3 coefficients of the field polynomial in case it is a pentanomial - private int[] pc = new int[3]; - - /** - * constructs an instance of the finite field with 2deg - * elements and characteristic 2. - * - * @param deg the extention degree of this field - */ - public GF2nPolynomialField(int deg) - { - if (deg < 3) - { - throw new IllegalArgumentException("k must be at least 3"); - } - mDegree = deg; - computeFieldPolynomial(); - computeSquaringMatrix(); - fields = new Vector(); - matrices = new Vector(); - } - - /** - * constructs an instance of the finite field with 2deg - * elements and characteristic 2. - * - * @param deg the degree of this field - * @param file true if you want to read the field polynomial from the - * file false if you want to use a random fielpolynomial - * (this can take very long for huge degrees) - */ - public GF2nPolynomialField(int deg, boolean file) - { - if (deg < 3) - { - throw new IllegalArgumentException("k must be at least 3"); - } - mDegree = deg; - if (file) - { - computeFieldPolynomial(); - } - else - { - computeFieldPolynomial2(); - } - computeSquaringMatrix(); - fields = new Vector(); - matrices = new Vector(); - } - - /** - * Creates a new GF2nField of degree i and uses the given - * polynomial as field polynomial. The polynomial is checked - * whether it is irreducible. This can take some time if i is huge! - * - * @param deg degree of the GF2nField - * @param polynomial the field polynomial to use - * @throws PolynomialIsNotIrreducibleException if the given polynomial is not irreducible in GF(2^i) - */ - public GF2nPolynomialField(int deg, GF2Polynomial polynomial) - throws RuntimeException - { - if (deg < 3) - { - throw new IllegalArgumentException("degree must be at least 3"); - } - if (polynomial.getLength() != deg + 1) - { - throw new RuntimeException(); - } - if (!polynomial.isIrreducible()) - { - throw new RuntimeException(); - } - mDegree = deg; - // fieldPolynomial = new Bitstring(polynomial); - fieldPolynomial = polynomial; - computeSquaringMatrix(); - int k = 2; // check if the polynomial is a trinomial or pentanomial - for (int j = 1; j < fieldPolynomial.getLength() - 1; j++) - { - if (fieldPolynomial.testBit(j)) - { - k++; - if (k == 3) - { - tc = j; - } - if (k <= 5) - { - pc[k - 3] = j; - } - } - } - if (k == 3) - { - isTrinomial = true; - } - if (k == 5) - { - isPentanomial = true; - } - fields = new Vector(); - matrices = new Vector(); - } - - /** - * Returns true if the field polynomial is a trinomial. The coefficient can - * be retrieved using getTc(). - * - * @return true if the field polynomial is a trinomial - */ - public boolean isTrinomial() - { - return isTrinomial; - } - - /** - * Returns true if the field polynomial is a pentanomial. The coefficients - * can be retrieved using getPc(). - * - * @return true if the field polynomial is a pentanomial - */ - public boolean isPentanomial() - { - return isPentanomial; - } - - /** - * Returns the degree of the middle coefficient of the used field trinomial - * (x^n + x^(getTc()) + 1). - * - * @return the middle coefficient of the used field trinomial - * @throws GFException if the field polynomial is not a trinomial - */ - public int getTc() - throws RuntimeException - { - if (!isTrinomial) - { - throw new RuntimeException(); - } - return tc; - } - - /** - * Returns the degree of the middle coefficients of the used field - * pentanomial (x^n + x^(getPc()[2]) + x^(getPc()[1]) + x^(getPc()[0]) + 1). - * - * @return the middle coefficients of the used field pentanomial - * @throws GFException if the field polynomial is not a pentanomial - */ - public int[] getPc() - throws RuntimeException - { - if (!isPentanomial) - { - throw new RuntimeException(); - } - int[] result = new int[3]; - System.arraycopy(pc, 0, result, 0, 3); - return result; - } - - /** - * Return row vector i of the squaring matrix. - * - * @param i the index of the row vector to return - * @return a copy of squaringMatrix[i] - * @see GF2nPolynomialElement#squareMatrix - */ - public GF2Polynomial getSquaringVector(int i) - { - return new GF2Polynomial(squaringMatrix[i]); - } - - /** - * Compute a random root of the given GF2Polynomial. - * - * @param polynomial the polynomial - * @return a random root of polynomial - */ - protected GF2nElement getRandomRoot(GF2Polynomial polynomial) - { - // We are in B1!!! - GF2nPolynomial c; - GF2nPolynomial ut; - GF2nElement u; - GF2nPolynomial h; - int hDegree; - // 1. Set g(t) <- f(t) - GF2nPolynomial g = new GF2nPolynomial(polynomial, this); - int gDegree = g.getDegree(); - int i; - - // 2. while deg(g) > 1 - while (gDegree > 1) - { - do - { - // 2.1 choose random u (element of) GF(2^m) - u = new GF2nPolynomialElement(this, new Random()); - ut = new GF2nPolynomial(2, GF2nPolynomialElement.ZERO(this)); - // 2.2 Set c(t) <- ut - ut.set(1, u); - c = new GF2nPolynomial(ut); - // 2.3 For i from 1 to m-1 do - for (i = 1; i <= mDegree - 1; i++) - { - // 2.3.1 c(t) <- (c(t)^2 + ut) mod g(t) - c = c.multiplyAndReduce(c, g); - c = c.add(ut); - } - // 2.4 set h(t) <- GCD(c(t), g(t)) - h = c.gcd(g); - // 2.5 if h(t) is constant or deg(g) = deg(h) then go to - // step 2.1 - hDegree = h.getDegree(); - gDegree = g.getDegree(); - } - while ((hDegree == 0) || (hDegree == gDegree)); - // 2.6 If 2deg(h) > deg(g) then set g(t) <- g(t)/h(t) ... - if ((hDegree << 1) > gDegree) - { - g = g.quotient(h); - } - else - { - // ... else g(t) <- h(t) - g = new GF2nPolynomial(h); - } - gDegree = g.getDegree(); - } - // 3. Output g(0) - return g.at(0); - - } - - /** - * Computes the change-of-basis matrix for basis conversion according to - * 1363. The result is stored in the lists fields and matrices. - * - * @param B1 the GF2nField to convert to - * @see "P1363 A.7.3, p111ff" - */ - protected void computeCOBMatrix(GF2nField B1) - { - // we are in B0 here! - if (mDegree != B1.mDegree) - { - throw new IllegalArgumentException( - "GF2nPolynomialField.computeCOBMatrix: B1 has a different " - + "degree and thus cannot be coverted to!"); - } - if (B1 instanceof GF2nONBField) - { - // speedup (calculation is done in PolynomialElements instead of - // ONB) - B1.computeCOBMatrix(this); - return; - } - int i, j; - GF2nElement[] gamma; - GF2nElement u; - GF2Polynomial[] COBMatrix = new GF2Polynomial[mDegree]; - for (i = 0; i < mDegree; i++) - { - COBMatrix[i] = new GF2Polynomial(mDegree); - } - - // find Random Root - do - { - // u is in representation according to B1 - u = B1.getRandomRoot(fieldPolynomial); - } - while (u.isZero()); - - // build gamma matrix by multiplying by u - if (u instanceof GF2nONBElement) - { - gamma = new GF2nONBElement[mDegree]; - gamma[mDegree - 1] = GF2nONBElement.ONE((GF2nONBField)B1); - } - else - { - gamma = new GF2nPolynomialElement[mDegree]; - gamma[mDegree - 1] = GF2nPolynomialElement - .ONE((GF2nPolynomialField)B1); - } - gamma[mDegree - 2] = u; - for (i = mDegree - 3; i >= 0; i--) - { - gamma[i] = (GF2nElement)gamma[i + 1].multiply(u); - } - if (B1 instanceof GF2nONBField) - { - // convert horizontal gamma matrix by vertical Bitstrings - for (i = 0; i < mDegree; i++) - { - for (j = 0; j < mDegree; j++) - { - // TODO remember: ONB treats its Bits in reverse order !!! - if (gamma[i].testBit(mDegree - j - 1)) - { - COBMatrix[mDegree - j - 1].setBit(mDegree - i - 1); - } - } - } - } - else - { - // convert horizontal gamma matrix by vertical Bitstrings - for (i = 0; i < mDegree; i++) - { - for (j = 0; j < mDegree; j++) - { - if (gamma[i].testBit(j)) - { - COBMatrix[mDegree - j - 1].setBit(mDegree - i - 1); - } - } - } - } - - // store field and matrix for further use - fields.addElement(B1); - matrices.addElement(COBMatrix); - // store field and inverse matrix for further use in B1 - B1.fields.addElement(this); - B1.matrices.addElement(invertMatrix(COBMatrix)); - } - - /** - * Computes a new squaring matrix used for fast squaring. - * - * @see GF2nPolynomialElement#square - */ - private void computeSquaringMatrix() - { - GF2Polynomial[] d = new GF2Polynomial[mDegree - 1]; - int i, j; - squaringMatrix = new GF2Polynomial[mDegree]; - for (i = 0; i < squaringMatrix.length; i++) - { - squaringMatrix[i] = new GF2Polynomial(mDegree, "ZERO"); - } - - for (i = 0; i < mDegree - 1; i++) - { - d[i] = new GF2Polynomial(1, "ONE").shiftLeft(mDegree + i) - .remainder(fieldPolynomial); - } - for (i = 1; i <= Math.abs(mDegree >> 1); i++) - { - for (j = 1; j <= mDegree; j++) - { - if (d[mDegree - (i << 1)].testBit(mDegree - j)) - { - squaringMatrix[j - 1].setBit(mDegree - i); - } - } - } - for (i = Math.abs(mDegree >> 1) + 1; i <= mDegree; i++) - { - squaringMatrix[(i << 1) - mDegree - 1].setBit(mDegree - i); - } - - } - - /** - * Computes the field polynomial. This can take a long time for big degrees. - */ - protected void computeFieldPolynomial() - { - if (testTrinomials()) - { - return; - } - if (testPentanomials()) - { - return; - } - testRandom(); - } - - /** - * Computes the field polynomial. This can take a long time for big degrees. - */ - protected void computeFieldPolynomial2() - { - if (testTrinomials()) - { - return; - } - if (testPentanomials()) - { - return; - } - testRandom(); - } - - /** - * Tests all trinomials of degree (n+1) until a irreducible is found and - * stores the result in field polynomial. Returns false if no - * irreducible trinomial exists in GF(2^n). This can take very long for huge - * degrees. - * - * @return true if an irreducible trinomial is found - */ - private boolean testTrinomials() - { - int i, l; - boolean done = false; - l = 0; - - fieldPolynomial = new GF2Polynomial(mDegree + 1); - fieldPolynomial.setBit(0); - fieldPolynomial.setBit(mDegree); - for (i = 1; (i < mDegree) && !done; i++) - { - fieldPolynomial.setBit(i); - done = fieldPolynomial.isIrreducible(); - l++; - if (done) - { - isTrinomial = true; - tc = i; - return done; - } - fieldPolynomial.resetBit(i); - done = fieldPolynomial.isIrreducible(); - } - - return done; - } - - /** - * Tests all pentanomials of degree (n+1) until a irreducible is found and - * stores the result in field polynomial. Returns false if no - * irreducible pentanomial exists in GF(2^n). This can take very long for - * huge degrees. - * - * @return true if an irreducible pentanomial is found - */ - private boolean testPentanomials() - { - int i, j, k, l; - boolean done = false; - l = 0; - - fieldPolynomial = new GF2Polynomial(mDegree + 1); - fieldPolynomial.setBit(0); - fieldPolynomial.setBit(mDegree); - for (i = 1; (i <= (mDegree - 3)) && !done; i++) - { - fieldPolynomial.setBit(i); - for (j = i + 1; (j <= (mDegree - 2)) && !done; j++) - { - fieldPolynomial.setBit(j); - for (k = j + 1; (k <= (mDegree - 1)) && !done; k++) - { - fieldPolynomial.setBit(k); - if (((mDegree & 1) != 0) | ((i & 1) != 0) | ((j & 1) != 0) - | ((k & 1) != 0)) - { - done = fieldPolynomial.isIrreducible(); - l++; - if (done) - { - isPentanomial = true; - pc[0] = i; - pc[1] = j; - pc[2] = k; - return done; - } - } - fieldPolynomial.resetBit(k); - } - fieldPolynomial.resetBit(j); - } - fieldPolynomial.resetBit(i); - } - - return done; - } - - /** - * Tests random polynomials of degree (n+1) until an irreducible is found - * and stores the result in field polynomial. This can take very - * long for huge degrees. - * - * @return true - */ - private boolean testRandom() - { - int l; - boolean done = false; - - fieldPolynomial = new GF2Polynomial(mDegree + 1); - l = 0; - while (!done) - { - l++; - fieldPolynomial.randomize(); - fieldPolynomial.setBit(mDegree); - fieldPolynomial.setBit(0); - if (fieldPolynomial.isIrreducible()) - { - done = true; - return done; - } - } - - return done; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GFElement.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GFElement.java deleted file mode 100644 index d155a28..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GFElement.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.math.BigInteger; - - -/** - * This interface defines a finite field element. It is implemented by the - * classes {@link GFPElement} and {@link GF2nElement}. - * - * @see GFPElement - * @see GF2nElement - */ -public interface GFElement -{ - - /** - * @return a copy of this GFElement - */ - Object clone(); - - // ///////////////////////////////////////////////////////////////// - // comparison - // ///////////////////////////////////////////////////////////////// - - /** - * Compare this curve with another object. - * - * @param other the other object - * @return the result of the comparison - */ - boolean equals(Object other); - - /** - * @return the hash code of this element - */ - int hashCode(); - - /** - * Checks whether this element is zero. - * - * @return true if this is the zero element - */ - boolean isZero(); - - /** - * Checks whether this element is one. - * - * @return true if this is the one element - */ - boolean isOne(); - - // ///////////////////////////////////////////////////////////////////// - // arithmetic - // ///////////////////////////////////////////////////////////////////// - - /** - * Compute the sum of this element and the addend. - * - * @param addend the addend - * @return this + other (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - GFElement add(GFElement addend) - throws RuntimeException; - - /** - * Compute the sum of this element and the addend, overwriting this element. - * - * @param addend the addend - * @throws DifferentFieldsException if the elements are of different fields. - */ - void addToThis(GFElement addend) - throws RuntimeException; - - /** - * Compute the difference of this element and minuend. - * - * @param minuend the minuend - * @return this - minuend (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - GFElement subtract(GFElement minuend) - throws RuntimeException; - - /** - * Compute the difference of this element and minuend, - * overwriting this element. - * - * @param minuend the minuend - * @throws DifferentFieldsException if the elements are of different fields. - */ - void subtractFromThis(GFElement minuend); - - /** - * Compute the product of this element and factor. - * - * @param factor the factor - * @return this * factor (newly created) - * @throws DifferentFieldsException if the elements are of different fields. - */ - GFElement multiply(GFElement factor) - throws RuntimeException; - - /** - * Compute this * factor (overwrite this). - * - * @param factor the factor - * @throws DifferentFieldsException if the elements are of different fields. - */ - void multiplyThisBy(GFElement factor) - throws RuntimeException; - - /** - * Compute the multiplicative inverse of this element. - * - * @return this-1 (newly created) - * @throws ArithmeticException if this is the zero element. - */ - GFElement invert() - throws ArithmeticException; - - // ///////////////////////////////////////////////////////////////////// - // conversion - // ///////////////////////////////////////////////////////////////////// - - /** - * Returns this element as FlexiBigInt. The conversion is P1363-conform. - * - * @return this element as BigInt - */ - BigInteger toFlexiBigInt(); - - /** - * Returns this element as byte array. The conversion is P1363-conform. - * - * @return this element as byte array - */ - byte[] toByteArray(); - - /** - * Return a String representation of this element. - * - * @return String representation of this element - */ - String toString(); - - /** - * Return a String representation of this element. radix - * specifies the radix of the String representation. - * - * @param radix specifies the radix of the String representation - * @return String representation of this element with the specified radix - */ - String toString(int radix); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GoppaCode.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GoppaCode.java deleted file mode 100644 index c30b29b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/GoppaCode.java +++ /dev/null @@ -1,310 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class describes decoding operations of an irreducible binary Goppa code. - * A check matrix H of the Goppa code and an irreducible Goppa polynomial are - * used the operations are worked over a finite field GF(2^m) - * - * @see GF2mField - * @see PolynomialGF2mSmallM - */ -public final class GoppaCode -{ - - /** - * Default constructor (private). - */ - private GoppaCode() - { - // empty - } - - /** - * This class is a container for two instances of {@link GF2Matrix} and one - * instance of {@link Permutation}. It is used to hold the systematic form - * S*H*P = (Id|M) of the check matrix H as returned by - * {@link GoppaCode#computeSystematicForm(GF2Matrix, SecureRandom)}. - * - * @see GF2Matrix - * @see Permutation - */ - public static class MaMaPe - { - - private GF2Matrix s, h; - - private Permutation p; - - /** - * Construct a new {@link MaMaPe} container with the given parameters. - * - * @param s the first matrix - * @param h the second matrix - * @param p the permutation - */ - public MaMaPe(GF2Matrix s, GF2Matrix h, Permutation p) - { - this.s = s; - this.h = h; - this.p = p; - } - - /** - * @return the first matrix - */ - public GF2Matrix getFirstMatrix() - { - return s; - } - - /** - * @return the second matrix - */ - public GF2Matrix getSecondMatrix() - { - return h; - } - - /** - * @return the permutation - */ - public Permutation getPermutation() - { - return p; - } - } - - /** - * This class is a container for an instance of {@link GF2Matrix} and one - * int[]. It is used to hold a generator matrix and the set of indices such - * that the submatrix of the generator matrix consisting of the specified - * columns is the identity. - * - * @see GF2Matrix - * @see Permutation - */ - public static class MatrixSet - { - - private GF2Matrix g; - - private int[] setJ; - - /** - * Construct a new {@link MatrixSet} container with the given - * parameters. - * - * @param g the generator matrix - * @param setJ the set of indices such that the submatrix of the - * generator matrix consisting of the specified columns - * is the identity - */ - public MatrixSet(GF2Matrix g, int[] setJ) - { - this.g = g; - this.setJ = setJ; - } - - /** - * @return the generator matrix - */ - public GF2Matrix getG() - { - return g; - } - - /** - * @return the set of indices such that the submatrix of the generator - * matrix consisting of the specified columns is the identity - */ - public int[] getSetJ() - { - return setJ; - } - } - - /** - * Construct the check matrix of a Goppa code in canonical form from the - * irreducible Goppa polynomial over the finite field - * GF(2m). - * - * @param field the finite field - * @param gp the irreducible Goppa polynomial - */ - public static GF2Matrix createCanonicalCheckMatrix(GF2mField field, - PolynomialGF2mSmallM gp) - { - int m = field.getDegree(); - int n = 1 << m; - int t = gp.getDegree(); - - /* create matrix H over GF(2^m) */ - - int[][] hArray = new int[t][n]; - - // create matrix YZ - int[][] yz = new int[t][n]; - for (int j = 0; j < n; j++) - { - // here j is used as index and as element of field GF(2^m) - yz[0][j] = field.inverse(gp.evaluateAt(j)); - } - - for (int i = 1; i < t; i++) - { - for (int j = 0; j < n; j++) - { - // here j is used as index and as element of field GF(2^m) - yz[i][j] = field.mult(yz[i - 1][j], j); - } - } - - // create matrix H = XYZ - for (int i = 0; i < t; i++) - { - for (int j = 0; j < n; j++) - { - for (int k = 0; k <= i; k++) - { - hArray[i][j] = field.add(hArray[i][j], field.mult(yz[k][j], - gp.getCoefficient(t + k - i))); - } - } - } - - /* convert to matrix over GF(2) */ - - int[][] result = new int[t * m][(n + 31) >>> 5]; - - for (int j = 0; j < n; j++) - { - int q = j >>> 5; - int r = 1 << (j & 0x1f); - for (int i = 0; i < t; i++) - { - int e = hArray[i][j]; - for (int u = 0; u < m; u++) - { - int b = (e >>> u) & 1; - if (b != 0) - { - int ind = (i + 1) * m - u - 1; - result[ind][q] ^= r; - } - } - } - } - - return new GF2Matrix(n, result); - } - - /** - * Given a check matrix H, compute matrices S, - * M, and a random permutation P such that - * S*H*P = (Id|M). Return S^-1, M, and - * P as {@link MaMaPe}. The matrix (Id | M) is called - * the systematic form of H. - * - * @param h the check matrix - * @param sr a source of randomness - * @return the tuple (S^-1, M, P) - */ - public static MaMaPe computeSystematicForm(GF2Matrix h, SecureRandom sr) - { - int n = h.getNumColumns(); - GF2Matrix hp, sInv; - GF2Matrix s = null; - Permutation p; - boolean found = false; - - do - { - p = new Permutation(n, sr); - hp = (GF2Matrix)h.rightMultiply(p); - sInv = hp.getLeftSubMatrix(); - try - { - found = true; - s = (GF2Matrix)sInv.computeInverse(); - } - catch (ArithmeticException ae) - { - found = false; - } - } - while (!found); - - GF2Matrix shp = (GF2Matrix)s.rightMultiply(hp); - GF2Matrix m = shp.getRightSubMatrix(); - - return new MaMaPe(sInv, m, p); - } - - /** - * Find an error vector e over GF(2) from an input - * syndrome s over GF(2m). - * - * @param syndVec the syndrome - * @param field the finite field - * @param gp the irreducible Goppa polynomial - * @param sqRootMatrix the matrix for computing square roots in - * (GF(2m))t - * @return the error vector - */ - public static GF2Vector syndromeDecode(GF2Vector syndVec, GF2mField field, - PolynomialGF2mSmallM gp, PolynomialGF2mSmallM[] sqRootMatrix) - { - - int n = 1 << field.getDegree(); - - // the error vector - GF2Vector errors = new GF2Vector(n); - - // if the syndrome vector is zero, the error vector is also zero - if (!syndVec.isZero()) - { - // convert syndrome vector to polynomial over GF(2^m) - PolynomialGF2mSmallM syndrome = new PolynomialGF2mSmallM(syndVec - .toExtensionFieldVector(field)); - - // compute T = syndrome^-1 mod gp - PolynomialGF2mSmallM t = syndrome.modInverse(gp); - - // compute tau = sqRoot(T + X) mod gp - PolynomialGF2mSmallM tau = t.addMonomial(1); - tau = tau.modSquareRootMatrix(sqRootMatrix); - - // compute polynomials a and b satisfying a + b*tau = 0 mod gp - PolynomialGF2mSmallM[] ab = tau.modPolynomialToFracton(gp); - - // compute the polynomial a^2 + X*b^2 - PolynomialGF2mSmallM a2 = ab[0].multiply(ab[0]); - PolynomialGF2mSmallM b2 = ab[1].multiply(ab[1]); - PolynomialGF2mSmallM xb2 = b2.multWithMonomial(1); - PolynomialGF2mSmallM a2plusXb2 = a2.add(xb2); - - // normalize a^2 + X*b^2 to obtain the error locator polynomial - int headCoeff = a2plusXb2.getHeadCoefficient(); - int invHeadCoeff = field.inverse(headCoeff); - PolynomialGF2mSmallM elp = a2plusXb2.multWithElement(invHeadCoeff); - - // for all elements i of GF(2^m) - for (int i = 0; i < n; i++) - { - // evaluate the error locator polynomial at i - int z = elp.evaluateAt(i); - // if polynomial evaluates to zero - if (z == 0) - { - // set the i-th coefficient of the error vector - errors.setBit(i); - } - } - } - - return errors; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntUtils.java deleted file mode 100644 index 4662f9c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntUtils.java +++ /dev/null @@ -1,203 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.math.BigInteger; - -/** - * - * - * - */ -public final class IntUtils -{ - - /** - * Default constructor (private). - */ - private IntUtils() - { - // empty - } - - /** - * Compare two int arrays. No null checks are performed. - * - * @param left the first int array - * @param right the second int array - * @return the result of the comparison - */ - public static boolean equals(int[] left, int[] right) - { - if (left.length != right.length) - { - return false; - } - boolean result = true; - for (int i = left.length - 1; i >= 0; i--) - { - result &= left[i] == right[i]; - } - return result; - } - - /** - * Return a clone of the given int array. No null checks are performed. - * - * @param array the array to clone - * @return the clone of the given array - */ - public static int[] clone(int[] array) - { - int[] result = new int[array.length]; - System.arraycopy(array, 0, result, 0, array.length); - return result; - } - - /** - * Fill the given int array with the given value. - * - * @param array the array - * @param value the value - */ - public static void fill(int[] array, int value) - { - for (int i = array.length - 1; i >= 0; i--) - { - array[i] = value; - } - } - - /** - * Sorts this array of integers according to the Quicksort algorithm. After - * calling this method this array is sorted in ascending order with the - * smallest integer taking position 0 in the array. - *

    - *

    - * This implementation is based on the quicksort algorithm as described in - * Data Structures In Java by Thomas A. Standish, Chapter 10, - * ISBN 0-201-30564-X. - * - * @param source the array of integers that needs to be sorted. - */ - public static void quicksort(int[] source) - { - quicksort(source, 0, source.length - 1); - } - - /** - * Sort a subarray of a source array. The subarray is specified by its start - * and end index. - * - * @param source the int array to be sorted - * @param left the start index of the subarray - * @param right the end index of the subarray - */ - public static void quicksort(int[] source, int left, int right) - { - if (right > left) - { - int index = partition(source, left, right, right); - quicksort(source, left, index - 1); - quicksort(source, index + 1, right); - } - } - - /** - * Split a subarray of a source array into two partitions. The left - * partition contains elements that have value less than or equal to the - * pivot element, the right partition contains the elements that have larger - * value. - * - * @param source the int array whose subarray will be splitted - * @param left the start position of the subarray - * @param right the end position of the subarray - * @param pivotIndex the index of the pivot element inside the array - * @return the new index of the pivot element inside the array - */ - private static int partition(int[] source, int left, int right, - int pivotIndex) - { - - int pivot = source[pivotIndex]; - source[pivotIndex] = source[right]; - source[right] = pivot; - - int index = left; - - for (int i = left; i < right; i++) - { - if (source[i] <= pivot) - { - int tmp = source[index]; - source[index] = source[i]; - source[i] = tmp; - index++; - } - } - - int tmp = source[index]; - source[index] = source[right]; - source[right] = tmp; - - return index; - } - - /** - * Generates a subarray of a given int array. - * - * @param input - - * the input int array - * @param start - - * the start index - * @param end - - * the end index - * @return a subarray of input, ranging from start to - * end - */ - public static int[] subArray(final int[] input, final int start, - final int end) - { - int[] result = new int[end - start]; - System.arraycopy(input, start, result, 0, end - start); - return result; - } - - /** - * Convert an int array to a {@link FlexiBigInt} array. - * - * @param input the int array - * @return the {@link FlexiBigInt} array - */ - public static BigInteger[] toFlexiBigIntArray(int[] input) - { - BigInteger[] result = new BigInteger[input.length]; - for (int i = 0; i < input.length; i++) - { - result[i] = BigInteger.valueOf(input[i]); - } - return result; - } - - /** - * @param input an int array - * @return a human readable form of the given int array - */ - public static String toString(int[] input) - { - String result = ""; - for (int i = 0; i < input.length; i++) - { - result += input[i] + " "; - } - return result; - } - - /** - * @param input an int arary - * @return the int array as hex string - */ - public static String toHexString(int[] input) - { - return ByteUtils.toHexString(BigEndianConversions.toByteArray(input)); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntegerFunctions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntegerFunctions.java deleted file mode 100644 index b56f900..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/IntegerFunctions.java +++ /dev/null @@ -1,1424 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * Class of number-theory related functions for use with integers represented as - * int's or BigInteger objects. - */ -public final class IntegerFunctions -{ - - private static final BigInteger ZERO = BigInteger.valueOf(0); - - private static final BigInteger ONE = BigInteger.valueOf(1); - - private static final BigInteger TWO = BigInteger.valueOf(2); - - private static final BigInteger FOUR = BigInteger.valueOf(4); - - private static final int[] SMALL_PRIMES = {3, 5, 7, 11, 13, 17, 19, 23, - 29, 31, 37, 41}; - - private static final long SMALL_PRIME_PRODUCT = 3L * 5 * 7 * 11 * 13 * 17 - * 19 * 23 * 29 * 31 * 37 * 41; - - private static SecureRandom sr = null; - - // the jacobi function uses this lookup table - private static final int[] jacobiTable = {0, 1, 0, -1, 0, -1, 0, 1}; - - private IntegerFunctions() - { - // empty - } - - /** - * Computes the value of the Jacobi symbol (A|B). The following properties - * hold for the Jacobi symbol which makes it a very efficient way to - * evaluate the Legendre symbol - *

    - * (A|B) = 0 IF gcd(A,B) > 1
    - * (-1|B) = 1 IF n = 1 (mod 1)
    - * (-1|B) = -1 IF n = 3 (mod 4)
    - * (A|B) (C|B) = (AC|B)
    - * (A|B) (A|C) = (A|CB)
    - * (A|B) = (C|B) IF A = C (mod B)
    - * (2|B) = 1 IF N = 1 OR 7 (mod 8)
    - * (2|B) = 1 IF N = 3 OR 5 (mod 8) - *

    - * - * @param A integer value - * @param B integer value - * @return value of the jacobi symbol (A|B) - */ - public static int jacobi(BigInteger A, BigInteger B) - { - BigInteger a, b, v; - long k = 1; - - k = 1; - - // test trivial cases - if (B.equals(ZERO)) - { - a = A.abs(); - return a.equals(ONE) ? 1 : 0; - } - - if (!A.testBit(0) && !B.testBit(0)) - { - return 0; - } - - a = A; - b = B; - - if (b.signum() == -1) - { // b < 0 - b = b.negate(); // b = -b - if (a.signum() == -1) - { - k = -1; - } - } - - v = ZERO; - while (!b.testBit(0)) - { - v = v.add(ONE); // v = v + 1 - b = b.divide(TWO); // b = b/2 - } - - if (v.testBit(0)) - { - k = k * jacobiTable[a.intValue() & 7]; - } - - if (a.signum() < 0) - { // a < 0 - if (b.testBit(1)) - { - k = -k; // k = -k - } - a = a.negate(); // a = -a - } - - // main loop - while (a.signum() != 0) - { - v = ZERO; - while (!a.testBit(0)) - { // a is even - v = v.add(ONE); - a = a.divide(TWO); - } - if (v.testBit(0)) - { - k = k * jacobiTable[b.intValue() & 7]; - } - - if (a.compareTo(b) < 0) - { // a < b - // swap and correct intermediate result - BigInteger x = a; - a = b; - b = x; - if (a.testBit(1) && b.testBit(1)) - { - k = -k; - } - } - a = a.subtract(b); - } - - return b.equals(ONE) ? (int)k : 0; - } - - /** - * Computes the square root of a BigInteger modulo a prime employing the - * Shanks-Tonelli algorithm. - * - * @param a value out of which we extract the square root - * @param p prime modulus that determines the underlying field - * @return a number b such that b2 = a (mod p) if - * a is a quadratic residue modulo p. - * @throws NoQuadraticResidueException if a is a quadratic non-residue modulo p - */ - public static BigInteger ressol(BigInteger a, BigInteger p) - throws IllegalArgumentException - { - - BigInteger v = null; - - if (a.compareTo(ZERO) < 0) - { - a = a.add(p); - } - - if (a.equals(ZERO)) - { - return ZERO; - } - - if (p.equals(TWO)) - { - return a; - } - - // p = 3 mod 4 - if (p.testBit(0) && p.testBit(1)) - { - if (jacobi(a, p) == 1) - { // a quadr. residue mod p - v = p.add(ONE); // v = p+1 - v = v.shiftRight(2); // v = v/4 - return a.modPow(v, p); // return a^v mod p - // return --> a^((p+1)/4) mod p - } - throw new IllegalArgumentException("No quadratic residue: " + a + ", " + p); - } - - long t = 0; - - // initialization - // compute k and s, where p = 2^s (2k+1) +1 - - BigInteger k = p.subtract(ONE); // k = p-1 - long s = 0; - while (!k.testBit(0)) - { // while k is even - s++; // s = s+1 - k = k.shiftRight(1); // k = k/2 - } - - k = k.subtract(ONE); // k = k - 1 - k = k.shiftRight(1); // k = k/2 - - // initial values - BigInteger r = a.modPow(k, p); // r = a^k mod p - - BigInteger n = r.multiply(r).remainder(p); // n = r^2 % p - n = n.multiply(a).remainder(p); // n = n * a % p - r = r.multiply(a).remainder(p); // r = r * a %p - - if (n.equals(ONE)) - { - return r; - } - - // non-quadratic residue - BigInteger z = TWO; // z = 2 - while (jacobi(z, p) == 1) - { - // while z quadratic residue - z = z.add(ONE); // z = z + 1 - } - - v = k; - v = v.multiply(TWO); // v = 2k - v = v.add(ONE); // v = 2k + 1 - BigInteger c = z.modPow(v, p); // c = z^v mod p - - // iteration - while (n.compareTo(ONE) == 1) - { // n > 1 - k = n; // k = n - t = s; // t = s - s = 0; - - while (!k.equals(ONE)) - { // k != 1 - k = k.multiply(k).mod(p); // k = k^2 % p - s++; // s = s + 1 - } - - t -= s; // t = t - s - if (t == 0) - { - throw new IllegalArgumentException("No quadratic residue: " + a + ", " + p); - } - - v = ONE; - for (long i = 0; i < t - 1; i++) - { - v = v.shiftLeft(1); // v = 1 * 2^(t - 1) - } - c = c.modPow(v, p); // c = c^v mod p - r = r.multiply(c).remainder(p); // r = r * c % p - c = c.multiply(c).remainder(p); // c = c^2 % p - n = n.multiply(c).mod(p); // n = n * c % p - } - return r; - } - - /** - * Computes the greatest common divisor of the two specified integers - * - * @param u - first integer - * @param v - second integer - * @return gcd(a, b) - */ - public static int gcd(int u, int v) - { - return BigInteger.valueOf(u).gcd(BigInteger.valueOf(v)).intValue(); - } - - /** - * Extended euclidian algorithm (computes gcd and representation). - * - * @param a the first integer - * @param b the second integer - * @return (g,u,v), where g = gcd(abs(a),abs(b)) = ua + vb - */ - public static int[] extGCD(int a, int b) - { - BigInteger ba = BigInteger.valueOf(a); - BigInteger bb = BigInteger.valueOf(b); - BigInteger[] bresult = extgcd(ba, bb); - int[] result = new int[3]; - result[0] = bresult[0].intValue(); - result[1] = bresult[1].intValue(); - result[2] = bresult[2].intValue(); - return result; - } - - public static BigInteger divideAndRound(BigInteger a, BigInteger b) - { - if (a.signum() < 0) - { - return divideAndRound(a.negate(), b).negate(); - } - if (b.signum() < 0) - { - return divideAndRound(a, b.negate()).negate(); - } - return a.shiftLeft(1).add(b).divide(b.shiftLeft(1)); - } - - public static BigInteger[] divideAndRound(BigInteger[] a, BigInteger b) - { - BigInteger[] out = new BigInteger[a.length]; - for (int i = 0; i < a.length; i++) - { - out[i] = divideAndRound(a[i], b); - } - return out; - } - - /** - * Compute the smallest integer that is greater than or equal to the - * logarithm to the base 2 of the given BigInteger. - * - * @param a the integer - * @return ceil[log(a)] - */ - public static int ceilLog(BigInteger a) - { - int result = 0; - BigInteger p = ONE; - while (p.compareTo(a) < 0) - { - result++; - p = p.shiftLeft(1); - } - return result; - } - - /** - * Compute the smallest integer that is greater than or equal to the - * logarithm to the base 2 of the given integer. - * - * @param a the integer - * @return ceil[log(a)] - */ - public static int ceilLog(int a) - { - int log = 0; - int i = 1; - while (i < a) - { - i <<= 1; - log++; - } - return log; - } - - /** - * Compute ceil(log_256 n), the number of bytes needed to encode - * the integer n. - * - * @param n the integer - * @return the number of bytes needed to encode n - */ - public static int ceilLog256(int n) - { - if (n == 0) - { - return 1; - } - int m; - if (n < 0) - { - m = -n; - } - else - { - m = n; - } - - int d = 0; - while (m > 0) - { - d++; - m >>>= 8; - } - return d; - } - - /** - * Compute ceil(log_256 n), the number of bytes needed to encode - * the long integer n. - * - * @param n the long integer - * @return the number of bytes needed to encode n - */ - public static int ceilLog256(long n) - { - if (n == 0) - { - return 1; - } - long m; - if (n < 0) - { - m = -n; - } - else - { - m = n; - } - - int d = 0; - while (m > 0) - { - d++; - m >>>= 8; - } - return d; - } - - /** - * Compute the integer part of the logarithm to the base 2 of the given - * integer. - * - * @param a the integer - * @return floor[log(a)] - */ - public static int floorLog(BigInteger a) - { - int result = -1; - BigInteger p = ONE; - while (p.compareTo(a) <= 0) - { - result++; - p = p.shiftLeft(1); - } - return result; - } - - /** - * Compute the integer part of the logarithm to the base 2 of the given - * integer. - * - * @param a the integer - * @return floor[log(a)] - */ - public static int floorLog(int a) - { - int h = 0; - if (a <= 0) - { - return -1; - } - int p = a >>> 1; - while (p > 0) - { - h++; - p >>>= 1; - } - - return h; - } - - /** - * Compute the largest h with 2^h | a if a!=0. - * - * @param a an integer - * @return the largest h with 2^h | a if a!=0, - * 0 otherwise - */ - public static int maxPower(int a) - { - int h = 0; - if (a != 0) - { - int p = 1; - while ((a & p) == 0) - { - h++; - p <<= 1; - } - } - - return h; - } - - /** - * @param a an integer - * @return the number of ones in the binary representation of an integer - * a - */ - public static int bitCount(int a) - { - int h = 0; - while (a != 0) - { - h += a & 1; - a >>>= 1; - } - - return h; - } - - /** - * determines the order of g modulo p, p prime and 1 < g < p. This algorithm - * is only efficient for small p (see X9.62-1998, p. 68). - * - * @param g an integer with 1 < g < p - * @param p a prime - * @return the order k of g (that is k is the smallest integer with - * gk = 1 mod p - */ - public static int order(int g, int p) - { - int b, j; - - b = g % p; // Reduce g mod p first. - j = 1; - - // Check whether g == 0 mod p (avoiding endless loop). - if (b == 0) - { - throw new IllegalArgumentException(g + " is not an element of Z/(" - + p + "Z)^*; it is not meaningful to compute its order."); - } - - // Compute the order of g mod p: - while (b != 1) - { - b *= g; - b %= p; - if (b < 0) - { - b += p; - } - j++; - } - - return j; - } - - /** - * Reduces an integer into a given interval - * - * @param n - the integer - * @param begin - left bound of the interval - * @param end - right bound of the interval - * @return n reduced into [begin,end] - */ - public static BigInteger reduceInto(BigInteger n, BigInteger begin, - BigInteger end) - { - return n.subtract(begin).mod(end.subtract(begin)).add(begin); - } - - /** - * Compute ae. - * - * @param a the base - * @param e the exponent - * @return ae - */ - public static int pow(int a, int e) - { - int result = 1; - while (e > 0) - { - if ((e & 1) == 1) - { - result *= a; - } - a *= a; - e >>>= 1; - } - return result; - } - - /** - * Compute ae. - * - * @param a the base - * @param e the exponent - * @return ae - */ - public static long pow(long a, int e) - { - long result = 1; - while (e > 0) - { - if ((e & 1) == 1) - { - result *= a; - } - a *= a; - e >>>= 1; - } - return result; - } - - /** - * Compute ae mod n. - * - * @param a the base - * @param e the exponent - * @param n the modulus - * @return ae mod n - */ - public static int modPow(int a, int e, int n) - { - if (n <= 0 || (n * n) > Integer.MAX_VALUE || e < 0) - { - return 0; - } - int result = 1; - a = (a % n + n) % n; - while (e > 0) - { - if ((e & 1) == 1) - { - result = (result * a) % n; - } - a = (a * a) % n; - e >>>= 1; - } - return result; - } - - /** - * Extended euclidian algorithm (computes gcd and representation). - * - * @param a - the first integer - * @param b - the second integer - * @return (d,u,v), where d = gcd(a,b) = ua + vb - */ - public static BigInteger[] extgcd(BigInteger a, BigInteger b) - { - BigInteger u = ONE; - BigInteger v = ZERO; - BigInteger d = a; - if (b.signum() != 0) - { - BigInteger v1 = ZERO; - BigInteger v3 = b; - while (v3.signum() != 0) - { - BigInteger[] tmp = d.divideAndRemainder(v3); - BigInteger q = tmp[0]; - BigInteger t3 = tmp[1]; - BigInteger t1 = u.subtract(q.multiply(v1)); - u = v1; - d = v3; - v1 = t1; - v3 = t3; - } - v = d.subtract(a.multiply(u)).divide(b); - } - return new BigInteger[]{d, u, v}; - } - - /** - * Computation of the least common multiple of a set of BigIntegers. - * - * @param numbers - the set of numbers - * @return the lcm(numbers) - */ - public static BigInteger leastCommonMultiple(BigInteger[] numbers) - { - int n = numbers.length; - BigInteger result = numbers[0]; - for (int i = 1; i < n; i++) - { - BigInteger gcd = result.gcd(numbers[i]); - result = result.multiply(numbers[i]).divide(gcd); - } - return result; - } - - /** - * Returns a long integer whose value is (a mod m). This method - * differs from % in that it always returns a non-negative - * integer. - * - * @param a value on which the modulo operation has to be performed. - * @param m the modulus. - * @return a mod m - */ - public static long mod(long a, long m) - { - long result = a % m; - if (result < 0) - { - result += m; - } - return result; - } - - /** - * Computes the modular inverse of an integer a - * - * @param a - the integer to invert - * @param mod - the modulus - * @return a-1 mod n - */ - public static int modInverse(int a, int mod) - { - return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(mod)) - .intValue(); - } - - /** - * Computes the modular inverse of an integer a - * - * @param a - the integer to invert - * @param mod - the modulus - * @return a-1 mod n - */ - public static long modInverse(long a, long mod) - { - return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(mod)) - .longValue(); - } - - /** - * Tests whether an integer a is power of another integer - * p. - * - * @param a - the first integer - * @param p - the second integer - * @return n if a = p^n or -1 otherwise - */ - public static int isPower(int a, int p) - { - if (a <= 0) - { - return -1; - } - int n = 0; - int d = a; - while (d > 1) - { - if (d % p != 0) - { - return -1; - } - d /= p; - n++; - } - return n; - } - - /** - * Find and return the least non-trivial divisor of an integer a. - * - * @param a - the integer - * @return divisor p >1 or 1 if a = -1,0,1 - */ - public static int leastDiv(int a) - { - if (a < 0) - { - a = -a; - } - if (a == 0) - { - return 1; - } - if ((a & 1) == 0) - { - return 2; - } - int p = 3; - while (p <= (a / p)) - { - if ((a % p) == 0) - { - return p; - } - p += 2; - } - - return a; - } - - /** - * Miller-Rabin-Test, determines wether the given integer is probably prime - * or composite. This method returns true if the given integer is - * prime with probability 1 - 2-20. - * - * @param n the integer to test for primality - * @return true if the given integer is prime with probability - * 2-100, false otherwise - */ - public static boolean isPrime(int n) - { - if (n < 2) - { - return false; - } - if (n == 2) - { - return true; - } - if ((n & 1) == 0) - { - return false; - } - if (n < 42) - { - for (int i = 0; i < SMALL_PRIMES.length; i++) - { - if (n == SMALL_PRIMES[i]) - { - return true; - } - } - } - - if ((n % 3 == 0) || (n % 5 == 0) || (n % 7 == 0) || (n % 11 == 0) - || (n % 13 == 0) || (n % 17 == 0) || (n % 19 == 0) - || (n % 23 == 0) || (n % 29 == 0) || (n % 31 == 0) - || (n % 37 == 0) || (n % 41 == 0)) - { - return false; - } - - return BigInteger.valueOf(n).isProbablePrime(20); - } - - /** - * Short trial-division test to find out whether a number is not prime. This - * test is usually used before a Miller-Rabin primality test. - * - * @param candidate the number to test - * @return true if the number has no factor of the tested primes, - * false if the number is definitely composite - */ - public static boolean passesSmallPrimeTest(BigInteger candidate) - { - final int[] smallPrime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, - 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, - 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, - 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, - 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, - 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, - 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, - 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, - 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, - 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, - 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, - 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, - 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, - 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, - 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, - 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, - 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, - 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, - 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, - 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, - 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499}; - - for (int i = 0; i < smallPrime.length; i++) - { - if (candidate.mod(BigInteger.valueOf(smallPrime[i])).equals( - ZERO)) - { - return false; - } - } - return true; - } - - /** - * Returns the largest prime smaller than the given integer - * - * @param n - upper bound - * @return the largest prime smaller than n, or 1 if - * n <= 2 - */ - public static int nextSmallerPrime(int n) - { - if (n <= 2) - { - return 1; - } - - if (n == 3) - { - return 2; - } - - if ((n & 1) == 0) - { - n--; - } - else - { - n -= 2; - } - - while (n > 3 & !isPrime(n)) - { - n -= 2; - } - return n; - } - - /** - * Compute the next probable prime greater than n with the - * specified certainty. - * - * @param n a integer number - * @param certainty the certainty that the generated number is prime - * @return the next prime greater than n - */ - public static BigInteger nextProbablePrime(BigInteger n, int certainty) - { - - if (n.signum() < 0 || n.signum() == 0 || n.equals(ONE)) - { - return TWO; - } - - BigInteger result = n.add(ONE); - - // Ensure an odd number - if (!result.testBit(0)) - { - result = result.add(ONE); - } - - while (true) - { - // Do cheap "pre-test" if applicable - if (result.bitLength() > 6) - { - long r = result.remainder( - BigInteger.valueOf(SMALL_PRIME_PRODUCT)).longValue(); - if ((r % 3 == 0) || (r % 5 == 0) || (r % 7 == 0) - || (r % 11 == 0) || (r % 13 == 0) || (r % 17 == 0) - || (r % 19 == 0) || (r % 23 == 0) || (r % 29 == 0) - || (r % 31 == 0) || (r % 37 == 0) || (r % 41 == 0)) - { - result = result.add(TWO); - continue; // Candidate is composite; try another - } - } - - // All candidates of bitLength 2 and 3 are prime by this point - if (result.bitLength() < 4) - { - return result; - } - - // The expensive test - if (result.isProbablePrime(certainty)) - { - return result; - } - - result = result.add(TWO); - } - } - - /** - * Compute the next probable prime greater than n with the default - * certainty (20). - * - * @param n a integer number - * @return the next prime greater than n - */ - public static BigInteger nextProbablePrime(BigInteger n) - { - return nextProbablePrime(n, 20); - } - - /** - * Computes the next prime greater than n. - * - * @param n a integer number - * @return the next prime greater than n - */ - public static BigInteger nextPrime(long n) - { - long i; - boolean found = false; - long result = 0; - - if (n <= 1) - { - return BigInteger.valueOf(2); - } - if (n == 2) - { - return BigInteger.valueOf(3); - } - - for (i = n + 1 + (n & 1); (i <= n << 1) && !found; i += 2) - { - for (long j = 3; (j <= i >> 1) && !found; j += 2) - { - if (i % j == 0) - { - found = true; - } - } - if (found) - { - found = false; - } - else - { - result = i; - found = true; - } - } - return BigInteger.valueOf(result); - } - - /** - * Computes the binomial coefficient (n|t) ("n over t"). Formula:
    - *

      - *
    • if n !=0 and t != 0 then (n|t) = Mult(i=1, t): (n-(i-1))/i
    • - *
    • if t = 0 then (n|t) = 1
    • - *
    • if n = 0 and t > 0 then (n|t) = 0
    • - *
    - * - * @param n - the "upper" integer - * @param t - the "lower" integer - * @return the binomialcoefficient "n over t" as BigInteger - */ - public static BigInteger binomial(int n, int t) - { - - BigInteger result = ONE; - - if (n == 0) - { - if (t == 0) - { - return result; - } - return ZERO; - } - - // the property (n|t) = (n|n-t) be used to reduce numbers of operations - if (t > (n >>> 1)) - { - t = n - t; - } - - for (int i = 1; i <= t; i++) - { - result = (result.multiply(BigInteger.valueOf(n - (i - 1)))) - .divide(BigInteger.valueOf(i)); - } - - return result; - } - - public static BigInteger randomize(BigInteger upperBound) - { - if (sr == null) - { - sr = new SecureRandom(); - } - return randomize(upperBound, sr); - } - - public static BigInteger randomize(BigInteger upperBound, - SecureRandom prng) - { - int blen = upperBound.bitLength(); - BigInteger randomNum = BigInteger.valueOf(0); - - if (prng == null) - { - prng = sr != null ? sr : new SecureRandom(); - } - - for (int i = 0; i < 20; i++) - { - randomNum = new BigInteger(blen, prng); - if (randomNum.compareTo(upperBound) < 0) - { - return randomNum; - } - } - return randomNum.mod(upperBound); - } - - /** - * Extract the truncated square root of a BigInteger. - * - * @param a - value out of which we extract the square root - * @return the truncated square root of a - */ - public static BigInteger squareRoot(BigInteger a) - { - int bl; - BigInteger result, remainder, b; - - if (a.compareTo(ZERO) < 0) - { - throw new ArithmeticException( - "cannot extract root of negative number" + a + "."); - } - - bl = a.bitLength(); - result = ZERO; - remainder = ZERO; - - // if the bit length is odd then extra step - if ((bl & 1) != 0) - { - result = result.add(ONE); - bl--; - } - - while (bl > 0) - { - remainder = remainder.multiply(FOUR); - remainder = remainder.add(BigInteger.valueOf((a.testBit(--bl) ? 2 - : 0) - + (a.testBit(--bl) ? 1 : 0))); - b = result.multiply(FOUR).add(ONE); - result = result.multiply(TWO); - if (remainder.compareTo(b) != -1) - { - result = result.add(ONE); - remainder = remainder.subtract(b); - } - } - - return result; - } - - /** - * Takes an approximation of the root from an integer base, using newton's - * algorithm - * - * @param base the base to take the root from - * @param root the root, for example 2 for a square root - */ - public static float intRoot(int base, int root) - { - float gNew = base / root; - float gOld = 0; - int counter = 0; - while (Math.abs(gOld - gNew) > 0.0001) - { - float gPow = floatPow(gNew, root); - while (Float.isInfinite(gPow)) - { - gNew = (gNew + gOld) / 2; - gPow = floatPow(gNew, root); - } - counter += 1; - gOld = gNew; - gNew = gOld - (gPow - base) / (root * floatPow(gOld, root - 1)); - } - return gNew; - } - - /** - * Calculation of a logarithmus of a float param - * - * @param param - * @return - */ - public static float floatLog(float param) - { - double arg = (param - 1) / (param + 1); - double arg2 = arg; - int counter = 1; - float result = (float)arg; - - while (arg2 > 0.001) - { - counter += 2; - arg2 *= arg * arg; - result += (1. / counter) * arg2; - } - return 2 * result; - } - - /** - * int power of a base float, only use for small ints - * - * @param f - * @param i - * @return - */ - public static float floatPow(float f, int i) - { - float g = 1; - for (; i > 0; i--) - { - g *= f; - } - return g; - } - - /** - * calculate the logarithm to the base 2. - * - * @param x any double value - * @return log_2(x) - * @deprecated use MathFunctions.log(double) instead - */ - public static double log(double x) - { - if (x > 0 && x < 1) - { - double d = 1 / x; - double result = -log(d); - return result; - } - - int tmp = 0; - double tmp2 = 1; - double d = x; - - while (d > 2) - { - d = d / 2; - tmp += 1; - tmp2 *= 2; - } - double rem = x / tmp2; - rem = logBKM(rem); - return tmp + rem; - } - - /** - * calculate the logarithm to the base 2. - * - * @param x any long value >=1 - * @return log_2(x) - * @deprecated use MathFunctions.log(long) instead - */ - public static double log(long x) - { - int tmp = floorLog(BigInteger.valueOf(x)); - long tmp2 = 1 << tmp; - double rem = (double)x / (double)tmp2; - rem = logBKM(rem); - return tmp + rem; - } - - /** - * BKM Algorithm to calculate logarithms to the base 2. - * - * @param arg a double value with 1<= arg<= 4.768462058 - * @return log_2(arg) - * @deprecated use MathFunctions.logBKM(double) instead - */ - private static double logBKM(double arg) - { - double ae[] = // A_e[k] = log_2 (1 + 0.5^k) - { - 1.0000000000000000000000000000000000000000000000000000000000000000000000000000, - 0.5849625007211561814537389439478165087598144076924810604557526545410982276485, - 0.3219280948873623478703194294893901758648313930245806120547563958159347765589, - 0.1699250014423123629074778878956330175196288153849621209115053090821964552970, - 0.0874628412503394082540660108104043540112672823448206881266090643866965081686, - 0.0443941193584534376531019906736094674630459333742491317685543002674288465967, - 0.0223678130284545082671320837460849094932677948156179815932199216587899627785, - 0.0112272554232541203378805844158839407281095943600297940811823651462712311786, - 0.0056245491938781069198591026740666017211096815383520359072957784732489771013, - 0.0028150156070540381547362547502839489729507927389771959487826944878598909400, - 0.0014081943928083889066101665016890524233311715793462235597709051792834906001, - 0.0007042690112466432585379340422201964456668872087249334581924550139514213168, - 0.0003521774803010272377989609925281744988670304302127133979341729842842377649, - 0.0001760994864425060348637509459678580940163670081839283659942864068257522373, - 0.0000880524301221769086378699983597183301490534085738474534831071719854721939, - 0.0000440268868273167176441087067175806394819146645511899503059774914593663365, - 0.0000220136113603404964890728830697555571275493801909791504158295359319433723, - 0.0000110068476674814423006223021573490183469930819844945565597452748333526464, - 0.0000055034343306486037230640321058826431606183125807276574241540303833251704, - 0.0000027517197895612831123023958331509538486493412831626219340570294203116559, - 0.0000013758605508411382010566802834037147561973553922354232704569052932922954, - 0.0000006879304394358496786728937442939160483304056131990916985043387874690617, - 0.0000003439652607217645360118314743718005315334062644619363447395987584138324, - 0.0000001719826406118446361936972479533123619972434705828085978955697643547921, - 0.0000000859913228686632156462565208266682841603921494181830811515318381744650, - 0.0000000429956620750168703982940244684787907148132725669106053076409624949917, - 0.0000000214978311976797556164155504126645192380395989504741781512309853438587, - 0.0000000107489156388827085092095702361647949603617203979413516082280717515504, - 0.0000000053744578294520620044408178949217773318785601260677517784797554422804, - 0.0000000026872289172287079490026152352638891824761667284401180026908031182361, - 0.0000000013436144592400232123622589569799954658536700992739887706412976115422, - 0.0000000006718072297764289157920422846078078155859484240808550018085324187007, - 0.0000000003359036149273187853169587152657145221968468364663464125722491530858, - 0.0000000001679518074734354745159899223037458278711244127245990591908996412262, - 0.0000000000839759037391617577226571237484864917411614198675604731728132152582, - 0.0000000000419879518701918839775296677020135040214077417929807824842667285938, - 0.0000000000209939759352486932678195559552767641474249812845414125580747434389, - 0.0000000000104969879676625344536740142096218372850561859495065136990936290929, - 0.0000000000052484939838408141817781356260462777942148580518406975851213868092, - 0.0000000000026242469919227938296243586262369156865545638305682553644113887909, - 0.0000000000013121234959619935994960031017850191710121890821178731821983105443, - 0.0000000000006560617479811459709189576337295395590603644549624717910616347038, - 0.0000000000003280308739906102782522178545328259781415615142931952662153623493, - 0.0000000000001640154369953144623242936888032768768777422997704541618141646683, - 0.0000000000000820077184976595619616930350508356401599552034612281802599177300, - 0.0000000000000410038592488303636807330652208397742314215159774270270147020117, - 0.0000000000000205019296244153275153381695384157073687186580546938331088730952, - 0.0000000000000102509648122077001764119940017243502120046885379813510430378661, - 0.0000000000000051254824061038591928917243090559919209628584150482483994782302, - 0.0000000000000025627412030519318726172939815845367496027046030028595094737777, - 0.0000000000000012813706015259665053515049475574143952543145124550608158430592, - 0.0000000000000006406853007629833949364669629701200556369782295210193569318434, - 0.0000000000000003203426503814917330334121037829290364330169106716787999052925, - 0.0000000000000001601713251907458754080007074659337446341494733882570243497196, - 0.0000000000000000800856625953729399268240176265844257044861248416330071223615, - 0.0000000000000000400428312976864705191179247866966320469710511619971334577509, - 0.0000000000000000200214156488432353984854413866994246781519154793320684126179, - 0.0000000000000000100107078244216177339743404416874899847406043033792202127070, - 0.0000000000000000050053539122108088756700751579281894640362199287591340285355, - 0.0000000000000000025026769561054044400057638132352058574658089256646014899499, - 0.0000000000000000012513384780527022205455634651853807110362316427807660551208, - 0.0000000000000000006256692390263511104084521222346348012116229213309001913762, - 0.0000000000000000003128346195131755552381436585278035120438976487697544916191, - 0.0000000000000000001564173097565877776275512286165232838833090480508502328437, - 0.0000000000000000000782086548782938888158954641464170239072244145219054734086, - 0.0000000000000000000391043274391469444084776945327473574450334092075712154016, - 0.0000000000000000000195521637195734722043713378812583900953755962557525252782, - 0.0000000000000000000097760818597867361022187915943503728909029699365320287407, - 0.0000000000000000000048880409298933680511176764606054809062553340323879609794, - 0.0000000000000000000024440204649466840255609083961603140683286362962192177597, - 0.0000000000000000000012220102324733420127809717395445504379645613448652614939, - 0.0000000000000000000006110051162366710063906152551383735699323415812152114058, - 0.0000000000000000000003055025581183355031953399739107113727036860315024588989, - 0.0000000000000000000001527512790591677515976780735407368332862218276873443537, - 0.0000000000000000000000763756395295838757988410584167137033767056170417508383, - 0.0000000000000000000000381878197647919378994210346199431733717514843471513618, - 0.0000000000000000000000190939098823959689497106436628681671067254111334889005, - 0.0000000000000000000000095469549411979844748553534196582286585751228071408728, - 0.0000000000000000000000047734774705989922374276846068851506055906657137209047, - 0.0000000000000000000000023867387352994961187138442777065843718711089344045782, - 0.0000000000000000000000011933693676497480593569226324192944532044984865894525, - 0.0000000000000000000000005966846838248740296784614396011477934194852481410926, - 0.0000000000000000000000002983423419124370148392307506484490384140516252814304, - 0.0000000000000000000000001491711709562185074196153830361933046331030629430117, - 0.0000000000000000000000000745855854781092537098076934460888486730708440475045, - 0.0000000000000000000000000372927927390546268549038472050424734256652501673274, - 0.0000000000000000000000000186463963695273134274519237230207489851150821191330, - 0.0000000000000000000000000093231981847636567137259618916352525606281553180093, - 0.0000000000000000000000000046615990923818283568629809533488457973317312233323, - 0.0000000000000000000000000023307995461909141784314904785572277779202790023236, - 0.0000000000000000000000000011653997730954570892157452397493151087737428485431, - 0.0000000000000000000000000005826998865477285446078726199923328593402722606924, - 0.0000000000000000000000000002913499432738642723039363100255852559084863397344, - 0.0000000000000000000000000001456749716369321361519681550201473345138307215067, - 0.0000000000000000000000000000728374858184660680759840775119123438968122488047, - 0.0000000000000000000000000000364187429092330340379920387564158411083803465567, - 0.0000000000000000000000000000182093714546165170189960193783228378441837282509, - 0.0000000000000000000000000000091046857273082585094980096891901482445902524441, - 0.0000000000000000000000000000045523428636541292547490048446022564529197237262, - 0.0000000000000000000000000000022761714318270646273745024223029238091160103901}; - int n = 53; - double x = 1; - double y = 0; - double z; - double s = 1; - int k; - - for (k = 0; k < n; k++) - { - z = x + x * s; - if (z <= arg) - { - x = z; - y += ae[k]; - } - s *= 0.5; - } - return y; - } - - public static boolean isIncreasing(int[] a) - { - for (int i = 1; i < a.length; i++) - { - if (a[i - 1] >= a[i]) - { - System.out.println("a[" + (i - 1) + "] = " + a[i - 1] + " >= " - + a[i] + " = a[" + i + "]"); - return false; - } - } - return true; - } - - public static byte[] integerToOctets(BigInteger val) - { - byte[] valBytes = val.abs().toByteArray(); - - // check whether the array includes a sign bit - if ((val.bitLength() & 7) != 0) - { - return valBytes; - } - // get rid of the sign bit (first byte) - byte[] tmp = new byte[val.bitLength() >> 3]; - System.arraycopy(valBytes, 1, tmp, 0, tmp.length); - return tmp; - } - - public static BigInteger octetsToInteger(byte[] data, int offset, - int length) - { - byte[] val = new byte[length + 1]; - - val[0] = 0; - System.arraycopy(data, offset, val, 1, length); - return new BigInteger(val); - } - - public static BigInteger octetsToInteger(byte[] data) - { - return octetsToInteger(data, 0, data.length); - } - - public static void main(String[] args) - { - System.out.println("test"); - // System.out.println(intRoot(37, 5)); - // System.out.println(floatPow((float)2.5, 4)); - System.out.println(floatLog(10)); - System.out.println("test2"); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/LittleEndianConversions.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/LittleEndianConversions.java deleted file mode 100644 index 40b5e2d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/LittleEndianConversions.java +++ /dev/null @@ -1,230 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This is a utility class containing data type conversions using little-endian - * byte order. - * - * @see BigEndianConversions - */ -public final class LittleEndianConversions -{ - - /** - * Default constructor (private). - */ - private LittleEndianConversions() - { - // empty - } - - /** - * Convert an octet string of length 4 to an integer. No length checking is - * performed. - * - * @param input the byte array holding the octet string - * @return an integer representing the octet string input - * @throws ArithmeticException if the length of the given octet string is larger than 4. - */ - public static int OS2IP(byte[] input) - { - return ((input[0] & 0xff)) | ((input[1] & 0xff) << 8) - | ((input[2] & 0xff) << 16) | ((input[3] & 0xff)) << 24; - } - - /** - * Convert an byte array of length 4 beginning at offset into an - * integer. - * - * @param input the byte array - * @param inOff the offset into the byte array - * @return the resulting integer - */ - public static int OS2IP(byte[] input, int inOff) - { - int result = input[inOff++] & 0xff; - result |= (input[inOff++] & 0xff) << 8; - result |= (input[inOff++] & 0xff) << 16; - result |= (input[inOff] & 0xff) << 24; - return result; - } - - /** - * Convert a byte array of the given length beginning at offset - * into an integer. - * - * @param input the byte array - * @param inOff the offset into the byte array - * @param inLen the length of the encoding - * @return the resulting integer - */ - public static int OS2IP(byte[] input, int inOff, int inLen) - { - int result = 0; - for (int i = inLen - 1; i >= 0; i--) - { - result |= (input[inOff + i] & 0xff) << (8 * i); - } - return result; - } - - /** - * Convert a byte array of length 8 beginning at inOff into a - * long integer. - * - * @param input the byte array - * @param inOff the offset into the byte array - * @return the resulting long integer - */ - public static long OS2LIP(byte[] input, int inOff) - { - long result = input[inOff++] & 0xff; - result |= (input[inOff++] & 0xff) << 8; - result |= (input[inOff++] & 0xff) << 16; - result |= ((long)input[inOff++] & 0xff) << 24; - result |= ((long)input[inOff++] & 0xff) << 32; - result |= ((long)input[inOff++] & 0xff) << 40; - result |= ((long)input[inOff++] & 0xff) << 48; - result |= ((long)input[inOff++] & 0xff) << 56; - return result; - } - - /** - * Convert an integer to an octet string of length 4. - * - * @param x the integer to convert - * @return the converted integer - */ - public static byte[] I2OSP(int x) - { - byte[] result = new byte[4]; - result[0] = (byte)x; - result[1] = (byte)(x >>> 8); - result[2] = (byte)(x >>> 16); - result[3] = (byte)(x >>> 24); - return result; - } - - /** - * Convert an integer into a byte array beginning at the specified offset. - * - * @param value the integer to convert - * @param output the byte array to hold the result - * @param outOff the integer offset into the byte array - */ - public static void I2OSP(int value, byte[] output, int outOff) - { - output[outOff++] = (byte)value; - output[outOff++] = (byte)(value >>> 8); - output[outOff++] = (byte)(value >>> 16); - output[outOff++] = (byte)(value >>> 24); - } - - /** - * Convert an integer to a byte array beginning at the specified offset. No - * length checking is performed (i.e., if the integer cannot be encoded with - * length octets, it is truncated). - * - * @param value the integer to convert - * @param output the byte array to hold the result - * @param outOff the integer offset into the byte array - * @param outLen the length of the encoding - */ - public static void I2OSP(int value, byte[] output, int outOff, int outLen) - { - for (int i = outLen - 1; i >= 0; i--) - { - output[outOff + i] = (byte)(value >>> (8 * i)); - } - } - - /** - * Convert an integer to a byte array of length 8. - * - * @param input the integer to convert - * @return the converted integer - */ - public static byte[] I2OSP(long input) - { - byte[] output = new byte[8]; - output[0] = (byte)input; - output[1] = (byte)(input >>> 8); - output[2] = (byte)(input >>> 16); - output[3] = (byte)(input >>> 24); - output[4] = (byte)(input >>> 32); - output[5] = (byte)(input >>> 40); - output[6] = (byte)(input >>> 48); - output[7] = (byte)(input >>> 56); - return output; - } - - /** - * Convert an integer to a byte array of length 8. - * - * @param input the integer to convert - * @param output byte array holding the output - * @param outOff offset in output array where the result is stored - */ - public static void I2OSP(long input, byte[] output, int outOff) - { - output[outOff++] = (byte)input; - output[outOff++] = (byte)(input >>> 8); - output[outOff++] = (byte)(input >>> 16); - output[outOff++] = (byte)(input >>> 24); - output[outOff++] = (byte)(input >>> 32); - output[outOff++] = (byte)(input >>> 40); - output[outOff++] = (byte)(input >>> 48); - output[outOff] = (byte)(input >>> 56); - } - - /** - * Convert an int array to a byte array of the specified length. No length - * checking is performed (i.e., if the last integer cannot be encoded with - * length % 4 octets, it is truncated). - * - * @param input the int array - * @param outLen the length of the converted array - * @return the converted array - */ - public static byte[] toByteArray(int[] input, int outLen) - { - int intLen = input.length; - byte[] result = new byte[outLen]; - int index = 0; - for (int i = 0; i <= intLen - 2; i++, index += 4) - { - I2OSP(input[i], result, index); - } - I2OSP(input[intLen - 1], result, index, outLen - index); - return result; - } - - /** - * Convert a byte array to an int array. - * - * @param input the byte array - * @return the converted array - */ - public static int[] toIntArray(byte[] input) - { - int intLen = (input.length + 3) / 4; - int lastLen = input.length & 0x03; - int[] result = new int[intLen]; - - int index = 0; - for (int i = 0; i <= intLen - 2; i++, index += 4) - { - result[i] = OS2IP(input, index); - } - if (lastLen != 0) - { - result[intLen - 1] = OS2IP(input, index, lastLen); - } - else - { - result[intLen - 1] = OS2IP(input, index); - } - - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Matrix.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Matrix.java deleted file mode 100644 index 793d79c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Matrix.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This abstract class defines matrices. It holds the number of rows and the - * number of columns of the matrix and defines some basic methods. - */ -public abstract class Matrix -{ - - /** - * number of rows - */ - protected int numRows; - - /** - * number of columns - */ - protected int numColumns; - - // ---------------------------------------------------- - // some constants (matrix types) - // ---------------------------------------------------- - - /** - * zero matrix - */ - public static final char MATRIX_TYPE_ZERO = 'Z'; - - /** - * unit matrix - */ - public static final char MATRIX_TYPE_UNIT = 'I'; - - /** - * random lower triangular matrix - */ - public static final char MATRIX_TYPE_RANDOM_LT = 'L'; - - /** - * random upper triangular matrix - */ - public static final char MATRIX_TYPE_RANDOM_UT = 'U'; - - /** - * random regular matrix - */ - public static final char MATRIX_TYPE_RANDOM_REGULAR = 'R'; - - // ---------------------------------------------------- - // getters - // ---------------------------------------------------- - - /** - * @return the number of rows in the matrix - */ - public int getNumRows() - { - return numRows; - } - - /** - * @return the number of columns in the binary matrix - */ - public int getNumColumns() - { - return numColumns; - } - - /** - * @return the encoded matrix, i.e., this matrix in byte array form. - */ - public abstract byte[] getEncoded(); - - // ---------------------------------------------------- - // arithmetic - // ---------------------------------------------------- - - /** - * Compute the inverse of this matrix. - * - * @return the inverse of this matrix (newly created). - */ - public abstract Matrix computeInverse(); - - /** - * Check if this is the zero matrix (i.e., all entries are zero). - * - * @return true if this is the zero matrix - */ - public abstract boolean isZero(); - - /** - * Compute the product of this matrix and another matrix. - * - * @param a the other matrix - * @return this * a (newly created) - */ - public abstract Matrix rightMultiply(Matrix a); - - /** - * Compute the product of this matrix and a permutation. - * - * @param p the permutation - * @return this * p (newly created) - */ - public abstract Matrix rightMultiply(Permutation p); - - /** - * Compute the product of a vector and this matrix. If the length of the - * vector is greater than the number of rows of this matrix, the matrix is - * multiplied by each m-bit part of the vector. - * - * @param vector a vector - * @return vector * this (newly created) - */ - public abstract Vector leftMultiply(Vector vector); - - /** - * Compute the product of this matrix and a vector. - * - * @param vector a vector - * @return this * vector (newly created) - */ - public abstract Vector rightMultiply(Vector vector); - - /** - * @return a human readable form of the matrix. - */ - public abstract String toString(); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Permutation.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Permutation.java deleted file mode 100644 index 364db3b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Permutation.java +++ /dev/null @@ -1,247 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class implements permutations of the set {0,1,...,n-1} for some given n - * > 0, i.e., ordered sequences containing each number m (0 <= - * m < n) - * once and only once. - */ -public class Permutation -{ - - /** - * perm holds the elements of the permutation vector, i.e. [perm(0), - * perm(1), ..., perm(n-1)] - */ - private int[] perm; - - /** - * Create the identity permutation of the given size. - * - * @param n the size of the permutation - */ - public Permutation(int n) - { - if (n <= 0) - { - throw new IllegalArgumentException("invalid length"); - } - - perm = new int[n]; - for (int i = n - 1; i >= 0; i--) - { - perm[i] = i; - } - } - - /** - * Create a permutation using the given permutation vector. - * - * @param perm the permutation vector - */ - public Permutation(int[] perm) - { - if (!isPermutation(perm)) - { - throw new IllegalArgumentException( - "array is not a permutation vector"); - } - - this.perm = IntUtils.clone(perm); - } - - /** - * Create a permutation from an encoded permutation. - * - * @param enc the encoded permutation - */ - public Permutation(byte[] enc) - { - if (enc.length <= 4) - { - throw new IllegalArgumentException("invalid encoding"); - } - - int n = LittleEndianConversions.OS2IP(enc, 0); - int size = IntegerFunctions.ceilLog256(n - 1); - - if (enc.length != 4 + n * size) - { - throw new IllegalArgumentException("invalid encoding"); - } - - perm = new int[n]; - for (int i = 0; i < n; i++) - { - perm[i] = LittleEndianConversions.OS2IP(enc, 4 + i * size, size); - } - - if (!isPermutation(perm)) - { - throw new IllegalArgumentException("invalid encoding"); - } - - } - - /** - * Create a random permutation of the given size. - * - * @param n the size of the permutation - * @param sr the source of randomness - */ - public Permutation(int n, SecureRandom sr) - { - if (n <= 0) - { - throw new IllegalArgumentException("invalid length"); - } - - perm = new int[n]; - - int[] help = new int[n]; - for (int i = 0; i < n; i++) - { - help[i] = i; - } - - int k = n; - for (int j = 0; j < n; j++) - { - int i = RandUtils.nextInt(sr, k); - k--; - perm[j] = help[i]; - help[i] = help[k]; - } - } - - /** - * Encode this permutation as byte array. - * - * @return the encoded permutation - */ - public byte[] getEncoded() - { - int n = perm.length; - int size = IntegerFunctions.ceilLog256(n - 1); - byte[] result = new byte[4 + n * size]; - LittleEndianConversions.I2OSP(n, result, 0); - for (int i = 0; i < n; i++) - { - LittleEndianConversions.I2OSP(perm[i], result, 4 + i * size, size); - } - return result; - } - - /** - * @return the permutation vector (perm(0),perm(1),...,perm(n-1)) - */ - public int[] getVector() - { - return IntUtils.clone(perm); - } - - /** - * Compute the inverse permutation P-1. - * - * @return this-1 - */ - public Permutation computeInverse() - { - Permutation result = new Permutation(perm.length); - for (int i = perm.length - 1; i >= 0; i--) - { - result.perm[perm[i]] = i; - } - return result; - } - - /** - * Compute the product of this permutation and another permutation. - * - * @param p the other permutation - * @return this * p - */ - public Permutation rightMultiply(Permutation p) - { - if (p.perm.length != perm.length) - { - throw new IllegalArgumentException("length mismatch"); - } - Permutation result = new Permutation(perm.length); - for (int i = perm.length - 1; i >= 0; i--) - { - result.perm[i] = perm[p.perm[i]]; - } - return result; - } - - /** - * checks if given object is equal to this permutation. - *

    - * The method returns false whenever the given object is not permutation. - * - * @param other - - * permutation - * @return true or false - */ - public boolean equals(Object other) - { - - if (!(other instanceof Permutation)) - { - return false; - } - Permutation otherPerm = (Permutation)other; - - return IntUtils.equals(perm, otherPerm.perm); - } - - /** - * @return a human readable form of the permutation - */ - public String toString() - { - String result = "[" + perm[0]; - for (int i = 1; i < perm.length; i++) - { - result += ", " + perm[i]; - } - result += "]"; - return result; - } - - /** - * @return the hash code of this permutation - */ - public int hashCode() - { - return perm.hashCode(); - } - - /** - * Check that the given array corresponds to a permutation of the set - * {0, 1, ..., n-1}. - * - * @param perm permutation vector - * @return true if perm represents an n-permutation and false otherwise - */ - private boolean isPermutation(int[] perm) - { - int n = perm.length; - boolean[] onlyOnce = new boolean[n]; - - for (int i = 0; i < n; i++) - { - if ((perm[i] < 0) || (perm[i] >= n) || onlyOnce[perm[i]]) - { - return false; - } - onlyOnce[perm[i]] = true; - } - - return true; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialGF2mSmallM.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialGF2mSmallM.java deleted file mode 100644 index d37b579..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialGF2mSmallM.java +++ /dev/null @@ -1,1125 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -/** - * This class describes operations with polynomials from the ring R = - * GF(2^m)[X], where 2 <= m <=31. - * - * @see GF2mField - * @see PolynomialRingGF2m - */ -public class PolynomialGF2mSmallM -{ - - /** - * the finite field GF(2^m) - */ - private GF2mField field; - - /** - * the degree of this polynomial - */ - private int degree; - - /** - * For the polynomial representation the map f: R->Z*, - * poly(X) -> [coef_0, coef_1, ...] is used, where - * coef_i is the ith coefficient of the polynomial - * represented as int (see {@link GF2mField}). The polynomials are stored - * as int arrays. - */ - private int[] coefficients; - - /* - * some types of polynomials - */ - - /** - * Constant used for polynomial construction (see constructor - * {@link #PolynomialGF2mSmallM(GF2mField, int, char, SecureRandom)}). - */ - public static final char RANDOM_IRREDUCIBLE_POLYNOMIAL = 'I'; - - /** - * Construct the zero polynomial over the finite field GF(2^m). - * - * @param field the finite field GF(2^m) - */ - public PolynomialGF2mSmallM(GF2mField field) - { - this.field = field; - degree = -1; - coefficients = new int[1]; - } - - /** - * Construct a polynomial over the finite field GF(2^m). - * - * @param field the finite field GF(2^m) - * @param deg degree of polynomial - * @param typeOfPolynomial type of polynomial - * @param sr PRNG - */ - public PolynomialGF2mSmallM(GF2mField field, int deg, - char typeOfPolynomial, SecureRandom sr) - { - this.field = field; - - switch (typeOfPolynomial) - { - case PolynomialGF2mSmallM.RANDOM_IRREDUCIBLE_POLYNOMIAL: - coefficients = createRandomIrreduciblePolynomial(deg, sr); - break; - default: - throw new IllegalArgumentException(" Error: type " - + typeOfPolynomial - + " is not defined for GF2smallmPolynomial"); - } - computeDegree(); - } - - /** - * Create an irreducible polynomial with the given degree over the field - * GF(2^m). - * - * @param deg polynomial degree - * @param sr source of randomness - * @return the generated irreducible polynomial - */ - private int[] createRandomIrreduciblePolynomial(int deg, SecureRandom sr) - { - int[] resCoeff = new int[deg + 1]; - resCoeff[deg] = 1; - resCoeff[0] = field.getRandomNonZeroElement(sr); - for (int i = 1; i < deg; i++) - { - resCoeff[i] = field.getRandomElement(sr); - } - while (!isIrreducible(resCoeff)) - { - int n = RandUtils.nextInt(sr, deg); - if (n == 0) - { - resCoeff[0] = field.getRandomNonZeroElement(sr); - } - else - { - resCoeff[n] = field.getRandomElement(sr); - } - } - return resCoeff; - } - - /** - * Construct a monomial of the given degree over the finite field GF(2^m). - * - * @param field the finite field GF(2^m) - * @param degree the degree of the monomial - */ - public PolynomialGF2mSmallM(GF2mField field, int degree) - { - this.field = field; - this.degree = degree; - coefficients = new int[degree + 1]; - coefficients[degree] = 1; - } - - /** - * Construct the polynomial over the given finite field GF(2^m) from the - * given coefficient vector. - * - * @param field finite field GF2m - * @param coeffs the coefficient vector - */ - public PolynomialGF2mSmallM(GF2mField field, int[] coeffs) - { - this.field = field; - coefficients = normalForm(coeffs); - computeDegree(); - } - - /** - * Create a polynomial over the finite field GF(2^m). - * - * @param field the finite field GF(2^m) - * @param enc byte[] polynomial in byte array form - */ - public PolynomialGF2mSmallM(GF2mField field, byte[] enc) - { - this.field = field; - - // decodes polynomial - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - if ((enc.length % count) != 0) - { - throw new IllegalArgumentException( - " Error: byte array is not encoded polynomial over given finite field GF2m"); - } - - coefficients = new int[enc.length / count]; - count = 0; - for (int i = 0; i < coefficients.length; i++) - { - for (int j = 0; j < d; j += 8) - { - coefficients[i] ^= (enc[count++] & 0x000000ff) << j; - } - if (!this.field.isElementOfThisField(coefficients[i])) - { - throw new IllegalArgumentException( - " Error: byte array is not encoded polynomial over given finite field GF2m"); - } - } - // if HC = 0 for non-zero polynomial, returns error - if ((coefficients.length != 1) - && (coefficients[coefficients.length - 1] == 0)) - { - throw new IllegalArgumentException( - " Error: byte array is not encoded polynomial over given finite field GF2m"); - } - computeDegree(); - } - - /** - * Copy constructor. - * - * @param other another {@link PolynomialGF2mSmallM} - */ - public PolynomialGF2mSmallM(PolynomialGF2mSmallM other) - { - // field needs not to be cloned since it is immutable - field = other.field; - degree = other.degree; - coefficients = IntUtils.clone(other.coefficients); - } - - /** - * Create a polynomial over the finite field GF(2^m) out of the given - * coefficient vector. The finite field is also obtained from the - * {@link GF2mVector}. - * - * @param vect the coefficient vector - */ - public PolynomialGF2mSmallM(GF2mVector vect) - { - this(vect.getField(), vect.getIntArrayForm()); - } - - /* - * ------------------------ - */ - - /** - * Return the degree of this polynomial - * - * @return int degree of this polynomial if this is zero polynomial return - * -1 - */ - public int getDegree() - { - int d = coefficients.length - 1; - if (coefficients[d] == 0) - { - return -1; - } - return d; - } - - /** - * @return the head coefficient of this polynomial - */ - public int getHeadCoefficient() - { - if (degree == -1) - { - return 0; - } - return coefficients[degree]; - } - - /** - * Return the head coefficient of a polynomial. - * - * @param a the polynomial - * @return the head coefficient of a - */ - private static int headCoefficient(int[] a) - { - int degree = computeDegree(a); - if (degree == -1) - { - return 0; - } - return a[degree]; - } - - /** - * Return the coefficient with the given index. - * - * @param index the index - * @return the coefficient with the given index - */ - public int getCoefficient(int index) - { - if ((index < 0) || (index > degree)) - { - return 0; - } - return coefficients[index]; - } - - /** - * Returns encoded polynomial, i.e., this polynomial in byte array form - * - * @return the encoded polynomial - */ - public byte[] getEncoded() - { - int d = 8; - int count = 1; - while (field.getDegree() > d) - { - count++; - d += 8; - } - - byte[] res = new byte[coefficients.length * count]; - count = 0; - for (int i = 0; i < coefficients.length; i++) - { - for (int j = 0; j < d; j += 8) - { - res[count++] = (byte)(coefficients[i] >>> j); - } - } - - return res; - } - - /** - * Evaluate this polynomial p at a value e (in - * GF(2^m)) with the Horner scheme. - * - * @param e the element of the finite field GF(2^m) - * @return this(e) - */ - public int evaluateAt(int e) - { - int result = coefficients[degree]; - for (int i = degree - 1; i >= 0; i--) - { - result = field.mult(result, e) ^ coefficients[i]; - } - return result; - } - - /** - * Compute the sum of this polynomial and the given polynomial. - * - * @param addend the addend - * @return this + a (newly created) - */ - public PolynomialGF2mSmallM add(PolynomialGF2mSmallM addend) - { - int[] resultCoeff = add(coefficients, addend.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Add the given polynomial to this polynomial (overwrite this). - * - * @param addend the addend - */ - public void addToThis(PolynomialGF2mSmallM addend) - { - coefficients = add(coefficients, addend.coefficients); - computeDegree(); - } - - /** - * Compute the sum of two polynomials a and b over the finite field - * GF(2^m). - * - * @param a the first polynomial - * @param b the second polynomial - * @return a + b - */ - private int[] add(int[] a, int[] b) - { - int[] result, addend; - if (a.length < b.length) - { - result = new int[b.length]; - System.arraycopy(b, 0, result, 0, b.length); - addend = a; - } - else - { - result = new int[a.length]; - System.arraycopy(a, 0, result, 0, a.length); - addend = b; - } - - for (int i = addend.length - 1; i >= 0; i--) - { - result[i] = field.add(result[i], addend[i]); - } - - return result; - } - - /** - * Compute the sum of this polynomial and the monomial of the given degree. - * - * @param degree the degree of the monomial - * @return this + X^k - */ - public PolynomialGF2mSmallM addMonomial(int degree) - { - int[] monomial = new int[degree + 1]; - monomial[degree] = 1; - int[] resultCoeff = add(coefficients, monomial); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the product of this polynomial with an element from GF(2^m). - * - * @param element an element of the finite field GF(2^m) - * @return this * element (newly created) - * @throws ArithmeticException if element is not an element of the finite - * field this polynomial is defined over. - */ - public PolynomialGF2mSmallM multWithElement(int element) - { - if (!field.isElementOfThisField(element)) - { - throw new ArithmeticException( - "Not an element of the finite field this polynomial is defined over."); - } - int[] resultCoeff = multWithElement(coefficients, element); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Multiply this polynomial with an element from GF(2^m). - * - * @param element an element of the finite field GF(2^m) - * @throws ArithmeticException if element is not an element of the finite - * field this polynomial is defined over. - */ - public void multThisWithElement(int element) - { - if (!field.isElementOfThisField(element)) - { - throw new ArithmeticException( - "Not an element of the finite field this polynomial is defined over."); - } - coefficients = multWithElement(coefficients, element); - computeDegree(); - } - - /** - * Compute the product of a polynomial a with an element from the finite - * field GF(2^m). - * - * @param a the polynomial - * @param element an element of the finite field GF(2^m) - * @return a * element - */ - private int[] multWithElement(int[] a, int element) - { - int degree = computeDegree(a); - if (degree == -1 || element == 0) - { - return new int[1]; - } - - if (element == 1) - { - return IntUtils.clone(a); - } - - int[] result = new int[degree + 1]; - for (int i = degree; i >= 0; i--) - { - result[i] = field.mult(a[i], element); - } - - return result; - } - - /** - * Compute the product of this polynomial with a monomial X^k. - * - * @param k the degree of the monomial - * @return this * X^k - */ - public PolynomialGF2mSmallM multWithMonomial(int k) - { - int[] resultCoeff = multWithMonomial(coefficients, k); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the product of a polynomial with a monomial X^k. - * - * @param a the polynomial - * @param k the degree of the monomial - * @return a * X^k - */ - private static int[] multWithMonomial(int[] a, int k) - { - int d = computeDegree(a); - if (d == -1) - { - return new int[1]; - } - int[] result = new int[d + k + 1]; - System.arraycopy(a, 0, result, k, d + 1); - return result; - } - - /** - * Divide this polynomial by the given polynomial. - * - * @param f a polynomial - * @return polynomial pair = {q,r} where this = q*f+r and deg(r) < - * deg(f); - */ - public PolynomialGF2mSmallM[] div(PolynomialGF2mSmallM f) - { - int[][] resultCoeffs = div(coefficients, f.coefficients); - return new PolynomialGF2mSmallM[]{ - new PolynomialGF2mSmallM(field, resultCoeffs[0]), - new PolynomialGF2mSmallM(field, resultCoeffs[1])}; - } - - /** - * Compute the result of the division of two polynomials over the field - * GF(2^m). - * - * @param a the first polynomial - * @param f the second polynomial - * @return int[][] {q,r}, where a = q*f+r and deg(r) < deg(f); - */ - private int[][] div(int[] a, int[] f) - { - int df = computeDegree(f); - int da = computeDegree(a) + 1; - if (df == -1) - { - throw new ArithmeticException("Division by zero."); - } - int[][] result = new int[2][]; - result[0] = new int[1]; - result[1] = new int[da]; - int hc = headCoefficient(f); - hc = field.inverse(hc); - result[0][0] = 0; - System.arraycopy(a, 0, result[1], 0, result[1].length); - while (df <= computeDegree(result[1])) - { - int[] q; - int[] coeff = new int[1]; - coeff[0] = field.mult(headCoefficient(result[1]), hc); - q = multWithElement(f, coeff[0]); - int n = computeDegree(result[1]) - df; - q = multWithMonomial(q, n); - coeff = multWithMonomial(coeff, n); - result[0] = add(coeff, result[0]); - result[1] = add(q, result[1]); - } - return result; - } - - /** - * Return the greatest common divisor of this and a polynomial f - * - * @param f polynomial - * @return GCD(this, f) - */ - public PolynomialGF2mSmallM gcd(PolynomialGF2mSmallM f) - { - int[] resultCoeff = gcd(coefficients, f.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Return the greatest common divisor of two polynomials over the field - * GF(2^m). - * - * @param f the first polynomial - * @param g the second polynomial - * @return gcd(f, g) - */ - private int[] gcd(int[] f, int[] g) - { - int[] a = f; - int[] b = g; - if (computeDegree(a) == -1) - { - return b; - } - while (computeDegree(b) != -1) - { - int[] c = mod(a, b); - a = new int[b.length]; - System.arraycopy(b, 0, a, 0, a.length); - b = new int[c.length]; - System.arraycopy(c, 0, b, 0, b.length); - } - int coeff = field.inverse(headCoefficient(a)); - return multWithElement(a, coeff); - } - - /** - * Compute the product of this polynomial and the given factor using a - * Karatzuba like scheme. - * - * @param factor the polynomial - * @return this * factor - */ - public PolynomialGF2mSmallM multiply(PolynomialGF2mSmallM factor) - { - int[] resultCoeff = multiply(coefficients, factor.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the product of two polynomials over the field GF(2^m) - * using a Karatzuba like multiplication. - * - * @param a the first polynomial - * @param b the second polynomial - * @return a * b - */ - private int[] multiply(int[] a, int[] b) - { - int[] mult1, mult2; - if (computeDegree(a) < computeDegree(b)) - { - mult1 = b; - mult2 = a; - } - else - { - mult1 = a; - mult2 = b; - } - - mult1 = normalForm(mult1); - mult2 = normalForm(mult2); - - if (mult2.length == 1) - { - return multWithElement(mult1, mult2[0]); - } - - int d1 = mult1.length; - int d2 = mult2.length; - int[] result = new int[d1 + d2 - 1]; - - if (d2 != d1) - { - int[] res1 = new int[d2]; - int[] res2 = new int[d1 - d2]; - System.arraycopy(mult1, 0, res1, 0, res1.length); - System.arraycopy(mult1, d2, res2, 0, res2.length); - res1 = multiply(res1, mult2); - res2 = multiply(res2, mult2); - res2 = multWithMonomial(res2, d2); - result = add(res1, res2); - } - else - { - d2 = (d1 + 1) >>> 1; - int d = d1 - d2; - int[] firstPartMult1 = new int[d2]; - int[] firstPartMult2 = new int[d2]; - int[] secondPartMult1 = new int[d]; - int[] secondPartMult2 = new int[d]; - System - .arraycopy(mult1, 0, firstPartMult1, 0, - firstPartMult1.length); - System.arraycopy(mult1, d2, secondPartMult1, 0, - secondPartMult1.length); - System - .arraycopy(mult2, 0, firstPartMult2, 0, - firstPartMult2.length); - System.arraycopy(mult2, d2, secondPartMult2, 0, - secondPartMult2.length); - int[] helpPoly1 = add(firstPartMult1, secondPartMult1); - int[] helpPoly2 = add(firstPartMult2, secondPartMult2); - int[] res1 = multiply(firstPartMult1, firstPartMult2); - int[] res2 = multiply(helpPoly1, helpPoly2); - int[] res3 = multiply(secondPartMult1, secondPartMult2); - res2 = add(res2, res1); - res2 = add(res2, res3); - res3 = multWithMonomial(res3, d2); - result = add(res2, res3); - result = multWithMonomial(result, d2); - result = add(result, res1); - } - - return result; - } - - /* - * ---------------- PART II ---------------- - * - */ - - /** - * Check a polynomial for irreducibility over the field GF(2^m). - * - * @param a the polynomial to check - * @return true if a is irreducible, false otherwise - */ - private boolean isIrreducible(int[] a) - { - if (a[0] == 0) - { - return false; - } - int d = computeDegree(a) >> 1; - int[] u = {0, 1}; - final int[] Y = {0, 1}; - int fieldDegree = field.getDegree(); - for (int i = 0; i < d; i++) - { - for (int j = fieldDegree - 1; j >= 0; j--) - { - u = modMultiply(u, u, a); - } - u = normalForm(u); - int[] g = gcd(add(u, Y), a); - if (computeDegree(g) != 0) - { - return false; - } - } - return true; - } - - /** - * Reduce this polynomial modulo another polynomial. - * - * @param f the reduction polynomial - * @return this mod f - */ - public PolynomialGF2mSmallM mod(PolynomialGF2mSmallM f) - { - int[] resultCoeff = mod(coefficients, f.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Reduce a polynomial modulo another polynomial. - * - * @param a the polynomial - * @param f the reduction polynomial - * @return a mod f - */ - private int[] mod(int[] a, int[] f) - { - int df = computeDegree(f); - if (df == -1) - { - throw new ArithmeticException("Division by zero"); - } - int[] result = new int[a.length]; - int hc = headCoefficient(f); - hc = field.inverse(hc); - System.arraycopy(a, 0, result, 0, result.length); - while (df <= computeDegree(result)) - { - int[] q; - int coeff = field.mult(headCoefficient(result), hc); - q = multWithMonomial(f, computeDegree(result) - df); - q = multWithElement(q, coeff); - result = add(q, result); - } - return result; - } - - /** - * Compute the product of this polynomial and another polynomial modulo a - * third polynomial. - * - * @param a another polynomial - * @param b the reduction polynomial - * @return this * a mod b - */ - public PolynomialGF2mSmallM modMultiply(PolynomialGF2mSmallM a, - PolynomialGF2mSmallM b) - { - int[] resultCoeff = modMultiply(coefficients, a.coefficients, - b.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Square this polynomial using a squaring matrix. - * - * @param matrix the squaring matrix - * @return this^2 modulo the reduction polynomial implicitly - * given via the squaring matrix - */ - public PolynomialGF2mSmallM modSquareMatrix(PolynomialGF2mSmallM[] matrix) - { - - int length = matrix.length; - - int[] resultCoeff = new int[length]; - int[] thisSquare = new int[length]; - - // square each entry of this polynomial - for (int i = 0; i < coefficients.length; i++) - { - thisSquare[i] = field.mult(coefficients[i], coefficients[i]); - } - - // do matrix-vector multiplication - for (int i = 0; i < length; i++) - { - // compute scalar product of i-th row and coefficient vector - for (int j = 0; j < length; j++) - { - if (i >= matrix[j].coefficients.length) - { - continue; - } - int scalarTerm = field.mult(matrix[j].coefficients[i], - thisSquare[j]); - resultCoeff[i] = field.add(resultCoeff[i], scalarTerm); - } - } - - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the product of two polynomials modulo a third polynomial over the - * finite field GF(2^m). - * - * @param a the first polynomial - * @param b the second polynomial - * @param g the reduction polynomial - * @return a * b mod g - */ - private int[] modMultiply(int[] a, int[] b, int[] g) - { - return mod(multiply(a, b), g); - } - - /** - * Compute the square root of this polynomial modulo the given polynomial. - * - * @param a the reduction polynomial - * @return this^(1/2) mod a - */ - public PolynomialGF2mSmallM modSquareRoot(PolynomialGF2mSmallM a) - { - int[] resultCoeff = IntUtils.clone(coefficients); - int[] help = modMultiply(resultCoeff, resultCoeff, a.coefficients); - while (!isEqual(help, coefficients)) - { - resultCoeff = normalForm(help); - help = modMultiply(resultCoeff, resultCoeff, a.coefficients); - } - - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the square root of this polynomial using a square root matrix. - * - * @param matrix the matrix for computing square roots in - * (GF(2^m))^t the polynomial ring defining the - * square root matrix - * @return this^(1/2) modulo the reduction polynomial implicitly - * given via the square root matrix - */ - public PolynomialGF2mSmallM modSquareRootMatrix( - PolynomialGF2mSmallM[] matrix) - { - - int length = matrix.length; - - int[] resultCoeff = new int[length]; - - // do matrix multiplication - for (int i = 0; i < length; i++) - { - // compute scalar product of i-th row and j-th column - for (int j = 0; j < length; j++) - { - if (i >= matrix[j].coefficients.length) - { - continue; - } - if (j < coefficients.length) - { - int scalarTerm = field.mult(matrix[j].coefficients[i], - coefficients[j]); - resultCoeff[i] = field.add(resultCoeff[i], scalarTerm); - } - } - } - - // compute the square root of each entry of the result coefficients - for (int i = 0; i < length; i++) - { - resultCoeff[i] = field.sqRoot(resultCoeff[i]); - } - - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the result of the division of this polynomial by another - * polynomial modulo a third polynomial. - * - * @param divisor the divisor - * @param modulus the reduction polynomial - * @return this * divisor^(-1) mod modulus - */ - public PolynomialGF2mSmallM modDiv(PolynomialGF2mSmallM divisor, - PolynomialGF2mSmallM modulus) - { - int[] resultCoeff = modDiv(coefficients, divisor.coefficients, - modulus.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute the result of the division of two polynomials modulo a third - * polynomial over the field GF(2^m). - * - * @param a the first polynomial - * @param b the second polynomial - * @param g the reduction polynomial - * @return a * b^(-1) mod g - */ - private int[] modDiv(int[] a, int[] b, int[] g) - { - int[] r0 = normalForm(g); - int[] r1 = mod(b, g); - int[] s0 = {0}; - int[] s1 = mod(a, g); - int[] s2; - int[][] q; - while (computeDegree(r1) != -1) - { - q = div(r0, r1); - r0 = normalForm(r1); - r1 = normalForm(q[1]); - s2 = add(s0, modMultiply(q[0], s1, g)); - s0 = normalForm(s1); - s1 = normalForm(s2); - - } - int hc = headCoefficient(r0); - s0 = multWithElement(s0, field.inverse(hc)); - return s0; - } - - /** - * Compute the inverse of this polynomial modulo the given polynomial. - * - * @param a the reduction polynomial - * @return this^(-1) mod a - */ - public PolynomialGF2mSmallM modInverse(PolynomialGF2mSmallM a) - { - int[] unit = {1}; - int[] resultCoeff = modDiv(unit, coefficients, a.coefficients); - return new PolynomialGF2mSmallM(field, resultCoeff); - } - - /** - * Compute a polynomial pair (a,b) from this polynomial and the given - * polynomial g with the property b*this = a mod g and deg(a)<=deg(g)/2. - * - * @param g the reduction polynomial - * @return PolynomialGF2mSmallM[] {a,b} with b*this = a mod g and deg(a)<= - * deg(g)/2 - */ - public PolynomialGF2mSmallM[] modPolynomialToFracton(PolynomialGF2mSmallM g) - { - int dg = g.degree >> 1; - int[] a0 = normalForm(g.coefficients); - int[] a1 = mod(coefficients, g.coefficients); - int[] b0 = {0}; - int[] b1 = {1}; - while (computeDegree(a1) > dg) - { - int[][] q = div(a0, a1); - a0 = a1; - a1 = q[1]; - int[] b2 = add(b0, modMultiply(q[0], b1, g.coefficients)); - b0 = b1; - b1 = b2; - } - - return new PolynomialGF2mSmallM[]{ - new PolynomialGF2mSmallM(field, a1), - new PolynomialGF2mSmallM(field, b1)}; - } - - /** - * checks if given object is equal to this polynomial. - *

    - * The method returns false whenever the given object is not polynomial over - * GF(2^m). - * - * @param other object - * @return true or false - */ - public boolean equals(Object other) - { - - if (other == null || !(other instanceof PolynomialGF2mSmallM)) - { - return false; - } - - PolynomialGF2mSmallM p = (PolynomialGF2mSmallM)other; - - if ((field.equals(p.field)) && (degree == p.degree) - && (isEqual(coefficients, p.coefficients))) - { - return true; - } - - return false; - } - - /** - * Compare two polynomials given as int arrays. - * - * @param a the first polynomial - * @param b the second polynomial - * @return true if a and b represent the - * same polynomials, false otherwise - */ - private static boolean isEqual(int[] a, int[] b) - { - int da = computeDegree(a); - int db = computeDegree(b); - if (da != db) - { - return false; - } - for (int i = 0; i <= da; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - return true; - } - - /** - * @return the hash code of this polynomial - */ - public int hashCode() - { - int hash = field.hashCode(); - for (int j = 0; j < coefficients.length; j++) - { - hash = hash * 31 + coefficients[j]; - } - return hash; - } - - /** - * Returns a human readable form of the polynomial. - *

    - * - * @return a human readable form of the polynomial. - */ - public String toString() - { - String str = " Polynomial over " + field.toString() + ": \n"; - - for (int i = 0; i < coefficients.length; i++) - { - str = str + field.elementToStr(coefficients[i]) + "Y^" + i + "+"; - } - str = str + ";"; - - return str; - } - - /** - * Compute the degree of this polynomial. If this is the zero polynomial, - * the degree is -1. - */ - private void computeDegree() - { - for (degree = coefficients.length - 1; degree >= 0 - && coefficients[degree] == 0; degree--) - { - ; - } - } - - /** - * Compute the degree of a polynomial. - * - * @param a the polynomial - * @return the degree of the polynomial a. If a is - * the zero polynomial, return -1. - */ - private static int computeDegree(int[] a) - { - int degree; - for (degree = a.length - 1; degree >= 0 && a[degree] == 0; degree--) - { - ; - } - return degree; - } - - /** - * Strip leading zero coefficients from the given polynomial. - * - * @param a the polynomial - * @return the reduced polynomial - */ - private static int[] normalForm(int[] a) - { - int d = computeDegree(a); - - // if a is the zero polynomial - if (d == -1) - { - // return new zero polynomial - return new int[1]; - } - - // if a already is in normal form - if (a.length == d + 1) - { - // return a clone of a - return IntUtils.clone(a); - } - - // else, reduce a - int[] result = new int[d + 1]; - System.arraycopy(a, 0, result, 0, d + 1); - return result; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2.java deleted file mode 100644 index 095660e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2.java +++ /dev/null @@ -1,278 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This class describes operations with polynomials over finite field GF(2), i e - * polynomial ring R = GF(2)[X]. All operations are defined only for polynomials - * with degree <=32. For the polynomial representation the map f: R->Z, - * poly(X)->poly(2) is used, where integers have the binary representation. For - * example: X^7+X^3+X+1 -> (00...0010001011)=139 Also for polynomials type - * Integer is used. - * - * @see GF2mField - */ -public final class PolynomialRingGF2 -{ - - /** - * Default constructor (private). - */ - private PolynomialRingGF2() - { - // empty - } - - /** - * Return sum of two polyomials - * - * @param p polynomial - * @param q polynomial - * @return p+q - */ - - public static int add(int p, int q) - { - return p ^ q; - } - - /** - * Return product of two polynomials - * - * @param p polynomial - * @param q polynomial - * @return p*q - */ - - public static long multiply(int p, int q) - { - long result = 0; - if (q != 0) - { - long q1 = q & 0x00000000ffffffffL; - - while (p != 0) - { - byte b = (byte)(p & 0x01); - if (b == 1) - { - result ^= q1; - } - p >>>= 1; - q1 <<= 1; - - } - } - return result; - } - - /** - * Compute the product of two polynomials modulo a third polynomial. - * - * @param a the first polynomial - * @param b the second polynomial - * @param r the reduction polynomial - * @return a * b mod r - */ - public static int modMultiply(int a, int b, int r) - { - int result = 0; - int p = remainder(a, r); - int q = remainder(b, r); - if (q != 0) - { - int d = 1 << degree(r); - - while (p != 0) - { - byte pMod2 = (byte)(p & 0x01); - if (pMod2 == 1) - { - result ^= q; - } - p >>>= 1; - q <<= 1; - if (q >= d) - { - q ^= r; - } - } - } - return result; - } - - /** - * Return the degree of a polynomial - * - * @param p polynomial p - * @return degree(p) - */ - - public static int degree(int p) - { - int result = -1; - while (p != 0) - { - result++; - p >>>= 1; - } - return result; - } - - /** - * Return the degree of a polynomial - * - * @param p polynomial p - * @return degree(p) - */ - - public static int degree(long p) - { - int result = 0; - while (p != 0) - { - result++; - p >>>= 1; - } - return result - 1; - } - - /** - * Return the remainder of a polynomial division of two polynomials. - * - * @param p dividend - * @param q divisor - * @return p mod q - */ - public static int remainder(int p, int q) - { - int result = p; - - if (q == 0) - { - System.err.println("Error: to be divided by 0"); - return 0; - } - - while (degree(result) >= degree(q)) - { - result ^= q << (degree(result) - degree(q)); - } - - return result; - } - - /** - * Return the rest of devision two polynomials - * - * @param p polinomial - * @param q polinomial - * @return p mod q - */ - - public static int rest(long p, int q) - { - long p1 = p; - if (q == 0) - { - System.err.println("Error: to be divided by 0"); - return 0; - } - long q1 = q & 0x00000000ffffffffL; - while ((p1 >>> 32) != 0) - { - p1 ^= q1 << (degree(p1) - degree(q1)); - } - - int result = (int)(p1 & 0xffffffff); - while (degree(result) >= degree(q)) - { - result ^= q << (degree(result) - degree(q)); - } - - return result; - } - - /** - * Return the greatest common divisor of two polynomials - * - * @param p polinomial - * @param q polinomial - * @return GCD(p, q) - */ - - public static int gcd(int p, int q) - { - int a, b, c; - a = p; - b = q; - while (b != 0) - { - c = remainder(a, b); - a = b; - b = c; - - } - return a; - } - - /** - * Checking polynomial for irreducibility - * - * @param p polinomial - * @return true if p is irreducible and false otherwise - */ - - public static boolean isIrreducible(int p) - { - if (p == 0) - { - return false; - } - int d = degree(p) >>> 1; - int u = 2; - for (int i = 0; i < d; i++) - { - u = modMultiply(u, u, p); - if (gcd(u ^ 2, p) != 1) - { - return false; - } - } - return true; - } - - /** - * Creates irreducible polynomial with degree d - * - * @param deg polynomial degree - * @return irreducible polynomial p - */ - public static int getIrreduciblePolynomial(int deg) - { - if (deg < 0) - { - System.err.println("The Degree is negative"); - return 0; - } - if (deg > 31) - { - System.err.println("The Degree is more then 31"); - return 0; - } - if (deg == 0) - { - return 1; - } - int a = 1 << deg; - a++; - int b = 1 << (deg + 1); - for (int i = a; i < b; i += 2) - { - if (isIrreducible(i)) - { - return i; - } - } - return 0; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2m.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2m.java deleted file mode 100644 index dc26471..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/PolynomialRingGF2m.java +++ /dev/null @@ -1,175 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This class represents polynomial rings GF(2^m)[X]/p(X) for - * m<<;32. If p(X) is irreducible, the polynomial ring - * is in fact an extension field of GF(2^m). - */ -public class PolynomialRingGF2m -{ - - /** - * the finite field this polynomial ring is defined over - */ - private GF2mField field; - - /** - * the reduction polynomial - */ - private PolynomialGF2mSmallM p; - - /** - * the squaring matrix for this polynomial ring (given as the array of its - * row vectors) - */ - protected PolynomialGF2mSmallM[] sqMatrix; - - /** - * the matrix for computing square roots in this polynomial ring (given as - * the array of its row vectors). This matrix is computed as the inverse of - * the squaring matrix. - */ - protected PolynomialGF2mSmallM[] sqRootMatrix; - - /** - * Constructor. - * - * @param field the finite field - * @param p the reduction polynomial - */ - public PolynomialRingGF2m(GF2mField field, PolynomialGF2mSmallM p) - { - this.field = field; - this.p = p; - computeSquaringMatrix(); - computeSquareRootMatrix(); - } - - /** - * @return the squaring matrix for this polynomial ring - */ - public PolynomialGF2mSmallM[] getSquaringMatrix() - { - return sqMatrix; - } - - /** - * @return the matrix for computing square roots for this polynomial ring - */ - public PolynomialGF2mSmallM[] getSquareRootMatrix() - { - return sqRootMatrix; - } - - /** - * Compute the squaring matrix for this polynomial ring, using the base - * field and the reduction polynomial. - */ - private void computeSquaringMatrix() - { - int numColumns = p.getDegree(); - sqMatrix = new PolynomialGF2mSmallM[numColumns]; - for (int i = 0; i < numColumns >> 1; i++) - { - int[] monomCoeffs = new int[(i << 1) + 1]; - monomCoeffs[i << 1] = 1; - sqMatrix[i] = new PolynomialGF2mSmallM(field, monomCoeffs); - } - for (int i = numColumns >> 1; i < numColumns; i++) - { - int[] monomCoeffs = new int[(i << 1) + 1]; - monomCoeffs[i << 1] = 1; - PolynomialGF2mSmallM monomial = new PolynomialGF2mSmallM(field, - monomCoeffs); - sqMatrix[i] = monomial.mod(p); - } - } - - /** - * Compute the matrix for computing square roots in this polynomial ring by - * inverting the squaring matrix. - */ - private void computeSquareRootMatrix() - { - int numColumns = p.getDegree(); - - // clone squaring matrix - PolynomialGF2mSmallM[] tmpMatrix = new PolynomialGF2mSmallM[numColumns]; - for (int i = numColumns - 1; i >= 0; i--) - { - tmpMatrix[i] = new PolynomialGF2mSmallM(sqMatrix[i]); - } - - // initialize square root matrix as unit matrix - sqRootMatrix = new PolynomialGF2mSmallM[numColumns]; - for (int i = numColumns - 1; i >= 0; i--) - { - sqRootMatrix[i] = new PolynomialGF2mSmallM(field, i); - } - - // simultaneously compute Gaussian reduction of squaring matrix and unit - // matrix - for (int i = 0; i < numColumns; i++) - { - // if diagonal element is zero - if (tmpMatrix[i].getCoefficient(i) == 0) - { - boolean foundNonZero = false; - // find a non-zero element in the same row - for (int j = i + 1; j < numColumns; j++) - { - if (tmpMatrix[j].getCoefficient(i) != 0) - { - // found it, swap columns ... - foundNonZero = true; - swapColumns(tmpMatrix, i, j); - swapColumns(sqRootMatrix, i, j); - // ... and quit searching - j = numColumns; - continue; - } - } - // if no non-zero element was found - if (!foundNonZero) - { - // the matrix is not invertible - throw new ArithmeticException( - "Squaring matrix is not invertible."); - } - } - - // normalize i-th column - int coef = tmpMatrix[i].getCoefficient(i); - int invCoef = field.inverse(coef); - tmpMatrix[i].multThisWithElement(invCoef); - sqRootMatrix[i].multThisWithElement(invCoef); - - // normalize all other columns - for (int j = 0; j < numColumns; j++) - { - if (j != i) - { - coef = tmpMatrix[j].getCoefficient(i); - if (coef != 0) - { - PolynomialGF2mSmallM tmpSqColumn = tmpMatrix[i] - .multWithElement(coef); - PolynomialGF2mSmallM tmpInvColumn = sqRootMatrix[i] - .multWithElement(coef); - tmpMatrix[j].addToThis(tmpSqColumn); - sqRootMatrix[j].addToThis(tmpInvColumn); - } - } - } - } - } - - private static void swapColumns(PolynomialGF2mSmallM[] matrix, int first, - int second) - { - PolynomialGF2mSmallM tmp = matrix[first]; - matrix[first] = matrix[second]; - matrix[second] = tmp; - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/RandUtils.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/RandUtils.java deleted file mode 100644 index 955dbd2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/RandUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -import java.security.SecureRandom; - -public class RandUtils -{ - static int nextInt(SecureRandom rand, int n) - { - - if ((n & -n) == n) // i.e., n is a power of 2 - { - return (int)((n * (long)(rand.nextInt() >>> 1)) >> 31); - } - - int bits, value; - do - { - bits = rand.nextInt() >>> 1; - value = bits % n; - } - while (bits - value + (n - 1) < 0); - - return value; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Vector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Vector.java deleted file mode 100644 index b732c76..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/pqc/math/linearalgebra/Vector.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.bc.pqc.math.linearalgebra; - -/** - * This abstract class defines vectors. It holds the length of vector. - */ -public abstract class Vector -{ - - /** - * the length of this vector - */ - protected int length; - - /** - * @return the length of this vector - */ - public final int getLength() - { - return length; - } - - /** - * @return this vector as byte array - */ - public abstract byte[] getEncoded(); - - /** - * Return whether this is the zero vector (i.e., all elements are zero). - * - * @return true if this is the zero vector, false - * otherwise - */ - public abstract boolean isZero(); - - /** - * Add another vector to this vector. - * - * @param addend the other vector - * @return this + addend - */ - public abstract Vector add(Vector addend); - - /** - * Multiply this vector with a permutation. - * - * @param p the permutation - * @return this*p = p*this - */ - public abstract Vector multiply(Permutation p); - - /** - * Check if the given object is equal to this vector. - * - * @param other vector - * @return the result of the comparison - */ - public abstract boolean equals(Object other); - - /** - * @return the hash code of this vector - */ - public abstract int hashCode(); - - /** - * @return a human readable form of this vector - */ - public abstract String toString(); - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Arrays.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Arrays.java deleted file mode 100644 index 731f303..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Arrays.java +++ /dev/null @@ -1,628 +0,0 @@ -package org.bc.util; - -import java.math.BigInteger; - -/** - * General array utilities. - */ -public final class Arrays -{ - private Arrays() - { - // static class, hide constructor - } - - public static boolean areEqual( - boolean[] a, - boolean[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - - return true; - } - - public static boolean areEqual( - char[] a, - char[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - - return true; - } - - public static boolean areEqual( - byte[] a, - byte[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - - return true; - } - - /** - * A constant time equals comparison - does not terminate early if - * test will fail. - * - * @param a first array - * @param b second array - * @return true if arrays equal, false otherwise. - */ - public static boolean constantTimeAreEqual( - byte[] a, - byte[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - int nonEqual = 0; - - for (int i = 0; i != a.length; i++) - { - nonEqual |= (a[i] ^ b[i]); - } - - return nonEqual == 0; - } - - public static boolean areEqual( - int[] a, - int[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - - return true; - } - - public static boolean areEqual( - long[] a, - long[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (a[i] != b[i]) - { - return false; - } - } - - return true; - } - - public static boolean areEqual( - BigInteger[] a, - BigInteger[] b) - { - if (a == b) - { - return true; - } - - if (a == null || b == null) - { - return false; - } - - if (a.length != b.length) - { - return false; - } - - for (int i = 0; i != a.length; i++) - { - if (!a[i].equals(b[i])) - { - return false; - } - } - - return true; - } - - public static void fill( - byte[] array, - byte value) - { - for (int i = 0; i < array.length; i++) - { - array[i] = value; - } - } - - public static void fill( - char[] array, - char value) - { - for (int i = 0; i < array.length; i++) - { - array[i] = value; - } - } - - public static void fill( - long[] array, - long value) - { - for (int i = 0; i < array.length; i++) - { - array[i] = value; - } - } - - public static void fill( - short[] array, - short value) - { - for (int i = 0; i < array.length; i++) - { - array[i] = value; - } - } - - public static void fill( - int[] array, - int value) - { - for (int i = 0; i < array.length; i++) - { - array[i] = value; - } - } - - public static int hashCode(byte[] data) - { - if (data == null) - { - return 0; - } - - int i = data.length; - int hc = i + 1; - - while (--i >= 0) - { - hc *= 257; - hc ^= data[i]; - } - - return hc; - } - - public static int hashCode(char[] data) - { - if (data == null) - { - return 0; - } - - int i = data.length; - int hc = i + 1; - - while (--i >= 0) - { - hc *= 257; - hc ^= data[i]; - } - - return hc; - } - - public static int hashCode(int[][] ints) - { - int hc = 0; - - for (int i = 0; i != ints.length; i++) - { - hc = hc * 257 + hashCode(ints[i]); - } - - return hc; - } - - public static int hashCode(int[] data) - { - if (data == null) - { - return 0; - } - - int i = data.length; - int hc = i + 1; - - while (--i >= 0) - { - hc *= 257; - hc ^= data[i]; - } - - return hc; - } - - public static int hashCode(short[][][] shorts) - { - int hc = 0; - - for (int i = 0; i != shorts.length; i++) - { - hc = hc * 257 + hashCode(shorts[i]); - } - - return hc; - } - - public static int hashCode(short[][] shorts) - { - int hc = 0; - - for (int i = 0; i != shorts.length; i++) - { - hc = hc * 257 + hashCode(shorts[i]); - } - - return hc; - } - - public static int hashCode(short[] data) - { - if (data == null) - { - return 0; - } - - int i = data.length; - int hc = i + 1; - - while (--i >= 0) - { - hc *= 257; - hc ^= (data[i] & 0xff); - } - - return hc; - } - - public static int hashCode(BigInteger[] data) - { - if (data == null) - { - return 0; - } - - int i = data.length; - int hc = i + 1; - - while (--i >= 0) - { - hc *= 257; - hc ^= data[i].hashCode(); - } - - return hc; - } - - public static byte[] clone(byte[] data) - { - if (data == null) - { - return null; - } - byte[] copy = new byte[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - public static int[] clone(int[] data) - { - if (data == null) - { - return null; - } - int[] copy = new int[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - public static short[] clone(short[] data) - { - if (data == null) - { - return null; - } - short[] copy = new short[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - public static BigInteger[] clone(BigInteger[] data) - { - if (data == null) - { - return null; - } - BigInteger[] copy = new BigInteger[data.length]; - - System.arraycopy(data, 0, copy, 0, data.length); - - return copy; - } - - public static byte[] copyOf(byte[] data, int newLength) - { - byte[] tmp = new byte[newLength]; - - if (newLength < data.length) - { - System.arraycopy(data, 0, tmp, 0, newLength); - } - else - { - System.arraycopy(data, 0, tmp, 0, data.length); - } - - return tmp; - } - - public static char[] copyOf(char[] data, int newLength) - { - char[] tmp = new char[newLength]; - - if (newLength < data.length) - { - System.arraycopy(data, 0, tmp, 0, newLength); - } - else - { - System.arraycopy(data, 0, tmp, 0, data.length); - } - - return tmp; - } - - public static int[] copyOf(int[] data, int newLength) - { - int[] tmp = new int[newLength]; - - if (newLength < data.length) - { - System.arraycopy(data, 0, tmp, 0, newLength); - } - else - { - System.arraycopy(data, 0, tmp, 0, data.length); - } - - return tmp; - } - - public static long[] copyOf(long[] data, int newLength) - { - long[] tmp = new long[newLength]; - - if (newLength < data.length) - { - System.arraycopy(data, 0, tmp, 0, newLength); - } - else - { - System.arraycopy(data, 0, tmp, 0, data.length); - } - - return tmp; - } - - public static BigInteger[] copyOf(BigInteger[] data, int newLength) - { - BigInteger[] tmp = new BigInteger[newLength]; - - if (newLength < data.length) - { - System.arraycopy(data, 0, tmp, 0, newLength); - } - else - { - System.arraycopy(data, 0, tmp, 0, data.length); - } - - return tmp; - } - - public static byte[] copyOfRange(byte[] data, int from, int to) - { - int newLength = getLength(from, to); - - byte[] tmp = new byte[newLength]; - - if (data.length - from < newLength) - { - System.arraycopy(data, from, tmp, 0, data.length - from); - } - else - { - System.arraycopy(data, from, tmp, 0, newLength); - } - - return tmp; - } - - public static int[] copyOfRange(int[] data, int from, int to) - { - int newLength = getLength(from, to); - - int[] tmp = new int[newLength]; - - if (data.length - from < newLength) - { - System.arraycopy(data, from, tmp, 0, data.length - from); - } - else - { - System.arraycopy(data, from, tmp, 0, newLength); - } - - return tmp; - } - - public static long[] copyOfRange(long[] data, int from, int to) - { - int newLength = getLength(from, to); - - long[] tmp = new long[newLength]; - - if (data.length - from < newLength) - { - System.arraycopy(data, from, tmp, 0, data.length - from); - } - else - { - System.arraycopy(data, from, tmp, 0, newLength); - } - - return tmp; - } - - public static BigInteger[] copyOfRange(BigInteger[] data, int from, int to) - { - int newLength = getLength(from, to); - - BigInteger[] tmp = new BigInteger[newLength]; - - if (data.length - from < newLength) - { - System.arraycopy(data, from, tmp, 0, data.length - from); - } - else - { - System.arraycopy(data, from, tmp, 0, newLength); - } - - return tmp; - } - - private static int getLength(int from, int to) - { - int newLength = to - from; - if (newLength < 0) - { - StringBuffer sb = new StringBuffer(from); - sb.append(" > ").append(to); - throw new IllegalArgumentException(sb.toString()); - } - return newLength; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/BigIntegers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/BigIntegers.java deleted file mode 100644 index 0d9626a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/BigIntegers.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.bc.util; - -import java.math.BigInteger; -import java.security.SecureRandom; - -/** - * BigInteger utilities. - */ -public final class BigIntegers -{ - private static final int MAX_ITERATIONS = 1000; - private static final BigInteger ZERO = BigInteger.valueOf(0); - - /** - * Return the passed in value as an unsigned byte array. - * - * @param value value to be converted. - * @return a byte array without a leading zero byte if present in the signed encoding. - */ - public static byte[] asUnsignedByteArray( - BigInteger value) - { - byte[] bytes = value.toByteArray(); - - if (bytes[0] == 0) - { - byte[] tmp = new byte[bytes.length - 1]; - - System.arraycopy(bytes, 1, tmp, 0, tmp.length); - - return tmp; - } - - return bytes; - } - - /** - * Return the passed in value as an unsigned byte array. - * - * @param value value to be converted. - * @return a byte array without a leading zero byte if present in the signed encoding. - */ - public static byte[] asUnsignedByteArray( - int length, - BigInteger value) - { - byte[] bytes = value.toByteArray(); - - if (bytes[0] == 0) - { - if (bytes.length - 1 > length) - { - throw new IllegalArgumentException("standard length exceeded for value"); - } - - byte[] tmp = new byte[length]; - - System.arraycopy(bytes, 1, tmp, tmp.length - (bytes.length - 1), bytes.length - 1); - - return tmp; - } - else - { - if (bytes.length == length) - { - return bytes; - } - - if (bytes.length > length) - { - throw new IllegalArgumentException("standard length exceeded for value"); - } - - byte[] tmp = new byte[length]; - - System.arraycopy(bytes, 0, tmp, tmp.length - bytes.length, bytes.length); - - return tmp; - } - } - - /** - * Return a random BigInteger not less than 'min' and not greater than 'max' - * - * @param min the least value that may be generated - * @param max the greatest value that may be generated - * @param random the source of randomness - * @return a random BigInteger value in the range [min,max] - */ - public static BigInteger createRandomInRange( - BigInteger min, - BigInteger max, - SecureRandom random) - { - int cmp = min.compareTo(max); - if (cmp >= 0) - { - if (cmp > 0) - { - throw new IllegalArgumentException("'min' may not be greater than 'max'"); - } - - return min; - } - - if (min.bitLength() > max.bitLength() / 2) - { - return createRandomInRange(ZERO, max.subtract(min), random).add(min); - } - - for (int i = 0; i < MAX_ITERATIONS; ++i) - { - BigInteger x = new BigInteger(max.bitLength(), random); - if (x.compareTo(min) >= 0 && x.compareTo(max) <= 0) - { - return x; - } - } - - // fall back to a faster (restricted) method - return new BigInteger(max.subtract(min).bitLength() - 1, random).add(min); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/CollectionStore.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/CollectionStore.java deleted file mode 100644 index 2d4d8eb..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/CollectionStore.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.bc.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -/** - * A simple collection backed store. - */ -public class CollectionStore - implements Store -{ - private Collection _local; - - /** - * Basic constructor. - * - * @param collection - initial contents for the store, this is copied. - */ - public CollectionStore( - Collection collection) - { - _local = new ArrayList(collection); - } - - /** - * Return the matches in the collection for the passed in selector. - * - * @param selector the selector to match against. - * @return a possibly empty collection of matching objects. - */ - public Collection getMatches(Selector selector) - { - if (selector == null) - { - return new ArrayList(_local); - } - else - { - List col = new ArrayList(); - Iterator iter = _local.iterator(); - - while (iter.hasNext()) - { - Object obj = iter.next(); - - if (selector.match(obj)) - { - col.add(obj); - } - } - - return col; - } - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/IPAddress.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/IPAddress.java deleted file mode 100644 index 0dc8d80..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/IPAddress.java +++ /dev/null @@ -1,188 +0,0 @@ -package org.bc.util; - -public class IPAddress -{ - /** - * Validate the given IPv4 or IPv6 address. - * - * @param address the IP address as a String. - * - * @return true if a valid address, false otherwise - */ - public static boolean isValid( - String address) - { - return isValidIPv4(address) || isValidIPv6(address); - } - - /** - * Validate the given IPv4 or IPv6 address and netmask. - * - * @param address the IP address as a String. - * - * @return true if a valid address with netmask, false otherwise - */ - public static boolean isValidWithNetMask( - String address) - { - return isValidIPv4WithNetmask(address) || isValidIPv6WithNetmask(address); - } - - /** - * Validate the given IPv4 address. - * - * @param address the IP address as a String. - * - * @return true if a valid IPv4 address, false otherwise - */ - public static boolean isValidIPv4( - String address) - { - if (address.length() == 0) - { - return false; - } - - int octet; - int octets = 0; - - String temp = address+"."; - - int pos; - int start = 0; - while (start < temp.length() - && (pos = temp.indexOf('.', start)) > start) - { - if (octets == 4) - { - return false; - } - try - { - octet = Integer.parseInt(temp.substring(start, pos)); - } - catch (NumberFormatException ex) - { - return false; - } - if (octet < 0 || octet > 255) - { - return false; - } - start = pos + 1; - octets++; - } - - return octets == 4; - } - - public static boolean isValidIPv4WithNetmask( - String address) - { - int index = address.indexOf("/"); - String mask = address.substring(index + 1); - - return (index > 0) && isValidIPv4(address.substring(0, index)) - && (isValidIPv4(mask) || isMaskValue(mask, 32)); - } - - public static boolean isValidIPv6WithNetmask( - String address) - { - int index = address.indexOf("/"); - String mask = address.substring(index + 1); - - return (index > 0) && (isValidIPv6(address.substring(0, index)) - && (isValidIPv6(mask) || isMaskValue(mask, 128))); - } - - private static boolean isMaskValue(String component, int size) - { - try - { - int value = Integer.parseInt(component); - - return value >= 0 && value <= size; - } - catch (NumberFormatException e) - { - return false; - } - } - - /** - * Validate the given IPv6 address. - * - * @param address the IP address as a String. - * - * @return true if a valid IPv4 address, false otherwise - */ - public static boolean isValidIPv6( - String address) - { - if (address.length() == 0) - { - return false; - } - - int octet; - int octets = 0; - - String temp = address + ":"; - boolean doubleColonFound = false; - int pos; - int start = 0; - while (start < temp.length() - && (pos = temp.indexOf(':', start)) >= start) - { - if (octets == 8) - { - return false; - } - - if (start != pos) - { - String value = temp.substring(start, pos); - - if (pos == (temp.length() - 1) && value.indexOf('.') > 0) - { - if (!isValidIPv4(value)) - { - return false; - } - - octets++; // add an extra one as address covers 2 words. - } - else - { - try - { - octet = Integer.parseInt(temp.substring(start, pos), 16); - } - catch (NumberFormatException ex) - { - return false; - } - if (octet < 0 || octet > 0xffff) - { - return false; - } - } - } - else - { - if (pos != 1 && pos != temp.length() - 1 && doubleColonFound) - { - return false; - } - doubleColonFound = true; - } - start = pos + 1; - octets++; - } - - return octets == 8 || doubleColonFound; - } -} - - diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Integers.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Integers.java deleted file mode 100644 index a71a6e7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Integers.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.util; - -public class Integers -{ - public static Integer valueOf(int value) - { - return Integer.valueOf(value); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Selector.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Selector.java deleted file mode 100644 index f1f12a8..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Selector.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.util; - -public interface Selector - extends Cloneable -{ - boolean match(Object obj); - - Object clone(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Store.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Store.java deleted file mode 100644 index a0ab754..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Store.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.util; - -import java.util.Collection; - -public interface Store -{ - Collection getMatches(Selector selector) - throws StoreException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StoreException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StoreException.java deleted file mode 100644 index 474fa70..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StoreException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.util; - -public class StoreException - extends RuntimeException -{ - private Throwable _e; - - public StoreException(String s, Throwable e) - { - super(s); - _e = e; - } - - public Throwable getCause() - { - return _e; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParser.java deleted file mode 100644 index 95183f1..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParser.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.util; - -import java.util.Collection; - -public interface StreamParser -{ - Object read() throws StreamParsingException; - - Collection readAll() throws StreamParsingException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParsingException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParsingException.java deleted file mode 100644 index f0bfe5b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/StreamParsingException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.util; - -public class StreamParsingException - extends Exception -{ - Throwable _e; - - public StreamParsingException(String message, Throwable e) - { - super(message); - _e = e; - } - - public Throwable getCause() - { - return _e; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Strings.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Strings.java deleted file mode 100644 index 3c0c515..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/Strings.java +++ /dev/null @@ -1,303 +0,0 @@ -package org.bc.util; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Vector; - -public final class Strings -{ - public static String fromUTF8ByteArray(byte[] bytes) - { - int i = 0; - int length = 0; - - while (i < bytes.length) - { - length++; - if ((bytes[i] & 0xf0) == 0xf0) - { - // surrogate pair - length++; - i += 4; - } - else if ((bytes[i] & 0xe0) == 0xe0) - { - i += 3; - } - else if ((bytes[i] & 0xc0) == 0xc0) - { - i += 2; - } - else - { - i += 1; - } - } - - char[] cs = new char[length]; - - i = 0; - length = 0; - - while (i < bytes.length) - { - char ch; - - if ((bytes[i] & 0xf0) == 0xf0) - { - int codePoint = ((bytes[i] & 0x03) << 18) | ((bytes[i+1] & 0x3F) << 12) | ((bytes[i+2] & 0x3F) << 6) | (bytes[i+3] & 0x3F); - int U = codePoint - 0x10000; - char W1 = (char)(0xD800 | (U >> 10)); - char W2 = (char)(0xDC00 | (U & 0x3FF)); - cs[length++] = W1; - ch = W2; - i += 4; - } - else if ((bytes[i] & 0xe0) == 0xe0) - { - ch = (char)(((bytes[i] & 0x0f) << 12) - | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)); - i += 3; - } - else if ((bytes[i] & 0xd0) == 0xd0) - { - ch = (char)(((bytes[i] & 0x1f) << 6) | (bytes[i + 1] & 0x3f)); - i += 2; - } - else if ((bytes[i] & 0xc0) == 0xc0) - { - ch = (char)(((bytes[i] & 0x1f) << 6) | (bytes[i + 1] & 0x3f)); - i += 2; - } - else - { - ch = (char)(bytes[i] & 0xff); - i += 1; - } - - cs[length++] = ch; - } - - return new String(cs); - } - - public static byte[] toUTF8ByteArray(String string) - { - return toUTF8ByteArray(string.toCharArray()); - } - - public static byte[] toUTF8ByteArray(char[] string) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - toUTF8ByteArray(string, bOut); - } - catch (IOException e) - { - throw new IllegalStateException("cannot encode string to byte array!"); - } - - return bOut.toByteArray(); - } - - public static void toUTF8ByteArray(char[] string, OutputStream sOut) - throws IOException - { - char[] c = string; - int i = 0; - - while (i < c.length) - { - char ch = c[i]; - - if (ch < 0x0080) - { - sOut.write(ch); - } - else if (ch < 0x0800) - { - sOut.write(0xc0 | (ch >> 6)); - sOut.write(0x80 | (ch & 0x3f)); - } - // surrogate pair - else if (ch >= 0xD800 && ch <= 0xDFFF) - { - // in error - can only happen, if the Java String class has a - // bug. - if (i + 1 >= c.length) - { - throw new IllegalStateException("invalid UTF-16 codepoint"); - } - char W1 = ch; - ch = c[++i]; - char W2 = ch; - // in error - can only happen, if the Java String class has a - // bug. - if (W1 > 0xDBFF) - { - throw new IllegalStateException("invalid UTF-16 codepoint"); - } - int codePoint = (((W1 & 0x03FF) << 10) | (W2 & 0x03FF)) + 0x10000; - sOut.write(0xf0 | (codePoint >> 18)); - sOut.write(0x80 | ((codePoint >> 12) & 0x3F)); - sOut.write(0x80 | ((codePoint >> 6) & 0x3F)); - sOut.write(0x80 | (codePoint & 0x3F)); - } - else - { - sOut.write(0xe0 | (ch >> 12)); - sOut.write(0x80 | ((ch >> 6) & 0x3F)); - sOut.write(0x80 | (ch & 0x3F)); - } - - i++; - } - } - - /** - * A locale independent version of toUpperCase. - * - * @param string input to be converted - * @return a US Ascii uppercase version - */ - public static String toUpperCase(String string) - { - boolean changed = false; - char[] chars = string.toCharArray(); - - for (int i = 0; i != chars.length; i++) - { - char ch = chars[i]; - if ('a' <= ch && 'z' >= ch) - { - changed = true; - chars[i] = (char)(ch - 'a' + 'A'); - } - } - - if (changed) - { - return new String(chars); - } - - return string; - } - - /** - * A locale independent version of toLowerCase. - * - * @param string input to be converted - * @return a US ASCII lowercase version - */ - public static String toLowerCase(String string) - { - boolean changed = false; - char[] chars = string.toCharArray(); - - for (int i = 0; i != chars.length; i++) - { - char ch = chars[i]; - if ('A' <= ch && 'Z' >= ch) - { - changed = true; - chars[i] = (char)(ch - 'A' + 'a'); - } - } - - if (changed) - { - return new String(chars); - } - - return string; - } - - public static byte[] toByteArray(char[] chars) - { - byte[] bytes = new byte[chars.length]; - - for (int i = 0; i != bytes.length; i++) - { - bytes[i] = (byte)chars[i]; - } - - return bytes; - } - - public static byte[] toByteArray(String string) - { - byte[] bytes = new byte[string.length()]; - - for (int i = 0; i != bytes.length; i++) - { - char ch = string.charAt(i); - - bytes[i] = (byte)ch; - } - - return bytes; - } - - /** - * Convert an array of 8 bit characters into a string. - * - * @param bytes 8 bit characters. - * @return resulting String. - */ - public static String fromByteArray(byte[] bytes) - { - return new String(asCharArray(bytes)); - } - - /** - * Do a simple conversion of an array of 8 bit characters into a string. - * - * @param bytes 8 bit characters. - * @return resulting String. - */ - public static char[] asCharArray(byte[] bytes) - { - char[] chars = new char[bytes.length]; - - for (int i = 0; i != chars.length; i++) - { - chars[i] = (char)(bytes[i] & 0xff); - } - - return chars; - } - - public static String[] split(String input, char delimiter) - { - Vector v = new Vector(); - boolean moreTokens = true; - String subString; - - while (moreTokens) - { - int tokenLocation = input.indexOf(delimiter); - if (tokenLocation > 0) - { - subString = input.substring(0, tokenLocation); - v.addElement(subString); - input = input.substring(tokenLocation + 1); - } - else - { - moreTokens = false; - v.addElement(input); - } - } - - String[] res = new String[v.size()]; - - for (int i = 0; i != res.length; i++) - { - res[i] = (String)v.elementAt(i); - } - return res; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64.java deleted file mode 100644 index af22600..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.bc.util.encoders; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -public class Base64 -{ - private static final Encoder encoder = new Base64Encoder(); - - /** - * encode the input data producing a base 64 encoded byte array. - * - * @return a byte array containing the base 64 encoded data. - */ - public static byte[] encode( - byte[] data) - { - int len = (data.length + 2) / 3 * 4; - ByteArrayOutputStream bOut = new ByteArrayOutputStream(len); - - try - { - encoder.encode(data, 0, data.length, bOut); - } - catch (Exception e) - { - throw new EncoderException("exception encoding base64 string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * Encode the byte data to base 64 writing it to the given output stream. - * - * @return the number of bytes produced. - */ - public static int encode( - byte[] data, - OutputStream out) - throws IOException - { - return encoder.encode(data, 0, data.length, out); - } - - /** - * Encode the byte data to base 64 writing it to the given output stream. - * - * @return the number of bytes produced. - */ - public static int encode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - return encoder.encode(data, off, length, out); - } - - /** - * decode the base 64 encoded input data. It is assumed the input data is valid. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - byte[] data) - { - int len = data.length / 4 * 3; - ByteArrayOutputStream bOut = new ByteArrayOutputStream(len); - - try - { - encoder.decode(data, 0, data.length, bOut); - } - catch (Exception e) - { - throw new DecoderException("unable to decode base64 data: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * decode the base 64 encoded String data - whitespace will be ignored. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - String data) - { - int len = data.length() / 4 * 3; - ByteArrayOutputStream bOut = new ByteArrayOutputStream(len); - - try - { - encoder.decode(data, bOut); - } - catch (Exception e) - { - throw new DecoderException("unable to decode base64 string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * decode the base 64 encoded String data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public static int decode( - String data, - OutputStream out) - throws IOException - { - return encoder.decode(data, out); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64Encoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64Encoder.java deleted file mode 100644 index 4aebe6b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Base64Encoder.java +++ /dev/null @@ -1,328 +0,0 @@ -package org.bc.util.encoders; - -import java.io.IOException; -import java.io.OutputStream; - -public class Base64Encoder - implements Encoder -{ - protected final byte[] encodingTable = - { - (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', - (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', - (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', - (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', - (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', - (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', - (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', - (byte)'v', - (byte)'w', (byte)'x', (byte)'y', (byte)'z', - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', - (byte)'7', (byte)'8', (byte)'9', - (byte)'+', (byte)'/' - }; - - protected byte padding = (byte)'='; - - /* - * set up the decoding table. - */ - protected final byte[] decodingTable = new byte[128]; - - protected void initialiseDecodingTable() - { - for (int i = 0; i < decodingTable.length; i++) - { - decodingTable[i] = (byte)0xff; - } - - for (int i = 0; i < encodingTable.length; i++) - { - decodingTable[encodingTable[i]] = (byte)i; - } - } - - public Base64Encoder() - { - initialiseDecodingTable(); - } - - /** - * encode the input data producing a base 64 output stream. - * - * @return the number of bytes produced. - */ - public int encode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - int modulus = length % 3; - int dataLength = (length - modulus); - int a1, a2, a3; - - for (int i = off; i < off + dataLength; i += 3) - { - a1 = data[i] & 0xff; - a2 = data[i + 1] & 0xff; - a3 = data[i + 2] & 0xff; - - out.write(encodingTable[(a1 >>> 2) & 0x3f]); - out.write(encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]); - out.write(encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]); - out.write(encodingTable[a3 & 0x3f]); - } - - /* - * process the tail end. - */ - int b1, b2, b3; - int d1, d2; - - switch (modulus) - { - case 0: /* nothing left to do */ - break; - case 1: - d1 = data[off + dataLength] & 0xff; - b1 = (d1 >>> 2) & 0x3f; - b2 = (d1 << 4) & 0x3f; - - out.write(encodingTable[b1]); - out.write(encodingTable[b2]); - out.write(padding); - out.write(padding); - break; - case 2: - d1 = data[off + dataLength] & 0xff; - d2 = data[off + dataLength + 1] & 0xff; - - b1 = (d1 >>> 2) & 0x3f; - b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f; - b3 = (d2 << 2) & 0x3f; - - out.write(encodingTable[b1]); - out.write(encodingTable[b2]); - out.write(encodingTable[b3]); - out.write(padding); - break; - } - - return (dataLength / 3) * 4 + ((modulus == 0) ? 0 : 4); - } - - private boolean ignore( - char c) - { - return (c == '\n' || c =='\r' || c == '\t' || c == ' '); - } - - /** - * decode the base 64 encoded byte data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public int decode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - byte b1, b2, b3, b4; - int outLen = 0; - - int end = off + length; - - while (end > off) - { - if (!ignore((char)data[end - 1])) - { - break; - } - - end--; - } - - int i = off; - int finish = end - 4; - - i = nextI(data, i, finish); - - while (i < finish) - { - b1 = decodingTable[data[i++]]; - - i = nextI(data, i, finish); - - b2 = decodingTable[data[i++]]; - - i = nextI(data, i, finish); - - b3 = decodingTable[data[i++]]; - - i = nextI(data, i, finish); - - b4 = decodingTable[data[i++]]; - - if ((b1 | b2 | b3 | b4) < 0) - { - throw new IOException("invalid characters encountered in base64 data"); - } - - out.write((b1 << 2) | (b2 >> 4)); - out.write((b2 << 4) | (b3 >> 2)); - out.write((b3 << 6) | b4); - - outLen += 3; - - i = nextI(data, i, finish); - } - - outLen += decodeLastBlock(out, (char)data[end - 4], (char)data[end - 3], (char)data[end - 2], (char)data[end - 1]); - - return outLen; - } - - private int nextI(byte[] data, int i, int finish) - { - while ((i < finish) && ignore((char)data[i])) - { - i++; - } - return i; - } - - /** - * decode the base 64 encoded String data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public int decode( - String data, - OutputStream out) - throws IOException - { - byte b1, b2, b3, b4; - int length = 0; - - int end = data.length(); - - while (end > 0) - { - if (!ignore(data.charAt(end - 1))) - { - break; - } - - end--; - } - - int i = 0; - int finish = end - 4; - - i = nextI(data, i, finish); - - while (i < finish) - { - b1 = decodingTable[data.charAt(i++)]; - - i = nextI(data, i, finish); - - b2 = decodingTable[data.charAt(i++)]; - - i = nextI(data, i, finish); - - b3 = decodingTable[data.charAt(i++)]; - - i = nextI(data, i, finish); - - b4 = decodingTable[data.charAt(i++)]; - - if ((b1 | b2 | b3 | b4) < 0) - { - throw new IOException("invalid characters encountered in base64 data"); - } - - out.write((b1 << 2) | (b2 >> 4)); - out.write((b2 << 4) | (b3 >> 2)); - out.write((b3 << 6) | b4); - - length += 3; - - i = nextI(data, i, finish); - } - - length += decodeLastBlock(out, data.charAt(end - 4), data.charAt(end - 3), data.charAt(end - 2), data.charAt(end - 1)); - - return length; - } - - private int decodeLastBlock(OutputStream out, char c1, char c2, char c3, char c4) - throws IOException - { - byte b1, b2, b3, b4; - - if (c3 == padding) - { - b1 = decodingTable[c1]; - b2 = decodingTable[c2]; - - if ((b1 | b2) < 0) - { - throw new IOException("invalid characters encountered at end of base64 data"); - } - - out.write((b1 << 2) | (b2 >> 4)); - - return 1; - } - else if (c4 == padding) - { - b1 = decodingTable[c1]; - b2 = decodingTable[c2]; - b3 = decodingTable[c3]; - - if ((b1 | b2 | b3) < 0) - { - throw new IOException("invalid characters encountered at end of base64 data"); - } - - out.write((b1 << 2) | (b2 >> 4)); - out.write((b2 << 4) | (b3 >> 2)); - - return 2; - } - else - { - b1 = decodingTable[c1]; - b2 = decodingTable[c2]; - b3 = decodingTable[c3]; - b4 = decodingTable[c4]; - - if ((b1 | b2 | b3 | b4) < 0) - { - throw new IOException("invalid characters encountered at end of base64 data"); - } - - out.write((b1 << 2) | (b2 >> 4)); - out.write((b2 << 4) | (b3 >> 2)); - out.write((b3 << 6) | b4); - - return 3; - } - } - - private int nextI(String data, int i, int finish) - { - while ((i < finish) && ignore(data.charAt(i))) - { - i++; - } - return i; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedDecoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedDecoder.java deleted file mode 100644 index 52d0fbd..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.util.encoders; - - -/** - * a buffering class to allow translation from one format to another to - * be done in discrete chunks. - */ -public class BufferedDecoder -{ - protected byte[] buf; - protected int bufOff; - - protected Translator translator; - - /** - * @param translator the translator to use. - * @param bufSize amount of input to buffer for each chunk. - */ - public BufferedDecoder( - Translator translator, - int bufSize) - { - this.translator = translator; - - if ((bufSize % translator.getEncodedBlockSize()) != 0) - { - throw new IllegalArgumentException("buffer size not multiple of input block size"); - } - - buf = new byte[bufSize]; - bufOff = 0; - } - - public int processByte( - byte in, - byte[] out, - int outOff) - { - int resultLen = 0; - - buf[bufOff++] = in; - - if (bufOff == buf.length) - { - resultLen = translator.decode(buf, 0, buf.length, out, outOff); - bufOff = 0; - } - - return resultLen; - } - - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += translator.decode(buf, 0, buf.length, out, outOff); - - bufOff = 0; - - len -= gapLen; - inOff += gapLen; - outOff += resultLen; - - int chunkSize = len - (len % buf.length); - - resultLen += translator.decode(in, inOff, chunkSize, out, outOff); - - len -= chunkSize; - inOff += chunkSize; - } - - if (len != 0) - { - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - return resultLen; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedEncoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedEncoder.java deleted file mode 100644 index 8e88c16..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/BufferedEncoder.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.bc.util.encoders; - - -/** - * a buffering class to allow translation from one format to another to - * be done in discrete chunks. - */ -public class BufferedEncoder -{ - protected byte[] buf; - protected int bufOff; - - protected Translator translator; - - /** - * @param translator the translator to use. - * @param bufSize amount of input to buffer for each chunk. - */ - public BufferedEncoder( - Translator translator, - int bufSize) - { - this.translator = translator; - - if ((bufSize % translator.getEncodedBlockSize()) != 0) - { - throw new IllegalArgumentException("buffer size not multiple of input block size"); - } - - buf = new byte[bufSize]; - bufOff = 0; - } - - public int processByte( - byte in, - byte[] out, - int outOff) - { - int resultLen = 0; - - buf[bufOff++] = in; - - if (bufOff == buf.length) - { - resultLen = translator.encode(buf, 0, buf.length, out, outOff); - bufOff = 0; - } - - return resultLen; - } - - public int processBytes( - byte[] in, - int inOff, - int len, - byte[] out, - int outOff) - { - if (len < 0) - { - throw new IllegalArgumentException("Can't have a negative input length!"); - } - - int resultLen = 0; - int gapLen = buf.length - bufOff; - - if (len > gapLen) - { - System.arraycopy(in, inOff, buf, bufOff, gapLen); - - resultLen += translator.encode(buf, 0, buf.length, out, outOff); - - bufOff = 0; - - len -= gapLen; - inOff += gapLen; - outOff += resultLen; - - int chunkSize = len - (len % buf.length); - - resultLen += translator.encode(in, inOff, chunkSize, out, outOff); - - len -= chunkSize; - inOff += chunkSize; - } - - if (len != 0) - { - System.arraycopy(in, inOff, buf, bufOff, len); - - bufOff += len; - } - - return resultLen; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/DecoderException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/DecoderException.java deleted file mode 100644 index f0b8501..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/DecoderException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.util.encoders; - -public class DecoderException - extends IllegalStateException -{ - private Throwable cause; - - DecoderException(String msg, Throwable cause) - { - super(msg); - - this.cause = cause; - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Encoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Encoder.java deleted file mode 100644 index 6ee39ab..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Encoder.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.bc.util.encoders; - -import java.io.IOException; -import java.io.OutputStream; - -/** - * Encode and decode byte arrays (typically from binary to 7-bit ASCII - * encodings). - */ -public interface Encoder -{ - int encode(byte[] data, int off, int length, OutputStream out) throws IOException; - - int decode(byte[] data, int off, int length, OutputStream out) throws IOException; - - int decode(String data, OutputStream out) throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/EncoderException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/EncoderException.java deleted file mode 100644 index 240810a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/EncoderException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.bc.util.encoders; - -public class EncoderException - extends IllegalStateException -{ - private Throwable cause; - - EncoderException(String msg, Throwable cause) - { - super(msg); - - this.cause = cause; - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Hex.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Hex.java deleted file mode 100644 index 44de994..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Hex.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.bc.util.encoders; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -public class Hex -{ - private static final Encoder encoder = new HexEncoder(); - - /** - * encode the input data producing a Hex encoded byte array. - * - * @return a byte array containing the Hex encoded data. - */ - public static byte[] encode( - byte[] data) - { - return encode(data, 0, data.length); - } - - /** - * encode the input data producing a Hex encoded byte array. - * - * @return a byte array containing the Hex encoded data. - */ - public static byte[] encode( - byte[] data, - int off, - int length) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.encode(data, off, length, bOut); - } - catch (Exception e) - { - throw new EncoderException("exception encoding Hex string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * Hex encode the byte data writing it to the given output stream. - * - * @return the number of bytes produced. - */ - public static int encode( - byte[] data, - OutputStream out) - throws IOException - { - return encoder.encode(data, 0, data.length, out); - } - - /** - * Hex encode the byte data writing it to the given output stream. - * - * @return the number of bytes produced. - */ - public static int encode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - return encoder.encode(data, off, length, out); - } - - /** - * decode the Hex encoded input data. It is assumed the input data is valid. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - byte[] data) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.decode(data, 0, data.length, bOut); - } - catch (Exception e) - { - throw new DecoderException("exception decoding Hex data: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * decode the Hex encoded String data - whitespace will be ignored. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - String data) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.decode(data, bOut); - } - catch (Exception e) - { - throw new DecoderException("exception decoding Hex string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * decode the Hex encoded String data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public static int decode( - String data, - OutputStream out) - throws IOException - { - return encoder.decode(data, out); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexEncoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexEncoder.java deleted file mode 100644 index c00b9a7..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexEncoder.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.bc.util.encoders; - -import java.io.IOException; -import java.io.OutputStream; - -public class HexEncoder - implements Encoder -{ - protected final byte[] encodingTable = - { - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', - (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f' - }; - - /* - * set up the decoding table. - */ - protected final byte[] decodingTable = new byte[128]; - - protected void initialiseDecodingTable() - { - for (int i = 0; i < decodingTable.length; i++) - { - decodingTable[i] = (byte)0xff; - } - - for (int i = 0; i < encodingTable.length; i++) - { - decodingTable[encodingTable[i]] = (byte)i; - } - - decodingTable['A'] = decodingTable['a']; - decodingTable['B'] = decodingTable['b']; - decodingTable['C'] = decodingTable['c']; - decodingTable['D'] = decodingTable['d']; - decodingTable['E'] = decodingTable['e']; - decodingTable['F'] = decodingTable['f']; - } - - public HexEncoder() - { - initialiseDecodingTable(); - } - - /** - * encode the input data producing a Hex output stream. - * - * @return the number of bytes produced. - */ - public int encode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - for (int i = off; i < (off + length); i++) - { - int v = data[i] & 0xff; - - out.write(encodingTable[(v >>> 4)]); - out.write(encodingTable[v & 0xf]); - } - - return length * 2; - } - - private static boolean ignore( - char c) - { - return c == '\n' || c =='\r' || c == '\t' || c == ' '; - } - - /** - * decode the Hex encoded byte data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public int decode( - byte[] data, - int off, - int length, - OutputStream out) - throws IOException - { - byte b1, b2; - int outLen = 0; - - int end = off + length; - - while (end > off) - { - if (!ignore((char)data[end - 1])) - { - break; - } - - end--; - } - - int i = off; - while (i < end) - { - while (i < end && ignore((char)data[i])) - { - i++; - } - - b1 = decodingTable[data[i++]]; - - while (i < end && ignore((char)data[i])) - { - i++; - } - - b2 = decodingTable[data[i++]]; - - if ((b1 | b2) < 0) - { - throw new IOException("invalid characters encountered in Hex data"); - } - - out.write((b1 << 4) | b2); - - outLen++; - } - - return outLen; - } - - /** - * decode the Hex encoded String data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public int decode( - String data, - OutputStream out) - throws IOException - { - byte b1, b2; - int length = 0; - - int end = data.length(); - - while (end > 0) - { - if (!ignore(data.charAt(end - 1))) - { - break; - } - - end--; - } - - int i = 0; - while (i < end) - { - while (i < end && ignore(data.charAt(i))) - { - i++; - } - - b1 = decodingTable[data.charAt(i++)]; - - while (i < end && ignore(data.charAt(i))) - { - i++; - } - - b2 = decodingTable[data.charAt(i++)]; - - if ((b1 | b2) < 0) - { - throw new IOException("invalid characters encountered in Hex string"); - } - - out.write((b1 << 4) | b2); - - length++; - } - - return length; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexTranslator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexTranslator.java deleted file mode 100644 index 29c03a2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/HexTranslator.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.util.encoders; - -/** - * Converters for going from hex to binary and back. Note: this class assumes ASCII processing. - */ -public class HexTranslator - implements Translator -{ - private static final byte[] hexTable = - { - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', - (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f' - }; - - /** - * size of the output block on encoding produced by getDecodedBlockSize() - * bytes. - */ - public int getEncodedBlockSize() - { - return 2; - } - - public int encode( - byte[] in, - int inOff, - int length, - byte[] out, - int outOff) - { - for (int i = 0, j = 0; i < length; i++, j += 2) - { - out[outOff + j] = hexTable[(in[inOff] >> 4) & 0x0f]; - out[outOff + j + 1] = hexTable[in[inOff] & 0x0f]; - - inOff++; - } - - return length * 2; - } - - /** - * size of the output block on decoding produced by getEncodedBlockSize() - * bytes. - */ - public int getDecodedBlockSize() - { - return 1; - } - - public int decode( - byte[] in, - int inOff, - int length, - byte[] out, - int outOff) - { - int halfLength = length / 2; - byte left, right; - for (int i = 0; i < halfLength; i++) - { - left = in[inOff + i * 2]; - right = in[inOff + i * 2 + 1]; - - if (left < (byte)'a') - { - out[outOff] = (byte)((left - '0') << 4); - } - else - { - out[outOff] = (byte)((left - 'a' + 10) << 4); - } - if (right < (byte)'a') - { - out[outOff] += (byte)(right - '0'); - } - else - { - out[outOff] += (byte)(right - 'a' + 10); - } - - outOff++; - } - - return halfLength; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Translator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Translator.java deleted file mode 100644 index 4616db3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/Translator.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.util.encoders; - -/** - * general interface for an translator. - */ -public interface Translator -{ - /** - * size of the output block on encoding produced by getDecodedBlockSize() - * bytes. - */ - public int getEncodedBlockSize(); - - public int encode(byte[] in, int inOff, int length, byte[] out, int outOff); - - /** - * size of the output block on decoding produced by getEncodedBlockSize() - * bytes. - */ - public int getDecodedBlockSize(); - - public int decode(byte[] in, int inOff, int length, byte[] out, int outOff); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64.java deleted file mode 100644 index db6b6c2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.bc.util.encoders; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -/** - * Convert binary data to and from UrlBase64 encoding. This is identical to - * Base64 encoding, except that the padding character is "." and the other - * non-alphanumeric characters are "-" and "_" instead of "+" and "/". - *

    - * The purpose of UrlBase64 encoding is to provide a compact encoding of binary - * data that is safe for use as an URL parameter. Base64 encoding does not - * produce encoded values that are safe for use in URLs, since "/" can be - * interpreted as a path delimiter; "+" is the encoded form of a space; and - * "=" is used to separate a name from the corresponding value in an URL - * parameter. - */ -public class UrlBase64 -{ - private static final Encoder encoder = new UrlBase64Encoder(); - - /** - * Encode the input data producing a URL safe base 64 encoded byte array. - * - * @return a byte array containing the URL safe base 64 encoded data. - */ - public static byte[] encode( - byte[] data) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.encode(data, 0, data.length, bOut); - } - catch (Exception e) - { - throw new EncoderException("exception encoding URL safe base64 data: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * Encode the byte data writing it to the given output stream. - * - * @return the number of bytes produced. - */ - public static int encode( - byte[] data, - OutputStream out) - throws IOException - { - return encoder.encode(data, 0, data.length, out); - } - - /** - * Decode the URL safe base 64 encoded input data - white space will be ignored. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - byte[] data) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.decode(data, 0, data.length, bOut); - } - catch (Exception e) - { - throw new DecoderException("exception decoding URL safe base64 string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * decode the URL safe base 64 encoded byte data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public static int decode( - byte[] data, - OutputStream out) - throws IOException - { - return encoder.decode(data, 0, data.length, out); - } - - /** - * decode the URL safe base 64 encoded String data - whitespace will be ignored. - * - * @return a byte array representing the decoded data. - */ - public static byte[] decode( - String data) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - try - { - encoder.decode(data, bOut); - } - catch (Exception e) - { - throw new DecoderException("exception decoding URL safe base64 string: " + e.getMessage(), e); - } - - return bOut.toByteArray(); - } - - /** - * Decode the URL safe base 64 encoded String data writing it to the given output stream, - * whitespace characters will be ignored. - * - * @return the number of bytes produced. - */ - public static int decode( - String data, - OutputStream out) - throws IOException - { - return encoder.decode(data, out); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64Encoder.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64Encoder.java deleted file mode 100644 index 7748e81..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/encoders/UrlBase64Encoder.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.util.encoders; - -/** - * Convert binary data to and from UrlBase64 encoding. This is identical to - * Base64 encoding, except that the padding character is "." and the other - * non-alphanumeric characters are "-" and "_" instead of "+" and "/". - *

    - * The purpose of UrlBase64 encoding is to provide a compact encoding of binary - * data that is safe for use as an URL parameter. Base64 encoding does not - * produce encoded values that are safe for use in URLs, since "/" can be - * interpreted as a path delimiter; "+" is the encoded form of a space; and - * "=" is used to separate a name from the corresponding value in an URL - * parameter. - */ -public class UrlBase64Encoder extends Base64Encoder -{ - public UrlBase64Encoder() - { - encodingTable[encodingTable.length - 2] = (byte) '-'; - encodingTable[encodingTable.length - 1] = (byte) '_'; - padding = (byte) '.'; - // we must re-create the decoding table with the new encoded values. - initialiseDecodingTable(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/StreamOverflowException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/StreamOverflowException.java deleted file mode 100644 index a755e10..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/StreamOverflowException.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.bc.util.io; - -import java.io.IOException; - -public class StreamOverflowException - extends IOException -{ - public StreamOverflowException(String msg) - { - super(msg); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/Streams.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/Streams.java deleted file mode 100644 index c3f504a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/Streams.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.bc.util.io; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -public final class Streams -{ - private static int BUFFER_SIZE = 512; - - public static void drain(InputStream inStr) - throws IOException - { - byte[] bs = new byte[BUFFER_SIZE]; - while (inStr.read(bs, 0, bs.length) >= 0) - { - } - } - - public static byte[] readAll(InputStream inStr) - throws IOException - { - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - pipeAll(inStr, buf); - return buf.toByteArray(); - } - - public static byte[] readAllLimited(InputStream inStr, int limit) - throws IOException - { - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - pipeAllLimited(inStr, limit, buf); - return buf.toByteArray(); - } - - public static int readFully(InputStream inStr, byte[] buf) - throws IOException - { - return readFully(inStr, buf, 0, buf.length); - } - - public static int readFully(InputStream inStr, byte[] buf, int off, int len) - throws IOException - { - int totalRead = 0; - while (totalRead < len) - { - int numRead = inStr.read(buf, off + totalRead, len - totalRead); - if (numRead < 0) - { - break; - } - totalRead += numRead; - } - return totalRead; - } - - public static void pipeAll(InputStream inStr, OutputStream outStr) - throws IOException - { - byte[] bs = new byte[BUFFER_SIZE]; - int numRead; - while ((numRead = inStr.read(bs, 0, bs.length)) >= 0) - { - outStr.write(bs, 0, numRead); - } - } - - public static long pipeAllLimited(InputStream inStr, long limit, OutputStream outStr) - throws IOException - { - long total = 0; - byte[] bs = new byte[BUFFER_SIZE]; - int numRead; - while ((numRead = inStr.read(bs, 0, bs.length)) >= 0) - { - total += numRead; - if (total > limit) - { - throw new StreamOverflowException("Data Overflow"); - } - outStr.write(bs, 0, numRead); - } - return total; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeInputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeInputStream.java deleted file mode 100644 index 00c2b6d..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeInputStream.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bc.util.io; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -public class TeeInputStream - extends InputStream -{ - private final InputStream input; - private final OutputStream output; - - public TeeInputStream(InputStream input, OutputStream output) - { - this.input = input; - this.output = output; - } - - public int read(byte[] buf) - throws IOException - { - return read(buf, 0, buf.length); - } - - public int read(byte[] buf, int off, int len) - throws IOException - { - int i = input.read(buf, off, len); - - if (i > 0) - { - output.write(buf, off, i); - } - - return i; - } - - public int read() - throws IOException - { - int i = input.read(); - - if (i >= 0) - { - output.write(i); - } - - return i; - } - - public void close() - throws IOException - { - this.input.close(); - this.output.close(); - } - - public OutputStream getOutputStream() - { - return output; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeOutputStream.java deleted file mode 100644 index 28edd60..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/TeeOutputStream.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.bc.util.io; - -import java.io.IOException; -import java.io.OutputStream; - -public class TeeOutputStream - extends OutputStream -{ - private OutputStream output1; - private OutputStream output2; - - public TeeOutputStream(OutputStream output1, OutputStream output2) - { - this.output1 = output1; - this.output2 = output2; - } - - public void write(byte[] buf) - throws IOException - { - this.output1.write(buf); - this.output2.write(buf); - } - - public void write(byte[] buf, int off, int len) - throws IOException - { - this.output1.write(buf, off, len); - this.output2.write(buf, off, len); - } - - public void write(int b) - throws IOException - { - this.output1.write(b); - this.output2.write(b); - } - - public void flush() - throws IOException - { - this.output1.flush(); - this.output2.flush(); - } - - public void close() - throws IOException - { - this.output1.close(); - this.output2.close(); - } -} \ No newline at end of file diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemGenerationException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemGenerationException.java deleted file mode 100644 index 19f8a0b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemGenerationException.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.bc.util.io.pem; - -import java.io.IOException; - -public class PemGenerationException - extends IOException -{ - private Throwable cause; - - public PemGenerationException(String message, Throwable cause) - { - super(message); - this.cause = cause; - } - - public PemGenerationException(String message) - { - super(message); - } - - public Throwable getCause() - { - return cause; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemHeader.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemHeader.java deleted file mode 100644 index 29c3f29..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemHeader.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.bc.util.io.pem; - -public class PemHeader -{ - private String name; - private String value; - - public PemHeader(String name, String value) - { - this.name = name; - this.value = value; - } - - public String getName() - { - return name; - } - - public String getValue() - { - return value; - } - - public int hashCode() - { - return getHashCode(this.name) + 31 * getHashCode(this.value); - } - - public boolean equals(Object o) - { - if (!(o instanceof PemHeader)) - { - return false; - } - - PemHeader other = (PemHeader)o; - - return other == this || (isEqual(this.name, other.name) && isEqual(this.value, other.value)); - } - - private int getHashCode(String s) - { - if (s == null) - { - return 1; - } - - return s.hashCode(); - } - - private boolean isEqual(String s1, String s2) - { - if (s1 == s2) - { - return true; - } - - if (s1 == null || s2 == null) - { - return false; - } - - return s1.equals(s2); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObject.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObject.java deleted file mode 100644 index 2f2c5f2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObject.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.bc.util.io.pem; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class PemObject - implements PemObjectGenerator -{ - private static final List EMPTY_LIST = Collections.unmodifiableList(new ArrayList()); - - private String type; - private List headers; - private byte[] content; - - /** - * Generic constructor for object without headers. - * - * @param type pem object type. - * @param content the binary content of the object. - */ - public PemObject(String type, byte[] content) - { - this(type, EMPTY_LIST, content); - } - - /** - * Generic constructor for object with headers. - * - * @param type pem object type. - * @param headers a list of PemHeader objects. - * @param content the binary content of the object. - */ - public PemObject(String type, List headers, byte[] content) - { - this.type = type; - this.headers = Collections.unmodifiableList(headers); - this.content = content; - } - - public String getType() - { - return type; - } - - public List getHeaders() - { - return headers; - } - - public byte[] getContent() - { - return content; - } - - public PemObject generate() - throws PemGenerationException - { - return this; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectGenerator.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectGenerator.java deleted file mode 100644 index 347230f..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectGenerator.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.bc.util.io.pem; - -public interface PemObjectGenerator -{ - PemObject generate() - throws PemGenerationException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectParser.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectParser.java deleted file mode 100644 index b4dbf85..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemObjectParser.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.bc.util.io.pem; - -import java.io.IOException; - -public interface PemObjectParser -{ - Object parseObject(PemObject obj) - throws IOException; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemReader.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemReader.java deleted file mode 100644 index 3298a9c..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemReader.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.util.io.pem; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -import org.bc.util.encoders.Base64; - -public class PemReader - extends BufferedReader -{ - private static final String BEGIN = "-----BEGIN "; - private static final String END = "-----END "; - - public PemReader(Reader reader) - { - super(reader); - } - - public PemObject readPemObject() - throws IOException - { - String line = readLine(); - - while (line != null && !line.startsWith(BEGIN)) - { - line = readLine(); - } - - if (line != null) - { - line = line.substring(BEGIN.length()); - int index = line.indexOf('-'); - String type = line.substring(0, index); - - if (index > 0) - { - return loadObject(type); - } - } - - return null; - } - - private PemObject loadObject(String type) - throws IOException - { - String line; - String endMarker = END + type; - StringBuffer buf = new StringBuffer(); - List headers = new ArrayList(); - - while ((line = readLine()) != null) - { - if (line.indexOf(":") >= 0) - { - int index = line.indexOf(':'); - String hdr = line.substring(0, index); - String value = line.substring(index + 1).trim(); - - headers.add(new PemHeader(hdr, value)); - - continue; - } - - if (line.indexOf(endMarker) != -1) - { - break; - } - - buf.append(line.trim()); - } - - if (line == null) - { - throw new IOException(endMarker + " not found"); - } - - return new PemObject(type, headers, Base64.decode(buf.toString())); - } - -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemWriter.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemWriter.java deleted file mode 100644 index 0d2f5a4..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/io/pem/PemWriter.java +++ /dev/null @@ -1,137 +0,0 @@ -package org.bc.util.io.pem; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.Writer; -import java.util.Iterator; - -import org.bc.util.encoders.Base64; - -/** - * A generic PEM writer, based on RFC 1421 - */ -public class PemWriter - extends BufferedWriter -{ - private static final int LINE_LENGTH = 64; - - private final int nlLength; - private char[] buf = new char[LINE_LENGTH]; - - /** - * Base constructor. - * - * @param out output stream to use. - */ - public PemWriter(Writer out) - { - super(out); - - String nl = System.getProperty("line.separator"); - if (nl != null) - { - nlLength = nl.length(); - } - else - { - nlLength = 2; - } - } - - /** - * Return the number of bytes or characters required to contain the - * passed in object if it is PEM encoded. - * - * @param obj pem object to be output - * @return an estimate of the number of bytes - */ - public int getOutputSize(PemObject obj) - { - // BEGIN and END boundaries. - int size = (2 * (obj.getType().length() + 10 + nlLength)) + 6 + 4; - - if (!obj.getHeaders().isEmpty()) - { - for (Iterator it = obj.getHeaders().iterator(); it.hasNext();) - { - PemHeader hdr = (PemHeader)it.next(); - - size += hdr.getName().length() + ": ".length() + hdr.getValue().length() + nlLength; - } - - size += nlLength; - } - - // base64 encoding - int dataLen = ((obj.getContent().length + 2) / 3) * 4; - - size += dataLen + (((dataLen + LINE_LENGTH - 1) / LINE_LENGTH) * nlLength); - - return size; - } - - public void writeObject(PemObjectGenerator objGen) - throws IOException - { - PemObject obj = objGen.generate(); - - writePreEncapsulationBoundary(obj.getType()); - - if (!obj.getHeaders().isEmpty()) - { - for (Iterator it = obj.getHeaders().iterator(); it.hasNext();) - { - PemHeader hdr = (PemHeader)it.next(); - - this.write(hdr.getName()); - this.write(": "); - this.write(hdr.getValue()); - this.newLine(); - } - - this.newLine(); - } - - writeEncoded(obj.getContent()); - writePostEncapsulationBoundary(obj.getType()); - } - - private void writeEncoded(byte[] bytes) - throws IOException - { - bytes = Base64.encode(bytes); - - for (int i = 0; i < bytes.length; i += buf.length) - { - int index = 0; - - while (index != buf.length) - { - if ((i + index) >= bytes.length) - { - break; - } - buf[index] = (char)bytes[i + index]; - index++; - } - this.write(buf, 0, index); - this.newLine(); - } - } - - private void writePreEncapsulationBoundary( - String type) - throws IOException - { - this.write("-----BEGIN " + type + "-----"); - this.newLine(); - } - - private void writePostEncapsulationBoundary( - String type) - throws IOException - { - this.write("-----END " + type + "-----"); - this.newLine(); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/FixedSecureRandom.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/FixedSecureRandom.java deleted file mode 100644 index 5f0a9a3..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/FixedSecureRandom.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.bc.util.test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.SecureRandom; - -public class FixedSecureRandom - extends SecureRandom -{ - private byte[] _data; - - private int _index; - private int _intPad; - - public FixedSecureRandom(byte[] value) - { - this(false, new byte[][] { value }); - } - - public FixedSecureRandom( - byte[][] values) - { - this(false, values); - } - - /** - * Pad the data on integer boundaries. This is necessary for the classpath project's BigInteger - * implementation. - */ - public FixedSecureRandom( - boolean intPad, - byte[] value) - { - this(intPad, new byte[][] { value }); - } - - /** - * Pad the data on integer boundaries. This is necessary for the classpath project's BigInteger - * implementation. - */ - public FixedSecureRandom( - boolean intPad, - byte[][] values) - { - ByteArrayOutputStream bOut = new ByteArrayOutputStream(); - - for (int i = 0; i != values.length; i++) - { - try - { - bOut.write(values[i]); - } - catch (IOException e) - { - throw new IllegalArgumentException("can't save value array."); - } - } - - _data = bOut.toByteArray(); - - if (intPad) - { - _intPad = _data.length % 4; - } - } - - public void nextBytes(byte[] bytes) - { - System.arraycopy(_data, _index, bytes, 0, bytes.length); - - _index += bytes.length; - } - - // - // classpath's implementation of SecureRandom doesn't currently go back to nextBytes - // when next is called. We can't override next as it's a final method. - // - public int nextInt() - { - int val = 0; - - val |= nextValue() << 24; - val |= nextValue() << 16; - - if (_intPad == 2) - { - _intPad--; - } - else - { - val |= nextValue() << 8; - } - - if (_intPad == 1) - { - _intPad--; - } - else - { - val |= nextValue(); - } - - return val; - } - - // - // classpath's implementation of SecureRandom doesn't currently go back to nextBytes - // when next is called. We can't override next as it's a final method. - // - public long nextLong() - { - long val = 0; - - val |= (long)nextValue() << 56; - val |= (long)nextValue() << 48; - val |= (long)nextValue() << 40; - val |= (long)nextValue() << 32; - val |= (long)nextValue() << 24; - val |= (long)nextValue() << 16; - val |= (long)nextValue() << 8; - val |= (long)nextValue(); - - return val; - } - - public boolean isExhausted() - { - return _index == _data.length; - } - - private int nextValue() - { - return _data[_index++] & 0xff; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/NumberParsing.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/NumberParsing.java deleted file mode 100644 index a6085b9..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/NumberParsing.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.bc.util.test; - -/** - * Parsing - */ -public final class NumberParsing -{ - private NumberParsing() - { - // Hide constructor - } - - public static long decodeLongFromHex(String longAsString) - { - if ((longAsString.charAt(1) == 'x') - || (longAsString.charAt(1) == 'X')) - { - return Long.parseLong(longAsString.substring(2), 16); - } - - return Long.parseLong(longAsString, 16); - } - - public static int decodeIntFromHex(String intAsString) - { - if ((intAsString.charAt(1) == 'x') - || (intAsString.charAt(1) == 'X')) - { - return Integer.parseInt(intAsString.substring(2), 16); - } - - return Integer.parseInt(intAsString, 16); - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTest.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTest.java deleted file mode 100644 index cccdb2b..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.bc.util.test; - -import java.io.PrintStream; - -import org.bc.util.Arrays; - -public abstract class SimpleTest - implements Test -{ - public abstract String getName(); - - private TestResult success() - { - return SimpleTestResult.successful(this, "Okay"); - } - - protected void fail( - String message) - { - throw new TestFailedException(SimpleTestResult.failed(this, message)); - } - - protected void fail( - String message, - Throwable throwable) - { - throw new TestFailedException(SimpleTestResult.failed(this, message, throwable)); - } - - protected void fail( - String message, - Object expected, - Object found) - { - throw new TestFailedException(SimpleTestResult.failed(this, message, expected, found)); - } - - protected boolean areEqual( - byte[] a, - byte[] b) - { - return Arrays.areEqual(a, b); - } - - public TestResult perform() - { - try - { - performTest(); - - return success(); - } - catch (TestFailedException e) - { - return e.getResult(); - } - catch (Exception e) - { - return SimpleTestResult.failed(this, "Exception: " + e, e); - } - } - - protected static void runTest( - Test test) - { - runTest(test, System.out); - } - - protected static void runTest( - Test test, - PrintStream out) - { - TestResult result = test.perform(); - - out.println(result.toString()); - if (result.getException() != null) - { - result.getException().printStackTrace(out); - } - } - - public abstract void performTest() - throws Exception; -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTestResult.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTestResult.java deleted file mode 100644 index a31e02a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/SimpleTestResult.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.bc.util.test; - -public class SimpleTestResult implements TestResult -{ - private static final String SEPARATOR = System.getProperty("line.separator"); - - private boolean success; - private String message; - private Throwable exception; - - public SimpleTestResult(boolean success, String message) - { - this.success = success; - this.message = message; - } - - public SimpleTestResult(boolean success, String message, Throwable exception) - { - this.success = success; - this.message = message; - this.exception = exception; - } - - public static TestResult successful( - Test test, - String message) - { - return new SimpleTestResult(true, test.getName() + ": " + message); - } - - public static TestResult failed( - Test test, - String message) - { - return new SimpleTestResult(false, test.getName() + ": " + message); - } - - public static TestResult failed( - Test test, - String message, - Throwable t) - { - return new SimpleTestResult(false, test.getName() + ": " + message, t); - } - - public static TestResult failed( - Test test, - String message, - Object expected, - Object found) - { - return failed(test, message + SEPARATOR + "Expected: " + expected + SEPARATOR + "Found : " + found); - } - - public static String failedMessage(String algorithm, String testName, String expected, - String actual) - { - StringBuffer sb = new StringBuffer(algorithm); - sb.append(" failing ").append(testName); - sb.append(SEPARATOR).append(" expected: ").append(expected); - sb.append(SEPARATOR).append(" got : ").append(actual); - - return sb.toString(); - } - - public boolean isSuccessful() - { - return success; - } - - public String toString() - { - return message; - } - - public Throwable getException() - { - return exception; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/Test.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/Test.java deleted file mode 100644 index 58036a2..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/Test.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.bc.util.test; - -public interface Test -{ - String getName(); - - TestResult perform(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestFailedException.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestFailedException.java deleted file mode 100644 index 6dbb985..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestFailedException.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.bc.util.test; - -public class TestFailedException - extends RuntimeException -{ - private TestResult _result; - - public TestFailedException( - TestResult result) - { - _result = result; - } - - public TestResult getResult() - { - return _result; - } -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestResult.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestResult.java deleted file mode 100644 index b68e91e..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/TestResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.bc.util.test; - -public interface TestResult -{ - public boolean isSuccessful(); - - public Throwable getException(); - - public String toString(); -} diff --git a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/UncloseableOutputStream.java b/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/UncloseableOutputStream.java deleted file mode 100644 index 4fd302a..0000000 --- a/java/ext/lcrypto-jdk15on-148/src/org/bc/util/test/UncloseableOutputStream.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.bc.util.test; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -public class UncloseableOutputStream extends FilterOutputStream -{ - public UncloseableOutputStream(OutputStream s) - { - super(s); - } - - public void close() - { - throw new RuntimeException("close() called on UncloseableOutputStream"); - } - - public void write(byte[] b, int off, int len) throws IOException - { - out.write(b, off, len); - } - } diff --git a/java/ext/make-bc-packaged b/java/ext/make-bc-packaged new file mode 100755 index 0000000..4844ae1 --- /dev/null +++ b/java/ext/make-bc-packaged @@ -0,0 +1,29 @@ +set -x +rm -rf bc-packaged +tar -hczf bc-project.tar.gz bc-project/ + +mkdir t +cd t +tar xzf ../bc-project.tar.gz +rm ../bc-project.tar.gz + +cd bc-project +find . -type f -name "*.java" -print0 | xargs -0 sed -i '' 's/org.bouncycastle/org.bc/g' + +for DIR in $(find . -type d -name "bouncycastle") +do + pushd $DIR + cd .. + mv bouncycastle bc + popd +done + +cd .. + +mv bc-project ../bc-packaged +cd .. + +rmdir t +cp bc-packaged-template/.* bc-packaged +cp bc-packaged-template/* bc-packaged + diff --git a/java/ext/setup.bc b/java/ext/setup.bc new file mode 100644 index 0000000..3d1ca5e --- /dev/null +++ b/java/ext/setup.bc @@ -0,0 +1,7 @@ +set -x + +wget http://www.bouncycastle.org/download/lcrypto-jdk15on-149.tar.gz +tar xzf lcrypto-jdk15on-*.tar.gz +ln -fs lcrypto-jdk15on-* bc-project + +./make-bc-packaged diff --git a/java/webserver/.project b/java/webserver/.project index fbc5732..927c3df 100644 --- a/java/webserver/.project +++ b/java/webserver/.project @@ -3,9 +3,9 @@ Mailiverse.Mail-WebServer - Mailiverse.Ext.BouncyCastle Mailiverse.Ext.JordanZimmerman Mailiverse.Ext.Json + Mailiverse.Ext.BouncyCastle diff --git a/java/webserver/.settings/org.eclipse.wst.common.component b/java/webserver/.settings/org.eclipse.wst.common.component index 28142d5..572db56 100644 --- a/java/webserver/.settings/org.eclipse.wst.common.component +++ b/java/webserver/.settings/org.eclipse.wst.common.component @@ -3,10 +3,10 @@ - + uses - + uses diff --git a/java/webserver/build.xml b/java/webserver/build.xml index 3e00bdf..af12d7d 100644 --- a/java/webserver/build.xml +++ b/java/webserver/build.xml @@ -7,7 +7,7 @@ - + diff --git a/java/webserver/src/mail/web/PGPLookUp.java b/java/webserver/src/mail/web/PGPLookUp.java new file mode 100644 index 0000000..43f7d9e --- /dev/null +++ b/java/webserver/src/mail/web/PGPLookUp.java @@ -0,0 +1,199 @@ +/** + * Author: Timothy Prepscius + * License: GPLv3 Affero + keep my name in the code! + */ +package mail.web; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import core.callback.CallbackSync; +import core.constants.ConstantsServer; +import core.util.HttpDelegate; +import core.util.HttpDelegateJava; +import core.util.Strings; + +/** + * Servlet implementation class Random + */ +@WebServlet("/PGPLookUp") +public class PGPLookUp extends HttpServlet +{ + private static final long serialVersionUID = 1L; + + + /** + * @see HttpServlet#HttpServlet() + */ + public PGPLookUp() + { + super(); + } + + void doCors(HttpServletResponse response) + { + response.setHeader("Access-Control-Allow-Origin", ConstantsWeb.WEB_SERVER_URL); + response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", "X-Requested-With"); + } + + protected String getPublicKeyFromDb (String email) throws Exception + { + return null; + } + + protected String getPublicKeyId (String email) throws Exception + { + // http://pgp.mit.edu:11371/pks/lookup?op=vindex&search=0x41FB71A4C0FF9D59&options=mr + // http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xC0FF9D59&options=mr + // http://pgp.mit.edu:11371/pks/lookup?search=edwardsnowden%40nsawhistleblower.com&op=vindex + + HttpDelegate httpDelegate = new HttpDelegateJava(); + CallbackSync result = new CallbackSync( + httpDelegate.execute_( + HttpDelegate.GET, + "http://pgp.mit.edu:11371/pks/lookup?op=vindex&options=mr&exact=on&search=" + email, + null, false, false) + ); + + result.invoke(); + String text = result.export(0); + + /* + info:1:2 + pub:69B37AA9:1:4096:1339546547:: + uid:Nathan Freitas :1339547281:: + uid:Nathan of Guardian :1339547297:: + uid:Nathan Freitas :1339546547:: + pub:B374CBD2:17:3072:1276097766::r + uid:Nathan of Guardian :1307704592:: + uat:::: + */ + + String[] lines = Strings.splitLines(text); + + String info = null; + String pub = null; + String uid = null; + boolean found = false; + for (String line : lines) + { + if (line.startsWith("info:")) + info = line; + else + if (line.startsWith("pub:")) + pub = line; + else + if (line.startsWith("uid:")) + uid = line; + + if (uid!=null && uid.toLowerCase().contains(email) && + pub!=null && !pub.endsWith(":r")) + { + found = true; + break; + } + } + + if (!found) + throw new Exception ("Could not find valid ID"); + + String[] pubParts = pub.split(":"); + return pubParts[1]; + + } + + protected String getPublicKey (String publicKeyId) throws Exception + { + // http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x69B37AA9&options=mr + + HttpDelegate httpDelegate = new HttpDelegateJava(); + CallbackSync result = new CallbackSync( + httpDelegate.execute_( + HttpDelegate.GET, + "http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x" + publicKeyId, + null, false, false) + ); + + result.invoke(); + String text = result.export(0); + + String beginBlock = "-----BEGIN PGP PUBLIC KEY BLOCK-----"; + String endBlock = "-----END PGP PUBLIC KEY BLOCK-----"; + + int blockBegin = text.indexOf(beginBlock); + int blockEnd = text.indexOf(endBlock); + + if (blockBegin == -1 || blockEnd ==-1) + throw new Exception ("Could not find block header or footer"); + + String block = text.substring(blockBegin, blockEnd+endBlock.length()) + "\n"; + + return block; + + /* + Public Key Server -- Get ``0x69b37aa9 '' +

    Public Key Server -- Get ``0x69b37aa9 ''

    +
    +		-----BEGIN PGP PUBLIC KEY BLOCK-----
    +		Version: SKS 1.1.0
    +		
    +		mQINBE/X27MBEACulyj4CfeOClOxZ2/tS6qnwjN8xQCVb7kWAS3yiMaXZ3oTcsay2njap1p4
    +		.
    +		.
    +		.
    +		pk13qRICEQk69M7L7zjpsVRwzFB2whFBZt6HwbYQeKbinv6aABMzllxTS0xxhw1SrY4dIuss
    +		MQgEEy/+
    +		=nMps
    +		-----END PGP PUBLIC KEY BLOCK-----
    +		
    + + */ + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doCors(response); + + try + { + String email = request.getParameter("email"); + + if (email.endsWith(ConstantsServer.AT_HOST)) + { + String publicKey = getPublicKeyFromDb (email); + response.getOutputStream().write(publicKey.getBytes()); + } + else + { + String publicKeyId = getPublicKeyId(email); + String publicKey = getPublicKey(publicKeyId); + response.getOutputStream().write(publicKey.getBytes()); + } + } + catch (Exception e) + { + throw new ServletException(e); + } + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) + */ + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + doGet(request, response); + } + + @Override + protected void doOptions (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + doCors(response); + super.doOptions(request, response); + } +} diff --git a/keys/clean-key b/keys/clean-key new file mode 100755 index 0000000..30de318 --- /dev/null +++ b/keys/clean-key @@ -0,0 +1,3 @@ +rm *.jks +rm *.cer +rm *.b64 diff --git a/keys/client/clean b/keys/client/clean deleted file mode 100755 index 30de318..0000000 --- a/keys/client/clean +++ /dev/null @@ -1,3 +0,0 @@ -rm *.jks -rm *.cer -rm *.b64 diff --git a/keys/client/clean b/keys/client/clean new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/client/clean @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/client/make b/keys/client/make deleted file mode 100755 index 451e78a..0000000 --- a/keys/client/make +++ /dev/null @@ -1,5 +0,0 @@ -keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks -keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer -keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks -java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks - diff --git a/keys/client/make-key b/keys/client/make-key new file mode 120000 index 0000000..ecb472e --- /dev/null +++ b/keys/client/make-key @@ -0,0 +1 @@ +../make-key \ No newline at end of file diff --git a/keys/client/make.auto b/keys/client/make.auto deleted file mode 100755 index 8167e33..0000000 --- a/keys/client/make.auto +++ /dev/null @@ -1,101 +0,0 @@ -#!/opt/local/bin/expect -f -# -# This Expect script was generated by autoexpect on Thu Sep 5 10:43:19 2013 -# Expect and autoexpect were both written by Don Libes, NIST. -# -# Note that autoexpect does not guarantee a working script. It -# necessarily has to guess about certain things. Two reasons a script -# might fail are: -# -# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, -# etc.) and devices discard or ignore keystrokes that arrive "too -# quickly" after prompts. If you find your new script hanging up at -# one spot, try adding a short sleep just before the previous send. -# Setting "force_conservative" to 1 (see below) makes Expect do this -# automatically - pausing briefly before sending each character. This -# pacifies every program I know of. The -c flag makes the script do -# this in the first place. The -C flag allows you to define a -# character to toggle this mode off and on. - -set force_conservative 0 ;# set to 1 to force conservative mode even if - ;# script wasn't run conservatively originally -if {$force_conservative} { - set send_slow {1 .1} - proc send {ignore arg} { - sleep .1 - exp_send -s -- $arg - } -} - -# -# 2) differing output - Some programs produce different output each time -# they run. The "date" command is an obvious example. Another is -# ftp, if it produces throughput statistics at the end of a file -# transfer. If this causes a problem, delete these patterns or replace -# them with wildcards. An alternative is to use the -p flag (for -# "prompt") which makes Expect only look for the last line of output -# (i.e., the prompt). The -P flag allows you to define a character to -# toggle this mode off and on. -# -# Read the man page for more info. -# -# -Don - - -set timeout -1 -spawn ./make -match_max 100000 -expect -exact "Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -What is your first and last name?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organizational unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organization?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your City or Locality?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your State or Province?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the two-letter country code for this unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?\r - \[no\]: " -send -- "yes\r" -expect -exact "yes\r -\r -Enter key password for \r - (RETURN if same as keystore password): " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Certificate stored in file \r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -sleep 1 -send -- "yes\r" -expect eof diff --git a/keys/key/clean b/keys/key/clean deleted file mode 100755 index 30de318..0000000 --- a/keys/key/clean +++ /dev/null @@ -1,3 +0,0 @@ -rm *.jks -rm *.cer -rm *.b64 diff --git a/keys/key/clean b/keys/key/clean new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/key/clean @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/key/make b/keys/key/make deleted file mode 100755 index 451e78a..0000000 --- a/keys/key/make +++ /dev/null @@ -1,5 +0,0 @@ -keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks -keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer -keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks -java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks - diff --git a/keys/key/make b/keys/key/make new file mode 120000 index 0000000..ecb472e --- /dev/null +++ b/keys/key/make @@ -0,0 +1 @@ +../make-key \ No newline at end of file diff --git a/keys/key/make.auto b/keys/key/make.auto deleted file mode 100755 index 8167e33..0000000 --- a/keys/key/make.auto +++ /dev/null @@ -1,101 +0,0 @@ -#!/opt/local/bin/expect -f -# -# This Expect script was generated by autoexpect on Thu Sep 5 10:43:19 2013 -# Expect and autoexpect were both written by Don Libes, NIST. -# -# Note that autoexpect does not guarantee a working script. It -# necessarily has to guess about certain things. Two reasons a script -# might fail are: -# -# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, -# etc.) and devices discard or ignore keystrokes that arrive "too -# quickly" after prompts. If you find your new script hanging up at -# one spot, try adding a short sleep just before the previous send. -# Setting "force_conservative" to 1 (see below) makes Expect do this -# automatically - pausing briefly before sending each character. This -# pacifies every program I know of. The -c flag makes the script do -# this in the first place. The -C flag allows you to define a -# character to toggle this mode off and on. - -set force_conservative 0 ;# set to 1 to force conservative mode even if - ;# script wasn't run conservatively originally -if {$force_conservative} { - set send_slow {1 .1} - proc send {ignore arg} { - sleep .1 - exp_send -s -- $arg - } -} - -# -# 2) differing output - Some programs produce different output each time -# they run. The "date" command is an obvious example. Another is -# ftp, if it produces throughput statistics at the end of a file -# transfer. If this causes a problem, delete these patterns or replace -# them with wildcards. An alternative is to use the -p flag (for -# "prompt") which makes Expect only look for the last line of output -# (i.e., the prompt). The -P flag allows you to define a character to -# toggle this mode off and on. -# -# Read the man page for more info. -# -# -Don - - -set timeout -1 -spawn ./make -match_max 100000 -expect -exact "Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -What is your first and last name?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organizational unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organization?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your City or Locality?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your State or Province?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the two-letter country code for this unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?\r - \[no\]: " -send -- "yes\r" -expect -exact "yes\r -\r -Enter key password for \r - (RETURN if same as keystore password): " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Certificate stored in file \r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -sleep 1 -send -- "yes\r" -expect eof diff --git a/keys/localrelay/clean b/keys/localrelay/clean deleted file mode 100755 index 30de318..0000000 --- a/keys/localrelay/clean +++ /dev/null @@ -1,3 +0,0 @@ -rm *.jks -rm *.cer -rm *.b64 diff --git a/keys/localrelay/clean b/keys/localrelay/clean new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/localrelay/clean @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/localrelay/make b/keys/localrelay/make deleted file mode 100755 index 451e78a..0000000 --- a/keys/localrelay/make +++ /dev/null @@ -1,5 +0,0 @@ -keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks -keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer -keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks -java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks - diff --git a/keys/localrelay/make b/keys/localrelay/make new file mode 120000 index 0000000..ecb472e --- /dev/null +++ b/keys/localrelay/make @@ -0,0 +1 @@ +../make-key \ No newline at end of file diff --git a/keys/localrelay/make.auto b/keys/localrelay/make.auto deleted file mode 100755 index 8167e33..0000000 --- a/keys/localrelay/make.auto +++ /dev/null @@ -1,101 +0,0 @@ -#!/opt/local/bin/expect -f -# -# This Expect script was generated by autoexpect on Thu Sep 5 10:43:19 2013 -# Expect and autoexpect were both written by Don Libes, NIST. -# -# Note that autoexpect does not guarantee a working script. It -# necessarily has to guess about certain things. Two reasons a script -# might fail are: -# -# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, -# etc.) and devices discard or ignore keystrokes that arrive "too -# quickly" after prompts. If you find your new script hanging up at -# one spot, try adding a short sleep just before the previous send. -# Setting "force_conservative" to 1 (see below) makes Expect do this -# automatically - pausing briefly before sending each character. This -# pacifies every program I know of. The -c flag makes the script do -# this in the first place. The -C flag allows you to define a -# character to toggle this mode off and on. - -set force_conservative 0 ;# set to 1 to force conservative mode even if - ;# script wasn't run conservatively originally -if {$force_conservative} { - set send_slow {1 .1} - proc send {ignore arg} { - sleep .1 - exp_send -s -- $arg - } -} - -# -# 2) differing output - Some programs produce different output each time -# they run. The "date" command is an obvious example. Another is -# ftp, if it produces throughput statistics at the end of a file -# transfer. If this causes a problem, delete these patterns or replace -# them with wildcards. An alternative is to use the -p flag (for -# "prompt") which makes Expect only look for the last line of output -# (i.e., the prompt). The -P flag allows you to define a character to -# toggle this mode off and on. -# -# Read the man page for more info. -# -# -Don - - -set timeout -1 -spawn ./make -match_max 100000 -expect -exact "Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -What is your first and last name?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organizational unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organization?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your City or Locality?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your State or Province?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the two-letter country code for this unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?\r - \[no\]: " -send -- "yes\r" -expect -exact "yes\r -\r -Enter key password for \r - (RETURN if same as keystore password): " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Certificate stored in file \r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -sleep 1 -send -- "yes\r" -expect eof diff --git a/keys/mail/clean b/keys/mail/clean deleted file mode 100755 index 30de318..0000000 --- a/keys/mail/clean +++ /dev/null @@ -1,3 +0,0 @@ -rm *.jks -rm *.cer -rm *.b64 diff --git a/keys/mail/clean b/keys/mail/clean new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/mail/clean @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/mail/make b/keys/mail/make deleted file mode 100755 index 63ef2b8..0000000 --- a/keys/mail/make +++ /dev/null @@ -1,4 +0,0 @@ -keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks -keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer -keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks -java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks diff --git a/keys/mail/make b/keys/mail/make new file mode 120000 index 0000000..ecb472e --- /dev/null +++ b/keys/mail/make @@ -0,0 +1 @@ +../make-key \ No newline at end of file diff --git a/keys/mail/make.auto b/keys/mail/make.auto deleted file mode 100755 index 8167e33..0000000 --- a/keys/mail/make.auto +++ /dev/null @@ -1,101 +0,0 @@ -#!/opt/local/bin/expect -f -# -# This Expect script was generated by autoexpect on Thu Sep 5 10:43:19 2013 -# Expect and autoexpect were both written by Don Libes, NIST. -# -# Note that autoexpect does not guarantee a working script. It -# necessarily has to guess about certain things. Two reasons a script -# might fail are: -# -# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, -# etc.) and devices discard or ignore keystrokes that arrive "too -# quickly" after prompts. If you find your new script hanging up at -# one spot, try adding a short sleep just before the previous send. -# Setting "force_conservative" to 1 (see below) makes Expect do this -# automatically - pausing briefly before sending each character. This -# pacifies every program I know of. The -c flag makes the script do -# this in the first place. The -C flag allows you to define a -# character to toggle this mode off and on. - -set force_conservative 0 ;# set to 1 to force conservative mode even if - ;# script wasn't run conservatively originally -if {$force_conservative} { - set send_slow {1 .1} - proc send {ignore arg} { - sleep .1 - exp_send -s -- $arg - } -} - -# -# 2) differing output - Some programs produce different output each time -# they run. The "date" command is an obvious example. Another is -# ftp, if it produces throughput statistics at the end of a file -# transfer. If this causes a problem, delete these patterns or replace -# them with wildcards. An alternative is to use the -p flag (for -# "prompt") which makes Expect only look for the last line of output -# (i.e., the prompt). The -P flag allows you to define a character to -# toggle this mode off and on. -# -# Read the man page for more info. -# -# -Don - - -set timeout -1 -spawn ./make -match_max 100000 -expect -exact "Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -What is your first and last name?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organizational unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organization?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your City or Locality?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your State or Province?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the two-letter country code for this unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?\r - \[no\]: " -send -- "yes\r" -expect -exact "yes\r -\r -Enter key password for \r - (RETURN if same as keystore password): " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Certificate stored in file \r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -sleep 1 -send -- "yes\r" -expect eof diff --git a/keys/make b/keys/make new file mode 100755 index 0000000..ce87b02 --- /dev/null +++ b/keys/make @@ -0,0 +1,5 @@ +(cd mail && ./make) +(cd localrelay && ./make) +(cd key && ./make) +(cd client && ./make) +(cd push && ./make) diff --git a/keys/make-key b/keys/make-key new file mode 100755 index 0000000..69403b9 --- /dev/null +++ b/keys/make-key @@ -0,0 +1,17 @@ +echo "password +password +Unknown +Unknown +Unknown +Unknown +Unknown +Unknown +yes +password" | keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks +echo "" + +echo "password" | keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer +echo "password +password +yes" | keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks +java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks diff --git a/keys/make.autos b/keys/make.autos deleted file mode 100755 index a6b8dcb..0000000 --- a/keys/make.autos +++ /dev/null @@ -1,5 +0,0 @@ -(cd mail && ./make.auto) -(cd localrelay && ./make.auto) -(cd key && ./make.auto) -(cd client && ./make.auto) -(cd push && ./make.auto) diff --git a/keys/nginx/authority-response b/keys/nginx/authority-response new file mode 120000 index 0000000..26e1984 --- /dev/null +++ b/keys/nginx/authority-response @@ -0,0 +1 @@ +../primary/authority-response \ No newline at end of file diff --git a/keys/nginx/convert b/keys/nginx/convert-authority similarity index 63% rename from keys/nginx/convert rename to keys/nginx/convert-authority index 50bed24..6baf8f7 100755 --- a/keys/nginx/convert +++ b/keys/nginx/convert-authority @@ -1,12 +1,11 @@ set -x -JKSSTORE=mail_servers.jks +JKSSTORE=server.jks cp $JKSSTORE store.jks keytool -importkeystore -srckeystore store.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore store.p12 openssl pkcs12 -in store.p12 -nocerts -out store.key openssl rsa -in store.key -out final.key -cat mail_servers.crt > final.crt -cat PositiveSSLCA2.crt >> final.crt -cat AddTrustExternalCARoot.crt >> final.crt +rm final.crt +cat authority-response/* >> final.crt diff --git a/keys/nginx/convert-selfsigned b/keys/nginx/convert-selfsigned new file mode 100755 index 0000000..d91f3be --- /dev/null +++ b/keys/nginx/convert-selfsigned @@ -0,0 +1,11 @@ +set -x + +JKSSTORE=server.jks +cp $JKSSTORE store.jks + +keytool -importkeystore -srckeystore store.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore store.p12 +openssl pkcs12 -in store.p12 -nocerts -out store.key +openssl rsa -in store.key -out final.key + +rm final.crt +cat selfsignedcert.cer >> final.crt diff --git a/keys/primary/clean-self-signed-key b/keys/primary/clean-self-signed-key new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/primary/clean-self-signed-key @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/primary/make-authority-step1-cert b/keys/primary/make-authority-step1-cert new file mode 100755 index 0000000..5627041 --- /dev/null +++ b/keys/primary/make-authority-step1-cert @@ -0,0 +1,13 @@ +echo ----------------- +echo the default installation uses 'password' for password +echo sorry about that, feel free to modify sources +echo ----------------- + +keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore server.jks +keytool -certreq -alias anonymous -keyalg RSA -file server.csr -keystore server.jks + +rm -rf authority-submission +mkdir authority-submission +cp server.jks authority-submission +cp server.csr authority-submission + diff --git a/keys/primary/make-authority-step2-process-response b/keys/primary/make-authority-step2-process-response new file mode 100755 index 0000000..706f26b --- /dev/null +++ b/keys/primary/make-authority-step2-process-response @@ -0,0 +1,6 @@ +if [ -z "$1" ]; then echo "Must supply directory name of result"; exit 0; fi + +rm -rf authority-response +mkdir authority-response +cp $1/* authority-response/ +mv authority-response/mail_*.crt authority-response/server.crt diff --git a/keys/primary/make-authority-step3-create-final b/keys/primary/make-authority-step3-create-final new file mode 100755 index 0000000..cb9bbb1 --- /dev/null +++ b/keys/primary/make-authority-step3-create-final @@ -0,0 +1,8 @@ +rm -rf final +mkdir final +cd final + +cp ../server.jks . +#keytool -import -trustcacerts -alias root -file ../authority-response/AddTrustExternalCARoot.crt -keystore server.jks +keytool -import -trustcacerts -alias POSITIVESSL -file ../authority-response/PositiveSSLCA2.crt -keystore server.jks +keytool -import -trustcacerts -alias anonymous -file ../authority-response/server.crt -keystore server.jks diff --git a/keys/primary/make-self-signed-key b/keys/primary/make-self-signed-key new file mode 100755 index 0000000..e1f4644 --- /dev/null +++ b/keys/primary/make-self-signed-key @@ -0,0 +1,16 @@ +echo "password +password +Unknown +Unknown +Unknown +Unknown +Unknown +Unknown +yes +password" | keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks +echo "" + +echo "password" | keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer +echo "password +password +yes" | keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks diff --git a/keys/push/clean b/keys/push/clean deleted file mode 100755 index 30de318..0000000 --- a/keys/push/clean +++ /dev/null @@ -1,3 +0,0 @@ -rm *.jks -rm *.cer -rm *.b64 diff --git a/keys/push/clean b/keys/push/clean new file mode 120000 index 0000000..9f141a4 --- /dev/null +++ b/keys/push/clean @@ -0,0 +1 @@ +../clean-key \ No newline at end of file diff --git a/keys/push/make b/keys/push/make deleted file mode 100755 index 451e78a..0000000 --- a/keys/push/make +++ /dev/null @@ -1,5 +0,0 @@ -keytool -genkeypair -alias anonymous -keyalg RSA -keysize 2048 -keystore keystore.jks -keytool -export -alias anonymous -keystore keystore.jks -rfc -file selfsignedcert.cer -keytool -import -alias anonymous -file selfsignedcert.cer -keystore truststore.jks -java -jar ../../build/exported/Tools.jar --export-pem file=truststore.jks - diff --git a/keys/push/make b/keys/push/make new file mode 120000 index 0000000..ecb472e --- /dev/null +++ b/keys/push/make @@ -0,0 +1 @@ +../make-key \ No newline at end of file diff --git a/keys/push/make.auto b/keys/push/make.auto deleted file mode 100755 index 8167e33..0000000 --- a/keys/push/make.auto +++ /dev/null @@ -1,101 +0,0 @@ -#!/opt/local/bin/expect -f -# -# This Expect script was generated by autoexpect on Thu Sep 5 10:43:19 2013 -# Expect and autoexpect were both written by Don Libes, NIST. -# -# Note that autoexpect does not guarantee a working script. It -# necessarily has to guess about certain things. Two reasons a script -# might fail are: -# -# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, -# etc.) and devices discard or ignore keystrokes that arrive "too -# quickly" after prompts. If you find your new script hanging up at -# one spot, try adding a short sleep just before the previous send. -# Setting "force_conservative" to 1 (see below) makes Expect do this -# automatically - pausing briefly before sending each character. This -# pacifies every program I know of. The -c flag makes the script do -# this in the first place. The -C flag allows you to define a -# character to toggle this mode off and on. - -set force_conservative 0 ;# set to 1 to force conservative mode even if - ;# script wasn't run conservatively originally -if {$force_conservative} { - set send_slow {1 .1} - proc send {ignore arg} { - sleep .1 - exp_send -s -- $arg - } -} - -# -# 2) differing output - Some programs produce different output each time -# they run. The "date" command is an obvious example. Another is -# ftp, if it produces throughput statistics at the end of a file -# transfer. If this causes a problem, delete these patterns or replace -# them with wildcards. An alternative is to use the -p flag (for -# "prompt") which makes Expect only look for the last line of output -# (i.e., the prompt). The -P flag allows you to define a character to -# toggle this mode off and on. -# -# Read the man page for more info. -# -# -Don - - -set timeout -1 -spawn ./make -match_max 100000 -expect -exact "Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -What is your first and last name?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organizational unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your organization?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your City or Locality?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the name of your State or Province?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -What is the two-letter country code for this unit?\r - \[Unknown\]: " -send -- "\r" -expect -exact "\r -Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?\r - \[no\]: " -send -- "yes\r" -expect -exact "yes\r -\r -Enter key password for \r - (RETURN if same as keystore password): " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -expect -exact "\r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Certificate stored in file \r -Enter keystore password: " -send -- "password\r" -expect -exact "\r -Re-enter new password: " -send -- "password\r" -sleep 1 -send -- "yes\r" -expect eof diff --git a/passwords/postfix b/passwords/postfix new file mode 100644 index 0000000..f6dc9c5 --- /dev/null +++ b/passwords/postfix @@ -0,0 +1 @@ +postfix diff --git a/web/WebContent/js/crypt/openpgp/README b/web/WebContent/js/crypt/openpgp/README new file mode 100644 index 0000000..99cf8ce --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/README @@ -0,0 +1 @@ +Add other resources here (e.g. buildbot master scipt) diff --git a/web/WebContent/js/crypt/openpgp/example.css b/web/WebContent/js/crypt/openpgp/example.css new file mode 100644 index 0000000..5ee5732 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/example.css @@ -0,0 +1,103 @@ +html, body { + margin:0; + padding:0; + height:100%; + width:100%; + font: 0.86em/120% Tahoma, Arial, sans-serif; + color:#333; + background:transparent; +} + +html { + background:#eee; +} + +a:hover, a:active { outline: none; } +a, a:active, a:visited { color: #607890; text-decoration:none;} +a:hover { color: #036; } + +h1, h2, h3 { + font-size: medium; + font-weight: normal; + margin:0; + padding:.5em; +} + +p { padding-left:1.5em;} + +h1 { + font-size:xx-large; +} + +.block { + margin:0 auto; + margin-top:1em; + margin-bottom:1em; + padding:.5em; + max-width:70em; + + background:#fff; + -webkit-box-shadow: 0px 2px 5px #aaa; + -moz-box-shadow: 0px 2px 5px #aaa; + box-shadow: 0px 2px 5px #aaa; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + border:1px solid #ccc; +} + +#title { + background:#369; + color:#eee; + margin:0; + padding:.5em; + border-bottom:1px solid black; + -webkit-box-shadow: 0px 5px 5px #aaa; + -moz-box-shadow: 0px 5px 5px #aaa; + box-shadow: 0px 5px 5px #aaa; +} + +#browsers { + width:90%; + margin:0 auto; +} + +.logo { + height:8em; + width:8em; +} + +input:invalid, textarea:invalid { + border-radius: 1px; + -moz-box-shadow: 0px 0px 5px red; + -webkit-box-shadow: 0px 0px 5px red; + box-shadow: 0px 0px 5px red; +} + +input, textarea { + width:15em; + margin-top: 1em; + margin-bottom: 1em; + background-color: white; + color: #666; + border: 1px solid #C4C4C4; + border-right: 1px solid #E9E9E9; + border-bottom: 1px solid #E9E9E9; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mybutton { + background-color: #333; + color:#fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +textarea { + width:40em; + height:5em; + max-width:90%; + } diff --git a/web/WebContent/js/crypt/openpgp/example.html b/web/WebContent/js/crypt/openpgp/example.html new file mode 100644 index 0000000..632d8c8 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/example.html @@ -0,0 +1,72 @@ + + + + + Example | OpenPGP.js + + + + +
    +

    Example | OpenPGP.js

    +

    Please feel free to provide any kind of feedback.

    +
    +
    +

    Send us an encrypted message

    +
    + +
      +

    • +

    • +
    + +
    +
    +
    +

    Our public key

    +
    +-----BEGIN PGP PUBLIC KEY BLOCK-----
    +Version: GnuPG/MacGPG2 v2.0.18 (Darwin)
    +Comment: GPGTools - http://gpgtools.org
    +
    +mQENBE8Tb1oBCADSFabWN+0j8Edt3b0s2/pf5C6oKY0SFgblPwSq//R0Cm6h2cOd
    +C1SqKPdv1BW8qWyBJ4P58+Fh4FNqWKUTsE4BHE8Sq2Go2tN1pROedubDcgYYuJ+c
    +VLY7Q0fqnHlm2wifVEvvv6rBRtwyFlBU9Elc3N7pN0kGtUI2nSEQZsmbsn9/jawt
    +CwSvz2KomJ54pAm2UlWMy62b+VS0yorHbe6WjO2FdisUa3EQxGcF5yTMdpNPGb/R
    +9tw0FMOL0D8mG4T24uFMd19xl+BjoQ7r+rVJr6+S2CgQ4cG+6PnvBfzFsamSiXvi
    +hkM2LgJEMeNavonbPKcd2zo4mUaFfvhtAEYBABEBAAG0HE9wZW5QR1AuanMgPGxp
    +c3RAb3BlbnBncC5qcz6JAT8EEwECACkFAk8Tb1oCGy8FCQeGH4AHCwkIBwMCAQYV
    +CAIJCgsEFgIDAQIeAQIXgAAKCRBBcpNwheX4iWvoCACbuyyDUrEfgW3oBDbpPnaL
    +GizbXrNiYeNfP/Fd8JXorR386qWCfJ+mfjrPbeDx9bNDn4QijMhvCRzOg/95E53S
    +sNnD/tAPTnNVnAjMwTUoiwxgv3pJqYXScRrVC/0lMNvaJ7ZHVWlX2BjxwGfNrOVU
    +iJtbCmK1EsWmMhqIKHqZ7nFm1MdxmoqiaAXazC3j2l4oAyRgn4nT+5cthLTfEHaT
    +nx9VdmWAl8cB9ooBGEhv19YNsS/FuEHgCUeRCc4kOjXlYv+wFnxbVNACpt+WJ74D
    +Hf5BLFtVU6vdpoaA7EYpyl4ZFo60kmhWaR5Cfz2Bis9Mr0yxTO7tAUHMfhKVFAyG
    +uQENBE8Tb1oBCADc6Rff093u+KxslkCDlVBQ/abPKuimcAQniDV7y9BQzl+Nvx1F
    +HWIuyA3TLysot+2Rp+19011fJLyGTv94fvqiw9CPQoJzePJ/9ehq9RW4PWEm6YNo
    +g/jNYN5+Kvza3Lk0SuYP6pchHJCORRJObgbVE3liHtC7y2KY1GFOr6epxN+cNVz6
    +D22Kxi9P1jjpxSzHsT0PpUUc3vgvLkyVBnGQQp43KjEbHU4YE401BfMdeVp7dOUD
    +7CR0sW6q/u64FLFEIX5XV/JPUkha4ck1xknzdbNv8HuKUPbZSzyf58rwSm6ev5KM
    +UY7//Dg/I3JQJnerhfxgg62hB2nbirPSf+XhABEBAAGJAkQEGAECAA8FAk8Tb1oC
    +Gy4FCQeGH4ABKQkQQXKTcIXl+InAXSAEGQECAAYFAk8Tb1oACgkQHC9oK3kswEJB
    +0Qf/VsL2miXAQ/iBJY5W9jM+S1HOY4n3OtJNXhmuk+uW52UjUC8mWLQL184udPLO
    +gQGrBUZXKNQK5q79rsCnZEv40FhU7bNjZ3/8gQnmlUMoMPQIDqozSObKS7eo0p2L
    +D9ZD1a0Gg+xRg9MKczLn4+YqRRIQcpyc/j9SOCM/z41NcNlBqxTX8njT9lWkeJoV
    +KTENEv9ubqVJgH+u0kA052yzc8dWt1XBjcOF4voRZ/Iksn6QtCtpHB40hSSwL5I0
    +VEv9LeMbkzHb+ZhNCq9VFK2x0RrgGgDLOoSEUbrCJDyHnQfkCnVEl6eTVm1JfA34
    +VejDMU8F7GJ8RypWZKeTxqe2Wh2nB/9p1Ea0Q0f5BWfdulEMKhbkr6a0VrWQ/76M
    +wmgqFsiqGkU28gCiXJBJc1557FOYUquzGo1dRoEbl9nCVXkcfVjgGCiVBnQWhNk2
    +CTGA0lZ/Bzw0gZXjs32SRzTIUoaS7aJi7V324Q2ISjYJjJ3soijctVHCzi7JK43j
    +kg64fBx5DqXZGZaKESlcI1apmAo2O9GvoSusAzfg6h55dJh3526MRgN6ooB+Mlm+
    +d1znU1KJs+UvEXFkvlCo6Q8nhjKzUMWqXthoWcc3ZqFvc2Abvu3n/T4Malsq7kiC
    +z8jl9UymAkoTcsVWRVr5PKR0zsCxaNV3w5hv6j12+US7mEWe2kuD
    +=Lx12
    +-----END PGP PUBLIC KEY BLOCK-----
    +   
    +
    + + + + diff --git a/web/WebContent/js/crypt/openpgp/example.js b/web/WebContent/js/crypt/openpgp/example.js new file mode 100644 index 0000000..1751760 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/example.js @@ -0,0 +1,32 @@ +function encrypt() { + if (window.crypto.getRandomValues) { + require("./openpgp.min.js"); + openpgp.init(); +/* + var pub_key = openpgp.read_publicKey($('#pubkey').text()); + $('#message').val(openpgp.write_encrypted_message(pub_key,$('#message').val())); + window.alert("This message is going to be sent:\n" + $('#message').val()); + return true; + } else { + $("#mybutton").val("browser not supported"); + window.alert("Error: Browser not supported\nReason: We need a cryptographically secure PRNG to be implemented (i.e. the window.crypto method)\nSolution: Use Chrome >= 11, Safari >= 3.1 or Firefox >= 21"); + return false; +*/ + } + + return false; +} + +function require(script) { + $.ajax({ + url: script, + dataType: "script", + async: false, // <-- this is the key + success: function () { + // all good... + }, + error: function () { + throw new Error("Could not load script " + script); + } + }); +} diff --git a/web/WebContent/js/crypt/openpgp/example.php b/web/WebContent/js/crypt/openpgp/example.php new file mode 100644 index 0000000..8a7e463 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/example.php @@ -0,0 +1,30 @@ +\r\n"; +$redirect = "http://openpgpjs.org/"; +/* -------------------------------------------------------------------------- */ + +/* input -------------------------------------------------------------------- */ +$user=substr(trim($_POST["mail"]), 0, SMALL_LIMIT); +$message=substr(trim($_POST["message"]), 0, LARGE_LIMIT); +/* -------------------------------------------------------------------------- */ + +/* send the request --------------------------------------------------------- */ +if (filter_var($user, FILTER_VALIDATE_EMAIL)) { + $headers = "From: $user\r\n"; +} +if (!empty($message)) + mail($to, $subject, $message, $headers); +/* -------------------------------------------------------------------------- */ + +/* Redirect browser */ +header("Location: " . $redirect); +/* -------------------------------------------------------------------------- */ +?> diff --git a/web/WebContent/js/crypt/openpgp/jquery.min.js b/web/WebContent/js/crypt/openpgp/jquery.min.js new file mode 100644 index 0000000..b2ac174 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/jquery.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu May 12 15:04:36 2011 -0400 + */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function L(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function F(){return!0}function E(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.1",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=E);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem +)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(W(c[0])||W(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bO,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bP.test(this.nodeName)||bJ.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bI.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bV,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/web/WebContent/js/crypt/openpgp/openpgp.js b/web/WebContent/js/crypt/openpgp/openpgp.js new file mode 100644 index 0000000..0380840 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/openpgp.js @@ -0,0 +1,13465 @@ +function _openpgp_ () { + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// A Digital signature algorithm implementation + +function DSA() { + // s1 = ((g**s) mod p) mod q + // s1 = ((s**-1)*(sha-1(m)+(s1*x) mod q) + function sign(hashalgo, m, g, p, q, x) { + // If the output size of the chosen hash is larger than the number of + // bits of q, the hash result is truncated to fit by taking the number + // of leftmost bits equal to the number of bits of q. This (possibly + // truncated) hash function result is treated as a number and used + // directly in the DSA signature algorithm. + var hashed_data = util.getLeftNBits(openpgp_crypto_hashData(hashalgo,m),q.bitLength()); + var hash = new BigInteger(util.hexstrdump(hashed_data), 16); + var k = openpgp_crypto_getRandomBigIntegerInRange(BigInteger.ONE.add(BigInteger.ONE), q.subtract(BigInteger.ONE)); + var s1 = (g.modPow(k,p)).mod(q); + var s2 = (k.modInverse(q).multiply(hash.add(x.multiply(s1)))).mod(q); + var result = new Array(); + result[0] = s1.toMPI(); + result[1] = s2.toMPI(); + return result; + } + function select_hash_algorithm(q) { + var usersetting = openpgp.config.config.prefer_hash_algorithm; + /* + * 1024-bit key, 160-bit q, SHA-1, SHA-224, SHA-256, SHA-384, or SHA-512 hash + * 2048-bit key, 224-bit q, SHA-224, SHA-256, SHA-384, or SHA-512 hash + * 2048-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash + * 3072-bit key, 256-bit q, SHA-256, SHA-384, or SHA-512 hash + */ + switch (Math.round(q.bitLength() / 8)) { + case 20: // 1024 bit + if (usersetting != 2 && + usersetting > 11 && + usersetting != 10 && + usersetting < 8) + return 2; // prefer sha1 + return usersetting; + case 28: // 2048 bit + if (usersetting > 11 && + usersetting < 8) + return 11; + return usersetting; + case 32: // 4096 bit // prefer sha224 + if (usersetting > 10 && + usersetting < 8) + return 8; // prefer sha256 + return usersetting; + default: + util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"); + return null; + + } + } + this.select_hash_algorithm = select_hash_algorithm; + + function verify(hashalgo, s1,s2,m,p,q,g,y) { + var hashed_data = util.getLeftNBits(openpgp_crypto_hashData(hashalgo,m),q.bitLength()); + var hash = new BigInteger(util.hexstrdump(hashed_data), 16); + if (BigInteger.ZERO.compareTo(s1) > 0 || + s1.compareTo(q) > 0 || + BigInteger.ZERO.compareTo(s2) > 0 || + s2.compareTo(q) > 0) { + util.print_error("invalid DSA Signature"); + return null; + } + var w = s2.modInverse(q); + var u1 = hash.multiply(w).mod(q); + var u2 = s1.multiply(w).mod(q); + return g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p).mod(q); + } + + /* + * unused code. This can be used as a start to write a key generator + * function. + + function generateKey(bitcount) { + var qi = new BigInteger(bitcount, primeCenterie); + var pi = generateP(q, 512); + var gi = generateG(p, q, bitcount); + var xi; + do { + xi = new BigInteger(q.bitCount(), rand); + } while (x.compareTo(BigInteger.ZERO) != 1 && x.compareTo(q) != -1); + var yi = g.modPow(x, p); + return {x: xi, q: qi, p: pi, g: gi, y: yi}; + } + + function generateP(q, bitlength, randomfn) { + if (bitlength % 64 != 0) { + return false; + } + var pTemp; + var pTemp2; + do { + pTemp = randomfn(bitcount, true); + pTemp2 = pTemp.subtract(BigInteger.ONE); + pTemp = pTemp.subtract(pTemp2.remainder(q)); + } while (!pTemp.isProbablePrime(primeCenterie) || pTemp.bitLength() != l); + return pTemp; + } + + function generateG(p, q, bitlength, randomfn) { + var aux = p.subtract(BigInteger.ONE); + var pow = aux.divide(q); + var gTemp; + do { + gTemp = randomfn(bitlength); + } while (gTemp.compareTo(aux) != -1 && gTemp.compareTo(BigInteger.ONE) != 1); + return gTemp.modPow(pow, p); + } + + function generateK(q, bitlength, randomfn) { + var tempK; + do { + tempK = randomfn(bitlength, false); + } while (tempK.compareTo(q) != -1 && tempK.compareTo(BigInteger.ZERO) != 1); + return tempK; + } + + function generateR(q,p) { + k = generateK(q); + var r = g.modPow(k, p).mod(q); + return r; + } + + function generateS(hashfn,k,r,m,q,x) { + var hash = hashfn(m); + s = (k.modInverse(q).multiply(hash.add(x.multiply(r)))).mod(q); + return s; + } */ + this.sign = sign; + this.verify = verify; + // this.generate = generateKey; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// ElGamal implementation + +function Elgamal() { + + function encrypt(m,g,p,y) { + // choose k in {2,...,p-2} + var two = BigInteger.ONE.add(BigInteger.ONE); + var pMinus2 = p.subtract(two); + var k = openpgp_crypto_getRandomBigIntegerInRange(two, pMinus2); + var k = k.mod(pMinus2).add(BigInteger.ONE); + var c = new Array(); + c[0] = g.modPow(k, p); + c[1] = y.modPow(k, p).multiply(m).mod(p).toMPI(); + c[0] = c[0].toMPI(); + return c; + } + + function decrypt(c1,c2,p,x) { + util.print_debug("Elgamal Decrypt:\nc1:"+util.hexstrdump(c1.toMPI())+"\n"+ + "c2:"+util.hexstrdump(c2.toMPI())+"\n"+ + "p:"+util.hexstrdump(p.toMPI())+"\n"+ + "x:"+util.hexstrdump(x.toMPI())); + return (c1.modPow(x, p).modInverse(p)).multiply(c2).mod(p); + //var c = c1.pow(x).modInverse(p); // c0^-a mod p + //return c.multiply(c2).mod(p); + } + + // signing and signature verification using Elgamal is not required by OpenPGP. + this.encrypt = encrypt; + this.decrypt = decrypt; +}/* + * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) + * All Rights Reserved. + * + * Modified by Recurity Labs GmbH + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +// Basic JavaScript BN library - subset useful for RSA encryption. + +// Bits per digit +var dbits; + +// JavaScript engine analysis +var canary = 0xdeadbeefcafe; +var j_lm = ((canary&0xffffff)==0xefcafe); + +// (public) Constructor +function BigInteger(a,b,c) { + if(a != null) + if("number" == typeof a) this.fromNumber(a,b,c); + else if(b == null && "string" != typeof a) this.fromString(a,256); + else this.fromString(a,b); +} + +// return new, unset BigInteger +function nbi() { return new BigInteger(null); } + +// am: Compute w_j += (x*this_i), propagate carries, +// c is initial carry, returns final carry. +// c < 3*dvalue, x < 2*dvalue, this_i < dvalue +// We need to select the fastest one that works in this environment. + +// am1: use a single mult and divide to get the high bits, +// max digit bits should be 26 because +// max internal value = 2*dvalue^2-2*dvalue (< 2^53) +function am1(i,x,w,j,c,n) { + while(--n >= 0) { + var v = x*this[i++]+w[j]+c; + c = Math.floor(v/0x4000000); + w[j++] = v&0x3ffffff; + } + return c; +} +// am2 avoids a big mult-and-extract completely. +// Max digit bits should be <= 30 because we do bitwise ops +// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) +function am2(i,x,w,j,c,n) { + var xl = x&0x7fff, xh = x>>15; + while(--n >= 0) { + var l = this[i]&0x7fff; + var h = this[i++]>>15; + var m = xh*l+h*xl; + l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff); + c = (l>>>30)+(m>>>15)+xh*h+(c>>>30); + w[j++] = l&0x3fffffff; + } + return c; +} +// Alternately, set max digit bits to 28 since some +// browsers slow down when dealing with 32-bit numbers. +function am3(i,x,w,j,c,n) { + var xl = x&0x3fff, xh = x>>14; + while(--n >= 0) { + var l = this[i]&0x3fff; + var h = this[i++]>>14; + var m = xh*l+h*xl; + l = xl*l+((m&0x3fff)<<14)+w[j]+c; + c = (l>>28)+(m>>14)+xh*h; + w[j++] = l&0xfffffff; + } + return c; +} +if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) { + BigInteger.prototype.am = am2; + dbits = 30; +} +else if(j_lm && (navigator.appName != "Netscape")) { + BigInteger.prototype.am = am1; + dbits = 26; +} +else { // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; +} + +BigInteger.prototype.DB = dbits; +BigInteger.prototype.DM = ((1<= 0; --i) r[i] = this[i]; + r.t = this.t; + r.s = this.s; +} + +// (protected) set from integer value x, -DV <= x < DV +function bnpFromInt(x) { + this.t = 1; + this.s = (x<0)?-1:0; + if(x > 0) this[0] = x; + else if(x < -1) this[0] = x+DV; + else this.t = 0; +} + +// return bigint initialized to value +function nbv(i) { var r = nbi(); r.fromInt(i); return r; } + +// (protected) set from string and radix +function bnpFromString(s,b) { + var k; + if(b == 16) k = 4; + else if(b == 8) k = 3; + else if(b == 256) k = 8; // byte array + else if(b == 2) k = 1; + else if(b == 32) k = 5; + else if(b == 4) k = 2; + else { this.fromRadix(s,b); return; } + this.t = 0; + this.s = 0; + var i = s.length, mi = false, sh = 0; + while(--i >= 0) { + var x = (k==8)?s[i]&0xff:intAt(s,i); + if(x < 0) { + if(s.charAt(i) == "-") mi = true; + continue; + } + mi = false; + if(sh == 0) + this[this.t++] = x; + else if(sh+k > this.DB) { + this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<>(this.DB-sh)); + } + else + this[this.t-1] |= x<= this.DB) sh -= this.DB; + } + if(k == 8 && (s[0]&0x80) != 0) { + this.s = -1; + if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)< 0 && this[this.t-1] == c) --this.t; +} + +// (public) return string representation in given radix +function bnToString(b) { + if(this.s < 0) return "-"+this.negate().toString(b); + var k; + if(b == 16) k = 4; + else if(b == 8) k = 3; + else if(b == 2) k = 1; + else if(b == 32) k = 5; + else if(b == 4) k = 2; + else return this.toRadix(b); + var km = (1< 0) { + if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); } + while(i >= 0) { + if(p < k) { + d = (this[i]&((1<>(p+=this.DB-k); + } + else { + d = (this[i]>>(p-=k))&km; + if(p <= 0) { p += this.DB; --i; } + } + if(d > 0) m = true; + if(m) r += int2char(d); + } + } + return m?r:"0"; +} + +// (public) -this +function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; } + +// (public) |this| +function bnAbs() { return (this.s<0)?this.negate():this; } + +// (public) return + if this > a, - if this < a, 0 if equal +function bnCompareTo(a) { + var r = this.s-a.s; + if(r != 0) return r; + var i = this.t; + r = i-a.t; + if(r != 0) return r; + while(--i >= 0) if((r=this[i]-a[i]) != 0) return r; + return 0; +} + +// returns bit length of the integer x +function nbits(x) { + var r = 1, t; + if((t=x>>>16) != 0) { x = t; r += 16; } + if((t=x>>8) != 0) { x = t; r += 8; } + if((t=x>>4) != 0) { x = t; r += 4; } + if((t=x>>2) != 0) { x = t; r += 2; } + if((t=x>>1) != 0) { x = t; r += 1; } + return r; +} + +// (public) return the number of bits in "this" +function bnBitLength() { + if(this.t <= 0) return 0; + return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM)); +} + +// (protected) r = this << n*DB +function bnpDLShiftTo(n,r) { + var i; + for(i = this.t-1; i >= 0; --i) r[i+n] = this[i]; + for(i = n-1; i >= 0; --i) r[i] = 0; + r.t = this.t+n; + r.s = this.s; +} + +// (protected) r = this >> n*DB +function bnpDRShiftTo(n,r) { + for(var i = n; i < this.t; ++i) r[i-n] = this[i]; + r.t = Math.max(this.t-n,0); + r.s = this.s; +} + +// (protected) r = this << n +function bnpLShiftTo(n,r) { + var bs = n%this.DB; + var cbs = this.DB-bs; + var bm = (1<= 0; --i) { + r[i+ds+1] = (this[i]>>cbs)|c; + c = (this[i]&bm)<= 0; --i) r[i] = 0; + r[ds] = c; + r.t = this.t+ds+1; + r.s = this.s; + r.clamp(); +} + +// (protected) r = this >> n +function bnpRShiftTo(n,r) { + r.s = this.s; + var ds = Math.floor(n/this.DB); + if(ds >= this.t) { r.t = 0; return; } + var bs = n%this.DB; + var cbs = this.DB-bs; + var bm = (1<>bs; + for(var i = ds+1; i < this.t; ++i) { + r[i-ds-1] |= (this[i]&bm)<>bs; + } + if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<>= this.DB; + } + if(a.t < this.t) { + c -= a.s; + while(i < this.t) { + c += this[i]; + r[i++] = c&this.DM; + c >>= this.DB; + } + c += this.s; + } + else { + c += this.s; + while(i < a.t) { + c -= a[i]; + r[i++] = c&this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = (c<0)?-1:0; + if(c < -1) r[i++] = this.DV+c; + else if(c > 0) r[i++] = c; + r.t = i; + r.clamp(); +} + +// (protected) r = this * a, r != this,a (HAC 14.12) +// "this" should be the larger one if appropriate. +function bnpMultiplyTo(a,r) { + var x = this.abs(), y = a.abs(); + var i = x.t; + r.t = i+y.t; + while(--i >= 0) r[i] = 0; + for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t); + r.s = 0; + r.clamp(); + if(this.s != a.s) BigInteger.ZERO.subTo(r,r); +} + +// (protected) r = this^2, r != this (HAC 14.16) +function bnpSquareTo(r) { + var x = this.abs(); + var i = r.t = 2*x.t; + while(--i >= 0) r[i] = 0; + for(i = 0; i < x.t-1; ++i) { + var c = x.am(i,x[i],r,2*i,0,1); + if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) { + r[i+x.t] -= x.DV; + r[i+x.t+1] = 1; + } + } + if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1); + r.s = 0; + r.clamp(); +} + +// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) +// r != q, this != m. q or r may be null. +function bnpDivRemTo(m,q,r) { + var pm = m.abs(); + if(pm.t <= 0) return; + var pt = this.abs(); + if(pt.t < pm.t) { + if(q != null) q.fromInt(0); + if(r != null) this.copyTo(r); + return; + } + if(r == null) r = nbi(); + var y = nbi(), ts = this.s, ms = m.s; + var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus + if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } + else { pm.copyTo(y); pt.copyTo(r); } + var ys = y.t; + var y0 = y[ys-1]; + if(y0 == 0) return; + var yt = y0*(1<1)?y[ys-2]>>this.F2:0); + var d1 = this.FV/yt, d2 = (1<= 0) { + r[r.t++] = 1; + r.subTo(t,r); + } + BigInteger.ONE.dlShiftTo(ys,t); + t.subTo(y,y); // "negative" y so we can replace sub with am later + while(y.t < ys) y[y.t++] = 0; + while(--j >= 0) { + // Estimate quotient digit + var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2); + if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out + y.dlShiftTo(j,t); + r.subTo(t,r); + while(r[i] < --qd) r.subTo(t,r); + } + } + if(q != null) { + r.drShiftTo(ys,q); + if(ts != ms) BigInteger.ZERO.subTo(q,q); + } + r.t = ys; + r.clamp(); + if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder + if(ts < 0) BigInteger.ZERO.subTo(r,r); +} + +// (public) this mod a +function bnMod(a) { + var r = nbi(); + this.abs().divRemTo(a,null,r); + if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r); + return r; +} + +// Modular reduction using "classic" algorithm +function Classic(m) { this.m = m; } +function cConvert(x) { + if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m); + else return x; +} +function cRevert(x) { return x; } +function cReduce(x) { x.divRemTo(this.m,null,x); } +function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } +function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); } + +Classic.prototype.convert = cConvert; +Classic.prototype.revert = cRevert; +Classic.prototype.reduce = cReduce; +Classic.prototype.mulTo = cMulTo; +Classic.prototype.sqrTo = cSqrTo; + +// (protected) return "-1/this % 2^DB"; useful for Mont. reduction +// justification: +// xy == 1 (mod m) +// xy = 1+km +// xy(2-xy) = (1+km)(1-km) +// x[y(2-xy)] = 1-k^2m^2 +// x[y(2-xy)] == 1 (mod m^2) +// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 +// should reduce x and y(2-xy) by m^2 at each step to keep size bounded. +// JS multiply "overflows" differently from C/C++, so care is needed here. +function bnpInvDigit() { + if(this.t < 1) return 0; + var x = this[0]; + if((x&1) == 0) return 0; + var y = x&3; // y == 1/x mod 2^2 + y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4 + y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8 + y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return (y>0)?this.DV-y:-y; +} + +// Montgomery reduction +function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp&0x7fff; + this.mph = this.mp>>15; + this.um = (1<<(m.DB-15))-1; + this.mt2 = 2*m.t; +} + +// xR mod m +function montConvert(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t,r); + r.divRemTo(this.m,null,r); + if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r); + return r; +} + +// x/R mod m +function montRevert(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; +} + +// x = x/R mod m (HAC 14.32) +function montReduce(x) { + while(x.t <= this.mt2) // pad x so am has enough room later + x[x.t++] = 0; + for(var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i]&0x7fff; + var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM; + // use am to combine the multiply-shift-add into one call + j = i+this.m.t; + x[j] += this.m.am(0,u0,x,i,0,this.m.t); + // propagate carry + while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; } + } + x.clamp(); + x.drShiftTo(this.m.t,x); + if(x.compareTo(this.m) >= 0) x.subTo(this.m,x); +} + +// r = "x^2/R mod m"; x != r +function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); } + +// r = "xy/R mod m"; x,y != r +function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } + +Montgomery.prototype.convert = montConvert; +Montgomery.prototype.revert = montRevert; +Montgomery.prototype.reduce = montReduce; +Montgomery.prototype.mulTo = montMulTo; +Montgomery.prototype.sqrTo = montSqrTo; + +// (protected) true iff this is even +function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; } + +// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) +function bnpExp(e,z) { + if(e > 0xffffffff || e < 1) return BigInteger.ONE; + var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1; + g.copyTo(r); + while(--i >= 0) { + z.sqrTo(r,r2); + if((e&(1< 0) z.mulTo(r2,g,r); + else { var t = r; r = r2; r2 = t; } + } + return z.revert(r); +} + +// (public) this^e % m, 0 <= e < 2^32 +function bnModPowInt(e,m) { + var z; + if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m); + return this.exp(e,z); +} + +// protected +BigInteger.prototype.copyTo = bnpCopyTo; +BigInteger.prototype.fromInt = bnpFromInt; +BigInteger.prototype.fromString = bnpFromString; +BigInteger.prototype.clamp = bnpClamp; +BigInteger.prototype.dlShiftTo = bnpDLShiftTo; +BigInteger.prototype.drShiftTo = bnpDRShiftTo; +BigInteger.prototype.lShiftTo = bnpLShiftTo; +BigInteger.prototype.rShiftTo = bnpRShiftTo; +BigInteger.prototype.subTo = bnpSubTo; +BigInteger.prototype.multiplyTo = bnpMultiplyTo; +BigInteger.prototype.squareTo = bnpSquareTo; +BigInteger.prototype.divRemTo = bnpDivRemTo; +BigInteger.prototype.invDigit = bnpInvDigit; +BigInteger.prototype.isEven = bnpIsEven; +BigInteger.prototype.exp = bnpExp; + +// public +BigInteger.prototype.toString = bnToString; +BigInteger.prototype.negate = bnNegate; +BigInteger.prototype.abs = bnAbs; +BigInteger.prototype.compareTo = bnCompareTo; +BigInteger.prototype.bitLength = bnBitLength; +BigInteger.prototype.mod = bnMod; +BigInteger.prototype.modPowInt = bnModPowInt; + +// "constants" +BigInteger.ZERO = nbv(0); +BigInteger.ONE = nbv(1); + +/* + * Copyright (c) 2003-2005 Tom Wu (tjw@cs.Stanford.EDU) + * All Rights Reserved. + * + * Modified by Recurity Labs GmbH + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ +// Extended JavaScript BN functions, required for RSA private ops. + +// Version 1.1: new BigInteger("0", 10) returns "proper" zero +// Version 1.2: square() API, isProbablePrime fix + +// (public) +function bnClone() { var r = nbi(); this.copyTo(r); return r; } + +// (public) return value as integer +function bnIntValue() { + if(this.s < 0) { + if(this.t == 1) return this[0]-this.DV; + else if(this.t == 0) return -1; + } + else if(this.t == 1) return this[0]; + else if(this.t == 0) return 0; + // assumes 16 < DB < 32 + return ((this[1]&((1<<(32-this.DB))-1))<>24; } + +// (public) return value as short (assumes DB>=16) +function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; } + +// (protected) return x s.t. r^x < DV +function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); } + +// (public) 0 if this == 0, 1 if this > 0 +function bnSigNum() { + if(this.s < 0) return -1; + else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0; + else return 1; +} + +// (protected) convert to radix string +function bnpToRadix(b) { + if(b == null) b = 10; + if(this.signum() == 0 || b < 2 || b > 36) return "0"; + var cs = this.chunkSize(b); + var a = Math.pow(b,cs); + var d = nbv(a), y = nbi(), z = nbi(), r = ""; + this.divRemTo(d,y,z); + while(y.signum() > 0) { + r = (a+z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d,y,z); + } + return z.intValue().toString(b) + r; +} + +// (protected) convert from radix string +function bnpFromRadix(s,b) { + this.fromInt(0); + if(b == null) b = 10; + var cs = this.chunkSize(b); + var d = Math.pow(b,cs), mi = false, j = 0, w = 0; + for(var i = 0; i < s.length; ++i) { + var x = intAt(s,i); + if(x < 0) { + if(s.charAt(i) == "-" && this.signum() == 0) mi = true; + continue; + } + w = b*w+x; + if(++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w,0); + j = 0; + w = 0; + } + } + if(j > 0) { + this.dMultiply(Math.pow(b,j)); + this.dAddOffset(w,0); + } + if(mi) BigInteger.ZERO.subTo(this,this); +} + +// (protected) alternate constructor +function bnpFromNumber(a,b,c) { + if("number" == typeof b) { + // new BigInteger(int,int,RNG) + if(a < 2) this.fromInt(1); + else { + this.fromNumber(a,c); + if(!this.testBit(a-1)) // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this); + if(this.isEven()) this.dAddOffset(1,0); // force odd + while(!this.isProbablePrime(b)) { + this.dAddOffset(2,0); + if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this); + } + } + } + else { + // new BigInteger(int,RNG) + var x = new Array(), t = a&7; + x.length = (a>>3)+1; + b.nextBytes(x); + if(t > 0) x[0] &= ((1< 0) { + if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p) + r[k++] = d|(this.s<<(this.DB-p)); + while(i >= 0) { + if(p < 8) { + d = (this[i]&((1<>(p+=this.DB-8); + } + else { + d = (this[i]>>(p-=8))&0xff; + if(p <= 0) { p += this.DB; --i; } + } + //if((d&0x80) != 0) d |= -256; + //if(k == 0 && (this.s&0x80) != (d&0x80)) ++k; + if(k > 0 || d != this.s) r[k++] = d; + } + } + return r; +} + +function bnEquals(a) { return(this.compareTo(a)==0); } +function bnMin(a) { return(this.compareTo(a)<0)?this:a; } +function bnMax(a) { return(this.compareTo(a)>0)?this:a; } + +// (protected) r = this op a (bitwise) +function bnpBitwiseTo(a,op,r) { + var i, f, m = Math.min(a.t,this.t); + for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]); + if(a.t < this.t) { + f = a.s&this.DM; + for(i = m; i < this.t; ++i) r[i] = op(this[i],f); + r.t = this.t; + } + else { + f = this.s&this.DM; + for(i = m; i < a.t; ++i) r[i] = op(f,a[i]); + r.t = a.t; + } + r.s = op(this.s,a.s); + r.clamp(); +} + +// (public) this & a +function op_and(x,y) { return x&y; } +function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; } + +// (public) this | a +function op_or(x,y) { return x|y; } +function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; } + +// (public) this ^ a +function op_xor(x,y) { return x^y; } +function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; } + +// (public) this & ~a +function op_andnot(x,y) { return x&~y; } +function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; } + +// (public) ~this +function bnNot() { + var r = nbi(); + for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i]; + r.t = this.t; + r.s = ~this.s; + return r; +} + +// (public) this << n +function bnShiftLeft(n) { + var r = nbi(); + if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r); + return r; +} + +// (public) this >> n +function bnShiftRight(n) { + var r = nbi(); + if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r); + return r; +} + +// return index of lowest 1-bit in x, x < 2^31 +function lbit(x) { + if(x == 0) return -1; + var r = 0; + if((x&0xffff) == 0) { x >>= 16; r += 16; } + if((x&0xff) == 0) { x >>= 8; r += 8; } + if((x&0xf) == 0) { x >>= 4; r += 4; } + if((x&3) == 0) { x >>= 2; r += 2; } + if((x&1) == 0) ++r; + return r; +} + +// (public) returns index of lowest 1-bit (or -1 if none) +function bnGetLowestSetBit() { + for(var i = 0; i < this.t; ++i) + if(this[i] != 0) return i*this.DB+lbit(this[i]); + if(this.s < 0) return this.t*this.DB; + return -1; +} + +// return number of 1 bits in x +function cbit(x) { + var r = 0; + while(x != 0) { x &= x-1; ++r; } + return r; +} + +// (public) return number of set bits +function bnBitCount() { + var r = 0, x = this.s&this.DM; + for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x); + return r; +} + +// (public) true iff nth bit is set +function bnTestBit(n) { + var j = Math.floor(n/this.DB); + if(j >= this.t) return(this.s!=0); + return((this[j]&(1<<(n%this.DB)))!=0); +} + +// (protected) this op (1<>= this.DB; + } + if(a.t < this.t) { + c += a.s; + while(i < this.t) { + c += this[i]; + r[i++] = c&this.DM; + c >>= this.DB; + } + c += this.s; + } + else { + c += this.s; + while(i < a.t) { + c += a[i]; + r[i++] = c&this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = (c<0)?-1:0; + if(c > 0) r[i++] = c; + else if(c < -1) r[i++] = this.DV+c; + r.t = i; + r.clamp(); +} + +// (public) this + a +function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; } + +// (public) this - a +function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; } + +// (public) this * a +function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; } + +// (public) this^2 +function bnSquare() { var r = nbi(); this.squareTo(r); return r; } + +// (public) this / a +function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; } + +// (public) this % a +function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; } + +// (public) [this/a,this%a] +function bnDivideAndRemainder(a) { + var q = nbi(), r = nbi(); + this.divRemTo(a,q,r); + return new Array(q,r); +} + +// (protected) this *= n, this >= 0, 1 < n < DV +function bnpDMultiply(n) { + this[this.t] = this.am(0,n-1,this,0,0,this.t); + ++this.t; + this.clamp(); +} + +// (protected) this += n << w words, this >= 0 +function bnpDAddOffset(n,w) { + if(n == 0) return; + while(this.t <= w) this[this.t++] = 0; + this[w] += n; + while(this[w] >= this.DV) { + this[w] -= this.DV; + if(++w >= this.t) this[this.t++] = 0; + ++this[w]; + } +} + +// A "null" reducer +function NullExp() {} +function nNop(x) { return x; } +function nMulTo(x,y,r) { x.multiplyTo(y,r); } +function nSqrTo(x,r) { x.squareTo(r); } + +NullExp.prototype.convert = nNop; +NullExp.prototype.revert = nNop; +NullExp.prototype.mulTo = nMulTo; +NullExp.prototype.sqrTo = nSqrTo; + +// (public) this^e +function bnPow(e) { return this.exp(e,new NullExp()); } + +// (protected) r = lower n words of "this * a", a.t <= n +// "this" should be the larger one if appropriate. +function bnpMultiplyLowerTo(a,n,r) { + var i = Math.min(this.t+a.t,n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while(i > 0) r[--i] = 0; + var j; + for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t); + for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i); + r.clamp(); +} + +// (protected) r = "this * a" without lower n words, n > 0 +// "this" should be the larger one if appropriate. +function bnpMultiplyUpperTo(a,n,r) { + --n; + var i = r.t = this.t+a.t-n; + r.s = 0; // assumes a,this >= 0 + while(--i >= 0) r[i] = 0; + for(i = Math.max(n-this.t,0); i < a.t; ++i) + r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n); + r.clamp(); + r.drShiftTo(1,r); +} + +// Barrett modular reduction +function Barrett(m) { + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2*m.t,this.r2); + this.mu = this.r2.divide(m); + this.m = m; +} + +function barrettConvert(x) { + if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m); + else if(x.compareTo(this.m) < 0) return x; + else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; } +} + +function barrettRevert(x) { return x; } + +// x = x mod m (HAC 14.42) +function barrettReduce(x) { + x.drShiftTo(this.m.t-1,this.r2); + if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); } + this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3); + this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2); + while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1); + x.subTo(this.r2,x); + while(x.compareTo(this.m) >= 0) x.subTo(this.m,x); +} + +// r = x^2 mod m; x != r +function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); } + +// r = x*y mod m; x,y != r +function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); } + +Barrett.prototype.convert = barrettConvert; +Barrett.prototype.revert = barrettRevert; +Barrett.prototype.reduce = barrettReduce; +Barrett.prototype.mulTo = barrettMulTo; +Barrett.prototype.sqrTo = barrettSqrTo; + +// (public) this^e % m (HAC 14.85) +function bnModPow(e,m) { + var i = e.bitLength(), k, r = nbv(1), z; + if(i <= 0) return r; + else if(i < 18) k = 1; + else if(i < 48) k = 3; + else if(i < 144) k = 4; + else if(i < 768) k = 5; + else k = 6; + if(i < 8) + z = new Classic(m); + else if(m.isEven()) + z = new Barrett(m); + else + z = new Montgomery(m); + + // precomputation + var g = new Array(), n = 3, k1 = k-1, km = (1< 1) { + var g2 = nbi(); + z.sqrTo(g[1],g2); + while(n <= km) { + g[n] = nbi(); + z.mulTo(g2,g[n-2],g[n]); + n += 2; + } + } + + var j = e.t-1, w, is1 = true, r2 = nbi(), t; + i = nbits(e[j])-1; + while(j >= 0) { + if(i >= k1) w = (e[j]>>(i-k1))&km; + else { + w = (e[j]&((1<<(i+1))-1))<<(k1-i); + if(j > 0) w |= e[j-1]>>(this.DB+i-k1); + } + + n = k; + while((w&1) == 0) { w >>= 1; --n; } + if((i -= n) < 0) { i += this.DB; --j; } + if(is1) { // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } + else { + while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; } + if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; } + z.mulTo(r2,g[w],r); + } + + while(j >= 0 && (e[j]&(1< 0) { + x.rShiftTo(g,x); + y.rShiftTo(g,y); + } + while(x.signum() > 0) { + if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x); + if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y); + if(x.compareTo(y) >= 0) { + x.subTo(y,x); + x.rShiftTo(1,x); + } + else { + y.subTo(x,y); + y.rShiftTo(1,y); + } + } + if(g > 0) y.lShiftTo(g,y); + return y; +} + +// (protected) this % n, n < 2^26 +function bnpModInt(n) { + if(n <= 0) return 0; + var d = this.DV%n, r = (this.s<0)?n-1:0; + if(this.t > 0) + if(d == 0) r = this[0]%n; + else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n; + return r; +} + +// (public) 1/this % m (HAC 14.61) +function bnModInverse(m) { + var ac = m.isEven(); + if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO; + var u = m.clone(), v = this.clone(); + var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1); + while(u.signum() != 0) { + while(u.isEven()) { + u.rShiftTo(1,u); + if(ac) { + if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); } + a.rShiftTo(1,a); + } + else if(!b.isEven()) b.subTo(m,b); + b.rShiftTo(1,b); + } + while(v.isEven()) { + v.rShiftTo(1,v); + if(ac) { + if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); } + c.rShiftTo(1,c); + } + else if(!d.isEven()) d.subTo(m,d); + d.rShiftTo(1,d); + } + if(u.compareTo(v) >= 0) { + u.subTo(v,u); + if(ac) a.subTo(c,a); + b.subTo(d,b); + } + else { + v.subTo(u,v); + if(ac) c.subTo(a,c); + d.subTo(b,d); + } + } + if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO; + if(d.compareTo(m) >= 0) return d.subtract(m); + if(d.signum() < 0) d.addTo(m,d); else return d; + if(d.signum() < 0) return d.add(m); else return d; +} + +var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997]; +var lplim = (1<<26)/lowprimes[lowprimes.length-1]; + +// (public) test primality with certainty >= 1-.5^t +function bnIsProbablePrime(t) { + var i, x = this.abs(); + if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) { + for(i = 0; i < lowprimes.length; ++i) + if(x[0] == lowprimes[i]) return true; + return false; + } + if(x.isEven()) return false; + i = 1; + while(i < lowprimes.length) { + var m = lowprimes[i], j = i+1; + while(j < lowprimes.length && m < lplim) m *= lowprimes[j++]; + m = x.modInt(m); + while(i < j) if(m%lowprimes[i++] == 0) return false; + } + return x.millerRabin(t); +} + +/* added by Recurity Labs */ + +function nbits(x) { + var n = 1, t; + if ((t = x >>> 16) != 0) { + x = t; + n += 16; + } + if ((t = x >> 8) != 0) { + x = t; + n += 8; + } + if ((t = x >> 4) != 0) { + x = t; + n += 4; + } + if ((t = x >> 2) != 0) { + x = t; + n += 2; + } + if ((t = x >> 1) != 0) { + x = t; + n += 1; + } + return n; +} + +function bnToMPI () { + var ba = this.toByteArray(); + var size = (ba.length-1)*8+nbits(ba[0]); + var result = ""; + result += String.fromCharCode((size & 0xFF00) >> 8); + result += String.fromCharCode(size & 0xFF); + result += util.bin2str(ba); + return result; +} +/* END of addition */ + +// (protected) true if probably prime (HAC 4.24, Miller-Rabin) +function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if(k <= 0) return false; + var r = n1.shiftRight(k); + t = (t+1)>>1; + if(t > lowprimes.length) t = lowprimes.length; + var a = nbi(); + for(var i = 0; i < t; ++i) { + //Pick bases at random, instead of starting at 2 + a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]); + var y = a.modPow(r,this); + if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while(j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2,this); + if(y.compareTo(BigInteger.ONE) == 0) return false; + } + if(y.compareTo(n1) != 0) return false; + } + } + return true; +} + +// protected +BigInteger.prototype.chunkSize = bnpChunkSize; +BigInteger.prototype.toRadix = bnpToRadix; +BigInteger.prototype.fromRadix = bnpFromRadix; +BigInteger.prototype.fromNumber = bnpFromNumber; +BigInteger.prototype.bitwiseTo = bnpBitwiseTo; +BigInteger.prototype.changeBit = bnpChangeBit; +BigInteger.prototype.addTo = bnpAddTo; +BigInteger.prototype.dMultiply = bnpDMultiply; +BigInteger.prototype.dAddOffset = bnpDAddOffset; +BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; +BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; +BigInteger.prototype.modInt = bnpModInt; +BigInteger.prototype.millerRabin = bnpMillerRabin; + +// public +BigInteger.prototype.clone = bnClone; +BigInteger.prototype.intValue = bnIntValue; +BigInteger.prototype.byteValue = bnByteValue; +BigInteger.prototype.shortValue = bnShortValue; +BigInteger.prototype.signum = bnSigNum; +BigInteger.prototype.toByteArray = bnToByteArray; +BigInteger.prototype.equals = bnEquals; +BigInteger.prototype.min = bnMin; +BigInteger.prototype.max = bnMax; +BigInteger.prototype.and = bnAnd; +BigInteger.prototype.or = bnOr; +BigInteger.prototype.xor = bnXor; +BigInteger.prototype.andNot = bnAndNot; +BigInteger.prototype.not = bnNot; +BigInteger.prototype.shiftLeft = bnShiftLeft; +BigInteger.prototype.shiftRight = bnShiftRight; +BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; +BigInteger.prototype.bitCount = bnBitCount; +BigInteger.prototype.testBit = bnTestBit; +BigInteger.prototype.setBit = bnSetBit; +BigInteger.prototype.clearBit = bnClearBit; +BigInteger.prototype.flipBit = bnFlipBit; +BigInteger.prototype.add = bnAdd; +BigInteger.prototype.subtract = bnSubtract; +BigInteger.prototype.multiply = bnMultiply; +BigInteger.prototype.divide = bnDivide; +BigInteger.prototype.remainder = bnRemainder; +BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder; +BigInteger.prototype.modPow = bnModPow; +BigInteger.prototype.modInverse = bnModInverse; +BigInteger.prototype.pow = bnPow; +BigInteger.prototype.gcd = bnGCD; +BigInteger.prototype.isProbablePrime = bnIsProbablePrime; +BigInteger.prototype.toMPI = bnToMPI; + +// JSBN-specific extension +BigInteger.prototype.square = bnSquare; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// RSA implementation + +function SecureRandom(){ + function nextBytes(byteArray){ + for(var n = 0; n < byteArray.length;n++){ + byteArray[n] = openpgp_crypto_getSecureRandomOctet(); + } + } + this.nextBytes = nextBytes; +} + +function RSA() { + /** + * This function uses jsbn Big Num library to decrypt RSA + * @param m + * message + * @param d + * RSA d as BigInteger + * @param p + * RSA p as BigInteger + * @param q + * RSA q as BigInteger + * @param u + * RSA u as BigInteger + * @return {BigInteger} The decrypted value of the message + */ + function decrypt(m, d, p, q, u) { + var xp = m.mod(p).modPow(d.mod(p.subtract(BigInteger.ONE)), p); + var xq = m.mod(q).modPow(d.mod(q.subtract(BigInteger.ONE)), q); + util.print_debug("rsa.js decrypt\nxpn:"+util.hexstrdump(xp.toMPI())+"\nxqn:"+util.hexstrdump(xq.toMPI())); + + var t = xq.subtract(xp); + if (t[0] == 0) { + t = xp.subtract(xq); + t = t.multiply(u).mod(q); + t = q.subtract(t); + } else { + t = t.multiply(u).mod(q); + } + return t.multiply(p).add(xp); + } + + /** + * encrypt message + * @param m message as BigInteger + * @param e public MPI part as BigInteger + * @param n public MPI part as BigInteger + * @return BigInteger + */ + function encrypt(m,e,n) { + return m.modPowInt(e, n); + } + + /* Sign and Verify */ + function sign(m,d,n) { + return m.modPow(d, n); + } + + function verify(x,e,n) { + return x.modPowInt(e, n); + } + + // "empty" RSA key constructor + function keyObject() { + this.n = null; + this.e = 0; + this.ee = null; + this.d = null; + this.p = null; + this.q = null; + this.dmp1 = null; + this.dmq1 = null; + this.u = null; + } + + // Generate a new random private key B bits long, using public expt E + function generate(B,E) { + var key = new keyObject(); + var rng = new SecureRandom(); + var qs = B>>1; + key.e = parseInt(E,16); + key.ee = new BigInteger(E,16); + for(;;) { + for(;;) { + key.p = new BigInteger(B-qs,1,rng); + if(key.p.subtract(BigInteger.ONE).gcd(key.ee).compareTo(BigInteger.ONE) == 0 && key.p.isProbablePrime(10)) break; + } + for(;;) { + key.q = new BigInteger(qs,1,rng); + if(key.q.subtract(BigInteger.ONE).gcd(key.ee).compareTo(BigInteger.ONE) == 0 && key.q.isProbablePrime(10)) break; + } + if(key.p.compareTo(key.q) <= 0) { + var t = key.p; + key.p = key.q; + key.q = t; + } + var p1 = key.p.subtract(BigInteger.ONE); + var q1 = key.q.subtract(BigInteger.ONE); + var phi = p1.multiply(q1); + if(phi.gcd(key.ee).compareTo(BigInteger.ONE) == 0) { + key.n = key.p.multiply(key.q); + key.d = key.ee.modInverse(phi); + key.dmp1 = key.d.mod(p1); + key.dmq1 = key.d.mod(q1); + key.u = key.p.modInverse(key.q); + break; + } + } + return key; + } + + this.encrypt = encrypt; + this.decrypt = decrypt; + this.verify = verify; + this.sign = sign; + this.generate = generate; + this.keyObject = keyObject; +} +/** + * A fast MD5 JavaScript implementation + * Copyright (c) 2012 Joseph Myers + * http://www.myersdaily.org/joseph/javascript/md5-text.html + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for any purposes and without + * fee is hereby granted provided that this copyright notice + * appears in all copies. + * + * Of course, this soft is provided "as is" without express or implied + * warranty of any kind. + */ + +function MD5(entree) { + var hex = md5(entree); + var bin = util.hex2bin(hex); + return bin; +} + +function md5cycle(x, k) { +var a = x[0], b = x[1], c = x[2], d = x[3]; + +a = ff(a, b, c, d, k[0], 7, -680876936); +d = ff(d, a, b, c, k[1], 12, -389564586); +c = ff(c, d, a, b, k[2], 17, 606105819); +b = ff(b, c, d, a, k[3], 22, -1044525330); +a = ff(a, b, c, d, k[4], 7, -176418897); +d = ff(d, a, b, c, k[5], 12, 1200080426); +c = ff(c, d, a, b, k[6], 17, -1473231341); +b = ff(b, c, d, a, k[7], 22, -45705983); +a = ff(a, b, c, d, k[8], 7, 1770035416); +d = ff(d, a, b, c, k[9], 12, -1958414417); +c = ff(c, d, a, b, k[10], 17, -42063); +b = ff(b, c, d, a, k[11], 22, -1990404162); +a = ff(a, b, c, d, k[12], 7, 1804603682); +d = ff(d, a, b, c, k[13], 12, -40341101); +c = ff(c, d, a, b, k[14], 17, -1502002290); +b = ff(b, c, d, a, k[15], 22, 1236535329); + +a = gg(a, b, c, d, k[1], 5, -165796510); +d = gg(d, a, b, c, k[6], 9, -1069501632); +c = gg(c, d, a, b, k[11], 14, 643717713); +b = gg(b, c, d, a, k[0], 20, -373897302); +a = gg(a, b, c, d, k[5], 5, -701558691); +d = gg(d, a, b, c, k[10], 9, 38016083); +c = gg(c, d, a, b, k[15], 14, -660478335); +b = gg(b, c, d, a, k[4], 20, -405537848); +a = gg(a, b, c, d, k[9], 5, 568446438); +d = gg(d, a, b, c, k[14], 9, -1019803690); +c = gg(c, d, a, b, k[3], 14, -187363961); +b = gg(b, c, d, a, k[8], 20, 1163531501); +a = gg(a, b, c, d, k[13], 5, -1444681467); +d = gg(d, a, b, c, k[2], 9, -51403784); +c = gg(c, d, a, b, k[7], 14, 1735328473); +b = gg(b, c, d, a, k[12], 20, -1926607734); + +a = hh(a, b, c, d, k[5], 4, -378558); +d = hh(d, a, b, c, k[8], 11, -2022574463); +c = hh(c, d, a, b, k[11], 16, 1839030562); +b = hh(b, c, d, a, k[14], 23, -35309556); +a = hh(a, b, c, d, k[1], 4, -1530992060); +d = hh(d, a, b, c, k[4], 11, 1272893353); +c = hh(c, d, a, b, k[7], 16, -155497632); +b = hh(b, c, d, a, k[10], 23, -1094730640); +a = hh(a, b, c, d, k[13], 4, 681279174); +d = hh(d, a, b, c, k[0], 11, -358537222); +c = hh(c, d, a, b, k[3], 16, -722521979); +b = hh(b, c, d, a, k[6], 23, 76029189); +a = hh(a, b, c, d, k[9], 4, -640364487); +d = hh(d, a, b, c, k[12], 11, -421815835); +c = hh(c, d, a, b, k[15], 16, 530742520); +b = hh(b, c, d, a, k[2], 23, -995338651); + +a = ii(a, b, c, d, k[0], 6, -198630844); +d = ii(d, a, b, c, k[7], 10, 1126891415); +c = ii(c, d, a, b, k[14], 15, -1416354905); +b = ii(b, c, d, a, k[5], 21, -57434055); +a = ii(a, b, c, d, k[12], 6, 1700485571); +d = ii(d, a, b, c, k[3], 10, -1894986606); +c = ii(c, d, a, b, k[10], 15, -1051523); +b = ii(b, c, d, a, k[1], 21, -2054922799); +a = ii(a, b, c, d, k[8], 6, 1873313359); +d = ii(d, a, b, c, k[15], 10, -30611744); +c = ii(c, d, a, b, k[6], 15, -1560198380); +b = ii(b, c, d, a, k[13], 21, 1309151649); +a = ii(a, b, c, d, k[4], 6, -145523070); +d = ii(d, a, b, c, k[11], 10, -1120210379); +c = ii(c, d, a, b, k[2], 15, 718787259); +b = ii(b, c, d, a, k[9], 21, -343485551); + +x[0] = add32(a, x[0]); +x[1] = add32(b, x[1]); +x[2] = add32(c, x[2]); +x[3] = add32(d, x[3]); + +} + +function cmn(q, a, b, x, s, t) { +a = add32(add32(a, q), add32(x, t)); +return add32((a << s) | (a >>> (32 - s)), b); +} + +function ff(a, b, c, d, x, s, t) { +return cmn((b & c) | ((~b) & d), a, b, x, s, t); +} + +function gg(a, b, c, d, x, s, t) { +return cmn((b & d) | (c & (~d)), a, b, x, s, t); +} + +function hh(a, b, c, d, x, s, t) { +return cmn(b ^ c ^ d, a, b, x, s, t); +} + +function ii(a, b, c, d, x, s, t) { +return cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +function md51(s) { +txt = ''; +var n = s.length, +state = [1732584193, -271733879, -1732584194, 271733878], i; +for (i=64; i<=s.length; i+=64) { +md5cycle(state, md5blk(s.substring(i-64, i))); +} +s = s.substring(i-64); +var tail = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0]; +for (i=0; i>2] |= s.charCodeAt(i) << ((i%4) << 3); +tail[i>>2] |= 0x80 << ((i%4) << 3); +if (i > 55) { +md5cycle(state, tail); +for (i=0; i<16; i++) tail[i] = 0; +} +tail[14] = n*8; +md5cycle(state, tail); +return state; +} + +/* there needs to be support for Unicode here, + * unless we pretend that we can redefine the MD-5 + * algorithm for multi-byte characters (perhaps + * by adding every four 16-bit characters and + * shortening the sum to 32 bits). Otherwise + * I suggest performing MD-5 as if every character + * was two bytes--e.g., 0040 0025 = @%--but then + * how will an ordinary MD-5 sum be matched? + * There is no way to standardize text to something + * like UTF-8 before transformation; speed cost is + * utterly prohibitive. The JavaScript standard + * itself needs to look at this: it should start + * providing access to strings as preformed UTF-8 + * 8-bit unsigned value arrays. + */ +function md5blk(s) { /* I figured global was faster. */ +var md5blks = [], i; /* Andy King said do it this way. */ +for (i=0; i<64; i+=4) { +md5blks[i>>2] = s.charCodeAt(i) ++ (s.charCodeAt(i+1) << 8) ++ (s.charCodeAt(i+2) << 16) ++ (s.charCodeAt(i+3) << 24); +} +return md5blks; +} + +var hex_chr = '0123456789abcdef'.split(''); + +function rhex(n) +{ +var s='', j=0; +for(; j<4; j++) +s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] ++ hex_chr[(n >> (j * 8)) & 0x0F]; +return s; +} + +function hex(x) { +for (var i=0; i> 16) + (y >> 16) + (lsw >> 16); +return (msw << 16) | (lsw & 0xFFFF); +} +} +/* + * CryptoMX Tools + * Copyright (C) 2004 - 2006 Derek Buitenhuis + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* Modified by Recurity Labs GmbH + */ + +var RMDsize = 160; +var X = new Array(); + +function ROL(x, n) +{ + return new Number ((x << n) | ( x >>> (32 - n))); +} + +function F(x, y, z) +{ + return new Number(x ^ y ^ z); +} + +function G(x, y, z) +{ + return new Number((x & y) | (~x & z)); +} + +function H(x, y, z) +{ + return new Number((x | ~y) ^ z); +} + +function I(x, y, z) +{ + return new Number((x & z) | (y & ~z)); +} + +function J(x, y, z) +{ + return new Number(x ^ (y | ~z)); +} + +function mixOneRound(a, b, c, d, e, x, s, roundNumber) +{ + switch (roundNumber) + { + case 0 : a += F(b, c, d) + x + 0x00000000; break; + case 1 : a += G(b, c, d) + x + 0x5a827999; break; + case 2 : a += H(b, c, d) + x + 0x6ed9eba1; break; + case 3 : a += I(b, c, d) + x + 0x8f1bbcdc; break; + case 4 : a += J(b, c, d) + x + 0xa953fd4e; break; + case 5 : a += J(b, c, d) + x + 0x50a28be6; break; + case 6 : a += I(b, c, d) + x + 0x5c4dd124; break; + case 7 : a += H(b, c, d) + x + 0x6d703ef3; break; + case 8 : a += G(b, c, d) + x + 0x7a6d76e9; break; + case 9 : a += F(b, c, d) + x + 0x00000000; break; + + default : document.write("Bogus round number"); break; + } + + a = ROL(a, s) + e; + c = ROL(c, 10); + + a &= 0xffffffff; + b &= 0xffffffff; + c &= 0xffffffff; + d &= 0xffffffff; + e &= 0xffffffff; + + var retBlock = new Array(); + retBlock[0] = a; + retBlock[1] = b; + retBlock[2] = c; + retBlock[3] = d; + retBlock[4] = e; + retBlock[5] = x; + retBlock[6] = s; + + return retBlock; +} + +function MDinit (MDbuf) +{ + MDbuf[0] = 0x67452301; + MDbuf[1] = 0xefcdab89; + MDbuf[2] = 0x98badcfe; + MDbuf[3] = 0x10325476; + MDbuf[4] = 0xc3d2e1f0; +} + +var ROLs = [ + [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], + [ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12], + [11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5], + [11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12], + [ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6], + [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6], + [ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11], + [ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5], + [15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8], + [ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11] +]; + +var indexes = [ + [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8], + [ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12], + [ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2], + [ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13], + [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12], + [ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2], + [15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13], + [ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14], + [12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11] +]; + +function compress (MDbuf, X) +{ + blockA = new Array(); + blockB = new Array(); + + var retBlock; + + for (var i=0; i < 5; i++) + { + blockA[i] = new Number(MDbuf[i]); + blockB[i] = new Number(MDbuf[i]); + } + + var step = 0; + for (var j = 0; j < 5; j++) + { + for (var i = 0; i < 16; i++) + { + retBlock = mixOneRound( + blockA[(step+0) % 5], + blockA[(step+1) % 5], + blockA[(step+2) % 5], + blockA[(step+3) % 5], + blockA[(step+4) % 5], + X[indexes[j][i]], + ROLs[j][i], + j + ); + + blockA[(step+0) % 5] = retBlock[0]; + blockA[(step+1) % 5] = retBlock[1]; + blockA[(step+2) % 5] = retBlock[2]; + blockA[(step+3) % 5] = retBlock[3]; + blockA[(step+4) % 5] = retBlock[4]; + + step += 4; + } + } + + step = 0; + for (var j = 5; j < 10; j++) + { + for (var i = 0; i < 16; i++) + { + retBlock = mixOneRound( + blockB[(step+0) % 5], + blockB[(step+1) % 5], + blockB[(step+2) % 5], + blockB[(step+3) % 5], + blockB[(step+4) % 5], + X[indexes[j][i]], + ROLs[j][i], + j + ); + + blockB[(step+0) % 5] = retBlock[0]; + blockB[(step+1) % 5] = retBlock[1]; + blockB[(step+2) % 5] = retBlock[2]; + blockB[(step+3) % 5] = retBlock[3]; + blockB[(step+4) % 5] = retBlock[4]; + + step += 4; + } + } + + blockB[3] += blockA[2] + MDbuf[1]; + MDbuf[1] = MDbuf[2] + blockA[3] + blockB[4]; + MDbuf[2] = MDbuf[3] + blockA[4] + blockB[0]; + MDbuf[3] = MDbuf[4] + blockA[0] + blockB[1]; + MDbuf[4] = MDbuf[0] + blockA[1] + blockB[2]; + MDbuf[0] = blockB[3]; +} + +function zeroX(X) +{ + for (var i = 0; i < 16; i++) { X[i] = 0; } +} + +function MDfinish (MDbuf, strptr, lswlen, mswlen) +{ + var X = new Array(16); + zeroX(X); + + var j = 0; + for (var i=0; i < (lswlen & 63); i++) + { + X[i >>> 2] ^= (strptr.charCodeAt(j++) & 255) << (8 * (i & 3)); + } + + X[(lswlen >>> 2) & 15] ^= 1 << (8 * (lswlen & 3) + 7); + + if ((lswlen & 63) > 55) + { + compress(MDbuf, X); + var X = new Array(16); + zeroX(X); + } + + X[14] = lswlen << 3; + X[15] = (lswlen >>> 29) | (mswlen << 3); + + compress(MDbuf, X); +} + +function BYTES_TO_DWORD(fourChars) +{ + var tmp = (fourChars.charCodeAt(3) & 255) << 24; + tmp |= (fourChars.charCodeAt(2) & 255) << 16; + tmp |= (fourChars.charCodeAt(1) & 255) << 8; + tmp |= (fourChars.charCodeAt(0) & 255); + + return tmp; +} + +function RMD(message) +{ + var MDbuf = new Array(RMDsize / 32); + var hashcode = new Array(RMDsize / 8); + var length; + var nbytes; + + MDinit(MDbuf); + length = message.length; + + var X = new Array(16); + zeroX(X); + + var j=0; + for (var nbytes=length; nbytes > 63; nbytes -= 64) + { + for (var i=0; i < 16; i++) + { + X[i] = BYTES_TO_DWORD(message.substr(j, 4)); + j += 4; + } + compress(MDbuf, X); + } + + MDfinish(MDbuf, message.substr(j), length, 0); + + for (var i=0; i < RMDsize / 8; i += 4) + { + hashcode[i] = MDbuf[i >>> 2] & 255; + hashcode[i+1] = (MDbuf[i >>> 2] >>> 8) & 255; + hashcode[i+2] = (MDbuf[i >>> 2] >>> 16) & 255; + hashcode[i+3] = (MDbuf[i >>> 2] >>> 24) & 255; + } + + return hashcode; +} + + +function RMDstring(message) +{ + var hashcode = RMD(message); + var retString = ""; + + for (var i=0; i < RMDsize/8; i++) + { + retString += String.fromCharCode(hashcode[i]); + } + + return retString; +}/* A JavaScript implementation of the SHA family of hashes, as defined in FIPS + * PUB 180-2 as well as the corresponding HMAC implementation as defined in + * FIPS PUB 198a + * + * Version 1.3 Copyright Brian Turek 2008-2010 + * Distributed under the BSD License + * See http://jssha.sourceforge.net/ for more information + * + * Several functions taken from Paul Johnson + */ + +/* Modified by Recurity Labs GmbH + * + * This code has been slightly modified direct string output: + * - bin2bstr has been added + * - following wrappers of this library have been added: + * - str_sha1 + * - str_sha256 + * - str_sha224 + * - str_sha384 + * - str_sha512 + */ + +var jsSHA = (function () { + + /* + * Configurable variables. Defaults typically work + */ + /* Number of Bits Per character (8 for ASCII, 16 for Unicode) */ + var charSize = 8, + /* base-64 pad character. "=" for strict RFC compliance */ + b64pad = "", + /* hex output format. 0 - lowercase; 1 - uppercase */ + hexCase = 0, + + /* + * Int_64 is a object for 2 32-bit numbers emulating a 64-bit number + * + * @constructor + * @param {Number} msint_32 The most significant 32-bits of a 64-bit number + * @param {Number} lsint_32 The least significant 32-bits of a 64-bit number + */ + Int_64 = function (msint_32, lsint_32) + { + this.highOrder = msint_32; + this.lowOrder = lsint_32; + }, + + /* + * Convert a string to an array of big-endian words + * If charSize is ASCII, characters >255 have their hi-byte silently + * ignored. + * + * @param {String} str String to be converted to binary representation + * @return Integer array representation of the parameter + */ + str2binb = function (str) + { + var bin = [], mask = (1 << charSize) - 1, + length = str.length * charSize, i; + + for (i = 0; i < length; i += charSize) + { + bin[i >> 5] |= (str.charCodeAt(i / charSize) & mask) << + (32 - charSize - (i % 32)); + } + + return bin; + }, + + /* + * Convert a hex string to an array of big-endian words + * + * @param {String} str String to be converted to binary representation + * @return Integer array representation of the parameter + */ + hex2binb = function (str) + { + var bin = [], length = str.length, i, num; + + for (i = 0; i < length; i += 2) + { + num = parseInt(str.substr(i, 2), 16); + if (!isNaN(num)) + { + bin[i >> 3] |= num << (24 - (4 * (i % 8))); + } + else + { + return "INVALID HEX STRING"; + } + } + + return bin; + }, + + /* + * Convert an array of big-endian words to a hex string. + * + * @private + * @param {Array} binarray Array of integers to be converted to hexidecimal + * representation + * @return Hexidecimal representation of the parameter in String form + */ + binb2hex = function (binarray) + { + var hex_tab = (hexCase) ? "0123456789ABCDEF" : "0123456789abcdef", + str = "", length = binarray.length * 4, i, srcByte; + + for (i = 0; i < length; i += 1) + { + srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8); + str += hex_tab.charAt((srcByte >> 4) & 0xF) + + hex_tab.charAt(srcByte & 0xF); + } + + return str; + }, + + /* + * Convert an array of big-endian words to a base-64 string + * + * @private + * @param {Array} binarray Array of integers to be converted to base-64 + * representation + * @return Base-64 encoded representation of the parameter in String form + */ + binb2b64 = function (binarray) + { + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + "0123456789+/", str = "", length = binarray.length * 4, i, j, + triplet; + + for (i = 0; i < length; i += 3) + { + triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16) | + (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8) | + ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF); + for (j = 0; j < 4; j += 1) + { + if (i * 8 + j * 6 <= binarray.length * 32) + { + str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); + } + else + { + str += b64pad; + } + } + } + return str; + }, + + /* + * Convert an array of big-endian words to a string + */ + binb2str = function (bin) + { + var str = ""; + var mask = (1 << 8) - 1; + for(var i = 0; i < bin.length * 32; i += 8) + str += String.fromCharCode((bin[i>>5] >>> (24 - i%32)) & mask); + return str; + }, + /* + * The 32-bit implementation of circular rotate left + * + * @private + * @param {Number} x The 32-bit integer argument + * @param {Number} n The number of bits to shift + * @return The x shifted circularly by n bits + */ + rotl_32 = function (x, n) + { + return (x << n) | (x >>> (32 - n)); + }, + + /* + * The 32-bit implementation of circular rotate right + * + * @private + * @param {Number} x The 32-bit integer argument + * @param {Number} n The number of bits to shift + * @return The x shifted circularly by n bits + */ + rotr_32 = function (x, n) + { + return (x >>> n) | (x << (32 - n)); + }, + + /* + * The 64-bit implementation of circular rotate right + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @param {Number} n The number of bits to shift + * @return The x shifted circularly by n bits + */ + rotr_64 = function (x, n) + { + if (n <= 32) + { + return new Int_64( + (x.highOrder >>> n) | (x.lowOrder << (32 - n)), + (x.lowOrder >>> n) | (x.highOrder << (32 - n)) + ); + } + else + { + return new Int_64( + (x.lowOrder >>> n) | (x.highOrder << (32 - n)), + (x.highOrder >>> n) | (x.lowOrder << (32 - n)) + ); + } + }, + + /* + * The 32-bit implementation of shift right + * + * @private + * @param {Number} x The 32-bit integer argument + * @param {Number} n The number of bits to shift + * @return The x shifted by n bits + */ + shr_32 = function (x, n) + { + return x >>> n; + }, + + /* + * The 64-bit implementation of shift right + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @param {Number} n The number of bits to shift + * @return The x shifted by n bits + */ + shr_64 = function (x, n) + { + if (n <= 32) + { + return new Int_64( + x.highOrder >>> n, + x.lowOrder >>> n | (x.highOrder << (32 - n)) + ); + } + else + { + return new Int_64( + 0, + x.highOrder << (32 - n) + ); + } + }, + + /* + * The 32-bit implementation of the NIST specified Parity function + * + * @private + * @param {Number} x The first 32-bit integer argument + * @param {Number} y The second 32-bit integer argument + * @param {Number} z The third 32-bit integer argument + * @return The NIST specified output of the function + */ + parity_32 = function (x, y, z) + { + return x ^ y ^ z; + }, + + /* + * The 32-bit implementation of the NIST specified Ch function + * + * @private + * @param {Number} x The first 32-bit integer argument + * @param {Number} y The second 32-bit integer argument + * @param {Number} z The third 32-bit integer argument + * @return The NIST specified output of the function + */ + ch_32 = function (x, y, z) + { + return (x & y) ^ (~x & z); + }, + + /* + * The 64-bit implementation of the NIST specified Ch function + * + * @private + * @param {Int_64} x The first 64-bit integer argument + * @param {Int_64} y The second 64-bit integer argument + * @param {Int_64} z The third 64-bit integer argument + * @return The NIST specified output of the function + */ + ch_64 = function (x, y, z) + { + return new Int_64( + (x.highOrder & y.highOrder) ^ (~x.highOrder & z.highOrder), + (x.lowOrder & y.lowOrder) ^ (~x.lowOrder & z.lowOrder) + ); + }, + + /* + * The 32-bit implementation of the NIST specified Maj function + * + * @private + * @param {Number} x The first 32-bit integer argument + * @param {Number} y The second 32-bit integer argument + * @param {Number} z The third 32-bit integer argument + * @return The NIST specified output of the function + */ + maj_32 = function (x, y, z) + { + return (x & y) ^ (x & z) ^ (y & z); + }, + + /* + * The 64-bit implementation of the NIST specified Maj function + * + * @private + * @param {Int_64} x The first 64-bit integer argument + * @param {Int_64} y The second 64-bit integer argument + * @param {Int_64} z The third 64-bit integer argument + * @return The NIST specified output of the function + */ + maj_64 = function (x, y, z) + { + return new Int_64( + (x.highOrder & y.highOrder) ^ + (x.highOrder & z.highOrder) ^ + (y.highOrder & z.highOrder), + (x.lowOrder & y.lowOrder) ^ + (x.lowOrder & z.lowOrder) ^ + (y.lowOrder & z.lowOrder) + ); + }, + + /* + * The 32-bit implementation of the NIST specified Sigma0 function + * + * @private + * @param {Number} x The 32-bit integer argument + * @return The NIST specified output of the function + */ + sigma0_32 = function (x) + { + return rotr_32(x, 2) ^ rotr_32(x, 13) ^ rotr_32(x, 22); + }, + + /* + * The 64-bit implementation of the NIST specified Sigma0 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return The NIST specified output of the function + */ + sigma0_64 = function (x) + { + var rotr28 = rotr_64(x, 28), rotr34 = rotr_64(x, 34), + rotr39 = rotr_64(x, 39); + + return new Int_64( + rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder, + rotr28.lowOrder ^ rotr34.lowOrder ^ rotr39.lowOrder); + }, + + /* + * The 32-bit implementation of the NIST specified Sigma1 function + * + * @private + * @param {Number} x The 32-bit integer argument + * @return The NIST specified output of the function + */ + sigma1_32 = function (x) + { + return rotr_32(x, 6) ^ rotr_32(x, 11) ^ rotr_32(x, 25); + }, + + /* + * The 64-bit implementation of the NIST specified Sigma1 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return The NIST specified output of the function + */ + sigma1_64 = function (x) + { + var rotr14 = rotr_64(x, 14), rotr18 = rotr_64(x, 18), + rotr41 = rotr_64(x, 41); + + return new Int_64( + rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder, + rotr14.lowOrder ^ rotr18.lowOrder ^ rotr41.lowOrder); + }, + + /* + * The 32-bit implementation of the NIST specified Gamma0 function + * + * @private + * @param {Number} x The 32-bit integer argument + * @return The NIST specified output of the function + */ + gamma0_32 = function (x) + { + return rotr_32(x, 7) ^ rotr_32(x, 18) ^ shr_32(x, 3); + }, + + /* + * The 64-bit implementation of the NIST specified Gamma0 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return The NIST specified output of the function + */ + gamma0_64 = function (x) + { + var rotr1 = rotr_64(x, 1), rotr8 = rotr_64(x, 8), shr7 = shr_64(x, 7); + + return new Int_64( + rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder, + rotr1.lowOrder ^ rotr8.lowOrder ^ shr7.lowOrder + ); + }, + + /* + * The 32-bit implementation of the NIST specified Gamma1 function + * + * @private + * @param {Number} x The 32-bit integer argument + * @return The NIST specified output of the function + */ + gamma1_32 = function (x) + { + return rotr_32(x, 17) ^ rotr_32(x, 19) ^ shr_32(x, 10); + }, + + /* + * The 64-bit implementation of the NIST specified Gamma1 function + * + * @private + * @param {Int_64} x The 64-bit integer argument + * @return The NIST specified output of the function + */ + gamma1_64 = function (x) + { + var rotr19 = rotr_64(x, 19), rotr61 = rotr_64(x, 61), + shr6 = shr_64(x, 6); + + return new Int_64( + rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder, + rotr19.lowOrder ^ rotr61.lowOrder ^ shr6.lowOrder + ); + }, + + /* + * Add two 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Number} x The first 32-bit integer argument to be added + * @param {Number} y The second 32-bit integer argument to be added + * @return The sum of x + y + */ + safeAdd_32_2 = function (x, y) + { + var lsw = (x & 0xFFFF) + (y & 0xFFFF), + msw = (x >>> 16) + (y >>> 16) + (lsw >>> 16); + + return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + }, + + /* + * Add four 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Number} a The first 32-bit integer argument to be added + * @param {Number} b The second 32-bit integer argument to be added + * @param {Number} c The third 32-bit integer argument to be added + * @param {Number} d The fourth 32-bit integer argument to be added + * @return The sum of a + b + c + d + */ + safeAdd_32_4 = function (a, b, c, d) + { + var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF), + msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + + (lsw >>> 16); + + return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + }, + + /* + * Add five 32-bit integers, wrapping at 2^32. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Number} a The first 32-bit integer argument to be added + * @param {Number} b The second 32-bit integer argument to be added + * @param {Number} c The third 32-bit integer argument to be added + * @param {Number} d The fourth 32-bit integer argument to be added + * @param {Number} e The fifth 32-bit integer argument to be added + * @return The sum of a + b + c + d + e + */ + safeAdd_32_5 = function (a, b, c, d, e) + { + var lsw = (a & 0xFFFF) + (b & 0xFFFF) + (c & 0xFFFF) + (d & 0xFFFF) + + (e & 0xFFFF), + msw = (a >>> 16) + (b >>> 16) + (c >>> 16) + (d >>> 16) + + (e >>> 16) + (lsw >>> 16); + + return ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + }, + + /* + * Add two 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} x The first 64-bit integer argument to be added + * @param {Int_64} y The second 64-bit integer argument to be added + * @return The sum of x + y + */ + safeAdd_64_2 = function (x, y) + { + var lsw, msw, lowOrder, highOrder; + + lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF); + msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16); + lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + lsw = (x.highOrder & 0xFFFF) + (y.highOrder & 0xFFFF) + (msw >>> 16); + msw = (x.highOrder >>> 16) + (y.highOrder >>> 16) + (lsw >>> 16); + highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + return new Int_64(highOrder, lowOrder); + }, + + /* + * Add four 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} a The first 64-bit integer argument to be added + * @param {Int_64} b The second 64-bit integer argument to be added + * @param {Int_64} c The third 64-bit integer argument to be added + * @param {Int_64} d The fouth 64-bit integer argument to be added + * @return The sum of a + b + c + d + */ + safeAdd_64_4 = function (a, b, c, d) + { + var lsw, msw, lowOrder, highOrder; + + lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF); + msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16); + lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + (msw >>> 16); + msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + + (c.highOrder >>> 16) + (d.highOrder >>> 16) + (lsw >>> 16); + highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + return new Int_64(highOrder, lowOrder); + }, + + /* + * Add five 64-bit integers, wrapping at 2^64. This uses 16-bit operations + * internally to work around bugs in some JS interpreters. + * + * @private + * @param {Int_64} a The first 64-bit integer argument to be added + * @param {Int_64} b The second 64-bit integer argument to be added + * @param {Int_64} c The third 64-bit integer argument to be added + * @param {Int_64} d The fouth 64-bit integer argument to be added + * @param {Int_64} e The fouth 64-bit integer argument to be added + * @return The sum of a + b + c + d + e + */ + safeAdd_64_5 = function (a, b, c, d, e) + { + var lsw, msw, lowOrder, highOrder; + + lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + + (e.lowOrder & 0xFFFF); + msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + + (lsw >>> 16); + lowOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + lsw = (a.highOrder & 0xFFFF) + (b.highOrder & 0xFFFF) + + (c.highOrder & 0xFFFF) + (d.highOrder & 0xFFFF) + + (e.highOrder & 0xFFFF) + (msw >>> 16); + msw = (a.highOrder >>> 16) + (b.highOrder >>> 16) + + (c.highOrder >>> 16) + (d.highOrder >>> 16) + + (e.highOrder >>> 16) + (lsw >>> 16); + highOrder = ((msw & 0xFFFF) << 16) | (lsw & 0xFFFF); + + return new Int_64(highOrder, lowOrder); + }, + + /* + * Calculates the SHA-1 hash of the string set at instantiation + * + * @private + * @param {Array} message The binary array representation of the string to + * hash + * @param {Number} messageLen The number of bits in the message + * @return The array of integers representing the SHA-1 hash of message + */ + coreSHA1 = function (message, messageLen) + { + var W = [], a, b, c, d, e, T, ch = ch_32, parity = parity_32, + maj = maj_32, rotl = rotl_32, safeAdd_2 = safeAdd_32_2, i, t, + safeAdd_5 = safeAdd_32_5, appendedMessageLength, + H = [ + 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 + ], + K = [ + 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, + 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, + 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, + 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, + 0x5a827999, 0x5a827999, 0x5a827999, 0x5a827999, + 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, + 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, + 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, + 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, + 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, 0x6ed9eba1, + 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, + 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, + 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, + 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, + 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, 0x8f1bbcdc, + 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, + 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, + 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, + 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, + 0xca62c1d6, 0xca62c1d6, 0xca62c1d6, 0xca62c1d6 + ]; + + /* Append '1' at the end of the binary string */ + message[messageLen >> 5] |= 0x80 << (24 - (messageLen % 32)); + /* Append length of binary string in the position such that the new + length is a multiple of 512. Logic does not work for even multiples + of 512 but there can never be even multiples of 512 */ + message[(((messageLen + 65) >> 9) << 4) + 15] = messageLen; + + appendedMessageLength = message.length; + + for (i = 0; i < appendedMessageLength; i += 16) + { + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + + for (t = 0; t < 80; t += 1) + { + if (t < 16) + { + W[t] = message[t + i]; + } + else + { + W[t] = rotl(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1); + } + + if (t < 20) + { + T = safeAdd_5(rotl(a, 5), ch(b, c, d), e, K[t], W[t]); + } + else if (t < 40) + { + T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, K[t], W[t]); + } + else if (t < 60) + { + T = safeAdd_5(rotl(a, 5), maj(b, c, d), e, K[t], W[t]); + } else { + T = safeAdd_5(rotl(a, 5), parity(b, c, d), e, K[t], W[t]); + } + + e = d; + d = c; + c = rotl(b, 30); + b = a; + a = T; + } + + H[0] = safeAdd_2(a, H[0]); + H[1] = safeAdd_2(b, H[1]); + H[2] = safeAdd_2(c, H[2]); + H[3] = safeAdd_2(d, H[3]); + H[4] = safeAdd_2(e, H[4]); + } + + return H; + }, + + /* + * Calculates the desired SHA-2 hash of the string set at instantiation + * + * @private + * @param {Array} The binary array representation of the string to hash + * @param {Number} The number of bits in message + * @param {String} variant The desired SHA-2 variant + * @return The array of integers representing the SHA-2 hash of message + */ + coreSHA2 = function (message, messageLen, variant) + { + var a, b, c, d, e, f, g, h, T1, T2, H, numRounds, lengthPosition, i, t, + binaryStringInc, binaryStringMult, safeAdd_2, safeAdd_4, safeAdd_5, + gamma0, gamma1, sigma0, sigma1, ch, maj, Int, K, W = [], + appendedMessageLength; + + /* Set up the various function handles and variable for the specific + * variant */ + if (variant === "SHA-224" || variant === "SHA-256") + { + /* 32-bit variant */ + numRounds = 64; + lengthPosition = (((messageLen + 65) >> 9) << 4) + 15; + binaryStringInc = 16; + binaryStringMult = 1; + Int = Number; + safeAdd_2 = safeAdd_32_2; + safeAdd_4 = safeAdd_32_4; + safeAdd_5 = safeAdd_32_5; + gamma0 = gamma0_32; + gamma1 = gamma1_32; + sigma0 = sigma0_32; + sigma1 = sigma1_32; + maj = maj_32; + ch = ch_32; + K = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 + ]; + + if (variant === "SHA-224") + { + H = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]; + } + else + { + H = [ + 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, + 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 + ]; + } + } + else if (variant === "SHA-384" || variant === "SHA-512") + { + /* 64-bit variant */ + numRounds = 80; + lengthPosition = (((messageLen + 128) >> 10) << 5) + 31; + binaryStringInc = 32; + binaryStringMult = 2; + Int = Int_64; + safeAdd_2 = safeAdd_64_2; + safeAdd_4 = safeAdd_64_4; + safeAdd_5 = safeAdd_64_5; + gamma0 = gamma0_64; + gamma1 = gamma1_64; + sigma0 = sigma0_64; + sigma1 = sigma1_64; + maj = maj_64; + ch = ch_64; + + K = [ + new Int(0x428a2f98, 0xd728ae22), new Int(0x71374491, 0x23ef65cd), + new Int(0xb5c0fbcf, 0xec4d3b2f), new Int(0xe9b5dba5, 0x8189dbbc), + new Int(0x3956c25b, 0xf348b538), new Int(0x59f111f1, 0xb605d019), + new Int(0x923f82a4, 0xaf194f9b), new Int(0xab1c5ed5, 0xda6d8118), + new Int(0xd807aa98, 0xa3030242), new Int(0x12835b01, 0x45706fbe), + new Int(0x243185be, 0x4ee4b28c), new Int(0x550c7dc3, 0xd5ffb4e2), + new Int(0x72be5d74, 0xf27b896f), new Int(0x80deb1fe, 0x3b1696b1), + new Int(0x9bdc06a7, 0x25c71235), new Int(0xc19bf174, 0xcf692694), + new Int(0xe49b69c1, 0x9ef14ad2), new Int(0xefbe4786, 0x384f25e3), + new Int(0x0fc19dc6, 0x8b8cd5b5), new Int(0x240ca1cc, 0x77ac9c65), + new Int(0x2de92c6f, 0x592b0275), new Int(0x4a7484aa, 0x6ea6e483), + new Int(0x5cb0a9dc, 0xbd41fbd4), new Int(0x76f988da, 0x831153b5), + new Int(0x983e5152, 0xee66dfab), new Int(0xa831c66d, 0x2db43210), + new Int(0xb00327c8, 0x98fb213f), new Int(0xbf597fc7, 0xbeef0ee4), + new Int(0xc6e00bf3, 0x3da88fc2), new Int(0xd5a79147, 0x930aa725), + new Int(0x06ca6351, 0xe003826f), new Int(0x14292967, 0x0a0e6e70), + new Int(0x27b70a85, 0x46d22ffc), new Int(0x2e1b2138, 0x5c26c926), + new Int(0x4d2c6dfc, 0x5ac42aed), new Int(0x53380d13, 0x9d95b3df), + new Int(0x650a7354, 0x8baf63de), new Int(0x766a0abb, 0x3c77b2a8), + new Int(0x81c2c92e, 0x47edaee6), new Int(0x92722c85, 0x1482353b), + new Int(0xa2bfe8a1, 0x4cf10364), new Int(0xa81a664b, 0xbc423001), + new Int(0xc24b8b70, 0xd0f89791), new Int(0xc76c51a3, 0x0654be30), + new Int(0xd192e819, 0xd6ef5218), new Int(0xd6990624, 0x5565a910), + new Int(0xf40e3585, 0x5771202a), new Int(0x106aa070, 0x32bbd1b8), + new Int(0x19a4c116, 0xb8d2d0c8), new Int(0x1e376c08, 0x5141ab53), + new Int(0x2748774c, 0xdf8eeb99), new Int(0x34b0bcb5, 0xe19b48a8), + new Int(0x391c0cb3, 0xc5c95a63), new Int(0x4ed8aa4a, 0xe3418acb), + new Int(0x5b9cca4f, 0x7763e373), new Int(0x682e6ff3, 0xd6b2b8a3), + new Int(0x748f82ee, 0x5defb2fc), new Int(0x78a5636f, 0x43172f60), + new Int(0x84c87814, 0xa1f0ab72), new Int(0x8cc70208, 0x1a6439ec), + new Int(0x90befffa, 0x23631e28), new Int(0xa4506ceb, 0xde82bde9), + new Int(0xbef9a3f7, 0xb2c67915), new Int(0xc67178f2, 0xe372532b), + new Int(0xca273ece, 0xea26619c), new Int(0xd186b8c7, 0x21c0c207), + new Int(0xeada7dd6, 0xcde0eb1e), new Int(0xf57d4f7f, 0xee6ed178), + new Int(0x06f067aa, 0x72176fba), new Int(0x0a637dc5, 0xa2c898a6), + new Int(0x113f9804, 0xbef90dae), new Int(0x1b710b35, 0x131c471b), + new Int(0x28db77f5, 0x23047d84), new Int(0x32caab7b, 0x40c72493), + new Int(0x3c9ebe0a, 0x15c9bebc), new Int(0x431d67c4, 0x9c100d4c), + new Int(0x4cc5d4be, 0xcb3e42b6), new Int(0x597f299c, 0xfc657e2a), + new Int(0x5fcb6fab, 0x3ad6faec), new Int(0x6c44198c, 0x4a475817) + ]; + + if (variant === "SHA-384") + { + H = [ + new Int(0xcbbb9d5d, 0xc1059ed8), new Int(0x0629a292a, 0x367cd507), + new Int(0x9159015a, 0x3070dd17), new Int(0x0152fecd8, 0xf70e5939), + new Int(0x67332667, 0xffc00b31), new Int(0x98eb44a87, 0x68581511), + new Int(0xdb0c2e0d, 0x64f98fa7), new Int(0x047b5481d, 0xbefa4fa4) + ]; + } + else + { + H = [ + new Int(0x6a09e667, 0xf3bcc908), new Int(0xbb67ae85, 0x84caa73b), + new Int(0x3c6ef372, 0xfe94f82b), new Int(0xa54ff53a, 0x5f1d36f1), + new Int(0x510e527f, 0xade682d1), new Int(0x9b05688c, 0x2b3e6c1f), + new Int(0x1f83d9ab, 0xfb41bd6b), new Int(0x5be0cd19, 0x137e2179) + ]; + } + } + + /* Append '1' at the end of the binary string */ + message[messageLen >> 5] |= 0x80 << (24 - messageLen % 32); + /* Append length of binary string in the position such that the new + * length is correct */ + message[lengthPosition] = messageLen; + + appendedMessageLength = message.length; + + for (i = 0; i < appendedMessageLength; i += binaryStringInc) + { + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + f = H[5]; + g = H[6]; + h = H[7]; + + for (t = 0; t < numRounds; t += 1) + { + if (t < 16) + { + /* Bit of a hack - for 32-bit, the second term is ignored */ + W[t] = new Int(message[t * binaryStringMult + i], + message[t * binaryStringMult + i + 1]); + } + else + { + W[t] = safeAdd_4( + gamma1(W[t - 2]), W[t - 7], + gamma0(W[t - 15]), W[t - 16] + ); + } + + T1 = safeAdd_5(h, sigma1(e), ch(e, f, g), K[t], W[t]); + T2 = safeAdd_2(sigma0(a), maj(a, b, c)); + h = g; + g = f; + f = e; + e = safeAdd_2(d, T1); + d = c; + c = b; + b = a; + a = safeAdd_2(T1, T2); + } + + H[0] = safeAdd_2(a, H[0]); + H[1] = safeAdd_2(b, H[1]); + H[2] = safeAdd_2(c, H[2]); + H[3] = safeAdd_2(d, H[3]); + H[4] = safeAdd_2(e, H[4]); + H[5] = safeAdd_2(f, H[5]); + H[6] = safeAdd_2(g, H[6]); + H[7] = safeAdd_2(h, H[7]); + } + + switch (variant) + { + case "SHA-224": + return [ + H[0], H[1], H[2], H[3], + H[4], H[5], H[6] + ]; + case "SHA-256": + return H; + case "SHA-384": + return [ + H[0].highOrder, H[0].lowOrder, + H[1].highOrder, H[1].lowOrder, + H[2].highOrder, H[2].lowOrder, + H[3].highOrder, H[3].lowOrder, + H[4].highOrder, H[4].lowOrder, + H[5].highOrder, H[5].lowOrder + ]; + case "SHA-512": + return [ + H[0].highOrder, H[0].lowOrder, + H[1].highOrder, H[1].lowOrder, + H[2].highOrder, H[2].lowOrder, + H[3].highOrder, H[3].lowOrder, + H[4].highOrder, H[4].lowOrder, + H[5].highOrder, H[5].lowOrder, + H[6].highOrder, H[6].lowOrder, + H[7].highOrder, H[7].lowOrder + ]; + default: + /* This should never be reached */ + return []; + } + }, + + /* + * jsSHA is the workhorse of the library. Instantiate it with the string to + * be hashed as the parameter + * + * @constructor + * @param {String} srcString The string to be hashed + * @param {String} inputFormat The format of srcString, ASCII or HEX + */ + jsSHA = function (srcString, inputFormat) + { + + this.sha1 = null; + this.sha224 = null; + this.sha256 = null; + this.sha384 = null; + this.sha512 = null; + + this.strBinLen = null; + this.strToHash = null; + + /* Convert the input string into the correct type */ + if ("HEX" === inputFormat) + { + if (0 !== (srcString.length % 2)) + { + return "TEXT MUST BE IN BYTE INCREMENTS"; + } + this.strBinLen = srcString.length * 4; + this.strToHash = hex2binb(srcString); + } + else if (("ASCII" === inputFormat) || + ('undefined' === typeof(inputFormat))) + { + this.strBinLen = srcString.length * charSize; + this.strToHash = str2binb(srcString); + } + else + { + return "UNKNOWN TEXT INPUT TYPE"; + } + }; + + jsSHA.prototype = { + /* + * Returns the desired SHA hash of the string specified at instantiation + * using the specified parameters + * + * @param {String} variant The desired SHA variant (SHA-1, SHA-224, + * SHA-256, SHA-384, or SHA-512) + * @param {String} format The desired output formatting (B64 or HEX) + * @return The string representation of the hash in the format specified + */ + getHash : function (variant, format) + { + var formatFunc = null, message = this.strToHash.slice(); + + switch (format) + { + case "HEX": + formatFunc = binb2hex; + break; + case "B64": + formatFunc = binb2b64; + break; + case "ASCII": + formatFunc = binb2str; + break; + default: + return "FORMAT NOT RECOGNIZED"; + } + + switch (variant) + { + case "SHA-1": + if (null === this.sha1) + { + this.sha1 = coreSHA1(message, this.strBinLen); + } + return formatFunc(this.sha1); + case "SHA-224": + if (null === this.sha224) + { + this.sha224 = coreSHA2(message, this.strBinLen, variant); + } + return formatFunc(this.sha224); + case "SHA-256": + if (null === this.sha256) + { + this.sha256 = coreSHA2(message, this.strBinLen, variant); + } + return formatFunc(this.sha256); + case "SHA-384": + if (null === this.sha384) + { + this.sha384 = coreSHA2(message, this.strBinLen, variant); + } + return formatFunc(this.sha384); + case "SHA-512": + if (null === this.sha512) + { + this.sha512 = coreSHA2(message, this.strBinLen, variant); + } + return formatFunc(this.sha512); + default: + return "HASH NOT RECOGNIZED"; + } + }, + + /* + * Returns the desired HMAC of the string specified at instantiation + * using the key and variant param. + * + * @param {String} key The key used to calculate the HMAC + * @param {String} inputFormat The format of key, ASCII or HEX + * @param {String} variant The desired SHA variant (SHA-1, SHA-224, + * SHA-256, SHA-384, or SHA-512) + * @param {String} outputFormat The desired output formatting + * (B64 or HEX) + * @return The string representation of the hash in the format specified + */ + getHMAC : function (key, inputFormat, variant, outputFormat) + { + var formatFunc, keyToUse, blockByteSize, blockBitSize, i, + retVal, lastArrayIndex, keyBinLen, hashBitSize, + keyWithIPad = [], keyWithOPad = []; + + /* Validate the output format selection */ + switch (outputFormat) + { + case "HEX": + formatFunc = binb2hex; + break; + case "B64": + formatFunc = binb2b64; + break; + case "ASCII": + formatFunc = binb2str; + break; + default: + return "FORMAT NOT RECOGNIZED"; + } + + /* Validate the hash variant selection and set needed variables */ + switch (variant) + { + case "SHA-1": + blockByteSize = 64; + hashBitSize = 160; + break; + case "SHA-224": + blockByteSize = 64; + hashBitSize = 224; + break; + case "SHA-256": + blockByteSize = 64; + hashBitSize = 256; + break; + case "SHA-384": + blockByteSize = 128; + hashBitSize = 384; + break; + case "SHA-512": + blockByteSize = 128; + hashBitSize = 512; + break; + default: + return "HASH NOT RECOGNIZED"; + } + + /* Validate input format selection */ + if ("HEX" === inputFormat) + { + /* Nibbles must come in pairs */ + if (0 !== (key.length % 2)) + { + return "KEY MUST BE IN BYTE INCREMENTS"; + } + keyToUse = hex2binb(key); + keyBinLen = key.length * 4; + } + else if ("ASCII" === inputFormat) + { + keyToUse = str2binb(key); + keyBinLen = key.length * charSize; + } + else + { + return "UNKNOWN KEY INPUT TYPE"; + } + + /* These are used multiple times, calculate and store them */ + blockBitSize = blockByteSize * 8; + lastArrayIndex = (blockByteSize / 4) - 1; + + /* Figure out what to do with the key based on its size relative to + * the hash's block size */ + if (blockByteSize < (keyBinLen / 8)) + { + if ("SHA-1" === variant) + { + keyToUse = coreSHA1(keyToUse, keyBinLen); + } + else + { + keyToUse = coreSHA2(keyToUse, keyBinLen, variant); + } + /* For all variants, the block size is bigger than the output + * size so there will never be a useful byte at the end of the + * string */ + keyToUse[lastArrayIndex] &= 0xFFFFFF00; + } + else if (blockByteSize > (keyBinLen / 8)) + { + /* If the blockByteSize is greater than the key length, there + * will always be at LEAST one "useless" byte at the end of the + * string */ + keyToUse[lastArrayIndex] &= 0xFFFFFF00; + } + + /* Create ipad and opad */ + for (i = 0; i <= lastArrayIndex; i += 1) + { + keyWithIPad[i] = keyToUse[i] ^ 0x36363636; + keyWithOPad[i] = keyToUse[i] ^ 0x5C5C5C5C; + } + + /* Calculate the HMAC */ + if ("SHA-1" === variant) + { + retVal = coreSHA1( + keyWithIPad.concat(this.strToHash), + blockBitSize + this.strBinLen); + retVal = coreSHA1( + keyWithOPad.concat(retVal), + blockBitSize + hashBitSize); + } + else + { + retVal = coreSHA2( + keyWithIPad.concat(this.strToHash), + blockBitSize + this.strBinLen, variant); + retVal = coreSHA2( + keyWithOPad.concat(retVal), + blockBitSize + hashBitSize, variant); + } + + return (formatFunc(retVal)); + } + }; + + return jsSHA; +}()); + +function str_sha1(str) { + var shaObj = new jsSHA(str, "ASCII"); + return shaObj.getHash("SHA-1", "ASCII"); +} + +function str_sha224(str) { + var shaObj = new jsSHA(str, "ASCII"); + return shaObj.getHash("SHA-224", "ASCII"); +} + +function str_sha256(str) { + var shaObj = new jsSHA(str, "ASCII"); + return shaObj.getHash("SHA-256", "ASCII"); +} + + +function str_sha384(str) { + var shaObj = new jsSHA(str, "ASCII"); + return shaObj.getHash("SHA-384", "ASCII"); + +} + +function str_sha512(str) { + var shaObj = new jsSHA(str, "ASCII"); + return shaObj.getHash("SHA-512", "ASCII"); +} +// Modified by Recurity Labs GmbH + +// modified version of http://www.hanewin.net/encrypt/PGdecode.js: + +/* OpenPGP encryption using RSA/AES + * Copyright 2005-2006 Herbert Hanewinkel, www.haneWIN.de + * version 2.0, check www.haneWIN.de for the latest version + + * This software is provided as-is, without express or implied warranty. + * Permission to use, copy, modify, distribute or sell this software, with or + * without fee, for any purpose and by any individual or organization, is hereby + * granted, provided that the above copyright notice and this paragraph appear + * in all copies. Distribution as a part of an application or binary must + * include the above copyright notice in the documentation and/or other + * materials provided with the application or distribution. + */ + +/** + * An array of bytes, that is integers with values from 0 to 255 + * @typedef {(Array|Uint8Array)} openpgp_byte_array + */ + +/** + * Block cipher function + * @callback openpgp_cipher_block_fn + * @param {openpgp_byte_array} block A block to perform operations on + * @param {openpgp_byte_array} key to use in encryption/decryption + * @return {openpgp_byte_array} Encrypted/decrypted block + */ + + +// -------------------------------------- +/** + * This function encrypts a given with the specified prefixrandom + * using the specified blockcipher to encrypt a message + * @param {String} prefixrandom random bytes of block_size length provided + * as a string to be used in prefixing the data + * @param {openpgp_cipher_block_fn} blockcipherfn the algorithm encrypt function to encrypt + * data in one block_size encryption. + * @param {Integer} block_size the block size in bytes of the algorithm used + * @param {String} plaintext data to be encrypted provided as a string + * @param {openpgp_byte_array} key key to be used to encrypt the data. This will be passed to the + * blockcipherfn + * @param {Boolean} resync a boolean value specifying if a resync of the + * IV should be used or not. The encrypteddatapacket uses the + * "old" style with a resync. Encryption within an + * encryptedintegrityprotecteddata packet is not resyncing the IV. + * @return {String} a string with the encrypted data + */ +function openpgp_cfb_encrypt(prefixrandom, blockcipherencryptfn, plaintext, block_size, key, resync) { + var FR = new Array(block_size); + var FRE = new Array(block_size); + + prefixrandom = prefixrandom + prefixrandom.charAt(block_size-2) +prefixrandom.charAt(block_size-1); + util.print_debug("prefixrandom:"+util.hexstrdump(prefixrandom)); + var ciphertext = ""; + // 1. The feedback register (FR) is set to the IV, which is all zeros. + for (var i = 0; i < block_size; i++) FR[i] = 0; + + // 2. FR is encrypted to produce FRE (FR Encrypted). This is the + // encryption of an all-zero value. + FRE = blockcipherencryptfn(FR, key); + // 3. FRE is xored with the first BS octets of random data prefixed to + // the plaintext to produce C[1] through C[BS], the first BS octets + // of ciphertext. + for (var i = 0; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ prefixrandom.charCodeAt(i)); + + // 4. FR is loaded with C[1] through C[BS]. + for (var i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i); + + // 5. FR is encrypted to produce FRE, the encryption of the first BS + // octets of ciphertext. + FRE = blockcipherencryptfn(FR, key); + + // 6. The left two octets of FRE get xored with the next two octets of + // data that were prefixed to the plaintext. This produces C[BS+1] + // and C[BS+2], the next two octets of ciphertext. + ciphertext += String.fromCharCode(FRE[0] ^ prefixrandom.charCodeAt(block_size)); + ciphertext += String.fromCharCode(FRE[1] ^ prefixrandom.charCodeAt(block_size+1)); + + if (resync) { + // 7. (The resync step) FR is loaded with C3-C10. + for (var i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i+2); + } else { + for (var i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(i); + } + // 8. FR is encrypted to produce FRE. + FRE = blockcipherencryptfn(FR, key); + + if (resync) { + // 9. FRE is xored with the first 8 octets of the given plaintext, now + // that we have finished encrypting the 10 octets of prefixed data. + // This produces C11-C18, the next 8 octets of ciphertext. + for (var i = 0; i < block_size; i++) + ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(i)); + for(n=block_size+2; n < plaintext.length; n+=block_size) { + // 10. FR is loaded with C11-C18 + for (var i = 0; i < block_size; i++) FR[i] = ciphertext.charCodeAt(n+i); + + // 11. FR is encrypted to produce FRE. + FRE = blockcipherencryptfn(FR, key); + + // 12. FRE is xored with the next 8 octets of plaintext, to produce the + // next 8 octets of ciphertext. These are loaded into FR and the + // process is repeated until the plaintext is used up. + for (var i = 0; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt((n-2)+i)); + } + } + else { + plaintext = " "+plaintext; + // 9. FRE is xored with the first 8 octets of the given plaintext, now + // that we have finished encrypting the 10 octets of prefixed data. + // This produces C11-C18, the next 8 octets of ciphertext. + for (var i = 2; i < block_size; i++) ciphertext += String.fromCharCode(FRE[i] ^ plaintext.charCodeAt(i)); + var tempCiphertext = ciphertext.substring(0,2*block_size).split(''); + var tempCiphertextString = ciphertext.substring(block_size); + for(n=block_size; n block_size*pos) { + var encblock = blockcipherencryptfn(blockc, key); + blocki = plaintext.substring((pos*block_size),(pos*block_size)+block_size); + for (var i=0; i < blocki.length; i++) + tempBlock.push(String.fromCharCode(blocki.charCodeAt(i) ^ encblock[i])); + blockc = tempBlock.join(''); + tempBlock = []; + cyphertext.push(blockc); + pos++; + } + return cyphertext.join(''); +} + +function normal_cfb_decrypt(blockcipherencryptfn, block_size, key, ciphertext, iv) { + var blockp =""; + var pos = 0; + var plaintext = []; + var offset = 0; + if (iv == null) + for (var i = 0; i < block_size; i++) blockp += String.fromCharCode(0); + else + blockp = iv.substring(0,block_size); + while (ciphertext.length > (block_size*pos)) { + var decblock = blockcipherencryptfn(blockp, key); + blockp = ciphertext.substring((pos*(block_size))+offset,(pos*(block_size))+(block_size)+offset); + for (var i=0; i < blockp.length; i++) { + plaintext.push(String.fromCharCode(blockp.charCodeAt(i) ^ decblock[i])); + } + pos++; + } + + return plaintext.join(''); +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// The GPG4Browsers crypto interface + +/** + * Encrypts data using the specified public key multiprecision integers + * and the specified algorithm. + * @param {Integer} algo Algorithm to be used (See RFC4880 9.1) + * @param {openpgp_type_mpi[]} publicMPIs Algorithm dependent multiprecision integers + * @param {openpgp_type_mpi} data Data to be encrypted as MPI + * @return {(openpgp_type_mpi|openpgp_type_mpi[])} if RSA an openpgp_type_mpi; + * if elgamal encryption an array of two openpgp_type_mpi is returned; otherwise null + */ +function openpgp_crypto_asymetricEncrypt(algo, publicMPIs, data) { + switch(algo) { + case 1: // RSA (Encrypt or Sign) [HAC] + case 2: // RSA Encrypt-Only [HAC] + case 3: // RSA Sign-Only [HAC] + var rsa = new RSA(); + var n = publicMPIs[0].toBigInteger(); + var e = publicMPIs[1].toBigInteger(); + var m = data.toBigInteger(); + return rsa.encrypt(m,e,n).toMPI(); + case 16: // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + var elgamal = new Elgamal(); + var p = publicMPIs[0].toBigInteger(); + var g = publicMPIs[1].toBigInteger(); + var y = publicMPIs[2].toBigInteger(); + var m = data.toBigInteger(); + return elgamal.encrypt(m,g,p,y); + default: + return null; + } +} + +/** + * Decrypts data using the specified public key multiprecision integers of the private key, + * the specified secretMPIs of the private key and the specified algorithm. + * @param {Integer} algo Algorithm to be used (See RFC4880 9.1) + * @param {openpgp_type_mpi[]} publicMPIs Algorithm dependent multiprecision integers + * of the public key part of the private key + * @param {openpgp_type_mpi[]} secretMPIs Algorithm dependent multiprecision integers + * of the private key used + * @param {openpgp_type_mpi} data Data to be encrypted as MPI + * @return {BigInteger} returns a big integer containing the decrypted data; otherwise null + */ + +function openpgp_crypto_asymetricDecrypt(algo, publicMPIs, secretMPIs, dataMPIs) { + switch(algo) { + case 1: // RSA (Encrypt or Sign) [HAC] + case 2: // RSA Encrypt-Only [HAC] + case 3: // RSA Sign-Only [HAC] + var rsa = new RSA(); + var d = secretMPIs[0].toBigInteger(); + var p = secretMPIs[1].toBigInteger(); + var q = secretMPIs[2].toBigInteger(); + var u = secretMPIs[3].toBigInteger(); + var m = dataMPIs[0].toBigInteger(); + return rsa.decrypt(m, d, p, q, u); + case 16: // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + var elgamal = new Elgamal(); + var x = secretMPIs[0].toBigInteger(); + var c1 = dataMPIs[0].toBigInteger(); + var c2 = dataMPIs[1].toBigInteger(); + var p = publicMPIs[0].toBigInteger(); + return elgamal.decrypt(c1,c2,p,x); + default: + return null; + } + +} + +/** + * generate random byte prefix as string for the specified algorithm + * @param {Integer} algo Algorithm to use (see RFC4880 9.2) + * @return {String} Random bytes with length equal to the block + * size of the cipher + */ +function openpgp_crypto_getPrefixRandom(algo) { + switch(algo) { + case 2: + case 3: + case 4: + return openpgp_crypto_getRandomBytes(8); + case 7: + case 8: + case 9: + case 10: + return openpgp_crypto_getRandomBytes(16); + default: + return null; + } +} + +/** + * retrieve the MDC prefixed bytes by decrypting them + * @param {Integer} algo Algorithm to use (see RFC4880 9.2) + * @param {String} key Key as string. length is depending on the algorithm used + * @param {String} data Encrypted data where the prefix is decrypted from + * @return {String} Plain text data of the prefixed data + */ +function openpgp_crypto_MDCSystemBytes(algo, key, data) { + util.print_debug_hexstr_dump("openpgp_crypto_symmetricDecrypt:\nencrypteddata:",data); + switch(algo) { + case 0: // Plaintext or unencrypted data + return data; + case 2: // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + return openpgp_cfb_mdc(desede, 8, key, data, openpgp_cfb); + case 3: // CAST5 (128 bit key, as per [RFC2144]) + return openpgp_cfb_mdc(cast5_encrypt, 8, key, data); + case 4: // Blowfish (128 bit key, 16 rounds) [BLOWFISH] + return openpgp_cfb_mdc(BFencrypt, 8, key, data); + case 7: // AES with 128-bit key [AES] + case 8: // AES with 192-bit key + case 9: // AES with 256-bit key + return openpgp_cfb_mdc(AESencrypt, 16, keyExpansion(key), data); + case 10: + return openpgp_cfb_mdc(TFencrypt, 16, key, data); + case 1: // IDEA [IDEA] + util.print_error(""+ (algo == 1 ? "IDEA Algorithm not implemented" : "Twofish Algorithm not implemented")); + return null; + default: + } + return null; +} +/** + * Generating a session key for the specified symmetric algorithm + * @param {Integer} algo Algorithm to use (see RFC4880 9.2) + * @return {String} Random bytes as a string to be used as a key + */ +function openpgp_crypto_generateSessionKey(algo) { + switch (algo) { + case 2: // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + case 8: // AES with 192-bit key + return openpgp_crypto_getRandomBytes(24); + case 3: // CAST5 (128 bit key, as per [RFC2144]) + case 4: // Blowfish (128 bit key, 16 rounds) [BLOWFISH] + case 7: // AES with 128-bit key [AES] + util.print_debug("length = 16:\n"+util.hexstrdump(openpgp_crypto_getRandomBytes(16))); + return openpgp_crypto_getRandomBytes(16); + case 9: // AES with 256-bit key + case 10:// Twofish with 256-bit key [TWOFISH] + return openpgp_crypto_getRandomBytes(32); + } + return null; +} + +/** + * + * @param {Integer} algo public Key algorithm + * @param {Integer} hash_algo Hash algorithm + * @param {openpgp_type_mpi[]} msg_MPIs Signature multiprecision integers + * @param {openpgp_type_mpi[]} publickey_MPIs Public key multiprecision integers + * @param {String} data Data on where the signature was computed on. + * @return {Boolean} true if signature (sig_data was equal to data over hash) + */ +function openpgp_crypto_verifySignature(algo, hash_algo, msg_MPIs, publickey_MPIs, data) { + var calc_hash = openpgp_crypto_hashData(hash_algo, data); + switch(algo) { + case 1: // RSA (Encrypt or Sign) [HAC] + case 2: // RSA Encrypt-Only [HAC] + case 3: // RSA Sign-Only [HAC] + var rsa = new RSA(); + var n = publickey_MPIs[0].toBigInteger(); + var e = publickey_MPIs[1].toBigInteger(); + var x = msg_MPIs[0].toBigInteger(); + var dopublic = rsa.verify(x,e,n); + var hash = openpgp_encoding_emsa_pkcs1_decode(hash_algo,dopublic.toMPI().substring(2)); + if (hash == -1) { + util.print_error("PKCS1 padding in message or key incorrect. Aborting..."); + return false; + } + return hash == calc_hash; + + case 16: // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + util.print_error("signing with Elgamal is not defined in the OpenPGP standard."); + return null; + case 17: // DSA (Digital Signature Algorithm) [FIPS186] [HAC] + var dsa = new DSA(); + var s1 = msg_MPIs[0].toBigInteger(); + var s2 = msg_MPIs[1].toBigInteger(); + var p = publickey_MPIs[0].toBigInteger(); + var q = publickey_MPIs[1].toBigInteger(); + var g = publickey_MPIs[2].toBigInteger(); + var y = publickey_MPIs[3].toBigInteger(); + var m = data; + var dopublic = dsa.verify(hash_algo,s1,s2,m,p,q,g,y); + return dopublic.compareTo(s1) == 0; + default: + return null; + } + +} + +/** + * Create a signature on data using the specified algorithm + * @param {Integer} hash_algo hash Algorithm to use (See RFC4880 9.4) + * @param {Integer} algo Asymmetric cipher algorithm to use (See RFC4880 9.1) + * @param {openpgp_type_mpi[]} publicMPIs Public key multiprecision integers + * of the private key + * @param {openpgp_type_mpi[]} secretMPIs Private key multiprecision + * integers which is used to sign the data + * @param {String} data Data to be signed + * @return {(String|openpgp_type_mpi)} + */ +function openpgp_crypto_signData(hash_algo, algo, publicMPIs, secretMPIs, data) { + + switch(algo) { + case 1: // RSA (Encrypt or Sign) [HAC] + case 2: // RSA Encrypt-Only [HAC] + case 3: // RSA Sign-Only [HAC] + var rsa = new RSA(); + var d = secretMPIs[0].toBigInteger(); + var n = publicMPIs[0].toBigInteger(); + var m = openpgp_encoding_emsa_pkcs1_encode(hash_algo, data,publicMPIs[0].mpiByteLength); + util.print_debug("signing using RSA"); + return rsa.sign(m, d, n).toMPI(); + case 17: // DSA (Digital Signature Algorithm) [FIPS186] [HAC] + var dsa = new DSA(); + util.print_debug("DSA Sign: q size in Bytes:"+publicMPIs[1].getByteLength()); + var p = publicMPIs[0].toBigInteger(); + var q = publicMPIs[1].toBigInteger(); + var g = publicMPIs[2].toBigInteger(); + var y = publicMPIs[3].toBigInteger(); + var x = secretMPIs[0].toBigInteger(); + var m = data; + var result = dsa.sign(hash_algo,m, g, p, q, x); + util.print_debug("signing using DSA\n result:"+util.hexstrdump(result[0])+"|"+util.hexstrdump(result[1])); + return result[0]+result[1]; + case 16: // Elgamal (Encrypt-Only) [ELGAMAL] [HAC] + util.print_debug("signing with Elgamal is not defined in the OpenPGP standard."); + return null; + default: + return null; + } +} + +/** + * Create a hash on the specified data using the specified algorithm + * @param {Integer} algo Hash algorithm type (see RFC4880 9.4) + * @param {String} data Data to be hashed + * @return {String} hash value + */ +function openpgp_crypto_hashData(algo, data) { + var hash = null; + switch(algo) { + case 1: // - MD5 [HAC] + hash = MD5(data); + break; + case 2: // - SHA-1 [FIPS180] + hash = str_sha1(data); + break; + case 3: // - RIPE-MD/160 [HAC] + hash = RMDstring(data); + break; + case 8: // - SHA256 [FIPS180] + hash = str_sha256(data); + break; + case 9: // - SHA384 [FIPS180] + hash = str_sha384(data); + break; + case 10:// - SHA512 [FIPS180] + hash = str_sha512(data); + break; + case 11:// - SHA224 [FIPS180] + hash = str_sha224(data); + default: + break; + } + return hash; +} + +/** + * Returns the hash size in bytes of the specified hash algorithm type + * @param {Integer} algo Hash algorithm type (See RFC4880 9.4) + * @return {Integer} Size in bytes of the resulting hash + */ +function openpgp_crypto_getHashByteLength(algo) { + var hash = null; + switch(algo) { + case 1: // - MD5 [HAC] + return 16; + case 2: // - SHA-1 [FIPS180] + case 3: // - RIPE-MD/160 [HAC] + return 20; + case 8: // - SHA256 [FIPS180] + return 32; + case 9: // - SHA384 [FIPS180] + return 48 + case 10:// - SHA512 [FIPS180] + return 64; + case 11:// - SHA224 [FIPS180] + return 28; + } + return null; +} + +/** + * Retrieve secure random byte string of the specified length + * @param {Integer} length Length in bytes to generate + * @return {String} Random byte string + */ +function openpgp_crypto_getRandomBytes(length) { + var result = ''; + for (var i = 0; i < length; i++) { + result += String.fromCharCode(openpgp_crypto_getSecureRandomOctet()); + } + return result; +} + +/** + * Return a pseudo-random number in the specified range + * @param {Integer} from Min of the random number + * @param {Integer} to Max of the random number (max 32bit) + * @return {Integer} A pseudo random number + */ +function openpgp_crypto_getPseudoRandom(from, to) { + return Math.round(Math.random()*(to-from))+from; +} + +/** + * Return a secure random number in the specified range + * @param {Integer} from Min of the random number + * @param {Integer} to Max of the random number (max 32bit) + * @return {Integer} A secure random number + */ +function openpgp_crypto_getSecureRandom(from, to) { + var buf = new Uint32Array(1); + window.crypto.getRandomValues(buf); + var bits = ((to-from)).toString(2).length; + while ((buf[0] & (Math.pow(2, bits) -1)) > (to-from)) + window.crypto.getRandomValues(buf); + return from+(Math.abs(buf[0] & (Math.pow(2, bits) -1))); +} + +function openpgp_crypto_getSecureRandomOctet() { + var buf = new Uint32Array(1); + window.crypto.getRandomValues(buf); + return buf[0] & 0xFF; +} + +/** + * Create a secure random big integer of bits length + * @param {Integer} bits Bit length of the MPI to create + * @return {BigInteger} Resulting big integer + */ +function openpgp_crypto_getRandomBigInteger(bits) { + if (bits < 0) + return null; + var numBytes = Math.floor((bits+7)/8); + + var randomBits = openpgp_crypto_getRandomBytes(numBytes); + if (bits % 8 > 0) { + + randomBits = String.fromCharCode( + (Math.pow(2,bits % 8)-1) & + randomBits.charCodeAt(0)) + + randomBits.substring(1); + } + return new openpgp_type_mpi().create(randomBits).toBigInteger(); +} + +function openpgp_crypto_getRandomBigIntegerInRange(min, max) { + if (max.compareTo(min) <= 0) + return; + var range = max.subtract(min); + var r = openpgp_crypto_getRandomBigInteger(range.bitLength()); + while (r > range) { + r = openpgp_crypto_getRandomBigInteger(range.bitLength()); + } + return min.add(r); +} + + +//This is a test method to ensure that encryption/decryption with a given 1024bit RSAKey object functions as intended +function openpgp_crypto_testRSA(key){ + debugger; + var rsa = new RSA(); + var mpi = new openpgp_type_mpi(); + mpi.create(openpgp_encoding_eme_pkcs1_encode('ABABABAB', 128)); + var msg = rsa.encrypt(mpi.toBigInteger(),key.ee,key.n); + var result = rsa.decrypt(msg, key.d, key.p, key.q, key.u); +} + +/** + * @typedef {Object} openpgp_keypair + * @property {openpgp_packet_keymaterial} privateKey + * @property {openpgp_packet_keymaterial} publicKey + */ + +/** + * Calls the necessary crypto functions to generate a keypair. + * Called directly by openpgp.js + * @param {Integer} keyType Follows OpenPGP algorithm convention. + * @param {Integer} numBits Number of bits to make the key to be generated + * @return {openpgp_keypair} + */ +function openpgp_crypto_generateKeyPair(keyType, numBits, passphrase, s2kHash, symmetricEncryptionAlgorithm){ + var privKeyPacket; + var publicKeyPacket; + var d = new Date(); + d = d.getTime()/1000; + var timePacket = String.fromCharCode(Math.floor(d/0x1000000%0x100)) + String.fromCharCode(Math.floor(d/0x10000%0x100)) + String.fromCharCode(Math.floor(d/0x100%0x100)) + String.fromCharCode(Math.floor(d%0x100)); + switch(keyType){ + case 1: + var rsa = new RSA(); + var key = rsa.generate(numBits,"10001"); + privKeyPacket = new openpgp_packet_keymaterial().write_private_key(keyType, key, passphrase, s2kHash, symmetricEncryptionAlgorithm, timePacket); + publicKeyPacket = new openpgp_packet_keymaterial().write_public_key(keyType, key, timePacket); + break; + default: + util.print_error("Unknown keytype "+keyType) + } + return {privateKey: privKeyPacket, publicKey: publicKeyPacket}; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// The GPG4Browsers symmetric crypto interface + +/** + * Symmetrically encrypts data using prefixedrandom, a key with length + * depending on the algorithm in openpgp_cfb mode with or without resync + * (MDC style) + * @param {String} prefixrandom Secure random bytes as string in + * length equal to the block size of the algorithm used (use + * openpgp_crypto_getPrefixRandom(algo) to retrieve that string + * @param {Integer} algo Algorithm to use (see RFC4880 9.2) + * @param {String} key Key as string. length is depending on the algorithm used + * @param {String} data Data to encrypt + * @param {Boolean} openpgp_cfb + * @return {String} Encrypted data + */ +function openpgp_crypto_symmetricEncrypt(prefixrandom, algo, key, data, openpgp_cfb) { + switch(algo) { + case 0: // Plaintext or unencrypted data + return data; // blockcipherencryptfn, plaintext, block_size, key + case 2: // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + return openpgp_cfb_encrypt(prefixrandom, desede, data,8,key, openpgp_cfb).substring(0, data.length + 10); + case 3: // CAST5 (128 bit key, as per [RFC2144]) + return openpgp_cfb_encrypt(prefixrandom, cast5_encrypt, data,8,key, openpgp_cfb).substring(0, data.length + 10); + case 4: // Blowfish (128 bit key, 16 rounds) [BLOWFISH] + return openpgp_cfb_encrypt(prefixrandom, BFencrypt, data,8,key, openpgp_cfb).substring(0, data.length + 10); + case 7: // AES with 128-bit key [AES] + case 8: // AES with 192-bit key + case 9: // AES with 256-bit key + return openpgp_cfb_encrypt(prefixrandom, AESencrypt, data, 16, keyExpansion(key), openpgp_cfb).substring(0, data.length + 18); + case 10: // Twofish with 256-bit key [TWOFISH] + return openpgp_cfb_encrypt(prefixrandom, TFencrypt, data,16, key, openpgp_cfb).substring(0, data.length + 18); + case 1: // IDEA [IDEA] + util.print_error("IDEA Algorithm not implemented"); + return null; + default: + return null; + } +} + +/** + * Symmetrically decrypts data using a key with length depending on the + * algorithm in openpgp_cfb mode with or without resync (MDC style) + * @param {Integer} algo Algorithm to use (see RFC4880 9.2) + * @param {String} key Key as string. length is depending on the algorithm used + * @param {String} data Data to be decrypted + * @param {Boolean} openpgp_cfb If true use the resync (for encrypteddata); + * otherwise use without the resync (for MDC encrypted data) + * @return {String} Plaintext data + */ +function openpgp_crypto_symmetricDecrypt(algo, key, data, openpgp_cfb) { + util.print_debug_hexstr_dump("openpgp_crypto_symmetricDecrypt:\nalgo:"+algo+"\nencrypteddata:",data); + var n = 0; + if (!openpgp_cfb) + n = 2; + switch(algo) { + case 0: // Plaintext or unencrypted data + return data; + case 2: // TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + return openpgp_cfb_decrypt(desede, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10); + case 3: // CAST5 (128 bit key, as per [RFC2144]) + return openpgp_cfb_decrypt(cast5_encrypt, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10); + case 4: // Blowfish (128 bit key, 16 rounds) [BLOWFISH] + return openpgp_cfb_decrypt(BFencrypt, 8, key, data, openpgp_cfb).substring(n, (data.length+n)-10); + case 7: // AES with 128-bit key [AES] + case 8: // AES with 192-bit key + case 9: // AES with 256-bit key + return openpgp_cfb_decrypt(AESencrypt, 16, keyExpansion(key), data, openpgp_cfb).substring(n, (data.length+n)-18); + case 10: // Twofish with 256-bit key [TWOFISH] + var result = openpgp_cfb_decrypt(TFencrypt, 16, key, data, openpgp_cfb).substring(n, (data.length+n)-18); + return result; + case 1: // IDEA [IDEA] + util.print_error(""+ (algo == 1 ? "IDEA Algorithm not implemented" : "Twofish Algorithm not implemented")); + return null; + default: + } + return null; +} + +/* Rijndael (AES) Encryption + * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de + * version 1.1, check www.haneWIN.de for the latest version + + * This software is provided as-is, without express or implied warranty. + * Permission to use, copy, modify, distribute or sell this software, with or + * without fee, for any purpose and by any individual or organization, is hereby + * granted, provided that the above copyright notice and this paragraph appear + * in all copies. Distribution as a part of an application or binary must + * include the above copyright notice in the documentation and/or other + * materials provided with the application or distribution. + */ + +// The round constants used in subkey expansion +var Rcon = [ +0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, +0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, +0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ]; + +// Precomputed lookup table for the SBox +var S = [ + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, +118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, +114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, +216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, +235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, +179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, +190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, +249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, +188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, +23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, +144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, + 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, +141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, + 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, +181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, +248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, +140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, + 22 ]; + +var T1 = [ +0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, +0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, +0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, +0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, +0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, +0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb, +0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, +0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, +0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, +0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, +0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9, +0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, +0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, +0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, +0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, +0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, +0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, +0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, +0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, +0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, +0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, +0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, +0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, +0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, +0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, +0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, +0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe, +0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, +0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, +0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, +0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, +0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, +0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, +0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, +0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, +0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, +0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, +0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, +0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, +0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, +0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, +0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8, +0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, +0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, +0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, +0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, +0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf, +0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, +0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, +0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, +0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, +0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, +0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, +0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c, +0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, +0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, +0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, +0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, +0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, +0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, +0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, +0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, +0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, +0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c ]; + +var T2 = [ +0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, +0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, +0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, +0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, +0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, +0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, +0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, +0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, +0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, +0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, +0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, +0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, +0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, +0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5, +0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, +0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, +0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, +0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, +0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, +0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, +0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, +0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, +0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, +0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, +0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, +0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, +0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81, +0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, +0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, +0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, +0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, +0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, +0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f, +0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, +0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, +0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, +0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, +0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, +0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, +0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76, +0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, +0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4, +0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, +0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, +0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, +0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, +0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, +0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018, +0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, +0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, +0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, +0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, +0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, +0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12, +0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, +0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, +0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, +0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, +0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, +0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, +0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, +0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, +0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11, +0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a ]; + +var T3 = [ +0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, +0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, +0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, +0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, +0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, +0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, +0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, +0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, +0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, +0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, +0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, +0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, +0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, +0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a, +0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, +0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, +0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, +0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, +0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, +0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, +0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, +0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, +0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, +0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, +0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, +0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, +0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f, +0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, +0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, +0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, +0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, +0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, +0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec, +0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, +0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, +0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, +0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, +0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, +0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, +0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db, +0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, +0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c, +0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, +0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, +0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, +0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, +0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, +0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808, +0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, +0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, +0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, +0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, +0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, +0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e, +0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, +0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, +0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, +0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, +0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, +0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, +0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, +0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, +0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f, +0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16 ]; + +var T4 = [ +0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, +0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, +0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, +0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, +0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, +0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, +0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, +0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, +0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, +0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, +0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, +0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, +0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, +0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a, +0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, +0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, +0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, +0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, +0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, +0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, +0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, +0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, +0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, +0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, +0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, +0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, +0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f, +0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, +0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f, +0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, +0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, +0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, +0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, +0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, +0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, +0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, +0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, +0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888, +0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, +0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, +0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, +0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c, +0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, +0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, +0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, +0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, +0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, +0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, +0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, +0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, +0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, +0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, +0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, +0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e, +0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, +0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, +0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, +0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494, +0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, +0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, +0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, +0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, +0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, +0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616 ]; + +function B0(x) { return (x&255); } +function B1(x) { return ((x>>8)&255); } +function B2(x) { return ((x>>16)&255); } +function B3(x) { return ((x>>24)&255); } + +function F1(x0, x1, x2, x3) +{ + return B1(T1[x0&255]) | (B1(T1[(x1>>8)&255])<<8) + | (B1(T1[(x2>>16)&255])<<16) | (B1(T1[x3>>>24])<<24); +} + +function packBytes(octets) +{ + var i, j; + var len=octets.length; + var b=new Array(len/4); + + if (!octets || len % 4) return; + + for (i=0, j=0; j=0; j--) tk[j] = k[j]; + + r=0; + t=0; + for(j=0; (j>8)&255] ^ T3[(t2>>16)&255] ^ T4[t3>>>24]; + b1 = T1[t1&255] ^ T2[(t2>>8)&255] ^ T3[(t3>>16)&255] ^ T4[t0>>>24]; + b2 = T1[t2&255] ^ T2[(t3>>8)&255] ^ T3[(t0>>16)&255] ^ T4[t1>>>24]; + b3 = T1[t3&255] ^ T2[(t0>>8)&255] ^ T3[(t1>>16)&255] ^ T4[t2>>>24]; + } + + // last round is special + r = rounds-1; + + t0 = b0 ^ ctx.rk[r][0]; + t1 = b1 ^ ctx.rk[r][1]; + t2 = b2 ^ ctx.rk[r][2]; + t3 = b3 ^ ctx.rk[r][3]; + + b[0] = F1(t0, t1, t2, t3) ^ ctx.rk[rounds][0]; + b[1] = F1(t1, t2, t3, t0) ^ ctx.rk[rounds][1]; + b[2] = F1(t2, t3, t0, t1) ^ ctx.rk[rounds][2]; + b[3] = F1(t3, t0, t1, t2) ^ ctx.rk[rounds][3]; + + return unpackBytes(b); +} +/* Modified by Recurity Labs GmbH + * + * Originally written by nklein software (nklein.com) + */ + +/* + * Javascript implementation based on Bruce Schneier's reference implementation. + * + * + * The constructor doesn't do much of anything. It's just here + * so we can start defining properties and methods and such. + */ +function Blowfish() { +}; + +/* + * Declare the block size so that protocols know what size + * Initialization Vector (IV) they will need. + */ +Blowfish.prototype.BLOCKSIZE = 8; + +/* + * These are the default SBOXES. + */ +Blowfish.prototype.SBOXES = [ + [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, + 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, + 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, + 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, + 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, + 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, + 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, + 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, + 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, + 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, + 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, + 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, + 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, + 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, + 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, + 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, + 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, + 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, + 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, + 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, + 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, + 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ], [ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, + 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, + 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, + 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, + 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, + 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, + 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, + 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, + 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, + 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, + 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, + 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, + 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, + 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, + 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, + 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, + 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, + 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, + 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, + 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, + 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, + 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ], [ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, + 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, + 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, + 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, + 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, + 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, + 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, + 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, + 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, + 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, + 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, + 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, + 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, + 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, + 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, + 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, + 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, + 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, + 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, + 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, + 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, + 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ], [ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, + 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, + 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, + 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, + 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, + 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, + 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, + 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, + 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, + 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, + 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, + 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, + 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, + 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, + 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, + 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, + 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, + 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, + 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, + 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, + 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, + 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ] +]; + +//* +//* This is the default PARRAY +//* +Blowfish.prototype.PARRAY = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b +]; + +//* +//* This is the number of rounds the cipher will go +//* +Blowfish.prototype.NN = 16; + +//* +//* This function is needed to get rid of problems +//* with the high-bit getting set. If we don't do +//* this, then sometimes ( aa & 0x00FFFFFFFF ) is not +//* equal to ( bb & 0x00FFFFFFFF ) even when they +//* agree bit-for-bit for the first 32 bits. +//* +Blowfish.prototype._clean = function( xx ) { + if ( xx < 0 ) { + var yy = xx & 0x7FFFFFFF; + xx = yy + 0x80000000; + } + return xx; +}; + +//* +//* This is the mixing function that uses the sboxes +//* +Blowfish.prototype._F = function ( xx ) { + var aa; + var bb; + var cc; + var dd; + var yy; + + dd = xx & 0x00FF; + xx >>>= 8; + cc = xx & 0x00FF; + xx >>>= 8; + bb = xx & 0x00FF; + xx >>>= 8; + aa = xx & 0x00FF; + + yy = this.sboxes[ 0 ][ aa ] + this.sboxes[ 1 ][ bb ]; + yy = yy ^ this.sboxes[ 2 ][ cc ]; + yy = yy + this.sboxes[ 3 ][ dd ]; + + return yy; +}; + +//* +//* This method takes an array with two values, left and right +//* and does NN rounds of Blowfish on them. +//* +Blowfish.prototype._encrypt_block = function ( vals ) { + var dataL = vals[ 0 ]; + var dataR = vals[ 1 ]; + + var ii; + + for ( ii=0; ii < this.NN; ++ii ) { + dataL = dataL ^ this.parray[ ii ]; + dataR = this._F( dataL ) ^ dataR; + + var tmp = dataL; + dataL = dataR; + dataR = tmp; + } + + dataL = dataL ^ this.parray[ this.NN + 0 ]; + dataR = dataR ^ this.parray[ this.NN + 1 ]; + + vals[ 0 ] = this._clean( dataR ); + vals[ 1 ] = this._clean( dataL ); +}; + +//* +//* This method takes a vector of numbers and turns them +//* into long words so that they can be processed by the +//* real algorithm. +//* +//* Maybe I should make the real algorithm above take a vector +//* instead. That will involve more looping, but it won't require +//* the F() method to deconstruct the vector. +//* +Blowfish.prototype.encrypt_block = function ( vector ) { + var ii; + var vals = [ 0, 0 ]; + var off = this.BLOCKSIZE/2; + for ( ii = 0; ii < this.BLOCKSIZE/2; ++ii ) { + vals[0] = ( vals[0] << 8 ) | ( vector[ ii + 0 ] & 0x00FF ); + vals[1] = ( vals[1] << 8 ) | ( vector[ ii + off ] & 0x00FF ); + } + + this._encrypt_block( vals ); + + var ret = [ ]; + for ( ii = 0; ii < this.BLOCKSIZE/2; ++ii ) { + ret[ ii + 0 ] = ( vals[ 0 ] >>> (24 - 8*(ii)) & 0x00FF ); + ret[ ii + off ] = ( vals[ 1 ] >>> (24 - 8*(ii)) & 0x00FF ); + // vals[ 0 ] = ( vals[ 0 ] >>> 8 ); + // vals[ 1 ] = ( vals[ 1 ] >>> 8 ); + } + + return ret; +}; + +//* +//* This method takes an array with two values, left and right +//* and undoes NN rounds of Blowfish on them. +//* +Blowfish.prototype._decrypt_block = function ( vals ) { + var dataL = vals[ 0 ]; + var dataR = vals[ 1 ]; + + var ii; + + for ( ii=this.NN+1; ii > 1; --ii ) { + dataL = dataL ^ this.parray[ ii ]; + dataR = this._F( dataL ) ^ dataR; + + var tmp = dataL; + dataL = dataR; + dataR = tmp; + } + + dataL = dataL ^ this.parray[ 1 ]; + dataR = dataR ^ this.parray[ 0 ]; + + vals[ 0 ] = this._clean( dataR ); + vals[ 1 ] = this._clean( dataL ); +}; + +//* +//* This method takes a key array and initializes the +//* sboxes and parray for this encryption. +//* +Blowfish.prototype.init = function ( key ) { + var ii; + var jj = 0; + + this.parray = []; + for ( ii=0; ii < this.NN + 2; ++ii ) { + var data = 0x00000000; + var kk; + for ( kk=0; kk < 4; ++kk ) { + data = ( data << 8 ) | ( key[ jj ] & 0x00FF ); + if ( ++jj >= key.length ) { + jj = 0; + } + } + this.parray[ ii ] = this.PARRAY[ ii ] ^ data; + } + + this.sboxes = []; + for ( ii=0; ii < 4; ++ii ) { + this.sboxes[ ii ] = []; + for ( jj=0; jj < 256; ++jj ) { + this.sboxes[ ii ][ jj ] = this.SBOXES[ ii ][ jj ]; + } + } + + var vals = [ 0x00000000, 0x00000000 ]; + + for ( ii=0; ii < this.NN+2; ii += 2 ) { + this._encrypt_block( vals ); + this.parray[ ii + 0 ] = vals[ 0 ]; + this.parray[ ii + 1 ] = vals[ 1 ]; + } + + for ( ii=0; ii < 4; ++ii ) { + for ( jj=0; jj < 256; jj += 2 ) { + this._encrypt_block( vals ); + this.sboxes[ ii ][ jj + 0 ] = vals[ 0 ]; + this.sboxes[ ii ][ jj + 1 ] = vals[ 1 ]; + } + } +}; + +// added by Recurity Labs +function BFencrypt(block,key) { + var bf = new Blowfish(); + bf.init(util.str2bin(key)); + return bf.encrypt_block(block); +} + +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Copyright 2010 pjacobs@xeekr.com . All rights reserved. + +// Modified by Recurity Labs GmbH + +// fixed/modified by Herbert Hanewinkel, www.haneWIN.de +// check www.haneWIN.de for the latest version + +// cast5.js is a Javascript implementation of CAST-128, as defined in RFC 2144. +// CAST-128 is a common OpenPGP cipher. + + +// CAST5 constructor + +function cast5_encrypt(block, key) { + var cast5 = new openpgp_symenc_cast5(); + cast5.setKey(util.str2bin(key)); + return cast5.encrypt(block); +} + +function openpgp_symenc_cast5() { + this.BlockSize= 8; + this.KeySize = 16; + + this.setKey = function (key) { + this.masking = new Array(16); + this.rotate = new Array(16); + + this.reset(); + + if (key.length == this.KeySize) + { + this.keySchedule(key); + } + else + { + util.print_error('cast5.js: CAST-128: keys must be 16 bytes'); + return false; + } + return true; + }; + + this.reset = function() { + for (var i = 0; i < 16; i++) + { + this.masking[i] = 0; + this.rotate[i] = 0; + } + }; + + this.getBlockSize = function() { + return BlockSize; + }; + + this.encrypt = function(src) { + var dst = new Array(src.length); + + for(var i = 0; i < src.length; i+=8) + { + var l = src[i]<<24 | src[i+1]<<16 | src[i+2]<<8 | src[i+3]; + var r = src[i+4]<<24 | src[i+5]<<16 | src[i+6]<<8 | src[i+7]; + var t; + + t = r; r = l^f1(r, this.masking[0], this.rotate[0]); l = t; + t = r; r = l^f2(r, this.masking[1], this.rotate[1]); l = t; + t = r; r = l^f3(r, this.masking[2], this.rotate[2]); l = t; + t = r; r = l^f1(r, this.masking[3], this.rotate[3]); l = t; + + t = r; r = l^f2(r, this.masking[4], this.rotate[4]); l = t; + t = r; r = l^f3(r, this.masking[5], this.rotate[5]); l = t; + t = r; r = l^f1(r, this.masking[6], this.rotate[6]); l = t; + t = r; r = l^f2(r, this.masking[7], this.rotate[7]); l = t; + + t = r; r = l^f3(r, this.masking[8], this.rotate[8]); l = t; + t = r; r = l^f1(r, this.masking[9], this.rotate[9]); l = t; + t = r; r = l^f2(r, this.masking[10], this.rotate[10]); l = t; + t = r; r = l^f3(r, this.masking[11], this.rotate[11]); l = t; + + t = r; r = l^f1(r, this.masking[12], this.rotate[12]); l = t; + t = r; r = l^f2(r, this.masking[13], this.rotate[13]); l = t; + t = r; r = l^f3(r, this.masking[14], this.rotate[14]); l = t; + t = r; r = l^f1(r, this.masking[15], this.rotate[15]); l = t; + + dst[i] = (r >>> 24)&255; + dst[i+1] = (r >>> 16)&255; + dst[i+2] = (r >>> 8)&255; + dst[i+3] = r&255; + dst[i+4] = (l >>> 24)&255; + dst[i+5] = (l >>> 16)&255; + dst[i+6] = (l >>> 8)&255; + dst[i+7] = l&255; + } + + return dst; + }; + + this.decrypt = function(src) { + var dst = new Array(src.length); + + for(var i = 0; i < src.length; i+=8) + { + var l = src[i]<<24 | src[i+1]<<16 | src[i+2]<<8 | src[i+3]; + var r = src[i+4]<<24 | src[i+5]<<16 | src[i+6]<<8 | src[i+7]; + var t; + + t = r; r = l^f1(r, this.masking[15], this.rotate[15]); l = t; + t = r; r = l^f3(r, this.masking[14], this.rotate[14]); l = t; + t = r; r = l^f2(r, this.masking[13], this.rotate[13]); l = t; + t = r; r = l^f1(r, this.masking[12], this.rotate[12]); l = t; + + t = r; r = l^f3(r, this.masking[11], this.rotate[11]); l = t; + t = r; r = l^f2(r, this.masking[10], this.rotate[10]); l = t; + t = r; r = l^f1(r, this.masking[9], this.rotate[9]); l = t; + t = r; r = l^f3(r, this.masking[8], this.rotate[8]); l = t; + + t = r; r = l^f2(r, this.masking[7], this.rotate[7]); l = t; + t = r; r = l^f1(r, this.masking[6], this.rotate[6]); l = t; + t = r; r = l^f3(r, this.masking[5], this.rotate[5]); l = t; + t = r; r = l^f2(r, this.masking[4], this.rotate[4]); l = t; + + t = r; r = l^f1(r, this.masking[3], this.rotate[3]); l = t; + t = r; r = l^f3(r, this.masking[2], this.rotate[2]); l = t; + t = r; r = l^f2(r, this.masking[1], this.rotate[1]); l = t; + t = r; r = l^f1(r, this.masking[0], this.rotate[0]); l = t; + + dst[i] = (r >>> 24)&255; + dst[i+1] = (r >>> 16)&255; + dst[i+2] = (r >>> 8)&255; + dst[i+3] = r&255; + dst[i+4] = (l >>> 24)&255; + dst[i+5] = (l >> 16)&255; + dst[i+6] = (l >> 8)&255; + dst[i+7] = l&255; + } + + return dst; + }; + var scheduleA = new Array(4); + + scheduleA[0] = new Array(4); + scheduleA[0][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 0x8); + scheduleA[0][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); + scheduleA[0][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); + scheduleA[0][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); + + scheduleA[1] = new Array(4); + scheduleA[1][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); + scheduleA[1][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); + scheduleA[1][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); + scheduleA[1][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); + + scheduleA[2] = new Array(4); + scheduleA[2][0] = new Array(4, 0, 0xd, 0xf, 0xc, 0xe, 8); + scheduleA[2][1] = new Array(5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa); + scheduleA[2][2] = new Array(6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9); + scheduleA[2][3] = new Array(7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb); + + + scheduleA[3] = new Array(4); + scheduleA[3][0] = new Array(0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0); + scheduleA[3][1] = new Array(1, 4, 0, 2, 1, 3, 16 + 2); + scheduleA[3][2] = new Array(2, 5, 7, 6, 5, 4, 16 + 1); + scheduleA[3][3] = new Array(3, 7, 0xa, 9, 0xb, 8, 16 + 3); + + var scheduleB = new Array(4); + + scheduleB[0] = new Array(4); + scheduleB[0][0] = new Array(16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2); + scheduleB[0][1] = new Array(16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6); + scheduleB[0][2] = new Array(16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9); + scheduleB[0][3] = new Array(16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc); + + scheduleB[1] = new Array(4); + scheduleB[1][0] = new Array(3, 2, 0xc, 0xd, 8); + scheduleB[1][1] = new Array(1, 0, 0xe, 0xf, 0xd); + scheduleB[1][2] = new Array(7, 6, 8, 9, 3); + scheduleB[1][3] = new Array(5, 4, 0xa, 0xb, 7); + + + scheduleB[2] = new Array(4); + scheduleB[2][0] = new Array(16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9); + scheduleB[2][1] = new Array(16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc); + scheduleB[2][2] = new Array(16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2); + scheduleB[2][3] = new Array(16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6); + + + scheduleB[3] = new Array(4); + scheduleB[3][0] = new Array(8, 9, 7, 6, 3); + scheduleB[3][1] = new Array(0xa, 0xb, 5, 4, 7); + scheduleB[3][2] = new Array(0xc, 0xd, 3, 2, 8); + scheduleB[3][3] = new Array(0xe, 0xf, 1, 0, 0xd); + + // changed 'in' to 'inn' (in javascript 'in' is a reserved word) + this.keySchedule = function(inn) + { + var t = new Array(8); + var k = new Array(32); + + for (var i = 0; i < 4; i++) + { + var j = i * 4; + t[i] = inn[j]<<24 | inn[j+1]<<16 | inn[j+2]<<8 | inn[j+3]; + } + + var x = [6, 7, 4, 5]; + var ki = 0; + + for (var half = 0; half < 2; half++) + { + for (var round = 0; round < 4; round++) + { + for (var j = 0; j < 4; j++) + { + var a = scheduleA[round][j]; + var w = t[a[1]]; + + w ^= sBox[4][(t[a[2]>>>2]>>>(24-8*(a[2]&3)))&0xff]; + w ^= sBox[5][(t[a[3]>>>2]>>>(24-8*(a[3]&3)))&0xff]; + w ^= sBox[6][(t[a[4]>>>2]>>>(24-8*(a[4]&3)))&0xff]; + w ^= sBox[7][(t[a[5]>>>2]>>>(24-8*(a[5]&3)))&0xff]; + w ^= sBox[x[j]][(t[a[6]>>>2]>>>(24-8*(a[6]&3)))&0xff]; + t[a[0]] = w; + } + + for (var j = 0; j < 4; j++) + { + var b = scheduleB[round][j]; + var w = sBox[4][(t[b[0]>>>2]>>>(24-8*(b[0]&3)))&0xff]; + + w ^= sBox[5][(t[b[1]>>>2]>>>(24-8*(b[1]&3)))&0xff]; + w ^= sBox[6][(t[b[2]>>>2]>>>(24-8*(b[2]&3)))&0xff]; + w ^= sBox[7][(t[b[3]>>>2]>>>(24-8*(b[3]&3)))&0xff]; + w ^= sBox[4+j][(t[b[4]>>>2]>>>(24-8*(b[4]&3)))&0xff]; + k[ki] = w; + ki++; + } + } + } + + for (var i = 0; i < 16; i++) + { + this.masking[i] = k[i]; + this.rotate[i] = k[16+i] & 0x1f; + } + }; + + // These are the three 'f' functions. See RFC 2144, section 2.2. + + function f1(d, m, r) + { + var t = m + d; + var I = (t << r) | (t >>> (32 - r)); + return ((sBox[0][I>>>24] ^ sBox[1][(I>>>16)&255]) - sBox[2][(I>>>8)&255]) + sBox[3][I&255]; + } + + function f2(d, m, r) + { + var t = m ^ d; + var I = (t << r) | (t >>> (32 - r)); + return ((sBox[0][I>>>24] - sBox[1][(I>>>16)&255]) + sBox[2][(I>>>8)&255]) ^ sBox[3][I&255]; + } + + function f3(d, m, r) + { + var t = m - d; + var I = (t << r) | (t >>> (32 - r)); + return ((sBox[0][I>>>24] + sBox[1][(I>>>16)&255]) ^ sBox[2][(I>>>8)&255]) - sBox[3][I&255]; + } + + var sBox = new Array(8); + sBox[0] = new Array( + 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, + 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, + 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, + 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, + 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, + 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, + 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, + 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, + 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, + 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, + 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, + 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, + 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, + 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, + 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, + 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, + 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, + 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, + 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, + 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, + 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, + 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, + 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, + 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, + 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, + 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, + 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, + 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, + 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, + 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, + 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, + 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf); + + sBox[1] = new Array( + 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, + 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, + 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, + 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, + 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, + 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, + 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, + 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, + 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, + 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, + 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, + 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, + 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, + 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, + 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, + 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, + 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, + 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, + 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, + 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, + 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, + 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, + 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, + 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, + 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, + 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, + 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, + 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, + 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, + 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, + 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, + 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1); + + sBox[2] = new Array( + 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, + 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, + 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, + 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, + 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, + 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, + 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, + 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, + 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, + 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, + 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, + 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, + 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, + 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, + 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, + 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, + 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, + 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, + 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, + 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, + 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, + 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, + 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, + 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, + 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, + 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, + 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, + 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, + 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, + 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, + 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, + 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783); + + sBox[3] = new Array( + 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, + 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, + 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, + 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, + 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, + 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, + 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, + 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, + 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, + 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, + 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, + 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, + 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, + 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, + 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, + 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, + 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, + 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, + 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, + 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, + 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, + 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, + 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, + 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, + 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, + 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, + 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, + 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, + 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, + 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, + 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, + 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2); + + sBox[4] = new Array( + 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, + 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, + 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, + 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, + 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, + 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, + 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, + 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, + 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, + 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, + 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, + 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, + 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, + 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, + 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, + 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, + 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, + 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, + 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, + 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, + 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, + 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, + 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, + 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, + 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, + 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, + 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, + 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, + 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, + 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, + 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, + 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4); + + sBox[5] = new Array( + 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, + 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, + 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, + 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, + 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, + 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, + 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, + 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, + 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, + 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, + 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, + 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, + 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, + 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, + 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, + 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, + 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, + 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, + 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, + 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, + 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, + 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, + 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, + 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, + 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, + 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, + 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, + 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, + 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, + 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, + 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, + 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f); + + sBox[6] = new Array( + 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, + 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, + 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, + 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, + 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, + 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, + 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, + 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, + 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, + 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, + 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, + 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, + 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, + 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, + 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, + 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, + 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, + 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, + 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, + 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, + 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, + 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, + 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, + 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, + 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, + 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, + 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, + 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, + 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, + 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, + 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, + 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3); + + sBox[7] = new Array( + 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, + 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, + 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, + 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, + 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, + 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, + 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, + 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, + 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, + 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, + 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, + 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, + 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, + 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, + 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, + 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, + 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, + 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, + 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, + 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, + 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, + 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, + 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, + 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, + 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, + 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, + 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, + 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, + 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, + 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, + 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, + 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e); + +}; + +//Paul Tero, July 2001 +//http://www.tero.co.uk/des/ +// +//Optimised for performance with large blocks by Michael Hayworth, November 2001 +//http://www.netdealing.com +// +// Modified by Recurity Labs GmbH + +//THIS SOFTWARE IS PROVIDED "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 AUTHOR 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. + +//des +//this takes the key, the message, and whether to encrypt or decrypt + +// added by Recurity Labs +function desede(block,key) { + var key1 = key.substring(0,8); + var key2 = key.substring(8,16); + var key3 = key.substring(16,24); + return util.str2bin(des(des_createKeys(key3),des(des_createKeys(key2),des(des_createKeys(key1),util.bin2str(block), true, 0,null,null), false, 0,null,null), true, 0,null,null)); +} + + +function des (keys, message, encrypt, mode, iv, padding) { + //declaring this locally speeds things up a bit + var spfunction1 = new Array (0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004); + var spfunction2 = new Array (-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000); + var spfunction3 = new Array (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200); + var spfunction4 = new Array (0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080); + var spfunction5 = new Array (0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100); + var spfunction6 = new Array (0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010); + var spfunction7 = new Array (0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002); + var spfunction8 = new Array (0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000); + + //create the 16 or 48 subkeys we will need + var m=0, i, j, temp, temp2, right1, right2, left, right, looping; + var cbcleft, cbcleft2, cbcright, cbcright2 + var endloop, loopinc; + var len = message.length; + var chunk = 0; + //set up the loops for single and triple des + var iterations = keys.length == 32 ? 3 : 9; //single or triple des + if (iterations == 3) {looping = encrypt ? new Array (0, 32, 2) : new Array (30, -2, -2);} + else {looping = encrypt ? new Array (0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array (94, 62, -2, 32, 64, 2, 30, -2, -2);} + + //pad the message depending on the padding parameter + //only add padding if encrypting - note that you need to use the same padding option for both encrypt and decrypt + if (encrypt) { + message = des_addPadding(message, padding); + len = message.length; + } + + //store the result here + result = ""; + tempresult = ""; + + if (mode == 1) { //CBC mode + cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); + cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++); + m=0; + } + + //loop through each 64 bit chunk of the message + while (m < len) { + left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); + right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++); + + //for Cipher Block Chaining mode, xor the message with the previous result + if (mode == 1) {if (encrypt) {left ^= cbcleft; right ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right;}} + + //first each 64 but chunk of the message must be permuted according to IP + temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); + temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); + temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); + temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); + temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); + + left = ((left << 1) | (left >>> 31)); + right = ((right << 1) | (right >>> 31)); + + //do this either 1 or 3 times for each chunk of the message + for (j=0; j>> 4) | (right << 28)) ^ keys[i+1]; + //the result is attained by passing these bytes through the S selection functions + temp = left; + left = right; + right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f] + | spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f] + | spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f] + | spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]); + } + temp = left; left = right; right = temp; //unreverse left and right + } //for either 1 or 3 iterations + + //move then each one bit to the right + left = ((left >>> 1) | (left << 31)); + right = ((right >>> 1) | (right << 31)); + + //now perform IP-1, which is IP in the opposite direction + temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); + temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); + temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2); + temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16); + temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); + + //for Cipher Block Chaining mode, xor the message with the previous result + if (mode == 1) {if (encrypt) {cbcleft = left; cbcright = right;} else {left ^= cbcleft2; right ^= cbcright2;}} + tempresult += String.fromCharCode ((left>>>24), ((left>>>16) & 0xff), ((left>>>8) & 0xff), (left & 0xff), (right>>>24), ((right>>>16) & 0xff), ((right>>>8) & 0xff), (right & 0xff)); + + chunk += 8; + if (chunk == 512) {result += tempresult; tempresult = ""; chunk = 0;} + } //for every 8 characters, or 64 bits in the message + + //return the result as an array + result += tempresult; + + //only remove padding if decrypting - note that you need to use the same padding option for both encrypt and decrypt + if (!encrypt) { + result = des_removePadding(result, padding); + } + + return result; +} //end of des + + + +//des_createKeys +//this takes as input a 64 bit key (even though only 56 bits are used) +//as an array of 2 integers, and returns 16 48 bit keys +function des_createKeys (key) { + //declaring this locally speeds things up a bit + pc2bytes0 = new Array (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204); + pc2bytes1 = new Array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101); + pc2bytes2 = new Array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808); + pc2bytes3 = new Array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000); + pc2bytes4 = new Array (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010); + pc2bytes5 = new Array (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420); + pc2bytes6 = new Array (0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002); + pc2bytes7 = new Array (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800); + pc2bytes8 = new Array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002); + pc2bytes9 = new Array (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408); + pc2bytes10 = new Array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020); + pc2bytes11 = new Array (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200); + pc2bytes12 = new Array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010); + pc2bytes13 = new Array (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105); + + //how many iterations (1 for des, 3 for triple des) + var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys + //stores the return keys + var keys = new Array (32 * iterations); + //now define the left shifts which need to be done + var shifts = new Array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0); + //other variables + var lefttemp, righttemp, m=0, n=0, temp; + + for (var j=0; j>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4); + temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); + temp = ((left >>> 2) ^ right) & 0x33333333; right ^= temp; left ^= (temp << 2); + temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16); + temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); + temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8); + temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1); + + //the right side needs to be shifted and to get the last four bits of the left side + temp = (left << 8) | ((right >>> 20) & 0x000000f0); + //left needs to be put upside down + left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0); + right = temp; + + //now go through and perform these shifts on the left and right keys + for (i=0; i < shifts.length; i++) { + //shift the keys either one or two bits to the left + if (shifts[i]) {left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26);} + else {left = (left << 1) | (left >>> 27); right = (right << 1) | (right >>> 27);} + left &= -0xf; right &= -0xf; + + //now apply PC-2, in such a way that E is easier when encrypting or decrypting + //this conversion will look like PC-2 except only the last 6 bits of each byte are used + //rather than 48 consecutive bits and the order of lines will be according to + //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7 + lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] + | pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] + | pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] + | pc2bytes6[(left >>> 4) & 0xf]; + righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] + | pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] + | pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] + | pc2bytes13[(right >>> 4) & 0xf]; + temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff; + keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp << 16); + } + } //for each iterations + //return the keys we've created + return keys; +} //end of des_createKeys + + +function des_addPadding(message, padding) { + var padLength = 8 - (message.length % 8); + if ((padding == 2) && (padLength < 8)) { //pad the message with spaces + message += " ".substr(0, padLength); + } + else if (padding == 1) { //PKCS7 padding + message += String.fromCharCode(padLength, padLength, padLength, padLength, padLength, padLength, padLength, padLength).substr(0, padLength); + } + else if (!padding && (padLength < 8)) { //pad the message out with null bytes + message += "\0\0\0\0\0\0\0\0".substr(0, padLength); + } + return message; +} + +function des_removePadding(message, padding) { + if (padding == 2) { // space padded + message = message.replace(/ *$/g, ""); + } + else if (padding == 1) { // PKCS7 + var padCount = message.charCodeAt(message.length - 1); + message = message.substr(0, message.length - padCount); + } + else if (!padding) { // null padding + message = message.replace(/\0*$/g, ""); + } + return message; +} + +/* Modified by Recurity Labs GmbH + * + * Cipher.js + * A block-cipher algorithm implementation on JavaScript + * See Cipher.readme.txt for further information. + * + * Copyright(c) 2009 Atsushi Oka [ http://oka.nu/ ] + * This script file is distributed under the LGPL + * + * ACKNOWLEDGMENT + * + * The main subroutines are written by Michiel van Everdingen. + * + * Michiel van Everdingen + * http://home.versatel.nl/MAvanEverdingen/index.html + * + * All rights for these routines are reserved to Michiel van Everdingen. + * + */ + +// added by Recurity Labs +function TFencrypt(block, key) { + var block_copy = [].concat(block); + var tf = createTwofish(); + tf.open(util.str2bin(key),0); + var result = tf.encrypt(block_copy, 0); + tf.close(); + return result; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//Math +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +var MAXINT = 0xFFFFFFFF; + +function rotb(b,n){ return ( b<>>( 8-n) ) & 0xFF; } +function rotw(w,n){ return ( w<>>(32-n) ) & MAXINT; } +function getW(a,i){ return a[i]|a[i+1]<<8|a[i+2]<<16|a[i+3]<<24; } +function setW(a,i,w){ a.splice(i,4,w&0xFF,(w>>>8)&0xFF,(w>>>16)&0xFF,(w>>>24)&0xFF); } +function setWInv(a,i,w){ a.splice(i,4,(w>>>24)&0xFF,(w>>>16)&0xFF,(w>>>8)&0xFF,w&0xFF); } +function getB(x,n){ return (x>>>(n*8))&0xFF; } + +function getNrBits(i){ var n=0; while (i>0){ n++; i>>>=1; } return n; } +function getMask(n){ return (1<> 2) ^ [ 0, 90, 180, 238 ][x & 3]; + } + function ffmEf(x) { + return x ^ (x >> 1) ^ (x >> 2) ^ [ 0, 238, 180, 90 ][x & 3]; + } + + function mdsRem(p, q) { + var i, t, u; + for (i = 0; i < 8; i++) { + t = q >>> 24; + q = ((q << 8) & MAXINT) | p >>> 24; + p = (p << 8) & MAXINT; + u = t << 1; + if (t & 128) { + u ^= 333; + } + q ^= t ^ (u << 16); + u ^= t >>> 1; + if (t & 1) { + u ^= 166; + } + q ^= u << 24 | u << 8; + } + return q; + } + + function qp(n, x) { + var a, b, c, d; + a = x >> 4; + b = x & 15; + c = q0[n][a ^ b]; + d = q1[n][ror4[b] ^ ashx[a]]; + return q3[n][ror4[d] ^ ashx[c]] << 4 | q2[n][c ^ d]; + } + + function hFun(x, key) { + var a = getB(x, 0), b = getB(x, 1), c = getB(x, 2), d = getB(x, 3); + switch (kLen) { + case 4: + a = q[1][a] ^ getB(key[3], 0); + b = q[0][b] ^ getB(key[3], 1); + c = q[0][c] ^ getB(key[3], 2); + d = q[1][d] ^ getB(key[3], 3); + case 3: + a = q[1][a] ^ getB(key[2], 0); + b = q[1][b] ^ getB(key[2], 1); + c = q[0][c] ^ getB(key[2], 2); + d = q[0][d] ^ getB(key[2], 3); + case 2: + a = q[0][q[0][a] ^ getB(key[1], 0)] ^ getB(key[0], 0); + b = q[0][q[1][b] ^ getB(key[1], 1)] ^ getB(key[0], 1); + c = q[1][q[0][c] ^ getB(key[1], 2)] ^ getB(key[0], 2); + d = q[1][q[1][d] ^ getB(key[1], 3)] ^ getB(key[0], 3); + } + return m[0][a] ^ m[1][b] ^ m[2][c] ^ m[3][d]; + } + + keyBytes = keyBytes.slice(0, 32); + i = keyBytes.length; + while (i != 16 && i != 24 && i != 32) + keyBytes[i++] = 0; + + for (i = 0; i < keyBytes.length; i += 4) { + inKey[i >> 2] = getW(keyBytes, i); + } + for (i = 0; i < 256; i++) { + q[0][i] = qp(0, i); + q[1][i] = qp(1, i); + } + for (i = 0; i < 256; i++) { + f01 = q[1][i]; + f5b = ffm5b(f01); + fef = ffmEf(f01); + m[0][i] = f01 + (f5b << 8) + (fef << 16) + (fef << 24); + m[2][i] = f5b + (fef << 8) + (f01 << 16) + (fef << 24); + f01 = q[0][i]; + f5b = ffm5b(f01); + fef = ffmEf(f01); + m[1][i] = fef + (fef << 8) + (f5b << 16) + (f01 << 24); + m[3][i] = f5b + (f01 << 8) + (fef << 16) + (f5b << 24); + } + + kLen = inKey.length / 2; + for (i = 0; i < kLen; i++) { + a = inKey[i + i]; + meKey[i] = a; + b = inKey[i + i + 1]; + moKey[i] = b; + sKey[kLen - i - 1] = mdsRem(a, b); + } + for (i = 0; i < 40; i += 2) { + a = 0x1010101 * i; + b = a + 0x1010101; + a = hFun(a, meKey); + b = rotw(hFun(b, moKey), 8); + tfsKey[i] = (a + b) & MAXINT; + tfsKey[i + 1] = rotw(a + 2 * b, 9); + } + for (i = 0; i < 256; i++) { + a = b = c = d = i; + switch (kLen) { + case 4: + a = q[1][a] ^ getB(sKey[3], 0); + b = q[0][b] ^ getB(sKey[3], 1); + c = q[0][c] ^ getB(sKey[3], 2); + d = q[1][d] ^ getB(sKey[3], 3); + case 3: + a = q[1][a] ^ getB(sKey[2], 0); + b = q[1][b] ^ getB(sKey[2], 1); + c = q[0][c] ^ getB(sKey[2], 2); + d = q[0][d] ^ getB(sKey[2], 3); + case 2: + tfsM[0][i] = m[0][q[0][q[0][a] ^ getB(sKey[1], 0)] + ^ getB(sKey[0], 0)]; + tfsM[1][i] = m[1][q[0][q[1][b] ^ getB(sKey[1], 1)] + ^ getB(sKey[0], 1)]; + tfsM[2][i] = m[2][q[1][q[0][c] ^ getB(sKey[1], 2)] + ^ getB(sKey[0], 2)]; + tfsM[3][i] = m[3][q[1][q[1][d] ^ getB(sKey[1], 3)] + ^ getB(sKey[0], 3)]; + } + } + } + + function tfsG0(x) { + return tfsM[0][getB(x, 0)] ^ tfsM[1][getB(x, 1)] ^ tfsM[2][getB(x, 2)] + ^ tfsM[3][getB(x, 3)]; + } + function tfsG1(x) { + return tfsM[0][getB(x, 3)] ^ tfsM[1][getB(x, 0)] ^ tfsM[2][getB(x, 1)] + ^ tfsM[3][getB(x, 2)]; + } + + function tfsFrnd(r, blk) { + var a = tfsG0(blk[0]); + var b = tfsG1(blk[1]); + blk[2] = rotw(blk[2] ^ (a + b + tfsKey[4 * r + 8]) & MAXINT, 31); + blk[3] = rotw(blk[3], 1) ^ (a + 2 * b + tfsKey[4 * r + 9]) & MAXINT; + a = tfsG0(blk[2]); + b = tfsG1(blk[3]); + blk[0] = rotw(blk[0] ^ (a + b + tfsKey[4 * r + 10]) & MAXINT, 31); + blk[1] = rotw(blk[1], 1) ^ (a + 2 * b + tfsKey[4 * r + 11]) & MAXINT; + } + + function tfsIrnd(i, blk) { + var a = tfsG0(blk[0]); + var b = tfsG1(blk[1]); + blk[2] = rotw(blk[2], 1) ^ (a + b + tfsKey[4 * i + 10]) & MAXINT; + blk[3] = rotw(blk[3] ^ (a + 2 * b + tfsKey[4 * i + 11]) & MAXINT, 31); + a = tfsG0(blk[2]); + b = tfsG1(blk[3]); + blk[0] = rotw(blk[0], 1) ^ (a + b + tfsKey[4 * i + 8]) & MAXINT; + blk[1] = rotw(blk[1] ^ (a + 2 * b + tfsKey[4 * i + 9]) & MAXINT, 31); + } + + function tfsClose() { + tfsKey = []; + tfsM = [ [], [], [], [] ]; + } + + function tfsEncrypt(data, offset) { + dataBytes = data; + dataOffset = offset; + var blk = [ getW(dataBytes, dataOffset) ^ tfsKey[0], + getW(dataBytes, dataOffset + 4) ^ tfsKey[1], + getW(dataBytes, dataOffset + 8) ^ tfsKey[2], + getW(dataBytes, dataOffset + 12) ^ tfsKey[3] ]; + for ( var j = 0; j < 8; j++) { + tfsFrnd(j, blk); + } + setW(dataBytes, dataOffset, blk[2] ^ tfsKey[4]); + setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[5]); + setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[6]); + setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[7]); + dataOffset += 16; + return dataBytes; + } + + function tfsDecrypt(data, offset) { + dataBytes = data; + dataOffset = offset; + var blk = [ getW(dataBytes, dataOffset) ^ tfsKey[4], + getW(dataBytes, dataOffset + 4) ^ tfsKey[5], + getW(dataBytes, dataOffset + 8) ^ tfsKey[6], + getW(dataBytes, dataOffset + 12) ^ tfsKey[7] ]; + for ( var j = 7; j >= 0; j--) { + tfsIrnd(j, blk); + } + setW(dataBytes, dataOffset, blk[2] ^ tfsKey[0]); + setW(dataBytes, dataOffset + 4, blk[3] ^ tfsKey[1]); + setW(dataBytes, dataOffset + 8, blk[0] ^ tfsKey[2]); + setW(dataBytes, dataOffset + 12, blk[1] ^ tfsKey[3]); + dataOffset += 16; + } + + // added by Recurity Labs + function tfsFinal() { + return dataBytes; + } + + return { + name : "twofish", + blocksize : 128 / 8, + open : tfsInit, + close : tfsClose, + encrypt : tfsEncrypt, + decrypt : tfsDecrypt, + // added by Recurity Labs + finalize: tfsFinal + }; +} + +JXG = {exists: (function(undefined){return function(v){return !(v===undefined || v===null);}})()}; +JXG.decompress = function(str) {return unescape((new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(str))).unzip()[0][0]);}; +/* + Copyright 2008-2012 + Matthias Ehmann, + Michael Gerhaeuser, + Carsten Miller, + Bianca Valentin, + Alfred Wassermann, + Peter Wilfahrt + + This file is part of JSXGraph. + + Dual licensed under the Apache License Version 2.0, or LGPL Version 3 licenses. + + You should have received a copy of the GNU Lesser General Public License + along with JSXCompressor. If not, see . + + You should have received a copy of the Apache License along with JSXCompressor. + If not, see . + +*/ + +/** + * @class Util class + * @classdesc Utilities for uncompressing and base64 decoding + * Class for gunzipping, unzipping and base64 decoding of files. + * It is used for reading GEONExT, Geogebra and Intergeo files. + * + * Only Huffman codes are decoded in gunzip. + * The code is based on the source code for gunzip.c by Pasi Ojala + * {@link http://www.cs.tut.fi/~albert/Dev/gunzip/gunzip.c} + * {@link http://www.cs.tut.fi/~albert} + */ +JXG.Util = {}; + +/** + * Unzip zip files + */ +JXG.Util.Unzip = function (barray){ + var outputArr = [], + output = "", + debug = false, + gpflags, + files = 0, + unzipped = [], + crc, + buf32k = new Array(32768), + bIdx = 0, + modeZIP=false, + + CRC, SIZE, + + bitReverse = [ + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff + ], + + cplens = [ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 + ], + + cplext = [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99 + ], /* 99==invalid */ + + cpdist = [ + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0007, 0x0009, 0x000d, + 0x0011, 0x0019, 0x0021, 0x0031, 0x0041, 0x0061, 0x0081, 0x00c1, + 0x0101, 0x0181, 0x0201, 0x0301, 0x0401, 0x0601, 0x0801, 0x0c01, + 0x1001, 0x1801, 0x2001, 0x3001, 0x4001, 0x6001 + ], + + cpdext = [ + 0, 0, 0, 0, 1, 1, 2, 2, + 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, + 11, 11, 12, 12, 13, 13 + ], + + border = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + + bA = barray, + + bytepos=0, + bitpos=0, + bb = 1, + bits=0, + + NAMEMAX = 256, + + nameBuf = [], + + fileout; + + function readByte(){ + bits+=8; + if (bytepos"); + return bA[bytepos++]; + } else + return -1; + }; + + function byteAlign(){ + bb = 1; + }; + + function readBit(){ + var carry; + bits++; + carry = (bb & 1); + bb >>= 1; + if (bb==0){ + bb = readByte(); + carry = (bb & 1); + bb = (bb>>1) | 0x80; + } + return carry; + }; + + function readBits(a) { + var res = 0, + i = a; + + while(i--) { + res = (res<<1) | readBit(); + } + if(a) { + res = bitReverse[res]>>(8-a); + } + return res; + }; + + function flushBuffer(){ + //document.write('FLUSHBUFFER:'+buf32k); + bIdx = 0; + }; + function addBuffer(a){ + SIZE++; + //CRC=updcrc(a,crc); + buf32k[bIdx++] = a; + outputArr.push(String.fromCharCode(a)); + //output+=String.fromCharCode(a); + if(bIdx==0x8000){ + //document.write('ADDBUFFER:'+buf32k); + bIdx=0; + } + }; + + function HufNode() { + this.b0=0; + this.b1=0; + this.jump = null; + this.jumppos = -1; + }; + + var LITERALS = 288; + + var literalTree = new Array(LITERALS); + var distanceTree = new Array(32); + var treepos=0; + var Places = null; + var Places2 = null; + + var impDistanceTree = new Array(64); + var impLengthTree = new Array(64); + + var len = 0; + var fpos = new Array(17); + fpos[0]=0; + var flens; + var fmax; + + function IsPat() { + while (1) { + if (fpos[len] >= fmax) + return -1; + if (flens[fpos[len]] == len) + return fpos[len]++; + fpos[len]++; + } + }; + + function Rec() { + var curplace = Places[treepos]; + var tmp; + if (debug) + document.write("
    len:"+len+" treepos:"+treepos); + if(len==17) { //war 17 + return -1; + } + treepos++; + len++; + + tmp = IsPat(); + if (debug) + document.write("
    IsPat "+tmp); + if(tmp >= 0) { + curplace.b0 = tmp; /* leaf cell for 0-bit */ + if (debug) + document.write("
    b0 "+curplace.b0); + } else { + /* Not a Leaf cell */ + curplace.b0 = 0x8000; + if (debug) + document.write("
    b0 "+curplace.b0); + if(Rec()) + return -1; + } + tmp = IsPat(); + if(tmp >= 0) { + curplace.b1 = tmp; /* leaf cell for 1-bit */ + if (debug) + document.write("
    b1 "+curplace.b1); + curplace.jump = null; /* Just for the display routine */ + } else { + /* Not a Leaf cell */ + curplace.b1 = 0x8000; + if (debug) + document.write("
    b1 "+curplace.b1); + curplace.jump = Places[treepos]; + curplace.jumppos = treepos; + if(Rec()) + return -1; + } + len--; + return 0; + }; + + function CreateTree(currentTree, numval, lengths, show) { + var i; + /* Create the Huffman decode tree/table */ + //document.write("
    createtree
    "); + if (debug) + document.write("currentTree "+currentTree+" numval "+numval+" lengths "+lengths+" show "+show); + Places = currentTree; + treepos=0; + flens = lengths; + fmax = numval; + for (i=0;i<17;i++) + fpos[i] = 0; + len = 0; + if(Rec()) { + //fprintf(stderr, "invalid huffman tree\n"); + if (debug) + alert("invalid huffman tree\n"); + return -1; + } + if (debug){ + document.write('
    Tree: '+Places.length); + for (var a=0;a<32;a++){ + document.write("Places["+a+"].b0="+Places[a].b0+"
    "); + document.write("Places["+a+"].b1="+Places[a].b1+"
    "); + } + } + + /*if(show) { + var tmp; + for(tmp=currentTree;tmpjump?tmp->jump-currentTree:0,(tmp->jump?tmp->jump-currentTree:0)*6+0xcf0); + if(!(tmp.b0 & 0x8000)) { + //fprintf(stdout, " 0x%03x (%c)", tmp->b0,(tmp->b0<256 && isprint(tmp->b0))?tmp->b0:'�'); + } + if(!(tmp.b1 & 0x8000)) { + if((tmp.b0 & 0x8000)) + fprintf(stdout, " "); + fprintf(stdout, " 0x%03x (%c)", tmp->b1,(tmp->b1<256 && isprint(tmp->b1))?tmp->b1:'�'); + } + fprintf(stdout, "\n"); + } + }*/ + return 0; + }; + + function DecodeValue(currentTree) { + var len, i, + xtreepos=0, + X = currentTree[xtreepos], + b; + + /* decode one symbol of the data */ + while(1) { + b=readBit(); + if (debug) + document.write("b="+b); + if(b) { + if(!(X.b1 & 0x8000)){ + if (debug) + document.write("ret1"); + return X.b1; /* If leaf node, return data */ + } + X = X.jump; + len = currentTree.length; + for (i=0;i>1); + if(j > 23) { + j = (j<<1) | readBit(); /* 48..255 */ + + if(j > 199) { /* 200..255 */ + j -= 128; /* 72..127 */ + j = (j<<1) | readBit(); /* 144..255 << */ + } else { /* 48..199 */ + j -= 48; /* 0..151 */ + if(j > 143) { + j = j+136; /* 280..287 << */ + /* 0..143 << */ + } + } + } else { /* 0..23 */ + j += 256; /* 256..279 << */ + } + if(j < 256) { + addBuffer(j); + //document.write("out:"+String.fromCharCode(j)); + /*fprintf(errfp, "@%d %02x\n", SIZE, j);*/ + } else if(j == 256) { + /* EOF */ + break; + } else { + var len, dist; + + j -= 256 + 1; /* bytes + EOF */ + len = readBits(cplext[j]) + cplens[j]; + + j = bitReverse[readBits(5)]>>3; + if(cpdext[j] > 8) { + dist = readBits(8); + dist |= (readBits(cpdext[j]-8)<<8); + } else { + dist = readBits(cpdext[j]); + } + dist += cpdist[j]; + + /*fprintf(errfp, "@%d (l%02x,d%04x)\n", SIZE, len, dist);*/ + for(j=0;jparam: "+literalCodes+" "+distCodes+" "+lenCodes+"
    "); + for(j=0; j<19; j++) { + ll[j] = 0; + } + + // Get the decode tree code lengths + + //document.write("
    "); + for(j=0; jll:'+ll); + len = distanceTree.length; + for (i=0; idistanceTree"); + for(var a=0;a"+distanceTree[a].b0+" "+distanceTree[a].b1+" "+distanceTree[a].jump+" "+distanceTree[a].jumppos); + /*if (distanceTree[a].jumppos!=-1) + document.write(" "+distanceTree[a].jump.b0+" "+distanceTree[a].jump.b1); + */ + } + } + //document.write('
    tree created'); + + //read in literal and distance code lengths + n = literalCodes + distCodes; + i = 0; + var z=-1; + if (debug) + document.write("
    n="+n+" bits: "+bits+"
    "); + while(i < n) { + z++; + j = DecodeValue(distanceTree); + if (debug) + document.write("
    "+z+" i:"+i+" decode: "+j+" bits "+bits+"
    "); + if(j<16) { // length of code in bits (0..15) + ll[i++] = j; + } else if(j==16) { // repeat last length 3 to 6 times + var l; + j = 3 + readBits(2); + if(i+j > n) { + flushBuffer(); + return 1; + } + l = i ? ll[i-1] : 0; + while(j--) { + ll[i++] = l; + } + } else { + if(j==17) { // 3 to 10 zero length codes + j = 3 + readBits(3); + } else { // j == 18: 11 to 138 zero length codes + j = 11 + readBits(7); + } + if(i+j > n) { + flushBuffer(); + return 1; + } + while(j--) { + ll[i++] = 0; + } + } + } + /*for(j=0; jliteralTree"); + outer: + while(1) { + j = DecodeValue(literalTree); + if(j >= 256) { // In C64: if carry set + var len, dist; + j -= 256; + if(j == 0) { + // EOF + break; + } + j--; + len = readBits(cplext[j]) + cplens[j]; + + j = DecodeValue(distanceTree); + if(cpdext[j] > 8) { + dist = readBits(8); + dist |= (readBits(cpdext[j]-8)<<8); + } else { + dist = readBits(cpdext[j]); + } + dist += cpdist[j]; + while(len--) { + if(bIdx - dist < 0) { + break outer; + } + var c = buf32k[(bIdx - dist) & 0x7fff]; + addBuffer(c); + } + } else { + addBuffer(j); + } + } + } + } while(!last); + flushBuffer(); + + byteAlign(); + return 0; +}; + +JXG.Util.Unzip.prototype.unzipFile = function(name) { + var i; + this.unzip(); + //alert(unzipped[0][1]); + for (i=0;i"); + } + */ + //alert(bA); + nextFile(); + return unzipped; + }; + + function nextFile(){ + if (debug) + alert("NEXTFILE"); + outputArr = []; + var tmp = []; + modeZIP = false; + tmp[0] = readByte(); + tmp[1] = readByte(); + if (debug) + alert("type: "+tmp[0]+" "+tmp[1]); + if (tmp[0] == parseInt("78",16) && tmp[1] == parseInt("da",16)){ //GZIP + if (debug) + alert("GEONExT-GZIP"); + DeflateLoop(); + if (debug) + alert(outputArr.join('')); + unzipped[files] = new Array(2); + unzipped[files][0] = outputArr.join(''); + unzipped[files][1] = "geonext.gxt"; + files++; + } + if (tmp[0] == parseInt("78",16) && tmp[1] == parseInt("9c",16)){ //ZLIB + if (debug) + alert("ZLIB"); + DeflateLoop(); + if (debug) + alert(outputArr.join('')); + unzipped[files] = new Array(2); + unzipped[files][0] = outputArr.join(''); + unzipped[files][1] = "ZLIB"; + files++; + } + if (tmp[0] == parseInt("1f",16) && tmp[1] == parseInt("8b",16)){ //GZIP + if (debug) + alert("GZIP"); + //DeflateLoop(); + skipdir(); + if (debug) + alert(outputArr.join('')); + unzipped[files] = new Array(2); + unzipped[files][0] = outputArr.join(''); + unzipped[files][1] = "file"; + files++; + } + if (tmp[0] == parseInt("50",16) && tmp[1] == parseInt("4b",16)){ //ZIP + modeZIP = true; + tmp[2] = readByte(); + tmp[3] = readByte(); + if (tmp[2] == parseInt("3",16) && tmp[3] == parseInt("4",16)){ + //MODE_ZIP + tmp[0] = readByte(); + tmp[1] = readByte(); + if (debug) + alert("ZIP-Version: "+tmp[1]+" "+tmp[0]/10+"."+tmp[0]%10); + + gpflags = readByte(); + gpflags |= (readByte()<<8); + if (debug) + alert("gpflags: "+gpflags); + + var method = readByte(); + method |= (readByte()<<8); + if (debug) + alert("method: "+method); + + readByte(); + readByte(); + readByte(); + readByte(); + + var crc = readByte(); + crc |= (readByte()<<8); + crc |= (readByte()<<16); + crc |= (readByte()<<24); + + var compSize = readByte(); + compSize |= (readByte()<<8); + compSize |= (readByte()<<16); + compSize |= (readByte()<<24); + + var size = readByte(); + size |= (readByte()<<8); + size |= (readByte()<<16); + size |= (readByte()<<24); + + if (debug) + alert("local CRC: "+crc+"\nlocal Size: "+size+"\nlocal CompSize: "+compSize); + + var filelen = readByte(); + filelen |= (readByte()<<8); + + var extralen = readByte(); + extralen |= (readByte()<<8); + + if (debug) + alert("filelen "+filelen); + i = 0; + nameBuf = []; + while (filelen--){ + var c = readByte(); + if (c == "/" | c ==":"){ + i = 0; + } else if (i < NAMEMAX-1) + nameBuf[i++] = String.fromCharCode(c); + } + if (debug) + alert("nameBuf: "+nameBuf); + + //nameBuf[i] = "\0"; + if (!fileout) + fileout = nameBuf; + + var i = 0; + while (i < extralen){ + c = readByte(); + i++; + } + + CRC = 0xffffffff; + SIZE = 0; + + if (size = 0 && fileOut.charAt(fileout.length-1)=="/"){ + //skipdir + if (debug) + alert("skipdir"); + } + if (method == 8){ + DeflateLoop(); + if (debug) + alert(outputArr.join('')); + unzipped[files] = new Array(2); + unzipped[files][0] = outputArr.join(''); + unzipped[files][1] = nameBuf.join(''); + files++; + //return outputArr.join(''); + } + skipdir(); + } + } + }; + +function skipdir(){ + var crc, + tmp = [], + compSize, size, os, i, c; + + if ((gpflags & 8)) { + tmp[0] = readByte(); + tmp[1] = readByte(); + tmp[2] = readByte(); + tmp[3] = readByte(); + + if (tmp[0] == parseInt("50",16) && + tmp[1] == parseInt("4b",16) && + tmp[2] == parseInt("07",16) && + tmp[3] == parseInt("08",16)) + { + crc = readByte(); + crc |= (readByte()<<8); + crc |= (readByte()<<16); + crc |= (readByte()<<24); + } else { + crc = tmp[0] | (tmp[1]<<8) | (tmp[2]<<16) | (tmp[3]<<24); + } + + compSize = readByte(); + compSize |= (readByte()<<8); + compSize |= (readByte()<<16); + compSize |= (readByte()<<24); + + size = readByte(); + size |= (readByte()<<8); + size |= (readByte()<<16); + size |= (readByte()<<24); + + if (debug) + alert("CRC:"); + } + + if (modeZIP) + nextFile(); + + tmp[0] = readByte(); + if (tmp[0] != 8) { + if (debug) + alert("Unknown compression method!"); + return 0; + } + + gpflags = readByte(); + if (debug){ + if ((gpflags & ~(parseInt("1f",16)))) + alert("Unknown flags set!"); + } + + readByte(); + readByte(); + readByte(); + readByte(); + + readByte(); + os = readByte(); + + if ((gpflags & 4)){ + tmp[0] = readByte(); + tmp[2] = readByte(); + len = tmp[0] + 256*tmp[1]; + if (debug) + alert("Extra field size: "+len); + for (i=0;i> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output.push([this._keyStr.charAt(enc1), + this._keyStr.charAt(enc2), + this._keyStr.charAt(enc3), + this._keyStr.charAt(enc4)].join('')); + } + + return output.join(''); + }, + + // public method for decoding + decode : function (input, utf8) { + var output = [], + chr1, chr2, chr3, + enc1, enc2, enc3, enc4, + i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output.push(String.fromCharCode(chr1)); + + if (enc3 != 64) { + output.push(String.fromCharCode(chr2)); + } + if (enc4 != 64) { + output.push(String.fromCharCode(chr3)); + } + } + + output = output.join(''); + + if (utf8) { + output = JXG.Util.Base64._utf8_decode(output); + } + return output; + + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var string = [], + i = 0, + c = 0, c2 = 0, c3 = 0; + + while ( i < utftext.length ) { + c = utftext.charCodeAt(i); + if (c < 128) { + string.push(String.fromCharCode(c)); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string.push(String.fromCharCode(((c & 31) << 6) | (c2 & 63))); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string.push(String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63))); + i += 3; + } + } + return string.join(''); + }, + + _destrip: function (stripped, wrap){ + var lines = [], lineno, i, + destripped = []; + + if (wrap==null) + wrap = 76; + + stripped.replace(/ /g, ""); + lineno = stripped.length / wrap; + for (i = 0; i < lineno; i++) + lines[i]=stripped.substr(i * wrap, wrap); + if (lineno != stripped.length / wrap) + lines[lines.length]=stripped.substr(lineno * wrap, stripped.length-(lineno * wrap)); + + for (i = 0; i < lines.length; i++) + destripped.push(lines[i]); + return destripped.join('\n'); + }, + + decodeAsArray: function (input){ + var dec = this.decode(input), + ar = [], i; + for (i=0;i255){ + switch (c) { + case 8364: c=128; + break; + case 8218: c=130; + break; + case 402: c=131; + break; + case 8222: c=132; + break; + case 8230: c=133; + break; + case 8224: c=134; + break; + case 8225: c=135; + break; + case 710: c=136; + break; + case 8240: c=137; + break; + case 352: c=138; + break; + case 8249: c=139; + break; + case 338: c=140; + break; + case 381: c=142; + break; + case 8216: c=145; + break; + case 8217: c=146; + break; + case 8220: c=147; + break; + case 8221: c=148; + break; + case 8226: c=149; + break; + case 8211: c=150; + break; + case 8212: c=151; + break; + case 732: c=152; + break; + case 8482: c=153; + break; + case 353: c=154; + break; + case 8250: c=155; + break; + case 339: c=156; + break; + case 382: c=158; + break; + case 376: c=159; + break; + default: + break; + } + } + return c; +}; + +/** + * Decoding string into utf-8 + * @param {String} string to decode + * @return {String} utf8 decoded string + */ +JXG.Util.utf8Decode = function(utftext) { + var string = []; + var i = 0; + var c = 0, c1 = 0, c2 = 0, c3; + if (!JXG.exists(utftext)) return ''; + + while ( i < utftext.length ) { + c = utftext.charCodeAt(i); + + if (c < 128) { + string.push(String.fromCharCode(c)); + i++; + } else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string.push(String.fromCharCode(((c & 31) << 6) | (c2 & 63))); + i += 2; + } else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string.push(String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63))); + i += 3; + } + }; + return string.join(''); +}; + +/** + * Generate a random uuid. + * http://www.broofa.com + * mailto:robert@broofa.com + * + * Copyright (c) 2010 Robert Kieffer + * Dual licensed under the MIT and GPL licenses. + * + * EXAMPLES: + * >>> Math.uuid() + * "92329D39-6F5C-4520-ABFC-AAB64544E172" + */ +JXG.Util.genUUID = function() { + // Private array of chars to use + var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''), + uuid = new Array(36), rnd=0, r; + + for (var i = 0; i < 36; i++) { + if (i==8 || i==13 || i==18 || i==23) { + uuid[i] = '-'; + } else if (i==14) { + uuid[i] = '4'; + } else { + if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0; + r = rnd & 0xf; + rnd = rnd >> 4; + uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; + } + } + + return uuid.join(''); +}; + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * + * This object contains configuration values and implements + * storing and retrieving configuration them from HTML5 local storage. + * + * This object can be accessed after calling openpgp.init() + * using openpgp.config + * Stored config parameters can be accessed using + * openpgp.config.config + * @class + * @classdesc Implementation of the GPG4Browsers config object + */ +function openpgp_config() { + /** + * The variable with the actual configuration + * @property {Integer} prefer_hash_algorithm + * @property {Integer} encryption_cipher + * @property {Integer} compression + * @property {Boolean} show_version + * @property {Boolean} show_comment + * @property {Boolean} integrity_protect + * @property {Integer} composition_behavior + * @property {String} keyserver + */ + this.config = null; + + /** + * The default config object which is used if no + * configuration was in place + */ + this.default_config = { + prefer_hash_algorithm: 8, + encryption_cipher: 9, + compression: 1, + show_version: true, + show_comment: true, + integrity_protect: true, + composition_behavior: 0, + keyserver: "keyserver.linux.it" // "pgp.mit.edu:11371" + }; + + this.versionstring ="OpenPGP.js v.1.20130825"; + this.commentstring ="http://openpgpjs.org"; + /** + * Reads the config out of the HTML5 local storage + * and initializes the object config. + * if config is null the default config will be used + */ + function read() { + var cf = JSON.parse(window.localStorage.getItem("config")); + if (cf == null) { + this.config = this.default_config; + this.write(); + } + else + this.config = cf; + } + + /** + * If enabled, debug messages will be printed + */ + this.debug = false; + + /** + * Writes the config to HTML5 local storage + */ + function write() { + window.localStorage.setItem("config",JSON.stringify(this.config)); + } + + function init() { + this.config = this.default_config; + } + + this.read = function() {}; + this.write = function() {}; + this.init = init; +} +/* OpenPGP radix-64/base64 string encoding/decoding + * Copyright 2005 Herbert Hanewinkel, www.haneWIN.de + * version 1.0, check www.haneWIN.de for the latest version + * + * This software is provided as-is, without express or implied warranty. + * Permission to use, copy, modify, distribute or sell this software, with or + * without fee, for any purpose and by any individual or organization, is hereby + * granted, provided that the above copyright notice and this paragraph appear + * in all copies. Distribution as a part of an application or binary must + * include the above copyright notice in the documentation and/or other materials + * provided with the application or distribution. + */ + +var b64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + +function s2r(t) { + var a, c, n; + var r = '', l = 0, s = 0; + var tl = t.length; + + for (n = 0; n < tl; n++) { + c = t.charCodeAt(n); + if (s == 0) { + r += b64s.charAt((c >> 2) & 63); + a = (c & 3) << 4; + } else if (s == 1) { + r += b64s.charAt((a | (c >> 4) & 15)); + a = (c & 15) << 2; + } else if (s == 2) { + r += b64s.charAt(a | ((c >> 6) & 3)); + l += 1; + if ((l % 60) == 0) + r += "\n"; + r += b64s.charAt(c & 63); + } + l += 1; + if ((l % 60) == 0) + r += "\n"; + + s += 1; + if (s == 3) + s = 0; + } + if (s > 0) { + r += b64s.charAt(a); + l += 1; + if ((l % 60) == 0) + r += "\n"; + r += '='; + l += 1; + } + if (s == 1) { + if ((l % 60) == 0) + r += "\n"; + r += '='; + } + + return r; +} + +function r2s(t) { + var c, n; + var r = '', s = 0, a = 0; + var tl = t.length; + + for (n = 0; n < tl; n++) { + c = b64s.indexOf(t.charAt(n)); + if (c >= 0) { + if (s) + r += String.fromCharCode(a | (c >> (6 - s)) & 255); + s = (s + 2) & 7; + a = (c << s) & 255; + } + } + return r; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * DeArmor an OpenPGP armored message; verify the checksum and return + * the encoded bytes + * @param {String} text OpenPGP armored message + * @returns {(Boolean|Object)} Either false in case of an error + * or an object with attribute "text" containing the message text + * and an attribute "openpgp" containing the bytes. + */ +function openpgp_encoding_deArmor(text) { + text = text.replace(/\r/g, '') + // remove whitespace of blank line to allow later split at \n\n + text = text.replace(/\n\s+\n/, '\n\n'); + + var type = openpgp_encoding_get_type(text); + + if (type != 2) { + var splittedtext = text.split('-----'); + + var data = { + openpgp: openpgp_encoding_base64_decode( + splittedtext[2] + .split('\n\n')[1] + .split("\n=")[0] + .replace(/\n- /g,"\n")), + type: type + }; + + if (verifyCheckSum(data.openpgp, + splittedtext[2] + .split('\n\n')[1] + .split("\n=")[1] + .split('\n')[0])) + + return data; + else { + util.print_error("Ascii armor integrity check on message failed: '" + + splittedtext[2] + .split('\n\n')[1] + .split("\n=")[1] + .split('\n')[0] + + "' should be '" + + getCheckSum(data)) + "'"; + return false; + } + } else { + var splittedtext = text.split('-----'); + + var result = { + text: splittedtext[2] + .replace(/\n- /g,"\n") + .split("\n\n")[1], + openpgp: openpgp_encoding_base64_decode(splittedtext[4] + .split("\n\n")[1] + .split("\n=")[0]), + type: type + }; + + if (verifyCheckSum(result.openpgp, splittedtext[4] + .split("\n\n")[1] + .split("\n=")[1])) + + return result; + else { + util.print_error("Ascii armor integrity check on message failed"); + return false; + } + } +} + +/** + * Finds out which Ascii Armoring type is used. This is an internal function + * @param {String} text [String] ascii armored text + * @returns {Integer} 0 = MESSAGE PART n of m + * 1 = MESSAGE PART n + * 2 = SIGNED MESSAGE + * 3 = PGP MESSAGE + * 4 = PUBLIC KEY BLOCK + * 5 = PRIVATE KEY BLOCK + * null = unknown + */ +function openpgp_encoding_get_type(text) { + var splittedtext = text.split('-----'); + // BEGIN PGP MESSAGE, PART X/Y + // Used for multi-part messages, where the armor is split amongst Y + // parts, and this is the Xth part out of Y. + if (splittedtext[1].match(/BEGIN PGP MESSAGE, PART \d+\/\d+/)) { + return 0; + } else + // BEGIN PGP MESSAGE, PART X + // Used for multi-part messages, where this is the Xth part of an + // unspecified number of parts. Requires the MESSAGE-ID Armor + // Header to be used. + if (splittedtext[1].match(/BEGIN PGP MESSAGE, PART \d+/)) { + return 1; + + } else + // BEGIN PGP SIGNATURE + // Used for detached signatures, OpenPGP/MIME signatures, and + // cleartext signatures. Note that PGP 2.x uses BEGIN PGP MESSAGE + // for detached signatures. + if (splittedtext[1].match(/BEGIN PGP SIGNED MESSAGE/)) { + return 2; + + } else + // BEGIN PGP MESSAGE + // Used for signed, encrypted, or compressed files. + if (splittedtext[1].match(/BEGIN PGP MESSAGE/)) { + return 3; + + } else + // BEGIN PGP PUBLIC KEY BLOCK + // Used for armoring public keys. + if (splittedtext[1].match(/BEGIN PGP PUBLIC KEY BLOCK/)) { + return 4; + + } else + // BEGIN PGP PRIVATE KEY BLOCK + // Used for armoring private keys. + if (splittedtext[1].match(/BEGIN PGP PRIVATE KEY BLOCK/)) { + return 5; + } +} + +/** + * Add additional information to the armor version of an OpenPGP binary + * packet block. + * @author Alex + * @version 2011-12-16 + * @returns {String} The header information + */ +function openpgp_encoding_armor_addheader() { + var result = ""; + if (openpgp.config.config.show_version) { + result += "Version: "+openpgp.config.versionstring+'\r\n'; + } + if (openpgp.config.config.show_comment) { + result += "Comment: "+openpgp.config.commentstring+'\r\n'; + } + result += '\r\n'; + return result; +} + +/** + * Armor an OpenPGP binary packet block + * @param {Integer} messagetype type of the message + * @param data + * @param {Integer} partindex + * @param {Integer} parttotal + * @returns {String} Armored text + */ +function openpgp_encoding_armor(messagetype, data, partindex, parttotal) { + var result = ""; + switch(messagetype) { + case 0: + result += "-----BEGIN PGP MESSAGE, PART "+partindex+"/"+parttotal+"-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data); + result += "\r\n="+getCheckSum(data)+"\r\n"; + result += "-----END PGP MESSAGE, PART "+partindex+"/"+parttotal+"-----\r\n"; + break; + case 1: + result += "-----BEGIN PGP MESSAGE, PART "+partindex+"-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data); + result += "\r\n="+getCheckSum(data)+"\r\n"; + result += "-----END PGP MESSAGE, PART "+partindex+"-----\r\n"; + break; + case 2: + result += "\r\n-----BEGIN PGP SIGNED MESSAGE-----\r\nHash: "+data.hash+"\r\n\r\n"; + result += data.text.replace(/\n-/g,"\n- -"); + result += "\r\n-----BEGIN PGP SIGNATURE-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data.openpgp); + result += "\r\n="+getCheckSum(data.openpgp)+"\r\n"; + result += "-----END PGP SIGNATURE-----\r\n"; + break; + case 3: + result += "-----BEGIN PGP MESSAGE-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data); + result += "\r\n="+getCheckSum(data)+"\r\n"; + result += "-----END PGP MESSAGE-----\r\n"; + break; + case 4: + result += "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data); + result += "\r\n="+getCheckSum(data)+"\r\n"; + result += "-----END PGP PUBLIC KEY BLOCK-----\r\n\r\n"; + break; + case 5: + result += "-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n"; + result += openpgp_encoding_armor_addheader(); + result += openpgp_encoding_base64_encode(data); + result += "\r\n="+getCheckSum(data)+"\r\n"; + result += "-----END PGP PRIVATE KEY BLOCK-----\r\n"; + break; + } + + return result; +} + +/** + * Calculates a checksum over the given data and returns it base64 encoded + * @param {String} data Data to create a CRC-24 checksum for + * @return {String} Base64 encoded checksum + */ +function getCheckSum(data) { + var c = createcrc24(data); + var str = "" + String.fromCharCode(c >> 16)+ + String.fromCharCode((c >> 8) & 0xFF)+ + String.fromCharCode(c & 0xFF); + return openpgp_encoding_base64_encode(str); +} + +/** + * Calculates the checksum over the given data and compares it with the + * given base64 encoded checksum + * @param {String} data Data to create a CRC-24 checksum for + * @param {String} checksum Base64 encoded checksum + * @return {Boolean} True if the given checksum is correct; otherwise false + */ +function verifyCheckSum(data, checksum) { + var c = getCheckSum(data); + var d = checksum; + return c[0] == d[0] && c[1] == d[1] && c[2] == d[2]; +} +/** + * Internal function to calculate a CRC-24 checksum over a given string (data) + * @param {String} data Data to create a CRC-24 checksum for + * @return {Integer} The CRC-24 checksum as number + */ +var crc_table = [ +0x00000000, 0x00864cfb, 0x018ad50d, 0x010c99f6, 0x0393e6e1, 0x0315aa1a, 0x021933ec, 0x029f7f17, 0x07a18139, 0x0727cdc2, 0x062b5434, 0x06ad18cf, 0x043267d8, 0x04b42b23, 0x05b8b2d5, 0x053efe2e, 0x0fc54e89, 0x0f430272, 0x0e4f9b84, 0x0ec9d77f, 0x0c56a868, 0x0cd0e493, 0x0ddc7d65, 0x0d5a319e, 0x0864cfb0, 0x08e2834b, 0x09ee1abd, 0x09685646, 0x0bf72951, 0x0b7165aa, 0x0a7dfc5c, 0x0afbb0a7, 0x1f0cd1e9, 0x1f8a9d12, 0x1e8604e4, 0x1e00481f, 0x1c9f3708, 0x1c197bf3, 0x1d15e205, 0x1d93aefe, 0x18ad50d0, 0x182b1c2b, 0x192785dd, 0x19a1c926, 0x1b3eb631, 0x1bb8faca, 0x1ab4633c, 0x1a322fc7, 0x10c99f60, 0x104fd39b, 0x11434a6d, 0x11c50696, 0x135a7981, 0x13dc357a, 0x12d0ac8c, 0x1256e077, 0x17681e59, 0x17ee52a2, 0x16e2cb54, 0x166487af, 0x14fbf8b8, 0x147db443, 0x15712db5, 0x15f7614e, 0x3e19a3d2, 0x3e9fef29, 0x3f9376df, 0x3f153a24, 0x3d8a4533, 0x3d0c09c8, 0x3c00903e, 0x3c86dcc5, 0x39b822eb, 0x393e6e10, 0x3832f7e6, 0x38b4bb1d, 0x3a2bc40a, 0x3aad88f1, 0x3ba11107, 0x3b275dfc, 0x31dced5b, 0x315aa1a0, +0x30563856, 0x30d074ad, 0x324f0bba, 0x32c94741, 0x33c5deb7, 0x3343924c, 0x367d6c62, 0x36fb2099, 0x37f7b96f, 0x3771f594, 0x35ee8a83, 0x3568c678, 0x34645f8e, 0x34e21375, 0x2115723b, 0x21933ec0, 0x209fa736, 0x2019ebcd, 0x228694da, 0x2200d821, 0x230c41d7, 0x238a0d2c, 0x26b4f302, 0x2632bff9, 0x273e260f, 0x27b86af4, 0x252715e3, 0x25a15918, 0x24adc0ee, 0x242b8c15, 0x2ed03cb2, 0x2e567049, 0x2f5ae9bf, 0x2fdca544, 0x2d43da53, 0x2dc596a8, 0x2cc90f5e, 0x2c4f43a5, 0x2971bd8b, 0x29f7f170, 0x28fb6886, 0x287d247d, 0x2ae25b6a, 0x2a641791, 0x2b688e67, 0x2beec29c, 0x7c3347a4, 0x7cb50b5f, 0x7db992a9, 0x7d3fde52, 0x7fa0a145, 0x7f26edbe, 0x7e2a7448, 0x7eac38b3, 0x7b92c69d, 0x7b148a66, 0x7a181390, 0x7a9e5f6b, 0x7801207c, 0x78876c87, 0x798bf571, 0x790db98a, 0x73f6092d, 0x737045d6, 0x727cdc20, 0x72fa90db, 0x7065efcc, 0x70e3a337, 0x71ef3ac1, 0x7169763a, 0x74578814, 0x74d1c4ef, 0x75dd5d19, 0x755b11e2, 0x77c46ef5, 0x7742220e, 0x764ebbf8, 0x76c8f703, 0x633f964d, 0x63b9dab6, 0x62b54340, 0x62330fbb, +0x60ac70ac, 0x602a3c57, 0x6126a5a1, 0x61a0e95a, 0x649e1774, 0x64185b8f, 0x6514c279, 0x65928e82, 0x670df195, 0x678bbd6e, 0x66872498, 0x66016863, 0x6cfad8c4, 0x6c7c943f, 0x6d700dc9, 0x6df64132, 0x6f693e25, 0x6fef72de, 0x6ee3eb28, 0x6e65a7d3, 0x6b5b59fd, 0x6bdd1506, 0x6ad18cf0, 0x6a57c00b, 0x68c8bf1c, 0x684ef3e7, 0x69426a11, 0x69c426ea, 0x422ae476, 0x42aca88d, 0x43a0317b, 0x43267d80, 0x41b90297, 0x413f4e6c, 0x4033d79a, 0x40b59b61, 0x458b654f, 0x450d29b4, 0x4401b042, 0x4487fcb9, 0x461883ae, 0x469ecf55, 0x479256a3, 0x47141a58, 0x4defaaff, 0x4d69e604, 0x4c657ff2, 0x4ce33309, 0x4e7c4c1e, 0x4efa00e5, 0x4ff69913, 0x4f70d5e8, 0x4a4e2bc6, 0x4ac8673d, 0x4bc4fecb, 0x4b42b230, 0x49ddcd27, 0x495b81dc, 0x4857182a, 0x48d154d1, 0x5d26359f, 0x5da07964, 0x5cace092, 0x5c2aac69, 0x5eb5d37e, 0x5e339f85, 0x5f3f0673, 0x5fb94a88, 0x5a87b4a6, 0x5a01f85d, 0x5b0d61ab, 0x5b8b2d50, 0x59145247, 0x59921ebc, 0x589e874a, 0x5818cbb1, 0x52e37b16, 0x526537ed, 0x5369ae1b, 0x53efe2e0, 0x51709df7, 0x51f6d10c, +0x50fa48fa, 0x507c0401, 0x5542fa2f, 0x55c4b6d4, 0x54c82f22, 0x544e63d9, 0x56d11cce, 0x56575035, 0x575bc9c3, 0x57dd8538]; + +function createcrc24(input) { + var crc = 0xB704CE; + var index = 0; + + while((input.length - index) > 16) { + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+1)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+2)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+3)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+4)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+5)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+6)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+7)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+8)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+9)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+10)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+11)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+12)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+13)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+14)) & 0xff]; + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index+15)) & 0xff]; + index += 16; + } + + for(var j = index; j < input.length; j++) { + crc = (crc << 8) ^ crc_table[((crc >> 16) ^ input.charCodeAt(index++)) & 0xff] + } + return crc & 0xffffff; +} + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * Wrapper function for the base64 codec. + * This function encodes a String (message) in base64 (radix-64) + * @param {String} message The message to encode + * @return {String} The base64 encoded data + */ +function openpgp_encoding_base64_encode(message) { + return s2r(message); +} + + +/** + * Wrapper function for the base64 codec. + * This function decodes a String(message) in base64 (radix-64) + * @param {String} message Base64 encoded data + * @return {String} Raw data after decoding + */ +function openpgp_encoding_base64_decode(message) { + return r2s(message); +} + +/** + * Wrapper function for jquery library. + * This function escapes HTML characters within a string. This is used + * to prevent XSS. + * @param {String} message Message to escape + * @return {String} Html encoded string + */ +function openpgp_encoding_html_encode(message) { + if (message == null) + return ""; + return $('
    ').text(message).html(); +} + +/** + * create a EME-PKCS1-v1_5 padding (See RFC4880 13.1.1) + * @param {String} message message to be padded + * @param {Integer} length Length to the resulting message + * @return {String} EME-PKCS1 padded message + */ +function openpgp_encoding_eme_pkcs1_encode(message, length) { + if (message.length > length-11) + return -1; + var result = ""; + result += String.fromCharCode(0); + result += String.fromCharCode(2); + for (var i = 0; i < length - message.length - 3; i++) { + result += String.fromCharCode(openpgp_crypto_getPseudoRandom(1,255)); + } + result += String.fromCharCode(0); + result += message; + return result; +} + +/** + * decodes a EME-PKCS1-v1_5 padding (See RFC4880 13.1.2) + * @param {String} message EME-PKCS1 padded message + * @return {String} decoded message + */ +function openpgp_encoding_eme_pkcs1_decode(message, len) { + if (message.length < len) + message = String.fromCharCode(0)+message; + if (message.length < 12 || message.charCodeAt(0) != 0 || message.charCodeAt(1) != 2) + return -1; + var i = 2; + while (message.charCodeAt(i) != 0 && message.length > i) + i++; + return message.substring(i+1, message.length); +} +/** + * ASN1 object identifiers for hashes (See RFC4880 5.2.2) + */ +hash_headers = new Array(); +hash_headers[1] = [0x30,0x20,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x04,0x10]; +hash_headers[3] = [0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x24,0x03,0x02,0x01,0x05,0x00,0x04,0x14]; +hash_headers[2] = [0x30,0x21,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05,0x00,0x04,0x14]; +hash_headers[8] = [0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20]; +hash_headers[9] = [0x30,0x41,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02,0x05,0x00,0x04,0x30]; +hash_headers[10] = [0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0x04,0x40]; +hash_headers[11] = [0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04,0x05,0x00,0x04,0x1C]; + +/** + * create a EMSA-PKCS1-v1_5 padding (See RFC4880 13.1.3) + * @param {Integer} algo Hash algorithm type used + * @param {String} data Data to be hashed + * @param {Integer} keylength Key size of the public mpi in bytes + * @returns {String} Hashcode with pkcs1padding as string + */ +function openpgp_encoding_emsa_pkcs1_encode(algo, data, keylength) { + var data2 = ""; + data2 += String.fromCharCode(0x00); + data2 += String.fromCharCode(0x01); + for (var i = 0; i < (keylength - hash_headers[algo].length - 3 - openpgp_crypto_getHashByteLength(algo)); i++) + data2 += String.fromCharCode(0xff); + data2 += String.fromCharCode(0x00); + + for (var i = 0; i < hash_headers[algo].length; i++) + data2 += String.fromCharCode(hash_headers[algo][i]); + + data2 += openpgp_crypto_hashData(algo, data); + return new BigInteger(util.hexstrdump(data2),16); +} + +/** + * extract the hash out of an EMSA-PKCS1-v1.5 padding (See RFC4880 13.1.3) + * @param {String} data Hash in pkcs1 encoding + * @returns {String} The hash as string + */ +function openpgp_encoding_emsa_pkcs1_decode(algo, data) { + var i = 0; + if (data.charCodeAt(0) == 0) i++; + else if (data.charCodeAt(0) != 1) return -1; + else i++; + + while (data.charCodeAt(i) == 0xFF) i++; + if (data.charCodeAt(i++) != 0) return -1; + var j = 0; + for (j = 0; j < hash_headers[algo].length && j+i < data.length; j++) { + if (data.charCodeAt(j+i) != hash_headers[algo][j]) return -1; + } + i+= j; + if (data.substring(i).length < openpgp_crypto_getHashByteLength(algo)) return -1; + return data.substring(i); +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @fileoverview The openpgp base class should provide all of the functionality + * to consume the openpgp.js library. All additional classes are documented + * for extending and developing on top of the base library. + */ + +/** + * GPG4Browsers Core interface. A single instance is hold + * from the beginning. To use this library call "openpgp.init()" + * @alias openpgp + * @class + * @classdesc Main Openpgp.js class. Use this to initiate and make all calls to this library. + */ +function _openpgp () { + this.tostring = ""; + + /** + * initializes the library: + * - reading the keyring from local storage + * - reading the config from local storage + */ + function init() { + this.config = new openpgp_config(); + this.config.init(); + this.keyring = new openpgp_keyring(); + this.keyring.init(); + } + + /** + * reads several publicKey objects from a ascii armored + * representation an returns openpgp_msg_publickey packets + * @param {String} armoredText OpenPGP armored text containing + * the public key(s) + * @return {openpgp_msg_publickey[]} on error the function + * returns null + */ + function read_publicKey(armoredText) { + var mypos = 0; + var publicKeys = new Array(); + var publicKeyCount = 0; + var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var l = input.length; + while (mypos != input.length) { + var first_packet = openpgp_packet.read_packet(input, mypos, l); + // public key parser + if (input[mypos].charCodeAt() == 0x99 || first_packet.tagType == 6) { + publicKeys[publicKeyCount] = new openpgp_msg_publickey(); + publicKeys[publicKeyCount].header = input.substring(mypos,mypos+3); + if (input[mypos].charCodeAt() == 0x99) { + // parse the length and read a tag6 packet + mypos++; + var l = (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + publicKeys[publicKeyCount].publicKeyPacket = new openpgp_packet_keymaterial(); + publicKeys[publicKeyCount].publicKeyPacket.header = publicKeys[publicKeyCount].header; + publicKeys[publicKeyCount].publicKeyPacket.read_tag6(input, mypos, l); + mypos += publicKeys[publicKeyCount].publicKeyPacket.packetLength; + mypos += publicKeys[publicKeyCount].read_nodes(publicKeys[publicKeyCount].publicKeyPacket, input, mypos, (input.length - mypos)); + } else { + publicKeys[publicKeyCount] = new openpgp_msg_publickey(); + publicKeys[publicKeyCount].publicKeyPacket = first_packet; + mypos += first_packet.headerLength+first_packet.packetLength; + mypos += publicKeys[publicKeyCount].read_nodes(first_packet, input, mypos, input.length -mypos); + } + } else { + util.print_error("no public key found!"); + return null; + } + publicKeys[publicKeyCount].data = input.substring(0,mypos); + publicKeyCount++; + } + return publicKeys; + } + + /** + * reads several privateKey objects from a ascii armored + * representation an returns openpgp_msg_privatekey objects + * @param {String} armoredText OpenPGP armored text containing + * the private key(s) + * @return {openpgp_msg_privatekey[]} on error the function + * returns null + */ + function read_privateKey(armoredText) { + var privateKeys = new Array(); + var privateKeyCount = 0; + var mypos = 0; + var input = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')).openpgp; + var l = input.length; + while (mypos != input.length) { + var first_packet = openpgp_packet.read_packet(input, mypos, l); + if (first_packet.tagType == 5) { + privateKeys[privateKeys.length] = new openpgp_msg_privatekey(); + mypos += first_packet.headerLength+first_packet.packetLength; + mypos += privateKeys[privateKeyCount].read_nodes(first_packet, input, mypos, l); + // other blocks + } else { + util.print_error('no block packet found!'); + return null; + } + privateKeys[privateKeyCount].data = input.substring(0,mypos); + privateKeyCount++; + } + return privateKeys; + } + + /** + * reads message packets out of an OpenPGP armored text and + * returns an array of message objects + * @param {String} armoredText text to be parsed + * @return {openpgp_msg_message[]} on error the function + * returns null + */ + function read_message(armoredText) { + var dearmored; + try{ + dearmored = openpgp_encoding_deArmor(armoredText.replace(/\r/g,'')); + } + catch(e){ + util.print_error('no message found!'); + return null; + } + return read_messages_dearmored(dearmored); + } + + /** + * reads message packets out of an OpenPGP armored text and + * returns an array of message objects. Can be called externally or internally. + * External call will parse a de-armored messaged and return messages found. + * Internal will be called to read packets wrapped in other packets (i.e. compressed) + * @param {String} input dearmored text of OpenPGP packets, to be parsed + * @return {openpgp_msg_message[]} on error the function + * returns null + */ + function read_messages_dearmored(input){ + var messageString = input.openpgp; + var signatureText = input.text; //text to verify signatures against. Modified by Tag11. + var messages = new Array(); + var messageCount = 0; + var mypos = 0; + var l = messageString.length; + while (mypos < messageString.length) { + var first_packet = openpgp_packet.read_packet(messageString, mypos, l); + if (!first_packet) { + break; + } + // public key parser (definition from the standard:) + // OpenPGP Message :- Encrypted Message | Signed Message | + // Compressed Message | Literal Message. + // Compressed Message :- Compressed Data Packet. + // + // Literal Message :- Literal Data Packet. + // + // ESK :- Public-Key Encrypted Session Key Packet | + // Symmetric-Key Encrypted Session Key Packet. + // + // ESK Sequence :- ESK | ESK Sequence, ESK. + // + // Encrypted Data :- Symmetrically Encrypted Data Packet | + // Symmetrically Encrypted Integrity Protected Data Packet + // + // Encrypted Message :- Encrypted Data | ESK Sequence, Encrypted Data. + // + // One-Pass Signed Message :- One-Pass Signature Packet, + // OpenPGP Message, Corresponding Signature Packet. + + // Signed Message :- Signature Packet, OpenPGP Message | + // One-Pass Signed Message. + if (first_packet.tagType == 1 || + (first_packet.tagType == 2 && first_packet.signatureType < 16) || + first_packet.tagType == 3 || + first_packet.tagType == 4 || + first_packet.tagType == 8 || + first_packet.tagType == 9 || + first_packet.tagType == 10 || + first_packet.tagType == 11 || + first_packet.tagType == 18 || + first_packet.tagType == 19) { + messages[messages.length] = new openpgp_msg_message(); + messages[messageCount].messagePacket = first_packet; + messages[messageCount].type = input.type; + // Encrypted Message + if (first_packet.tagType == 9 || + first_packet.tagType == 1 || + first_packet.tagType == 3 || + first_packet.tagType == 18) { + if (first_packet.tagType == 9) { + util.print_error("unexpected openpgp packet"); + break; + } else if (first_packet.tagType == 1) { + util.print_debug("session key found:\n "+first_packet.toString()); + var issessionkey = true; + messages[messageCount].sessionKeys = new Array(); + var sessionKeyCount = 0; + while (issessionkey) { + messages[messageCount].sessionKeys[sessionKeyCount] = first_packet; + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + first_packet = openpgp_packet.read_packet(messageString, mypos, l); + + if (first_packet.tagType != 1 && first_packet.tagType != 3) + issessionkey = false; + sessionKeyCount++; + } + if (first_packet.tagType == 18 || first_packet.tagType == 9) { + util.print_debug("encrypted data found:\n "+first_packet.toString()); + messages[messageCount].encryptedData = first_packet; + mypos += first_packet.packetLength+first_packet.headerLength; + l -= (first_packet.packetLength+first_packet.headerLength); + messageCount++; + + } else { + util.print_debug("something is wrong: "+first_packet.tagType); + } + + } else if (first_packet.tagType == 18) { + util.print_debug("symmetric encrypted data"); + break; + } + } else + if (first_packet.tagType == 2 && first_packet.signatureType < 3) { + // Signed Message + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + messages[messageCount].text = signatureText; + messages[messageCount].signature = first_packet; + messageCount++; + } else + // Signed Message + if (first_packet.tagType == 4) { + //TODO: Implement check + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + } else + if (first_packet.tagType == 8) { + // Compressed Message + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + var decompressedText = first_packet.decompress(); + messages = messages.concat(openpgp.read_messages_dearmored({text: decompressedText, openpgp: decompressedText})); + } else + // Marker Packet (Obsolete Literal Packet) (Tag 10) + // "Such a packet MUST be ignored when received." see http://tools.ietf.org/html/rfc4880#section-5.8 + if (first_packet.tagType == 10) { + // reset messages + messages.length = 0; + // continue with next packet + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + } else + if (first_packet.tagType == 11) { + // Literal Message -- work is already done in read_packet + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + signatureText = first_packet.data; + messages[messageCount].data = first_packet.data; + messageCount++; + } else + if (first_packet.tagType == 19) { + // Modification Detect Code + mypos += first_packet.packetLength + first_packet.headerLength; + l -= (first_packet.packetLength + first_packet.headerLength); + } + } else { + util.print_error('no message found!'); + return null; + } + } + + return messages; + } + + /** + * creates a binary string representation of an encrypted and signed message. + * The message will be encrypted with the public keys specified and signed + * with the specified private key. + * @param {Object} privatekey {obj: [openpgp_msg_privatekey]} Private key + * to be used to sign the message + * @param {Object[]} publickeys An arraf of {obj: [openpgp_msg_publickey]} + * - public keys to be used to encrypt the message + * @param {String} messagetext message text to encrypt and sign + * @return {String} a binary string representation of the message which + * can be OpenPGP armored + */ + function write_signed_and_encrypted_message(privatekey, publickeys, messagetext) { + var result = ""; + var literal = new openpgp_packet_literaldata().write_packet(messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n")); + util.print_debug_hexstr_dump("literal_packet: |"+literal+"|\n",literal); + for (var i = 0; i < publickeys.length; i++) { + var onepasssignature = new openpgp_packet_onepasssignature(); + var onepasssigstr = ""; + if (i == 0) + onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); + else + onepasssigstr = onepasssignature.write_packet(1, openpgp.config.config.prefer_hash_algorithm, privatekey, false); + util.print_debug_hexstr_dump("onepasssigstr: |"+onepasssigstr+"|\n",onepasssigstr); + var datasignature = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"), privatekey); + util.print_debug_hexstr_dump("datasignature: |"+datasignature.openpgp+"|\n",datasignature.openpgp); + if (i == 0) { + result = onepasssigstr+literal+datasignature.openpgp; + } else { + result = onepasssigstr+result+datasignature.openpgp; + } + } + + util.print_debug_hexstr_dump("signed packet: |"+result+"|\n",result); + // signatures done.. now encryption + var sessionkey = openpgp_crypto_generateSessionKey(openpgp.config.config.encryption_cipher); + var result2 = ""; + + // creating session keys for each recipient + for (var i = 0; i < publickeys.length; i++) { + var pkey = publickeys[i].getEncryptionKey(); + if (pkey == null) { + util.print_error("no encryption key found! Key is for signing only."); + return null; + } + result2 += new openpgp_packet_encryptedsessionkey(). + write_pub_key_packet( + pkey.getKeyId(), + pkey.MPIs, + pkey.publicKeyAlgorithm, + openpgp.config.config.encryption_cipher, + sessionkey); + } + if (openpgp.config.config.integrity_protect) { + result2 += new openpgp_packet_encryptedintegrityprotecteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); + } else { + result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); + } + return openpgp_encoding_armor(3,result2,null,null); + } + /** + * creates a binary string representation of an encrypted message. + * The message will be encrypted with the public keys specified + * @param {Object[]} publickeys An array of {obj: [openpgp_msg_publickey]} + * -public keys to be used to encrypt the message + * @param {String} messagetext message text to encrypt + * @return {String} a binary string representation of the message + * which can be OpenPGP armored + */ + function write_encrypted_message(publickeys, messagetext) { + var result = ""; + var literal = new openpgp_packet_literaldata().write_packet(messagetext.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n")); + util.print_debug_hexstr_dump("literal_packet: |"+literal+"|\n",literal); + result = literal; + + // signatures done.. now encryption + var sessionkey = openpgp_crypto_generateSessionKey(openpgp.config.config.encryption_cipher); + var result2 = ""; + + // creating session keys for each recipient + for (var i = 0; i < publickeys.length; i++) { + var pkey = publickeys[i].getEncryptionKey(); + if (pkey == null) { + util.print_error("no encryption key found! Key is for signing only."); + return null; + } + result2 += new openpgp_packet_encryptedsessionkey(). + write_pub_key_packet( + pkey.getKeyId(), + pkey.MPIs, + pkey.publicKeyAlgorithm, + openpgp.config.config.encryption_cipher, + sessionkey); + } + if (openpgp.config.config.integrity_protect) { + result2 += new openpgp_packet_encryptedintegrityprotecteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); + } else { + result2 += new openpgp_packet_encrypteddata().write_packet(openpgp.config.config.encryption_cipher, sessionkey, result); + } + return openpgp_encoding_armor(3,result2,null,null); + } + + /** + * creates a binary string representation a signed message. + * The message will be signed with the specified private key. + * @param {Object} privatekey {obj: [openpgp_msg_privatekey]} + * - the private key to be used to sign the message + * @param {String} messagetext message text to sign + * @return {Object} {Object: text [String]}, openpgp: {String} a binary + * string representation of the message which can be OpenPGP + * armored(openpgp) and a text representation of the message (text). + * This can be directly used to OpenPGP armor the message + */ + function write_signed_message(privatekey, messagetext) { + var sig = new openpgp_packet_signature().write_message_signature(1, messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), privatekey); + var result = {text: messagetext.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"), openpgp: sig.openpgp, hash: sig.hash}; + return openpgp_encoding_armor(2,result, null, null) + } + + /** + * generates a new key pair for openpgp. Beta stage. Currently only + * supports RSA keys, and no subkeys. + * @param {Integer} keyType to indicate what type of key to make. + * RSA is 1. Follows algorithms outlined in OpenPGP. + * @param {Integer} numBits number of bits for the key creation. (should + * be 1024+, generally) + * @param {String} userId assumes already in form of "User Name + * " + * @param {String} passphrase The passphrase used to encrypt the resulting private key + * @return {Object} {privateKey: [openpgp_msg_privatekey], + * privateKeyArmored: [string], publicKeyArmored: [string]} + */ + function generate_key_pair(keyType, numBits, userId, passphrase){ + var userIdPacket = new openpgp_packet_userid(); + var userIdString = userIdPacket.write_packet(userId); + + var keyPair = openpgp_crypto_generateKeyPair(keyType,numBits, passphrase, openpgp.config.config.prefer_hash_algorithm, 3); + var privKeyString = keyPair.privateKey; + var privKeyPacket = new openpgp_packet_keymaterial().read_priv_key(privKeyString.string,3,privKeyString.string.length); + if(!privKeyPacket.decryptSecretMPIs(passphrase)) + util.print_error('Issue creating key. Unable to read resulting private key'); + var privKey = new openpgp_msg_privatekey(); + privKey.privateKeyPacket = privKeyPacket; + privKey.getPreferredSignatureHashAlgorithm = function(){return openpgp.config.config.prefer_hash_algorithm};//need to override this to solve catch 22 to generate signature. 8 is value for SHA256 + + var publicKeyString = privKey.privateKeyPacket.publicKey.data; + userId = util.encode_utf8(userId); // needs same encoding as in userIdString + var hashData = String.fromCharCode(0x99)+ String.fromCharCode(((publicKeyString.length) >> 8) & 0xFF) + + String.fromCharCode((publicKeyString.length) & 0xFF) +publicKeyString+String.fromCharCode(0xB4) + + String.fromCharCode((userId.length) >> 24) +String.fromCharCode(((userId.length) >> 16) & 0xFF) + + String.fromCharCode(((userId.length) >> 8) & 0xFF) + String.fromCharCode((userId.length) & 0xFF) + userId + var signature = new openpgp_packet_signature(); + signature = signature.write_message_signature(16,hashData, privKey); + var publicArmored = openpgp_encoding_armor(4, keyPair.publicKey.string + userIdString + signature.openpgp ); + + var privArmored = openpgp_encoding_armor(5,privKeyString.string+userIdString+signature.openpgp); + + return {privateKey : privKey, privateKeyArmored: privArmored, publicKeyArmored: publicArmored} + } + + this.generate_key_pair = generate_key_pair; + this.write_signed_message = write_signed_message; + this.write_signed_and_encrypted_message = write_signed_and_encrypted_message; + this.write_encrypted_message = write_encrypted_message; + this.read_message = read_message; + this.read_messages_dearmored = read_messages_dearmored; + this.read_publicKey = read_publicKey; + this.read_privateKey = read_privateKey; + this.init = init; +} + +var openpgp = new _openpgp(); + + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc The class that deals with storage of the keyring. Currently the only option is to use HTML5 local storage. + */ +function openpgp_keyring() { + + /** + * Initialization routine for the keyring. This method reads the + * keyring from HTML5 local storage and initializes this instance. + * This method is called by openpgp.init(). + */ + function init() { +// var sprivatekeys = JSON.parse(window.localStorage.getItem("privatekeys")); +// var spublickeys = JSON.parse(window.localStorage.getItem("publickeys")); + var sprivatekeys = null; + var spublickeys = null; + + if (sprivatekeys == null || sprivatekeys.length == 0) { + sprivatekeys = new Array(); + } + + if (spublickeys == null || spublickeys.length == 0) { + spublickeys = new Array(); + } + this.publicKeys = new Array(); + this.privateKeys = new Array(); + var k = 0; + for (var i =0; i < sprivatekeys.length; i++) { + var r = openpgp.read_privateKey(sprivatekeys[i]); + this.privateKeys[k] = { armored: sprivatekeys[i], obj: r[0], keyId: r[0].getKeyId()}; + k++; + } + k = 0; + for (var i =0; i < spublickeys.length; i++) { + var r = openpgp.read_publicKey(spublickeys[i]); + if (r[0] != null) { + this.publicKeys[k] = { armored: spublickeys[i], obj: r[0], keyId: r[0].getKeyId()}; + k++; + } + } + } + this.init = init; + + /** + * Checks if at least one private key is in the keyring + * @return {Boolean} True if there are private keys, else false. + */ + function hasPrivateKey() { + return this.privateKeys.length > 0; + } + this.hasPrivateKey = hasPrivateKey; + + /** + * Saves the current state of the keyring to HTML5 local storage. + * The privateKeys array and publicKeys array gets Stringified using JSON + */ + function store() { + var priv = new Array(); + for (var i = 0; i < this.privateKeys.length; i++) { + priv[i] = this.privateKeys[i].armored; + } + var pub = new Array(); + for (var i = 0; i < this.publicKeys.length; i++) { + pub[i] = this.publicKeys[i].armored; + } + window.localStorage.setItem("privatekeys",JSON.stringify(priv)); + window.localStorage.setItem("publickeys",JSON.stringify(pub)); + } + this.store = function () {}; + /** + * searches all public keys in the keyring matching the address or address part of the user ids + * @param {String} email_address + * @return {openpgp_msg_publickey[]} The public keys associated with provided email address. + */ + function getPublicKeyForAddress(email_address) { + var results = new Array(); + var spl = email_address.split("<"); + var email = ""; + if (spl.length > 1) { + email = spl[1].split(">")[0]; + } else { + email = email_address.trim(); + } + email = email.toLowerCase(); + if(!util.emailRegEx.test(email)){ + return results; + } + for (var i =0; i < this.publicKeys.length; i++) { + for (var j = 0; j < this.publicKeys[i].obj.userIds.length; j++) { + if (this.publicKeys[i].obj.userIds[j].text.toLowerCase().indexOf(email) >= 0) + results[results.length] = this.publicKeys[i]; + } + } + return results; + } + this.getPublicKeyForAddress = getPublicKeyForAddress; + + /** + * Searches the keyring for a private key containing the specified email address + * @param {String} email_address email address to search for + * @return {openpgp_msg_privatekey[]} private keys found + */ + function getPrivateKeyForAddress(email_address) { + var results = new Array(); + var spl = email_address.split("<"); + var email = ""; + if (spl.length > 1) { + email = spl[1].split(">")[0]; + } else { + email = email_address.trim(); + } + email = email.toLowerCase(); + if(!util.emailRegEx.test(email)){ + return results; + } + for (var i =0; i < this.privateKeys.length; i++) { + for (var j = 0; j < this.privateKeys[i].obj.userIds.length; j++) { + if (this.privateKeys[i].obj.userIds[j].text.toLowerCase().indexOf(email) >= 0) + results[results.length] = this.privateKeys[i]; + } + } + return results; + } + + this.getPrivateKeyForAddress = getPrivateKeyForAddress; + /** + * Searches the keyring for public keys having the specified key id + * @param {String} keyId provided as string of hex number (lowercase) + * @return {openpgp_msg_privatekey[]} public keys found + */ + function getPublicKeysForKeyId(keyId) { + var result = new Array(); + for (var i=0; i < this.publicKeys.length; i++) { + var key = this.publicKeys[i]; + if (keyId == key.obj.getKeyId()) + result[result.length] = key; + else if (key.obj.subKeys != null) { + for (var j=0; j < key.obj.subKeys.length; j++) { + var subkey = key.obj.subKeys[j]; + if (keyId == subkey.getKeyId()) { + result[result.length] = { + obj: key.obj.getSubKeyAsKey(j), + keyId: subkey.getKeyId() + } + } + } + } + } + return result; + } + this.getPublicKeysForKeyId = getPublicKeysForKeyId; + + /** + * Searches the keyring for private keys having the specified key id + * @param {String} keyId 8 bytes as string containing the key id to look for + * @return {openpgp_msg_privatekey[]} private keys found + */ + function getPrivateKeyForKeyId(keyId) { + var result = new Array(); + for (var i=0; i < this.privateKeys.length; i++) { + if (keyId == this.privateKeys[i].obj.getKeyId()) { + result[result.length] = { key: this.privateKeys[i], keymaterial: this.privateKeys[i].obj.privateKeyPacket}; + } + if (this.privateKeys[i].obj.subKeys != null) { + var subkeyids = this.privateKeys[i].obj.getSubKeyIds(); + for (var j=0; j < subkeyids.length; j++) + if (keyId == util.hexstrdump(subkeyids[j])) { + result[result.length] = { key: this.privateKeys[i], keymaterial: this.privateKeys[i].obj.subKeys[j]}; + } + } + } + return result; + } + this.getPrivateKeyForKeyId = getPrivateKeyForKeyId; + + /** + * Imports a public key from an exported ascii armored message + * @param {String} armored_text PUBLIC KEY BLOCK message to read the public key from + */ + function importPublicKey (armored_text) { + var result = openpgp.read_publicKey(armored_text); + for (var i = 0; i < result.length; i++) { + this.publicKeys[this.publicKeys.length] = {armored: armored_text, obj: result[i], keyId: result[i].getKeyId()}; + } + return true; + } + + /** + * Imports a private key from an exported ascii armored message + * @param {String} armored_text PRIVATE KEY BLOCK message to read the private key from + */ + function importPrivateKey (armored_text, password) { + var result = openpgp.read_privateKey(armored_text); + if(!result[0].decryptSecretMPIs(password)) + return false; + for (var i = 0; i < result.length; i++) { + this.privateKeys[this.privateKeys.length] = {armored: armored_text, obj: result[i], keyId: result[i].getKeyId()}; + } + return true; + } + + this.importPublicKey = importPublicKey; + this.importPrivateKey = importPrivateKey; + + /** + * returns the openpgp_msg_privatekey representation of the public key at public key ring index + * @param {Integer} index the index of the public key within the publicKeys array + * @return {openpgp_msg_privatekey} the public key object + */ + function exportPublicKey(index) { + return this.publicKey[index]; + } + this.exportPublicKey = exportPublicKey; + + + /** + * Removes a public key from the public key keyring at the specified index + * @param {Integer} index the index of the public key within the publicKeys array + * @return {openpgp_msg_privatekey} The public key object which has been removed + */ + function removePublicKey(index) { + var removed = this.publicKeys.splice(index,1); + this.store(); + return removed; + } + this.removePublicKey = removePublicKey; + + /** + * returns the openpgp_msg_privatekey representation of the private key at private key ring index + * @param {Integer} index the index of the private key within the privateKeys array + * @return {openpgp_msg_privatekey} the private key object + */ + function exportPrivateKey(index) { + return this.privateKeys[index]; + } + this.exportPrivateKey = exportPrivateKey; + + /** + * Removes a private key from the private key keyring at the specified index + * @param {Integer} index the index of the private key within the privateKeys array + * @return {openpgp_msg_privatekey} The private key object which has been removed + */ + function removePrivateKey(index) { + var removed = this.privateKeys.splice(index,1); + this.store(); + return removed; + } + this.removePrivateKey = removePrivateKey; + +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @protected + * @class + * @classdesc Top-level message object. Contains information from one or more packets + */ + +function openpgp_msg_message() { + + // -1 = no valid passphrase submitted + // -2 = no private key found + // -3 = decryption error + // text = valid decryption + this.text = ""; + this.messagePacket = null; + this.type = null; + + /** + * Decrypts a message and generates user interface message out of the found. + * MDC will be verified as well as message signatures + * @param {openpgp_msg_privatekey} private_key the private the message is encrypted with (corresponding to the session key) + * @param {openpgp_packet_encryptedsessionkey} sessionkey the session key to be used to decrypt the message + * @return {String} plaintext of the message or null on error + */ + function decrypt(private_key, sessionkey) { + return this.decryptAndVerifySignature(private_key, sessionkey).text; + } + + /** + * Decrypts a message and generates user interface message out of the found. + * MDC will be verified as well as message signatures + * @param {openpgp_msg_privatekey} private_key the private the message is encrypted with (corresponding to the session key) + * @param {openpgp_packet_encryptedsessionkey} sessionkey the session key to be used to decrypt the message + * @param {openpgp_msg_publickey} pubkey Array of public keys to check signature against. If not provided, checks local keystore. + * @return {String} plaintext of the message or null on error + */ + function decryptAndVerifySignature(private_key, sessionkey, pubkey) { + if (private_key == null || sessionkey == null || sessionkey == "") + return null; + var decrypted = sessionkey.decrypt(this, private_key.keymaterial); + if (decrypted == null) + return null; + var packet; + var position = 0; + var len = decrypted.length; + var validSignatures = new Array(); + util.print_debug_hexstr_dump("openpgp.msg.messge decrypt:\n",decrypted); + + var messages = openpgp.read_messages_dearmored({text: decrypted, openpgp: decrypted}); + for(var m in messages){ + if(messages[m].data){ + this.text = messages[m].data; + } + if(messages[m].signature){ + validSignatures.push(messages[m].verifySignature(pubkey)); + } + } + return {text:this.text, validSignatures:validSignatures}; + } + + /** + * Verifies a message signature. This function can be called after read_message if the message was signed only. + * @param {openpgp_msg_publickey} pubkey Array of public keys to check signature against. If not provided, checks local keystore. + * @return {boolean} true if the signature was correct; otherwise false + */ + function verifySignature(pubkey) { + var result = false; + if (this.signature.tagType == 2) { + if(!pubkey || pubkey.length == 0){ + var pubkey; + if (this.signature.version == 4) { + pubkey = openpgp.keyring.getPublicKeysForKeyId(this.signature.issuerKeyId); + } else if (this.signature.version == 3) { + pubkey = openpgp.keyring.getPublicKeysForKeyId(this.signature.keyId); + } else { + util.print_error("unknown signature type on message!"); + return false; + } + } + if (pubkey.length == 0) + util.print_warning("Unable to verify signature of issuer: "+util.hexstrdump(this.signature.issuerKeyId)+". Public key not found in keyring."); + else { + for (var i = 0 ; i < pubkey.length; i++) { + var tohash = this.text.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"); + if (this.signature.verify(tohash, pubkey[i])) { + util.print_info("Found Good Signature from "+pubkey[i].obj.userIds[0].text+" (0x"+util.hexstrdump(pubkey[i].obj.getKeyId()).substring(8)+")"); + result = true; + } else { + util.print_error("Signature verification failed: Bad Signature from "+pubkey[i].obj.userIds[0].text+" (0x"+util.hexstrdump(pubkey[0].obj.getKeyId()).substring(8)+")"); + } + } + } + } + return result; + } + + function toString() { + var result = "Session Keys:\n"; + if (this.sessionKeys !=null) + for (var i = 0; i < this.sessionKeys.length; i++) { + result += this.sessionKeys[i].toString(); + } + result += "\n\n EncryptedData:\n"; + if(this.encryptedData != null) + result += this.encryptedData.toString(); + + result += "\n\n Signature:\n"; + if(this.signature != null) + result += this.signature.toString(); + + result += "\n\n Text:\n" + if(this.signature != null) + result += this.text; + return result; + } + this.decrypt = decrypt; + this.decryptAndVerifySignature = decryptAndVerifySignature; + this.verifySignature = verifySignature; + this.toString = toString; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Class that represents a decoded private key for internal openpgp.js use + */ + +function openpgp_msg_privatekey() { + this.subKeys = new Array(); + this.privateKeyPacket = null; + this.userIds = new Array(); + this.userAttributes = new Array(); + this.revocationSignatures = new Array(); + this.subKeys = new Array(); + + /** + * + * @return last position + */ + function read_nodes(parent_node, input, position, len) { + this.privateKeyPacket = parent_node; + + var pos = position; + while (input.length > pos) { + var result = openpgp_packet.read_packet(input, pos, input.length - pos); + if (result == null) { + util.print_error("openpgp.msg.messge decrypt:\n"+'[pub/priv_key]parsing ends here @:' + pos + " l:" + len); + break; + } else { + switch (result.tagType) { + case 2: // public key revocation signature + if (result.signatureType == 32) + this.revocationSignatures[this.revocationSignatures.length] = result; + else if (result.signatureType > 15 && result.signatureType < 20) { + if (this.certificationsignatures == null) + this.certificationSignatures = new Array(); + this.certificationSignatures[this.certificationSignatures.length] = result; + } else + util.print_error("openpgp.msg.messge decrypt:\n"+"unknown signature type directly on key "+result.signatureType+" @"+pos); + pos += result.packetLength + result.headerLength; + break; + case 7: // PrivateSubkey Packet + this.subKeys[this.subKeys.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.privateKeyPacket,input, pos, input.length - pos); + break; + case 17: // User Attribute Packet + this.userAttributes[this.userAttributes.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.privateKeyPacket,input, pos, input.length - pos); + break; + case 13: // User ID Packet + this.userIds[this.userIds.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.privateKeyPacket, input, pos, input.length - pos); + break; + default: + this.position = position - this.privateKeyPacket.packetLength - this.privateKeyPacket.headerLength; + this.len = pos - position; + return this.len; + } + } + } + this.position = position - this.privateKeyPacket.packetLength - this.privateKeyPacket.headerLength; + this.len = pos - position; + + return this.len; + } + + function getKeyId() { + return this.privateKeyPacket.publicKey.getKeyId(); + } + + + function getSubKeyIds() { + if (this.privateKeyPacket.publicKey.version == 4) // V3 keys MUST NOT have subkeys. + var result = new Array(); + for (var i = 0; i < this.subKeys.length; i++) { + result[i] = str_sha1(this.subKeys[i].publicKey.header+this.subKeys[i].publicKey.data).substring(12,20); + } + return result; + } + + + function getSigningKey() { + if ((this.privateKeyPacket.publicKey.publicKeyAlgorithm == 17 || + this.privateKeyPacket.publicKey.publicKeyAlgorithm != 2) + && this.privateKeyPacket.publicKey.verifyKey() == 3) + return this.privateKeyPacket; + else if (this.privateKeyPacket.publicKey.version == 4) // V3 keys MUST NOT have subkeys. + for (var j = 0; j < this.privateKeyPacket.subKeys.length; j++) { + if ((this.privateKeyPacket.subKeys[j].publicKey.publicKeyAlgorithm == 17 || + this.privateKeyPacket.subKeys[j].publicKey.publicKeyAlgorithm != 2) && + this.privateKeyPacket.subKeys[j].publicKey.verifyKey() == 3) + return this.privateKeyPacket.subKeys[j]; + } + return null; + } + + function getPreferredSignatureHashAlgorithm() { + var pkey = this.getSigningKey(); + if (pkey == null) { + util.print_error("private key is for encryption only! Cannot create a signature.") + return null; + } + if (pkey.publicKey.publicKeyAlgorithm == 17) { + var dsa = new DSA(); + return dsa.select_hash_algorithm(pkey.publicKey.MPIs[1].toBigInteger()); // q + } + //TODO implement: https://tools.ietf.org/html/rfc4880#section-5.2.3.8 + //separate private key preference from digest preferences + return openpgp.config.config.prefer_hash_algorithm; + + } + + function decryptSecretMPIs(str_passphrase) { + return this.privateKeyPacket.decryptSecretMPIs(str_passphrase); + } + + function getFingerprint() { + return this.privateKeyPacket.publicKey.getFingerprint(); + } + + // TODO need to implement this + function revoke() { + + } + + /** + * extracts the public key part + * @return {String} OpenPGP armored text containing the public key + * returns null if no sufficient data to extract public key + */ + function extractPublicKey() { + // add public key + var key = this.privateKeyPacket.publicKey.header + this.privateKeyPacket.publicKey.data; + for (var i = 0; i < this.userIds.length; i++) { + // verify userids + if (this.userIds[i].certificationSignatures.length === 0) { + util.print_error("extractPublicKey - missing certification signatures"); + return null; + } + var userIdPacket = new openpgp_packet_userid(); + // add userids + key += userIdPacket.write_packet(this.userIds[i].text); + for (var j = 0; j < this.userIds[i].certificationSignatures.length; j++) { + var certSig = this.userIds[i].certificationSignatures[j]; + // add signatures + key += openpgp_packet.write_packet_header(2, certSig.data.length) + certSig.data; + } + } + for (var k = 0; k < this.subKeys.length; k++) { + var pubSubKey = this.subKeys[k].publicKey; + // add public subkey package + key += openpgp_packet.write_old_packet_header(14, pubSubKey.data.length) + pubSubKey.data; + var subKeySig = this.subKeys[k].subKeySignature; + if (subKeySig !== null) { + // add subkey signature + key += openpgp_packet.write_packet_header(2, subKeySig.data.length) + subKeySig.data; + } else { + util.print_error("extractPublicKey - missing subkey signature"); + return null; + } + } + var publicArmored = openpgp_encoding_armor(4, key); + return publicArmored; + } + + this.extractPublicKey = extractPublicKey; + this.getSigningKey = getSigningKey; + this.getFingerprint = getFingerprint; + this.getPreferredSignatureHashAlgorithm = getPreferredSignatureHashAlgorithm; + this.read_nodes = read_nodes; + this.decryptSecretMPIs = decryptSecretMPIs; + this.getSubKeyIds = getSubKeyIds; + this.getKeyId = getKeyId; + +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Decoded public key object for internal openpgp.js use + */ +function openpgp_msg_publickey() { + this.data; + this.position; + this.len; + this.tostring = "OPENPGP PUBLIC KEY\n"; + this.bindingSignature = null; + this.publicKeyPacket = null; + this.userIds = new Array(); + this.userAttributes = new Array(); + this.revocationSignatures = new Array(); + this.subKeys = new Array(); + this.arbitraryPacket = new Array(); + this.directSignatures = new Array(); + /** + * + * @return last position + */ + function read_nodes(parent_node, input, position, len) { + this.publicKeyPacket = parent_node; + var exit = false; + var pos = position; + var l = len; + while (input.length != pos) { + var result = openpgp_packet.read_packet(input, pos, input.length - pos); + if (result == null) { + util.print_error("openpgp.msg.publickey read_nodes:\n"+'[pub_key]parsing ends here @:' + pos + " l:" + l); + break; + } else { + switch (result.tagType) { + case 2: // public key revocation signature + if (result.signatureType == 32) + this.revocationSignatures[this.revocationSignatures.length] = result; + else if (result.signatureType == 16 || result.signatureType == 17 || result.signatureType == 18 || result.signatureType == 19) + this.certificationSignature = result; + else if (result.signatureType == 25) { + this.bindingSignature = result; + } else if (result.signatureType == 31) { + this.directSignatures[this.directSignatures.length] = result; + } else + util.print_error("openpgp.msg.publickey read_nodes:\n"+"unknown signature type directly on key "+result.signatureType); + pos += result.packetLength + result.headerLength; + break; + case 14: // Public-Subkey Packet + this.subKeys[this.subKeys.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.publicKeyPacket,input, pos, input.length - pos); + break; + case 17: // User Attribute Packet + this.userAttributes[this.userAttributes.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.publicKeyPacket,input, pos, input.length - pos); + break; + case 13: // User ID Packet + this.userIds[this.userIds.length] = result; + pos += result.packetLength + result.headerLength; + pos += result.read_nodes(this.publicKeyPacket, input, pos, input.length - pos); + break; + default: + this.data = input; + this.position = position - this.publicKeyPacket.packetLength - this.publicKeyPacket.headerLength; + this.len = pos - position; + return this.len; + } + } + } + this.data = input; + this.position = position - (this.publicKeyPacket.packetLength - this.publicKeyPacket.headerLength); + this.len = pos - position; + return this.len; + } + + function write() { + + } + + function getKeyId() { + return this.publicKeyPacket.getKeyId(); + } + + function getFingerprint() { + return this.publicKeyPacket.getFingerprint(); + } + + + + function validate() { + // check revocation keys + for (var i = 0; i < this.revocationSignatures.length; i++) { + var tohash = this.publicKeyPacket.header+this.publicKeyPacket.data; + if (this.revocationSignatures[i].verify(tohash, this.publicKeyPacket)) + return false; + } + + if (this.subKeys.length != 0) { + // search for a valid subkey + var found = false; + for (var i = 0; i < this.subKeys.length; i++) + if (this.subKeys[i].verifyKey() == 3) { + found = true; + break; + } + if (!found) + return false; + } + // search for one valid userid + found = false; + for (var i = 0; i < this.userIds.length; i++) + if (this.userIds[i].verify(this.publicKeyPacket) == 0) { + found = true; + break; + } + if (!found) + return false; + return true; + } + + /** + * verifies all signatures + * @return a 2 dimensional array. the first dimension corresponds to the userids available + */ + function verifyCertificationSignatures() { + var result = new Array(); + for (var i = 0; i < this.userIds.length; i++) { + result[i] = this.userIds[i].verifyCertificationSignatures(this.publicKeyPacket); + } + return result; + } + this.verifyCertificationSignatures = verifyCertificationSignatures; + + /** + * verifies: + * - revocation certificates directly on key + * - self signatures + * - subkey binding and revocation certificates + * + * This is useful for validating the key + * @returns {Boolean} true if the basic signatures are all valid + */ + function verifyBasicSignatures() { + for (var i = 0; i < this.revocationSignatures.length; i++) { + var tohash = this.publicKeyPacket.header+this.publicKeyPacket.data; + if (this.revocationSignatures[i].verify(tohash, this.publicKeyPacket)) + return false; + } + + if (this.subKeys.length != 0) { + // search for a valid subkey + var found = false; + for (var i = 0; i < this.subKeys.length; i++) { + if (this.subKeys[i] == null) + continue; + var result = this.subKeys[i].verifyKey(); + if (result == 3) { + found = true; + break; + } + } + if (!found) + return false; + } + var keyId = this.getKeyId(); + for (var i = 0; i < this.userIds.length; i++) { + for (var j = 0; j < this.userIds[i].certificationRevocationSignatures.length; j++) { + if (this.userIds[i].certificationSignatures[j].getIssuer == keyId && + this.userIds[i].certificationSignatures[j].verifyBasic(this.publicKeyPacket) != 4) + return false; + } + } + return true; + } + + function toString() { + var result = " OPENPGP Public Key\n length: "+this.len+"\n"; + result += " Revocation Signatures:\n" + for (var i=0; i < this.revocationSignatures.length; i++) { + result += " "+this.revocationSignatures[i].toString(); + } + result += " User Ids:\n"; + for (var i=0; i < this.userIds.length; i++) { + result += " "+this.userIds[i].toString(); + } + result += " User Attributes:\n"; + for (var i=0; i < this.userAttributes.length; i++) { + result += " "+this.userAttributes[i].toString(); + } + result += " Public Key SubKeys:\n"; + for (var i=0; i < this.subKeys.length; i++) { + result += " "+this.subKeys[i].toString(); + } + return result; + } + + /** + * finds an encryption key for this public key + * @returns null if no encryption key has been found + */ + function getEncryptionKey() { + // V4: by convention subkeys are prefered for encryption service + // V3: keys MUST NOT have subkeys + for (var j = 0; j < this.subKeys.length; j++) + if (this.subKeys[j].publicKeyAlgorithm != 17 && + this.subKeys[j].publicKeyAlgorithm != 3 && + this.subKeys[j].verifyKey()) { + return this.subKeys[j]; + } + // if no valid subkey for encryption, use primary key + if (this.publicKeyPacket.publicKeyAlgorithm != 17 && this.publicKeyPacket.publicKeyAlgorithm != 3 + && this.publicKeyPacket.verifyKey()) { + return this.publicKeyPacket; + } + return null; + } + + function getSigningKey() { + if ((this.publicKeyPacket.publicKeyAlgorithm == 17 || + this.publicKeyPacket.publicKeyAlgorithm != 2)) + return this.publicKeyPacket; + else if (this.publicKeyPacket.version == 4) // V3 keys MUST NOT have subkeys. + for (var j = 0; j < this.subKeys.length; j++) { + if ((this.subKeys[j].publicKeyAlgorithm == 17 || + this.subKeys[j].publicKeyAlgorithm != 2) && + this.subKeys[j].verifyKey()) + return this.subKeys[j]; + } + return null; + } + + /* Returns the i-th subKey as a openpgp_msg_publickey object */ + function getSubKeyAsKey(i) { + var ret = new openpgp_msg_publickey(); + ret.userIds = this.userIds; + ret.userAttributes = this.userAttributes; + ret.publicKeyPacket = this.subKeys[i]; + return ret; + } + + this.getEncryptionKey = getEncryptionKey; + this.getSigningKey = getSigningKey; + this.read_nodes = read_nodes; + this.write = write; + this.toString = toString; + this.validate = validate; + this.getFingerprint = getFingerprint; + this.getKeyId = getKeyId; + this.verifyBasicSignatures = verifyBasicSignatures; + this.getSubKeyAsKey = getSubKeyAsKey; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Compressed Data Packet (Tag 8) + * + * RFC4880 5.6: + * The Compressed Data packet contains compressed data. Typically, this + * packet is found as the contents of an encrypted packet, or following + * a Signature or One-Pass Signature packet, and contains a literal data + * packet. + */ +function openpgp_packet_compressed() { + this.tagType = 8; + this.decompressedData = null; + + /** + * Parsing function for the packet. + * @param {String} input Payload of a tag 8 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_compressed} Object representation + */ + function read_packet (input, position, len) { + this.packetLength = len; + var mypos = position; + // One octet that gives the algorithm used to compress the packet. + this.type = input.charCodeAt(mypos++); + // Compressed data, which makes up the remainder of the packet. + this.compressedData = input.substring(position+1, position+len); + return this; + } + /** + * Decompression method for decompressing the compressed data + * read by read_packet + * @return {String} The decompressed data + */ + function decompress() { + if (this.decompressedData != null) + return this.decompressedData; + + if (this.type == null) + return null; + + switch (this.type) { + case 0: // - Uncompressed + this.decompressedData = this.compressedData; + break; + case 1: // - ZIP [RFC1951] + util.print_info('Decompressed packet [Type 1-ZIP]: ' + this.toString()); + var compData = this.compressedData; + var radix = s2r(compData).replace(/\n/g,""); + // no header in this case, directly call deflate + var jxg_obj = new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(radix)); + this.decompressedData = unescape(jxg_obj.deflate()[0][0]); + break; + case 2: // - ZLIB [RFC1950] + util.print_info('Decompressed packet [Type 2-ZLIB]: ' + this.toString()); + var compressionMethod = this.compressedData.charCodeAt(0) % 0x10; //RFC 1950. Bits 0-3 Compression Method + //Bits 4-7 RFC 1950 are LZ77 Window. Generally this value is 7 == 32k window size. + //2nd Byte in RFC 1950 is for "FLAGs" Allows for a Dictionary (how is this defined). Basic checksum, and compression level. + if (compressionMethod == 8) { //CM 8 is for DEFLATE, RFC 1951 + // remove 4 bytes ADLER32 checksum from the end + var compData = this.compressedData.substring(0, this.compressedData.length - 4); + var radix = s2r(compData).replace(/\n/g,""); + //TODO check ADLER32 checksum + this.decompressedData = JXG.decompress(radix); + break; + } else { + util.print_error("Compression algorithm ZLIB only supports DEFLATE compression method."); + } + break; + case 3: // - BZip2 [BZ2] + // TODO: need to implement this + util.print_error("Compression algorithm BZip2 [BZ2] is not implemented."); + break; + default: + util.print_error("Compression algorithm unknown :"+this.type); + break; + } + util.print_debug("decompressed:"+util.hexstrdump(this.decompressedData)); + return this.decompressedData; + } + + /** + * Compress the packet data (member decompressedData) + * @param {Integer} type Algorithm to be used // See RFC 4880 9.3 + * @param {String} data Data to be compressed + * @return {String} The compressed data stored in attribute compressedData + */ + function compress(type, data) { + this.type = type; + this.decompressedData = data; + switch (this.type) { + case 0: // - Uncompressed + this.compressedData = this.decompressedData; + break; + case 1: // - ZIP [RFC1951] + util.print_error("Compression algorithm ZIP [RFC1951] is not implemented."); + break; + case 2: // - ZLIB [RFC1950] + // TODO: need to implement this + util.print_error("Compression algorithm ZLIB [RFC1950] is not implemented."); + break; + case 3: // - BZip2 [BZ2] + // TODO: need to implement this + util.print_error("Compression algorithm BZip2 [BZ2] is not implemented."); + break; + default: + util.print_error("Compression algorithm unknown :"+this.type); + break; + } + this.packetLength = this.compressedData.length +1; + return this.compressedData; + } + + /** + * Creates a string representation of the packet + * @param {Integer} algorithm Algorithm to be used // See RFC 4880 9.3 + * @param {String} data Data to be compressed + * @return {String} String-representation of the packet + */ + function write_packet(algorithm, data) { + this.decompressedData = data; + if (algorithm == null) { + this.type = 1; + } + var result = String.fromCharCode(this.type)+this.compress(this.type); + return openpgp_packet.write_packet_header(8, result.length)+result; + } + + /** + * Pretty printing the packet (useful for debug purposes) + * @return {String} + */ + function toString() { + return '5.6. Compressed Data Packet (Tag 8)\n'+ + ' length: '+this.packetLength+'\n'+ + ' Compression Algorithm = '+this.type+'\n'+ + ' Compressed Data: Byte ['+util.hexstrdump(this.compressedData)+']\n'; + } + + this.read_packet = read_packet; + this.toString = toString; + this.compress = compress; + this.decompress = decompress; + this.write_packet = write_packet; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Symmetrically Encrypted Data Packet (Tag 9) + * + * RFC4880 5.7: The Symmetrically Encrypted Data packet contains data encrypted + * with a symmetric-key algorithm. When it has been decrypted, it contains other + * packets (usually a literal data packet or compressed data packet, but in + * theory other Symmetrically Encrypted Data packets or sequences of packets + * that form whole OpenPGP messages). + */ + +function openpgp_packet_encrypteddata() { + this.tagType = 9; + this.packetLength = null; + this.encryptedData = null; + this.decryptedData = null; + + /** + * Parsing function for the packet. + * + * @param {String} input Payload of a tag 9 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} Object representation + */ + function read_packet(input, position, len) { + var mypos = position; + this.packetLength = len; + // - Encrypted data, the output of the selected symmetric-key cipher + // operating in OpenPGP's variant of Cipher Feedback (CFB) mode. + this.encryptedData = input.substring(position, position + len); + return this; + } + + /** + * Symmetrically decrypt the packet data + * + * @param {Integer} symmetric_algorithm_type + * Symmetric key algorithm to use // See RFC4880 9.2 + * @param {String} key + * Key as string with the corresponding length to the + * algorithm + * @return The decrypted data; + */ + function decrypt_sym(symmetric_algorithm_type, key) { + this.decryptedData = openpgp_crypto_symmetricDecrypt( + symmetric_algorithm_type, key, this.encryptedData, true); + util.print_debug("openpgp.packet.encryptedintegrityprotecteddata.js\n"+ + "data: "+util.hexstrdump(this.decryptedData)); + return this.decryptedData; + } + + /** + * Creates a string representation of the packet + * + * @param {Integer} algo Symmetric key algorithm to use // See RFC4880 9.2 + * @param {String} key Key as string with the corresponding length to the + * algorithm + * @param {String} data Data to be + * @return {String} String-representation of the packet + */ + function write_packet(algo, key, data) { + var result = ""; + result += openpgp_crypto_symmetricEncrypt( + openpgp_crypto_getPrefixRandom(algo), algo, key, data, true); + result = openpgp_packet.write_packet_header(9, result.length) + result; + return result; + } + + function toString() { + return '5.7. Symmetrically Encrypted Data Packet (Tag 9)\n' + + ' length: ' + this.packetLength + '\n' + + ' Used symmetric algorithm: ' + this.algorithmType + '\n' + + ' encrypted data: Bytes [' + + util.hexstrdump(this.encryptedData) + ']\n'; + } + this.decrypt_sym = decrypt_sym; + this.toString = toString; + this.read_packet = read_packet; + this.write_packet = write_packet; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Sym. Encrypted Integrity Protected Data + * Packet (Tag 18) + * + * RFC4880 5.13: The Symmetrically Encrypted Integrity Protected Data packet is + * a variant of the Symmetrically Encrypted Data packet. It is a new feature + * created for OpenPGP that addresses the problem of detecting a modification to + * encrypted data. It is used in combination with a Modification Detection Code + * packet. + */ + +function openpgp_packet_encryptedintegrityprotecteddata() { + this.tagType = 18; + this.version = null; // integer == 1 + this.packetLength = null; // integer + this.encryptedData = null; // string + this.decrytpedData = null; // string + this.hash = null; // string + /** + * Parsing function for the packet. + * + * @param {String} input Payload of a tag 18 packet + * @param {Integer} position + * position to start reading from the input string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encryptedintegrityprotecteddata} object + * representation + */ + function read_packet(input, position, len) { + this.packetLength = len; + // - A one-octet version number. The only currently defined value is + // 1. + this.version = input[position].charCodeAt(); + if (this.version != 1) { + util + .print_error('openpgp.packet.encryptedintegrityprotecteddata.js\nunknown encrypted integrity protected data packet version: ' + + this.version + + " , @ " + + position + + "hex:" + + util.hexstrdump(input)); + return null; + } + // - Encrypted data, the output of the selected symmetric-key cipher + // operating in Cipher Feedback mode with shift amount equal to the + // block size of the cipher (CFB-n where n is the block size). + this.encryptedData = input.substring(position + 1, position + 1 + len); + util.print_debug("openpgp.packet.encryptedintegrityprotecteddata.js\n" + + this.toString()); + return this; + } + + /** + * Creates a string representation of a Sym. Encrypted Integrity Protected + * Data Packet (tag 18) (see RFC4880 5.13) + * + * @param {Integer} symmetric_algorithm + * The selected symmetric encryption algorithm to be used + * @param {String} key The key of cipher blocksize length to be used + * @param {String} data + * Plaintext data to be encrypted within the packet + * @return {String} A string representation of the packet + */ + function write_packet(symmetric_algorithm, key, data) { + + var prefixrandom = openpgp_crypto_getPrefixRandom(symmetric_algorithm); + var prefix = prefixrandom + + prefixrandom.charAt(prefixrandom.length - 2) + + prefixrandom.charAt(prefixrandom.length - 1); + var tohash = data; + tohash += String.fromCharCode(0xD3); + tohash += String.fromCharCode(0x14); + util.print_debug_hexstr_dump("data to be hashed:" + , prefix + tohash); + tohash += str_sha1(prefix + tohash); + util.print_debug_hexstr_dump("hash:" + , tohash.substring(tohash.length - 20, + tohash.length)); + var result = openpgp_crypto_symmetricEncrypt(prefixrandom, + symmetric_algorithm, key, tohash, false).substring(0, + prefix.length + tohash.length); + var header = openpgp_packet.write_packet_header(18, result.length + 1) + + String.fromCharCode(1); + this.encryptedData = result; + return header + result; + } + + /** + * Decrypts the encrypted data contained in this object read_packet must + * have been called before + * + * @param {Integer} symmetric_algorithm_type + * The selected symmetric encryption algorithm to be used + * @param {String} key The key of cipher blocksize length to be used + * @return {String} The decrypted data of this packet + */ + function decrypt(symmetric_algorithm_type, key) { + this.decryptedData = openpgp_crypto_symmetricDecrypt( + symmetric_algorithm_type, key, this.encryptedData, false); + // there must be a modification detection code packet as the + // last packet and everything gets hashed except the hash itself + this.hash = str_sha1(openpgp_crypto_MDCSystemBytes( + symmetric_algorithm_type, key, this.encryptedData) + + this.decryptedData.substring(0, + this.decryptedData.length - 20)); + util.print_debug_hexstr_dump("calc hash = ", this.hash); + if (this.hash == this.decryptedData.substring( + this.decryptedData.length - 20, this.decryptedData.length)) + return this.decryptedData; + else + util + .print_error("Decryption stopped: discovered a modification of encrypted data."); + return null; + } + + function toString() { + var data = ''; + if(openpgp.config.debug) + data = ' data: Bytes [' + + util.hexstrdump(this.encryptedData) + ']'; + + return '5.13. Sym. Encrypted Integrity Protected Data Packet (Tag 18)\n' + + ' length: ' + + this.packetLength + + '\n' + + ' version: ' + + this.version + + '\n' + + data; + } + + this.write_packet = write_packet; + this.read_packet = read_packet; + this.toString = toString; + this.decrypt = decrypt; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Public-Key Encrypted Session Key Packets (Tag 1) + * + * RFC4880 5.1: A Public-Key Encrypted Session Key packet holds the session key + * used to encrypt a message. Zero or more Public-Key Encrypted Session Key + * packets and/or Symmetric-Key Encrypted Session Key packets may precede a + * Symmetrically Encrypted Data Packet, which holds an encrypted message. The + * message is encrypted with the session key, and the session key is itself + * encrypted and stored in the Encrypted Session Key packet(s). The + * Symmetrically Encrypted Data Packet is preceded by one Public-Key Encrypted + * Session Key packet for each OpenPGP key to which the message is encrypted. + * The recipient of the message finds a session key that is encrypted to their + * public key, decrypts the session key, and then uses the session key to + * decrypt the message. + */ +function openpgp_packet_encryptedsessionkey() { + + /** + * Parsing function for a publickey encrypted session key packet (tag 1). + * + * @param {String} input Payload of a tag 1 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} Object representation + */ + function read_pub_key_packet(input, position, len) { + this.tagType = 1; + this.packetLength = len; + var mypos = position; + if (len < 10) { + util + .print_error("openpgp.packet.encryptedsessionkey.js\n" + 'invalid length'); + return null; + } + + this.version = input[mypos++].charCodeAt(); + this.keyId = new openpgp_type_keyid(); + this.keyId.read_packet(input, mypos); + mypos += 8; + this.publicKeyAlgorithmUsed = input[mypos++].charCodeAt(); + + switch (this.publicKeyAlgorithmUsed) { + case 1: + case 2: // RSA + this.MPIs = new Array(); + this.MPIs[0] = new openpgp_type_mpi(); + this.MPIs[0].read(input, mypos, mypos - position); + break; + case 16: // Elgamal + this.MPIs = new Array(); + this.MPIs[0] = new openpgp_type_mpi(); + this.MPIs[0].read(input, mypos, mypos - position); + mypos += this.MPIs[0].packetLength; + this.MPIs[1] = new openpgp_type_mpi(); + this.MPIs[1].read(input, mypos, mypos - position); + break; + default: + util.print_error("openpgp.packet.encryptedsessionkey.js\n" + + "unknown public key packet algorithm type " + + this.publicKeyAlgorithmType); + break; + } + return this; + } + + /** + * Create a string representation of a tag 1 packet + * + * @param {String} publicKeyId + * The public key id corresponding to publicMPIs key as string + * @param {openpgp_type_mpi[]} publicMPIs + * Multiprecision integer objects describing the public key + * @param {Integer} pubalgo + * The corresponding public key algorithm // See RFC4880 9.1 + * @param {Integer} symmalgo + * The symmetric cipher algorithm used to encrypt the data + * within an encrypteddatapacket or encryptedintegrity- + * protecteddatapacket + * following this packet //See RFC4880 9.2 + * @param {String} sessionkey + * A string of randombytes representing the session key + * @return {String} The string representation + */ + function write_pub_key_packet(publicKeyId, publicMPIs, pubalgo, symmalgo, + sessionkey) { + var result = String.fromCharCode(3); + var data = String.fromCharCode(symmalgo); + data += sessionkey; + var checksum = util.calc_checksum(sessionkey); + data += String.fromCharCode((checksum >> 8) & 0xFF); + data += String.fromCharCode((checksum) & 0xFF); + result += publicKeyId; + result += String.fromCharCode(pubalgo); + var mpi = new openpgp_type_mpi(); + var mpiresult = openpgp_crypto_asymetricEncrypt(pubalgo, publicMPIs, + mpi.create(openpgp_encoding_eme_pkcs1_encode(data, + publicMPIs[0].mpiByteLength))); + for ( var i = 0; i < mpiresult.length; i++) { + result += mpiresult[i]; + } + result = openpgp_packet.write_packet_header(1, result.length) + result; + return result; + } + + /** + * Parsing function for a symmetric encrypted session key packet (tag 3). + * + * @param {String} input Payload of a tag 1 packet + * @param {Integer} position Position to start reading from the input string + * @param {Integer} len + * Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} Object representation + */ + function read_symmetric_key_packet(input, position, len) { + this.tagType = 3; + var mypos = position; + // A one-octet version number. The only currently defined version is 4. + this.version = input[mypos++]; + + // A one-octet number describing the symmetric algorithm used. + this.symmetricKeyAlgorithmUsed = input[mypos++]; + // A string-to-key (S2K) specifier, length as defined above. + this.s2k = new openpgp_type_s2k(); + this.s2k.read(input, mypos); + + // Optionally, the encrypted session key itself, which is decrypted + // with the string-to-key object. + if ((s2k.s2kLength + mypos) < len) { + this.encryptedSessionKey = new Array(); + for ( var i = (mypos - position); i < len; i++) { + this.encryptedSessionKey[i] = input[mypos++]; + } + } + return this; + } + /** + * Decrypts the session key (only for public key encrypted session key + * packets (tag 1) + * + * @param {openpgp_msg_message} msg + * The message object (with member encryptedData + * @param {openpgp_msg_privatekey} key + * Private key with secMPIs unlocked + * @return {String} The unencrypted session key + */ + function decrypt(msg, key) { + if (this.tagType == 1) { + var result = openpgp_crypto_asymetricDecrypt( + this.publicKeyAlgorithmUsed, key.publicKey.MPIs, + key.secMPIs, this.MPIs).toMPI(); + var checksum = ((result.charCodeAt(result.length - 2) << 8) + result + .charCodeAt(result.length - 1)); + var decoded = openpgp_encoding_eme_pkcs1_decode(result.substring(2, result.length - 2), key.publicKey.MPIs[0].getByteLength()); + var sesskey = decoded.substring(1); + var algo = decoded.charCodeAt(0); + if (msg.encryptedData.tagType == 18) + return msg.encryptedData.decrypt(algo, sesskey); + else + return msg.encryptedData.decrypt_sym(algo, sesskey); + } else if (this.tagType == 3) { + util + .print_error("Symmetric encrypted sessionkey is not supported!"); + return null; + } + } + + /** + * Creates a string representation of this object (useful for debug + * purposes) + * + * @return {String} The string containing a openpgp description + */ + function toString() { + if (this.tagType == 1) { + var result = '5.1. Public-Key Encrypted Session Key Packets (Tag 1)\n' + + ' KeyId: ' + + this.keyId.toString() + + '\n' + + ' length: ' + + this.packetLength + + '\n' + + ' version:' + + this.version + + '\n' + + ' pubAlgUs:' + + this.publicKeyAlgorithmUsed + '\n'; + for ( var i = 0; i < this.MPIs.length; i++) { + result += this.MPIs[i].toString(); + } + return result; + } else + return '5.3 Symmetric-Key Encrypted Session Key Packets (Tag 3)\n' + + ' KeyId: ' + this.keyId.toString() + '\n' + + ' length: ' + this.packetLength + '\n' + + ' version:' + this.version + '\n' + ' symKeyA:' + + this.symmetricKeyAlgorithmUsed + '\n' + ' s2k: ' + + this.s2k + '\n'; + } + + this.read_pub_key_packet = read_pub_key_packet; + this.read_symmetric_key_packet = read_symmetric_key_packet; + this.write_pub_key_packet = write_pub_key_packet; + this.toString = toString; + this.decrypt = decrypt; +}; + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Parent openpgp packet class. Operations focus on determining + * packet types and packet header. + */ +function _openpgp_packet() { + /** + * Encodes a given integer of length to the openpgp length specifier to a + * string + * + * @param {Integer} length The length to encode + * @return {String} String with openpgp length representation + */ + function encode_length(length) { + result = ""; + if (length < 192) { + result += String.fromCharCode(length); + } else if (length > 191 && length < 8384) { + /* + * let a = (total data packet length) - 192 let bc = two octet + * representation of a let d = b + 192 + */ + result += String.fromCharCode(((length - 192) >> 8) + 192); + result += String.fromCharCode((length - 192) & 0xFF); + } else { + result += String.fromCharCode(255); + result += String.fromCharCode((length >> 24) & 0xFF); + result += String.fromCharCode((length >> 16) & 0xFF); + result += String.fromCharCode((length >> 8) & 0xFF); + result += String.fromCharCode(length & 0xFF); + } + return result; + } + this.encode_length = encode_length; + + /** + * Writes a packet header version 4 with the given tag_type and length to a + * string + * + * @param {Integer} tag_type Tag type + * @param {Integer} length Length of the payload + * @return {String} String of the header + */ + function write_packet_header(tag_type, length) { + /* we're only generating v4 packet headers here */ + var result = ""; + result += String.fromCharCode(0xC0 | tag_type); + result += encode_length(length); + return result; + } + + /** + * Writes a packet header Version 3 with the given tag_type and length to a + * string + * + * @param {Integer} tag_type Tag type + * @param {Integer} length Length of the payload + * @return {String} String of the header + */ + function write_old_packet_header(tag_type, length) { + var result = ""; + if (length < 256) { + result += String.fromCharCode(0x80 | (tag_type << 2)); + result += String.fromCharCode(length); + } else if (length < 65536) { + result += String.fromCharCode(0x80 | (tag_type << 2) | 1); + result += String.fromCharCode(length >> 8); + result += String.fromCharCode(length & 0xFF); + } else { + result += String.fromCharCode(0x80 | (tag_type << 2) | 2); + result += String.fromCharCode((length >> 24) & 0xFF); + result += String.fromCharCode((length >> 16) & 0xFF); + result += String.fromCharCode((length >> 8) & 0xFF); + result += String.fromCharCode(length & 0xFF); + } + return result; + } + this.write_old_packet_header = write_old_packet_header; + this.write_packet_header = write_packet_header; + /** + * Generic static Packet Parser function + * + * @param {String} input Input stream as string + * @param {integer} position Position to start parsing + * @param {integer} len Length of the input from position on + * @return {Object} Returns a parsed openpgp_packet + */ + function read_packet(input, position, len) { + // some sanity checks + if (input == null || input.length <= position + || input.substring(position).length < 2 + || (input[position].charCodeAt() & 0x80) == 0) { + util + .print_error("Error during parsing. This message / key is probably not containing a valid OpenPGP format."); + return null; + } + var mypos = position; + var tag = -1; + var format = -1; + + format = 0; // 0 = old format; 1 = new format + if ((input[mypos].charCodeAt() & 0x40) != 0) { + format = 1; + } + + var packet_length_type; + if (format) { + // new format header + tag = input[mypos].charCodeAt() & 0x3F; // bit 5-0 + } else { + // old format header + tag = (input[mypos].charCodeAt() & 0x3F) >> 2; // bit 5-2 + packet_length_type = input[mypos].charCodeAt() & 0x03; // bit 1-0 + } + + // header octet parsing done + mypos++; + + // parsed length from length field + var bodydata = null; + + // used for partial body lengths + var real_packet_length = -1; + if (!format) { + // 4.2.1. Old Format Packet Lengths + switch (packet_length_type) { + case 0: // The packet has a one-octet length. The header is 2 octets + // long. + packet_length = input[mypos++].charCodeAt(); + break; + case 1: // The packet has a two-octet length. The header is 3 octets + // long. + packet_length = (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + break; + case 2: // The packet has a four-octet length. The header is 5 + // octets long. + packet_length = (input[mypos++].charCodeAt() << 24) + | (input[mypos++].charCodeAt() << 16) + | (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + break; + default: + // 3 - The packet is of indeterminate length. The header is 1 + // octet long, and the implementation must determine how long + // the packet is. If the packet is in a file, this means that + // the packet extends until the end of the file. In general, + // an implementation SHOULD NOT use indeterminate-length + // packets except where the end of the data will be clear + // from the context, and even then it is better to use a + // definite length, or a new format header. The new format + // headers described below have a mechanism for precisely + // encoding data of indeterminate length. + packet_length = len; + break; + } + + } else // 4.2.2. New Format Packet Lengths + { + + // 4.2.2.1. One-Octet Lengths + if (input[mypos].charCodeAt() < 192) { + packet_length = input[mypos++].charCodeAt(); + util.print_debug("1 byte length:" + packet_length); + // 4.2.2.2. Two-Octet Lengths + } else if (input[mypos].charCodeAt() >= 192 + && input[mypos].charCodeAt() < 224) { + packet_length = ((input[mypos++].charCodeAt() - 192) << 8) + + (input[mypos++].charCodeAt()) + 192; + util.print_debug("2 byte length:" + packet_length); + // 4.2.2.4. Partial Body Lengths + } else if (input[mypos].charCodeAt() > 223 + && input[mypos].charCodeAt() < 255) { + packet_length = 1 << (input[mypos++].charCodeAt() & 0x1F); + util.print_debug("4 byte length:" + packet_length); + // EEEK, we're reading the full data here... + var mypos2 = mypos + packet_length; + bodydata = input.substring(mypos, mypos + packet_length); + while (true) { + if (input[mypos2].charCodeAt() < 192) { + var tmplen = input[mypos2++].charCodeAt(); + packet_length += tmplen; + bodydata += input.substring(mypos2, mypos2 + tmplen); + mypos2 += tmplen; + break; + } else if (input[mypos2].charCodeAt() >= 192 + && input[mypos2].charCodeAt() < 224) { + var tmplen = ((input[mypos2++].charCodeAt() - 192) << 8) + + (input[mypos2++].charCodeAt()) + 192; + packet_length += tmplen; + bodydata += input.substring(mypos2, mypos2 + tmplen); + mypos2 += tmplen; + break; + } else if (input[mypos2].charCodeAt() > 223 + && input[mypos2].charCodeAt() < 255) { + var tmplen = 1 << (input[mypos2++].charCodeAt() & 0x1F); + packet_length += tmplen; + bodydata += input.substring(mypos2, mypos2 + tmplen); + mypos2 += tmplen; + } else { + mypos2++; + var tmplen = (input[mypos2++].charCodeAt() << 24) + | (input[mypos2++].charCodeAt() << 16) + | (input[mypos2++].charCodeAt() << 8) + | input[mypos2++].charCodeAt(); + bodydata += input.substring(mypos2, mypos2 + tmplen); + packet_length += tmplen; + mypos2 += tmplen; + break; + } + } + real_packet_length = mypos2; + // 4.2.2.3. Five-Octet Lengths + } else { + mypos++; + packet_length = (input[mypos++].charCodeAt() << 24) + | (input[mypos++].charCodeAt() << 16) + | (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + } + } + + // if there was'nt a partial body length: use the specified + // packet_length + if (real_packet_length == -1) { + real_packet_length = packet_length; + } + + if (bodydata == null) { + bodydata = input.substring(mypos, mypos + real_packet_length); + } + + // alert('tag type: '+this.tag+' length: '+packet_length); + var version = 1; // (old format; 2= new format) + // if (input[mypos++].charCodeAt() > 15) + // version = 2; + + switch (tag) { + case 0: // Reserved - a packet tag MUST NOT have this value + break; + case 1: // Public-Key Encrypted Session Key Packet + var result = new openpgp_packet_encryptedsessionkey(); + if (result.read_pub_key_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 2: // Signature Packet + var result = new openpgp_packet_signature(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 3: // Symmetric-Key Encrypted Session Key Packet + var result = new openpgp_packet_encryptedsessionkey(); + if (result.read_symmetric_key_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 4: // One-Pass Signature Packet + var result = new openpgp_packet_onepasssignature(); + if (result.read_packet(bodydata, 0, packet_length)) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 5: // Secret-Key Packet + var result = new openpgp_packet_keymaterial(); + result.header = input.substring(position, mypos); + if (result.read_tag5(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 6: // Public-Key Packet + var result = new openpgp_packet_keymaterial(); + result.header = input.substring(position, mypos); + if (result.read_tag6(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 7: // Secret-Subkey Packet + var result = new openpgp_packet_keymaterial(); + if (result.read_tag7(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 8: // Compressed Data Packet + var result = new openpgp_packet_compressed(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 9: // Symmetrically Encrypted Data Packet + var result = new openpgp_packet_encrypteddata(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 10: // Marker Packet = PGP (0x50, 0x47, 0x50) + var result = new openpgp_packet_marker(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 11: // Literal Data Packet + var result = new openpgp_packet_literaldata(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.header = input.substring(position, mypos); + result.packetLength = real_packet_length; + return result; + } + break; + case 12: // Trust Packet + // TODO: to be implemented + break; + case 13: // User ID Packet + var result = new openpgp_packet_userid(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 14: // Public-Subkey Packet + var result = new openpgp_packet_keymaterial(); + result.header = input.substring(position, mypos); + if (result.read_tag14(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 17: // User Attribute Packet + var result = new openpgp_packet_userattribute(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 18: // Sym. Encrypted and Integrity Protected Data Packet + var result = new openpgp_packet_encryptedintegrityprotecteddata(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + case 19: // Modification Detection Code Packet + var result = new openpgp_packet_modificationdetectioncode(); + if (result.read_packet(bodydata, 0, packet_length) != null) { + result.headerLength = mypos - position; + result.packetLength = real_packet_length; + return result; + } + break; + default: + util.print_error("openpgp.packet.js\n" + + "[ERROR] openpgp_packet: failed to parse packet @:" + + mypos + "\nchar:'" + + util.hexstrdump(input.substring(mypos)) + "'\ninput:" + + util.hexstrdump(input)); + return null; + break; + } + } + + this.read_packet = read_packet; +} + +var openpgp_packet = new _openpgp_packet(); +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Key Material Packet (Tag 5,6,7,14) + * + * RFC4480 5.5: + * A key material packet contains all the information about a public or + * private key. There are four variants of this packet type, and two + * major versions. Consequently, this section is complex. + */ +function openpgp_packet_keymaterial() { + // members: + this.publicKeyAlgorithm = null; + this.tagType = null; + this.creationTime = null; + this.version = null; + this.expiration = null;// V3 + this.MPIs = null; + this.secMPIs = null; + this.publicKey = null; + this.symmetricEncryptionAlgorithm = null; + this.s2kUsageConventions = null; + this.IVLength = null; + this.encryptedMPIData = null; + this.hasUnencryptedSecretKeyData = null; + this.checksum = null; + this.parentNode = null; + this.subKeySignature = null; + this.subKeyRevocationSignature = null; + + // 5.5.1. Key Packet Variants + + // 5.5.1.3. Secret-Key Packet (Tag 5) + /** + * This function reads the payload of a secret key packet (Tag 5) + * and initializes the openpgp_packet_keymaterial + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Intefer} len Length of the packet or remaining length of input + * @return {openpgp_packet_keymaterial} + */ + function read_tag5(input, position, len) { + this.tagType = 5; + this.read_priv_key(input, position, len); + return this; + } + + // 5.5.1.1. Public-Key Packet (Tag 6) + /** + * This function reads the payload of a public key packet (Tag 6) + * and initializes the openpgp_packet_keymaterial + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet or remaining length of input + * @return {openpgp_packet_keymaterial} + */ + function read_tag6(input, position, len) { + // A Public-Key packet starts a series of packets that forms an OpenPGP + // key (sometimes called an OpenPGP certificate). + this.tagType = 6; + this.packetLength = len; + this.read_pub_key(input, position,len); + + return this; + } + + // 5.5.1.4. Secret-Subkey Packet (Tag 7) + /** + * This function reads the payload of a secret key sub packet (Tag 7) + * and initializes the openpgp_packet_keymaterial + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet or remaining length of input + * @return {openpgp_packet_keymaterial} + */ + function read_tag7(input, position, len) { + this.tagType = 7; + this.packetLength = len; + return this.read_priv_key(input, position, len); + } + + // 5.5.1.2. Public-Subkey Packet (Tag 14) + /** + * This function reads the payload of a public key sub packet (Tag 14) + * and initializes the openpgp_packet_keymaterial + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet or remaining length of input + * @return {openpgp_packet_keymaterial} + */ + function read_tag14(input, position, len) { + this.subKeySignature = null; + this.subKeyRevocationSignature = new Array(); + this.tagType = 14; + this.packetLength = len; + this.read_pub_key(input, position,len); + return this; + } + + /** + * Internal Parser for public keys as specified in RFC 4880 section + * 5.5.2 Public-Key Packet Formats + * called by read_tag<num> + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet or remaining length of input + * @return {Object} This object with attributes set by the parser + */ + function read_pub_key(input, position, len) { + var mypos = position; + // A one-octet version number (3 or 4). + this.version = input[mypos++].charCodeAt(); + if (this.version == 3) { + // A four-octet number denoting the time that the key was created. + this.creationTime = new Date(((input[mypos++].charCodeAt() << 24) | + (input[mypos++].charCodeAt() << 16) | + (input[mypos++].charCodeAt() << 8) | + (input[mypos++].charCodeAt()))*1000); + + // - A two-octet number denoting the time in days that this key is + // valid. If this number is zero, then it does not expire. + this.expiration = (input[mypos++].charCodeAt() << 8) & input[mypos++].charCodeAt(); + + // - A one-octet number denoting the public-key algorithm of this key. + this.publicKeyAlgorithm = input[mypos++].charCodeAt(); + var mpicount = 0; + // - A series of multiprecision integers comprising the key material: + // Algorithm-Specific Fields for RSA public keys: + // - a multiprecision integer (MPI) of RSA public modulus n; + // - an MPI of RSA public encryption exponent e. + if (this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) + mpicount = 2; + // Algorithm-Specific Fields for Elgamal public keys: + // - MPI of Elgamal prime p; + // - MPI of Elgamal group generator g; + // - MPI of Elgamal public key value y (= g**x mod p where x is secret). + + else if (this.publicKeyAlgorithm == 16) + mpicount = 3; + // Algorithm-Specific Fields for DSA public keys: + // - MPI of DSA prime p; + // - MPI of DSA group order q (q is a prime divisor of p-1); + // - MPI of DSA group generator g; + // - MPI of DSA public-key value y (= g**x mod p where x is secret). + else if (this.publicKeyAlgorithm == 17) + mpicount = 4; + + this.MPIs = new Array(); + for (var i = 0; i < mpicount; i++) { + this.MPIs[i] = new openpgp_type_mpi(); + if (this.MPIs[i].read(input, mypos, (mypos-position)) != null && + !this.packetLength < (mypos-position)) { + mypos += this.MPIs[i].packetLength; + } else { + util.print_error("openpgp.packet.keymaterial.js\n"+'error reading MPI @:'+mypos); + } + } + this.packetLength = mypos-position; + } else if (this.version == 4) { + // - A four-octet number denoting the time that the key was created. + this.creationTime = new Date(((input[mypos++].charCodeAt() << 24) | + (input[mypos++].charCodeAt() << 16) | + (input[mypos++].charCodeAt() << 8) | + (input[mypos++].charCodeAt()))*1000); + + // - A one-octet number denoting the public-key algorithm of this key. + this.publicKeyAlgorithm = input[mypos++].charCodeAt(); + var mpicount = 0; + // - A series of multiprecision integers comprising the key material: + // Algorithm-Specific Fields for RSA public keys: + // - a multiprecision integer (MPI) of RSA public modulus n; + // - an MPI of RSA public encryption exponent e. + if (this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) + mpicount = 2; + // Algorithm-Specific Fields for Elgamal public keys: + // - MPI of Elgamal prime p; + // - MPI of Elgamal group generator g; + // - MPI of Elgamal public key value y (= g**x mod p where x is secret). + else if (this.publicKeyAlgorithm == 16) + mpicount = 3; + + // Algorithm-Specific Fields for DSA public keys: + // - MPI of DSA prime p; + // - MPI of DSA group order q (q is a prime divisor of p-1); + // - MPI of DSA group generator g; + // - MPI of DSA public-key value y (= g**x mod p where x is secret). + else if (this.publicKeyAlgorithm == 17) + mpicount = 4; + + this.MPIs = new Array(); + var i = 0; + for (var i = 0; i < mpicount; i++) { + this.MPIs[i] = new openpgp_type_mpi(); + if (this.MPIs[i].read(input, mypos, (mypos-position)) != null && + !this.packetLength < (mypos-position)) { + mypos += this.MPIs[i].packetLength; + } else { + util.print_error("openpgp.packet.keymaterial.js\n"+'error reading MPI @:'+mypos); + } + } + this.packetLength = mypos-position; + } else { + return null; + } + this.data = input.substring(position, mypos); + this.packetdata = input.substring(position, mypos); + return this; + } + + // 5.5.3. Secret-Key Packet Formats + + /** + * Internal parser for private keys as specified in RFC 4880 section 5.5.3 + * @param {String} input Input string to read the packet from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet or remaining length of input + * @return {Object} This object with attributes set by the parser + */ + function read_priv_key(input,position, len) { + // - A Public-Key or Public-Subkey packet, as described above. + this.publicKey = new openpgp_packet_keymaterial(); + if (this.publicKey.read_pub_key(input,position, len) == null) { + util.print_error("openpgp.packet.keymaterial.js\n"+"Failed reading public key portion of a private key: "+input[position].charCodeAt()+" "+position+" "+len+"\n Aborting here..."); + return null; + } + this.publicKey.header = openpgp_packet.write_old_packet_header(6,this.publicKey.packetLength); + // this.publicKey.header = String.fromCharCode(0x99) + String.fromCharCode(this.publicKey.packetLength >> 8 & 0xFF)+String.fromCharCode(this.publicKey.packetLength & 0xFF); + var mypos = position + this.publicKey.data.length; + this.packetLength = len; + + // - One octet indicating string-to-key usage conventions. Zero + // indicates that the secret-key data is not encrypted. 255 or 254 + // indicates that a string-to-key specifier is being given. Any + // other value is a symmetric-key encryption algorithm identifier. + this.s2kUsageConventions = input[mypos++].charCodeAt(); + + if (this.s2kUsageConventions == 0) + this.hasUnencryptedSecretKeyData = true; + + // - [Optional] If string-to-key usage octet was 255 or 254, a one- + // octet symmetric encryption algorithm. + if (this.s2kUsageConventions == 255 || this.s2kUsageConventions == 254) { + this.symmetricEncryptionAlgorithm = input[mypos++].charCodeAt(); + } + + // - [Optional] If string-to-key usage octet was 255 or 254, a + // string-to-key specifier. The length of the string-to-key + // specifier is implied by its type, as described above. + if (this.s2kUsageConventions == 255 || this.s2kUsageConventions == 254) { + this.s2k = new openpgp_type_s2k(); + this.s2k.read(input, mypos); + mypos +=this.s2k.s2kLength; + } + + // - [Optional] If secret data is encrypted (string-to-key usage octet + // not zero), an Initial Vector (IV) of the same length as the + // cipher's block size. + this.symkeylength = 0; + if (this.s2kUsageConventions != 0 && this.s2kUsageConventions != 255 && + this.s2kUsageConventions != 254) { + this.symmetricEncryptionAlgorithm = this.s2kUsageConventions; + } + if (this.s2kUsageConventions != 0 && this.s2k.type != 1001) { + this.hasIV = true; + switch (this.symmetricEncryptionAlgorithm) { + case 1: // - IDEA [IDEA] + util.print_error("openpgp.packet.keymaterial.js\n"+"symmetric encrytryption algorithim: IDEA is not implemented"); + return null; + case 2: // - TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + case 3: // - CAST5 (128 bit key, as per [RFC2144]) + this.IVLength = 8; + break; + case 4: // - Blowfish (128 bit key, 16 rounds) [BLOWFISH] + case 7: // - AES with 128-bit key [AES] + case 8: // - AES with 192-bit key + case 9: // - AES with 256-bit key + this.IVLength = 16; + break; + case 10: // - Twofish with 256-bit key [TWOFISH] + this.IVLength = 32; + break; + case 5: // - Reserved + case 6: // - Reserved + default: + util.print_error("openpgp.packet.keymaterial.js\n"+"unknown encryption algorithm for secret key :"+this.symmetricEncryptionAlgorithm); + return null; + } + mypos++; + this.IV = input.substring(mypos, mypos+this.IVLength); + mypos += this.IVLength; + } + // - Plain or encrypted multiprecision integers comprising the secret + // key data. These algorithm-specific fields are as described + // below. + + // s2k type 1001 corresponds to GPG specific extension without primary key secrets + // http://www.gnupg.org/faq/GnuPG-FAQ.html#how-can-i-use-gnupg-in-an-automated-environment + if (this.s2kUsageConventions != 0 && this.s2k.type == 1001) { + this.secMPIs = null; + this.encryptedMPIData = null; + } else if (!this.hasUnencryptedSecretKeyData) { + this.encryptedMPIData = input.substring(mypos, len); + mypos += this.encryptedMPIData.length; + } else { + if (this.publicKey.publicKeyAlgorithm > 0 && this.publicKey.publicKeyAlgorithm < 4) { + // Algorithm-Specific Fields for RSA secret keys: + // - multiprecision integer (MPI) of RSA secret exponent d. + // - MPI of RSA secret prime value p. + // - MPI of RSA secret prime value q (p < q). + // - MPI of u, the multiplicative inverse of p, mod q. + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[0].packetLength; + this.secMPIs[1] = new openpgp_type_mpi(); + this.secMPIs[1].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[1].packetLength; + this.secMPIs[2] = new openpgp_type_mpi(); + this.secMPIs[2].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[2].packetLength; + this.secMPIs[3] = new openpgp_type_mpi(); + this.secMPIs[3].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[3].packetLength; + } else if (this.publicKey.publicKeyAlgorithm == 16) { + // Algorithm-Specific Fields for Elgamal secret keys: + // - MPI of Elgamal secret exponent x. + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[0].packetLength; + } else if (this.publicKey.publicKeyAlgorithm == 17) { + // Algorithm-Specific Fields for DSA secret keys: + // - MPI of DSA secret exponent x. + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(input, mypos, len-2- (mypos - position)); + mypos += this.secMPIs[0].packetLength; + } + // checksum because s2k usage convention is 0 + this.checksum = new Array(); + this.checksum[0] = input[mypos++].charCodeAt(); + this.checksum[1] = input[mypos++].charCodeAt(); + } + return this; + } + + + /** + * Decrypts the private key MPIs which are needed to use the key. + * openpgp_packet_keymaterial.hasUnencryptedSecretKeyData should be + * false otherwise + * a call to this function is not needed + * + * @param {String} str_passphrase The passphrase for this private key + * as string + * @return {Boolean} True if the passphrase was correct; false if not + */ + function decryptSecretMPIs(str_passphrase) { + if (this.hasUnencryptedSecretKeyData) + return this.secMPIs; + // creating a key out of the passphrase + var key = this.s2k.produce_key(str_passphrase); + var cleartextMPIs = ""; + switch (this.symmetricEncryptionAlgorithm) { + case 1: // - IDEA [IDEA] + util.print_error("openpgp.packet.keymaterial.js\n"+"symmetric encryption algorithim: IDEA is not implemented"); + return false; + case 2: // - TripleDES (DES-EDE, [SCHNEIER] [HAC] - 168 bit key derived from 192) + cleartextMPIs = normal_cfb_decrypt(function(block, key) { + return des(key, block,1,null,0); + }, this.IVLength, key, this.encryptedMPIData, this.IV); + break; + case 3: // - CAST5 (128 bit key, as per [RFC2144]) + cleartextMPIs = normal_cfb_decrypt(function(block, key) { + var cast5 = new openpgp_symenc_cast5(); + cast5.setKey(key); + return cast5.encrypt(util.str2bin(block)); + }, this.IVLength, util.str2bin(key.substring(0,16)), this.encryptedMPIData, this.IV); + break; + case 4: // - Blowfish (128 bit key, 16 rounds) [BLOWFISH] + cleartextMPIs = normal_cfb_decrypt(function(block, key) { + var blowfish = new Blowfish(key); + return blowfish.encrypt(block); + }, this.IVLength, key, this.encryptedMPIData, this.IV); + break; + case 7: // - AES with 128-bit key [AES] + case 8: // - AES with 192-bit key + case 9: // - AES with 256-bit key + var numBytes = 16; + //This is a weird way to achieve this. If's within a switch is probably not ideal. + if(this.symmetricEncryptionAlgorithm == 8){ + numBytes = 24; + key = this.s2k.produce_key(str_passphrase,numBytes); + } + if(this.symmetricEncryptionAlgorithm == 9){ + numBytes = 32; + key = this.s2k.produce_key(str_passphrase,numBytes); + } + cleartextMPIs = normal_cfb_decrypt(function(block,key){ + return AESencrypt(util.str2bin(block),key); + }, + this.IVLength, keyExpansion(key.substring(0,numBytes)), this.encryptedMPIData, this.IV); + break; + case 10: // - Twofish with 256-bit key [TWOFISH] + util.print_error("openpgp.packet.keymaterial.js\n"+"Key material is encrypted with twofish: not implemented"); + return false; + case 5: // - Reserved + case 6: // - Reserved + default: + util.print_error("openpgp.packet.keymaterial.js\n"+"unknown encryption algorithm for secret key :"+this.symmetricEncryptionAlgorithm); + return false; + } + + if (cleartextMPIs == null) { + util.print_error("openpgp.packet.keymaterial.js\n"+"cleartextMPIs was null"); + return false; + } + + var cleartextMPIslength = cleartextMPIs.length; + + if (this.s2kUsageConventions == 254 && + str_sha1(cleartextMPIs.substring(0,cleartextMPIs.length - 20)) == + cleartextMPIs.substring(cleartextMPIs.length - 20)) { + cleartextMPIslength -= 20; + } else if (this.s2kUsageConventions != 254 && util.calc_checksum(cleartextMPIs.substring(0,cleartextMPIs.length - 2)) == + (cleartextMPIs.charCodeAt(cleartextMPIs.length -2) << 8 | cleartextMPIs.charCodeAt(cleartextMPIs.length -1))) { + cleartextMPIslength -= 2; + } else { + return false; + } + + if (this.publicKey.publicKeyAlgorithm > 0 && this.publicKey.publicKeyAlgorithm < 4) { + // Algorithm-Specific Fields for RSA secret keys: + // - multiprecision integer (MPI) of RSA secret exponent d. + // - MPI of RSA secret prime value p. + // - MPI of RSA secret prime value q (p < q). + // - MPI of u, the multiplicative inverse of p, mod q. + var mypos = 0; + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(cleartextMPIs, 0, cleartextMPIslength); + mypos += this.secMPIs[0].packetLength; + this.secMPIs[1] = new openpgp_type_mpi(); + this.secMPIs[1].read(cleartextMPIs, mypos, cleartextMPIslength-mypos); + mypos += this.secMPIs[1].packetLength; + this.secMPIs[2] = new openpgp_type_mpi(); + this.secMPIs[2].read(cleartextMPIs, mypos, cleartextMPIslength-mypos); + mypos += this.secMPIs[2].packetLength; + this.secMPIs[3] = new openpgp_type_mpi(); + this.secMPIs[3].read(cleartextMPIs, mypos, cleartextMPIslength-mypos); + mypos += this.secMPIs[3].packetLength; + } else if (this.publicKey.publicKeyAlgorithm == 16) { + // Algorithm-Specific Fields for Elgamal secret keys: + // - MPI of Elgamal secret exponent x. + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(cleartextMPIs, 0, cleartextMPIs); + } else if (this.publicKey.publicKeyAlgorithm == 17) { + // Algorithm-Specific Fields for DSA secret keys: + // - MPI of DSA secret exponent x. + this.secMPIs = new Array(); + this.secMPIs[0] = new openpgp_type_mpi(); + this.secMPIs[0].read(cleartextMPIs, 0, cleartextMPIslength); + } + return true; + } + + /** + * Generates Debug output + * @return String which gives some information about the keymaterial + */ + function toString() { + var result = ""; + switch (this.tagType) { + case 6: + result += '5.5.1.1. Public-Key Packet (Tag 6)\n'+ + ' length: '+this.packetLength+'\n'+ + ' version: '+this.version+'\n'+ + ' creation time: '+this.creationTime+'\n'+ + ' expiration time: '+this.expiration+'\n'+ + ' publicKeyAlgorithm: '+this.publicKeyAlgorithm+'\n'; + break; + case 14: + result += '5.5.1.2. Public-Subkey Packet (Tag 14)\n'+ + ' length: '+this.packetLength+'\n'+ + ' version: '+this.version+'\n'+ + ' creation time: '+this.creationTime+'\n'+ + ' expiration time: '+this.expiration+'\n'+ + ' publicKeyAlgorithm: '+this.publicKeyAlgorithm+'\n'; + break; + case 5: + result +='5.5.1.3. Secret-Key Packet (Tag 5)\n'+ + ' length: '+this.packetLength+'\n'+ + ' version: '+this.publicKey.version+'\n'+ + ' creation time: '+this.publicKey.creationTime+'\n'+ + ' expiration time: '+this.publicKey.expiration+'\n'+ + ' publicKeyAlgorithm: '+this.publicKey.publicKeyAlgorithm+'\n'; + break; + case 7: + result += '5.5.1.4. Secret-Subkey Packet (Tag 7)\n'+ + ' length: '+this.packetLength+'\n'+ + ' version[1]: '+(this.version == 4)+'\n'+ + ' creationtime[4]: '+this.creationTime+'\n'+ + ' expiration[2]: '+this.expiration+'\n'+ + ' publicKeyAlgorithm: '+this.publicKeyAlgorithm+'\n'; + break; + default: + result += 'unknown key material packet\n'; + } + if (this.MPIs != null) { + result += "Public Key MPIs:\n"; + for (var i = 0; i < this.MPIs.length; i++) { + result += this.MPIs[i].toString(); + } + } + if (this.publicKey != null && this.publicKey.MPIs != null) { + result += "Public Key MPIs:\n"; + for (var i = 0; i < this.publicKey.MPIs.length; i++) { + result += this.publicKey.MPIs[i].toString(); + } + } + if (this.secMPIs != null) { + result += "Secret Key MPIs:\n"; + for (var i = 0; i < this.secMPIs.length; i++) { + result += this.secMPIs[i].toString(); + } + } + + if (this.subKeySignature != null) + result += "subKey Signature:\n"+this.subKeySignature.toString(); + + if (this.subKeyRevocationSignature != null ) + result += "subKey Revocation Signature:\n"+this.subKeyRevocationSignature.toString(); + return result; + } + + /** + * Continue parsing packets belonging to the key material such as signatures + * @param {Object} parent_node The parent object + * @param {String} input Input string to read the packet(s) from + * @param {Integer} position Start position for the parser + * @param {Integer} len Length of the packet(s) or remaining length of input + * @return {Integer} Length of nodes read + */ + function read_nodes(parent_node, input, position, len) { + this.parentNode = parent_node; + if (this.tagType == 14) { // public sub-key packet + var pos = position; + var result = null; + while (input.length != pos) { + var l = input.length - pos; + result = openpgp_packet.read_packet(input, pos, l); + if (result == null) { + util.print_error("openpgp.packet.keymaterial.js\n"+'[user_keymat_pub]parsing ends here @:' + pos + " l:" + l); + break; + } else { + + switch (result.tagType) { + case 2: // Signature Packet certification signature + if (result.signatureType == 24) { // subkey binding signature + this.subKeySignature = result; + pos += result.packetLength + result.headerLength; + break; + } else if (result.signatureType == 40) { // subkey revocation signature + this.subKeyRevocationSignature[this.subKeyRevocationSignature.length] = result; + pos += result.packetLength + result.headerLength; + break; + } else { + util.print_error("openpgp.packet.keymaterial.js\nunknown signature:"+result.toString()); + } + + default: + this.data = input; + this.position = position - this.parentNode.packetLength; + this.len = pos - position; + return this.len; + break; + } + } + } + this.data = input; + this.position = position - this.parentNode.packetLength; + this.len = pos - position; + return this.len; + } else if (this.tagType == 7) { // private sub-key packet + var pos = position; + while (input.length != pos) { + var result = openpgp_packet.read_packet(input, pos, len - (pos - position)); + if (result == null) { + util.print_error("openpgp.packet.keymaterial.js\n"+'[user_keymat_priv] parsing ends here @:' + pos); + break; + } else { + switch (result.tagType) { + case 2: // Signature Packet certification signature + if (result.signatureType == 24) // subkey embedded signature + this.subKeySignature = result; + else if (result.signatureType == 40) // subkey revocation signature + this.subKeyRevocationSignature[this.subKeyRevocationSignature.length] = result; + pos += result.packetLength + result.headerLength; + break; + default: + this.data = input; + this.position = position - this.parentNode.packetLength; + this.len = pos - position; + return this.len; + } + } + } + this.data = input; + this.position = position - this.parentNode.packetLength; + this.len = pos - position; + return this.len; + } else { + util.print_error("openpgp.packet.keymaterial.js\n"+"unknown parent node for a key material packet "+parent_node.tagType); + } + } + + /** + * Checks the validity for usage of this (sub)key + * @return {Integer} 0 = bad key, 1 = expired, 2 = revoked, 3 = valid + */ + function verifyKey() { + if (this.tagType == 14) { + if (this.subKeySignature == null) { + return 0; + } + if (this.subKeySignature.version == 4 && + this.subKeySignature.keyNeverExpires != null && + !this.subKeySignature.keyNeverExpires && + new Date((this.subKeySignature.keyExpirationTime*1000)+ this.creationTime.getTime()) < new Date()) { + return 1; + } + var hashdata = String.fromCharCode(0x99)+this.parentNode.header.substring(1)+this.parentNode.data+ + String.fromCharCode(0x99)+this.header.substring(1)+this.packetdata; + if (!this.subKeySignature.verify(hashdata,this.parentNode)) { + return 0; + } + for (var i = 0; i < this.subKeyRevocationSignature.length; i++) { + if (this.getKeyId() == this.subKeyRevocationSignature[i].keyId){ + return 2; + } + } + } + return 3; + } + + /** + * Calculates the key id of they key + * @return {String} A 8 byte key id + */ + function getKeyId() { + if (this.version == 4) { + var f = this.getFingerprint(); + return f.substring(12,20); + } else if (this.version == 3 && this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) { + var key_id = this.MPIs[0].MPI.substring((this.MPIs[0].mpiByteLength-8)); + util.print_debug("openpgp.msg.publickey read_nodes:\n"+"V3 key ID: "+key_id); + return key_id; + } + } + + /** + * Calculates the fingerprint of the key + * @return {String} A string containing the fingerprint + */ + function getFingerprint() { + if (this.version == 4) { + tohash = String.fromCharCode(0x99)+ String.fromCharCode(((this.packetdata.length) >> 8) & 0xFF) + + String.fromCharCode((this.packetdata.length) & 0xFF)+this.packetdata; + util.print_debug("openpgp.msg.publickey creating subkey fingerprint by hashing:"+util.hexstrdump(tohash)+"\npublickeyalgorithm: "+this.publicKeyAlgorithm); + return str_sha1(tohash, tohash.length); + } else if (this.version == 3 && this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) { + return MD5(this.MPIs[0].MPI); + } + } + + /* + * Creates an OpenPGP key packet for the given key. much + * TODO in regards to s2k, subkeys. + * @param {Integer} keyType Follows the OpenPGP algorithm standard, + * IE 1 corresponds to RSA. + * @param {RSA.keyObject} key + * @param password + * @param s2kHash + * @param symmetricEncryptionAlgorithm + * @param timePacket + * @return {Object} {body: [string]OpenPGP packet body contents, + header: [string] OpenPGP packet header, string: [string] header+body} + */ + function write_private_key(keyType, key, password, s2kHash, symmetricEncryptionAlgorithm, timePacket){ + this.symmetricEncryptionAlgorithm = symmetricEncryptionAlgorithm; + var tag = 5; + var body = String.fromCharCode(4); + body += timePacket; + switch(keyType){ + case 1: + body += String.fromCharCode(keyType);//public key algo + body += key.n.toMPI(); + body += key.ee.toMPI(); + var algorithmStart = body.length; + //below shows ske/s2k + if(password){ + body += String.fromCharCode(254); //octet of 254 indicates s2k with SHA1 + //if s2k == 255,254 then 1 octet symmetric encryption algo + body += String.fromCharCode(this.symmetricEncryptionAlgorithm); + //if s2k == 255,254 then s2k specifier + body += String.fromCharCode(3); //s2k salt+iter + body += String.fromCharCode(s2kHash); + //8 octet salt value + //1 octet count + var cleartextMPIs = key.d.toMPI() + key.p.toMPI() + key.q.toMPI() + key.u.toMPI(); + var sha1Hash = str_sha1(cleartextMPIs); + util.print_debug_hexstr_dump('write_private_key sha1: ',sha1Hash); + var salt = openpgp_crypto_getRandomBytes(8); + util.print_debug_hexstr_dump('write_private_key Salt: ',salt); + body += salt; + var c = 96; //c of 96 translates to count of 65536 + body += String.fromCharCode(c); + util.print_debug('write_private_key c: '+ c); + var s2k = new openpgp_type_s2k(); + var hashKey = s2k.write(3, s2kHash, password, salt, c); + //if s2k, IV of same length as cipher's block + switch(this.symmetricEncryptionAlgorithm){ + case 3: + this.IVLength = 8; + this.IV = openpgp_crypto_getRandomBytes(this.IVLength); + ciphertextMPIs = normal_cfb_encrypt(function(block, key) { + var cast5 = new openpgp_symenc_cast5(); + cast5.setKey(key); + return cast5.encrypt(util.str2bin(block)); + }, this.IVLength, util.str2bin(hashKey.substring(0,16)), cleartextMPIs + sha1Hash, this.IV); + body += this.IV + ciphertextMPIs; + break; + case 7: + case 8: + case 9: + this.IVLength = 16; + this.IV = openpgp_crypto_getRandomBytes(this.IVLength); + ciphertextMPIs = normal_cfb_encrypt(AESencrypt, + this.IVLength, hashKey, cleartextMPIs + sha1Hash, this.IV); + body += this.IV + ciphertextMPIs; + break; + } + } + else{ + body += String.fromCharCode(0);//1 octet -- s2k, 0 for no s2k + body += key.d.toMPI() + key.p.toMPI() + key.q.toMPI() + key.u.toMPI(); + var checksum = util.calc_checksum(key.d.toMPI() + key.p.toMPI() + key.q.toMPI() + key.u.toMPI()); + body += String.fromCharCode(checksum/0x100) + String.fromCharCode(checksum%0x100);//DEPRECATED:s2k == 0, 255: 2 octet checksum, sum all octets%65536 + util.print_debug_hexstr_dump('write_private_key basic checksum: '+ checksum); + } + break; + default : + body = ""; + util.print_error("openpgp.packet.keymaterial.js\n"+'error writing private key, unknown type :'+keyType); + } + var header = openpgp_packet.write_packet_header(tag,body.length); + return {string: header+body , header: header, body: body}; + } + + /* + * Same as write_private_key, but has less information because of + * public key. + * @param {Integer} keyType Follows the OpenPGP algorithm standard, + * IE 1 corresponds to RSA. + * @param {RSA.keyObject} key + * @param timePacket + * @return {Object} {body: [string]OpenPGP packet body contents, + * header: [string] OpenPGP packet header, string: [string] header+body} + */ + function write_public_key(keyType, key, timePacket){ + var tag = 6; + var body = String.fromCharCode(4); + body += timePacket; + switch(keyType){ + case 1: + body += String.fromCharCode(1);//public key algo + body += key.n.toMPI(); + body += key.ee.toMPI(); + break; + default: + util.print_error("openpgp.packet.keymaterial.js\n"+'error writing private key, unknown type :'+keyType); + } + var header = openpgp_packet.write_packet_header(tag,body.length); + return {string: header+body , header: header, body: body}; + } + + + this.read_tag5 = read_tag5; + this.read_tag6 = read_tag6; + this.read_tag7 = read_tag7; + this.read_tag14 = read_tag14; + this.toString = toString; + this.read_pub_key = read_pub_key; + this.read_priv_key = read_priv_key; + this.decryptSecretMPIs = decryptSecretMPIs; + this.read_nodes = read_nodes; + this.verifyKey = verifyKey; + this.getKeyId = getKeyId; + this.getFingerprint = getFingerprint; + this.write_private_key = write_private_key; + this.write_public_key = write_public_key; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Literal Data Packet (Tag 11) + * + * RFC4880 5.9: A Literal Data packet contains the body of a message; data that + * is not to be further interpreted. + */ +function openpgp_packet_literaldata() { + this.tagType = 11; + + + /** + * Set the packet data to a javascript native string or a squence of + * bytes. Conversion to a proper utf8 encoding takes place when the + * packet is written. + * @param {String} str Any native javascript string + * @param {openpgp_packet_literaldata.formats} format + */ + this.set_data = function(str, format) { + this.format = format; + this.data = str; + } + + /** + * Set the packet data to value represented by the provided string + * of bytes together with the appropriate conversion format. + * @param {String} bytes The string of bytes + * @param {openpgp_packet_literaldata.formats} format + */ + this.set_data_bytes = function(bytes, format) { + this.format = format; + + if(format == openpgp_packet_literaldata.formats.utf8) + bytes = util.decode_utf8(bytes); + + this.data = bytes; + } + + /** + * Get the byte sequence representing the literal packet data + * @returns {String} A sequence of bytes + */ + this.get_data_bytes = function() { + if(this.format == openpgp_packet_literaldata.formats.utf8) + return util.encode_utf8(this.data); + else + return this.data; + } + + + + /** + * Parsing function for a literal data packet (tag 11). + * + * @param {String} input Payload of a tag 11 packet + * @param {Integer} position + * Position to start reading from the input string + * @param {Integer} len + * Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + this.read_packet = function(input, position, len) { + this.packetLength = len; + // - A one-octet field that describes how the data is formatted. + + var format = input[position]; + + this.filename = util.decode_utf8(input.substr(position + 2, input + .charCodeAt(position + 1))); + + this.date = new Date(parseInt(input.substr(position + 2 + + input.charCodeAt(position + 1), 4)) * 1000); + + var bytes = input.substring(position + 6 + + input.charCodeAt(position + 1)); + + this.set_data_bytes(bytes, format); + return this; + } + + /** + * Creates a string representation of the packet + * + * @param {String} data The data to be inserted as body + * @return {String} string-representation of the packet + */ + this.write_packet = function(data) { + this.set_data(data, openpgp_packet_literaldata.formats.utf8); + this.filename = util.encode_utf8("msg.txt"); + this.date = new Date(); + + data = this.get_data_bytes(); + + var result = openpgp_packet.write_packet_header(11, data.length + 6 + + this.filename.length); + result += this.format; + result += String.fromCharCode(this.filename.length); + result += this.filename; + result += String + .fromCharCode((Math.round(this.date.getTime() / 1000) >> 24) & 0xFF); + result += String + .fromCharCode((Math.round(this.date.getTime() / 1000) >> 16) & 0xFF); + result += String + .fromCharCode((Math.round(this.date.getTime() / 1000) >> 8) & 0xFF); + result += String + .fromCharCode(Math.round(this.date.getTime() / 1000) & 0xFF); + result += data; + return result; + } + + /** + * Generates debug output (pretty print) + * + * @return {String} String which gives some information about the keymaterial + */ + this.toString = function() { + return '5.9. Literal Data Packet (Tag 11)\n' + ' length: ' + + this.packetLength + '\n' + ' format: ' + this.format + + '\n' + ' filename:' + this.filename + '\n' + + ' date: ' + this.date + '\n' + ' data: |' + + this.data + '|\n' + ' rdata: |' + this.real_data + '|\n'; + } +} + +/** + * Data types in the literal packet + * @readonly + * @enum {String} + */ +openpgp_packet_literaldata.formats = { + /** Binary data */ + binary: 'b', + /** Text data */ + text: 't', + /** Utf8 data */ + utf8: 'u' +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the strange "Marker packet" (Tag 10) + * + * RFC4880 5.8: An experimental version of PGP used this packet as the Literal + * packet, but no released version of PGP generated Literal packets with this + * tag. With PGP 5.x, this packet has been reassigned and is reserved for use as + * the Marker packet. + * + * Such a packet MUST be ignored when received. + */ +function openpgp_packet_marker() { + this.tagType = 10; + /** + * Parsing function for a literal data packet (tag 10). + * + * @param {String} input Payload of a tag 10 packet + * @param {Integer} position + * Position to start reading from the input string + * @param {Integer} len + * Length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} Object representation + */ + function read_packet(input, position, len) { + this.packetLength = 3; + if (input[position].charCodeAt() == 0x50 && // P + input[position + 1].charCodeAt() == 0x47 && // G + input[position + 2].charCodeAt() == 0x50) // P + return this; + // marker packet does not contain "PGP" + return null; + } + + /** + * Generates Debug output + * + * @return {String} String which gives some information about the + * keymaterial + */ + function toString() { + return "5.8. Marker Packet (Obsolete Literal Packet) (Tag 10)\n" + + " packet reads: \"PGP\"\n"; + } + + this.read_packet = read_packet; + this.toString = toString; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Modification Detection Code Packet (Tag 19) + * + * RFC4880 5.14: The Modification Detection Code packet contains a SHA-1 hash of + * plaintext data, which is used to detect message modification. It is only used + * with a Symmetrically Encrypted Integrity Protected Data packet. The + * Modification Detection Code packet MUST be the last packet in the plaintext + * data that is encrypted in the Symmetrically Encrypted Integrity Protected + * Data packet, and MUST appear in no other place. + */ + +function openpgp_packet_modificationdetectioncode() { + this.tagType = 19; + this.hash = null; + /** + * parsing function for a modification detection code packet (tag 19). + * + * @param {String} input payload of a tag 19 packet + * @param {Integer} position + * position to start reading from the input string + * @param {Integer} len + * length of the packet or the remaining length of + * input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + function read_packet(input, position, len) { + this.packetLength = len; + + if (len != 20) { + util + .print_error("openpgp.packet.modificationdetectioncode.js\n" + + 'invalid length for a modification detection code packet!' + + len); + return null; + } + // - A 20-octet SHA-1 hash of the preceding plaintext data of the + // Symmetrically Encrypted Integrity Protected Data packet, + // including prefix data, the tag octet, and length octet of the + // Modification Detection Code packet. + this.hash = input.substring(position, position + 20); + return this; + } + + /* + * this packet is created within the encryptedintegrityprotected packet + * function write_packet(data) { } + */ + + /** + * generates debug output (pretty print) + * + * @return {String} String which gives some information about the + * modification detection code + */ + function toString() { + return '5.14 Modification detection code packet\n' + ' bytes (' + + this.hash.length + '): [' + util.hexstrdump(this.hash) + ']'; + } + this.read_packet = read_packet; + this.toString = toString; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the One-Pass Signature Packets (Tag 4) + * + * RFC4880 5.4: + * The One-Pass Signature packet precedes the signed data and contains + * enough information to allow the receiver to begin calculating any + * hashes needed to verify the signature. It allows the Signature + * packet to be placed at the end of the message, so that the signer + * can compute the entire signed message in one pass. + */ +function openpgp_packet_onepasssignature() { + this.tagType = 4; + this.version = null; // A one-octet version number. The current version is 3. + this.type = null; // A one-octet signature type. Signature types are described in RFC4880 Section 5.2.1. + this.hashAlgorithm = null; // A one-octet number describing the hash algorithm used. (See RFC4880 9.4) + this.publicKeyAlgorithm = null; // A one-octet number describing the public-key algorithm used. (See RFC4880 9.1) + this.signingKeyId = null; // An eight-octet number holding the Key ID of the signing key. + this.flags = null; // A one-octet number holding a flag showing whether the signature is nested. A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data. + + /** + * parsing function for a one-pass signature packet (tag 4). + * @param {String} input payload of a tag 4 packet + * @param {Integer} position position to start reading from the input string + * @param {Integer} len length of the packet or the remaining length of input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + function read_packet(input, position, len) { + this.packetLength = len; + var mypos = position; + // A one-octet version number. The current version is 3. + this.version = input.charCodeAt(mypos++); + + // A one-octet signature type. Signature types are described in + // Section 5.2.1. + this.type = input.charCodeAt(mypos++); + + // A one-octet number describing the hash algorithm used. + this.hashAlgorithm = input.charCodeAt(mypos++); + + // A one-octet number describing the public-key algorithm used. + this.publicKeyAlgorithm = input.charCodeAt(mypos++); + // An eight-octet number holding the Key ID of the signing key. + this.signingKeyId = new openpgp_type_keyid(); + this.signingKeyId.read_packet(input,mypos); + mypos += 8; + + // A one-octet number holding a flag showing whether the signature + // is nested. A zero value indicates that the next packet is + // another One-Pass Signature packet that describes another + // signature to be applied to the same message data. + this.flags = input.charCodeAt(mypos++); + return this; + } + + /** + * creates a string representation of a one-pass signature packet + * @param {Integer} type Signature types as described in RFC4880 Section 5.2.1. + * @param {Integer} hashalgorithm the hash algorithm used within the signature + * @param {openpgp_msg_privatekey} privatekey the private key used to generate the signature + * @param {Integer} length length of data to be signed + * @param {boolean} nested boolean showing whether the signature is nested. + * "true" indicates that the next packet is another One-Pass Signature packet + * that describes another signature to be applied to the same message data. + * @return {String} a string representation of a one-pass signature packet + */ + function write_packet(type, hashalgorithm, privatekey,length, nested) { + var result =""; + + result += openpgp_packet.write_packet_header(4,13); + result += String.fromCharCode(3); + result += String.fromCharCode(type); + result += String.fromCharCode(hashalgorithm); + result += String.fromCharCode(privatekey.privateKeyPacket.publicKey.publicKeyAlgorithm); + result += privatekey.getKeyId(); + if (nested) + result += String.fromCharCode(0); + else + result += String.fromCharCode(1); + + return result; + } + + /** + * generates debug output (pretty print) + * @return {String} String which gives some information about the one-pass signature packet + */ + function toString() { + return '5.4. One-Pass Signature Packets (Tag 4)\n'+ + ' length: '+this.packetLength+'\n'+ + ' type: '+this.type+'\n'+ + ' keyID: '+this.signingKeyId.toString()+'\n'+ + ' hashA: '+this.hashAlgorithm+'\n'+ + ' pubKeyA:'+this.publicKeyAlgorithm+'\n'+ + ' flags: '+this.flags+'\n'+ + ' version:'+this.version+'\n'; + } + + this.read_packet = read_packet; + this.toString = toString; + this.write_packet = write_packet; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the Signature Packet (Tag 2) + * + * RFC4480 5.2: + * A Signature packet describes a binding between some public key and + * some data. The most common signatures are a signature of a file or a + * block of text, and a signature that is a certification of a User ID. + */ +function openpgp_packet_signature() { + this.tagType = 2; + this.signatureType = null; + this.creationTime = null; + this.keyId = null; + this.signatureData = null; + this.signatureExpirationTime = null; + this.signatureNeverExpires = null; + this.signedHashValue = null; + this.MPIs = null; + this.publicKeyAlgorithm = null; + this.hashAlgorithm = null; + this.exportable = null; + this.trustLevel = null; + this.trustAmount = null; + this.regular_expression = null; + this.revocable = null; + this.keyExpirationTime = null; + this.keyNeverExpires = null; + this.preferredSymmetricAlgorithms = null; + this.revocationKeyClass = null; + this.revocationKeyAlgorithm = null; + this.revocationKeyFingerprint = null; + this.issuerKeyId = null; + this.notationFlags = null; + this.notationName = null; + this.notationValue = null; + this.preferredHashAlgorithms = null; + this.preferredCompressionAlgorithms = null; + this.keyServerPreferences = null; + this.preferredKeyServer = null; + this.isPrimaryUserID = null; + this.policyURI = null; + this.keyFlags = null; + this.signersUserId = null; + this.reasonForRevocationFlag = null; + this.reasonForRevocationString = null; + this.signatureTargetPublicKeyAlgorithm = null; + this.signatureTargetHashAlgorithm = null; + this.signatureTargetHash = null; + this.embeddedSignature = null; + this.verified = false; + + + /** + * parsing function for a signature packet (tag 2). + * @param {String} input payload of a tag 2 packet + * @param {Integer} position position to start reading from the input string + * @param {Integer} len length of the packet or the remaining length of input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + function read_packet(input, position, len) { + this.data = input.substring (position, position+len); + if (len < 0) { + util.print_debug("openpgp.packet.signature.js\n"+"openpgp_packet_signature read_packet length < 0 @:"+position); + return null; + } + var mypos = position; + this.packetLength = len; + // alert('starting parsing signature: '+position+' '+this.packetLength); + this.version = input[mypos++].charCodeAt(); + // switch on version (3 and 4) + switch (this.version) { + case 3: + // One-octet length of following hashed material. MUST be 5. + if (input[mypos++].charCodeAt() != 5) + util.print_debug("openpgp.packet.signature.js\n"+'invalid One-octet length of following hashed material. MUST be 5. @:'+(mypos-1)); + var sigpos = mypos; + // One-octet signature type. + this.signatureType = input[mypos++].charCodeAt(); + + // Four-octet creation time. + this.creationTime = new Date(((input[mypos++].charCodeAt()) << 24 | + (input[mypos++].charCodeAt() << 16) | (input[mypos++].charCodeAt() << 8) | + input[mypos++].charCodeAt())* 1000); + + // storing data appended to data which gets verified + this.signatureData = input.substring(position, mypos); + + // Eight-octet Key ID of signer. + this.keyId = input.substring(mypos, mypos +8); + mypos += 8; + + // One-octet public-key algorithm. + this.publicKeyAlgorithm = input[mypos++].charCodeAt(); + + // One-octet hash algorithm. + this.hashAlgorithm = input[mypos++].charCodeAt(); + + // Two-octet field holding left 16 bits of signed hash value. + this.signedHashValue = (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt(); + var mpicount = 0; + // Algorithm-Specific Fields for RSA signatures: + // - multiprecision integer (MPI) of RSA signature value m**d mod n. + if (this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) + mpicount = 1; + // Algorithm-Specific Fields for DSA signatures: + // - MPI of DSA value r. + // - MPI of DSA value s. + else if (this.publicKeyAlgorithm == 17) + mpicount = 2; + + this.MPIs = new Array(); + for (var i = 0; i < mpicount; i++) { + this.MPIs[i] = new openpgp_type_mpi(); + if (this.MPIs[i].read(input, mypos, (mypos-position)) != null && + !this.packetLength < (mypos-position)) { + mypos += this.MPIs[i].packetLength; + } else { + util.print_error('signature contains invalid MPI @:'+mypos); + } + } + break; + case 4: + this.signatureType = input[mypos++].charCodeAt(); + this.publicKeyAlgorithm = input[mypos++].charCodeAt(); + this.hashAlgorithm = input[mypos++].charCodeAt(); + + // Two-octet scalar octet count for following hashed subpacket + // data. + var hashed_subpacket_count = (input[mypos++].charCodeAt() << 8) + input[mypos++].charCodeAt(); + + // Hashed subpacket data set (zero or more subpackets) + var subpacket_length = 0; + while (hashed_subpacket_count != subpacket_length) { + if (hashed_subpacket_count < subpacket_length) { + util.print_debug("openpgp.packet.signature.js\n"+"hashed missed something: "+mypos+" c:"+hashed_subpacket_count+" l:"+subpacket_length); + } + + subpacket_length += this._raw_read_signature_sub_packet(input, + mypos + subpacket_length, hashed_subpacket_count + - subpacket_length); + } + + mypos += hashed_subpacket_count; + this.signatureData = input.substring(position, mypos); + + // alert("signatureData: "+util.hexstrdump(this.signatureData)); + + // Two-octet scalar octet count for the following unhashed subpacket + var subpacket_count = (input[mypos++].charCodeAt() << 8) + input[mypos++].charCodeAt(); + + // Unhashed subpacket data set (zero or more subpackets). + subpacket_length = 0; + while (subpacket_count != subpacket_length) { + if (subpacket_count < subpacket_length) { + util.print_debug("openpgp.packet.signature.js\n"+"missed something: "+subpacket_length+" c:"+subpacket_count+" "+" l:"+subpacket_length); + } + subpacket_length += this._raw_read_signature_sub_packet(input, + mypos + subpacket_length, subpacket_count + - subpacket_length); + + } + mypos += subpacket_count; + // Two-octet field holding the left 16 bits of the signed hash + // value. + this.signedHashValue = (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt(); + // One or more multiprecision integers comprising the signature. + // This portion is algorithm specific, as described above. + var mpicount = 0; + if (this.publicKeyAlgorithm > 0 && this.publicKeyAlgorithm < 4) + mpicount = 1; + else if (this.publicKeyAlgorithm == 17) + mpicount = 2; + + this.MPIs = new Array(); + for (var i = 0; i < mpicount; i++) { + this.MPIs[i] = new openpgp_type_mpi(); + if (this.MPIs[i].read(input, mypos, (mypos-position)) != null && + !this.packetLength < (mypos-position)) { + mypos += this.MPIs[i].packetLength; + } else { + util.print_error('signature contains invalid MPI @:'+mypos); + } + } + break; + default: + util.print_error("openpgp.packet.signature.js\n"+'unknown signature packet version'+this.version); + break; + } + // util.print_message("openpgp.packet.signature.js\n"+"end signature: l: "+this.packetLength+"m: "+mypos+" m-p: "+(mypos-position)); + return this; + } + /** + * creates a string representation of a message signature packet (tag 2). + * This can be only used on text data + * @param {Integer} signature_type should be 1 (one) + * @param {String} data data to be signed + * @param {openpgp_msg_privatekey} privatekey private key used to sign the message. (secMPIs MUST be unlocked) + * @return {String} string representation of a signature packet + */ + function write_message_signature(signature_type, data, privatekey) { + var publickey = privatekey.privateKeyPacket.publicKey; + var hash_algo = privatekey.getPreferredSignatureHashAlgorithm(); + var result = String.fromCharCode(4); + result += String.fromCharCode(signature_type); + result += String.fromCharCode(publickey.publicKeyAlgorithm); + result += String.fromCharCode(hash_algo); + var d = Math.round(new Date().getTime() / 1000); + var datesubpacket = write_sub_signature_packet(2,""+ + String.fromCharCode((d >> 24) & 0xFF) + + String.fromCharCode((d >> 16) & 0xFF) + + String.fromCharCode((d >> 8) & 0xFF) + + String.fromCharCode(d & 0xFF)); + var issuersubpacket = write_sub_signature_packet(16, privatekey.getKeyId()); + result += String.fromCharCode(((datesubpacket.length + issuersubpacket.length) >> 8) & 0xFF); + result += String.fromCharCode ((datesubpacket.length + issuersubpacket.length) & 0xFF); + result += datesubpacket; + result += issuersubpacket; + var trailer = ''; + + trailer += String.fromCharCode(4); + trailer += String.fromCharCode(0xFF); + trailer += String.fromCharCode((result.length) >> 24); + trailer += String.fromCharCode(((result.length) >> 16) & 0xFF); + trailer += String.fromCharCode(((result.length) >> 8) & 0xFF); + trailer += String.fromCharCode((result.length) & 0xFF); + var result2 = String.fromCharCode(0); + result2 += String.fromCharCode(0); + var hash = openpgp_crypto_hashData(hash_algo, data+result+trailer); + util.print_debug("DSA Signature is calculated with:|"+data+result+trailer+"|\n"+util.hexstrdump(data+result+trailer)+"\n hash:"+util.hexstrdump(hash)); + result2 += hash.charAt(0); + result2 += hash.charAt(1); + result2 += openpgp_crypto_signData(hash_algo,privatekey.privateKeyPacket.publicKey.publicKeyAlgorithm, + publickey.MPIs, + privatekey.privateKeyPacket.secMPIs, + data+result+trailer); + return {openpgp: (openpgp_packet.write_packet_header(2, (result+result2).length)+result + result2), + hash: util.get_hashAlgorithmString(hash_algo)}; + } + /** + * creates a string representation of a sub signature packet (See RFC 4880 5.2.3.1) + * @param {Integer} type subpacket signature type. Signature types as described in RFC4880 Section 5.2.3.2 + * @param {String} data data to be included + * @return {String} a string-representation of a sub signature packet (See RFC 4880 5.2.3.1) + */ + function write_sub_signature_packet(type, data) { + var result = ""; + result += openpgp_packet.encode_length(data.length+1); + result += String.fromCharCode(type); + result += data; + return result; + } + + // V4 signature sub packets + + this._raw_read_signature_sub_packet = function(input, position, len) { + if (len < 0) + util.print_debug("openpgp.packet.signature.js\n"+"_raw_read_signature_sub_packet length < 0 @:"+position); + var mypos = position; + var subplen = 0; + // alert('starting signature subpackage read at position:'+position+' length:'+len); + if (input[mypos].charCodeAt() < 192) { + subplen = input[mypos++].charCodeAt(); + } else if (input[mypos].charCodeAt() >= 192 && input[mypos].charCodeAt() < 224) { + subplen = ((input[mypos++].charCodeAt() - 192) << 8) + (input[mypos++].charCodeAt()) + 192; + } else if (input[mypos].charCodeAt() > 223 && input[mypos].charCodeAt() < 255) { + subplen = 1 << (input[mypos++].charCodeAt() & 0x1F); + } else if (input[mypos].charCodeAt() < 255) { + mypos++; + subplen = (input[mypos++].charCodeAt() << 24) | (input[mypos++].charCodeAt() << 16) + | (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt(); + } + + var type = input[mypos++].charCodeAt() & 0x7F; + // alert('signature subpacket type '+type+" with length: "+subplen); + // subpacket type + switch (type) { + case 2: // Signature Creation Time + this.creationTime = new Date(((input[mypos++].charCodeAt() << 24) | (input[mypos++].charCodeAt() << 16) + | (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt())*1000); + break; + case 3: // Signature Expiration Time + this.signatureExpirationTime = (input[mypos++].charCodeAt() << 24) + | (input[mypos++].charCodeAt() << 16) | (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + this.signatureNeverExpires = (this.signature_expiration_time == 0); + + break; + case 4: // Exportable Certification + this.exportable = input[mypos++].charCodeAt() == 1; + break; + case 5: // Trust Signature + this.trustLevel = input[mypos++].charCodeAt(); + this.trustAmount = input[mypos++].charCodeAt(); + break; + case 6: // Regular Expression + this.regular_expression = new String(); + for (var i = 0; i < subplen - 1; i++) + this.regular_expression += (input[mypos++]); + break; + case 7: // Revocable + this.revocable = input[mypos++].charCodeAt() == 1; + break; + case 9: // Key Expiration Time + this.keyExpirationTime = (input[mypos++].charCodeAt() << 24) + | (input[mypos++].charCodeAt() << 16) | (input[mypos++].charCodeAt() << 8) + | input[mypos++].charCodeAt(); + this.keyNeverExpires = (this.keyExpirationTime == 0); + break; + case 11: // Preferred Symmetric Algorithms + this.preferredSymmetricAlgorithms = new Array(); + for (var i = 0; i < subplen-1; i++) { + this.preferredSymmetricAlgorithms = input[mypos++].charCodeAt(); + } + break; + case 12: // Revocation Key + // (1 octet of class, 1 octet of public-key algorithm ID, 20 + // octets of + // fingerprint) + this.revocationKeyClass = input[mypos++].charCodeAt(); + this.revocationKeyAlgorithm = input[mypos++].charCodeAt(); + this.revocationKeyFingerprint = new Array(); + for ( var i = 0; i < 20; i++) { + this.revocationKeyFingerprint = input[mypos++].charCodeAt(); + } + break; + case 16: // Issuer + this.issuerKeyId = input.substring(mypos,mypos+8); + mypos += 8; + break; + case 20: // Notation Data + this.notationFlags = (input[mypos++].charCodeAt() << 24) | + (input[mypos++].charCodeAt() << 16) | + (input[mypos++].charCodeAt() << 8) | + (input[mypos++].charCodeAt()); + var nameLength = (input[mypos++].charCodeAt() << 8) | (input[mypos++].charCodeAt()); + var valueLength = (input[mypos++].charCodeAt() << 8) | (input[mypos++].charCodeAt()); + this.notationName = ""; + for (var i = 0; i < nameLength; i++) { + this.notationName += input[mypos++]; + } + this.notationValue = ""; + for (var i = 0; i < valueLength; i++) { + this.notationValue += input[mypos++]; + } + break; + case 21: // Preferred Hash Algorithms + this.preferredHashAlgorithms = new Array(); + for (var i = 0; i < subplen-1; i++) { + this.preferredHashAlgorithms = input[mypos++].charCodeAt(); + } + break; + case 22: // Preferred Compression Algorithms + this.preferredCompressionAlgorithms = new Array(); + for ( var i = 0; i < subplen-1; i++) { + this.preferredCompressionAlgorithms = input[mypos++].charCodeAt(); + } + break; + case 23: // Key Server Preferences + this.keyServerPreferences = new Array(); + for ( var i = 0; i < subplen-1; i++) { + this.keyServerPreferences = input[mypos++].charCodeAt(); + } + break; + case 24: // Preferred Key Server + this.preferredKeyServer = new String(); + for ( var i = 0; i < subplen-1; i++) { + this.preferredKeyServer += input[mypos++]; + } + break; + case 25: // Primary User ID + this.isPrimaryUserID = input[mypos++] != 0; + break; + case 26: // Policy URI + this.policyURI = new String(); + for ( var i = 0; i < subplen-1; i++) { + this.policyURI += input[mypos++]; + } + break; + case 27: // Key Flags + this.keyFlags = new Array(); + for ( var i = 0; i < subplen-1; i++) { + this.keyFlags = input[mypos++].charCodeAt(); + } + break; + case 28: // Signer's User ID + this.signersUserId = new String(); + for ( var i = 0; i < subplen-1; i++) { + this.signersUserId += input[mypos++]; + } + break; + case 29: // Reason for Revocation + this.reasonForRevocationFlag = input[mypos++].charCodeAt(); + this.reasonForRevocationString = new String(); + for ( var i = 0; i < subplen -2; i++) { + this.reasonForRevocationString += input[mypos++]; + } + break; + case 30: // Features + // TODO: to be implemented + return subplen+1; + case 31: // Signature Target + // (1 octet public-key algorithm, 1 octet hash algorithm, N octets hash) + this.signatureTargetPublicKeyAlgorithm = input[mypos++].charCodeAt(); + this.signatureTargetHashAlgorithm = input[mypos++].charCodeAt(); + var signatureTargetHashAlgorithmLength = 0; + switch(this.signatureTargetHashAlgorithm) { + case 1: // - MD5 [HAC] "MD5" + case 2: // - SHA-1 [FIPS180] "SHA1" + signatureTargetHashAlgorithmLength = 20; + break; + case 3: // - RIPE-MD/160 [HAC] "RIPEMD160" + case 8: // - SHA256 [FIPS180] "SHA256" + case 9: // - SHA384 [FIPS180] "SHA384" + case 10: // - SHA512 [FIPS180] "SHA512" + case 11: // - SHA224 [FIPS180] "SHA224" + break; + // 100 to 110 - Private/Experimental algorithm + default: + util.print_error("openpgp.packet.signature.js\n"+"unknown signature target hash algorithm:"+this.signatureTargetHashAlgorithm); + return null; + } + this.signatureTargetHash = new Array(); + for (var i = 0; i < signatureTargetHashAlgorithmLength; i++) { + this.signatureTargetHash[i] = input[mypos++]; + } + case 32: // Embedded Signature + this.embeddedSignature = new openpgp_packet_signature(); + this.embeddedSignature.read_packet(input, mypos, len -(mypos-position)); + return ((mypos+ this.embeddedSignature.packetLength) - position); + break; + case 100: // Private or experimental + case 101: // Private or experimental + case 102: // Private or experimental + case 103: // Private or experimental + case 104: // Private or experimental + case 105: // Private or experimental + case 106: // Private or experimental + case 107: // Private or experimental + case 108: // Private or experimental + case 109: // Private or experimental + case 110: // Private or experimental + util.print_error("openpgp.packet.signature.js\n"+'private or experimental signature subpacket type '+type+" @:"+mypos+" subplen:"+subplen+" len:"+len); + return subplen+1; + break; + case 0: // Reserved + case 1: // Reserved + case 8: // Reserved + case 10: // Placeholder for backward compatibility + case 13: // Reserved + case 14: // Reserved + case 15: // Reserved + case 17: // Reserved + case 18: // Reserved + case 19: // Reserved + default: + util.print_error("openpgp.packet.signature.js\n"+'unknown signature subpacket type '+type+" @:"+mypos+" subplen:"+subplen+" len:"+len); + return subplen+1; + break; + } + return mypos -position; + }; + /** + * verifys the signature packet. Note: not signature types are implemented + * @param {String} data data which on the signature applies + * @param {openpgp_msg_privatekey} key the public key to verify the signature + * @return {boolean} True if message is verified, else false. + */ + function verify(data, key) { + // calculating the trailer + var trailer = ''; + trailer += String.fromCharCode(this.version); + trailer += String.fromCharCode(0xFF); + trailer += String.fromCharCode(this.signatureData.length >> 24); + trailer += String.fromCharCode((this.signatureData.length >> 16) &0xFF); + trailer += String.fromCharCode((this.signatureData.length >> 8) &0xFF); + trailer += String.fromCharCode(this.signatureData.length & 0xFF); + switch(this.signatureType) { + case 0: // 0x00: Signature of a binary document. + if (this.version == 4) { + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.obj.publicKeyPacket.MPIs, data+this.signatureData+trailer); + } + break; + + case 1: // 0x01: Signature of a canonical text document. + if (this.version == 4) { + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.obj.publicKeyPacket.MPIs, data+this.signatureData+trailer); + return this.verified; + } + break; + + case 2: // 0x02: Standalone signature. + // This signature is a signature of only its own subpacket contents. + // It is calculated identically to a signature over a zero-length + // binary document. Note that it doesn't make sense to have a V3 + // standalone signature. + if (this.version == 3) { + this.verified = false; + break; + } + + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.obj.publicKeyPacket.MPIs, this.signatureData+trailer); + break; + case 16: + // 0x10: Generic certification of a User ID and Public-Key packet. + // The issuer of this certification does not make any particular + // assertion as to how well the certifier has checked that the owner + // of the key is in fact the person described by the User ID. + case 17: + // 0x11: Persona certification of a User ID and Public-Key packet. + // The issuer of this certification has not done any verification of + // the claim that the owner of this key is the User ID specified. + case 18: + // 0x12: Casual certification of a User ID and Public-Key packet. + // The issuer of this certification has done some casual + // verification of the claim of identity. + case 19: + // 0x13: Positive certification of a User ID and Public-Key packet. + // The issuer of this certification has done substantial + // verification of the claim of identity. + // + // Most OpenPGP implementations make their "key signatures" as 0x10 + // certifications. Some implementations can issue 0x11-0x13 + // certifications, but few differentiate between the types. + case 48: + // 0x30: Certification revocation signature + // This signature revokes an earlier User ID certification signature + // (signature class 0x10 through 0x13) or direct-key signature + // (0x1F). It should be issued by the same key that issued the + // revoked signature or an authorized revocation key. The signature + // is computed over the same data as the certificate that it + // revokes, and should have a later creation date than that + // certificate. + + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.MPIs, data+this.signatureData+trailer); + break; + + case 24: + // 0x18: Subkey Binding Signature + // This signature is a statement by the top-level signing key that + // indicates that it owns the subkey. This signature is calculated + // directly on the primary key and subkey, and not on any User ID or + // other packets. A signature that binds a signing subkey MUST have + // an Embedded Signature subpacket in this binding signature that + // contains a 0x19 signature made by the signing subkey on the + // primary key and subkey. + if (this.version == 3) { + this.verified = false; + break; + } + + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.MPIs, data+this.signatureData+trailer); + break; + case 25: + // 0x19: Primary Key Binding Signature + // This signature is a statement by a signing subkey, indicating + // that it is owned by the primary key and subkey. This signature + // is calculated the same way as a 0x18 signature: directly on the + // primary key and subkey, and not on any User ID or other packets. + + // When a signature is made over a key, the hash data starts with the + // octet 0x99, followed by a two-octet length of the key, and then body + // of the key packet. (Note that this is an old-style packet header for + // a key packet with two-octet length.) A subkey binding signature + // (type 0x18) or primary key binding signature (type 0x19) then hashes + // the subkey using the same format as the main key (also using 0x99 as + // the first octet). + case 31: + // 0x1F: Signature directly on a key + // This signature is calculated directly on a key. It binds the + // information in the Signature subpackets to the key, and is + // appropriate to be used for subpackets that provide information + // about the key, such as the Revocation Key subpacket. It is also + // appropriate for statements that non-self certifiers want to make + // about the key itself, rather than the binding between a key and a + // name. + case 32: + // 0x20: Key revocation signature + // The signature is calculated directly on the key being revoked. A + // revoked key is not to be used. Only revocation signatures by the + // key being revoked, or by an authorized revocation key, should be + // considered valid revocation signatures. + case 40: + // 0x28: Subkey revocation signature + // The signature is calculated directly on the subkey being revoked. + // A revoked subkey is not to be used. Only revocation signatures + // by the top-level signature key that is bound to this subkey, or + // by an authorized revocation key, should be considered valid + // revocation signatures. + this.verified = openpgp_crypto_verifySignature(this.publicKeyAlgorithm, this.hashAlgorithm, + this.MPIs, key.MPIs, data+this.signatureData+trailer); + break; + + // Key revocation signatures (types 0x20 and 0x28) + // hash only the key being revoked. + case 64: + // 0x40: Timestamp signature. + // This signature is only meaningful for the timestamp contained in + // it. + case 80: + // 0x50: Third-Party Confirmation signature. + // This signature is a signature over some other OpenPGP Signature + // packet(s). It is analogous to a notary seal on the signed data. + // A third-party signature SHOULD include Signature Target + // subpacket(s) to give easy identification. Note that we really do + // mean SHOULD. There are plausible uses for this (such as a blind + // party that only sees the signature, not the key or source + // document) that cannot include a target subpacket. + default: + util.print_error("openpgp.packet.signature.js\n"+"signature verification for type"+ this.signatureType+" not implemented"); + break; + } + return this.verified; + } + /** + * generates debug output (pretty print) + * @return {String} String which gives some information about the signature packet + */ + + function toString () { + if (this.version == 3) { + var result = '5.2. Signature Packet (Tag 2)\n'+ + "Packet Length: :"+this.packetLength+'\n'+ + "Packet version: :"+this.version+'\n'+ + "One-octet signature type :"+this.signatureType+'\n'+ + "Four-octet creation time. :"+this.creationTime+'\n'+ + "Eight-octet Key ID of signer. :"+util.hexidump(this.keyId)+'\n'+ + "One-octet public-key algorithm. :"+this.publicKeyAlgorithm+'\n'+ + "One-octet hash algorithm. :"+this.hashAlgorithm+'\n'+ + "Two-octet field holding left\n" + + " 16 bits of signed hash value. :"+this.signedHashValue+'\n'; + } else { + var result = '5.2. Signature Packet (Tag 2)\n'+ + "Packet Length: :"+this.packetLength+'\n'+ + "Packet version: :"+this.version+'\n'+ + "One-octet signature type :"+this.signatureType+'\n'+ + "One-octet public-key algorithm. :"+this.publicKeyAlgorithm+'\n'+ + "One-octet hash algorithm. :"+this.hashAlgorithm+'\n'+ + "Two-octet field holding left\n" + + " 16 bits of signed hash value. :"+this.signedHashValue+'\n'+ + "Signature Creation Time :"+this.creationTime+'\n'+ + "Signature Expiration Time :"+this.signatureExpirationTime+'\n'+ + "Signature Never Expires :"+this.signatureNeverExpires+'\n'+ + "Exportable Certification :"+this.exportable+'\n'+ + "Trust Signature level: :"+this.trustLevel+' amount'+this.trustAmount+'\n'+ + "Regular Expression :"+this.regular_expression+'\n'+ + "Revocable :"+this.revocable+'\n'+ + "Key Expiration Time :"+this.keyExpirationTime+" "+this.keyNeverExpires+'\n'+ + "Preferred Symmetric Algorithms :"+this.preferredSymmetricAlgorithms+'\n'+ + "Revocation Key"+'\n'+ + " ( 1 octet of class, :"+this.revocationKeyClass +'\n'+ + " 1 octet of public-key ID, :" +this.revocationKeyAlgorithm+'\n'+ + " 20 octets of fingerprint) :"+this.revocationKeyFingerprint+'\n'+ + "Issuer :"+util.hexstrdump(this.issuerKeyId)+'\n'+ + "Preferred Hash Algorithms :"+this.preferredHashAlgorithms+'\n'+ + "Preferred Compression Alg. :"+this.preferredCompressionAlgorithms+'\n'+ + "Key Server Preferences :"+this.keyServerPreferences+'\n'+ + "Preferred Key Server :"+this.preferredKeyServer+'\n'+ + "Primary User ID :"+this.isPrimaryUserID+'\n'+ + "Policy URI :"+this.policyURI+'\n'+ + "Key Flags :"+this.keyFlags+'\n'+ + "Signer's User ID :"+this.signersUserId+'\n'+ + "Notation :"+this.notationName+" = "+this.notationValue+"\n"+ + "Reason for Revocation\n"+ + " Flag :"+this.reasonForRevocationFlag+'\n'+ + " Reason :"+this.reasonForRevocationString+'\nMPI:\n'; + } + for (var i = 0; i < this.MPIs.length; i++) { + result += this.MPIs[i].toString(); + } + return result; + } + + /** + * gets the issuer key id of this signature + * @return {String} issuer key id as string (8bytes) + */ + function getIssuer() { + if (this.version == 4) + return this.issuerKeyId; + if (this.verions == 4) + return this.keyId; + return null; + } + + /** + * Tries to get the corresponding public key out of the public keyring for the issuer created this signature + * @return {Object} {obj: [openpgp_msg_publickey], text: [String]} if found the public key will be returned. null otherwise + */ + function getIssuerKey() { + var result = null; + if (this.version == 4) { + result = openpgp.keyring.getPublicKeysForKeyId(this.issuerKeyId); + } else if (this.version == 3) { + result = openpgp.keyring.getPublicKeysForKeyId(this.keyId); + } else return null; + if (result.length == 0) + return null; + return result[0]; + } + this.getIssuerKey = getIssuerKey; + this.getIssuer = getIssuer; + this.write_message_signature = write_message_signature; + this.verify = verify; + this.read_packet = read_packet; + this.toString = toString; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the User Attribute Packet (Tag 17) + * The User Attribute packet is a variation of the User ID packet. It + * is capable of storing more types of data than the User ID packet, + * which is limited to text. Like the User ID packet, a User Attribute + * packet may be certified by the key owner ("self-signed") or any other + * key owner who cares to certify it. Except as noted, a User Attribute + * packet may be used anywhere that a User ID packet may be used. + * + * While User Attribute packets are not a required part of the OpenPGP + * standard, implementations SHOULD provide at least enough + * compatibility to properly handle a certification signature on the + * User Attribute packet. A simple way to do this is by treating the + * User Attribute packet as a User ID packet with opaque contents, but + * an implementation may use any method desired. + */ +function openpgp_packet_userattribute() { + this.tagType = 17; + this.certificationSignatures = new Array(); + this.certificationRevocationSignatures = new Array(); + this.revocationSignatures = new Array(); + this.parentNode = null; + + /** + * parsing function for a user attribute packet (tag 17). + * @param {String} input payload of a tag 17 packet + * @param {Integer} position position to start reading from the input string + * @param {Integer} len length of the packet or the remaining length of input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + function read_packet (input, position, len) { + var total_len = 0; + this.packetLength = len; + this.userattributes = new Array(); + var count = 0; + var mypos = position; + while (len != total_len) { + var current_len = 0; + // 4.2.2.1. One-Octet Lengths + if (input[mypos].charCodeAt() < 192) { + packet_length = input[mypos++].charCodeAt(); + current_len = 1; + // 4.2.2.2. Two-Octet Lengths + } else if (input[mypos].charCodeAt() >= 192 && input[mypos].charCodeAt() < 224) { + packet_length = ((input[mypos++].charCodeAt() - 192) << 8) + + (input[mypos++].charCodeAt()) + 192; + current_len = 2; + // 4.2.2.4. Partial Body Lengths + } else if (input[mypos].charCodeAt() > 223 && input[mypos].charCodeAt() < 255) { + packet_length = 1 << (input[mypos++].charCodeAt() & 0x1F); + current_len = 1; + // 4.2.2.3. Five-Octet Lengths + } else { + current_len = 5; + mypos++; + packet_length = (input[mypos++].charCodeAt() << 24) | (input[mypos++].charCodeAt() << 16) + | (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt(); + } + + var subpackettype = input[mypos++].charCodeAt(); + packet_length--; + current_len++; + this.userattributes[count] = new Array(); + this.userattributes[count] = input.substring(mypos, mypos + packet_length); + mypos += packet_length; + total_len += current_len+packet_length; + } + this.packetLength = mypos - position; + return this; + } + + /** + * generates debug output (pretty print) + * @return {String} String which gives some information about the user attribute packet + */ + function toString() { + var result = '5.12. User Attribute Packet (Tag 17)\n'+ + ' AttributePackets: (count = '+this.userattributes.length+')\n'; + for (var i = 0; i < this.userattributes.length; i++) { + result += ' ('+this.userattributes[i].length+') bytes: ['+util.hexidump(this.userattributes[i])+']\n'; + } + return result; + } + + /** + * Continue parsing packets belonging to the user attribute packet such as signatures + * @param {Object} parent_node the parent object + * @param {String} input input string to read the packet(s) from + * @param {Integer} position start position for the parser + * @param {Integer} len length of the packet(s) or remaining length of input + * @return {Integer} length of nodes read + */ + function read_nodes(parent_node, input, position, len) { + + this.parentNode = parent_node; + var exit = false; + var pos = position; + var l = len; + while (input.length != pos) { + var result = openpgp_packet.read_packet(input, pos, l); + if (result == null) { + util.print_error("openpgp.packet.userattribute.js\n"+'[user_attr] parsing ends here @:' + pos + " l:" + l); + break; + } else { + switch (result.tagType) { + case 2: // Signature Packet + if (result.signatureType > 15 + && result.signatureType < 20) // certification + // // + // signature + this.certificationSignatures[this.certificationSignatures.length] = result; + else if (result.signatureType == 32) // certification revocation signature + this.certificationRevocationSignatures[this.certificationRevocationSignatures.length] = result; + pos += result.packetLength + result.headerLength; + l = len - (pos - position); + break; + default: + this.data = input; + this.position = position - parent_node.packetLength; + this.len = pos - position; + return this.len; + break; + } + } + } + this.data = input; + this.position = position - parent_node.packetLength; + this.len = pos - position; + return this.len; + + } + + this.read_packet = read_packet; + this.read_nodes = read_nodes; + this.toString = toString; + +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the User ID Packet (Tag 13) + * A User ID packet consists of UTF-8 text that is intended to represent + * the name and email address of the key holder. By convention, it + * includes an RFC 2822 [RFC2822] mail name-addr, but there are no + * restrictions on its content. The packet length in the header + * specifies the length of the User ID. + */ + +function openpgp_packet_userid() { + this.text = '' + this.tagType = 13; + this.certificationSignatures = new Array(); + this.certificationRevocationSignatures = new Array(); + this.revocationSignatures = new Array(); + this.parentNode = null; + + /** + * Set the packet text field to a native javascript string + * Conversion to a proper utf8 encoding takes place when the + * packet is written. + * @param {String} str Any native javascript string + */ + this.set_text = function(str) { + this.text = str; + } + + /** + * Set the packet text to value represented by the provided string + * of bytes. + * @param {String} bytes A string of bytes + */ + this.set_text_bytes = function(bytes) { + this.text = util.decode_utf8(bytes); + } + + /** + * Get the byte sequence representing the text of this packet. + * @returns {String} A sequence of bytes + */ + this.get_text_bytes = function() { + return util.encode_utf8(this.text); + } + + + /** + * Parsing function for a user id packet (tag 13). + * @param {String} input payload of a tag 13 packet + * @param {Integer} position position to start reading from the input string + * @param {Integer} len length of the packet or the remaining length of input at position + * @return {openpgp_packet_encrypteddata} object representation + */ + this.read_packet = function(input, position, len) { + this.packetLength = len; + + var bytes = ''; + for ( var i = 0; i < len; i++) { + bytes += input[position + i]; + } + + this.set_text_bytes(bytes); + return this; + } + + /** + * Creates a string representation of the user id packet + * @param {String} user_id the user id as string ("John Doe 15 + && result.signatureType < 20) { // certification + // // + // signature + this.certificationSignatures[this.certificationSignatures.length] = result; + break; + } else if (result.signatureType == 48) {// certification revocation signature + this.certificationRevocationSignatures[this.certificationRevocationSignatures.length] = result; + break; + } else if (result.signatureType == 24) { // omg. standalone signature + this.certificationSignatures[this.certificationSignatures.length] = result; + break; + } else { + util.print_debug("unknown sig t: "+result.signatureType+"@"+(pos - (result.packetLength + result.headerLength))); + } + default: + this.data = input; + this.position = position - parent_node.packetLength; + this.len = pos - position -(result.headerLength + result.packetLength); + return this.len; + } + } + } + this.data = input; + this.position = position - parent_node.packetLength; + this.len = pos - position -(result.headerLength + result.packetLength); + return this.len; + } else if (parent_node.tagType == 5) { // secret Key + this.parentNode = parent_node; + var exit = false; + var pos = position; + while (input.length != pos) { + var result = openpgp_packet.read_packet(input, pos, l - (pos - position)); + if (result == null) { + util.print_error('parsing ends here @:' + pos + " l:" + l); + break; + } else { + pos += result.packetLength + result.headerLength; + l = input.length - pos; + switch (result.tagType) { + case 2: // Signature Packet certification signature + if (result.signatureType > 15 + && result.signatureType < 20) + this.certificationSignatures[this.certificationSignatures.length] = result; + // certification revocation signature + else if (result.signatureType == 48) + this.certificationRevocationSignatures[this.certificationRevocationSignatures.length] = result; + default: + this.data = input; + this.position = position - parent_node.packetLength; + this.len = pos - position -(result.headerLength + result.packetLength); + return this.len; + } + } + } + } else { + util.print_error("unknown parent node for a userId packet "+parent_node.tagType); + } + } + + /** + * generates debug output (pretty print) + * @return {String} String which gives some information about the user id packet + */ + this.toString = function() { + var result = ' 5.11. User ID Packet (Tag 13)\n' + ' text (' + + this.text.length + '): "' + this.text.replace("<", "<") + + '"\n'; + result +="certification signatures:\n"; + for (var i = 0; i < this.certificationSignatures.length; i++) { + result += " "+this.certificationSignatures[i].toString(); + } + result +="certification revocation signatures:\n"; + for (var i = 0; i < this.certificationRevocationSignatures.length; i++) { + result += " "+this.certificationRevocationSignatures[i].toString(); + } + return result; + } + + /** + * lookup function to find certification revocation signatures + * @param {String} keyId string containing the key id of the issuer of this signature + * @return a CertificationRevocationSignature if found; otherwise null + */ + this.hasCertificationRevocationSignature = function(keyId) { + for (var i = 0; i < this.certificationRevocationSignatures.length; i++) { + if ((this.certificationRevocationSignatures[i].version == 3 && + this.certificationRevocationSignatures[i].keyId == keyId) || + (this.certificationRevocationSignatures[i].version == 4 && + this.certificationRevocationSignatures[i].issuerKeyId == keyId)) + return this.certificationRevocationSignatures[i]; + } + return null; + } + + /** + * Verifies all certification signatures. This method does not consider possible revocation signatures. + * @param {Object} publicKeyPacket the top level key material + * @return {Integer[]} An array of integers corresponding to the array of certification signatures. The meaning of each integer is the following: + * 0 = bad signature + * 1 = signature expired + * 2 = issuer key not available + * 3 = revoked + * 4 = signature valid + * 5 = signature by key owner expired + * 6 = signature by key owner revoked + */ + this.verifyCertificationSignatures = function(publicKeyPacket) { + var bytes = this.get_text_bytes(); + result = new Array(); + for (var i = 0 ; i < this.certificationSignatures.length; i++) { + // A certification signature (type 0x10 through 0x13) hashes the User + // ID being bound to the key into the hash context after the above + // data. A V3 certification hashes the contents of the User ID or + // attribute packet packet, without any header. A V4 certification + // hashes the constant 0xB4 for User ID certifications or the constant + // 0xD1 for User Attribute certifications, followed by a four-octet + // number giving the length of the User ID or User Attribute data, and + // then the User ID or User Attribute data. + + if (this.certificationSignatures[i].version == 4) { + if (this.certificationSignatures[i].signatureExpirationTime != null && + this.certificationSignatures[i].signatureExpirationTime != null && + this.certificationSignatures[i].signatureExpirationTime != 0 && + !this.certificationSignatures[i].signatureNeverExpires && + new Date(this.certificationSignatures[i].creationTime.getTime() +(this.certificationSignatures[i].signatureExpirationTime*1000)) < new Date()) { + if (this.certificationSignatures[i].issuerKeyId == publicKeyPacket.getKeyId()) + result[i] = 5; + else + result[i] = 1; + continue; + } + if (this.certificationSignatures[i].issuerKeyId == null) { + result[i] = 0; + continue; + } + var issuerPublicKey = openpgp.keyring.getPublicKeysForKeyId(this.certificationSignatures[i].issuerKeyId); + if (issuerPublicKey == null || issuerPublicKey.length == 0) { + result[i] = 2; + continue; + } + // TODO: try to verify all returned issuer public keys (key ids are not unique!) + var issuerPublicKey = issuerPublicKey[0]; + var signingKey = issuerPublicKey.obj.getSigningKey(); + if (signingKey == null) { + result[i] = 0; + continue; + } + var revocation = this.hasCertificationRevocationSignature(this.certificationSignatures[i].issuerKeyId); + if (revocation != null && revocation.creationTime > + this.certificationSignatures[i].creationTime) { + + var signaturedata = String.fromCharCode(0x99)+ publicKeyPacket.header.substring(1)+ + publicKeyPacket.data+String.fromCharCode(0xB4)+ + String.fromCharCode((bytes.length >> 24) & 0xFF)+ + String.fromCharCode((bytes.length >> 16) & 0xFF)+ + String.fromCharCode((bytes.length >> 8) & 0xFF)+ + String.fromCharCode((bytes.length) & 0xFF)+ + bytes; + if (revocation.verify(signaturedata, signingKey)) { + if (this.certificationSignatures[i].issuerKeyId == publicKeyPacket.getKeyId()) + result[i] = 6; + else + result[i] = 3; + continue; + } + } + + var signaturedata = String.fromCharCode(0x99)+ publicKeyPacket.header.substring(1)+ + publicKeyPacket.data+String.fromCharCode(0xB4)+ + String.fromCharCode((bytes.length >> 24) & 0xFF)+ + String.fromCharCode((bytes.length >> 16) & 0xFF)+ + String.fromCharCode((bytes.length >> 8) & 0xFF)+ + String.fromCharCode((bytes.length) & 0xFF)+ + bytes; + if (this.certificationSignatures[i].verify(signaturedata, signingKey)) { + result[i] = 4; + } else + result[i] = 0; + } else if (this.certificationSignatures[i].version == 3) { + if (this.certificationSignatures[i].keyId == null) { + result[i] = 0; + continue; + } + var issuerPublicKey = openpgp.keyring.getPublicKeysForKeyId(this.certificationSignatures[i].keyId); + if (issuerPublicKey == null || issuerPublicKey.length == 0) { + result[i] = 2; + continue; + } + issuerPublicKey = issuerPublicKey[0]; + var signingKey = publicKey.obj.getSigningKey(); + if (signingKey == null) { + result[i] = 0; + continue; + } + var revocation = this.hasCertificationRevocationSignature(this.certificationSignatures[i].keyId); + if (revocation != null && revocation.creationTime > + this.certificationSignatures[i].creationTime) { + var signaturedata = String.fromCharCode(0x99)+ this.publicKeyPacket.header.substring(1)+ + this.publicKeyPacket.data+bytes; + if (revocation.verify(signaturedata, signingKey)) { + if (revocation.keyId == publicKeyPacket.getKeyId()) + result[i] = 6; + else + result[i] = 3; + continue; + } + } + var signaturedata = String.fromCharCode(0x99)+ publicKeyPacket.header.substring(1)+ + publicKeyPacket.data + bytes; + if (this.certificationSignatures[i].verify(signaturedata, signingKey)) { + result[i] = 4; + } else + result[i] = 0; + } else { + result[i] = 0; + } + } + return result; + } + + /** + * verifies the signatures of the user id + * @return 0 if the userid is valid; 1 = userid expired; 2 = userid revoked + */ + this.verify = function(publicKeyPacket) { + var result = this.verifyCertificationSignatures(publicKeyPacket); + if (result.indexOf(6) != -1) + return 2; + if (result.indexOf(5) != -1) + return 1; + return 0; + } + + // TODO: implementation missing + this.addCertification = function(publicKeyPacket, privateKeyPacket) { + + } + + // TODO: implementation missing + this.revokeCertification = function(publicKeyPacket, privateKeyPacket) { + + } +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of type key id (RFC4880 3.3) + * A Key ID is an eight-octet scalar that identifies a key. + Implementations SHOULD NOT assume that Key IDs are unique. The + section "Enhanced Key Formats" below describes how Key IDs are + formed. + */ +function openpgp_type_keyid() { + /** + * Parsing method for a key id + * @param {String} input Input to read the key id from + * @param {integer} position Position where to start reading the key + * id from input + * @return {openpgp_type_keyid} This object + */ + function read_packet(input, position) { + this.bytes = input.substring(position, position+8); + return this; + } + + /** + * Generates debug output (pretty print) + * @return {String} Key Id as hexadecimal string + */ + function toString() { + return util.hexstrdump(this.bytes); + } + + this.read_packet = read_packet; + this.toString = toString; +}; +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +// Hint: We hold our MPIs as an array of octets in big endian format preceeding a two +// octet scalar: MPI: [a,b,c,d,e,f] +// - MPI size: (a << 8) | b +// - MPI = c | d << 8 | e << ((MPI.length -2)*8) | f ((MPI.length -2)*8) + +/** + * @class + * @classdescImplementation of type MPI (RFC4880 3.2) + * Multiprecision integers (also called MPIs) are unsigned integers used + * to hold large integers such as the ones used in cryptographic + * calculations. + * An MPI consists of two pieces: a two-octet scalar that is the length + * of the MPI in bits followed by a string of octets that contain the + * actual integer. + */ +function openpgp_type_mpi() { + this.MPI = null; + this.mpiBitLength = null; + this.mpiByteLength = null; + this.data = null; + /** + * Parsing function for a mpi (RFC 4880 3.2). + * @param {String} input Payload of mpi data + * @param {Integer} position Position to start reading from the input + * string + * @param {Integer} len Length of the packet or the remaining length of + * input at position + * @return {openpgp_type_mpi} Object representation + */ + function read(input, position, len) { + var mypos = position; + + this.mpiBitLength = (input[mypos++].charCodeAt() << 8) | input[mypos++].charCodeAt(); + + // Additional rules: + // + // The size of an MPI is ((MPI.length + 7) / 8) + 2 octets. + // + // The length field of an MPI describes the length starting from its + // most significant non-zero bit. Thus, the MPI [00 02 01] is not + // formed correctly. It should be [00 01 01]. + + // TODO: Verification of this size method! This size calculation as + // specified above is not applicable in JavaScript + this.mpiByteLength = (this.mpiBitLength - (this.mpiBitLength % 8)) / 8; + if (this.mpiBitLength % 8 != 0) + this.mpiByteLength++; + + this.MPI = input.substring(mypos,mypos+this.mpiByteLength); + this.data = input.substring(position, position+2+this.mpiByteLength); + this.packetLength = this.mpiByteLength +2; + return this; + } + + /** + * Generates debug output (pretty print) + * @return {String} String which gives some information about the mpi + */ + function toString() { + var r = " MPI("+this.mpiBitLength+"b/"+this.mpiByteLength+"B) : 0x"; + r+=util.hexstrdump(this.MPI); + return r+'\n'; + } + + /** + * Converts the mpi to an BigInteger object + * @return {BigInteger} + */ + function getBigInteger() { + return new BigInteger(util.hexstrdump(this.MPI),16); + } + + + function getBits(num) { + for (var i = 0; i < 9; i++) + if (num >> i == 0) + return i; + } + + /** + * Gets the length of the mpi in bytes + * @return {Integer} Mpi byte length + */ + function getByteLength() { + return this.mpiByteLength; + } + + /** + * Creates an mpi from the specified string + * @param {String} data Data to read the mpi from + * @return {openpgp_type_mpi} + */ + function create(data) { + this.MPI = data; + this.mpiBitLength = (data.length -1) *8 + getBits(data.charCodeAt(0)); + this.mpiByteLength = data.length; + return this; + } + + /** + * Converts the mpi object to a string as specified in RFC4880 3.2 + * @return {String} mpi Byte representation + */ + function toBin() { + var result = String.fromCharCode((this.mpiBitLength >> 8) & 0xFF); + result += String.fromCharCode(this.mpiBitLength & 0xFF); + result += this.MPI; + return result; + } + + this.read = read; + this.toBigInteger = getBigInteger; + this.toString = toString; + this.create = create; + this.toBin = toBin; + this.getByteLength = getByteLength; +} + +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +/** + * @class + * @classdesc Implementation of the String-to-key specifier (RFC4880 3.7) + * String-to-key (S2K) specifiers are used to convert passphrase strings + into symmetric-key encryption/decryption keys. They are used in two + places, currently: to encrypt the secret part of private keys in the + private keyring, and to convert passphrases to encryption keys for + symmetrically encrypted messages. + */ +function openpgp_type_s2k() { + /** + * Parsing function for a string-to-key specifier (RFC 4880 3.7). + * @param {String} input Payload of string-to-key specifier + * @param {Integer} position Position to start reading from the input string + * @return {openpgp_type_s2k} Object representation + */ + function read(input, position) { + var mypos = position; + this.type = input[mypos++].charCodeAt(); + switch (this.type) { + case 0: // Simple S2K + // Octet 1: hash algorithm + this.hashAlgorithm = input[mypos++].charCodeAt(); + this.s2kLength = 1; + break; + + case 1: // Salted S2K + // Octet 1: hash algorithm + this.hashAlgorithm = input[mypos++].charCodeAt(); + + // Octets 2-9: 8-octet salt value + this.saltValue = input.substring(mypos, mypos+8); + mypos += 8; + this.s2kLength = 9; + break; + + case 3: // Iterated and Salted S2K + // Octet 1: hash algorithm + this.hashAlgorithm = input[mypos++].charCodeAt(); + + // Octets 2-9: 8-octet salt value + this.saltValue = input.substring(mypos, mypos+8); + mypos += 8; + + // Octet 10: count, a one-octet, coded value + this.EXPBIAS = 6; + var c = input[mypos++].charCodeAt(); + this.count = (16 + (c & 15)) << ((c >> 4) + this.EXPBIAS); + this.s2kLength = 10; + break; + + case 101: + if(input.substring(mypos+1, mypos+4) == "GNU") { + this.hashAlgorithm = input[mypos++].charCodeAt(); + mypos += 3; // GNU + var gnuExtType = 1000 + input[mypos++].charCodeAt(); + if(gnuExtType == 1001) { + this.type = gnuExtType; + this.s2kLength = 5; + // GnuPG extension mode 1001 -- don't write secret key at all + } else { + util.print_error("unknown s2k gnu protection mode! "+this.type); + } + } else { + util.print_error("unknown s2k type! "+this.type); + } + break; + + case 2: // Reserved value + default: + util.print_error("unknown s2k type! "+this.type); + break; + } + return this; + } + + + /** + * writes an s2k hash based on the inputs. + * @return {String} Produced key of hashAlgorithm hash length + */ + function write(type, hash, passphrase, salt, c){ + this.type = type; + if(this.type == 3){this.saltValue = salt; + this.hashAlgorithm = hash; + this.count = (16 + (c & 15)) << ((c >> 4) + 6); + this.s2kLength = 10; + } + return this.produce_key(passphrase); + } + + /** + * Produces a key using the specified passphrase and the defined + * hashAlgorithm + * @param {String} passphrase Passphrase containing user input + * @return {String} Produced key with a length corresponding to + * hashAlgorithm hash length + */ + function produce_key(passphrase, numBytes) { + passphrase = util.encode_utf8(passphrase); + if (this.type == 0) { + return openpgp_crypto_hashData(this.hashAlgorithm,passphrase); + } else if (this.type == 1) { + return openpgp_crypto_hashData(this.hashAlgorithm,this.saltValue+passphrase); + } else if (this.type == 3) { + var isp = []; + isp[0] = this.saltValue+passphrase; + while (isp.length*(this.saltValue+passphrase).length < this.count) + isp.push(this.saltValue+passphrase); + isp = isp.join(''); + if (isp.length > this.count) + isp = isp.substr(0, this.count); + if(numBytes && (numBytes == 24 || numBytes == 32)){ //This if accounts for RFC 4880 3.7.1.1 -- If hash size is greater than block size, use leftmost bits. If blocksize larger than hash size, we need to rehash isp and prepend with 0. + var key = openpgp_crypto_hashData(this.hashAlgorithm,isp); + return key + openpgp_crypto_hashData(this.hashAlgorithm,String.fromCharCode(0)+isp); + } + return openpgp_crypto_hashData(this.hashAlgorithm,isp); + } else return null; + } + + this.read = read; + this.write = write; + this.produce_key = produce_key; +} +// GPG4Browsers - An OpenPGP implementation in javascript +// Copyright (C) 2011 Recurity Labs GmbH +// +// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +var Util = function() { + + this.emailRegEx = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/; + + this.hexdump = function(str) { + var r=[]; + var e=str.length; + var c=0; + var h; + var i = 0; + while(c' + * @param {String} str String of the debug message + * @return {String} An HTML tt entity containing a paragraph with a + * style attribute where the debug message is HTMLencoded in. + */ + this.print_debug = function(str) { + if (openpgp.config.debug) { + str = openpgp_encoding_html_encode(str); + showMessages("

    "+str.replace(/\n/g,"
    ")+"

    "); + } + }; + + /** + * Helper function to print a debug message. Debug + * messages are only printed if + * openpgp.config.debug is set to true. The calling + * Javascript context MUST define + * a "showMessages(text)" function. Line feeds ('\n') + * are automatically converted to HTML line feeds '
    ' + * Different than print_debug because will call hexstrdump iff necessary. + * @param {String} str String of the debug message + * @return {String} An HTML tt entity containing a paragraph with a + * style attribute where the debug message is HTMLencoded in. + */ + this.print_debug_hexstr_dump = function(str,strToHex) { + if (openpgp.config.debug) { + str = str + this.hexstrdump(strToHex); + str = openpgp_encoding_html_encode(str); + showMessages("

    "+str.replace(/\n/g,"
    ")+"

    "); + } + }; + + /** + * Helper function to print an error message. + * The calling Javascript context MUST define + * a "showMessages(text)" function. Line feeds ('\n') + * are automatically converted to HTML line feeds '
    ' + * @param {String} str String of the error message + * @return {String} A HTML paragraph entity with a style attribute + * containing the HTML encoded error message + */ + this.print_error = function(str) { + str = openpgp_encoding_html_encode(str); + showMessages("

    ERROR: "+str.replace(/\n/g,"
    ")+"

    "); + }; + + /** + * Helper function to print an info message. + * The calling Javascript context MUST define + * a "showMessages(text)" function. Line feeds ('\n') + * are automatically converted to HTML line feeds '
    '. + * @param {String} str String of the info message + * @return {String} A HTML paragraph entity with a style attribute + * containing the HTML encoded info message + */ + this.print_info = function(str) { + str = openpgp_encoding_html_encode(str); + showMessages("

    INFO: "+str.replace(/\n/g,"
    ")+"

    "); + }; + + this.print_warning = function(str) { + str = openpgp_encoding_html_encode(str); + showMessages("

    WARNING: "+str.replace(/\n/g,"
    ")+"

    "); + }; + + this.getLeftNBits = function (string, bitcount) { + var rest = bitcount % 8; + if (rest == 0) + return string.substring(0, bitcount / 8); + var bytes = (bitcount - rest) / 8 +1; + var result = string.substring(0, bytes); + return this.shiftRight(result, 8-rest); // +String.fromCharCode(string.charCodeAt(bytes -1) << (8-rest) & 0xFF); + }; + + /** + * Shifting a string to n bits right + * @param {String} value The string to shift + * @param {Integer} bitcount Amount of bits to shift (MUST be smaller + * than 9) + * @return {String} Resulting string. + */ + this.shiftRight = function(value, bitcount) { + var temp = util.str2bin(value); + if (bitcount % 8 != 0) { + for (var i = temp.length-1; i >= 0; i--) { + temp[i] >>= bitcount % 8; + if (i > 0) + temp[i] |= (temp[i - 1] << (8 - (bitcount % 8))) & 0xFF; + } + } else { + return value; + } + return util.bin2str(temp); + }; + + /** + * Return the algorithm type as string + * @return {String} String representing the message type + */ + this.get_hashAlgorithmString = function(algo) { + switch(algo) { + case 1: + return "MD5"; + case 2: + return "SHA1"; + case 3: + return "RIPEMD160"; + case 8: + return "SHA256"; + case 9: + return "SHA384"; + case 10: + return "SHA512"; + case 11: + return "SHA224"; + } + return "unknown"; + }; +}; + +/** + * an instance that should be used. + */ +var util = new Util(); + +openpgp.init(); +this.openpgp = openpgp; + + +}; + +_openpgp_ (); + diff --git a/web/WebContent/js/crypt/openpgp/openpgp.min.js b/web/WebContent/js/crypt/openpgp/openpgp.min.js new file mode 100644 index 0000000..10d9133 --- /dev/null +++ b/web/WebContent/js/crypt/openpgp/openpgp.min.js @@ -0,0 +1,473 @@ +function DSA(){this.select_hash_algorithm=function(b){var a=openpgp.config.config.prefer_hash_algorithm;switch(Math.round(b.bitLength()/8)){case 20:return 2!=a&&11a?2:a;case 28:return 11a?11:a;case 32:return 10a?8:a;default:return util.print_debug("DSA select hash algorithm: returning null for an unknown length of q"),null}};this.sign=function(b,a,c,d,e,f){b=util.getLeftNBits(openpgp_crypto_hashData(b,a),e.bitLength());b=new BigInteger(util.hexstrdump(b),16);a=openpgp_crypto_getRandomBigIntegerInRange(BigInteger.ONE.add(BigInteger.ONE), +e.subtract(BigInteger.ONE));c=c.modPow(a,d).mod(e);e=a.modInverse(e).multiply(b.add(f.multiply(c))).mod(e);f=[];f[0]=c.toMPI();f[1]=e.toMPI();return f};this.verify=function(b,a,c,d,e,f,g,h){b=util.getLeftNBits(openpgp_crypto_hashData(b,d),f.bitLength());b=new BigInteger(util.hexstrdump(b),16);if(0>15;0<=--f;){var h=this[b]&32767,j=this[b++]>>15,k=a*h+j*g,h=g*h+((k&32767)<<15)+c[d]+(e&1073741823),e=(h>>>30)+(k>>>15)+a*j+(e>>>30);c[d++]=h&1073741823}return e}function am3(b,a,c,d,e,f){for(var g=a&16383,a=a>>14;0<=--f;){var h=this[b]&16383,j=this[b++]>>14,k=a*h+j*g,h=g*h+((k&16383)<<14)+c[d]+e,e=(h>>28)+(k>>14)+a*j;c[d++]=h&268435455}return e} +j_lm&&"Microsoft Internet Explorer"==navigator.appName?(BigInteger.prototype.am=am2,dbits=30):j_lm&&"Netscape"!=navigator.appName?(BigInteger.prototype.am=am1,dbits=26):(BigInteger.prototype.am=am3,dbits=28);BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=(1<=vv;++vv)BI_RC[rr++]=vv;rr=97;for(vv=10;36>vv;++vv)BI_RC[rr++]=vv;rr=65;for(vv=10;36>vv;++vv)BI_RC[rr++]=vv;function int2char(b){return BI_RM.charAt(b)}function intAt(b,a){var c=BI_RC[b.charCodeAt(a)];return null==c?-1:c}function bnpCopyTo(b){for(var a=this.t-1;0<=a;--a)b[a]=this[a];b.t=this.t;b.s=this.s}function bnpFromInt(b){this.t=1;this.s=0>b?-1:0;0b?this[0]=b+DV:this.t=0}function nbv(b){var a=nbi();a.fromInt(b);return a} +function bnpFromString(b,a){var c;if(16==a)c=4;else if(8==a)c=3;else if(256==a)c=8;else if(2==a)c=1;else if(32==a)c=5;else if(4==a)c=2;else{this.fromRadix(b,a);return}this.s=this.t=0;for(var d=b.length,e=!1,f=0;0<=--d;){var g=8==c?b[d]&255:intAt(b,d);0>g?"-"==b.charAt(d)&&(e=!0):(e=!1,0==f?this[this.t++]=g:f+c>this.DB?(this[this.t-1]|=(g&(1<>this.DB-f):this[this.t-1]|=g<=this.DB&&(f-=this.DB))}if(8==c&&0!=(b[0]&128))this.s=-1,0this.s)return"-"+this.negate().toString(b);if(16==b)b=4;else if(8==b)b=3;else if(2==b)b=1;else if(32==b)b=5;else if(4==b)b=2;else return this.toRadix(b);var a=(1<>g))d=!0,e=int2char(c);for(;0<=f;)g>(g+=this.DB-b)):(c=this[f]>>(g-=b)&a,0>=g&&(g+=this.DB,--f)),0this.s?this.negate():this}function bnCompareTo(b){var a=this.s-b.s;if(0!=a)return a;var c=this.t,a=c-b.t;if(0!=a)return a;for(;0<=--c;)if(0!=(a=this[c]-b[c]))return a;return 0}function nbits(b){var a=1,c;if(0!=(c=b>>>16))b=c,a+=16;if(0!=(c=b>>8))b=c,a+=8;if(0!=(c=b>>4))b=c,a+=4;if(0!=(c=b>>2))b=c,a+=2;0!=b>>1&&(a+=1);return a} +function bnBitLength(){return 0>=this.t?0:this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(b,a){var c;for(c=this.t-1;0<=c;--c)a[c+b]=this[c];for(c=b-1;0<=c;--c)a[c]=0;a.t=this.t+b;a.s=this.s}function bnpDRShiftTo(b,a){for(var c=b;c>d|g,g=(this[h]&e)<=this.t)a.t=0;else{var d=b%this.DB,e=this.DB-d,f=(1<>d;for(var g=c+1;g>d;0>=this.DB;if(b.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d-=b.s}a.s=0>d?-1:0;-1>d?a[c++]=this.DV+d:0=a.DV)b[c+a.t]-=a.DV,b[c+a.t+1]=1}0=d.t)){var e=this.abs();if(e.t>this.F2:0),k=this.FV/j,j=(1<g&&BigInteger.ZERO.subTo(c,c)}}}}function bnMod(b){var a=nbi();this.abs().divRemTo(b,null,a);0>this.s&&0b.s||0<=b.compareTo(this.m)?b.mod(this.m):b}function cRevert(b){return b}function cReduce(b){b.divRemTo(this.m,null,b)}function cMulTo(b,a,c){b.multiplyTo(a,c);this.reduce(c)}function cSqrTo(b,a){b.squareTo(a);this.reduce(a)}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo; +function bnpInvDigit(){if(1>this.t)return 0;var b=this[0];if(0==(b&1))return 0;var a=b&3,a=a*(2-(b&15)*a)&15,a=a*(2-(b&255)*a)&255,a=a*(2-((b&65535)*a&65535))&65535,a=a*(2-b*a%this.DV)%this.DV;return 0>15;this.um=(1<b.s&&0>15)*this.mpl&this.um)<<15)&b.DM,c=a+this.m.t;for(b[c]+=this.m.am(0,d,b,a,0,this.m.t);b[c]>=b.DV;)b[c]-=b.DV,b[++c]++}b.clamp();b.drShiftTo(this.m.t,b);0<=b.compareTo(this.m)&&b.subTo(this.m,b)}function montSqrTo(b,a){b.squareTo(a);this.reduce(a)}function montMulTo(b,a,c){b.multiplyTo(a,c);this.reduce(c)}Montgomery.prototype.convert=montConvert; +Montgomery.prototype.revert=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return 0==(0b)return BigInteger.ONE;var c=nbi(),d=nbi(),e=a.convert(this),f=nbits(b)-1;for(e.copyTo(c);0<=--f;)if(a.sqrTo(c,d),0<(b&1<b||a.isEven()?new Classic(a):new Montgomery(a);return this.exp(b,c)}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo; +BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt; +BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function bnClone(){var b=nbi();this.copyTo(b);return b}function bnIntValue(){if(0>this.s){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function bnShortValue(){return 0==this.t?this.s:this[0]<<16>>16}function bnpChunkSize(b){return Math.floor(Math.LN2*this.DB/Math.log(b))} +function bnSigNum(){return 0>this.s?-1:0>=this.t||1==this.t&&0>=this[0]?0:1}function bnpToRadix(b){null==b&&(b=10);if(0==this.signum()||2>b||36j?"-"==b.charAt(h)&&0==this.signum()&&(e=!0):(g=a*g+j,++f>=c&&(this.dMultiply(d),this.dAddOffset(g,0),g=f=0))}0b)this.fromInt(1);else{this.fromNumber(b,c);this.testBit(b-1)||this.bitwiseTo(BigInteger.ONE.shiftLeft(b-1),op_or,this);for(this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(a);)this.dAddOffset(2,0),this.bitLength()>b&&this.subTo(BigInteger.ONE.shiftLeft(b-1),this)}else{var c=[],d=b&7;c.length=(b>>3)+1;a.nextBytes(c);c[0]=0>c)!=(this.s&this.DM)>>c)a[e++]=d|this.s<c?(d=(this[b]&(1<>(c+=this.DB-8)):(d=this[b]>>(c-=8)&255,0>=c&&(c+=this.DB,--b)),0this.compareTo(b)?this:b}function bnMax(b){return 0b?this.rShiftTo(-b,a):this.lShiftTo(b,a);return a}function bnShiftRight(b){var a=nbi();0>b?this.lShiftTo(-b,a):this.rShiftTo(b,a);return a} +function lbit(b){if(0==b)return-1;var a=0;0==(b&65535)&&(b>>=16,a+=16);0==(b&255)&&(b>>=8,a+=8);0==(b&15)&&(b>>=4,a+=4);0==(b&3)&&(b>>=2,a+=2);0==(b&1)&&++a;return a}function bnGetLowestSetBit(){for(var b=0;bthis.s?this.t*this.DB:-1}function cbit(b){for(var a=0;0!=b;)b&=b-1,++a;return a}function bnBitCount(){for(var b=0,a=this.s&this.DM,c=0;c=this.t?0!=this.s:0!=(this[a]&1<>=this.DB;if(b.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d+=b.s}a.s=0>d?-1:0;0d&&(a[c++]=this.DV+d);a.t=c;a.clamp()}function bnAdd(b){var a=nbi();this.addTo(b,a);return a}function bnSubtract(b){var a=nbi();this.subTo(b,a);return a} +function bnMultiply(b){var a=nbi();this.multiplyTo(b,a);return a}function bnSquare(){var b=nbi();this.squareTo(b);return b}function bnDivide(b){var a=nbi();this.divRemTo(b,a,null);return a}function bnRemainder(b){var a=nbi();this.divRemTo(b,null,a);return a}function bnDivideAndRemainder(b){var a=nbi(),c=nbi();this.divRemTo(b,a,c);return[a,c]}function bnpDMultiply(b){this[this.t]=this.am(0,b-1,this,0,0,this.t);++this.t;this.clamp()} +function bnpDAddOffset(b,a){if(0!=b){for(;this.t<=a;)this[this.t++]=0;for(this[a]+=b;this[a]>=this.DV;)this[a]-=this.DV,++a>=this.t&&(this[this.t++]=0),++this[a]}}function NullExp(){}function nNop(b){return b}function nMulTo(b,a,c){b.multiplyTo(a,c)}function nSqrTo(b,a){b.squareTo(a)}NullExp.prototype.convert=nNop;NullExp.prototype.revert=nNop;NullExp.prototype.mulTo=nMulTo;NullExp.prototype.sqrTo=nSqrTo;function bnPow(b){return this.exp(b,new NullExp)} +function bnpMultiplyLowerTo(b,a,c){var d=Math.min(this.t+b.t,a);c.s=0;for(c.t=d;0b.s||b.t>2*this.m.t)return b.mod(this.m);if(0>b.compareTo(this.m))return b;var a=nbi();b.copyTo(a);this.reduce(a);return a}function barrettRevert(b){return b} +function barrettReduce(b){b.drShiftTo(this.m.t-1,this.r2);if(b.t>this.m.t+1)b.t=this.m.t+1,b.clamp();this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);for(this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);0>b.compareTo(this.r2);)b.dAddOffset(1,this.m.t+1);for(b.subTo(this.r2,b);0<=b.compareTo(this.m);)b.subTo(this.m,b)}function barrettSqrTo(b,a){b.squareTo(a);this.reduce(a)}function barrettMulTo(b,a,c){b.multiplyTo(a,c);this.reduce(c)}Barrett.prototype.convert=barrettConvert; +Barrett.prototype.revert=barrettRevert;Barrett.prototype.reduce=barrettReduce;Barrett.prototype.mulTo=barrettMulTo;Barrett.prototype.sqrTo=barrettSqrTo; +function bnModPow(b,a){var c=b.bitLength(),d,e=nbv(1),f;if(0>=c)return e;d=18>c?1:48>c?3:144>c?4:768>c?5:6;f=8>c?new Classic(a):a.isEven()?new Barrett(a):new Montgomery(a);var g=[],h=3,j=d-1,k=(1<=j?m=b[l]>>c-j&k:(m=(b[l]&(1<>this.DB+c-j));for(h=d;0==(m&1);)m>>=1,--h;if(0>(c-=h))c+=this.DB,--l;if(r)g[m].copyTo(e), +r=!1;else{for(;1--c&&(c=this.DB-1,--l)}return f.revert(e)} +function bnGCD(b){var a=0>this.s?this.negate():this.clone(),b=0>b.s?b.negate():b.clone();if(0>a.compareTo(b))var c=a,a=b,b=c;var c=a.getLowestSetBit(),d=b.getLowestSetBit();if(0>d)return a;c=b)return 0;var a=this.DV%b,c=0>this.s?b-1:0;if(0h.signum())h.addTo(b,h);else return h;return 0>h.signum()?h.add(b):h} +var lowprimes=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727, +733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],lplim=67108864/lowprimes[lowprimes.length-1]; +function bnIsProbablePrime(b){var a,c=this.abs();if(1==c.t&&c[0]<=lowprimes[lowprimes.length-1]){for(a=0;a>>16))b=c,a+=16;if(0!=(c=b>>8))b=c,a+=8;if(0!=(c=b>>4))b=c,a+=4;if(0!=(c=b>>2))b=c,a+=2;0!=b>>1&&(a+=1);return a}function bnToMPI(){var b=this.toByteArray(),a=8*(b.length-1)+nbits(b[0]),c;c=""+String.fromCharCode((a&65280)>>8);c+=String.fromCharCode(a&255);return c+=util.bin2str(b)} +function bnpMillerRabin(b){var a=this.subtract(BigInteger.ONE),c=a.getLowestSetBit();if(0>=c)return!1;var d=a.shiftRight(c),b=b+1>>1;if(b>lowprimes.length)b=lowprimes.length;for(var e=nbi(),f=0;f>1;d.e=parseInt(c,16);for(d.ee=new BigInteger(c,16);;){for(;!(d.p=new BigInteger(a-f,1,e),0==d.p.subtract(BigInteger.ONE).gcd(d.ee).compareTo(BigInteger.ONE)&&d.p.isProbablePrime(10)););for(;!(d.q=new BigInteger(f,1,e),0==d.q.subtract(BigInteger.ONE).gcd(d.ee).compareTo(BigInteger.ONE)&&d.q.isProbablePrime(10));); +if(0>=d.p.compareTo(d.q)){var g=d.p;d.p=d.q;d.q=g}var g=d.p.subtract(BigInteger.ONE),h=d.q.subtract(BigInteger.ONE),j=g.multiply(h);if(0==j.gcd(d.ee).compareTo(BigInteger.ONE)){d.n=d.p.multiply(d.q);d.d=d.ee.modInverse(j);d.dmp1=d.d.mod(g);d.dmq1=d.d.mod(h);d.u=d.p.modInverse(d.q);break}}return d};this.keyObject=b}function MD5(b){b=md5(b);return util.hex2bin(b)} +function md5cycle(b,a){var c=b[0],d=b[1],e=b[2],f=b[3],c=ff(c,d,e,f,a[0],7,-680876936),f=ff(f,c,d,e,a[1],12,-389564586),e=ff(e,f,c,d,a[2],17,606105819),d=ff(d,e,f,c,a[3],22,-1044525330),c=ff(c,d,e,f,a[4],7,-176418897),f=ff(f,c,d,e,a[5],12,1200080426),e=ff(e,f,c,d,a[6],17,-1473231341),d=ff(d,e,f,c,a[7],22,-45705983),c=ff(c,d,e,f,a[8],7,1770035416),f=ff(f,c,d,e,a[9],12,-1958414417),e=ff(e,f,c,d,a[10],17,-42063),d=ff(d,e,f,c,a[11],22,-1990404162),c=ff(c,d,e,f,a[12],7,1804603682),f=ff(f,c,d,e,a[13],12, +-40341101),e=ff(e,f,c,d,a[14],17,-1502002290),d=ff(d,e,f,c,a[15],22,1236535329),c=gg(c,d,e,f,a[1],5,-165796510),f=gg(f,c,d,e,a[6],9,-1069501632),e=gg(e,f,c,d,a[11],14,643717713),d=gg(d,e,f,c,a[0],20,-373897302),c=gg(c,d,e,f,a[5],5,-701558691),f=gg(f,c,d,e,a[10],9,38016083),e=gg(e,f,c,d,a[15],14,-660478335),d=gg(d,e,f,c,a[4],20,-405537848),c=gg(c,d,e,f,a[9],5,568446438),f=gg(f,c,d,e,a[14],9,-1019803690),e=gg(e,f,c,d,a[3],14,-187363961),d=gg(d,e,f,c,a[8],20,1163531501),c=gg(c,d,e,f,a[13],5,-1444681467), +f=gg(f,c,d,e,a[2],9,-51403784),e=gg(e,f,c,d,a[7],14,1735328473),d=gg(d,e,f,c,a[12],20,-1926607734),c=hh(c,d,e,f,a[5],4,-378558),f=hh(f,c,d,e,a[8],11,-2022574463),e=hh(e,f,c,d,a[11],16,1839030562),d=hh(d,e,f,c,a[14],23,-35309556),c=hh(c,d,e,f,a[1],4,-1530992060),f=hh(f,c,d,e,a[4],11,1272893353),e=hh(e,f,c,d,a[7],16,-155497632),d=hh(d,e,f,c,a[10],23,-1094730640),c=hh(c,d,e,f,a[13],4,681279174),f=hh(f,c,d,e,a[0],11,-358537222),e=hh(e,f,c,d,a[3],16,-722521979),d=hh(d,e,f,c,a[6],23,76029189),c=hh(c,d, +e,f,a[9],4,-640364487),f=hh(f,c,d,e,a[12],11,-421815835),e=hh(e,f,c,d,a[15],16,530742520),d=hh(d,e,f,c,a[2],23,-995338651),c=ii(c,d,e,f,a[0],6,-198630844),f=ii(f,c,d,e,a[7],10,1126891415),e=ii(e,f,c,d,a[14],15,-1416354905),d=ii(d,e,f,c,a[5],21,-57434055),c=ii(c,d,e,f,a[12],6,1700485571),f=ii(f,c,d,e,a[3],10,-1894986606),e=ii(e,f,c,d,a[10],15,-1051523),d=ii(d,e,f,c,a[1],21,-2054922799),c=ii(c,d,e,f,a[8],6,1873313359),f=ii(f,c,d,e,a[15],10,-30611744),e=ii(e,f,c,d,a[6],15,-1560198380),d=ii(d,e,f,c,a[13], +21,1309151649),c=ii(c,d,e,f,a[4],6,-145523070),f=ii(f,c,d,e,a[11],10,-1120210379),e=ii(e,f,c,d,a[2],15,718787259),d=ii(d,e,f,c,a[9],21,-343485551);b[0]=add32(c,b[0]);b[1]=add32(d,b[1]);b[2]=add32(e,b[2]);b[3]=add32(f,b[3])}function cmn(b,a,c,d,e,f){a=add32(add32(a,b),add32(d,f));return add32(a<>>32-e,c)}function ff(b,a,c,d,e,f,g){return cmn(a&c|~a&d,b,a,e,f,g)}function gg(b,a,c,d,e,f,g){return cmn(a&d|c&~d,b,a,e,f,g)}function hh(b,a,c,d,e,f,g){return cmn(a^c^d,b,a,e,f,g)} +function ii(b,a,c,d,e,f,g){return cmn(c^(a|~d),b,a,e,f,g)}function md51(b){txt="";var a=b.length,c=[1732584193,-271733879,-1732584194,271733878],d;for(d=64;d<=b.length;d+=64)md5cycle(c,md5blk(b.substring(d-64,d)));var b=b.substring(d-64),e=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(d=0;d>2]|=b.charCodeAt(d)<<(d%4<<3);e[d>>2]|=128<<(d%4<<3);if(55d;d++)e[d]=0}e[14]=8*a;md5cycle(c,e);return c} +function md5blk(b){var a=[],c;for(c=0;64>c;c+=4)a[c>>2]=b.charCodeAt(c)+(b.charCodeAt(c+1)<<8)+(b.charCodeAt(c+2)<<16)+(b.charCodeAt(c+3)<<24);return a}var hex_chr="0123456789abcdef".split("");function rhex(b){for(var a="",c=0;4>c;c++)a+=hex_chr[b>>8*c+4&15]+hex_chr[b>>8*c&15];return a}function hex(b){for(var a=0;a>16)+(a>>16)+(c>>16)<<16|c&65535});var RMDsize=160,X=[];function ROL(b,a){return new Number(b<>>32-a)}function F(b,a,c){return new Number(b^a^c)}function G(b,a,c){return new Number(b&a|~b&c)}function H(b,a,c){return new Number((b|~a)^c)}function I(b,a,c){return new Number(b&c|a&~c)}function J(b,a,c){return new Number(b^(a|~c))} +function mixOneRound(b,a,c,d,e,f,g,h){switch(h){case 0:b+=F(a,c,d)+f+0;break;case 1:b+=G(a,c,d)+f+1518500249;break;case 2:b+=H(a,c,d)+f+1859775393;break;case 3:b+=I(a,c,d)+f+2400959708;break;case 4:b+=J(a,c,d)+f+2840853838;break;case 5:b+=J(a,c,d)+f+1352829926;break;case 6:b+=I(a,c,d)+f+1548603684;break;case 7:b+=H(a,c,d)+f+1836072691;break;case 8:b+=G(a,c,d)+f+2053994217;break;case 9:b+=F(a,c,d)+f+0;break;default:document.write("Bogus round number")}b=ROL(b,g)+e;c=ROL(c,10);h=[];h[0]=b&4294967295; +h[1]=a&4294967295;h[2]=c&4294967295;h[3]=d&4294967295;h[4]=e&4294967295;h[5]=f;h[6]=g;return h}function MDinit(b){b[0]=1732584193;b[1]=4023233417;b[2]=2562383102;b[3]=271733878;b[4]=3285377520} +var ROLs=[[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8],[7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12],[11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5],[11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12],[9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6],[8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6],[9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11],[9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5],[15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8],[8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]],indexes=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],[7,4,13,1,10,6,15,3,12, +0,9,5,2,14,11,8],[3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12],[1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2],[4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13],[5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12],[6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2],[15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13],[8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14],[12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]]; +function compress(b,a){blockA=[];blockB=[];for(var c,d=0;5>d;d++)blockA[d]=new Number(b[d]),blockB[d]=new Number(b[d]);for(var e=0,f=0;5>f;f++)for(d=0;16>d;d++)c=mixOneRound(blockA[(e+0)%5],blockA[(e+1)%5],blockA[(e+2)%5],blockA[(e+3)%5],blockA[(e+4)%5],a[indexes[f][d]],ROLs[f][d],f),blockA[(e+0)%5]=c[0],blockA[(e+1)%5]=c[1],blockA[(e+2)%5]=c[2],blockA[(e+3)%5]=c[3],blockA[(e+4)%5]=c[4],e+=4;e=0;for(f=5;10>f;f++)for(d=0;16>d;d++)c=mixOneRound(blockB[(e+0)%5],blockB[(e+1)%5],blockB[(e+2)%5],blockB[(e+ +3)%5],blockB[(e+4)%5],a[indexes[f][d]],ROLs[f][d],f),blockB[(e+0)%5]=c[0],blockB[(e+1)%5]=c[1],blockB[(e+2)%5]=c[2],blockB[(e+3)%5]=c[3],blockB[(e+4)%5]=c[4],e+=4;blockB[3]+=blockA[2]+b[1];b[1]=b[2]+blockA[3]+blockB[4];b[2]=b[3]+blockA[4]+blockB[0];b[3]=b[4]+blockA[0]+blockB[1];b[4]=b[0]+blockA[1]+blockB[2];b[0]=blockB[3]}function zeroX(b){for(var a=0;16>a;a++)b[a]=0} +function MDfinish(b,a,c,d){var e=Array(16);zeroX(e);for(var f=0,g=0;g<(c&63);g++)e[g>>>2]^=(a.charCodeAt(f++)&255)<<8*(g&3);e[c>>>2&15]^=1<<8*(c&3)+7;55<(c&63)&&(compress(b,e),e=Array(16),zeroX(e));e[14]=c<<3;e[15]=c>>>29|d<<3;compress(b,e)}function BYTES_TO_DWORD(b){var a=(b.charCodeAt(3)&255)<<24,a=a|(b.charCodeAt(2)&255)<<16,a=a|(b.charCodeAt(1)&255)<<8;return a|=b.charCodeAt(0)&255} +function RMD(b){var a=Array(RMDsize/32),c=Array(RMDsize/8),d,e;MDinit(a);d=b.length;var f=Array(16);zeroX(f);var g=0;for(e=d;63h;h++)f[h]=BYTES_TO_DWORD(b.substr(g,4)),g+=4;compress(a,f)}MDfinish(a,b.substr(g),d,0);for(h=0;h>>2]&255,c[h+1]=a[h>>>2]>>>8&255,c[h+2]=a[h>>>2]>>>16&255,c[h+3]=a[h>>>2]>>>24&255;return c}function RMDstring(b){for(var b=RMD(b),a="",c=0;c>5]|=(a.charCodeAt(d/8)&255)<<24-d%32;return b},c=function(a){var b=[],c=a.length,d,e;for(d=0;d>3]|=e<<24-4*(d%8)}return b},d=function(a){var b="",c=4*a.length,d,e;for(d=0;d>2]>>8*(3-d%4),b+="0123456789abcdef".charAt(e>>4&15)+"0123456789abcdef".charAt(e&15);return b},e=function(a){var b= +"",c=4*a.length,d,e,f;for(d=0;d>2]>>8*(3-d%4)&255)<<16|(a[d+1>>2]>>8*(3-(d+1)%4)&255)<<8|a[d+2>>2]>>8*(3-(d+2)%4)&255;for(e=0;4>e;e+=1)b=8*d+6*e<=32*a.length?b+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(f>>6*(3-e)&63):b+""}return b},f=function(a){for(var b="",c=0;c<32*a.length;c+=8)b+=String.fromCharCode(a[c>>5]>>>24-c%32&255);return b},g=function(a,b){return a<>>32-b},h=function(a,b){return a>>>b|a<<32-b},j=function(a,c){return 32>=c?new b(a.highOrder>>> +c|a.lowOrder<<32-c,a.lowOrder>>>c|a.highOrder<<32-c):new b(a.lowOrder>>>c|a.highOrder<<32-c,a.highOrder>>>c|a.lowOrder<<32-c)},k=function(a,c){return 32>=c?new b(a.highOrder>>>c,a.lowOrder>>>c|a.highOrder<<32-c):new b(0,a.highOrder<<32-c)},l=function(a,b,c){return a&b^~a&c},m=function(a,c,d){return new b(a.highOrder&c.highOrder^~a.highOrder&d.highOrder,a.lowOrder&c.lowOrder^~a.lowOrder&d.lowOrder)},r=function(a,b,c){return a&b^a&c^b&c},p=function(a,c,d){return new b(a.highOrder&c.highOrder^a.highOrder& +d.highOrder^c.highOrder&d.highOrder,a.lowOrder&c.lowOrder^a.lowOrder&d.lowOrder^c.lowOrder&d.lowOrder)},o=function(a){return h(a,2)^h(a,13)^h(a,22)},y=function(a){var c=j(a,28),d=j(a,34),a=j(a,39);return new b(c.highOrder^d.highOrder^a.highOrder,c.lowOrder^d.lowOrder^a.lowOrder)},v=function(a){return h(a,6)^h(a,11)^h(a,25)},w=function(a){var c=j(a,14),d=j(a,18),a=j(a,41);return new b(c.highOrder^d.highOrder^a.highOrder,c.lowOrder^d.lowOrder^a.lowOrder)},A=function(a){return h(a,7)^h(a,18)^a>>>3}, +t=function(a){var c=j(a,1),d=j(a,8),a=k(a,7);return new b(c.highOrder^d.highOrder^a.highOrder,c.lowOrder^d.lowOrder^a.lowOrder)},u=function(a){return h(a,17)^h(a,19)^a>>>10},P=function(a){var c=j(a,19),d=j(a,61),a=k(a,6);return new b(c.highOrder^d.highOrder^a.highOrder,c.lowOrder^d.lowOrder^a.lowOrder)},C=function(a,b){var c=(a&65535)+(b&65535);return((a>>>16)+(b>>>16)+(c>>>16)&65535)<<16|c&65535},Q=function(a,b,c,d){var e=(a&65535)+(b&65535)+(c&65535)+(d&65535);return((a>>>16)+(b>>>16)+(c>>>16)+ +(d>>>16)+(e>>>16)&65535)<<16|e&65535},E=function(a,b,c,d,e){var f=(a&65535)+(b&65535)+(c&65535)+(d&65535)+(e&65535);return((a>>>16)+(b>>>16)+(c>>>16)+(d>>>16)+(e>>>16)+(f>>>16)&65535)<<16|f&65535},x=function(a,c){var d,e,f;d=(a.lowOrder&65535)+(c.lowOrder&65535);e=(a.lowOrder>>>16)+(c.lowOrder>>>16)+(d>>>16);f=(e&65535)<<16|d&65535;d=(a.highOrder&65535)+(c.highOrder&65535)+(e>>>16);e=(a.highOrder>>>16)+(c.highOrder>>>16)+(d>>>16);return new b((e&65535)<<16|d&65535,f)},z=function(a,c,d,e){var f,g, +h;f=(a.lowOrder&65535)+(c.lowOrder&65535)+(d.lowOrder&65535)+(e.lowOrder&65535);g=(a.lowOrder>>>16)+(c.lowOrder>>>16)+(d.lowOrder>>>16)+(e.lowOrder>>>16)+(f>>>16);h=(g&65535)<<16|f&65535;f=(a.highOrder&65535)+(c.highOrder&65535)+(d.highOrder&65535)+(e.highOrder&65535)+(g>>>16);g=(a.highOrder>>>16)+(c.highOrder>>>16)+(d.highOrder>>>16)+(e.highOrder>>>16)+(f>>>16);return new b((g&65535)<<16|f&65535,h)},V=function(a,c,d,e,f){var g,h,j;g=(a.lowOrder&65535)+(c.lowOrder&65535)+(d.lowOrder&65535)+(e.lowOrder& +65535)+(f.lowOrder&65535);h=(a.lowOrder>>>16)+(c.lowOrder>>>16)+(d.lowOrder>>>16)+(e.lowOrder>>>16)+(f.lowOrder>>>16)+(g>>>16);j=(h&65535)<<16|g&65535;g=(a.highOrder&65535)+(c.highOrder&65535)+(d.highOrder&65535)+(e.highOrder&65535)+(f.highOrder&65535)+(h>>>16);h=(a.highOrder>>>16)+(c.highOrder>>>16)+(d.highOrder>>>16)+(e.highOrder>>>16)+(f.highOrder>>>16)+(g>>>16);return new b((h&65535)<<16|g&65535,j)},K=function(a,b){var c=[],d,e,f,h,j,k,l,m,o,s=[1732584193,4023233417,2562383102,271733878,3285377520], +p=[1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708, +2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];a[b>>5]|=128<<24-b%32;a[(b+65>>9<<4)+15]=b;o=a.length;for(l=0;lm;m+=1)c[m]= +16>m?a[m+l]:g(c[m-3]^c[m-8]^c[m-14]^c[m-16],1),k=20>m?E(g(d,5),e&f^~e&h,j,p[m],c[m]):40>m?E(g(d,5),e^f^h,j,p[m],c[m]):60>m?E(g(d,5),r(e,f,h),j,p[m],c[m]):E(g(d,5),e^f^h,j,p[m],c[m]),j=h,h=f,f=g(e,30),e=d,d=k;s[0]=C(d,s[0]);s[1]=C(e,s[1]);s[2]=C(f,s[2]);s[3]=C(h,s[3]);s[4]=C(j,s[4])}return s},D=function(a,c,d){var e,f,g,h,j,k,K,B,D,s,da,Y,L,ea,ca,N,fa,ga,ha,ia,ja,ka,la,ma,q,na,Z=[],sa;if("SHA-224"===d||"SHA-256"===d)da=64,e=(c+65>>9<<4)+15,ea=16,ca=1,q=Number,N=C,fa=Q,ga=E,ha=A,ia=u,ja=o,ka=v,ma=r, +la=l,na=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804, +4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],s="SHA-224"===d?[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];else if("SHA-384"===d||"SHA-512"===d)da=80,e=(c+128>>10<<5)+31,ea=32,ca=2,q=b,N=x,fa=z,ga=V,ha=t,ia=P,ja=y,ka=w,ma= +p,la=m,na=[new q(1116352408,3609767458),new q(1899447441,602891725),new q(3049323471,3964484399),new q(3921009573,2173295548),new q(961987163,4081628472),new q(1508970993,3053834265),new q(2453635748,2937671579),new q(2870763221,3664609560),new q(3624381080,2734883394),new q(310598401,1164996542),new q(607225278,1323610764),new q(1426881987,3590304994),new q(1925078388,4068182383),new q(2162078206,991336113),new q(2614888103,633803317),new q(3248222580,3479774868),new q(3835390401,2666613458),new q(4022224774, +944711139),new q(264347078,2341262773),new q(604807628,2007800933),new q(770255983,1495990901),new q(1249150122,1856431235),new q(1555081692,3175218132),new q(1996064986,2198950837),new q(2554220882,3999719339),new q(2821834349,766784016),new q(2952996808,2566594879),new q(3210313671,3203337956),new q(3336571891,1034457026),new q(3584528711,2466948901),new q(113926993,3758326383),new q(338241895,168717936),new q(666307205,1188179964),new q(773529912,1546045734),new q(1294757372,1522805485),new q(1396182291, +2643833823),new q(1695183700,2343527390),new q(1986661051,1014477480),new q(2177026350,1206759142),new q(2456956037,344077627),new q(2730485921,1290863460),new q(2820302411,3158454273),new q(3259730800,3505952657),new q(3345764771,106217008),new q(3516065817,3606008344),new q(3600352804,1432725776),new q(4094571909,1467031594),new q(275423344,851169720),new q(430227734,3100823752),new q(506948616,1363258195),new q(659060556,3750685593),new q(883997877,3785050280),new q(958139571,3318307427),new q(1322822218, +3812723403),new q(1537002063,2003034995),new q(1747873779,3602036899),new q(1955562222,1575990012),new q(2024104815,1125592928),new q(2227730452,2716904306),new q(2361852424,442776044),new q(2428436474,593698344),new q(2756734187,3733110249),new q(3204031479,2999351573),new q(3329325298,3815920427),new q(3391569614,3928383900),new q(3515267271,566280711),new q(3940187606,3454069534),new q(4118630271,4000239992),new q(116418474,1914138554),new q(174292421,2731055270),new q(289380356,3203993006),new q(460393269, +320620315),new q(685471733,587496836),new q(852142971,1086792851),new q(1017036298,365543100),new q(1126000580,2618297676),new q(1288033470,3409855158),new q(1501505948,4234509866),new q(1607167915,987167468),new q(1816402316,1246189591)],s="SHA-384"===d?[new q(3418070365,3238371032),new q(1654270250,914150663),new q(2438529370,812702999),new q(355462360,4144912697),new q(1731405415,4290775857),new q(41048885895,1750603025),new q(3675008525,1694076839),new q(1203062813,3204075428)]:[new q(1779033703, +4089235720),new q(3144134277,2227873595),new q(1013904242,4271175723),new q(2773480762,1595750129),new q(1359893119,2917565137),new q(2600822924,725511199),new q(528734635,4215389547),new q(1541459225,327033209)];a[c>>5]|=128<<24-c%32;a[e]=c;sa=a.length;for(Y=0;YL?new q(a[L*ca+Y],a[L*ca+Y+1]):fa(ia(Z[L-2]),Z[L-7],ha(Z[L-15]),Z[L-16]),B=ga(K,ka(h),la(h,j,k),na[L],Z[L]),D=N(ja(c),ma(c,e,f)),K=k,k=j,j=h,h=N(g, +B),g=f,f=e,e=c,c=N(B,D);s[0]=N(c,s[0]);s[1]=N(e,s[1]);s[2]=N(f,s[2]);s[3]=N(g,s[3]);s[4]=N(h,s[4]);s[5]=N(j,s[5]);s[6]=N(k,s[6]);s[7]=N(K,s[7])}switch(d){case "SHA-224":return[s[0],s[1],s[2],s[3],s[4],s[5],s[6]];case "SHA-256":return s;case "SHA-384":return[s[0].highOrder,s[0].lowOrder,s[1].highOrder,s[1].lowOrder,s[2].highOrder,s[2].lowOrder,s[3].highOrder,s[3].lowOrder,s[4].highOrder,s[4].lowOrder,s[5].highOrder,s[5].lowOrder];case "SHA-512":return[s[0].highOrder,s[0].lowOrder,s[1].highOrder,s[1].lowOrder, +s[2].highOrder,s[2].lowOrder,s[3].highOrder,s[3].lowOrder,s[4].highOrder,s[4].lowOrder,s[5].highOrder,s[5].lowOrder,s[6].highOrder,s[6].lowOrder,s[7].highOrder,s[7].lowOrder];default:return[]}},B=function(b,d){this.strToHash=this.strBinLen=this.sha512=this.sha384=this.sha256=this.sha224=this.sha1=null;if("HEX"===d){if(0!==b.length%2)return"TEXT MUST BE IN BYTE INCREMENTS";this.strBinLen=4*b.length;this.strToHash=c(b)}else if("ASCII"===d||"undefined"===typeof d)this.strBinLen=8*b.length,this.strToHash= +a(b);else return"UNKNOWN TEXT INPUT TYPE"};B.prototype={getHash:function(a,b){var c=null,g=this.strToHash.slice();switch(b){case "HEX":c=d;break;case "B64":c=e;break;case "ASCII":c=f;break;default:return"FORMAT NOT RECOGNIZED"}switch(a){case "SHA-1":if(null===this.sha1)this.sha1=K(g,this.strBinLen);return c(this.sha1);case "SHA-224":if(null===this.sha224)this.sha224=D(g,this.strBinLen,a);return c(this.sha224);case "SHA-256":if(null===this.sha256)this.sha256=D(g,this.strBinLen,a);return c(this.sha256); +case "SHA-384":if(null===this.sha384)this.sha384=D(g,this.strBinLen,a);return c(this.sha384);case "SHA-512":if(null===this.sha512)this.sha512=D(g,this.strBinLen,a);return c(this.sha512);default:return"HASH NOT RECOGNIZED"}},getHMAC:function(b,g,h,j){var k,l,m,o,p;l=[];var r=[];switch(j){case "HEX":j=d;break;case "B64":j=e;break;case "ASCII":j=f;break;default:return"FORMAT NOT RECOGNIZED"}switch(h){case "SHA-1":k=64;p=160;break;case "SHA-224":k=64;p=224;break;case "SHA-256":k=64;p=256;break;case "SHA-384":k= +128;p=384;break;case "SHA-512":k=128;p=512;break;default:return"HASH NOT RECOGNIZED"}if("HEX"===g){if(0!==b.length%2)return"KEY MUST BE IN BYTE INCREMENTS";g=c(b);o=4*b.length}else if("ASCII"===g)g=a(b),o=8*b.length;else return"UNKNOWN KEY INPUT TYPE";b=8*k;m=k/4-1;ko/8&&(g[m]&=4294967040);for(k=0;k<=m;k+=1)l[k]=g[k]^909522486,r[k]=g[k]^1549556828;"SHA-1"===h?(l=K(l.concat(this.strToHash),b+this.strBinLen),l=K(r.concat(l),b+p)):(l=D(l.concat(this.strToHash), +b+this.strBinLen,h),l=D(r.concat(l),b+p,h));return j(l)}};return B}();function str_sha1(b){return(new jsSHA(b,"ASCII")).getHash("SHA-1","ASCII")}function str_sha224(b){return(new jsSHA(b,"ASCII")).getHash("SHA-224","ASCII")}function str_sha256(b){return(new jsSHA(b,"ASCII")).getHash("SHA-256","ASCII")}function str_sha384(b){return(new jsSHA(b,"ASCII")).getHash("SHA-384","ASCII")}function str_sha512(b){return(new jsSHA(b,"ASCII")).getHash("SHA-512","ASCII")} +function openpgp_cfb_encrypt(b,a,c,d,e,f){var g=Array(d),h=Array(d),b=b+b.charAt(d-2)+b.charAt(d-1);util.print_debug("prefixrandom:"+util.hexstrdump(b));for(var j="",k=0;ka*g;){for(var e=b(f,c),f=d.substring(g*a,g*a+a),k=0;ka*g;){for(var j=b(f,c),f=d.substring(g*a+0,g*a+a+0),e=0;ea-b;)window.crypto.getRandomValues(c);return b+Math.abs(c[0]&Math.pow(2,d)-1)}function openpgp_crypto_getSecureRandomOctet(){var b=new Uint32Array(1);window.crypto.getRandomValues(b);return b[0]&255} +function openpgp_crypto_getRandomBigInteger(b){if(0>b)return null;var a=openpgp_crypto_getRandomBytes(Math.floor((b+7)/8));0=a.compareTo(b))){for(var c=a.subtract(b),d=openpgp_crypto_getRandomBigInteger(c.bitLength());d>c;)d=openpgp_crypto_getRandomBigInteger(c.bitLength());return b.add(d)}} +function openpgp_crypto_testRSA(b){debugger;var a=new RSA,c=new openpgp_type_mpi;c.create(openpgp_encoding_eme_pkcs1_encode("ABABABAB",128));c=a.encrypt(c.toBigInteger(),b.ee,b.n);a.decrypt(c,b.d,b.p,b.q,b.u)} +function openpgp_crypto_generateKeyPair(b,a,c,d,e){var f,g,h=new Date,h=h.getTime()/1E3,h=String.fromCharCode(Math.floor(h/16777216%256))+String.fromCharCode(Math.floor(h/65536%256))+String.fromCharCode(Math.floor(h/256%256))+String.fromCharCode(Math.floor(h%256));switch(b){case 1:a=(new RSA).generate(a,"10001");f=(new openpgp_packet_keymaterial).write_private_key(b,a,c,d,e,h);g=(new openpgp_packet_keymaterial).write_public_key(b,a,h);break;default:util.print_error("Unknown keytype "+b)}return{privateKey:f, +publicKey:g}} +function openpgp_crypto_symmetricEncrypt(b,a,c,d,e){switch(a){case 0:return d;case 2:return openpgp_cfb_encrypt(b,desede,d,8,c,e).substring(0,d.length+10);case 3:return openpgp_cfb_encrypt(b,cast5_encrypt,d,8,c,e).substring(0,d.length+10);case 4:return openpgp_cfb_encrypt(b,BFencrypt,d,8,c,e).substring(0,d.length+10);case 7:case 8:case 9:return openpgp_cfb_encrypt(b,AESencrypt,d,16,keyExpansion(c),e).substring(0,d.length+18);case 10:return openpgp_cfb_encrypt(b,TFencrypt,d,16,c,e).substring(0,d.length+ +18);case 1:return util.print_error("IDEA Algorithm not implemented"),null;default:return null}} +function openpgp_crypto_symmetricDecrypt(b,a,c,d){util.print_debug_hexstr_dump("openpgp_crypto_symmetricDecrypt:\nalgo:"+b+"\nencrypteddata:",c);var e=0;d||(e=2);switch(b){case 0:return c;case 2:return openpgp_cfb_decrypt(desede,8,a,c,d).substring(e,c.length+e-10);case 3:return openpgp_cfb_decrypt(cast5_encrypt,8,a,c,d).substring(e,c.length+e-10);case 4:return openpgp_cfb_decrypt(BFencrypt,8,a,c,d).substring(e,c.length+e-10);case 7:case 8:case 9:return openpgp_cfb_decrypt(AESencrypt,16,keyExpansion(a), +c,d).substring(e,c.length+e-18);case 10:return openpgp_cfb_decrypt(TFencrypt,16,a,c,d).substring(e,c.length+e-18);case 1:util.print_error(""+(1==b?"IDEA Algorithm not implemented":"Twofish Algorithm not implemented"))}return null} +var Rcon=[1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145],S=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80, +60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65, +153,45,15,176,84,187,22],T1=[2774754246,2222750968,2574743534,2373680118,234025727,3177933782,2976870366,1422247313,1345335392,50397442,2842126286,2099981142,436141799,1658312629,3870010189,2591454956,1170918031,2642575903,1086966153,2273148410,368769775,3948501426,3376891790,200339707,3970805057,1742001331,4255294047,3937382213,3214711843,4154762323,2524082916,1539358875,3266819957,486407649,2928907069,1780885068,1513502316,1094664062,49805301,1338821763,1546925160,4104496465,887481809,150073849, +2473685474,1943591083,1395732834,1058346282,201589768,1388824469,1696801606,1589887901,672667696,2711000631,251987210,3046808111,151455502,907153956,2608889883,1038279391,652995533,1764173646,3451040383,2675275242,453576978,2659418909,1949051992,773462580,756751158,2993581788,3998898868,4221608027,4132590244,1295727478,1641469623,3467883389,2066295122,1055122397,1898917726,2542044179,4115878822,1758581177,0,753790401,1612718144,536673507,3367088505,3982187446,3194645204,1187761037,3653156455,1262041458, +3729410708,3561770136,3898103984,1255133061,1808847035,720367557,3853167183,385612781,3309519750,3612167578,1429418854,2491778321,3477423498,284817897,100794884,2172616702,4031795360,1144798328,3131023141,3819481163,4082192802,4272137053,3225436288,2324664069,2912064063,3164445985,1211644016,83228145,3753688163,3249976951,1977277103,1663115586,806359072,452984805,250868733,1842533055,1288555905,336333848,890442534,804056259,3781124030,2727843637,3427026056,957814574,1472513171,4071073621,2189328124, +1195195770,2892260552,3881655738,723065138,2507371494,2690670784,2558624025,3511635870,2145180835,1713513028,2116692564,2878378043,2206763019,3393603212,703524551,3552098411,1007948840,2044649127,3797835452,487262998,1994120109,1004593371,1446130276,1312438900,503974420,3679013266,168166924,1814307912,3831258296,1573044895,1859376061,4021070915,2791465668,2828112185,2761266481,937747667,2339994098,854058965,1137232011,1496790894,3077402074,2358086913,1691735473,3528347292,3769215305,3027004632,4199962284, +133494003,636152527,2942657994,2390391540,3920539207,403179536,3585784431,2289596656,1864705354,1915629148,605822008,4054230615,3350508659,1371981463,602466507,2094914977,2624877800,555687742,3712699286,3703422305,2257292045,2240449039,2423288032,1111375484,3300242801,2858837708,3628615824,84083462,32962295,302911004,2741068226,1597322602,4183250862,3501832553,2441512471,1489093017,656219450,3114180135,954327513,335083755,3013122091,856756514,3144247762,1893325225,2307821063,2811532339,3063651117, +572399164,2458355477,552200649,1238290055,4283782570,2015897680,2061492133,2408352771,4171342169,2156497161,386731290,3669999461,837215959,3326231172,3093850320,3275833730,2962856233,1999449434,286199582,3417354363,4233385128,3602627437,974525996],T2=[1667483301,2088564868,2004348569,2071721613,4076011277,1802229437,1869602481,3318059348,808476752,16843267,1734856361,724260477,4278118169,3621238114,2880130534,1987505306,3402272581,2189565853,3385428288,2105408135,4210749205,1499050731,1195871945, +4042324747,2913812972,3570709351,2728550397,2947499498,2627478463,2762232823,1920132246,3233848155,3082253762,4261273884,2475900334,640044138,909536346,1061125697,4160222466,3435955023,875849820,2779075060,3857043764,4059166984,1903288979,3638078323,825320019,353708607,67373068,3351745874,589514341,3284376926,404238376,2526427041,84216335,2593796021,117902857,303178806,2155879323,3806519101,3958099238,656887401,2998042573,1970662047,151589403,2206408094,741103732,437924910,454768173,1852759218,1515893998, +2694863867,1381147894,993752653,3604395873,3014884814,690573947,3823361342,791633521,2223248279,1397991157,3520182632,0,3991781676,538984544,4244431647,2981198280,1532737261,1785386174,3419114822,3200149465,960066123,1246401758,1280088276,1482207464,3486483786,3503340395,4025468202,2863288293,4227591446,1128498885,1296931543,859006549,2240090516,1162185423,4193904912,33686534,2139094657,1347461360,1010595908,2678007226,2829601763,1364304627,2745392638,1077969088,2408514954,2459058093,2644320700,943222856, +4126535940,3166462943,3065411521,3671764853,555827811,269492272,4294960410,4092853518,3537026925,3452797260,202119188,320022069,3974939439,1600110305,2543269282,1145342156,387395129,3301217111,2812761586,2122251394,1027439175,1684326572,1566423783,421081643,1936975509,1616953504,2172721560,1330618065,3705447295,572671078,707417214,2425371563,2290617219,1179028682,4008625961,3099093971,336865340,3739133817,1583267042,185275933,3688607094,3772832571,842163286,976909390,168432670,1229558491,101059594, +606357612,1549580516,3267534685,3553869166,2896970735,1650640038,2442213800,2509582756,3840201527,2038035083,3890730290,3368586051,926379609,1835915959,2374828428,3587551588,1313774802,2846444E3,1819072692,1448520954,4109693703,3941256997,1701169839,2054878350,2930657257,134746136,3132780501,2021191816,623200879,774790258,471611428,2795919345,3031724999,3334903633,3907570467,3722289532,1953818780,522141217,1263245021,3183305180,2341145990,2324303749,1886445712,1044282434,3048567236,1718013098,1212715224, +50529797,4143380225,235805714,1633796771,892693087,1465364217,3115936208,2256934801,3250690392,488454695,2661164985,3789674808,4177062675,2560109491,286335539,1768542907,3654920560,2391672713,2492740519,2610638262,505297954,2273777042,3924412704,3469641545,1431677695,673730680,3755976058,2357986191,2711706104,2307459456,218962455,3216991706,3873888049,1111655622,1751699640,1094812355,2576951728,757946999,252648977,2964356043,1414834428,3149622742,370551866],T3=[1673962851,2096661628,2012125559,2079755643, +4076801522,1809235307,1876865391,3314635973,811618352,16909057,1741597031,727088427,4276558334,3618988759,2874009259,1995217526,3398387146,2183110018,3381215433,2113570685,4209972730,1504897881,1200539975,4042984432,2906778797,3568527316,2724199842,2940594863,2619588508,2756966308,1927583346,3231407040,3077948087,4259388669,2470293139,642542118,913070646,1065238847,4160029431,3431157708,879254580,2773611685,3855693029,4059629809,1910674289,3635114968,828527409,355090197,67636228,3348452039,591815971, +3281870531,405809176,2520228246,84545285,2586817946,118360327,304363026,2149292928,3806281186,3956090603,659450151,2994720178,1978310517,152181513,2199756419,743994412,439627290,456535323,1859957358,1521806938,2690382752,1386542674,997608763,3602342358,3011366579,693271337,3822927587,794718511,2215876484,1403450707,3518589137,0,3988860141,541089824,4242743292,2977548465,1538714971,1792327274,3415033547,3194476990,963791673,1251270218,1285084236,1487988824,3481619151,3501943760,4022676207,2857362858, +4226619131,1132905795,1301993293,862344499,2232521861,1166724933,4192801017,33818114,2147385727,1352724560,1014514748,2670049951,2823545768,1369633617,2740846243,1082179648,2399505039,2453646738,2636233885,946882616,4126213365,3160661948,3061301686,3668932058,557998881,270544912,4293204735,4093447923,3535760850,3447803085,202904588,321271059,3972214764,1606345055,2536874647,1149815876,388905239,3297990596,2807427751,2130477694,1031423805,1690872932,1572530013,422718233,1944491379,1623236704,2165938305, +1335808335,3701702620,574907938,710180394,2419829648,2282455944,1183631942,4006029806,3094074296,338181140,3735517662,1589437022,185998603,3685578459,3772464096,845436466,980700730,169090570,1234361161,101452294,608726052,1555620956,3265224130,3552407251,2890133420,1657054818,2436475025,2503058581,3839047652,2045938553,3889509095,3364570056,929978679,1843050349,2365688973,3585172693,1318900302,2840191145,1826141292,1454176854,4109567988,3939444202,1707781989,2062847610,2923948462,135272456,3127891386, +2029029496,625635109,777810478,473441308,2790781350,3027486644,3331805638,3905627112,3718347997,1961401460,524165407,1268178251,3177307325,2332919435,2316273034,1893765232,1048330814,3044132021,1724688998,1217452104,50726147,4143383030,236720654,1640145761,896163637,1471084887,3110719673,2249691526,3248052417,490350365,2653403550,3789109473,4176155640,2553000856,287453969,1775418217,3651760345,2382858638,2486413204,2603464347,507257374,2266337927,3922272489,3464972750,1437269845,676362280,3752164063, +2349043596,2707028129,2299101321,219813645,3211123391,3872862694,1115997762,1758509160,1099088705,2569646233,760903469,253628687,2960903088,1420360788,3144537787,371997206],T4=[3332727651,4169432188,4003034999,4136467323,4279104242,3602738027,3736170351,2438251973,1615867952,33751297,3467208551,1451043627,3877240574,3043153879,1306962859,3969545846,2403715786,530416258,2302724553,4203183485,4011195130,3001768281,2395555655,4211863792,1106029997,3009926356,1610457762,1173008303,599760028,1408738468, +3835064946,2606481600,1975695287,3776773629,1034851219,1282024998,1817851446,2118205247,4110612471,2203045068,1750873140,1374987685,3509904869,4178113009,3801313649,2876496088,1649619249,708777237,135005188,2505230279,1181033251,2640233411,807933976,933336726,168756485,800430746,235472647,607523346,463175808,3745374946,3441880043,1315514151,2144187058,3936318837,303761673,496927619,1484008492,875436570,908925723,3702681198,3035519578,1543217312,2767606354,1984772923,3076642518,2110698419,1383803177, +3711886307,1584475951,328696964,2801095507,3110654417,0,3240947181,1080041504,3810524412,2043195825,3069008731,3569248874,2370227147,1742323390,1917532473,2497595978,2564049996,2968016984,2236272591,3144405200,3307925487,1340451498,3977706491,2261074755,2597801293,1716859699,294946181,2328839493,3910203897,67502594,4269899647,2700103760,2017737788,632987551,1273211048,2733855057,1576969123,2160083008,92966799,1068339858,566009245,1883781176,4043634165,1675607228,2009183926,2943736538,1113792801,540020752, +3843751935,4245615603,3211645650,2169294285,403966988,641012499,3274697964,3202441055,899848087,2295088196,775493399,2472002756,1441965991,4236410494,2051489085,3366741092,3135724893,841685273,3868554099,3231735904,429425025,2664517455,2743065820,1147544098,1417554474,1001099408,193169544,2362066502,3341414126,1809037496,675025940,2809781982,3168951902,371002123,2910247899,3678134496,1683370546,1951283770,337512970,2463844681,201983494,1215046692,3101973596,2673722050,3178157011,1139780780,3299238498, +967348625,832869781,3543655652,4069226873,3576883175,2336475336,1851340599,3669454189,25988493,2976175573,2631028302,1239460265,3635702892,2902087254,4077384948,3475368682,3400492389,4102978170,1206496942,270010376,1876277946,4035475576,1248797989,1550986798,941890588,1475454630,1942467764,2538718918,3408128232,2709315037,3902567540,1042358047,2531085131,1641856445,226921355,260409994,3767562352,2084716094,1908716981,3433719398,2430093384,100991747,4144101110,470945294,3265487201,1784624437,2935576407, +1775286713,395413126,2572730817,975641885,666476190,3644383713,3943954680,733190296,573772049,3535497577,2842745305,126455438,866620564,766942107,1008868894,361924487,3374377449,2269761230,2868860245,1350051880,2776293343,59739276,1509466529,159418761,437718285,1708834751,3610371814,2227585602,3501746280,2193834305,699439513,1517759789,504434447,2076946608,2835108948,1842789307,742004246];function B0(b){return b&255}function B1(b){return b>>8&255}function B2(b){return b>>16&255} +function B3(b){return b>>24&255}function F1(b,a,c,d){return B1(T1[b&255])|B1(T1[a>>8&255])<<8|B1(T1[c>>16&255])<<16|B1(T1[d>>>24])<<24}function packBytes(b){var a,c,d=b.length,e=Array(d/4);if(b&&!(d%4)){for(a=0,c=0;cc;d++,c++)f[b][c]=j[d];4==c&&(b++,c=0)}for(;bc;d++,c++)f[b][c]=j[d];4==c&&(b++,c=0)}}this.rounds=e;this.rk=f;return this} +function AESencrypt(b,a){var c,d,e,f,g,h=packBytes(b),j=a.rounds,k=h[0],l=h[1],m=h[2];g=h[3];for(c=0;c>8&255]^T3[f>>16&255]^T4[g>>>24],l=T1[e&255]^T2[f>>8&255]^T3[g>>16&255]^T4[d>>>24],m=T1[f&255]^T2[g>>8&255]^T3[d>>16&255]^T4[e>>>24],g=T1[g&255]^T2[d>>8&255]^T3[e>>16&255]^T4[f>>>24];c=j-1;d=k^a.rk[c][0];e=l^a.rk[c][1];f=m^a.rk[c][2];g^=a.rk[c][3];h[0]=F1(d,e,f,g)^a.rk[j][0];h[1]=F1(e,f,g,d)^a.rk[j][1];h[2]=F1(f, +g,d,e)^a.rk[j][2];h[3]=F1(g,d,e,f)^a.rk[j][3];return unpackBytes(h)}function Blowfish(){}Blowfish.prototype.BLOCKSIZE=8; +Blowfish.prototype.SBOXES=[[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110, +2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150, +2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882, +3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752, +2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733, +2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946],[1266315497,3048417604,3681880366,3289982499,290971E4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318, +4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577, +1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166, +1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008, +1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024, +3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055],[3913112168,2491498743, +4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247, +1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701, +1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260, +2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006, +548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820, +2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504],[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200, +2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241, +3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891, +3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409E3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588, +3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493, +1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]]; +Blowfish.prototype.PARRAY=[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731];Blowfish.prototype.NN=16;Blowfish.prototype._clean=function(b){0>b&&(b=(b&2147483647)+2147483648);return b};Blowfish.prototype._F=function(b){var a,c,d;d=b&255;b>>>=8;c=b&255;b>>>=8;a=b&255;b=this.sboxes[0][b>>>8&255]+this.sboxes[1][a];b^=this.sboxes[2][c];return b+=this.sboxes[3][d]}; +Blowfish.prototype._encrypt_block=function(b){var a=b[0],c=b[1],d;for(d=0;d>>24-8*a&255,b[a+d]=c[1]>>>24-8*a&255;return b}; +Blowfish.prototype._decrypt_block=function(b){var a=b[0],c=b[1],d;for(d=this.NN+1;1e;++e)d=d<<8|b[c]&255,++c>=b.length&&(c=0);this.parray[a]=this.PARRAY[a]^d}this.sboxes=[];for(a=0;4>a;++a){this.sboxes[a]=[];for(c=0;256>c;++c)this.sboxes[a][c]=this.SBOXES[a][c]}b=[0,0];for(a=0;aa;++a)for(c=0;256>c;c+=2)this._encrypt_block(b),this.sboxes[a][c+0]=b[0],this.sboxes[a][c+1]=b[1]}; +function BFencrypt(b,a){var c=new Blowfish;c.init(util.str2bin(a));return c.encrypt_block(b)}function cast5_encrypt(b,a){var c=new openpgp_symenc_cast5;c.setKey(util.str2bin(a));return c.encrypt(b)} +function openpgp_symenc_cast5(){function b(a,b,c){a=b+a;c=a<>>32-c;return(f[0][c>>>24]^f[1][c>>>16&255])-f[2][c>>>8&255]+f[3][c&255]}function a(a,b,c){a^=b;c=a<>>32-c;return f[0][c>>>24]-f[1][c>>>16&255]+f[2][c>>>8&255]^f[3][c&255]}function c(a,b,c){a=b-a;c=a<>>32-c;return(f[0][c>>>24]+f[1][c>>>16&255]^f[2][c>>>8&255])-f[3][c&255]}this.BlockSize=8;this.KeySize=16;this.setKey=function(a){this.masking=Array(16);this.rotate=Array(16);this.reset();if(a.length==this.KeySize)this.keySchedule(a); +else return util.print_error("cast5.js: CAST-128: keys must be 16 bytes"),!1;return!0};this.reset=function(){for(var a=0;16>a;a++)this.masking[a]=0,this.rotate[a]=0};this.getBlockSize=function(){return BlockSize};this.encrypt=function(d){for(var e=Array(d.length),f=0;f>>24&255;e[f+1]=l>>>16&255;e[f+2]=l>>>8&255;e[f+3]=l&255;e[f+4]=k>>>24&255;e[f+5]=k>>>16&255;e[f+6]=k>>>8&255;e[f+7]=k&255}return e};this.decrypt=function(d){for(var e=Array(d.length),f=0;f>>24&255;e[f+1]=l>>>16&255;e[f+2]=l>>>8&255;e[f+3]=l&255;e[f+4]=k>>>24&255;e[f+5]=k>>16&255;e[f+6]=k>>8&255;e[f+7]=k&255}return e};var d=Array(4);d[0]=Array(4);d[0][0]=[4,0,13,15,12,14,8];d[0][1]=[5,2,16,18,17,19,10];d[0][2]=[6,3,23,22,21,20,9];d[0][3]=[7,1,26,25,27,24,11];d[1]=Array(4);d[1][0]=[0, +6,21,23,20,22,16];d[1][1]=[1,4,0,2,1,3,18];d[1][2]=[2,5,7,6,5,4,17];d[1][3]=[3,7,10,9,11,8,19];d[2]=Array(4);d[2][0]=[4,0,13,15,12,14,8];d[2][1]=[5,2,16,18,17,19,10];d[2][2]=[6,3,23,22,21,20,9];d[2][3]=[7,1,26,25,27,24,11];d[3]=Array(4);d[3][0]=[0,6,21,23,20,22,16];d[3][1]=[1,4,0,2,1,3,18];d[3][2]=[2,5,7,6,5,4,17];d[3][3]=[3,7,10,9,11,8,19];var e=Array(4);e[0]=Array(4);e[0][0]=[24,25,23,22,18];e[0][1]=[26,27,21,20,22];e[0][2]=[28,29,19,18,25];e[0][3]=[30,31,17,16,28];e[1]=Array(4);e[1][0]=[3,2,12, +13,8];e[1][1]=[1,0,14,15,13];e[1][2]=[7,6,8,9,3];e[1][3]=[5,4,10,11,7];e[2]=Array(4);e[2][0]=[19,18,28,29,25];e[2][1]=[17,16,30,31,28];e[2][2]=[23,22,24,25,18];e[2][3]=[21,20,26,27,22];e[3]=Array(4);e[3][0]=[8,9,7,6,3];e[3][1]=[10,11,5,4,7];e[3][2]=[12,13,3,2,8];e[3][3]=[14,15,1,0,13];this.keySchedule=function(a){for(var b=Array(8),c=Array(32),k=0;4>k;k++){var l=4*k;b[k]=a[l]<<24|a[l+1]<<16|a[l+2]<<8|a[l+3]}for(var a=[6,7,4,5],m=k=0;2>m;m++)for(var r=0;4>r;r++){for(l=0;4>l;l++){var p=d[r][l],o=b[p[1]], +o=o^f[4][b[p[2]>>>2]>>>24-8*(p[2]&3)&255],o=o^f[5][b[p[3]>>>2]>>>24-8*(p[3]&3)&255],o=o^f[6][b[p[4]>>>2]>>>24-8*(p[4]&3)&255],o=o^f[7][b[p[5]>>>2]>>>24-8*(p[5]&3)&255],o=o^f[a[l]][b[p[6]>>>2]>>>24-8*(p[6]&3)&255];b[p[0]]=o}for(l=0;4>l;l++)p=e[r][l],o=f[4][b[p[0]>>>2]>>>24-8*(p[0]&3)&255],o^=f[5][b[p[1]>>>2]>>>24-8*(p[1]&3)&255],o^=f[6][b[p[2]>>>2]>>>24-8*(p[2]&3)&255],o^=f[7][b[p[3]>>>2]>>>24-8*(p[3]&3)&255],o^=f[4+l][b[p[4]>>>2]>>>24-8*(p[4]&3)&255],c[k]=o,k++}for(k=0;16>k;k++)this.masking[k]=c[k], +this.rotate[k]=c[16+k]&31};var f=Array(8);f[0]=[821772500,2678128395,1810681135,1059425402,505495343,2617265619,1610868032,3483355465,3218386727,2294005173,3791863952,2563806837,1852023008,365126098,3269944861,584384398,677919599,3229601881,4280515016,2002735330,1136869587,3744433750,2289869850,2731719981,2714362070,879511577,1639411079,575934255,717107937,2857637483,576097850,2731753936,1725645E3,2810460463,5111599,767152862,2543075244,1251459544,1383482551,3052681127,3089939183,3612463449,1878520045, +1510570527,2189125840,2431448366,582008916,3163445557,1265446783,1354458274,3529918736,3202711853,3073581712,3912963487,3029263377,1275016285,4249207360,2905708351,3304509486,1442611557,3585198765,2712415662,2731849581,3248163920,2283946226,208555832,2766454743,1331405426,1447828783,3315356441,3108627284,2957404670,2981538698,3339933917,1669711173,286233437,1465092821,1782121619,3862771680,710211251,980974943,1651941557,430374111,2051154026,704238805,4128970897,3144820574,2857402727,948965521,3333752299, +2227686284,718756367,2269778983,2731643755,718440111,2857816721,3616097120,1113355533,2478022182,410092745,1811985197,1944238868,2696854588,1415722873,1682284203,1060277122,1998114690,1503841958,82706478,2315155686,1068173648,845149890,2167947013,1768146376,1993038550,3566826697,3390574031,940016341,3355073782,2328040721,904371731,1205506512,4094660742,2816623006,825647681,85914773,2857843460,1249926541,1417871568,3287612,3211054559,3126306446,1975924523,1353700161,2814456437,2438597621,1800716203, +722146342,2873936343,1151126914,4160483941,2877670899,458611604,2866078500,3483680063,770352098,2652916994,3367839148,3940505011,3585973912,3809620402,718646636,2504206814,2914927912,3631288169,2857486607,2860018678,575749918,2857478043,718488780,2069512688,3548183469,453416197,1106044049,3032691430,52586708,3378514636,3459808877,3211506028,1785789304,218356169,3571399134,3759170522,1194783844,1523787992,3007827094,1975193539,2555452411,1341901877,3045838698,3776907964,3217423946,2802510864,2889438986, +1057244207,1636348243,3761863214,1462225785,2632663439,481089165,718503062,24497053,3332243209,3344655856,3655024856,3960371065,1195698900,2971415156,3710176158,2115785917,4027663609,3525578417,2524296189,2745972565,3564906415,1372086093,1452307862,2780501478,1476592880,3389271281,18495466,2378148571,901398090,891748256,3279637769,3157290713,2560960102,1447622437,4284372637,216884176,2086908623,1879786977,3588903153,2242455666,2938092967,3559082096,2810645491,758861177,1121993112,215018983,642190776, +4169236812,1196255959,2081185372,3508738393,941322904,4124243163,2877523539,1848581667,2205260958,3180453958,2589345134,3694731276,550028657,2519456284,3789985535,2973870856,2093648313,443148163,46942275,2734146937,1117713533,1115362972,1523183689,3717140224,1551984063];f[1]=[522195092,4010518363,1776537470,960447360,4267822970,4005896314,1435016340,1929119313,2913464185,1310552629,3579470798,3724818106,2579771631,1594623892,417127293,2715217907,2696228731,1508390405,3994398868,3925858569,3695444102, +4019471449,3129199795,3770928635,3520741761,990456497,4187484609,2783367035,21106139,3840405339,631373633,3783325702,532942976,396095098,3548038825,4267192484,2564721535,2011709262,2039648873,620404603,3776170075,2898526339,3612357925,4159332703,1645490516,223693667,1567101217,3362177881,1029951347,3470931136,3570957959,1550265121,119497089,972513919,907948164,3840628539,1613718692,3594177948,465323573,2659255085,654439692,2575596212,2699288441,3127702412,277098644,624404830,4100943870,2717858591, +546110314,2403699828,3655377447,1321679412,4236791657,1045293279,4010672264,895050893,2319792268,494945126,1914543101,2777056443,3894764339,2219737618,311263384,4275257268,3458730721,669096869,3584475730,3835122877,3319158237,3949359204,2005142349,2713102337,2228954793,3769984788,569394103,3855636576,1425027204,108000370,2736431443,3671869269,3043122623,1750473702,2211081108,762237499,3972989403,2798899386,3061857628,2943854345,867476300,964413654,1591880597,1594774276,2179821409,552026980,3026064248, +3726140315,2283577634,3110545105,2152310760,582474363,1582640421,1383256631,2043843868,3322775884,1217180674,463797851,2763038571,480777679,2718707717,2289164131,3118346187,214354409,200212307,3810608407,3025414197,2674075964,3997296425,1847405948,1342460550,510035443,4080271814,815934613,833030224,1620250387,1945732119,2703661145,3966000196,1388869545,3456054182,2687178561,2092620194,562037615,1356438536,3409922145,3261847397,1688467115,2150901366,631725691,3840332284,549916902,3455104640,394546491, +837744717,2114462948,751520235,2221554606,2415360136,3999097078,2063029875,803036379,2702586305,821456707,3019566164,360699898,4018502092,3511869016,3677355358,2402471449,812317050,49299192,2570164949,3259169295,2816732080,3331213574,3101303564,2156015656,3705598920,3546263921,143268808,3200304480,1638124008,3165189453,3341807610,578956953,2193977524,3638120073,2333881532,807278310,658237817,2969561766,1641658566,11683945,3086995007,148645947,1138423386,4158756760,1981396783,2401016740,3699783584, +380097457,2680394679,2803068651,3334260286,441530178,4016580796,1375954390,761952171,891809099,2183123478,157052462,3683840763,1592404427,341349109,2438483839,1417898363,644327628,2233032776,2353769706,2201510100,220455161,1815641738,182899273,2995019788,3627381533,3702638151,2890684138,1052606899,588164016,1681439879,4038439418,2405343923,4229449282,167996282,1336969661,1688053129,2739224926,1543734051,1046297529,1138201970,2121126012,115334942,1819067631,1902159161,1941945968,2206692869,1159982321]; +f[2]=[2381300288,637164959,3952098751,3893414151,1197506559,916448331,2350892612,2932787856,3199334847,4009478890,3905886544,1373570990,2450425862,4037870920,3778841987,2456817877,286293407,124026297,3001279700,1028597854,3115296800,4208886496,2691114635,2188540206,1430237888,1218109995,3572471700,308166588,570424558,2187009021,2455094765,307733056,1310360322,3135275007,1384269543,2388071438,863238079,2359263624,2801553128,3380786597,2831162807,1470087780,1728663345,4072488799,1090516929,532123132, +2389430977,1132193179,2578464191,3051079243,1670234342,1434557849,2711078940,1241591150,3314043432,3435360113,3091448339,1812415473,2198440252,267246943,796911696,3619716990,38830015,1526438404,2806502096,374413614,2943401790,1489179520,1603809326,1920779204,168801282,260042626,2358705581,1563175598,2397674057,1356499128,2217211040,514611088,2037363785,2186468373,4022173083,2792511869,2913485016,1173701892,4200428547,3896427269,1334932762,2455136706,602925377,2835607854,1613172210,41346230,2499634548, +2457437618,2188827595,41386358,4172255629,1313404830,2405527007,3801973774,2217704835,873260488,2528884354,2478092616,4012915883,2555359016,2006953883,2463913485,575479328,2218240648,2099895446,660001756,2341502190,3038761536,3888151779,3848713377,3286851934,1022894237,1620365795,3449594689,1551255054,15374395,3570825345,4249311020,4151111129,3181912732,310226346,1133119310,530038928,136043402,2476768958,3107506709,2544909567,1036173560,2367337196,1681395281,1758231547,3641649032,306774401,1575354324, +3716085866,1990386196,3114533736,2455606671,1262092282,3124342505,2768229131,4210529083,1833535011,423410938,660763973,2187129978,1639812E3,3508421329,3467445492,310289298,272797111,2188552562,2456863912,310240523,677093832,1013118031,901835429,3892695601,1116285435,3036471170,1337354835,243122523,520626091,277223598,4244441197,4194248841,1766575121,594173102,316590669,742362309,3536858622,4176435350,3838792410,2501204839,1229605004,3115755532,1552908988,2312334149,979407927,3959474601,1148277331, +176638793,3614686272,2083809052,40992502,1340822838,2731552767,3535757508,3560899520,1354035053,122129617,7215240,2732932949,3118912700,2718203926,2539075635,3609230695,3725561661,1928887091,2882293555,1988674909,2063640240,2491088897,1459647954,4189817080,2302804382,1113892351,2237858528,1927010603,4002880361,1856122846,1594404395,2944033133,3855189863,3474975698,1643104450,4054590833,3431086530,1730235576,2984608721,3084664418,2131803598,4178205752,267404349,1617849798,1616132681,1462223176,736725533, +2327058232,551665188,2945899023,1749386277,2575514597,1611482493,674206544,2201269090,3642560800,728599968,1680547377,2620414464,1388111496,453204106,4156223445,1094905244,2754698257,2201108165,3757000246,2704524545,3922940700,3996465027];f[3]=[2645754912,532081118,2814278639,3530793624,1246723035,1689095255,2236679235,4194438865,2116582143,3859789411,157234593,2045505824,4245003587,1687664561,4083425123,605965023,672431967,1336064205,3376611392,214114848,4258466608,3232053071,489488601,605322005, +3998028058,264917351,1912574028,756637694,436560991,202637054,135989450,85393697,2152923392,3896401662,2895836408,2145855233,3535335007,115294817,3147733898,1922296357,3464822751,4117858305,1037454084,2725193275,2127856640,1417604070,1148013728,1827919605,642362335,2929772533,909348033,1346338451,3547799649,297154785,1917849091,4161712827,2883604526,3968694238,1469521537,3780077382,3375584256,1763717519,136166297,4290970789,1295325189,2134727907,2798151366,1566297257,3672928234,2677174161,2672173615, +965822077,2780786062,289653839,1133871874,3491843819,35685304,1068898316,418943774,672553190,642281022,2346158704,1954014401,3037126780,4079815205,2030668546,3840588673,672283427,1776201016,359975446,3750173538,555499703,2769985273,1324923,69110472,152125443,3176785106,3822147285,1340634837,798073664,1434183902,15393959,216384236,1303690150,3881221631,3711134124,3960975413,106373927,2578434224,1455997841,1801814300,1578393881,1854262133,3188178946,3258078583,2302670060,1539295533,3505142565,3078625975, +2372746020,549938159,3278284284,2620926080,181285381,2865321098,3970029511,68876850,488006234,1728155692,2608167508,836007927,2435231793,919367643,3339422534,3655756360,1457871481,40520939,1380155135,797931188,234455205,2255801827,3990488299,397000196,739833055,3077865373,2871719860,4022553888,772369276,390177364,3853951029,557662966,740064294,1640166671,1699928825,3535942136,622006121,3625353122,68743880,1742502,219489963,1664179233,1577743084,1236991741,410585305,2366487942,823226535,1050371084, +3426619607,3586839478,212779912,4147118561,1819446015,1911218849,530248558,3486241071,3252585495,2886188651,3410272728,2342195030,20547779,2982490058,3032363469,3631753222,312714466,1870521650,1493008054,3491686656,615382978,4103671749,2534517445,1932181,2196105170,278426614,6369430,3274544417,2913018367,697336853,2143000447,2946413531,701099306,1558357093,2805003052,3500818408,2321334417,3567135975,216290473,3591032198,23009561,1996984579,3735042806,2024298078,3739440863,569400510,2339758983,3016033873, +3097871343,3639523026,3844324983,3256173865,795471839,2951117563,4101031090,4091603803,3603732598,971261452,534414648,428311343,3389027175,2844869880,694888862,1227866773,2456207019,3043454569,2614353370,3749578031,3676663836,459166190,4132644070,1794958188,51825668,2252611902,3084671440,2036672799,3436641603,1099053433,2469121526,3059204941,1323291266,2061838604,1018778475,2233344254,2553501054,334295216,3556750194,1065731521,183467730];f[4]=[2127105028,745436345,2601412319,2788391185,3093987327, +500390133,1155374404,389092991,150729210,3891597772,3523549952,1935325696,716645080,946045387,2901812282,1774124410,3869435775,4039581901,3293136918,3438657920,948246080,363898952,3867875531,1286266623,1598556673,68334250,630723836,1104211938,1312863373,613332731,2377784574,1101634306,441780740,3129959883,1917973735,2510624549,3238456535,2544211978,3308894634,1299840618,4076074851,1756332096,3977027158,297047435,3790297736,2265573040,3621810518,1311375015,1667687725,47300608,3299642885,2474112369, +201668394,1468347890,576830978,3594690761,3742605952,1958042578,1747032512,3558991340,1408974056,3366841779,682131401,1033214337,1545599232,4265137049,206503691,103024618,2855227313,1337551222,2428998917,2963842932,4015366655,3852247746,2796956967,3865723491,3747938335,247794022,3755824572,702416469,2434691994,397379957,851939612,2314769512,218229120,1380406772,62274761,214451378,3170103466,2276210409,3845813286,28563499,446592073,1693330814,3453727194,29968656,3093872512,220656637,2470637031,77972100, +1667708854,1358280214,4064765667,2395616961,325977563,4277240721,4220025399,3605526484,3355147721,811859167,3069544926,3962126810,652502677,3075892249,4132761541,3498924215,1217549313,3250244479,3858715919,3053989961,1538642152,2279026266,2875879137,574252750,3324769229,2651358713,1758150215,141295887,2719868960,3515574750,4093007735,4194485238,1082055363,3417560400,395511885,2966884026,179534037,3646028556,3738688086,1092926436,2496269142,257381841,3772900718,1636087230,1477059743,2499234752,3811018894, +2675660129,3285975680,90732309,1684827095,1150307763,1723134115,3237045386,1769919919,1240018934,815675215,750138730,2239792499,1234303040,1995484674,138143821,675421338,1145607174,1936608440,3238603024,2345230278,2105974004,323969391,779555213,3004902369,2861610098,1017501463,2098600890,2628620304,2940611490,2682542546,1171473753,3656571411,3687208071,4091869518,393037935,159126506,1662887367,1147106178,391545844,3452332695,1891500680,3016609650,1851642611,546529401,1167818917,3194020571,2848076033, +3953471836,575554290,475796850,4134673196,450035699,2351251534,844027695,1080539133,86184846,1554234488,3692025454,1972511363,2018339607,1491841390,1141460869,1061690759,4244549243,2008416118,2351104703,2868147542,1598468138,722020353,1027143159,212344630,1387219594,1725294528,3745187956,2500153616,458938280,4129215917,1828119673,544571780,3503225445,2297937496,1241802790,267843827,2694610800,1397140384,1558801448,3782667683,1806446719,929573330,2234912681,400817706,616011623,4121520928,3603768725, +1761550015,1968522284,4053731006,4192232858,4005120285,872482584,3140537016,3894607381,2287405443,1963876937,3663887957,1584857E3,2975024454,1833426440,4025083860];f[5]=[4143615901,749497569,1285769319,3795025788,2514159847,23610292,3974978748,844452780,3214870880,3751928557,2213566365,1676510905,448177848,3730751033,4086298418,2307502392,871450977,3222878141,4110862042,3831651966,2735270553,1310974780,2043402188,1218528103,2736035353,4274605013,2702448458,3936360550,2693061421,162023535,2827510090, +687910808,23484817,3784910947,3371371616,779677500,3503626546,3473927188,4157212626,3500679282,4248902014,2466621104,3899384794,1958663117,925738300,1283408968,3669349440,1840910019,137959847,2679828185,1239142320,1315376211,1547541505,1690155329,739140458,3128809933,3933172616,3876308834,905091803,1548541325,4040461708,3095483362,144808038,451078856,676114313,2861728291,2469707347,993665471,373509091,2599041286,4025009006,4170239449,2149739950,3275793571,3749616649,2794760199,1534877388,572371878, +2590613551,1753320020,3467782511,1405125690,4270405205,633333386,3026356924,3475123903,632057672,2846462855,1404951397,3882875879,3915906424,195638627,2385783745,3902872553,1233155085,3355999740,2380578713,2702246304,2144565621,3663341248,3894384975,2502479241,4248018925,3094885567,1594115437,572884632,3385116731,767645374,1331858858,1475698373,3793881790,3532746431,1321687957,619889600,1121017241,3440213920,2070816767,2833025776,1933951238,4095615791,890643334,3874130214,859025556,360630002,925594799, +1764062180,3920222280,4078305929,979562269,2810700344,4087740022,1949714515,546639971,1165388173,3069891591,1495988560,922170659,1291546247,2107952832,1813327274,3406010024,3306028637,4241950635,153207855,2313154747,1608695416,1150242611,1967526857,721801357,1220138373,3691287617,3356069787,2112743302,3281662835,1111556101,1778980689,250857638,2298507990,673216130,2846488510,3207751581,3562756981,3008625920,3417367384,2198807050,529510932,3547516680,3426503187,2364944742,102533054,2294910856,1617093527, +1204784762,3066581635,1019391227,1069574518,1317995090,1691889997,3661132003,510022745,3238594800,1362108837,1817929911,2184153760,805817662,1953603311,3699844737,120799444,2118332377,207536705,2282301548,4120041617,145305846,2508124933,3086745533,3261524335,1877257368,2977164480,3160454186,2503252186,4221677074,759945014,254147243,2767453419,3801518371,629083197,2471014217,907280572,3900796746,940896768,2751021123,2625262786,3161476951,3661752313,3260732218,1425318020,2977912069,1496677566,3988592072, +2140652971,3126511541,3069632175,977771578,1392695845,1698528874,1411812681,1369733098,1343739227,3620887944,1142123638,67414216,3102056737,3088749194,1626167401,2546293654,3941374235,697522451,33404913,143560186,2595682037,994885535,1247667115,3859094837,2699155541,3547024625,4114935275,2968073508,3199963069,2732024527,1237921620,951448369,1898488916,1211705605,2790989240,2233243581,3598044975];f[6]=[2246066201,858518887,1714274303,3485882003,713916271,2879113490,3730835617,539548191,36158695,1298409750, +419087104,1358007170,749914897,2989680476,1261868530,2995193822,2690628854,3443622377,3780124940,3796824509,2976433025,4259637129,1551479E3,512490819,1296650241,951993153,2436689437,2460458047,144139966,3136204276,310820559,3068840729,643875328,1969602020,1680088954,2185813161,3283332454,672358534,198762408,896343282,276269502,3014846926,84060815,197145886,376173866,3943890818,3813173521,3545068822,1316698879,1598252827,2633424951,1233235075,859989710,2358460855,3503838400,3409603720,1203513385,1193654839, +2792018475,2060853022,207403770,1144516871,3068631394,1121114134,177607304,3785736302,326409831,1929119770,2983279095,4183308101,3474579288,3200513878,3228482096,119610148,1170376745,3378393471,3163473169,951863017,3337026068,3135789130,2907618374,1183797387,2015970143,4045674555,2182986399,2952138740,3928772205,384012900,2454997643,10178499,2879818989,2596892536,111523738,2995089006,451689641,3196290696,235406569,1441906262,3890558523,3013735005,4158569349,1644036924,376726067,1006849064,3664579700, +2041234796,1021632941,1374734338,2566452058,371631263,4007144233,490221539,206551450,3140638584,1053219195,1853335209,3412429660,3562156231,735133835,1623211703,3104214392,2738312436,4096837757,3366392578,3110964274,3956598718,3196820781,2038037254,3877786376,2339753847,300912036,3766732888,2372630639,1516443558,4200396704,1574567987,4069441456,4122592016,2699739776,146372218,2748961456,2043888151,35287437,2596680554,655490400,1132482787,110692520,1031794116,2188192751,1324057718,1217253157,919197030, +686247489,3261139658,1028237775,3135486431,3059715558,2460921700,986174950,2661811465,4062904701,2752986992,3709736643,367056889,1353824391,731860949,1650113154,1778481506,784341916,357075625,3608602432,1074092588,2480052770,3811426202,92751289,877911070,3600361838,1231880047,480201094,3756190983,3094495953,434011822,87971354,363687820,1717726236,1901380172,3926403882,2481662265,400339184,1490350766,2661455099,1389319756,2558787174,784598401,1983468483,30828846,3550527752,2716276238,3841122214,1765724805, +1955612312,1277890269,1333098070,1564029816,2704417615,1026694237,3287671188,1260819201,3349086767,1016692350,1582273796,1073413053,1995943182,694588404,1025494639,3323872702,3551898420,4146854327,453260480,1316140391,1435673405,3038941953,3486689407,1622062951,403978347,817677117,950059133,4246079218,3278066075,1486738320,1417279718,481875527,2549965225,3933690356,760697757,1452955855,3897451437,1177426808,1702951038,4085348628,2447005172,1084371187,3516436277,3068336338,1073369276,1027665953,3284188590, +1230553676,1368340146,2226246512,267243139,2274220762,4070734279,2497715176,2423353163,2504755875];f[7]=[3793104909,3151888380,2817252029,895778965,2005530807,3871412763,237245952,86829237,296341424,3851759377,3974600970,2475086196,709006108,1994621201,2972577594,937287164,3734691505,168608556,3189338153,2225080640,3139713551,3033610191,3025041904,77524477,185966941,1208824168,2344345178,1721625922,3354191921,1066374631,1927223579,1971335949,2483503697,1551748602,2881383779,2856329572,3003241482, +48746954,1398218158,2050065058,313056748,4255789917,393167848,1912293076,940740642,3465845460,3091687853,2522601570,2197016661,1727764327,364383054,492521376,1291706479,3264136376,1474851438,1685747964,2575719748,1619776915,1814040067,970743798,1561002147,2925768690,2123093554,1880132620,3151188041,697884420,2550985770,2607674513,2659114323,110200136,1489731079,997519150,1378877361,3527870668,478029773,2766872923,1022481122,431258168,1112503832,897933369,2635587303,669726182,3383752315,918222264, +163866573,3246985393,3776823163,114105080,1903216136,761148244,3571337562,1690750982,3166750252,1037045171,1888456500,2010454850,642736655,616092351,365016990,1185228132,4174898510,1043824992,2023083429,2241598885,3863320456,3279669087,3674716684,108438443,2132974366,830746235,606445527,4173263986,2204105912,1844756978,2532684181,4245352700,2969441100,3796921661,1335562986,4061524517,2720232303,2679424040,634407289,885462008,3294724487,3933892248,2094100220,339117932,4048830727,3202280980,1458155303, +2689246273,1022871705,2464987878,3714515309,353796843,2822958815,4256850100,4052777845,551748367,618185374,3778635579,4020649912,1904685140,3069366075,2670879810,3407193292,2954511620,4058283405,2219449317,3135758300,1120655984,3447565834,1474845562,3577699062,550456716,3466908712,2043752612,881257467,869518812,2005220179,938474677,3305539448,3850417126,1315485940,3318264702,226533026,965733244,321539988,1136104718,804158748,573969341,3708209826,937399083,3290727049,2901666755,1461057207,4013193437, +4066861423,3242773476,2421326174,1581322155,3028952165,786071460,3900391652,3918438532,1485433313,4023619836,3708277595,3678951060,953673138,1467089153,1930354364,1533292819,2492563023,1346121658,1685000834,1965281866,3765933717,4190206607,2052792609,3515332758,690371149,3125873887,2180283551,2903598061,3933952357,436236910,289419410,14314871,1242357089,2904507907,1616633776,2666382180,585885352,3471299210,2699507360,1432659641,277164553,3354103607,770115018,2303809295,3741942315,3177781868,2853364978, +2269453327,3774259834,987383833,1290892879,225909803,1741533526,890078084,1496906255,1111072499,916028167,243534141,1252605537,2204162171,531204876,290011180,3916834213,102027703,237315147,209093447,1486785922,220223953,2758195998,4175039106,82940208,3127791296,2569425252,518464269,1353887104,3941492737,2377294467,3935040926]} +function desede(b,a){var c=a.substring(0,8),d=a.substring(8,16),e=a.substring(16,24);return util.str2bin(des(des_createKeys(e),des(des_createKeys(d),des(des_createKeys(c),util.bin2str(b),!0,0,null,null),!1,0,null,null),!0,0,null,null))} +function des(b,a,c,d,e,f){var g=[16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756],h=[-2146402272,-2147450880, +32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880, +32800,-2147483648,-2146435040,-2146402272,1081344],j=[520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800, +131592,8,134348808,131584],k=[8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928],l=[256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688, +1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080],m=[536870928,541065216, +16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312],r=[2097152, +69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154],p=[268439616,4096,262144,268701760,268435456, +268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696],o=0,y,v,w,A,t,u,P,C,Q,E,x,z,V,K=a.length,D=0,B=32== +b.length?3:9;P=3==B?c?[0,32,2]:[30,-2,-2]:c?[0,32,2,62,30,-2,64,96,2]:[94,62,-2,32,64,2,30,-2,-2];if(c)a=des_addPadding(a,f),K=a.length;tempresult=result="";1==d&&(C=e.charCodeAt(o++)<<24|e.charCodeAt(o++)<<16|e.charCodeAt(o++)<<8|e.charCodeAt(o++),E=e.charCodeAt(o++)<<24|e.charCodeAt(o++)<<16|e.charCodeAt(o++)<<8|e.charCodeAt(o++),o=0);for(;o>>4^u)&252645135;u^=v;t^=v<<4;v=(t>>>16^u)&65535;u^=v;t^=v<<16;v=(u>>>2^t)&858993459;t^=v;u^=v<<2;v=(u>>>8^t)&16711935;t^=v;u^=v<<8;v=(t>>>1^u)&1431655765;u^=v;t^=v<<1;t=t<<1|t>>>31;u=u<<1|u>>>31;for(y=0;y>>4|u<<28)^b[e+1],v=t,t=u,u=v^(h[w>>>24&63]|k[w>>>16&63]|m[w>>>8&63]|p[w&63]|g[A>>>24&63]|j[A>>>16&63]|l[A>>>8&63]|r[A&63]);v=t;t=u;u=v}t=t>>>1|t<<31;u=u>>>1|u<<31;v=(t>>> +1^u)&1431655765;u^=v;t^=v<<1;v=(u>>>8^t)&16711935;t^=v;u^=v<<8;v=(u>>>2^t)&858993459;t^=v;u^=v<<2;v=(t>>>16^u)&65535;u^=v;t^=v<<16;v=(t>>>4^u)&252645135;u^=v;t^=v<<4;1==d&&(c?(C=t,E=u):(t^=Q,u^=x));tempresult+=String.fromCharCode(t>>>24,t>>>16&255,t>>>8&255,t&255,u>>>24,u>>>16&255,u>>>8&255,u&255);D+=8;512==D&&(result+=tempresult,tempresult="",D=0)}result+=tempresult;c||(result=des_removePadding(result,f));return result} +function des_createKeys(b){pc2bytes0=[0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964];pc2bytes1=[0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697];pc2bytes2=[0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272];pc2bytes3=[0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952, +139264,2236416,134356992,136454144];pc2bytes4=[0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256];pc2bytes5=[0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488];pc2bytes6=[0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746];pc2bytes7=[0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032, +537069568];pc2bytes8=[0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578];pc2bytes9=[0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488];pc2bytes10=[0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800];pc2bytes11=[0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744]; +pc2bytes12=[0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128];pc2bytes13=[0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261];for(var a=8>>4^right)&252645135; +right^=j;left^=j<<4;j=(right>>>-16^left)&65535;left^=j;right^=j<<-16;j=(left>>>2^right)&858993459;right^=j;left^=j<<2;j=(right>>>-16^left)&65535;left^=j;right^=j<<-16;j=(left>>>1^right)&1431655765;right^=j;left^=j<<1;j=(right>>>8^left)&16711935;left^=j;right^=j<<8;j=(left>>>1^right)&1431655765;right^=j;left^=j<<1;j=left<<8|right>>>20&240;left=right<<24|right<<8&16711680|right>>>8&65280|right>>>24&240;right=j;for(i=0;i>>26,right=right<<2|right>>>26):(left=left<< +1|left>>>27,right=right<<1|right>>>27),left&=-15,right&=-15,e=pc2bytes0[left>>>28]|pc2bytes1[left>>>24&15]|pc2bytes2[left>>>20&15]|pc2bytes3[left>>>16&15]|pc2bytes4[left>>>12&15]|pc2bytes5[left>>>8&15]|pc2bytes6[left>>>4&15],f=pc2bytes7[right>>>28]|pc2bytes8[right>>>24&15]|pc2bytes9[right>>>20&15]|pc2bytes10[right>>>16&15]|pc2bytes11[right>>>12&15]|pc2bytes12[right>>>8&15]|pc2bytes13[right>>>4&15],j=(f>>>16^e)&65535,c[h++]=e^j,c[h++]=f^j<<16}return c} +function des_addPadding(b,a){var c=8-b.length%8;2==a&&8>c?b+=" ".substr(0,c):1==a?b+=String.fromCharCode(c,c,c,c,c,c,c,c).substr(0,c):!a&&8>c&&(b+="\x00\x00\x00\x00\x00\x00\x00\x00".substr(0,c));return b}function des_removePadding(b,a){if(2==a)b=b.replace(/ *$/g,"");else if(1==a)var c=b.charCodeAt(b.length-1),b=b.substr(0,b.length-c);else a||(b=b.replace(/\0*$/g,""));return b} +function TFencrypt(b,a){var c=[].concat(b),d=createTwofish();d.open(util.str2bin(a),0);c=d.encrypt(c,0);d.close();return c}var MAXINT=4294967295;function rotb(b,a){return(b<>>8-a)&255}function rotw(b,a){return(b<>>32-a)&MAXINT}function getW(b,a){return b[a]|b[a+1]<<8|b[a+2]<<16|b[a+3]<<24}function setW(b,a,c){b.splice(a,4,c&255,c>>>8&255,c>>>16&255,c>>>24&255)}function setWInv(b,a,c){b.splice(a,4,c>>>24&255,c>>>16&255,c>>>8&255,c&255)}function getB(b,a){return b>>>8*a&255} +function getNrBits(b){for(var a=0;0>>=1;return a}function getMask(b){return(1<d;d++)e=c>>>24,c=c<<8&MAXINT|a>>>24,a=a<<8&MAXINT,f=e<<1,e&128&&(f^=333),c^=e^f<<16,f^=e>>>1,e&1&&(f^=166),c^=f<<24|f<<8;return c}function d(a,b){var c,e,f;c=b>>4;e=b&15;f=t[a][c^ +e];c=u[a][Q[e]^E[c]];return C[a][Q[c]^E[f]]<<4|P[a][f^c]}function e(a,b){var c=getB(a,0),d=getB(a,1),f=getB(a,2),g=getB(a,3);switch(v){case 4:c=x[1][c]^getB(b[3],0),d=x[0][d]^getB(b[3],1),f=x[0][f]^getB(b[3],2),g=x[1][g]^getB(b[3],3);case 3:c=x[1][c]^getB(b[2],0),d=x[1][d]^getB(b[2],1),f=x[0][f]^getB(b[2],2),g=x[0][g]^getB(b[2],3);case 2:c=x[0][x[0][c]^getB(b[1],0)]^getB(b[0],0),d=x[0][x[1][d]^getB(b[1],1)]^getB(b[0],1),f=x[1][x[0][f]^getB(b[1],2)]^getB(b[0],2),g=x[1][x[1][g]^getB(b[1],3)]^getB(b[0], +3)}return z[0][c]^z[1][d]^z[2][f]^z[3][g]}c=a;var m,r,p,o;p=[];o=[];var y=[],v,w=[],A,t=[[8,1,7,13,6,15,3,2,0,11,5,9,14,12,10,4],[2,8,11,13,15,7,6,14,3,1,9,4,0,10,12,5]],u=[[14,12,11,8,1,2,3,5,15,4,10,6,7,0,9,13],[1,14,2,11,4,12,3,7,6,13,10,5,15,9,0,8]],P=[[11,10,5,14,6,13,9,0,12,8,15,3,2,4,7,1],[4,12,7,5,1,6,9,10,0,14,13,8,2,11,3,15]],C=[[13,7,15,4,1,2,6,14,9,11,3,0,8,5,12,10],[11,9,5,1,12,3,13,14,6,4,7,15,2,0,8,10]],Q=[0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15],E=[0,9,2,11,4,13,6,15,8,1,10,3,12,5,14, +7],x=[[],[]],z=[[],[],[],[]];c=c.slice(0,32);for(a=c.length;16!=a&&24!=a&&32!=a;)c[a++]=0;for(a=0;a>2]=getW(c,a);for(a=0;256>a;a++)x[0][a]=d(0,a),x[1][a]=d(1,a);for(a=0;256>a;a++)m=x[1][a],r=m^m>>2^[0,90,180,238][m&3],A=m^m>>1^m>>2^[0,238,180,90][m&3],z[0][a]=m+(r<<8)+(A<<16)+(A<<24),z[2][a]=r+(A<<8)+(m<<16)+(A<<24),m=x[0][a],r=m^m>>2^[0,90,180,238][m&3],A=m^m>>1^m>>2^[0,238,180,90][m&3],z[1][a]=A+(A<<8)+(r<<16)+(m<<24),z[3][a]=r+(m<<8)+(A<<16)+(r<<24);v=y.length/2;for(a=0;aa;a+=2)m=16843009*a,r=m+16843009,m=e(m,p),r=rotw(e(r,o),8),f[a]=m+r&MAXINT,f[a+1]=rotw(m+2*r,9);for(a=0;256>a;a++)switch(m=r=p=o=a,v){case 4:m=x[1][m]^getB(w[3],0),r=x[0][r]^getB(w[3],1),p=x[0][p]^getB(w[3],2),o=x[1][o]^getB(w[3],3);case 3:m=x[1][m]^getB(w[2],0),r=x[1][r]^getB(w[2],1),p=x[0][p]^getB(w[2],2),o=x[0][o]^getB(w[2],3);case 2:g[0][a]=z[0][x[0][x[0][m]^getB(w[1],0)]^getB(w[0],0)],g[1][a]=z[1][x[0][x[1][r]^getB(w[1],1)]^getB(w[0], +1)],g[2][a]=z[2][x[1][x[0][p]^getB(w[1],2)]^getB(w[0],2)],g[3][a]=z[3][x[1][x[1][o]^getB(w[1],3)]^getB(w[0],3)]}},close:function(){f=[];g=[[],[],[],[]]},encrypt:function(c,g){d=c;e=g;for(var k=[getW(d,e)^f[0],getW(d,e+4)^f[1],getW(d,e+8)^f[2],getW(d,e+12)^f[3]],l=0;8>l;l++){var m=l,r=k,p=b(r[0]),o=a(r[1]);r[2]=rotw(r[2]^p+o+f[4*m+8]&MAXINT,31);r[3]=rotw(r[3],1)^p+2*o+f[4*m+9]&MAXINT;p=b(r[2]);o=a(r[3]);r[0]=rotw(r[0]^p+o+f[4*m+10]&MAXINT,31);r[1]=rotw(r[1],1)^p+2*o+f[4*m+11]&MAXINT}setW(d,e,k[2]^ +f[4]);setW(d,e+4,k[3]^f[5]);setW(d,e+8,k[0]^f[6]);setW(d,e+12,k[1]^f[7]);e+=16;return d},decrypt:function(c,g){d=c;e=g;for(var k=[getW(d,e)^f[4],getW(d,e+4)^f[5],getW(d,e+8)^f[6],getW(d,e+12)^f[7]],l=7;0<=l;l--){var m=l,r=k,p=b(r[0]),o=a(r[1]);r[2]=rotw(r[2],1)^p+o+f[4*m+10]&MAXINT;r[3]=rotw(r[3]^p+2*o+f[4*m+11]&MAXINT,31);p=b(r[2]);o=a(r[3]);r[0]=rotw(r[0],1)^p+o+f[4*m+8]&MAXINT;r[1]=rotw(r[1]^p+2*o+f[4*m+9]&MAXINT,31)}setW(d,e,k[2]^f[0]);setW(d,e+4,k[3]^f[1]);setW(d,e+8,k[0]^f[2]);setW(d,e+12,k[1]^ +f[3]);e+=16},finalize:function(){return d}}}JXG={exists:function(b){return function(a){return!(a===b||null===a)}}()};JXG.decompress=function(b){return unescape((new JXG.Util.Unzip(JXG.Util.Base64.decodeAsArray(b))).unzip()[0][0])};JXG.Util={}; +JXG.Util.Unzip=function(b){function a(){aa+=8;return D>=1;0==B&&(B=a(),b=B&1,B=B>>1|128);return b}function d(a){for(var b=0,d=a;d--;)b=b<<1|c();a&&(b=C[b]>>8-a);return b}function e(a){P++;A[t++]=a;p.push(String.fromCharCode(a));32768==t&&(t=0)}function f(){this.b1=this.b0=0;this.jump=null;this.jumppos=-1}function g(){for(;;){if(W[M]>=ra)return-1;if(qa[W[M]]==M)return W[M]++;W[M]++}}function h(){var a=U[T],b;o&&document.write("
    len:"+M+" treepos:"+ +T);if(17==M)return-1;T++;M++;b=g();o&&document.write("
    IsPat "+b);if(0<=b)a.b0=b,o&&document.write("
    b0 "+a.b0);else if(a.b0=32768,o&&document.write("
    b0 "+a.b0),h())return-1;b=g();if(0<=b)a.b1=b,o&&document.write("
    b1 "+a.b1),a.jump=null;else if(a.b1=32768,o&&document.write("
    b1 "+a.b1),a.jump=U[T],a.jumppos=T,h())return-1;M--;return 0}function j(a,b,c,d){o&&document.write("currentTree "+a+" numval "+b+" lengths "+c+" show "+d);U=a;T=0;qa=c;ra=b;for(a=0;17>a;a++)W[a]=0;M=0;if(h())return o&& +alert("invalid huffman tree\n"),-1;if(o){document.write("
    Tree: "+U.length);for(a=0;32>a;a++)document.write("Places["+a+"].b0="+U[a].b0+"
    "),document.write("Places["+a+"].b1="+U[a].b1+"
    ")}return 0}function k(a){for(var b,d,e=0,f=a[e];;)if(b=c(),o&&document.write("b="+b),b){if(!(f.b1&32768))return o&&document.write("ret1"),f.b1;f=f.jump;b=a.length;for(d=0;d>1,23h)e(h);else if(256==h)break;else{var p;h-=257;m=d(E[h])+Q[h];h=C[d(5)]>>3;8h;h++)r[h]=0;for(h=0;hdistanceTree");for(h=0;h"+O[h].b0+" "+O[h].b1+" "+O[h].jump+" "+O[h].jumppos)}m=g+p;l=0;var u= +-1;for(o&&document.write("
    n="+m+" bits: "+aa+"
    ");l"+u+" i:"+l+" decode: "+h+" bits "+aa+"
    "),16>h)r[l++]=h;else if(16==h){var v;h=3+d(2);if(l+h>m)return t=0,1;for(v=l?r[l-1]:0;h--;)r[l++]=v}else{h=17==h?3+d(3):11+d(7);if(l+h>m)return t=0,1;for(;h--;)r[l++]=0}m=ba.length;for(l=0;lliteralTree"); +a:for(;;)if(h=k(ba),256<=h){h-=256;if(0==h)break;h--;m=d(E[h])+Q[h];h=k(O);8t-p)break a;g=A[t-p&32767];e(g)}}else e(h)}}while(!b);t=0;B=1;return 0}function m(){o&&alert("NEXTFILE");p=[];var b=[];u=!1;b[0]=a();b[1]=a();o&&alert("type: "+b[0]+" "+b[1]);120==b[0]&&218==b[1]&&(o&&alert("GEONExT-GZIP"),l(),o&&alert(p.join("")),w[v]=Array(2),w[v][0]=p.join(""),w[v][1]="geonext.gxt",v++);120==b[0]&&156==b[1]&&(o&&alert("ZLIB"),l(),o&&alert(p.join("")), +w[v]=Array(2),w[v][0]=p.join(""),w[v][1]="ZLIB",v++);31==b[0]&&139==b[1]&&(o&&alert("GZIP"),r(),o&&alert(p.join("")),w[v]=Array(2),w[v][0]=p.join(""),w[v][1]="file",v++);if(80==b[0]&&75==b[1]&&(u=!0,b[2]=a(),b[3]=a(),3==b[2]&&4==b[3])){b[0]=a();b[1]=a();o&&alert("ZIP-Version: "+b[1]+" "+b[0]/10+"."+b[0]%10);y=a();y|=a()<<8;o&&alert("gpflags: "+y);b=a();b|=a()<<8;o&&alert("method: "+b);a();a();a();a();var c=a(),c=c|a()<<8,c=c|a()<<16,c=c|a()<<24,d=a(),d=d|a()<<8,d=d|a()<<16,d=d|a()<<24,e=a(),e=e|a()<< +8,e=e|a()<<16,e=e|a()<<24;o&&alert("local CRC: "+c+"\nlocal Size: "+e+"\nlocal CompSize: "+d);c=a();c|=a()<<8;d=a();d|=a()<<8;o&&alert("filelen "+c);f=0;for(R=[];c--;)e=a(),"/"==e|":"==e?f=0:f>2,c=(c&3)<<4|d>>4,g=(d&15)<<2|e>>6,h=e&63,isNaN(d)?g=h=64:isNaN(e)&&(h=64),a.push([this._keyStr.charAt(f),this._keyStr.charAt(c),this._keyStr.charAt(g),this._keyStr.charAt(h)].join(""));return a.join("")},decode:function(b,a){for(var c=[],d,e,f,g,h, +j=0,b=b.replace(/[^A-Za-z0-9\+\/\=]/g,"");j>4,e=(e&15)<<4|g>>2,f=(g&3)<<6|h,c.push(String.fromCharCode(d)),64!=g&&c.push(String.fromCharCode(e)),64!=h&&c.push(String.fromCharCode(f));c=c.join("");a&&(c=JXG.Util.Base64._utf8_decode(c));return c},_utf8_encode:function(b){for(var b=b.replace(/\r\n/g,"\n"),a="",c=0;cd?a+=String.fromCharCode(d):(127d?a+=String.fromCharCode(d>>6|192):(a+=String.fromCharCode(d>>12|224),a+=String.fromCharCode(d>>6&63|128)),a+=String.fromCharCode(d&63|128))}return a},_utf8_decode:function(b){for(var a=[],c=0,d=0,e=0,f=0;cd?(a.push(String.fromCharCode(d)),c++):191d?(e=b.charCodeAt(c+1),a.push(String.fromCharCode((d&31)<<6|e&63)),c+=2):(e=b.charCodeAt(c+1),f=b.charCodeAt(c+2),a.push(String.fromCharCode((d&15)<<12| +(e&63)<<6|f&63)),c+=3);return a.join("")},_destrip:function(b,a){var c=[],d,e,f=[];null==a&&(a=76);b.replace(/ /g,"");d=b.length/a;for(e=0;ed?(a.push(String.fromCharCode(d)),c++):191d?(e=b.charCodeAt(c+1),a.push(String.fromCharCode((d&31)<<6|e&63)),c+=2):(e=b.charCodeAt(c+1),f=b.charCodeAt(c+2),a.push(String.fromCharCode((d&15)<<12|(e&63)<<6|f&63)),c+=3);return a.join("")}; +JXG.Util.genUUID=function(){for(var b="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),a=Array(36),c=0,d,e=0;36>e;e++)8==e||13==e||18==e||23==e?a[e]="-":14==e?a[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,a[e]=b[19==e?d&3|8:d]);return a.join("")}; +function openpgp_config(){this.config=null;this.default_config={prefer_hash_algorithm:8,encryption_cipher:9,compression:1,show_version:!0,show_comment:!0,integrity_protect:!0,composition_behavior:0,keyserver:"keyserver.linux.it"};this.versionstring="OpenPGP.js v.1.20130825";this.commentstring="http://openpgpjs.org";this.debug=!1;this.read=function(){var b=JSON.parse(window.localStorage.getItem("config"));null==b?(this.config=this.default_config,this.write()):this.config=b};this.write=function(){window.localStorage.setItem("config", +JSON.stringify(this.config))}}var b64s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function s2r(b){var a,c,d,e="",f=0,g=0,h=b.length;for(d=0;d>2&63),a=(c&3)<<4):1==g?(e+=b64s.charAt(a|c>>4&15),a=(c&15)<<2):2==g&&(e+=b64s.charAt(a|c>>6&3),f+=1,0==f%60&&(e+="\n"),e+=b64s.charAt(c&63)),f+=1,0==f%60&&(e+="\n"),g+=1,3==g&&(g=0);0>6-e&255)),e=e+2&7,f=a<>16)+String.fromCharCode(b>>8&255)+String.fromCharCode(b&255);return openpgp_encoding_base64_encode(b)}function verifyCheckSum(b,a){var c=getCheckSum(b);return c[0]==a[0]&&c[1]==a[1]&&c[2]==a[2]} +var crc_table=[0,8801531,25875725,17603062,60024545,51751450,35206124,44007191,128024889,120049090,103502900,112007375,70412248,78916387,95990485,88014382,264588937,256049778,240098180,248108927,207005800,215016595,232553829,224014750,140824496,149062475,166599357,157832774,200747345,191980970,176028764,184266919,520933865,529177874,512099556,503334943,480196360,471432179,487973381,496217854,414011600,405478443,422020573,430033190,457094705,465107658,448029500,439496647,281648992,273666971,289622637, +298124950,324696449,333198714,315665548,307683447,392699481,401494690,383961940,375687087,352057528,343782467,359738805,368533838,1041867730,1050668841,1066628831,1058355748,1032471859,1024199112,1006669886,1015471301,968368875,960392720,942864358,951368477,975946762,984451313,1000411399,992435708,836562267,828023200,810956886,818967725,844041146,852051777,868605623,860066380,914189410,922427545,938981743,930215316,904825475,896059E3,878993294,887231349,555053627,563297984,547333942,538569677,579245274, +570480673,588005847,596249900,649392898,640860153,658384399,666397428,623318499,631331096,615366894,606833685,785398962,777416777,794487231,802989380,759421523,767923880,751374174,743392165,695319947,704115056,687564934,679289981,719477610,711202705,728272487,737067676,2083735460,2092239711,2109313705,2101337682,2141233477,2133257662,2116711496,2125215923,2073216669,2064943718,2048398224,2057199467,2013339772,2022141063,2039215473,2030942602,1945504045,1936737750,1920785440,1929023707,1885728716, +1893966647,1911503553,1902736954,1951893524,1959904495,1977441561,1968902626,2009362165,2000822798,1984871416,1992881923,1665111629,1673124534,1656046400,1647513531,1621913772,1613380695,1629922721,1637935450,1688082292,1679317903,1695859321,1704103554,1728967061,1737211246,1720132760,1711368291,1828378820,1820103743,1836060105,1844855090,1869168165,1877963486,1860430632,1852155859,1801148925,1809650950,1792118E3,1784135691,1757986588,1750004711,1765960209,1774462698,1110107254,1118611597,1134571899, +1126595968,1102643863,1094667884,1077139354,1085643617,1166763343,1158490548,1140961346,1149762745,1176011694,1184812885,1200772771,1192499800,1307552511,1298785796,1281720306,1289958153,1316768798,1325007077,1341561107,1332794856,1246636998,1254647613,1271201483,1262662192,1239272743,1230733788,1213667370,1221678289,1562785183,1570797924,1554833554,1546300521,1588974462,1580441477,1597965939,1605978760,1518843046,1510078557,1527603627,1535847760,1494504007,1502748348,1486784330,1478020017,1390639894, +1382365165,1399434779,1408230112,1366334967,1375129868,1358579962,1350304769,1430452783,1438955220,1422405410,1414423513,1456544974,1448562741,1465633219,1474135352]; +function createcrc24(b){for(var a=11994318,c=0;16>16^b.charCodeAt(c))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+1))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+2))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+3))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+4))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+5))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+6))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+7))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+8))&255],a=a<<8^crc_table[(a>> +16^b.charCodeAt(c+9))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+10))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+11))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+12))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+13))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+14))&255],a=a<<8^crc_table[(a>>16^b.charCodeAt(c+15))&255],c+=16;for(var d=c;d>16^b.charCodeAt(c++))&255];return a&16777215}function openpgp_encoding_base64_encode(b){return s2r(b)} +function openpgp_encoding_base64_decode(b){return r2s(b)}function openpgp_encoding_html_encode(b){return null==b?"":$("
    ").text(b).html()}function openpgp_encoding_eme_pkcs1_encode(b,a){if(b.length>a-11)return-1;var c;c=""+String.fromCharCode(0);c+=String.fromCharCode(2);for(var d=0;db.length||0!=b.charCodeAt(0)||2!=b.charCodeAt(1))return-1;for(var c=2;0!=b.charCodeAt(c)&&b.length>c;)c++;return b.substring(c+1,b.length)}hash_headers=[,[48,32,48,12,6,8,42,134,72,134,247,13,2,5,5,0,4,16],[48,33,48,9,6,5,43,14,3,2,26,5,0,4,20],[48,33,48,9,6,5,43,36,3,2,1,5,0,4,20]];hash_headers[8]=[48,49,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,4,32]; +hash_headers[9]=[48,65,48,13,6,9,96,134,72,1,101,3,4,2,2,5,0,4,48];hash_headers[10]=[48,81,48,13,6,9,96,134,72,1,101,3,4,2,3,5,0,4,64];hash_headers[11]=[48,49,48,13,6,9,96,134,72,1,101,3,4,2,4,5,0,4,28]; +function openpgp_encoding_emsa_pkcs1_encode(b,a,c){var d;d=""+String.fromCharCode(0);d+=String.fromCharCode(1);for(var e=0;ej.signatureType||3==j.tagType||4==j.tagType||8==j.tagType||9==j.tagType||10==j.tagType||11==j.tagType||18==j.tagType||19==j.tagType)if(e[e.length]=new openpgp_msg_message,e[f].messagePacket=j,e[f].type=a.type,9==j.tagType||1==j.tagType||3==j.tagType||18==j.tagType)if(9==j.tagType){util.print_error("unexpected openpgp packet"); +break}else if(1==j.tagType){util.print_debug("session key found:\n "+j.toString());var k=!0;e[f].sessionKeys=[];for(var l=0;k;)e[f].sessionKeys[l]=j,g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength,j=openpgp_packet.read_packet(b,g,h),1!=j.tagType&&3!=j.tagType&&(k=!1),l++;18==j.tagType||9==j.tagType?(util.print_debug("encrypted data found:\n "+j.toString()),e[f].encryptedData=j,g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength,f++):util.print_debug("something is wrong: "+ +j.tagType)}else{if(18==j.tagType){util.print_debug("symmetric encrypted data");break}}else 2==j.tagType&&3>j.signatureType?(g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength,e[f].text=d,e[f].signature=j,f++):4==j.tagType?(g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength):8==j.tagType?(g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength,j=j.decompress(),e=e.concat(openpgp.read_messages_dearmored({text:j,openpgp:j}))):10==j.tagType?(e.length=0,g+=j.packetLength+ +j.headerLength,h-=j.packetLength+j.headerLength):11==j.tagType?(g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength,d=j.data,e[f].data=j.data,f++):19==j.tagType&&(g+=j.packetLength+j.headerLength,h-=j.packetLength+j.headerLength);else return util.print_error("no message found!"),null}return e}this.tostring="";this.generate_key_pair=function(a,b,d,e){var f=(new openpgp_packet_userid).write_packet(d),b=openpgp_crypto_generateKeyPair(a,b,e,openpgp.config.config.prefer_hash_algorithm,3), +a=b.privateKey,g=(new openpgp_packet_keymaterial).read_priv_key(a.string,3,a.string.length);g.decryptSecretMPIs(e)||util.print_error("Issue creating key. Unable to read resulting private key");e=new openpgp_msg_privatekey;e.privateKeyPacket=g;e.getPreferredSignatureHashAlgorithm=function(){return openpgp.config.config.prefer_hash_algorithm};g=e.privateKeyPacket.publicKey.data;d=util.encode_utf8(d);g=String.fromCharCode(153)+String.fromCharCode(g.length>>8&255)+String.fromCharCode(g.length&255)+g+ +String.fromCharCode(180)+String.fromCharCode(d.length>>24)+String.fromCharCode(d.length>>16&255)+String.fromCharCode(d.length>>8&255)+String.fromCharCode(d.length&255)+d;d=new openpgp_packet_signature;d=d.write_message_signature(16,g,e);b=openpgp_encoding_armor(4,b.publicKey.string+f+d.openpgp);f=openpgp_encoding_armor(5,a.string+f+d.openpgp);return{privateKey:e,privateKeyArmored:f,publicKeyArmored:b}};this.write_signed_message=function(a,b){var d=(new openpgp_packet_signature).write_message_signature(1, +b.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"),a),d={text:b.replace(/\r\n/g,"\n").replace(/\n/,"\r\n"),openpgp:d.openpgp,hash:d.hash};return openpgp_encoding_armor(2,d,null,null)};this.write_signed_and_encrypted_message=function(a,b,d){var e="",f=(new openpgp_packet_literaldata).write_packet(d.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"));util.print_debug_hexstr_dump("literal_packet: |"+f+"|\n",f);for(var g=0;g")[0]: +b.trim(),d=d.toLowerCase();if(!util.emailRegEx.test(d))return a;for(b=0;b")[0]:b.trim(),d=d.toLowerCase();if(!util.emailRegEx.test(d))return a;for(b=0;b +b;){var e=openpgp_packet.read_packet(a,b,a.length-b);if(null==e){util.print_error("openpgp.msg.messge decrypt:\n[pub/priv_key]parsing ends here @:"+b+" l:"+d);break}else switch(e.tagType){case 2:if(32==e.signatureType)this.revocationSignatures[this.revocationSignatures.length]=e;else if(15e.signatureType){if(null==this.certificationsignatures)this.certificationSignatures=[];this.certificationSignatures[this.certificationSignatures.length]=e}else util.print_error("openpgp.msg.messge decrypt:\nunknown signature type directly on key "+ +e.signatureType+" @"+b);b+=e.packetLength+e.headerLength;break;case 7:this.subKeys[this.subKeys.length]=e;b+=e.packetLength+e.headerLength;b+=e.read_nodes(this.privateKeyPacket,a,b,a.length-b);break;case 17:this.userAttributes[this.userAttributes.length]=e;b+=e.packetLength+e.headerLength;b+=e.read_nodes(this.privateKeyPacket,a,b,a.length-b);break;case 13:this.userIds[this.userIds.length]=e;b+=e.packetLength+e.headerLength;b+=e.read_nodes(this.privateKeyPacket,a,b,a.length-b);break;default:return this.position= +c-this.privateKeyPacket.packetLength-this.privateKeyPacket.headerLength,this.len=b-c}}this.position=c-this.privateKeyPacket.packetLength-this.privateKeyPacket.headerLength;return this.len=b-c};this.decryptSecretMPIs=function(b){return this.privateKeyPacket.decryptSecretMPIs(b)};this.getSubKeyIds=function(){if(4==this.privateKeyPacket.publicKey.version)var b=[];for(var a=0;ac)return util.print_error("openpgp.packet.encryptedsessionkey.js\ninvalid length"),null;this.version=b[d++].charCodeAt();this.keyId=new openpgp_type_keyid;this.keyId.read_packet(b,d);d+=8;this.publicKeyAlgorithmUsed=b[d++].charCodeAt();switch(this.publicKeyAlgorithmUsed){case 1:case 2:this.MPIs=[];this.MPIs[0]=new openpgp_type_mpi;this.MPIs[0].read(b,d,d-a);break; +case 16:this.MPIs=[];this.MPIs[0]=new openpgp_type_mpi;this.MPIs[0].read(b,d,d-a);d+=this.MPIs[0].packetLength;this.MPIs[1]=new openpgp_type_mpi;this.MPIs[1].read(b,d,d-a);break;default:util.print_error("openpgp.packet.encryptedsessionkey.js\nunknown public key packet algorithm type "+this.publicKeyAlgorithmType)}return this};this.read_symmetric_key_packet=function(b,a,c){this.tagType=3;var d=a;this.version=b[d++];this.symmetricKeyAlgorithmUsed=b[d++];this.s2k=new openpgp_type_s2k;this.s2k.read(b, +d);if(s2k.s2kLength+d>8&255),d=d+String.fromCharCode(e&255),f=f+b+String.fromCharCode(c),b=new openpgp_type_mpi,a=openpgp_crypto_asymetricEncrypt(c,a,b.create(openpgp_encoding_eme_pkcs1_encode(d,a[0].mpiByteLength))),c=0;ca?result+=String.fromCharCode(a):191a?(result+=String.fromCharCode((a-192>>8)+192),result+=String.fromCharCode(a-192&255)):(result+=String.fromCharCode(255),result+=String.fromCharCode(a>>24&255),result+=String.fromCharCode(a>>16&255),result+=String.fromCharCode(a>>8&255),result+=String.fromCharCode(a&255));return result}this.encode_length=b;this.write_old_packet_header=function(a,b){var d="";256>b?(d+=String.fromCharCode(128|a<<2),d+= +String.fromCharCode(b)):(65536>b?(d+=String.fromCharCode(a<<2|129),d+=String.fromCharCode(b>>8)):(d+=String.fromCharCode(a<<2|130),d+=String.fromCharCode(b>>24&255),d+=String.fromCharCode(b>>16&255),d+=String.fromCharCode(b>>8&255)),d+=String.fromCharCode(b&255));return d};this.write_packet_header=function(a,c){var d;d=""+String.fromCharCode(192|a);return d+=b(c)};this.read_packet=function(a,b,d){if(null==a||a.length<=b||2>a.substring(b).length||0==(a[b].charCodeAt()&128))return util.print_error("Error during parsing. This message / key is probably not containing a valid OpenPGP format."), +null;var e=b,f=-1,g=-1,g=0;0!=(a[e].charCodeAt()&64)&&(g=1);var h;g?f=a[e].charCodeAt()&63:(f=(a[e].charCodeAt()&63)>>2,h=a[e].charCodeAt()&3);e++;var j=null,k=-1;if(g)if(192>a[e].charCodeAt())packet_length=a[e++].charCodeAt(),util.print_debug("1 byte length:"+packet_length);else if(192<=a[e].charCodeAt()&&224>a[e].charCodeAt())packet_length=(a[e++].charCodeAt()-192<<8)+a[e++].charCodeAt()+192,util.print_debug("2 byte length:"+packet_length);else if(223a[e].charCodeAt()){packet_length= +1<<(a[e++].charCodeAt()&31);util.print_debug("4 byte length:"+packet_length);k=e+packet_length;for(j=a.substring(e,e+packet_length);;)if(192>a[k].charCodeAt()){d=a[k++].charCodeAt();packet_length+=d;j+=a.substring(k,k+d);k+=d;break}else if(192<=a[k].charCodeAt()&&224>a[k].charCodeAt()){d=(a[k++].charCodeAt()-192<<8)+a[k++].charCodeAt()+192;packet_length+=d;j+=a.substring(k,k+d);k+=d;break}else if(223a[k].charCodeAt())d=1<<(a[k++].charCodeAt()&31),packet_length+=d,j+=a.substring(k, +k+d),k+=d;else{k++;d=a[k++].charCodeAt()<<24|a[k++].charCodeAt()<<16|a[k++].charCodeAt()<<8|a[k++].charCodeAt();j+=a.substring(k,k+d);packet_length+=d;k+=d;break}}else e++,packet_length=a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<<8|a[e++].charCodeAt();else switch(h){case 0:packet_length=a[e++].charCodeAt();break;case 1:packet_length=a[e++].charCodeAt()<<8|a[e++].charCodeAt();break;case 2:packet_length=a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<<8| +a[e++].charCodeAt();break;default:packet_length=d}-1==k&&(k=packet_length);null==j&&(j=a.substring(e,e+k));switch(f){case 0:break;case 1:f=new openpgp_packet_encryptedsessionkey;if(null!=f.read_pub_key_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 2:f=new openpgp_packet_signature;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 3:f=new openpgp_packet_encryptedsessionkey;if(null!=f.read_symmetric_key_packet(j,0,packet_length))return f.headerLength= +e-b,f.packetLength=k,f;break;case 4:f=new openpgp_packet_onepasssignature;if(f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 5:f=new openpgp_packet_keymaterial;f.header=a.substring(b,e);if(null!=f.read_tag5(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 6:f=new openpgp_packet_keymaterial;f.header=a.substring(b,e);if(null!=f.read_tag6(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 7:f=new openpgp_packet_keymaterial; +if(null!=f.read_tag7(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 8:f=new openpgp_packet_compressed;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 9:f=new openpgp_packet_encrypteddata;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 10:f=new openpgp_packet_marker;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 11:f=new openpgp_packet_literaldata; +if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.header=a.substring(b,e),f.packetLength=k,f;break;case 12:break;case 13:f=new openpgp_packet_userid;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 14:f=new openpgp_packet_keymaterial;f.header=a.substring(b,e);if(null!=f.read_tag14(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 17:f=new openpgp_packet_userattribute;if(null!=f.read_packet(j,0,packet_length))return f.headerLength= +e-b,f.packetLength=k,f;break;case 18:f=new openpgp_packet_encryptedintegrityprotecteddata;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;case 19:f=new openpgp_packet_modificationdetectioncode;if(null!=f.read_packet(j,0,packet_length))return f.headerLength=e-b,f.packetLength=k,f;break;default:return util.print_error("openpgp.packet.js\n[ERROR] openpgp_packet: failed to parse packet @:"+e+"\nchar:'"+util.hexstrdump(a.substring(e))+"'\ninput:"+util.hexstrdump(a)), +null}}}var openpgp_packet=new _openpgp_packet; +function openpgp_packet_keymaterial(){this.subKeyRevocationSignature=this.subKeySignature=this.parentNode=this.checksum=this.hasUnencryptedSecretKeyData=this.encryptedMPIData=this.IVLength=this.s2kUsageConventions=this.symmetricEncryptionAlgorithm=this.publicKey=this.secMPIs=this.MPIs=this.expiration=this.version=this.creationTime=this.tagType=this.publicKeyAlgorithm=null;this.read_tag5=function(b,a,c){this.tagType=5;this.read_priv_key(b,a,c);return this};this.read_tag6=function(b,a,c){this.tagType= +6;this.packetLength=c;this.read_pub_key(b,a,c);return this};this.read_tag7=function(b,a,c){this.tagType=7;this.packetLength=c;return this.read_priv_key(b,a,c)};this.read_tag14=function(b,a,c){this.subKeySignature=null;this.subKeyRevocationSignature=[];this.tagType=14;this.packetLength=c;this.read_pub_key(b,a,c);return this};this.toString=function(){var b="";switch(this.tagType){case 6:b+="5.5.1.1. Public-Key Packet (Tag 6)\n length: "+this.packetLength+"\n version: "+ +this.version+"\n creation time: "+this.creationTime+"\n expiration time: "+this.expiration+"\n publicKeyAlgorithm: "+this.publicKeyAlgorithm+"\n";break;case 14:b+="5.5.1.2. Public-Subkey Packet (Tag 14)\n length: "+this.packetLength+"\n version: "+this.version+"\n creation time: "+this.creationTime+"\n expiration time: "+this.expiration+"\n publicKeyAlgorithm: "+this.publicKeyAlgorithm+"\n";break;case 5:b+="5.5.1.3. Secret-Key Packet (Tag 5)\n length: "+ +this.packetLength+"\n version: "+this.publicKey.version+"\n creation time: "+this.publicKey.creationTime+"\n expiration time: "+this.publicKey.expiration+"\n publicKeyAlgorithm: "+this.publicKey.publicKeyAlgorithm+"\n";break;case 7:b+="5.5.1.4. Secret-Subkey Packet (Tag 7)\n length: "+this.packetLength+"\n version[1]: "+(4==this.version)+"\n creationtime[4]: "+this.creationTime+"\n expiration[2]: "+this.expiration+"\n publicKeyAlgorithm: "+ +this.publicKeyAlgorithm+"\n";break;default:b+="unknown key material packet\n"}if(null!=this.MPIs)for(var b=b+"Public Key MPIs:\n",a=0;athis.publicKeyAlgorithm?d=2:16==this.publicKeyAlgorithm?d=3:17==this.publicKeyAlgorithm&&(d=4);this.MPIs=[];for(var e=0;ethis.publicKeyAlgorithm?d=2:16==this.publicKeyAlgorithm?d=3:17==this.publicKeyAlgorithm&&(d=4);this.MPIs=[];for(e=0;ethis.publicKey.publicKeyAlgorithm)this.secMPIs=[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(b,d,c-2-(d-a)),d+=this.secMPIs[0].packetLength,this.secMPIs[1]=new openpgp_type_mpi,this.secMPIs[1].read(b,d,c-2-(d-a)),d+=this.secMPIs[1].packetLength,this.secMPIs[2]=new openpgp_type_mpi,this.secMPIs[2].read(b,d,c-2-(d-a)),d+=this.secMPIs[2].packetLength,this.secMPIs[3]=new openpgp_type_mpi,this.secMPIs[3].read(b,d,c-2-(d-a)),d+=this.secMPIs[3].packetLength;else if(16==this.publicKey.publicKeyAlgorithm)this.secMPIs= +[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(b,d,c-2-(d-a)),d+=this.secMPIs[0].packetLength;else if(17==this.publicKey.publicKeyAlgorithm)this.secMPIs=[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(b,d,c-2-(d-a)),d+=this.secMPIs[0].packetLength;this.checksum=[];this.checksum[0]=b[d++].charCodeAt();this.checksum[1]=b[d++].charCodeAt()}else this.encryptedMPIData=b.substring(d,c);return this};this.decryptSecretMPIs=function(b){if(this.hasUnencryptedSecretKeyData)return this.secMPIs; +var a=this.s2k.produce_key(b),c="";switch(this.symmetricEncryptionAlgorithm){case 1:return util.print_error("openpgp.packet.keymaterial.js\nsymmetric encryption algorithim: IDEA is not implemented"),!1;case 2:c=normal_cfb_decrypt(function(a,b){return des(b,a,1,null,0)},this.IVLength,a,this.encryptedMPIData,this.IV);break;case 3:c=normal_cfb_decrypt(function(a,b){var c=new openpgp_symenc_cast5;c.setKey(b);return c.encrypt(util.str2bin(a))},this.IVLength,util.str2bin(a.substring(0,16)),this.encryptedMPIData, +this.IV);break;case 4:c=normal_cfb_decrypt(function(a,b){return(new Blowfish(b)).encrypt(a)},this.IVLength,a,this.encryptedMPIData,this.IV);break;case 7:case 8:case 9:c=16;8==this.symmetricEncryptionAlgorithm&&(c=24,a=this.s2k.produce_key(b,c));9==this.symmetricEncryptionAlgorithm&&(c=32,a=this.s2k.produce_key(b,c));c=normal_cfb_decrypt(function(a,b){return AESencrypt(util.str2bin(a),b)},this.IVLength,keyExpansion(a.substring(0,c)),this.encryptedMPIData,this.IV);break;case 10:return util.print_error("openpgp.packet.keymaterial.js\nKey material is encrypted with twofish: not implemented"), +!1;default:return util.print_error("openpgp.packet.keymaterial.js\nunknown encryption algorithm for secret key :"+this.symmetricEncryptionAlgorithm),!1}if(null==c)return util.print_error("openpgp.packet.keymaterial.js\ncleartextMPIs was null"),!1;b=c.length;if(254==this.s2kUsageConventions&&str_sha1(c.substring(0,c.length-20))==c.substring(c.length-20))b-=20;else if(254!=this.s2kUsageConventions&&util.calc_checksum(c.substring(0,c.length-2))==(c.charCodeAt(c.length-2)<<8|c.charCodeAt(c.length-1)))b-= +2;else return!1;if(0this.publicKey.publicKeyAlgorithm)a=0,this.secMPIs=[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(c,0,b),a+=this.secMPIs[0].packetLength,this.secMPIs[1]=new openpgp_type_mpi,this.secMPIs[1].read(c,a,b-a),a+=this.secMPIs[1].packetLength,this.secMPIs[2]=new openpgp_type_mpi,this.secMPIs[2].read(c,a,b-a),a+=this.secMPIs[2].packetLength,this.secMPIs[3]=new openpgp_type_mpi,this.secMPIs[3].read(c,a,b-a),a+=this.secMPIs[3].packetLength; +else if(16==this.publicKey.publicKeyAlgorithm)this.secMPIs=[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(c,0,c);else if(17==this.publicKey.publicKeyAlgorithm)this.secMPIs=[],this.secMPIs[0]=new openpgp_type_mpi,this.secMPIs[0].read(c,0,b);return!0};this.read_nodes=function(b,a,c,d){this.parentNode=b;if(14==this.tagType){for(var b=c,e=null;a.length!=b;)if(d=a.length-b,e=openpgp_packet.read_packet(a,b,d),null==e){util.print_error("openpgp.packet.keymaterial.js\n[user_keymat_pub]parsing ends here @:"+ +b+" l:"+d);break}else switch(e.tagType){case 2:if(24==e.signatureType){this.subKeySignature=e;b+=e.packetLength+e.headerLength;break}else if(40==e.signatureType){this.subKeyRevocationSignature[this.subKeyRevocationSignature.length]=e;b+=e.packetLength+e.headerLength;break}else util.print_error("openpgp.packet.keymaterial.js\nunknown signature:"+e.toString());default:return this.data=a,this.position=c-this.parentNode.packetLength,this.len=b-c}this.data=a;this.position=c-this.parentNode.packetLength; +return this.len=b-c}if(7==this.tagType){for(b=c;a.length!=b;)if(e=openpgp_packet.read_packet(a,b,d-(b-c)),null==e){util.print_error("openpgp.packet.keymaterial.js\n[user_keymat_priv] parsing ends here @:"+b);break}else switch(e.tagType){case 2:24==e.signatureType?this.subKeySignature=e:40==e.signatureType&&(this.subKeyRevocationSignature[this.subKeyRevocationSignature.length]=e);b+=e.packetLength+e.headerLength;break;default:return this.data=a,this.position=c-this.parentNode.packetLength,this.len= +b-c}this.data=a;this.position=c-this.parentNode.packetLength;return this.len=b-c}util.print_error("openpgp.packet.keymaterial.js\nunknown parent node for a key material packet "+b.tagType)};this.verifyKey=function(){if(14==this.tagType){if(null==this.subKeySignature)return 0;if(4==this.subKeySignature.version&&null!=this.subKeySignature.keyNeverExpires&&!this.subKeySignature.keyNeverExpires&&new Date(1E3*this.subKeySignature.keyExpirationTime+this.creationTime.getTime())this.publicKeyAlgorithm){var b=this.MPIs[0].MPI.substring(this.MPIs[0].mpiByteLength- +8);util.print_debug("openpgp.msg.publickey read_nodes:\nV3 key ID: "+b);return b}};this.getFingerprint=function(){if(4==this.version)return tohash=String.fromCharCode(153)+String.fromCharCode(this.packetdata.length>>8&255)+String.fromCharCode(this.packetdata.length&255)+this.packetdata,util.print_debug("openpgp.msg.publickey creating subkey fingerprint by hashing:"+util.hexstrdump(tohash)+"\npublickeyalgorithm: "+this.publicKeyAlgorithm),str_sha1(tohash,tohash.length);if(3==this.version&&0this.publicKeyAlgorithm)return MD5(this.MPIs[0].MPI)};this.write_private_key=function(b,a,c,d,e,f){this.symmetricEncryptionAlgorithm=e;e=String.fromCharCode(4);e+=f;switch(b){case 1:e+=String.fromCharCode(b);e+=a.n.toMPI();e+=a.ee.toMPI();if(c)switch(e+=String.fromCharCode(254),e+=String.fromCharCode(this.symmetricEncryptionAlgorithm),e+=String.fromCharCode(3),e+=String.fromCharCode(d),b=a.d.toMPI()+a.p.toMPI()+a.q.toMPI()+a.u.toMPI(),a=str_sha1(b),util.print_debug_hexstr_dump("write_private_key sha1: ", +a),f=openpgp_crypto_getRandomBytes(8),util.print_debug_hexstr_dump("write_private_key Salt: ",f),e=e+f+String.fromCharCode(96),util.print_debug("write_private_key c: 96"),c=(new openpgp_type_s2k).write(3,d,c,f,96),this.symmetricEncryptionAlgorithm){case 3:this.IVLength=8;this.IV=openpgp_crypto_getRandomBytes(this.IVLength);ciphertextMPIs=normal_cfb_encrypt(function(a,b){var c=new openpgp_symenc_cast5;c.setKey(b);return c.encrypt(util.str2bin(a))},this.IVLength,util.str2bin(c.substring(0,16)),b+a, +this.IV);e+=this.IV+ciphertextMPIs;break;case 7:case 8:case 9:this.IVLength=16,this.IV=openpgp_crypto_getRandomBytes(this.IVLength),ciphertextMPIs=normal_cfb_encrypt(AESencrypt,this.IVLength,c,b+a,this.IV),e+=this.IV+ciphertextMPIs}else e+=String.fromCharCode(0),e+=a.d.toMPI()+a.p.toMPI()+a.q.toMPI()+a.u.toMPI(),c=util.calc_checksum(a.d.toMPI()+a.p.toMPI()+a.q.toMPI()+a.u.toMPI()),e+=String.fromCharCode(c/256)+String.fromCharCode(c%256),util.print_debug_hexstr_dump("write_private_key basic checksum: "+ +c);break;default:e="",util.print_error("openpgp.packet.keymaterial.js\nerror writing private key, unknown type :"+b)}c=openpgp_packet.write_packet_header(5,e.length);return{string:c+e,header:c,body:e}};this.write_public_key=function(b,a,c){var d=String.fromCharCode(4),d=d+c;switch(b){case 1:d+=String.fromCharCode(1);d+=a.n.toMPI();d+=a.ee.toMPI();break;default:util.print_error("openpgp.packet.keymaterial.js\nerror writing private key, unknown type :"+b)}b=openpgp_packet.write_packet_header(6,d.length); +return{string:b+d,header:b,body:d}}} +function openpgp_packet_literaldata(){this.tagType=11;this.set_data=function(b,a){this.format=a;this.data=b};this.set_data_bytes=function(b,a){this.format=a;a==openpgp_packet_literaldata.formats.utf8&&(b=util.decode_utf8(b));this.data=b};this.get_data_bytes=function(){return this.format==openpgp_packet_literaldata.formats.utf8?util.encode_utf8(this.data):this.data};this.read_packet=function(b,a,c){this.packetLength=c;c=b[a];this.filename=util.decode_utf8(b.substr(a+2,b.charCodeAt(a+1)));this.date= +new Date(1E3*parseInt(b.substr(a+2+b.charCodeAt(a+1),4)));this.set_data_bytes(b.substring(a+6+b.charCodeAt(a+1)),c);return this};this.write_packet=function(b){this.set_data(b,openpgp_packet_literaldata.formats.utf8);this.filename=util.encode_utf8("msg.txt");this.date=new Date;var b=this.get_data_bytes(),a=openpgp_packet.write_packet_header(11,b.length+6+this.filename.length),a=a+this.format,a=a+String.fromCharCode(this.filename.length),a=a+this.filename,a=a+String.fromCharCode(Math.round(this.date.getTime()/ +1E3)>>24&255),a=a+String.fromCharCode(Math.round(this.date.getTime()/1E3)>>16&255),a=a+String.fromCharCode(Math.round(this.date.getTime()/1E3)>>8&255),a=a+String.fromCharCode(Math.round(this.date.getTime()/1E3)&255);return a+b};this.toString=function(){return"5.9. Literal Data Packet (Tag 11)\n length: "+this.packetLength+"\n format: "+this.format+"\n filename:"+this.filename+"\n date: "+this.date+"\n data: |"+this.data+"|\n rdata: |"+this.real_data+"|\n"}} +openpgp_packet_literaldata.formats={binary:"b",text:"t",utf8:"u"};function openpgp_packet_marker(){this.tagType=10;this.read_packet=function(b,a){this.packetLength=3;return 80==b[a].charCodeAt()&&71==b[a+1].charCodeAt()&&80==b[a+2].charCodeAt()?this:null};this.toString=function(){return'5.8. Marker Packet (Obsolete Literal Packet) (Tag 10)\n packet reads: "PGP"\n'}} +function openpgp_packet_modificationdetectioncode(){this.tagType=19;this.hash=null;this.read_packet=function(b,a,c){this.packetLength=c;if(20!=c)return util.print_error("openpgp.packet.modificationdetectioncode.js\ninvalid length for a modification detection code packet!"+c),null;this.hash=b.substring(a,a+20);return this};this.toString=function(){return"5.14 Modification detection code packet\n bytes ("+this.hash.length+"): ["+util.hexstrdump(this.hash)+"]"}} +function openpgp_packet_onepasssignature(){this.tagType=4;this.flags=this.signingKeyId=this.publicKeyAlgorithm=this.hashAlgorithm=this.type=this.version=null;this.read_packet=function(b,a,c){this.packetLength=c;this.version=b.charCodeAt(a++);this.type=b.charCodeAt(a++);this.hashAlgorithm=b.charCodeAt(a++);this.publicKeyAlgorithm=b.charCodeAt(a++);this.signingKeyId=new openpgp_type_keyid;this.signingKeyId.read_packet(b,a);a+=8;this.flags=b.charCodeAt(a++);return this};this.toString=function(){return"5.4. One-Pass Signature Packets (Tag 4)\n length: "+ +this.packetLength+"\n type: "+this.type+"\n keyID: "+this.signingKeyId.toString()+"\n hashA: "+this.hashAlgorithm+"\n pubKeyA:"+this.publicKeyAlgorithm+"\n flags: "+this.flags+"\n version:"+this.version+"\n"};this.write_packet=function(b,a,c,d,e){d=""+openpgp_packet.write_packet_header(4,13);d+=String.fromCharCode(3);d+=String.fromCharCode(b);d+=String.fromCharCode(a);d+=String.fromCharCode(c.privateKeyPacket.publicKey.publicKeyAlgorithm);d+=c.getKeyId();return d=e?d+String.fromCharCode(0): +d+String.fromCharCode(1)}} +function openpgp_packet_signature(){function b(a,b){var d;d=""+openpgp_packet.encode_length(b.length+1);d+=String.fromCharCode(a);return d+b}this.tagType=2;this.embeddedSignature=this.signatureTargetHash=this.signatureTargetHashAlgorithm=this.signatureTargetPublicKeyAlgorithm=this.reasonForRevocationString=this.reasonForRevocationFlag=this.signersUserId=this.keyFlags=this.policyURI=this.isPrimaryUserID=this.preferredKeyServer=this.keyServerPreferences=this.preferredCompressionAlgorithms=this.preferredHashAlgorithms= +this.notationValue=this.notationName=this.notationFlags=this.issuerKeyId=this.revocationKeyFingerprint=this.revocationKeyAlgorithm=this.revocationKeyClass=this.preferredSymmetricAlgorithms=this.keyNeverExpires=this.keyExpirationTime=this.revocable=this.regular_expression=this.trustAmount=this.trustLevel=this.exportable=this.hashAlgorithm=this.publicKeyAlgorithm=this.MPIs=this.signedHashValue=this.signatureNeverExpires=this.signatureExpirationTime=this.signatureData=this.keyId=this.creationTime=this.signatureType= +null;this.verified=!1;this._raw_read_signature_sub_packet=function(a,b,d){0>d&&util.print_debug("openpgp.packet.signature.js\n_raw_read_signature_sub_packet length < 0 @:"+b);var e=b,f=0;192>a[e].charCodeAt()?f=a[e++].charCodeAt():192<=a[e].charCodeAt()&&224>a[e].charCodeAt()?f=(a[e++].charCodeAt()-192<<8)+a[e++].charCodeAt()+192:223a[e].charCodeAt()?f=1<<(a[e++].charCodeAt()&31):255>a[e].charCodeAt()&&(e++,f=a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<< +8|a[e++].charCodeAt());var g=a[e++].charCodeAt()&127;switch(g){case 2:this.creationTime=new Date(1E3*(a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<<8|a[e++].charCodeAt()));break;case 3:this.signatureExpirationTime=a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<<8|a[e++].charCodeAt();this.signatureNeverExpires=0==this.signature_expiration_time;break;case 4:this.exportable=1==a[e++].charCodeAt();break;case 5:this.trustLevel=a[e++].charCodeAt();this.trustAmount= +a[e++].charCodeAt();break;case 6:this.regular_expression=new String;for(g=0;gg;g++)this.revocationKeyFingerprint=a[e++].charCodeAt();break;case 16:this.issuerKeyId=a.substring(e,e+8);e+=8;break;case 20:this.notationFlags=a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<<8|a[e++].charCodeAt();d=a[e++].charCodeAt()<<8|a[e++].charCodeAt();f=a[e++].charCodeAt()<<8|a[e++].charCodeAt();this.notationName="";for(g=0;g>24&255)+String.fromCharCode(a>>16&255)+String.fromCharCode(a>>8&255)+String.fromCharCode(a&255)),h=b(16,d.getKeyId()),g=g+String.fromCharCode(a.length+h.length>>8&255),g=g+String.fromCharCode(a.length+h.length&255),g=g+a+h,a=""+String.fromCharCode(4),a=a+String.fromCharCode(255),a=a+String.fromCharCode(g.length>>24),a=a+String.fromCharCode(g.length>>16&255),a=a+String.fromCharCode(g.length>>8&255),a=a+String.fromCharCode(g.length&255),h=String.fromCharCode(0), +h=h+String.fromCharCode(0),j=openpgp_crypto_hashData(f,c+g+a);util.print_debug("DSA Signature is calculated with:|"+c+g+a+"|\n"+util.hexstrdump(c+g+a)+"\n hash:"+util.hexstrdump(j));h+=j.charAt(0);h+=j.charAt(1);h+=openpgp_crypto_signData(f,d.privateKeyPacket.publicKey.publicKeyAlgorithm,e.MPIs,d.privateKeyPacket.secMPIs,c+g+a);return{openpgp:openpgp_packet.write_packet_header(2,(g+h).length)+g+h,hash:util.get_hashAlgorithmString(f)}};this.verify=function(a,b){var d;d=""+String.fromCharCode(this.version); +d+=String.fromCharCode(255);d+=String.fromCharCode(this.signatureData.length>>24);d+=String.fromCharCode(this.signatureData.length>>16&255);d+=String.fromCharCode(this.signatureData.length>>8&255);d+=String.fromCharCode(this.signatureData.length&255);switch(this.signatureType){case 0:if(4==this.version)this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm,this.hashAlgorithm,this.MPIs,b.obj.publicKeyPacket.MPIs,a+this.signatureData+d);break;case 1:if(4==this.version){this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm, +this.hashAlgorithm,this.MPIs,b.obj.publicKeyPacket.MPIs,a+this.signatureData+d);break}break;case 2:if(3==this.version){this.verified=!1;break}this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm,this.hashAlgorithm,this.MPIs,b.obj.publicKeyPacket.MPIs,this.signatureData+d);break;case 16:case 17:case 18:case 19:case 48:this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm,this.hashAlgorithm,this.MPIs,b.MPIs,a+this.signatureData+d);break;case 24:if(3==this.version){this.verified= +!1;break}this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm,this.hashAlgorithm,this.MPIs,b.MPIs,a+this.signatureData+d);break;case 25:case 31:case 32:case 40:this.verified=openpgp_crypto_verifySignature(this.publicKeyAlgorithm,this.hashAlgorithm,this.MPIs,b.MPIs,a+this.signatureData+d);break;default:util.print_error("openpgp.packet.signature.js\nsignature verification for type"+this.signatureType+" not implemented")}return this.verified};this.read_packet=function(a,b,d){this.data= +a.substring(b,b+d);if(0>d)return util.print_debug("openpgp.packet.signature.js\nopenpgp_packet_signature read_packet length < 0 @:"+b),null;var e=b;this.packetLength=d;this.version=a[e++].charCodeAt();switch(this.version){case 3:5!=a[e++].charCodeAt()&&util.print_debug("openpgp.packet.signature.js\ninvalid One-octet length of following hashed material. MUST be 5. @:"+(e-1));this.signatureType=a[e++].charCodeAt();this.creationTime=new Date(1E3*(a[e++].charCodeAt()<<24|a[e++].charCodeAt()<<16|a[e++].charCodeAt()<< +8|a[e++].charCodeAt()));this.signatureData=a.substring(b,e);this.keyId=a.substring(e,e+8);e+=8;this.publicKeyAlgorithm=a[e++].charCodeAt();this.hashAlgorithm=a[e++].charCodeAt();this.signedHashValue=a[e++].charCodeAt()<<8|a[e++].charCodeAt();d=0;0this.publicKeyAlgorithm?d=1:17==this.publicKeyAlgorithm&&(d=2);this.MPIs=[];for(var f=0;fthis.publicKeyAlgorithm?d=1:17==this.publicKeyAlgorithm&&(d=2);this.MPIs=[];for(f=0;fb[e].charCodeAt()?(packet_length=b[e++].charCodeAt(),f=1):192<=b[e].charCodeAt()&&224>b[e].charCodeAt()?(packet_length=(b[e++].charCodeAt()-192<<8)+b[e++].charCodeAt()+192,f=2):223b[e].charCodeAt()? +(packet_length=1<<(b[e++].charCodeAt()&31),f=1):(f=5,e++,packet_length=b[e++].charCodeAt()<<24|b[e++].charCodeAt()<<16|b[e++].charCodeAt()<<8|b[e++].charCodeAt());b[e++].charCodeAt();packet_length--;f++;this.userattributes[0]=[];this.userattributes[0]=b.substring(e,e+packet_length);e+=packet_length;d+=f+packet_length}this.packetLength=e-a;return this};this.read_nodes=function(b,a,c,d){this.parentNode=b;for(var e=c,f=d;a.length!=e;){var g=openpgp_packet.read_packet(a,e,f);if(null==g){util.print_error("openpgp.packet.userattribute.js\n[user_attr] parsing ends here @:"+ +e+" l:"+f);break}else switch(g.tagType){case 2:15g.signatureType?this.certificationSignatures[this.certificationSignatures.length]=g:32==g.signatureType&&(this.certificationRevocationSignatures[this.certificationRevocationSignatures.length]=g);e+=g.packetLength+g.headerLength;f=d-(e-c);break;default:return this.data=a,this.position=c-b.packetLength,this.len=e-c}}this.data=a;this.position=c-b.packetLength;return this.len=e-c};this.toString=function(){for(var b="5.12. User Attribute Packet (Tag 17)\n AttributePackets: (count = "+ +this.userattributes.length+")\n",a=0;ag.signatureType){this.certificationSignatures[this.certificationSignatures.length]=g; +break}else if(48==g.signatureType){this.certificationRevocationSignatures[this.certificationRevocationSignatures.length]=g;break}else if(24==g.signatureType){this.certificationSignatures[this.certificationSignatures.length]=g;break}else util.print_debug("unknown sig t: "+g.signatureType+"@"+(e-(g.packetLength+g.headerLength)));default:return this.data=a,this.position=c-b.packetLength,this.len=e-c-(g.headerLength+g.packetLength)}}this.data=a;this.position=c-b.packetLength;return this.len=e-c-(g.headerLength+ +g.packetLength)}if(5==b.tagType){this.parentNode=b;for(e=c;a.length!=e;)if(g=openpgp_packet.read_packet(a,e,f-(e-c)),null==g){util.print_error("parsing ends here @:"+e+" l:"+f);break}else switch(e+=g.packetLength+g.headerLength,g.tagType){case 2:15g.signatureType?this.certificationSignatures[this.certificationSignatures.length]=g:48==g.signatureType&&(this.certificationRevocationSignatures[this.certificationRevocationSignatures.length]=g);default:return this.data=a,this.position= +c-b.packetLength,this.len=e-c-(g.headerLength+g.packetLength)}}else util.print_error("unknown parent node for a userId packet "+b.tagType)};this.toString=function(){for(var b=" 5.11. User ID Packet (Tag 13)\n text ("+this.text.length+'): "'+this.text.replace("<","<")+'"\n',b=b+"certification signatures:\n",a=0;athis.certificationSignatures[c].creationTime){var f= +String.fromCharCode(153)+b.header.substring(1)+b.data+String.fromCharCode(180)+String.fromCharCode(a.length>>24&255)+String.fromCharCode(a.length>>16&255)+String.fromCharCode(a.length>>8&255)+String.fromCharCode(a.length&255)+a;if(e.verify(f,d)){result[c]=this.certificationSignatures[c].issuerKeyId==b.getKeyId()?6:3;continue}}f=String.fromCharCode(153)+b.header.substring(1)+b.data+String.fromCharCode(180)+String.fromCharCode(a.length>>24&255)+String.fromCharCode(a.length>>16&255)+String.fromCharCode(a.length>> +8&255)+String.fromCharCode(a.length&255)+a;result[c]=this.certificationSignatures[c].verify(f,d)?4:0}}else if(3==this.certificationSignatures[c].version)if(null==this.certificationSignatures[c].keyId)result[c]=0;else if(d=openpgp.keyring.getPublicKeysForKeyId(this.certificationSignatures[c].keyId),null==d||0==d.length)result[c]=2;else if(d=publicKey.obj.getSigningKey(),null==d)result[c]=0;else{e=this.hasCertificationRevocationSignature(this.certificationSignatures[c].keyId);if(null!=e&&e.creationTime> +this.certificationSignatures[c].creationTime&&(f=String.fromCharCode(153)+this.publicKeyPacket.header.substring(1)+this.publicKeyPacket.data+a,e.verify(f,d))){result[c]=e.keyId==b.getKeyId()?6:3;continue}f=String.fromCharCode(153)+b.header.substring(1)+b.data+a;result[c]=this.certificationSignatures[c].verify(f,d)?4:0}else result[c]=0;return result};this.verify=function(b){b=this.verifyCertificationSignatures(b);return-1!=b.indexOf(6)?2:-1!=b.indexOf(5)?1:0};this.addCertification=function(){};this.revokeCertification= +function(){}}function openpgp_type_keyid(){this.read_packet=function(b,a){this.bytes=b.substring(a,a+8);return this};this.toString=function(){return util.hexstrdump(this.bytes)}} +function openpgp_type_mpi(){this.data=this.mpiByteLength=this.mpiBitLength=this.MPI=null;this.read=function(b,a){var c=a;this.mpiBitLength=b[c++].charCodeAt()<<8|b[c++].charCodeAt();this.mpiByteLength=(this.mpiBitLength-this.mpiBitLength%8)/8;0!=this.mpiBitLength%8&&this.mpiByteLength++;this.MPI=b.substring(c,c+this.mpiByteLength);this.data=b.substring(a,a+2+this.mpiByteLength);this.packetLength=this.mpiByteLength+2;return this};this.toBigInteger=function(){return new BigInteger(util.hexstrdump(this.MPI), +16)};this.toString=function(){var b=" MPI("+this.mpiBitLength+"b/"+this.mpiByteLength+"B) : 0x",b=b+util.hexstrdump(this.MPI);return b+"\n"};this.create=function(b){this.MPI=b;var a=8*(b.length-1),c;a:for(var d=b.charCodeAt(0),e=0;9>e;e++)if(0==d>>e){c=e;break a}this.mpiBitLength=a+c;this.mpiByteLength=b.length;return this};this.toBin=function(){var b=String.fromCharCode(this.mpiBitLength>>8&255),b=b+String.fromCharCode(this.mpiBitLength&255);return b+=this.MPI};this.getByteLength=function(){return this.mpiByteLength}} +function openpgp_type_s2k(){this.read=function(b,a){var c=a;this.type=b[c++].charCodeAt();switch(this.type){case 0:this.hashAlgorithm=b[c++].charCodeAt();this.s2kLength=1;break;case 1:this.hashAlgorithm=b[c++].charCodeAt();this.saltValue=b.substring(c,c+8);this.s2kLength=9;break;case 3:this.hashAlgorithm=b[c++].charCodeAt();this.saltValue=b.substring(c,c+8);c+=8;this.EXPBIAS=6;c=b[c++].charCodeAt();this.count=16+(c&15)<<(c>>4)+this.EXPBIAS;this.s2kLength=10;break;case 101:"GNU"==b.substring(c+1,c+ +4)?(this.hashAlgorithm=b[c++].charCodeAt(),c+=3,c=1E3+b[c++].charCodeAt(),1001==c?(this.type=c,this.s2kLength=5):util.print_error("unknown s2k gnu protection mode! "+this.type)):util.print_error("unknown s2k type! "+this.type);break;default:util.print_error("unknown s2k type! "+this.type)}return this};this.write=function(b,a,c,d,e){this.type=b;if(3==this.type)this.saltValue=d,this.hashAlgorithm=a,this.count=16+(e&15)<<(e>>4)+6,this.s2kLength=10;return this.produce_key(c)};this.produce_key=function(b, +a){b=util.encode_utf8(b);if(0==this.type)return openpgp_crypto_hashData(this.hashAlgorithm,b);if(1==this.type)return openpgp_crypto_hashData(this.hashAlgorithm,this.saltValue+b);if(3==this.type){var c=[];for(c[0]=this.saltValue+b;c.length*(this.saltValue+b).lengththis.count&&(c=c.substr(0,this.count));return a&&(24==a||32==a)?openpgp_crypto_hashData(this.hashAlgorithm,c)+openpgp_crypto_hashData(this.hashAlgorithm,String.fromCharCode(0)+c): +openpgp_crypto_hashData(this.hashAlgorithm,c)}return null}} +var Util=function(){this.emailRegEx=/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;this.hexdump=function(a){for(var b=[],e=a.length,f=0,g,h=0;fg.length;)g="0"+g;b.push(" "+g);h++;0==h%32&&b.push("\n ")}return b.join("")};this.hexstrdump=function(a){if(null==a)return"";for(var b=[],e=a.length,f=0,g;fg.length;)g= +"0"+g;b.push(""+g)}return b.join("")};this.hex2bin=function(a){for(var b="",e=0;eg.length;)g="0"+g;b.push(""+g)}return b.join("")};this.encode_utf8=function(a){return unescape(encodeURIComponent(a))};this.decode_utf8=function(a){try{return decodeURIComponent(escape(a))}catch(b){return a}};var b=function(a,b){for(var e=0;e

    '+a.replace(/\n/g,"
    ")+"

    "))};this.print_debug_hexstr_dump=function(a,b){openpgp.config.debug&&(a+=this.hexstrdump(b),a=openpgp_encoding_html_encode(a),showMessages('

    '+a.replace(/\n/g,"
    ")+"

    "))};this.print_error= +function(a){a=openpgp_encoding_html_encode(a);showMessages('

    ERROR:\t'+a.replace(/\n/g,"
    ")+"

    ")};this.print_info=function(a){a=openpgp_encoding_html_encode(a);showMessages('

    INFO:\t'+ +a.replace(/\n/g,"
    ")+"

    ")};this.print_warning=function(a){a=openpgp_encoding_html_encode(a);showMessages('

    WARNING:\t'+a.replace(/\n/g,"
    ")+"

    ")};this.getLeftNBits=function(a,b){var e=b%8;return 0==e?a.substring(0,b/8):this.shiftRight(a.substring(0,(b-e)/8+1),8-e)};this.shiftRight=function(a,b){var e= +util.str2bin(a);if(0!=b%8)for(var f=e.length-1;0<=f;f--)e[f]>>=b%8,0 + + @@ -53,40 +55,3 @@ if (window.location.protocol != "https:") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -