obfuskit 0.1.2 → 0.2.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 +4 -4
- data/README.md +1 -1
- data/lib/obfuskit/generator.rb +30 -63
- data/lib/obfuskit/obfuscator.rb +22 -23
- data/lib/obfuskit/templates/kotlin.erb +12 -0
- data/lib/obfuskit/templates/swift.erb +12 -0
- data/lib/obfuskit/version.rb +1 -1
- data/sig/obfuskit/generator.rbs +4 -3
- data/sig/obfuskit/obfuscator.rbs +4 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95df1da20d19fbbd42f0573e3373d1c08831f65f5a49365418fb98569a3d4c57
|
4
|
+
data.tar.gz: 43964e64f7175109de2e033f538a1a42632ff4be5330fa30513fb53651f45a17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2e3716d091ee82c00a397a2d17bd610220bef2678c0402e75582b81c8f5491915b0003196e4e72951aa29a3634eb30223b7c83463a31635f87a3e68c3f47600
|
7
|
+
data.tar.gz: 3086262688ba6c838a649a9bcbef677578a6001d5a716748ff0974046f511a58e4e556cd127bc316edfe5bf4e41f4cfde3e5791e9a9b475a2ca5f8fd545c562d
|
data/README.md
CHANGED
@@ -62,5 +62,5 @@ class O{private val a:ByteArray;private val b:Int;constructor(s:String){a=s.toBy
|
|
62
62
|
- [x] Read secrets from the Environment
|
63
63
|
- [x] Add dynamic salt for obfuscation
|
64
64
|
- [x] Support for .env files
|
65
|
-
- [
|
65
|
+
- [x] Use template engine for code generation
|
66
66
|
- [ ] Read secrets from 1Password CLI
|
data/lib/obfuskit/generator.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require_relative 'obfuscator'
|
3
3
|
require 'securerandom'
|
4
4
|
require 'dotenv'
|
5
|
+
require 'erb'
|
5
6
|
|
6
7
|
module Language
|
7
8
|
SWIFT = "Swift"
|
@@ -16,7 +17,7 @@ module Obfuskit
|
|
16
17
|
|
17
18
|
Dotenv.load
|
18
19
|
args = ARGV
|
19
|
-
|
20
|
+
language_key = args.shift.downcase
|
20
21
|
|
21
22
|
language_map = {
|
22
23
|
"swift" => Language::SWIFT,
|
@@ -24,90 +25,56 @@ module Obfuskit
|
|
24
25
|
"kt" => Language::KOTLIN
|
25
26
|
}
|
26
27
|
|
27
|
-
if
|
28
|
+
if language_key != nil && language_map.key?(language_key)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
# Create a new instance of the O class with the obfuscation salt
|
32
|
-
obfuscator = Obfuscator.new("_" + obfuscation_salt)
|
30
|
+
salt = SecureRandom.uuid.to_s.gsub("-", "")
|
31
|
+
obfuscator = Obfuscator.new("_" + salt)
|
33
32
|
|
34
|
-
case language_map[
|
33
|
+
case language_map[language_key]
|
35
34
|
when Language::SWIFT
|
36
35
|
puts generate_swift(args, obfuscator)
|
36
|
+
|
37
37
|
when Language::KOTLIN
|
38
38
|
puts generate_kotlin(args, obfuscator)
|
39
39
|
end
|
40
|
+
|
40
41
|
else
|
41
|
-
puts "
|
42
|
+
STDERR.puts "Please specify a valid language."
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
46
|
private
|
46
|
-
|
47
|
+
|
47
48
|
def generate_swift(args, obfuscator)
|
48
|
-
|
49
|
-
|
50
|
-
code += "enum ObfusKit {\n"
|
51
|
-
# For each argument, if it's in the environment variables, add it to the code
|
52
|
-
args.each_with_index do |arg, index|
|
53
|
-
if ENV[arg] != nil
|
54
|
-
code += "\tstatic let #{arg}: String = _o.r(#{obfuscator.obfuscate(ENV[arg])})\n"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
code += "\n"
|
58
|
-
# Add the obfuscation salt and the obfuscator to the code
|
59
|
-
code += <<-STRING
|
60
|
-
\tprivate class _#{obfuscator.salt} { }
|
61
|
-
\tprivate static let _o = O(String(describing: _#{obfuscator.salt}.self))
|
62
|
-
}\n\n
|
63
|
-
STRING
|
64
|
-
|
65
|
-
# Add the obfuscator source code to the code
|
66
|
-
code += 'struct O { private let c: [UInt8]; private let l: Int; init(_ s: String) { self.init([UInt8](s.utf8)) }; init(_ c: [UInt8]) { self.c = c; l = c.count }; @inline(__always) func o(_ v: String) -> [UInt8] { [UInt8](v.utf8).enumerated().map { $0.element ^ c[$0.offset % l] } }; @inline(__always) func r(_ value: [UInt8]) -> String { String(bytes: value.enumerated().map { $0.element ^ c[$0.offset % l] }, encoding: .utf8) ?? "" } }'
|
67
|
-
# Return the generated code
|
68
|
-
return code
|
49
|
+
values = obfuscated_values_from_env(args, obfuscator)
|
50
|
+
generate_with_template("swift", values, nil, obfuscator)
|
69
51
|
end
|
70
52
|
|
71
|
-
# Function to generate Kotlin code
|
72
53
|
def generate_kotlin(args, obfuscator)
|
73
|
-
# Get the first argument as the package name
|
74
54
|
package = args.shift
|
75
|
-
# If no package name is provided, return an empty string
|
76
55
|
if package == nil
|
77
|
-
puts "No package name provided."
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
# Start building the Kotlin code
|
82
|
-
code = "package #{package}\n\n"
|
83
|
-
code += "object ObfusKit {\n"
|
84
|
-
# Add the obfuscation salt and the obfuscator to the code
|
85
|
-
code += <<-STRING
|
86
|
-
\tprivate val _o = O(_#{obfuscator.salt}::class.java.simpleName)
|
87
|
-
\tprivate class _#{obfuscator.salt}\n
|
88
|
-
STRING
|
89
|
-
|
90
|
-
# For each argument, if it's in the environment variables, add it to the code
|
91
|
-
args.each_with_index do |arg, index|
|
92
|
-
if ENV[arg] != nil
|
93
|
-
code += "\tval #{arg}: String = _o.r(byteArrayOf(#{obfuscator.obfuscate(ENV[arg]).map { |i| i.to_s }.join(', ')}))\n"
|
94
|
-
end
|
56
|
+
STDERR.puts "No package name provided."
|
57
|
+
else
|
58
|
+
values = obfuscated_values_from_env(args, obfuscator)
|
59
|
+
generate_with_template("kotlin", values, package, obfuscator)
|
95
60
|
end
|
96
|
-
|
61
|
+
end
|
97
62
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
63
|
+
def obfuscated_values_from_env(args, obfuscator)
|
64
|
+
args.map { |name|
|
65
|
+
ENV[name] != nil ? [name, obfuscator.obfuscate(ENV[name])] : nil
|
66
|
+
}.compact.to_h
|
102
67
|
end
|
103
68
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
69
|
+
def generate_with_template(template_name, values, package, obfuscator)
|
70
|
+
file = File.expand_path("templates/#{template_name}.erb", __dir__)
|
71
|
+
template = ERB.new(File.read(file), trim_mode: "-")
|
72
|
+
template.result_with_hash(
|
73
|
+
values: values,
|
74
|
+
package: package,
|
75
|
+
salt: obfuscator.salt
|
76
|
+
)
|
110
77
|
end
|
111
|
-
end
|
112
78
|
|
79
|
+
end
|
113
80
|
end
|
data/lib/obfuskit/obfuscator.rb
CHANGED
@@ -4,31 +4,30 @@
|
|
4
4
|
|
5
5
|
module Obfuskit
|
6
6
|
class Obfuscator
|
7
|
-
# Initializes the obfuscator with a string.
|
8
|
-
# The string is converted to an array of bytes and stored in @c.
|
9
|
-
# The size of the array is stored in @l.
|
10
|
-
def initialize(salt)
|
11
|
-
salt = salt.bytes if salt.is_a? String
|
12
|
-
@salt = salt
|
13
|
-
@length = @salt.size
|
14
|
-
end
|
15
7
|
|
16
|
-
|
17
|
-
@salt
|
18
|
-
end
|
8
|
+
attr_reader :salt
|
19
9
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
10
|
+
# Initializes the obfuscator with a string.
|
11
|
+
# The string is converted to an array of bytes and stored in @c.
|
12
|
+
# The size of the array is stored in @l.
|
13
|
+
def initialize(salt)
|
14
|
+
salt = salt.bytes if salt.is_a? String
|
15
|
+
@salt = salt
|
16
|
+
@length = @salt.size
|
17
|
+
end
|
26
18
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
19
|
+
# Obfuscates a string.
|
20
|
+
# The string is converted to an array of bytes and each element is XORed with an element from @c.
|
21
|
+
# The index of the element from @c is the index of the element from the string modulo @l.
|
22
|
+
def obfuscate(value)
|
23
|
+
value.bytes.map.with_index { |b, i| b ^ @salt[i % @length] }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Reverses the obfuscation of an array of bytes.
|
27
|
+
# Each element is XORed with an element from @c and the result is converted back to a string.
|
28
|
+
# The index of the element from @c is the index of the element from the array modulo @l.
|
29
|
+
def reveal(value)
|
30
|
+
value.map.with_index { |b, i| b ^ @salt[i % @length] }.pack('C*').force_encoding('utf-8')
|
31
|
+
end
|
33
32
|
end
|
34
33
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
package <%= package %>
|
2
|
+
|
3
|
+
public object ObfusKit {
|
4
|
+
private val _o = O(_6572131328ef462d9d4a05cf4b2a2516::class.java.simpleName)
|
5
|
+
private class _6572131328ef462d9d4a05cf4b2a2516
|
6
|
+
|
7
|
+
<% values.each do |name, values| -%>
|
8
|
+
public val <%= name %>: String = _o.r(byteArrayOf(<%= values.map { |i| i.to_s }.join(', ') %>))
|
9
|
+
<% end -%>
|
10
|
+
}
|
11
|
+
|
12
|
+
private class O{private val a:ByteArray;private val b:Int;constructor(s:String){a=s.toByteArray(Charsets.UTF_8);b=a.size};fun o(v:String):ByteArray{val d=v.toByteArray(Charsets.UTF_8);return ByteArray(d.size){i->(d[i].toInt() xor a[i%b].toInt()).toByte()}};fun r(value:ByteArray):String{return String(ByteArray(value.size){i->(value[i].toInt() xor a[i%b].toInt()).toByte()},Charsets.UTF_8)}}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import Foundation
|
2
|
+
|
3
|
+
public enum ObfusKit {
|
4
|
+
<% values.each do |name, values| -%>
|
5
|
+
public static let <%= name %>: String = _o.r([<%= values.map { |i| i.to_s }.join(', ') %>])
|
6
|
+
<% end -%>
|
7
|
+
|
8
|
+
private final class <%= salt %> { }
|
9
|
+
private static let _o = O(String(describing: <%= salt %>.self))
|
10
|
+
}
|
11
|
+
|
12
|
+
private struct O { private let c: [UInt8]; private let l: Int; init(_ s: String) { self.init([UInt8](s.utf8)) }; init(_ c: [UInt8]) { self.c = c; l = c.count }; @inline(__always) func o(_ v: String) -> [UInt8] { [UInt8](v.utf8).enumerated().map { $0.element ^ c[$0.offset % l] } }; @inline(__always) func r(_ value: [UInt8]) -> String { String(bytes: value.enumerated().map { $0.element ^ c[$0.offset % l] }, encoding: .utf8) ?? "" } }
|
data/lib/obfuskit/version.rb
CHANGED
data/sig/obfuskit/generator.rbs
CHANGED
@@ -3,8 +3,9 @@ module Obfuskit
|
|
3
3
|
def generate: -> void
|
4
4
|
|
5
5
|
private
|
6
|
-
def generate_kotlin: -> String
|
7
|
-
def generate_swift: -> String
|
8
|
-
def
|
6
|
+
def generate_kotlin: ([String], Obfuscator) -> String
|
7
|
+
def generate_swift: ([String], Obfuscator) -> String
|
8
|
+
def obfuscated_values_from_env: ([String], Obfuscator) -> Hash[String, [Integer]]
|
9
|
+
def generate_with_template: (String, Hash[String, [Integer]], String, Obfuscator) -> String
|
9
10
|
end
|
10
11
|
end
|
data/sig/obfuskit/obfuscator.rbs
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: obfuskit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Gratzer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Generate Swift and Kotlin files with obfuscated environment variables.
|
14
14
|
email: mgratzer@gmail.com
|
@@ -23,6 +23,8 @@ files:
|
|
23
23
|
- exe/obfuskit
|
24
24
|
- lib/obfuskit/generator.rb
|
25
25
|
- lib/obfuskit/obfuscator.rb
|
26
|
+
- lib/obfuskit/templates/kotlin.erb
|
27
|
+
- lib/obfuskit/templates/swift.erb
|
26
28
|
- lib/obfuskit/version.rb
|
27
29
|
- sig/obfuskit.rbs
|
28
30
|
- sig/obfuskit/generator.rbs
|