Class: SSSA::Utils

Inherits:
Object
  • Object
show all
Defined in:
lib/utils.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeUtils

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

#primeObject

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

#randomObject



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