jwtear 0.2.0 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +8 -1
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +0 -2
- data/Gemfile.lock +71 -0
- data/README.md +107 -27
- data/bin/jwtear +40 -115
- data/jwtear.gemspec +9 -3
- data/lib/jwtear.rb +15 -19
- data/lib/jwtear/errors.rb +11 -4
- data/lib/jwtear/helpers/extensions.rb +17 -0
- data/lib/jwtear/helpers/utils.rb +71 -0
- data/lib/jwtear/jwe.rb +102 -0
- data/lib/jwtear/jws.rb +80 -0
- data/lib/jwtear/token.rb +67 -0
- data/lib/jwtear/version.rb +1 -1
- data/plugins/bruteforce.rb +103 -0
- data/plugins/generate.rb +68 -0
- data/plugins/parse.rb +111 -0
- data/plugins/plugin-template.rb +32 -0
- data/plugins/wiki.rb +50 -0
- data/plugins/wiki/README.md +212 -0
- metadata +105 -16
- data/LICENSE.txt +0 -21
- data/lib/jwtear/algorithms.rb +0 -83
- data/lib/jwtear/extensions.rb +0 -41
- data/lib/jwtear/jwt.rb +0 -129
- data/lib/jwtear/utils.rb +0 -57
- data/modules/bruteforce.rb +0 -39
metadata
CHANGED
@@ -1,17 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jwtear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KING SABRI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2019-10-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gli
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.19'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.19.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.19'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.19.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: json-jwt
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.10'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.10.2
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.10'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.10.2
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: jwe
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.4.0
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.4.0
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: tty-markdown
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.6.0
|
74
|
+
type: :runtime
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.6.0
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: tty-pager
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - "~>"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 0.12.1
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - "~>"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.12.1
|
95
|
+
description: JWTear, a modular command-line tool to parse, create and manipulate JWT
|
96
|
+
tokens for security testing purposes.
|
15
97
|
email:
|
16
98
|
- king.sabri@gmail.com
|
17
99
|
executables:
|
@@ -20,20 +102,27 @@ extensions: []
|
|
20
102
|
extra_rdoc_files: []
|
21
103
|
files:
|
22
104
|
- ".gitignore"
|
105
|
+
- CODE_OF_CONDUCT.md
|
23
106
|
- Gemfile
|
24
|
-
-
|
107
|
+
- Gemfile.lock
|
25
108
|
- README.md
|
26
109
|
- Rakefile
|
27
110
|
- bin/jwtear
|
28
111
|
- jwtear.gemspec
|
29
112
|
- lib/jwtear.rb
|
30
|
-
- lib/jwtear/algorithms.rb
|
31
113
|
- lib/jwtear/errors.rb
|
32
|
-
- lib/jwtear/extensions.rb
|
33
|
-
- lib/jwtear/
|
34
|
-
- lib/jwtear/
|
114
|
+
- lib/jwtear/helpers/extensions.rb
|
115
|
+
- lib/jwtear/helpers/utils.rb
|
116
|
+
- lib/jwtear/jwe.rb
|
117
|
+
- lib/jwtear/jws.rb
|
118
|
+
- lib/jwtear/token.rb
|
35
119
|
- lib/jwtear/version.rb
|
36
|
-
-
|
120
|
+
- plugins/bruteforce.rb
|
121
|
+
- plugins/generate.rb
|
122
|
+
- plugins/parse.rb
|
123
|
+
- plugins/plugin-template.rb
|
124
|
+
- plugins/wiki.rb
|
125
|
+
- plugins/wiki/README.md
|
37
126
|
homepage: https://github.com/KINGSABRI/jwtear
|
38
127
|
licenses:
|
39
128
|
- MIT
|
@@ -49,14 +138,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
49
138
|
version: '0'
|
50
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
140
|
requirements:
|
52
|
-
- - "
|
141
|
+
- - ">"
|
53
142
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
143
|
+
version: 1.3.1
|
55
144
|
requirements: []
|
56
145
|
rubyforge_project:
|
57
|
-
rubygems_version: 2.6.
|
146
|
+
rubygems_version: 2.7.6.2
|
58
147
|
signing_key:
|
59
148
|
specification_version: 4
|
60
|
-
summary: JWTear, command-line tool
|
61
|
-
|
149
|
+
summary: JWTear, a modular command-line tool to parse, create and manipulate JWT tokens
|
150
|
+
for security testing purposes.
|
62
151
|
test_files: []
|
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2018 KING SABRI
|
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
|
13
|
-
all 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
|
21
|
-
THE SOFTWARE.
|
data/lib/jwtear/algorithms.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
module JWTear
|
2
|
-
|
3
|
-
# Algorithms module contains all algorithms that are supported for this lib
|
4
|
-
# @Note if you are looking for production library, please use jwt gem
|
5
|
-
#
|
6
|
-
module Algorithms
|
7
|
-
|
8
|
-
# sha generates SHA signature
|
9
|
-
#
|
10
|
-
# @param data [String]
|
11
|
-
# the data you want to encrypt or make signature for.
|
12
|
-
# @param alg [String]
|
13
|
-
# the algorithm you want. @example: SHA256, SHA384, SHA512
|
14
|
-
# @param key [String]
|
15
|
-
#
|
16
|
-
# @return [String] SHA signature
|
17
|
-
#
|
18
|
-
def sha(data, alg, key)
|
19
|
-
raise AlgorithmRequiresKeyError if key.nil?
|
20
|
-
digit = /[[:digit:]]+/
|
21
|
-
OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'.sub(digit, alg[digit])), key, data)
|
22
|
-
end
|
23
|
-
|
24
|
-
# rsa generates RSA signature
|
25
|
-
#
|
26
|
-
# @param data [String]
|
27
|
-
# the data you want to encrypt or make signature for.
|
28
|
-
# @param alg [String]
|
29
|
-
# the algorithm you want. @example: RSA256, RSA384, RSA512
|
30
|
-
# @return [Hash]
|
31
|
-
# of public_key, private_key and signature
|
32
|
-
#
|
33
|
-
def rsa(data, alg)
|
34
|
-
rsa_private = OpenSSL::PKey::RSA.generate(2048)
|
35
|
-
rsa_public = @rsa_private.public_key
|
36
|
-
signature = @rsa_private.sign(OpenSSL::Digest.new(alg.sub('RS', 'sha')), data)
|
37
|
-
|
38
|
-
{public_key: rsa_public, private_key: rsa_private, signature: signature}
|
39
|
-
# FIXME: need to sign using public key
|
40
|
-
# cert = File.open('pub_cert.pem').read
|
41
|
-
# @public_key = OpenSSL::PKey::RSA.new(cert)
|
42
|
-
# raise 'Not a public certificate' unless public_key.public?
|
43
|
-
end
|
44
|
-
|
45
|
-
# ecdsa generates ESDSA signature
|
46
|
-
#
|
47
|
-
# @param data [String]
|
48
|
-
# @param alg [String]
|
49
|
-
# @return [String] of ESDSA signature
|
50
|
-
#
|
51
|
-
def ecdsa(data, alg)
|
52
|
-
# TODO:
|
53
|
-
# - fixme
|
54
|
-
# - support P-256 as SHA256
|
55
|
-
ecdsa_key = OpenSSL::PKey::EC.new('prime256v1')
|
56
|
-
ecdsa_key.generate_key
|
57
|
-
ecdsa_public = OpenSSL::PKey::EC.new(ecdsa_key)
|
58
|
-
ecdsa_public.private_key = nil
|
59
|
-
end
|
60
|
-
|
61
|
-
# Just None encryption
|
62
|
-
#
|
63
|
-
# @return [String]
|
64
|
-
# empty string if none algorithm, yes it happens in JWT
|
65
|
-
def none
|
66
|
-
''
|
67
|
-
end
|
68
|
-
|
69
|
-
# List of supported algorithms
|
70
|
-
#
|
71
|
-
# @return [Hash]
|
72
|
-
#
|
73
|
-
def supported_algorithms
|
74
|
-
{
|
75
|
-
None: [],
|
76
|
-
SHA: %w{HS256 HS384 HS512},
|
77
|
-
RSA: %w{RS256 RS384 RS512},
|
78
|
-
ESDSA: %w{ES256 ES384 ES512}
|
79
|
-
}
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
data/lib/jwtear/extensions.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
module JWTear
|
2
|
-
module Extensions
|
3
|
-
module Core
|
4
|
-
module String
|
5
|
-
def red; colorize(self, "\e[1m\e[31m"); end
|
6
|
-
def green; colorize(self, "\e[1m\e[32m"); end
|
7
|
-
def dark_green; colorize(self, "\e[32m"); end
|
8
|
-
def yellow; colorize(self, "\e[1m\e[33m"); end
|
9
|
-
def blue; colorize(self, "\e[1m\e[34m"); end
|
10
|
-
def dark_blue; colorize(self, "\e[34m"); end
|
11
|
-
def purple; colorize(self, "\e[35m"); end
|
12
|
-
def dark_purple; colorize(self, "\e[1;35m"); end
|
13
|
-
def cyan; colorize(self, "\e[1;36m"); end
|
14
|
-
def dark_cyan; colorize(self, "\e[36m"); end
|
15
|
-
def pure; colorize(self, "\e[0m\e[28m"); end
|
16
|
-
def underline; colorize(self, "\e[4m"); end
|
17
|
-
def bold; colorize(self, "\e[1m"); end
|
18
|
-
def colorize(text, color_code) "#{color_code}#{text}\e[0m" end
|
19
|
-
end
|
20
|
-
|
21
|
-
# module NilClass
|
22
|
-
# def puts(type=nil, arg)
|
23
|
-
# case type
|
24
|
-
# when nil
|
25
|
-
# puts arg
|
26
|
-
# when :error
|
27
|
-
# puts '[x] '.red + arg
|
28
|
-
# when :warning
|
29
|
-
# puts '[!] '.yellow + arg
|
30
|
-
# when :success
|
31
|
-
# puts '[x] '.green.bold + arg
|
32
|
-
# when :status
|
33
|
-
# puts '[x] '.green + arg
|
34
|
-
# else
|
35
|
-
# puts arg
|
36
|
-
# end
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/jwtear/jwt.rb
DELETED
@@ -1,129 +0,0 @@
|
|
1
|
-
require 'jwtear/algorithms'
|
2
|
-
require 'jwtear/utils'
|
3
|
-
|
4
|
-
module JWTear
|
5
|
-
class JWT
|
6
|
-
include JWTear::Extensions
|
7
|
-
include JWTear::Algorithms
|
8
|
-
include JWTear::Utils
|
9
|
-
|
10
|
-
# @!attribute [rw] token [String] generated or parsed token
|
11
|
-
# @!attribute [rw] header [Hash]
|
12
|
-
# @!attribute [rw] payload [Hash]
|
13
|
-
attr_accessor :token, :header, :payload
|
14
|
-
# @!attribute [rw] alg [String] generated or parsed algorithm
|
15
|
-
# @!attribute [rw] key [String] given encryption key
|
16
|
-
# @!attribute [rw] data [String] given or parsed data
|
17
|
-
attr_accessor :alg, :key, :data
|
18
|
-
# @!attribute [r] json [JSON] given or parsed json
|
19
|
-
# @!attribute [r] hash [Hash] hash result of parsing given or generated json
|
20
|
-
attr_reader :json, :hash
|
21
|
-
# @!attribute [r] signature [String] generated or parsed signature.
|
22
|
-
# @!attribute [r] rsa_private [String] generated private private key
|
23
|
-
# @!attribute [r] rsa_public [String] generated or given public key
|
24
|
-
attr_reader :signature, :rsa_private, :rsa_public
|
25
|
-
|
26
|
-
def initialize(token='')
|
27
|
-
@token = token
|
28
|
-
@key = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
# parse a given token.
|
32
|
-
# The main use of it is to parse and initiate header, payload, type, alg, signature values
|
33
|
-
#
|
34
|
-
# @param token String
|
35
|
-
def parse(token=@token)
|
36
|
-
is_token?(token)
|
37
|
-
_token = token.split('.')
|
38
|
-
@header = JSON.parse(decode(_token[0]))
|
39
|
-
@type, @alg = @header['typ'], @header['alg']
|
40
|
-
@payload = JSON.parse(decode(_token[1]))
|
41
|
-
@signature = decode(_token[2]) unless (_token[2].nil? or _token[2].empty?)
|
42
|
-
set_hash_and_json
|
43
|
-
end
|
44
|
-
|
45
|
-
# build the hash and Json format from the parsed or generated token
|
46
|
-
def set_hash_and_json
|
47
|
-
@hash = {header: @header, payload: @payload, signature: encode(@signature)}
|
48
|
-
@json = "#{@header.to_json}.#{@payload.to_json}.#{encode(@signature)}"
|
49
|
-
end
|
50
|
-
|
51
|
-
# generate signature
|
52
|
-
#
|
53
|
-
# @param data [String]. 'Base64.encode(header)'.'Base64.encode(payload)'>
|
54
|
-
# @param alg [String] supported algorithms: @see [Algorithms#supported_algorithms]
|
55
|
-
# @param key String
|
56
|
-
#
|
57
|
-
# @return [Self] the generate signature
|
58
|
-
#
|
59
|
-
def generate_sig(data, alg, key)
|
60
|
-
begin
|
61
|
-
case alg
|
62
|
-
when /^HS/
|
63
|
-
@signature = sha(data, alg, key)
|
64
|
-
when /^RS/
|
65
|
-
rsa = rsa(data, alg)
|
66
|
-
@rsa_public = rsa[:public_key]
|
67
|
-
@rsa_private = rsa[:private_key]
|
68
|
-
@signature = rsa[:signature]
|
69
|
-
when /^ES/
|
70
|
-
@signature = ecdsa(data, alg)
|
71
|
-
when /none/i
|
72
|
-
@signature = none
|
73
|
-
else
|
74
|
-
raise AlgorithmUnknownError
|
75
|
-
end
|
76
|
-
rescue AlgorithmUnknownError
|
77
|
-
puts "[x] ".red + "algorithm cannot be nil, empty or unsupported, Use: '--alg ALGORITHM' option"
|
78
|
-
puts "[!] ".yellow + 'Supported Algorithms:'
|
79
|
-
supported_algorithms.each_pair do |alg_key, alg_val|
|
80
|
-
puts alg_key, alg_val.map{|_alg| " #{_alg}" }
|
81
|
-
end
|
82
|
-
exit!
|
83
|
-
rescue AlgorithmRequiresKeyError
|
84
|
-
puts "[x] ".red + "key cannot be nil or empty, Use: '--key SECRET_KEY' option"
|
85
|
-
exit!
|
86
|
-
rescue Exception => e
|
87
|
-
puts "[x] ".red + "Unknown Exception: generate_sig"
|
88
|
-
puts '[!] '.yellow + 'Please report the issue at: https://github.com/KINGSABRI/jwtear/issues'.underline
|
89
|
-
puts e
|
90
|
-
puts e.backtrace
|
91
|
-
end
|
92
|
-
|
93
|
-
self
|
94
|
-
end
|
95
|
-
|
96
|
-
# generate JWT token
|
97
|
-
# by default, generate_token uses the given json header to detect the algorithm.
|
98
|
-
# But it also accept to ignore that and force it to you another algorithm.
|
99
|
-
#
|
100
|
-
# @return [String] the generated token
|
101
|
-
#
|
102
|
-
def generate_token
|
103
|
-
begin
|
104
|
-
@header = JSON.parse(@header) unless @header.is_a?(Hash)
|
105
|
-
@payload = JSON.parse(@payload) unless @payload.is_a?(Hash)
|
106
|
-
@alg = @header['alg'] if @alg.nil? # if algorithm not forced, take if from the header
|
107
|
-
|
108
|
-
header_encoded = encode(@header.to_json)
|
109
|
-
payload_encoded = encode(@payload.to_json)
|
110
|
-
data = "#{header_encoded}.#{payload_encoded}"
|
111
|
-
signature_encoded = encode(generate_sig(data, @alg, @key).signature)
|
112
|
-
token = [header_encoded, payload_encoded, signature_encoded].join('.')
|
113
|
-
|
114
|
-
set_hash_and_json
|
115
|
-
token
|
116
|
-
rescue JSON::ParserError => e
|
117
|
-
puts '[x] '.red + "Invalid JSON: #{e.message}"
|
118
|
-
puts "[!] ".yellow + "Make sure you've single quoted your input: eg. --header #{"'".bold}{\"type\":\"JWT\",\"alg\":\"HS256\"}#{"'".bold}"
|
119
|
-
exit!
|
120
|
-
rescue Exception => e
|
121
|
-
puts "[x] ".red + "Unknown Exception: generate_sig"
|
122
|
-
puts '[!] '.yellow + 'Please report the issue at: https://github.com/KINGSABRI/jwtear/issues'.underline
|
123
|
-
puts e
|
124
|
-
puts e.backtrace
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
end
|
129
|
-
end
|
data/lib/jwtear/utils.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
module JWTear
|
2
|
-
module Utils
|
3
|
-
|
4
|
-
# Check latest version
|
5
|
-
def latest_version
|
6
|
-
begin
|
7
|
-
current_version = JWTear::VERSION
|
8
|
-
rubygem_api = JSON.parse open("https://rubygems.org/api/v1/versions/jwtear.json").read
|
9
|
-
remote_version = rubygem_api.first["number"]
|
10
|
-
latest = remote_version.eql?(current_version)? true : false
|
11
|
-
|
12
|
-
latest ? current_version : remote_version
|
13
|
-
rescue Exception => e
|
14
|
-
puts "[!] ".yellow + " Couldn't check the latest version, please check internet connectivity."
|
15
|
-
exit!
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# check token format
|
20
|
-
def is_token?(token)
|
21
|
-
begin
|
22
|
-
token_size = token.split('.').size
|
23
|
-
raise InvalidTokenError if token_size < 2
|
24
|
-
rescue InvalidTokenError
|
25
|
-
puts '[!] '.red + "Invalid token: #{token}"
|
26
|
-
exit!
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def encode(data)
|
31
|
-
Base64.urlsafe_encode64(data, padding: false) unless data.nil?
|
32
|
-
end
|
33
|
-
|
34
|
-
def decode(data)
|
35
|
-
Base64.urlsafe_decode64(data)
|
36
|
-
end
|
37
|
-
|
38
|
-
# def encode_header_payload_signature(header, payload, signature)
|
39
|
-
# [header, payload, signature].map {|part| encode part}.join('.')
|
40
|
-
# end
|
41
|
-
|
42
|
-
# JWTear's logo
|
43
|
-
def self.banner
|
44
|
-
%Q{\n 888888 888 888 88888888888
|
45
|
-
"88b 888 o 888 888
|
46
|
-
888 888 d8b 888 888
|
47
|
-
888 888 d888b 888 888 .d88b. 8888b. 888d888
|
48
|
-
888 888d88888b888 888 d8P Y8b "88b 888P"
|
49
|
-
888 88888P Y88888 888 88888888 .d888888 888
|
50
|
-
88P 8888P Y8888 888 Y8b. 888 888 888
|
51
|
-
888 888P Y888 888 "Y8888 "Y888888 888
|
52
|
-
.d88P v#{JWTear::VERSION}
|
53
|
-
.d88P"
|
54
|
-
888P" }
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|