fast-rsa-engine 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +18 -0
- data/Gemfile +4 -0
- data/Gemfile096 +7 -0
- data/Gemfile098 +6 -0
- data/LICENSE +22 -0
- data/README.md +50 -0
- data/Rakefile +28 -0
- data/benchmark/benchmark-with-builtin-rsa.rb +3 -0
- data/benchmark/benchmark-with-fast-rsa.rb +7 -0
- data/benchmark/benchmark.rb +54 -0
- data/benchmark/foo.pem +51 -0
- data/benchmark/foo_cert.pem +29 -0
- data/fast-rsa-engine.gemspec +36 -0
- data/lib/fast-rsa-engine.rb +32 -0
- data/lib/fast-rsa-engine_jars.rb +6 -0
- data/spec/cipher_spec.rb +45 -0
- data/spec/foo.pem +51 -0
- data/spec/foo_cert.pem +29 -0
- data/spec/security_helper_spec.rb +15 -0
- data/spec/setup.rb +15 -0
- data/spec/signature_spec.rb +38 -0
- data/src/main/java/com/github/lookout/fastrsa/FastCipherSpi.java +194 -0
- data/src/main/java/com/github/lookout/fastrsa/FastDigestSignatureSpi.java +133 -0
- data/src/main/java/org/jruby/ext/openssl/SecurityHelper.java +751 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2e56f7cc7015152e2a7728fa6f60248bd92d7df8
|
4
|
+
data.tar.gz: 13364603be73bc8463c93eb601519b90286c3b31
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d4fe8c846948f14b0643d2579a8e42403c9e24b9c0b76c3b337a1466cbfd6bdb85a573018dda6a2859a3fc7c78b43758628c5d330f662489243fcfffc2b9d051
|
7
|
+
data.tar.gz: f2b2c4bb8c4ce4b233141c8e73e26dfadd0022ab0a5f822851ab06d255aa82c3d83f1176d0fcc65ebc471f9d839cb377aa2abec3edce71d6a097f691c818e957
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
language: ruby
|
2
|
+
install: gem install bundler -v '~>1.10'; bundle install
|
3
|
+
gemfile:
|
4
|
+
- Gemfile
|
5
|
+
- Gemfile096
|
6
|
+
- Gemfile098
|
7
|
+
rvm:
|
8
|
+
- jruby-1.7.19
|
9
|
+
- jruby-1.7.21
|
10
|
+
- jruby-9.0.0.0
|
11
|
+
jdk:
|
12
|
+
- openjdk7
|
13
|
+
- oraclejdk8
|
14
|
+
matrix:
|
15
|
+
include:
|
16
|
+
- rvm: 1.9.3
|
17
|
+
gemfile: Gemfile
|
18
|
+
jdk: openjdk7
|
data/Gemfile
ADDED
data/Gemfile096
ADDED
data/Gemfile098
ADDED
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,50 @@
|
|
1
|
+
# Fast RSA Engine for jruby-openssl gem
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/lookout/fast-rsa-engine.svg?branch=master)](https://travis-ci.org/lookout/fast-rsa-engine)
|
4
|
+
|
5
|
+
This gem replaces the RSA signature and RSA ciphers from jruby-openssl by the much faster implementation of them. See [corner.squareup.com/2014/02/faster-rsa-jnagmp.html](https://corner.squareup.com/2014/02/faster-rsa-jnagmp.html)
|
6
|
+
|
7
|
+
but this works only for **darwin** and **linux-x84_64** platforms due to the library used from squareup.
|
8
|
+
|
9
|
+
The improvement in performance brings JRuby verify and decrypy using RSA close to MRI.
|
10
|
+
|
11
|
+
## installation
|
12
|
+
|
13
|
+
via rubygems
|
14
|
+
```
|
15
|
+
gem install fast-rsa-engine
|
16
|
+
```
|
17
|
+
or add to your Gemfile
|
18
|
+
```
|
19
|
+
gem 'fast-rsa-engine'
|
20
|
+
```
|
21
|
+
|
22
|
+
installing the gem also takes care of the jar dependencies with jruby-1.7.16+
|
23
|
+
|
24
|
+
## usage
|
25
|
+
|
26
|
+
with bundler its auto-require magic will be sufficient. otherwise just
|
27
|
+
|
28
|
+
require 'fast-rsa-engine'
|
29
|
+
|
30
|
+
## running the benchmark
|
31
|
+
|
32
|
+
ruby benchmark/benchmark-with-fast-rsa.rb
|
33
|
+
|
34
|
+
or
|
35
|
+
ruby benchmark/benchmark-with-builtin-rsa.rb
|
36
|
+
|
37
|
+
## developement
|
38
|
+
|
39
|
+
get all the gems and jars in place
|
40
|
+
|
41
|
+
gem install jar-dependencies --development
|
42
|
+
bundle install
|
43
|
+
|
44
|
+
for running all specs
|
45
|
+
|
46
|
+
rake
|
47
|
+
|
48
|
+
## meta-fu
|
49
|
+
|
50
|
+
enjoy :)
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#-*- mode: ruby -*-
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
if RUBY_PLATFORM == 'java'
|
6
|
+
require 'ruby-maven'
|
7
|
+
|
8
|
+
desc "Pack fast-rsa-engine.jar with the compiled classes"
|
9
|
+
task :jar do
|
10
|
+
raise unless RubyMaven.exec('-f', 'fast-rsa-engine.gemspec', 'prepare-package', '-Dmaven.test.skip')
|
11
|
+
end
|
12
|
+
else
|
13
|
+
task :jar do
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
require "rspec/core/rake_task"
|
18
|
+
RSpec::Core::RakeTask.new
|
19
|
+
|
20
|
+
require 'rubygems/package_task'
|
21
|
+
Gem::PackageTask.new( eval File.read( './fast-rsa-engine.gemspec' ) ) do
|
22
|
+
desc 'Pack fast-rsa-engine.gem'
|
23
|
+
task :package => [:jar]
|
24
|
+
end
|
25
|
+
|
26
|
+
task :default => [ :jar, :spec ]
|
27
|
+
|
28
|
+
# vim: syntax=ruby
|
@@ -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,36 @@
|
|
1
|
+
#-*- mode: ruby -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'fast-rsa-engine'
|
5
|
+
s.version = '0.2.0'
|
6
|
+
s.author = 'Christian Meier'
|
7
|
+
s.email = [ 'christian.meier@lookout.com', 'rtyler.croy@lookout.com' ]
|
8
|
+
|
9
|
+
s.license = 'MIT'
|
10
|
+
s.summary = %q(replaces the RSA signature and RSA ciphers from jruby-openssl by a faster implementation of them)
|
11
|
+
s.homepage = 'https://github.com/lookout/fast-rsa-engine'
|
12
|
+
s.description = %q(this gem replaces the RSA signature and RSA ciphers from jruby-openssl by a faster implementation of them. see https://corner.squareup.com/2014/02/faster-rsa-jnagmp.html)
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split($/)
|
15
|
+
|
16
|
+
if RUBY_PLATFORM == 'java'
|
17
|
+
unless defined?(BC_VERSION)
|
18
|
+
BC_VERSION = '1.50'
|
19
|
+
end
|
20
|
+
s.platform = 'java'
|
21
|
+
# needed for runtime
|
22
|
+
s.requirements << "jar com.squareup.jnagmp:bouncycastle-rsa, 1.0.0"
|
23
|
+
# needed for compilation
|
24
|
+
s.requirements << "jar org.bouncycastle:bcpkix-jdk15on, #{BC_VERSION}, :scope => :provided"
|
25
|
+
s.requirements << "jar org.bouncycastle:bcprov-jdk15on, #{BC_VERSION}, :scope => :provided"
|
26
|
+
s.requirements << "pom org.jruby:jruby-core, 1.7.21, :scope => :provided"
|
27
|
+
|
28
|
+
s.add_runtime_dependency 'jar-dependencies', '~> 0.1'
|
29
|
+
s.add_development_dependency 'ruby-maven', '~> 3.3'
|
30
|
+
end
|
31
|
+
|
32
|
+
s.add_development_dependency 'rspec', '~> 3.3'
|
33
|
+
s.add_development_dependency 'rake', '~> 10.2'
|
34
|
+
end
|
35
|
+
|
36
|
+
# vim: syntax=ruby
|
@@ -0,0 +1,32 @@
|
|
1
|
+
if RUBY_PLATFORM == 'java'
|
2
|
+
require 'fast-rsa-engine_jars.rb'
|
3
|
+
begin
|
4
|
+
Java::OrgJrubyExtOpenssl::SecurityHelper
|
5
|
+
warn 'openssl loaded before fast-rsa-engine'
|
6
|
+
rescue NameError
|
7
|
+
require 'fast-rsa-engine.jar'
|
8
|
+
end
|
9
|
+
require 'openssl'
|
10
|
+
|
11
|
+
# lexical compare is sufficient here
|
12
|
+
if Jopenssl::Version::VERSION > '0.9.5'
|
13
|
+
# keep the default name space clean and use tap
|
14
|
+
tap do
|
15
|
+
sign_names = [ "MD2", "MD4", "MD5",
|
16
|
+
"RIPEMD128", "RIPEMD160", "RIPEMD256",
|
17
|
+
"SHA1", "SHA224", "SHA256", "SHA384", "SHA512" ]
|
18
|
+
sign_names.each do |name|
|
19
|
+
full = "#{name}WITHRSA"
|
20
|
+
clazz = JRuby.runtime.jruby_class_loader.load_class( "com.github.lookout.fastrsa.FastDigestSignatureSpi$#{name}" )
|
21
|
+
Java::OrgJrubyExtOpenssl::SecurityHelper.add_signature(full, clazz)
|
22
|
+
end
|
23
|
+
|
24
|
+
Java::OrgJrubyExtOpenssl::SecurityHelper.add_cipher('RSA',
|
25
|
+
com.github.lookout.fastrsa.FastCipherSpi::NoPadding.java_class)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
warn "jruby-openssl gem #{Jopenssl::Version::VERSION} is too old"
|
29
|
+
end
|
30
|
+
else
|
31
|
+
warn "fast-rsa-engine does not affect MRI"
|
32
|
+
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( 'com.squareup.jnagmp', 'bouncycastle-rsa', '1.0.0' )
|
5
|
+
require_jar( 'net.java.dev.jna', 'jna', '4.0.0' )
|
6
|
+
require_jar( 'com.squareup.jnagmp', 'jnagmp', '1.0.0' )
|
data/spec/cipher_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
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 ) { 100 }
|
19
|
+
|
20
|
+
it 'is faster the regular cipher' do
|
21
|
+
skip( 'jruby too old' ) if too_old
|
22
|
+
# clear the fast engines
|
23
|
+
engines.clear
|
24
|
+
|
25
|
+
start = Time.new.to_f
|
26
|
+
rounds.times do
|
27
|
+
private_key.private_decrypt(msg)
|
28
|
+
end
|
29
|
+
delta1 = Time.new.to_f - start
|
30
|
+
|
31
|
+
# setup the fast engines
|
32
|
+
engines.clear
|
33
|
+
# this creates a warning
|
34
|
+
load( "${this}/../lib/fast-rsa-engine.rb" )
|
35
|
+
|
36
|
+
start = Time.new.to_f
|
37
|
+
rounds.times do
|
38
|
+
private_key.private_decrypt(msg)
|
39
|
+
end
|
40
|
+
delta2 = Time.new.to_f - start
|
41
|
+
|
42
|
+
expect( delta1 ).to be > 2 * delta2
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
data/spec/foo.pem
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIJKgIBAAKCAgEAtPhHvStOVd29e7ElR3+uUeFYDdmVJ9OW1XQOs2QPpxSnpWbe
|
3
|
+
++NNoqroCGCliRbXHYoX+WpnbtdMDmLhSq4w4jmvL9CotFhfwhOtNY87GrEtMi2k
|
4
|
+
+//OHz7hBZ5FqxEgNuC/vCZoGFZvnGRLmtU0Q2B/7VV4zG9CiEumBdvZ6K40471X
|
5
|
+
L1c2W/AOyXXcGHVAO8PYF91CHu0gi6qB3tJ+kOrieX2cIs1W8NVc5Cz4SGwzlI8J
|
6
|
+
9td9XE0Yef2aLxT021DxxuRubZI57/zrbR0MUoa0dKG6GTYMGw3g3gzjkcHjFLhn
|
7
|
+
7FJgqxubFz2xEQWO03SIaQj5lxF9tW9u8PKJwhiNrnIMa4JreNELlGCfqTd1eYJg
|
8
|
+
vC2f6pkiNODbAqwhlALCXKOSVBdT5ZzkP99O8vq3+mLfjYH9/0bheXKe/eeXcNoe
|
9
|
+
dH5xtnglQOUqGw5BwkRkcApv/+rcs2GvhlWjCc9SmBQlu2lR7gPkUMvemHlzVtid
|
10
|
+
3VKOt45/pGTkcD8iK/6QYmwlqmiU3Wq0NOcF5UcVqyQRCl9Vyzu280OsA8jpNRbT
|
11
|
+
m/QLIxVKRwNSlSa3Et17omk2Xi7nLQybrpEpIZ6NsTaps23Auxg3cPHNjcPVOWbU
|
12
|
+
piRsQh8JBQMAyJY/7eQ4xtaKOS8VHrwIJVIuJWbLiXW9oBCjk6eA/kHM/FMCAwEA
|
13
|
+
AQKCAgEAkxUrsUsOOumixHJgmzDh7DibSX5rJNhqwge2nwSXWDOIYf0vBEhk4+3F
|
14
|
+
8nEieT4wDhkbjSJ2+HZRoWuqMflLT8KUaOdNBm7BPUqiv2IvJm2UDzFb41iwHWMM
|
15
|
+
nnVZqESeCxw1mWUZu5Yc1l4JuMjJ1m0K7ElIiddvmrjpMd/SxrM311UfFCHs02JT
|
16
|
+
kleRT+uUDj8JVbQFtn8BsaIeNYydQ4k0EowNp5d+rvSqr+UA0lPmxDpRXeccQzWB
|
17
|
+
zDxa4SNGMy4ho4YrXjC3mB7W9XLjfftvlU+Qokb0JdTsy2xsVR3hQwjxpff6C3e/
|
18
|
+
YG9Kh0weHiybZcremHKl2h28bGajoNf36z6MdGG9ins/zPc2DHSUXytDxE2Zri1q
|
19
|
+
Esl41CO1NGQl/FLs6fJes9RvYeDU6C+6iQf+P3iHen8ruHns3OGYKKFwLRWMiQwG
|
20
|
+
cK0Oy2+L8G23GhE2g+hor89MNMMLnsTOHe0OBnBFQfuujn2ZZ1kmUxkKFm43WjUi
|
21
|
+
psqTuYR/Cs14jwUTFpe6/MMaRcYurueJY2PQEo28dFmz+FClUdRR7OZvbXAq0bb5
|
22
|
+
JeeFcU6S5tWtZNcLsK93L+r290Jw7E34/J+zyV9G45kzpUqyIF7Cw6BlRaq2VD+V
|
23
|
+
nxEpbo9h4ZnKcYsjFuFul7NvPUHWicfsN7e1HKGa/bkcZF/+RlECggEBAOFN2MQW
|
24
|
+
y6ND3P18+k6EzAPlsqZAnnhO8Mh6kxoOdTSayD23iUbCFMkohGEOVeyvRLHqX971
|
25
|
+
W0rtqZ4Qrew3U/dWboUWWo7WkIk2Iicfx8DXIReIwzjMnWZAJnylEzAYosiaIJG5
|
26
|
+
ZUPaeCOFdZsMPT8mLKwo8hFM3sWVq9hb52xwBgraqQIsCZM6SoZb+LbbwVdEHR6z
|
27
|
+
6MVUEhqgsI64qF+tlZGThuCCJQzRwz9Uwrr+dKNC1fskhnCYbsHX37K6O5PB5ILW
|
28
|
+
vamGCqCfsP+vzpWZwB9X43muRq0CPNsuoHfwL/uzHTzVRgBhGSNpDkf1ytl4RW7/
|
29
|
+
9ECk68h0e2lxYDsCggEBAM2gJO5KlVI9ES8liccdSH22PKQtYhQzFmCqUookcdap
|
30
|
+
rH1RdGSvT7FnZLLEjDZUQfcHF1fU1xTwuXEXixmlDwFG9AftaQNT2cvaANYGjhSA
|
31
|
+
DP5RSaC+DH9teRatwgihN9oNfTL6Rj8Eg+HDAFT6m7Hjyxiz1/7D2y0Kk4NHbMwZ
|
32
|
+
YhHbblfyWnPx0jtdY02jeenAdamRmmaF68GtqgCsYxaWXzeZt8CVm+qXbu18dw0D
|
33
|
+
y0XT4FlwajDqdMkzdrKtU7biTJdK8Mq2JUyzkfzWM7dO39UQFVGLbmULsgdvRDw9
|
34
|
+
+7AvIrjwYznTwtao3MZFiyx588TG9vGWOJ4rhKLQaskCggEADIN+XqXFebPzOkEO
|
35
|
+
xf2qNy0y1vkP1C7OQNROB0x2Rg2ywXrILR3qeaG+eIWLUDIL5rXVzVRjVa4NlbHn
|
36
|
+
dw87oqkySkILlZNlQ7m1++ZP+e348I2wCh+TPnKhsJqajjlQEUQ+OtnJPhOMSKzI
|
37
|
+
82uimzdLk+RSTZOva9n8SXARUnyGWWP7rxszDPJX4U6Kad2ax3YJCAOGEi+xMblr
|
38
|
+
FQI8l9PUUtmWzDFuTV/5MDNM/YXUhJzZtbE5pldRD4Ml8Y9Wb8Z9Iqc6sYe4X2N/
|
39
|
+
OTRSjQyVFyiSgdekJUfSiXn1f7PfdmNkZFSUJsE93DGhkW2dbqa3dIrSziRa1C9k
|
40
|
+
C184sQKCAQEAmMLQrPdb16zmh1Ar+3EV2c75Xj8ZDkil50qh518L8546Nx+8iNB1
|
41
|
+
NCbL+MNsJzCRkSQDg4zr/PKZ0hrbjEHD0/8SbJFD4uT4eSmMVXSpOTGodYeOW4zV
|
42
|
+
XBXIT8Dm1eJvy98ZlDW62jZQg/iK1pcX9CB3UfLKFMsMmXmx/WWivj5dTUbnww6Z
|
43
|
+
hGmy9cd7bsJ0X+RLhZ5WRrRXYZvTIIzxUGaGdpgMm1aKbs3x6xz8lP6slUPC+K87
|
44
|
+
NPv5p0BEfpmmB8g3fm5+VRrcuw7s9hlsclJ2l6NLMzmS2h7GNB/FYbvqsAlUknCE
|
45
|
+
RwG7Th5FZkdkDbbMEvR9oR0pEtjhwNN1gQKCAQEAvJQkeVWUZQ4aC0xTeLwdWbFE
|
46
|
+
EftxREWpsVbe/j9sO1km5CMJsbWqLEQ9el3iOIAIetht0qKe1wdh7LC2N8uvhim4
|
47
|
+
OnUkoHdWBER6D2xi2T+KzSZo9NJSGefE+IFAYBBg3ncrQzrASFN9Ij7iHC6MRSaB
|
48
|
+
BBYZ3YbsaCm3koQRE0f9R/b8OM0kO8dec1hlGC2/Zi599sttyp8RUcCb/eEz1I/t
|
49
|
+
MhwJC7EE7+QWjfbHQlmRxYRoMtfgpis18cdm8LDGg6eA42MfLwrAPAkPhkt8wATp
|
50
|
+
c/TIDOyx1RSMY1ssLp51tgf9exiElWSO6zxq9CPvlLP3nM3pkEJGnmSmzS9LOQ==
|
51
|
+
-----END RSA PRIVATE KEY-----
|