rsa-pem-from-mod-exp 0.1.0
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 +7 -0
- data/lib/rsa_pem.rb +86 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ee23181ffc123913edb4923c2eb8b48f06ee1e5b
|
4
|
+
data.tar.gz: f2b7a99060ee00959f0bb1fa2a5bc6419899b796
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8fbdcd211725036061ae730e499a9035e9fe8a3184b11b7220e448c79dc867338df18f18c4902bcd6194314a53067b53cc63ab85f9e119b14b98e48bd9b01e11
|
7
|
+
data.tar.gz: 1a7acf548bfb6494fa88050d09417e06dd6b923e82d518926cf15c85ac3ab2a7ca4f1af3e4a443c767a2bc3e9f4ef89e50e35693ebbb5c210fd577ca502c6f41
|
data/lib/rsa_pem.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
class RsaPem
|
4
|
+
class << self
|
5
|
+
def from(mod, exp)
|
6
|
+
encoded_pubkey = create_encoded_pubkey_from(mod, exp)
|
7
|
+
der_b64 = hex_to_base64_digest encoded_pubkey
|
8
|
+
|
9
|
+
pem_padding_for der_b64
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def create_encoded_pubkey_from(mod, exp)
|
15
|
+
modulus = Base64.urlsafe_decode64(mod)
|
16
|
+
exponent = Base64.urlsafe_decode64(exp)
|
17
|
+
|
18
|
+
modulus_hex = prepad_signed(base64_to_hex_digest modulus)
|
19
|
+
exponent_hex = prepad_signed(base64_to_hex_digest exponent)
|
20
|
+
|
21
|
+
modlen = modulus_hex.length / 2
|
22
|
+
explen = exponent_hex.length / 2
|
23
|
+
|
24
|
+
encoded_modlen = encode_length_hex(modlen)
|
25
|
+
encoded_explen = encode_length_hex(explen)
|
26
|
+
|
27
|
+
full_hex_len = modlen + explen + encoded_modlen.length/2 + encoded_explen.length/2 + 2
|
28
|
+
encoded_hex_len = encode_length_hex(full_hex_len)
|
29
|
+
|
30
|
+
"30#{encoded_hex_len}02#{encoded_modlen}#{modulus_hex}02#{encoded_explen}#{exponent_hex}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def pem_padding_for(der_b64)
|
34
|
+
"-----BEGIN RSA PUBLIC KEY-----\n#{add_newlines der_b64}\n-----END RSA PUBLIC KEY-----"
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_newlines(der_b64)
|
38
|
+
der_b64.scan(/.{1,64}/).join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def prepad_signed(hex)
|
42
|
+
msb = hex[0]
|
43
|
+
if (msb < '0' || msb > '7')
|
44
|
+
pad(hex, '00')
|
45
|
+
else
|
46
|
+
hex
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def encode_length_hex(der_len)
|
51
|
+
# encode ASN.1 DER length field
|
52
|
+
|
53
|
+
if short_form? der_len
|
54
|
+
int_to_hex(der_len)
|
55
|
+
else
|
56
|
+
number_hex = int_to_hex(der_len)
|
57
|
+
length_of_length_byte = 128 + number_hex.length/2
|
58
|
+
|
59
|
+
"#{int_to_hex(length_of_length_byte)}#{number_hex}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def short_form?(asn1_der_length)
|
64
|
+
asn1_der_length <= 127
|
65
|
+
end
|
66
|
+
|
67
|
+
def pad(hex, padding)
|
68
|
+
"#{padding}#{hex}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def int_to_hex(int)
|
72
|
+
number_hex = int.to_s(16)
|
73
|
+
number_hex.length.odd? ? pad(number_hex, '0') : number_hex
|
74
|
+
end
|
75
|
+
|
76
|
+
def hex_to_base64_digest(hex)
|
77
|
+
# https://stackoverflow.com/questions/9986971/converting-a-hexadecimal-digest-to-base64-in-ruby
|
78
|
+
[[hex].pack("H*")].pack("m0")
|
79
|
+
end
|
80
|
+
|
81
|
+
def base64_to_hex_digest(base64)
|
82
|
+
# http://anthonylewis.com/2011/02/09/to-hex-and-back-with-ruby/
|
83
|
+
base64.unpack('H*').first
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rsa-pem-from-mod-exp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sarah Griffis
|
8
|
+
- Daniel Chang
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-06-28 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: A simple rsa pem tool based off tracker1/node-rsa-pem-from-mod-exp
|
15
|
+
email: daniel.chang85@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/rsa_pem.rb
|
21
|
+
homepage: http://rubygems.org/gems/rsa-pem-from-mod-exp
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.6.11
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Creates a valid pem given a modulus and exponent
|
45
|
+
test_files: []
|