|
# frozen_string_literal: true |
|
|
|
require 'benchmark/ips' |
|
require 'base64' |
|
require 'gpgme' |
|
require 'ice_nine' |
|
require 'json' |
|
require 'rbnacl' |
|
|
|
GPG_USERNAME = ENV['GPG_USERNAME'] || '[email protected]' |
|
|
|
SERVICE_INFO = IceNine.deep_freeze({ |
|
name: 'apidemo', |
|
description: 'API Demonstration Component Service', |
|
api_version: 'v1', |
|
base_url: 'http://demo.example.com:9292/api/', |
|
restricted: false |
|
}) |
|
SERVICE_JSON = JSON.dump(SERVICE_INFO).freeze |
|
|
|
sig_key = RbNaCl::SigningKey.generate |
|
sig = sig_key.sign(SERVICE_JSON) |
|
vfy_key = sig_key.verify_key |
|
|
|
Benchmark.ips do |x| |
|
x.report 'RbNaCl digital signature -- generate keys and signature' do |
|
signing_key = RbNaCl::SigningKey.generate |
|
signature = signing_key.sign(SERVICE_JSON) |
|
verify_key = signing_key.verify_key |
|
end |
|
|
|
x.report 'RbNaCl digital signature -- verify signature' do |
|
verify_key = RbNaCl::VerifyKey.new(vfy_key) |
|
verify_key.verify(sig, SERVICE_JSON) |
|
end |
|
|
|
x.report 'RbNaCl encryption -- generate keys and data' do |
|
registration_private_key = RbNaCl::PrivateKey.generate |
|
registration_public_key = registration_private_key.public_key |
|
|
|
service_private_key = RbNaCl::PrivateKey.generate |
|
service_public_key = service_private_key.public_key |
|
box = RbNaCl::SimpleBox.from_keypair(registration_public_key, |
|
service_private_key) |
|
crypted = box.encrypt(SERVICE_JSON) |
|
ciphertext = Base64.urlsafe_encode64(crypted) |
|
payload = { service: 'apidemo', pubkey: service_public_key, |
|
data: ciphertext } |
|
end |
|
|
|
reg_privkey = RbNaCl::PrivateKey.generate |
|
reg_pubkey = reg_privkey.public_key |
|
service_privkey = RbNaCl::PrivateKey.generate |
|
service_pubkey = service_privkey.public_key |
|
outer_box = RbNaCl::SimpleBox.from_keypair(reg_pubkey, service_privkey) |
|
outer_crypted = outer_box.encrypt(SERVICE_JSON) |
|
outer_ciphertext = Base64.urlsafe_encode64(outer_crypted) |
|
outer_payload = { service: 'apidemo', pubkey: service_pubkey, |
|
data: outer_ciphertext } |
|
|
|
x.report 'RbNaCl encryption -- decrypt encrypted data' do |
|
box = RbNaCl::SimpleBox.from_keypair(service_pubkey, reg_privkey) |
|
data = Base64.urlsafe_decode64(outer_payload[:data]) |
|
cleartext = box.decrypt(data) |
|
parsed_data = JSON.parse(cleartext, symbolize_names: true) |
|
end |
|
|
|
x.report 'GPGME digital signature -- generate signature' do |
|
crypto = GPGME::Crypto.new armor: true |
|
signature = crypto.clearsign SERVICE_JSON |
|
end |
|
|
|
gpg_crypto = GPGME::Crypto.new armor: true |
|
gpg_signature = gpg_crypto.clearsign SERVICE_JSON |
|
|
|
x.report 'GPGME digital signature -- verify signature' do |
|
gpg_signature.seek(0) |
|
gpg_crypto.verify(gpg_signature) do |sigg| |
|
sigg.valid? |
|
end |
|
end |
|
|
|
gpg_crypt_opts = IceNine.deep_freeze({ recipients: GPG_USERNAME, |
|
symmetric: false, sign: true, |
|
always_trust: true }) |
|
|
|
x.report 'GPGME encryption -- encrypt data' do |
|
# gpg_crypto = GPGME::Crypto.new armor: true |
|
crypted = gpg_crypto.encrypt SERVICE_JSON, gpg_crypt_opts |
|
ciphertext = Base64.urlsafe_encode64(crypted.to_s) |
|
end |
|
|
|
gpg_crypted = gpg_crypto.encrypt SERVICE_JSON, gpg_crypt_opts |
|
gpg_crypttext = Base64.urlsafe_encode64(gpg_crypted.to_s) |
|
|
|
x.report 'GPGME encryption -- decrypt data' do |
|
ciphertext = Base64.urlsafe_decode64(gpg_crypttext) |
|
cleartext = gpg_crypto.decrypt(ciphertext) |
|
end |
|
end |