Class: SSSA::Utils
- Inherits:
-
Object
- Object
- SSSA::Utils
- Defined in:
- lib/utils.rb
Instance Attribute Summary collapse
-
#prime ⇒ Object
Returns the value of attribute prime.
Instance Method Summary collapse
- #evaluate_polynomial(coefficients, value) ⇒ Object
- #from_base64(number) ⇒ Object
- #gcd(a, b) ⇒ Object
-
#initialize ⇒ Utils
constructor
A new instance of Utils.
- #merge_ints(secrets) ⇒ Object
- #mod_inverse(number) ⇒ Object
- #random ⇒ Object
- #split_ints(secret) ⇒ Object
- #to_base64(number) ⇒ Object
Constructor Details
#initialize ⇒ Utils
Returns a new instance of Utils.
8 9 10 11 |
# File 'lib/utils.rb', line 8 def initialize() # 256-bit prime @prime = 99995644905598542077721161034987774965417302630805822064337798850767846245779 end |
Instance Attribute Details
#prime ⇒ Object
Returns the value of attribute prime.
6 7 8 |
# File 'lib/utils.rb', line 6 def prime @prime end |
Instance Method Details
#evaluate_polynomial(coefficients, value) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/utils.rb', line 48 def evaluate_polynomial(coefficients, value) result = 0 coefficients.each_with_index do |coefficient, exponent| expmod = 1 (0...exponent).each do expmod = (expmod * value) % @prime end result += coefficient * expmod result = result % @prime end return result end |
#from_base64(number) ⇒ Object
66 67 68 69 70 71 72 73 74 75 |
# File 'lib/utils.rb', line 66 def from_base64(number) segment = Base64.urlsafe_decode64(number).split('').map do |x| if x.ord > 15 x.ord.to_s(16) else "0" + x.ord.to_s(16) end end return (segment+["00"]*(32-segment.size)).join.hex end |
#gcd(a, b) ⇒ Object
77 78 79 80 81 82 83 84 85 86 |
# File 'lib/utils.rb', line 77 def gcd(a, b) if b == 0 return [a, 1, 0] else n = (a*1.0/b).floor c = a % b r = gcd(b, c) return [r[0], r[2], r[1]-r[2]*n] end end |
#merge_ints(secrets) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/utils.rb', line 34 def merge_ints(secrets) result = "" secrets.each_with_index do |secret, index| if index == secrets.size-1 result += ("0"*(64-secret.to_s(16).size) + secret.to_s(16)).scan(/../).map{|x| x.hex.chr}.join.gsub(/\x00*$/, '') else result += ("0"*(64-secret.to_s(16).size) + secret.to_s(16)).scan(/../).map{|x| x.hex.chr}.join end end return result end |
#mod_inverse(number) ⇒ Object
88 89 90 91 92 93 94 |
# File 'lib/utils.rb', line 88 def mod_inverse(number) remainder = gcd(@prime, number % @prime)[2] if (number < 0) remainder *= -1 end return (@prime + remainder) % @prime end |
#random ⇒ Object
13 14 15 |
# File 'lib/utils.rb', line 13 def random() return SecureRandom.random_number(@prime) end |
#split_ints(secret) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/utils.rb', line 17 def split_ints(secret) result = [] secret.scan(/.{1,32}/) do |part| segment = part.split('').map do |x| if x.ord > 15 x.ord.to_s(16) else "0" + x.ord.to_s(16) end end result.push (segment+["00"]*(32-segment.size)).join.hex end return result end |
#to_base64(number) ⇒ Object
62 63 64 |
# File 'lib/utils.rb', line 62 def to_base64(number) return Base64.urlsafe_encode64(("0"*(64-number.to_s(16).size) + number.to_s(16)).scan(/../).map{|x| x.hex.chr}.join) end |