rsa-pem-from-mod-exp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []