62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/ccrypto/java/engines/hkdf_engine.rb', line 62
def derive(input, output = :binary)
begin
logger.debug "HKDF config : #{@config.inspect}"
case @config.digest
when Symbol, String
hkdfConf = self.class.find_hkdf_config_by_digest(@config.digest)
raise HKDFEngineError, "Unsupported digest '#{@config.digest}'" if is_empty?(hkdfConf)
digest = hkdfConf.first.digest
when Ccrypto::DigestConfig
digest = @config.digest
else
raise HKDFEngineError, "Unsupported digest '#{@config.digest}'"
end
logger.debug "Digest for HKDF : #{digest.inspect}"
begin
dig = Ccrypto::Java::DigestEngine.instance(digest)
rescue Exception => ex
raise KDFEngineException, "Failed to initialize digest engine. Error was : #{ex}"
end
bcDigest = eval(@config.provider_config[:bc_digest])
@config.info = "" if @config.info.nil?
logger.debug "Salt length : #{@config.salt.nil? ? "0" : @config.salt.length}"
logger.debug "Info length : #{@config.info.nil? ? "0" : @config.info.length}"
logger.debug "Digest : #{bcDigest}"
logger.warn "Salt is empty!" if is_empty?(@config.salt)
hkdf = org.bouncycastle.crypto.generators.HKDFBytesGenerator.new(bcDigest)
hkdfParam = org.bouncycastle.crypto.params.HKDFParameters.new(to_java_bytes(input), to_java_bytes(@config.salt) ,to_java_bytes(@config.info))
hkdf.init(hkdfParam)
out = ::Java::byte[@config.outBitLength/8].new
hkdf.generateBytes(out, 0, out.length)
case output
when :b64
to_b64(out)
when :hex
to_hex(out)
else
out
end
rescue Exception => ex
raise KDFEngineException, ex
end
end
|