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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rsa_pem.rb +86 -0
  3. metadata +45 -0
@@ -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
@@ -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: []