fast-rsa-engine 0.1.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 34ef8fe8898dc14764728ee5dd7fa4d53de8ad95
4
+ data.tar.gz: 6dc8fedd5cbe6811bc3ada4d4e41998d9c2f319b
5
+ SHA512:
6
+ metadata.gz: 05d9be8088242e5514597463c0626e20ac2d6403f8467ca735b0a1df6115002a82670bfb0fe9ea2d24be97d01cb4716501e8b9f68130bfcea22f4bead783632a
7
+ data.tar.gz: a9953017c70958609774b7e4c6469f6fedde6a03695dc959ace5bdb6096a56f95cae944486e46dfb464d80627ecb4fa810e0b5fef5cfdf8a13e243cf395958a6
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ pkg
2
+ pom*
3
+ *jar
4
+ *lock
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - jruby
4
+ - jruby-9.0.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Lookout Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Fast RSA Engine for jruby-openssl gem
2
+
3
+ this gem replaces the RSA signature and RSA ciphers from jruby-openssl by the must faster implementation of them. see [corner.squareup.com/2014/02/faster-rsa-jnagmp.html](https://corner.squareup.com/2014/02/faster-rsa-jnagmp.html)
4
+
5
+ but this works only for **darwin** and **linux-x84_64** platforms due to the library used from squareup.
6
+
7
+ the improvement in performance brings JRuby verify and decrypy using RSA close to MRI.
8
+
9
+ ## installation
10
+
11
+ via rubygems
12
+ ```
13
+ gem install fast-rsa-engine
14
+ ```
15
+ or add to your Gemfile
16
+ ```
17
+ gem 'fast-rsa-engine'
18
+ ```
19
+
20
+ installing the gem also takes care of the jar dependencies with jruby-1.7.16+
21
+
22
+ ## usage
23
+
24
+ with bundler its auto-require magic will be sufficient. otherwise just
25
+
26
+ require 'fast-rsa-engine'
27
+
28
+ ## running the benchmark
29
+
30
+ ruby benchmark/benchmark-with-fast-rsa.rb
31
+
32
+ or
33
+ ruby benchmark/benchmark-with-builtin-rsa.rb
34
+
35
+ ## developement
36
+
37
+ get all the gems and jars in place
38
+
39
+ gem install jar-dependencies --development
40
+ bundle install
41
+
42
+ for running all specs
43
+
44
+ rake
45
+
46
+ ## meta-fu
47
+
48
+ enjoy :)
data/Rakefile ADDED
@@ -0,0 +1,22 @@
1
+ #-*- mode: ruby -*-
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'ruby-maven'
5
+
6
+ desc "Pack fast-rsa-engine.jar with the compiled classes"
7
+ task :jar do
8
+ RubyMaven.exec('prepare-package', '-Dmaven.test.skip')
9
+ end
10
+
11
+ require "rspec/core/rake_task"
12
+ RSpec::Core::RakeTask.new
13
+
14
+ task :default => [ :jar, :spec ]
15
+
16
+ require 'rubygems/package_task'
17
+ Gem::PackageTask.new( eval File.read( './fast-rsa-engine.gemspec' ) ) do
18
+ desc 'Pack leafy-metrics.gem'
19
+ task :package => [:jar]
20
+ end
21
+
22
+ # vim: syntax=ruby
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative 'benchmark'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.expand_path('../../lib', __FILE__)
4
+ if defined? JRUBY_VERSION
5
+ require 'fast-rsa-engine'
6
+ end
7
+ require_relative 'benchmark'
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ count = (ARGV[0] || 1000).to_i
4
+ path = File.dirname(__FILE__)
5
+
6
+ require 'base64'
7
+ require 'benchmark'
8
+ require 'openssl'
9
+
10
+ # configure keys
11
+ public_key_file = "#{path}/foo_cert.pem" # public key in cert file
12
+ private_key_file = "#{path}/foo.pem" # private key file
13
+
14
+ $public_key = OpenSSL::X509::Certificate.new(File.read(public_key_file)).public_key
15
+ $private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))
16
+
17
+ # example msg
18
+ msg = "THIS IS A TEST"
19
+
20
+ # example key for encrypt operation
21
+ aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
22
+ aes.encrypt
23
+ key = aes.random_key
24
+
25
+ def sign(msg)
26
+ $private_key.sign(OpenSSL::Digest.new('sha512'), msg)
27
+ end
28
+
29
+ def verify(msg, signature)
30
+ $public_key.verify(OpenSSL::Digest.new('sha512'), signature, msg)
31
+ end
32
+
33
+ def encrypt(content)
34
+ $public_key.public_encrypt(content)
35
+ end
36
+
37
+ def decrypt(encrypted_msg)
38
+ $private_key.private_decrypt(encrypted_msg)
39
+ end
40
+
41
+ # signature, encrypted key for verify, decrypt tests
42
+ signature = sign(msg)
43
+ encrypted_key = encrypt(msg)
44
+
45
+ puts "#{RUBY_ENGINE} N = #{count}"
46
+ Benchmark.bm(17) do |x|
47
+ x.report('sign') { count.times { sign(msg) } }
48
+ x.report('verify') { count.times { verify(msg, signature) } }
49
+ x.report('encrypt') { count.times { encrypt(key) } }
50
+ x.report('decrypt') { count.times { decrypt(encrypted_key) } }
51
+ end
52
+ puts
53
+ p verify(msg, signature)
54
+ p decrypt(encrypted_key)
data/benchmark/foo.pem ADDED
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFAjCCAuoCBFWkCjYwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzAR
3
+ BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
4
+ IEx0ZDAeFw0xNTA3MTMxODU3NThaFw0xNzA3MTIxODU3NThaMEYxCzAJBgNVBAYT
5
+ AlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtTYW5GcmFuY2lzbzEM
6
+ MAoGA1UEAwwDZm9vMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtPhH
7
+ vStOVd29e7ElR3+uUeFYDdmVJ9OW1XQOs2QPpxSnpWbe++NNoqroCGCliRbXHYoX
8
+ +WpnbtdMDmLhSq4w4jmvL9CotFhfwhOtNY87GrEtMi2k+//OHz7hBZ5FqxEgNuC/
9
+ vCZoGFZvnGRLmtU0Q2B/7VV4zG9CiEumBdvZ6K40471XL1c2W/AOyXXcGHVAO8PY
10
+ F91CHu0gi6qB3tJ+kOrieX2cIs1W8NVc5Cz4SGwzlI8J9td9XE0Yef2aLxT021Dx
11
+ xuRubZI57/zrbR0MUoa0dKG6GTYMGw3g3gzjkcHjFLhn7FJgqxubFz2xEQWO03SI
12
+ aQj5lxF9tW9u8PKJwhiNrnIMa4JreNELlGCfqTd1eYJgvC2f6pkiNODbAqwhlALC
13
+ XKOSVBdT5ZzkP99O8vq3+mLfjYH9/0bheXKe/eeXcNoedH5xtnglQOUqGw5BwkRk
14
+ cApv/+rcs2GvhlWjCc9SmBQlu2lR7gPkUMvemHlzVtid3VKOt45/pGTkcD8iK/6Q
15
+ YmwlqmiU3Wq0NOcF5UcVqyQRCl9Vyzu280OsA8jpNRbTm/QLIxVKRwNSlSa3Et17
16
+ omk2Xi7nLQybrpEpIZ6NsTaps23Auxg3cPHNjcPVOWbUpiRsQh8JBQMAyJY/7eQ4
17
+ xtaKOS8VHrwIJVIuJWbLiXW9oBCjk6eA/kHM/FMCAwEAATANBgkqhkiG9w0BAQsF
18
+ AAOCAgEAdcnH4rVynCQWGYfR/n2XC0j34d058kfTqFuIYuTwEkY0jkIZqRBZuzwm
19
+ F88BKlRPk4qkkMXjRmvBisdcyFQiyvlf+fJlDuNKk21Dae+4P3HMz6xPK6vathKS
20
+ pAzQr9KDOp628c/8rGoxCV2hAkSyzHBC5WUwP8yBxWVG6QzqFrnUkTEo6x9S6RkG
21
+ 10g7YWi594L3RoJ/gFWKuqn3sGCetrqhQfrdskS5FaCEGLrs7/h74AJnjs6aVJCZ
22
+ LklsjPJpadd+WSFIRCGQhTWQUKVc8bil9vDxfIPW5Kj/DJvirbeJinGEIc7gR9WI
23
+ bYdje5UCphWlJr5ePGreyZvyDUElgTjhiiqWlUAgG5eJYJ2NEvH4g70laIDJZYt2
24
+ PZA0egp29+EKG3U3CXJkOoW8/z4mFgReYpWh/pqZesLePh4dbBrK/WCdAprKImZc
25
+ ymOD6K5IY9A0CeN6uW9VBnI0ed8KEGagfKCpCEBgbkhq27y7FVke1/oVXkWrXIFt
26
+ WfDd1hAJwUbxAeQXEwyAqDoCyKIvDqksGW+NL2o0N9DCP5cTMgho34WeUVdAuezM
27
+ 6wznqkkK9TB8mOtiJhPomlO2YL5/ShVVX0FoyQQ+ox2WMYIurbwguRVUAUNnfIdf
28
+ EqvJtVogFDekF8bxVA5RoiON8Dr8cDxSMU5eoH0Ixp3id5zsxQI=
29
+ -----END CERTIFICATE-----
@@ -0,0 +1,31 @@
1
+ #-*- mode: ruby -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'fast-rsa-engine'
5
+ s.version = '0.1.0'
6
+ s.author = 'Christian Meieier'
7
+ s.email = [ 'christian.meier@lookout.com' ]
8
+ s.platform = 'java'
9
+
10
+ s.license = 'MIT'
11
+ s.summary = %q(replaces the RSA signature and RSA ciphers from jruby-openssl by the must faster implementation of them)
12
+ s.homepage = 'https://github.com/lookout/fast-rsa-engine'
13
+ s.description = %q(this gem replaces the RSA signature and RSA ciphers from jruby-openssl by the must faster implementation of them. see https://corner.squareup.com/2014/02/faster-rsa-jnagmp.html)
14
+
15
+ s.files = `git ls-files`.split($/)
16
+
17
+ BC_VERSION = '1.50'
18
+ # needed for runtime
19
+ s.requirements << "jar com.squareup.jnagmp:bouncycastle-rsa, 1.0.0"
20
+ # needed for compilation
21
+ s.requirements << "jar org.bouncycastle:bcpkix-jdk15on, #{BC_VERSION}, :scope => :provided"
22
+ s.requirements << "jar org.bouncycastle:bcprov-jdk15on, #{BC_VERSION}, :scope => :provided"
23
+ s.requirements << "pom org.jruby:jruby-core, 1.7.21, :scope => :provided"
24
+
25
+ s.add_runtime_dependency 'jar-dependencies', '~> 0.1'
26
+ s.add_development_dependency 'ruby-maven', '~> 3.3'
27
+ s.add_development_dependency 'rspec', '~> 3.3'
28
+ s.add_development_dependency 'rake', '~> 10.2'
29
+ end
30
+
31
+ # vim: syntax=ruby
@@ -0,0 +1,13 @@
1
+ require 'fast-rsa-engine_jars.rb'
2
+ require 'fast-rsa-engine.jar'
3
+ require 'openssl'
4
+
5
+ # keep the default name space clean and use tap
6
+ tap do
7
+ engines = Java::OrgJrubyExtOpenssl::SecurityHelper.java_class.declared_field 'implEngines'
8
+ engines.accessible = true
9
+ com.github.lookout.fastrsa.SecurityHelperMap.setup( engines.value( Java::OrgJrubyExtOpenssl::SecurityHelper ))
10
+ use_internal = Java::OrgJrubyExtOpenssl::SecurityHelper.java_class.declared_field 'tryCipherInternal'
11
+ use_internal.accessible = true
12
+ use_internal.set_value( Java::OrgJrubyExtOpenssl::SecurityHelper, true )
13
+ end
@@ -0,0 +1,6 @@
1
+ # this is a generated file, to avoid over-writing it just delete this comment
2
+ require 'jar_dependencies'
3
+
4
+ require_jar( 'net.java.dev.jna', 'jna', '4.0.0' )
5
+ require_jar( 'com.squareup.jnagmp', 'bouncycastle-rsa', '1.0.0' )
6
+ require_jar( 'com.squareup.jnagmp', 'jnagmp', '1.0.0' )
@@ -0,0 +1,42 @@
1
+ require_relative 'setup'
2
+
3
+ describe 'Cipher' do
4
+
5
+ let( :this ) { File.expand_path( '..', __FILE__) }
6
+
7
+ let( :private_key ) {
8
+ file = File.read("#{this}/foo.pem")
9
+ OpenSSL::PKey::RSA.new(file)
10
+ }
11
+
12
+ let( :msg ) {
13
+ file = File.read("#{this}/foo_cert.pem")
14
+ public_key = OpenSSL::X509::Certificate.new(file).public_key
15
+ public_key.public_encrypt("THIS IS A TEST")
16
+ }
17
+
18
+ let( :rounds ) { 10 }
19
+
20
+ it 'is faster the regular cipher' do
21
+ # clear the fast engines
22
+ engines.clear
23
+
24
+ start = Time.new.to_f
25
+ rounds.times do
26
+ private_key.private_decrypt(msg)
27
+ end
28
+ delta1 = Time.new.to_f - start
29
+
30
+ # setup the fast engines
31
+ load( "${this}/../lib/fast-rsa-engine.rb" )
32
+
33
+ start = Time.new.to_f
34
+ rounds.times do
35
+ private_key.private_decrypt(msg)
36
+ end
37
+ delta2 = Time.new.to_f - start
38
+
39
+ expect( delta1 ).to be > 2 * delta2
40
+ end
41
+
42
+ end
data/spec/foo.pem ADDED
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
data/spec/foo_cert.pem ADDED
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFAjCCAuoCBFWkCjYwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzAR
3
+ BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
4
+ IEx0ZDAeFw0xNTA3MTMxODU3NThaFw0xNzA3MTIxODU3NThaMEYxCzAJBgNVBAYT
5
+ AlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtTYW5GcmFuY2lzbzEM
6
+ MAoGA1UEAwwDZm9vMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtPhH
7
+ vStOVd29e7ElR3+uUeFYDdmVJ9OW1XQOs2QPpxSnpWbe++NNoqroCGCliRbXHYoX
8
+ +WpnbtdMDmLhSq4w4jmvL9CotFhfwhOtNY87GrEtMi2k+//OHz7hBZ5FqxEgNuC/
9
+ vCZoGFZvnGRLmtU0Q2B/7VV4zG9CiEumBdvZ6K40471XL1c2W/AOyXXcGHVAO8PY
10
+ F91CHu0gi6qB3tJ+kOrieX2cIs1W8NVc5Cz4SGwzlI8J9td9XE0Yef2aLxT021Dx
11
+ xuRubZI57/zrbR0MUoa0dKG6GTYMGw3g3gzjkcHjFLhn7FJgqxubFz2xEQWO03SI
12
+ aQj5lxF9tW9u8PKJwhiNrnIMa4JreNELlGCfqTd1eYJgvC2f6pkiNODbAqwhlALC
13
+ XKOSVBdT5ZzkP99O8vq3+mLfjYH9/0bheXKe/eeXcNoedH5xtnglQOUqGw5BwkRk
14
+ cApv/+rcs2GvhlWjCc9SmBQlu2lR7gPkUMvemHlzVtid3VKOt45/pGTkcD8iK/6Q
15
+ YmwlqmiU3Wq0NOcF5UcVqyQRCl9Vyzu280OsA8jpNRbTm/QLIxVKRwNSlSa3Et17
16
+ omk2Xi7nLQybrpEpIZ6NsTaps23Auxg3cPHNjcPVOWbUpiRsQh8JBQMAyJY/7eQ4
17
+ xtaKOS8VHrwIJVIuJWbLiXW9oBCjk6eA/kHM/FMCAwEAATANBgkqhkiG9w0BAQsF
18
+ AAOCAgEAdcnH4rVynCQWGYfR/n2XC0j34d058kfTqFuIYuTwEkY0jkIZqRBZuzwm
19
+ F88BKlRPk4qkkMXjRmvBisdcyFQiyvlf+fJlDuNKk21Dae+4P3HMz6xPK6vathKS
20
+ pAzQr9KDOp628c/8rGoxCV2hAkSyzHBC5WUwP8yBxWVG6QzqFrnUkTEo6x9S6RkG
21
+ 10g7YWi594L3RoJ/gFWKuqn3sGCetrqhQfrdskS5FaCEGLrs7/h74AJnjs6aVJCZ
22
+ LklsjPJpadd+WSFIRCGQhTWQUKVc8bil9vDxfIPW5Kj/DJvirbeJinGEIc7gR9WI
23
+ bYdje5UCphWlJr5ePGreyZvyDUElgTjhiiqWlUAgG5eJYJ2NEvH4g70laIDJZYt2
24
+ PZA0egp29+EKG3U3CXJkOoW8/z4mFgReYpWh/pqZesLePh4dbBrK/WCdAprKImZc
25
+ ymOD6K5IY9A0CeN6uW9VBnI0ed8KEGagfKCpCEBgbkhq27y7FVke1/oVXkWrXIFt
26
+ WfDd1hAJwUbxAeQXEwyAqDoCyKIvDqksGW+NL2o0N9DCP5cTMgho34WeUVdAuezM
27
+ 6wznqkkK9TB8mOtiJhPomlO2YL5/ShVVX0FoyQQ+ox2WMYIurbwguRVUAUNnfIdf
28
+ EqvJtVogFDekF8bxVA5RoiON8Dr8cDxSMU5eoH0Ixp3id5zsxQI=
29
+ -----END CERTIFICATE-----
@@ -0,0 +1,14 @@
1
+ require_relative 'setup'
2
+
3
+ describe 'SecurityHelper' do
4
+
5
+ it 'registers signatures with SecurityHelper' do
6
+ # clear the fast engines
7
+ engines.clear
8
+ # setup the fast engines
9
+ load( "${this}/../lib/fast-rsa-engine.rb" )
10
+
11
+ expect( engines.size ).to eq( 12 )
12
+ end
13
+
14
+ end
data/spec/setup.rb ADDED
@@ -0,0 +1,8 @@
1
+ $: << File.expand_path( '../../lib', __FILE__ )
2
+ require 'fast-rsa-engine'
3
+
4
+ def engines
5
+ engines = Java::OrgJrubyExtOpenssl::SecurityHelper.java_class.declared_field 'implEngines'
6
+ engines.accessible = true
7
+ engines.value( Java::OrgJrubyExtOpenssl::SecurityHelper )
8
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'setup'
2
+
3
+ describe 'Signature' do
4
+
5
+ let( :this ) { File.expand_path( '..', __FILE__) }
6
+
7
+ let( :private_key ) { OpenSSL::PKey::RSA.new(File.read("#{this}/foo.pem")) }
8
+
9
+ let( :msg ) { "THIS IS A TEST" }
10
+
11
+ let( :rounds ) { 10 }
12
+
13
+ it 'is faster the regular signature' do
14
+ # clear the fast engines
15
+ engines.clear
16
+
17
+ start = Time.new.to_f
18
+ rounds.times do
19
+ private_key.sign(OpenSSL::Digest.new('sha512'), msg)
20
+ end
21
+ delta1 = Time.new.to_f - start
22
+
23
+ # setup the fast engines
24
+ load( "${this}/../lib/fast-rsa-engine.rb" )
25
+
26
+ start = Time.new.to_f
27
+ rounds.times do
28
+ private_key.sign(OpenSSL::Digest.new('sha512'), msg)
29
+ end
30
+ delta2 = Time.new.to_f - start
31
+
32
+ expect( delta1 ).to be > 2 * delta2
33
+ end
34
+
35
+ end
@@ -0,0 +1,195 @@
1
+ package com.github.lookout.fastrsa;
2
+
3
+ import com.squareup.crypto.rsa.NativeRSAEngine;
4
+
5
+ import java.lang.reflect.Field;
6
+ import java.security.spec.MGF1ParameterSpec;
7
+
8
+ import javax.crypto.NoSuchPaddingException;
9
+ import javax.crypto.spec.OAEPParameterSpec;
10
+ import javax.crypto.spec.PSource;
11
+
12
+ import org.bouncycastle.crypto.Digest;
13
+ import org.bouncycastle.jcajce.provider.util.DigestFactory;
14
+ import org.bouncycastle.asn1.ASN1ObjectIdentifier;
15
+ import org.bouncycastle.crypto.AsymmetricBlockCipher;
16
+ import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
17
+ import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
18
+ import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
19
+ import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
20
+ import org.bouncycastle.crypto.encodings.ISO9796d1Encoding;
21
+ import org.bouncycastle.crypto.encodings.OAEPEncoding;
22
+ import org.bouncycastle.crypto.encodings.PKCS1Encoding;
23
+ import org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi;
24
+ import org.bouncycastle.util.Strings;
25
+
26
+ public class FastCipherSpi extends CipherSpi {
27
+
28
+ private FastCipherSpi(AsymmetricBlockCipher cipher) {
29
+ super( cipher );
30
+ }
31
+
32
+ private void initFromSpec(OAEPParameterSpec pSpec)
33
+ throws NoSuchPaddingException, NoSuchFieldException, IllegalAccessException
34
+ {
35
+ MGF1ParameterSpec mgfParams = (MGF1ParameterSpec)pSpec.getMGFParameters();
36
+ Digest digest = DigestFactory.getDigest(mgfParams.getDigestAlgorithm());
37
+
38
+ if (digest == null)
39
+ {
40
+ throw new NoSuchPaddingException("no match on OAEP constructor for digest algorithm: "+ mgfParams.getDigestAlgorithm());
41
+ }
42
+
43
+ cipher(new OAEPEncoding(new NativeRSAEngine(), digest, ((PSource.PSpecified)pSpec.getPSource()).getValue()));
44
+ set( pSpec, "paramSpec" );
45
+ }
46
+
47
+ private void cipher(AsymmetricBlockCipher cipher)
48
+ throws NoSuchFieldException, IllegalAccessException
49
+ {
50
+ set( cipher, "cipher" );
51
+ }
52
+
53
+ private void set(Object object, String name)
54
+ throws NoSuchFieldException, IllegalAccessException
55
+ {
56
+ Field field = getClass().getSuperclass().getSuperclass().getDeclaredField(name);
57
+ field.setAccessible(true);
58
+ field.set(this, object);
59
+ }
60
+
61
+ protected void engineSetPadding(
62
+ String padding)
63
+ throws NoSuchPaddingException
64
+ {
65
+ try {
66
+ String pad = Strings.toUpperCase(padding);
67
+
68
+ if (pad.equals("NOPADDING"))
69
+ {
70
+ cipher(new NativeRSAEngine());
71
+ }
72
+ else if (pad.equals("PKCS1PADDING"))
73
+ {
74
+ cipher(new PKCS1Encoding(new NativeRSAEngine()));
75
+ }
76
+ else if (pad.equals("ISO9796-1PADDING"))
77
+ {
78
+ cipher(new ISO9796d1Encoding(new NativeRSAEngine()));
79
+ }
80
+ else if (pad.equals("OAEPWITHMD5ANDMGF1PADDING"))
81
+ {
82
+ initFromSpec(new OAEPParameterSpec("MD5", "MGF1", new MGF1ParameterSpec("MD5"), PSource.PSpecified.DEFAULT));
83
+ }
84
+ else if (pad.equals("OAEPPADDING"))
85
+ {
86
+ initFromSpec(OAEPParameterSpec.DEFAULT);
87
+ }
88
+ else if (pad.equals("OAEPWITHSHA1ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-1ANDMGF1PADDING"))
89
+ {
90
+ initFromSpec(OAEPParameterSpec.DEFAULT);
91
+ }
92
+ else if (pad.equals("OAEPWITHSHA224ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-224ANDMGF1PADDING"))
93
+ {
94
+ initFromSpec(new OAEPParameterSpec("SHA-224", "MGF1", new MGF1ParameterSpec("SHA-224"), PSource.PSpecified.DEFAULT));
95
+ }
96
+ else if (pad.equals("OAEPWITHSHA256ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-256ANDMGF1PADDING"))
97
+ {
98
+ initFromSpec(new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT));
99
+ }
100
+ else if (pad.equals("OAEPWITHSHA384ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-384ANDMGF1PADDING"))
101
+ {
102
+ initFromSpec(new OAEPParameterSpec("SHA-384", "MGF1", MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT));
103
+ }
104
+ else if (pad.equals("OAEPWITHSHA512ANDMGF1PADDING") || pad.equals("OAEPWITHSHA-512ANDMGF1PADDING"))
105
+ {
106
+ initFromSpec(new OAEPParameterSpec("SHA-512", "MGF1", MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT));
107
+ }
108
+ else
109
+ {
110
+ throw new NoSuchPaddingException(padding + " unavailable with RSA.");
111
+ }
112
+ }
113
+ catch(NoSuchFieldException e){
114
+ System.err.println("fall back to slow engine: " + e.getMessage());
115
+ super.engineSetPadding(padding);
116
+ }
117
+ catch(IllegalAccessException e){
118
+ System.err.println("fall back to slow engine: " + e.getMessage());
119
+ super.engineSetPadding(padding);
120
+ }
121
+ }
122
+
123
+ static public class NoPadding
124
+ extends FastCipherSpi
125
+ {
126
+ public NoPadding()
127
+ {
128
+ super(new NativeRSAEngine());
129
+ }
130
+ }
131
+
132
+ static public class PKCS1v1_5Padding
133
+ extends FastCipherSpi
134
+ {
135
+ public PKCS1v1_5Padding()
136
+ {
137
+ super(new PKCS1Encoding(new NativeRSAEngine()));
138
+ }
139
+ }
140
+
141
+ static public class PKCS1v1_5Padding_PrivateOnly
142
+ extends FastCipherSpi
143
+ {
144
+ public PKCS1v1_5Padding_PrivateOnly()
145
+ {
146
+ super(new PKCS1Encoding(new NativeRSAEngine()));
147
+ try {
148
+ engineSetMode("1");// private key only
149
+ }
150
+ catch(Exception e) {
151
+ throw new RuntimeException( "bug", e );
152
+ }
153
+ }
154
+ }
155
+
156
+ static public class PKCS1v1_5Padding_PublicOnly
157
+ extends FastCipherSpi
158
+ {
159
+ public PKCS1v1_5Padding_PublicOnly()
160
+ {
161
+ super(new PKCS1Encoding(new NativeRSAEngine()));
162
+ try {
163
+ engineSetMode("2");// public key only
164
+ }
165
+ catch(Exception e) {
166
+ throw new RuntimeException( "bug", e );
167
+ }
168
+ }
169
+ }
170
+
171
+ static public class OAEPPadding
172
+ extends FastCipherSpi
173
+ {
174
+ public OAEPPadding()
175
+ {
176
+ super(new NativeRSAEngine());
177
+ //super(OAEPParameterSpec.DEFAULT);
178
+ try {
179
+ engineSetPadding("OAEPPADDING");
180
+ }
181
+ catch(Exception e) {
182
+ throw new RuntimeException( "bug", e );
183
+ }
184
+ }
185
+ }
186
+
187
+ static public class ISO9796d1Padding
188
+ extends FastCipherSpi
189
+ {
190
+ public ISO9796d1Padding()
191
+ {
192
+ super(new ISO9796d1Encoding(new NativeRSAEngine()));
193
+ }
194
+ }
195
+ }
@@ -0,0 +1,133 @@
1
+ package com.github.lookout.fastrsa;
2
+
3
+ import com.squareup.crypto.rsa.NativeRSAEngine;
4
+
5
+ import java.lang.reflect.Field;
6
+
7
+ import org.bouncycastle.asn1.ASN1ObjectIdentifier;
8
+ import org.bouncycastle.crypto.Digest;
9
+ import org.bouncycastle.crypto.digests.MD2Digest;
10
+ import org.bouncycastle.crypto.digests.MD4Digest;
11
+ import org.bouncycastle.crypto.digests.MD5Digest;
12
+ import org.bouncycastle.crypto.digests.NullDigest;
13
+ import org.bouncycastle.crypto.digests.RIPEMD128Digest;
14
+ import org.bouncycastle.crypto.digests.RIPEMD160Digest;
15
+ import org.bouncycastle.crypto.digests.RIPEMD256Digest;
16
+ import org.bouncycastle.crypto.digests.SHA1Digest;
17
+ import org.bouncycastle.crypto.digests.SHA224Digest;
18
+ import org.bouncycastle.crypto.digests.SHA256Digest;
19
+ import org.bouncycastle.crypto.digests.SHA384Digest;
20
+ import org.bouncycastle.crypto.digests.SHA512Digest;
21
+ import org.bouncycastle.crypto.AsymmetricBlockCipher;
22
+ import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
23
+ import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
24
+ import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
25
+ import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
26
+ import org.bouncycastle.crypto.encodings.PKCS1Encoding;
27
+ import org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi;
28
+
29
+ public class FastDigestSignatureSpi extends DigestSignatureSpi {
30
+
31
+ private FastDigestSignatureSpi(ASN1ObjectIdentifier objId, Digest digest, AsymmetricBlockCipher cipher) {
32
+ super( objId, digest, cipher);
33
+ }
34
+
35
+ static public class SHA1
36
+ extends DigestSignatureSpi
37
+ {
38
+ public SHA1()
39
+ {
40
+ super(OIWObjectIdentifiers.idSHA1, new SHA1Digest(), new PKCS1Encoding(new NativeRSAEngine()));
41
+ }
42
+ }
43
+
44
+ static public class SHA224
45
+ extends DigestSignatureSpi
46
+ {
47
+ public SHA224()
48
+ {
49
+ super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new NativeRSAEngine()));
50
+ }
51
+ }
52
+
53
+ static public class SHA256
54
+ extends DigestSignatureSpi
55
+ {
56
+ public SHA256()
57
+ {
58
+ super(NISTObjectIdentifiers.id_sha256, new SHA256Digest(), new PKCS1Encoding(new NativeRSAEngine()));
59
+ }
60
+ }
61
+
62
+ static public class SHA384
63
+ extends DigestSignatureSpi
64
+ {
65
+ public SHA384()
66
+ {
67
+ super(NISTObjectIdentifiers.id_sha384, new SHA384Digest(), new PKCS1Encoding(new NativeRSAEngine()));
68
+ }
69
+ }
70
+
71
+ static public class SHA512
72
+ extends DigestSignatureSpi
73
+ {
74
+ public SHA512()
75
+ {
76
+ super(NISTObjectIdentifiers.id_sha512, new SHA512Digest(), new PKCS1Encoding(new NativeRSAEngine()));
77
+ }
78
+ }
79
+
80
+ static public class MD2
81
+ extends DigestSignatureSpi
82
+ {
83
+ public MD2()
84
+ {
85
+ super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new NativeRSAEngine()));
86
+ }
87
+ }
88
+
89
+ static public class MD4
90
+ extends DigestSignatureSpi
91
+ {
92
+ public MD4()
93
+ {
94
+ super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new NativeRSAEngine()));
95
+ }
96
+ }
97
+
98
+ static public class MD5
99
+ extends DigestSignatureSpi
100
+ {
101
+ public MD5()
102
+ {
103
+ super(PKCSObjectIdentifiers.md5, new MD5Digest(), new PKCS1Encoding(new NativeRSAEngine()));
104
+ }
105
+ }
106
+
107
+ static public class RIPEMD160
108
+ extends DigestSignatureSpi
109
+ {
110
+ public RIPEMD160()
111
+ {
112
+ super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new NativeRSAEngine()));
113
+ }
114
+ }
115
+
116
+ static public class RIPEMD128
117
+ extends DigestSignatureSpi
118
+ {
119
+ public RIPEMD128()
120
+ {
121
+ super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new NativeRSAEngine()));
122
+ }
123
+ }
124
+
125
+ static public class RIPEMD256
126
+ extends DigestSignatureSpi
127
+ {
128
+ public RIPEMD256()
129
+ {
130
+ super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new NativeRSAEngine()));
131
+ }
132
+ }
133
+ }
@@ -0,0 +1,29 @@
1
+ package com.github.lookout.fastrsa;
2
+
3
+ import java.util.Map;
4
+
5
+ public class SecurityHelperMap {
6
+
7
+ private SecurityHelperMap() {}
8
+
9
+ public static void setup( Map<String, Class<?>> engines ) {
10
+ String[] names = {
11
+ "MD2", "MD4", "MD5",
12
+ "RIPEMD128", "RIPEMD160", "RIPEMD256",
13
+ "SHA1", "SHA224", "SHA256", "SHA384", "SHA512"
14
+ };
15
+
16
+ ClassLoader classLoader = SecurityHelperMap.class.getClassLoader();
17
+ for (String name : names ) {
18
+ try {
19
+ engines.put( "Signature:" + name + "WITHRSA",
20
+ classLoader.loadClass( FastDigestSignatureSpi.class.getName() + "$" + name ) );
21
+ }
22
+ catch( ClassNotFoundException e ) {
23
+ System.err.println( "signature class not found for: " + name + " ( " + e.getMessage() + " )" );
24
+ }
25
+ }
26
+
27
+ engines.put( "Cipher:RSA", FastCipherSpi.NoPadding.class );
28
+ }
29
+ }
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fast-rsa-engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: java
6
+ authors:
7
+ - Christian Meieier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jar-dependencies
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: '0.1'
25
+ prerelease: false
26
+ type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-maven
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '3.3'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: '3.3'
39
+ prerelease: false
40
+ type: :development
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ~>
51
+ - !ruby/object:Gem::Version
52
+ version: '3.3'
53
+ prerelease: false
54
+ type: :development
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '10.2'
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ~>
65
+ - !ruby/object:Gem::Version
66
+ version: '10.2'
67
+ prerelease: false
68
+ type: :development
69
+ description: this gem replaces the RSA signature and RSA ciphers from jruby-openssl by the must faster implementation of them. see https://corner.squareup.com/2014/02/faster-rsa-jnagmp.html
70
+ email:
71
+ - christian.meier@lookout.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .travis.yml
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - benchmark/benchmark-with-builtin-rsa.rb
83
+ - benchmark/benchmark-with-fast-rsa.rb
84
+ - benchmark/benchmark.rb
85
+ - benchmark/foo.pem
86
+ - benchmark/foo_cert.pem
87
+ - fast-rsa-engine.gemspec
88
+ - lib/fast-rsa-engine.rb
89
+ - lib/fast-rsa-engine_jars.rb
90
+ - spec/cipher_spec.rb
91
+ - spec/foo.pem
92
+ - spec/foo_cert.pem
93
+ - spec/security_helper_spec.rb
94
+ - spec/setup.rb
95
+ - spec/signature_spec.rb
96
+ - src/main/java/com/github/lookout/fastrsa/FastCipherSpi.java
97
+ - src/main/java/com/github/lookout/fastrsa/FastDigestSignatureSpi.java
98
+ - src/main/java/com/github/lookout/fastrsa/SecurityHelperMap.java
99
+ homepage: https://github.com/lookout/fast-rsa-engine
100
+ licenses:
101
+ - MIT
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements:
118
+ - jar com.squareup.jnagmp:bouncycastle-rsa, 1.0.0
119
+ - jar org.bouncycastle:bcpkix-jdk15on, 1.50, :scope => :provided
120
+ - jar org.bouncycastle:bcprov-jdk15on, 1.50, :scope => :provided
121
+ - pom org.jruby:jruby-core, 1.7.21, :scope => :provided
122
+ rubyforge_project:
123
+ rubygems_version: 2.4.8
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: replaces the RSA signature and RSA ciphers from jruby-openssl by the must faster implementation of them
127
+ test_files: []