Module: PkernelJce::IdentityFactory

Included in:
Pkernel::IdentityFactory, Pkernel::IdentityFactory, IdentityEngine
Defined in:
lib/pkernel_jce/identity.rb

Overview

IdentityFactory

Instance Method Summary collapse

Instance Method Details

#build_from_components(key, cert = nil, chain = [], provider = nil) ⇒ Object Also known as: build



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/pkernel_jce/identity.rb', line 109

def build_from_components(key, cert = nil, chain = [], provider = nil)
  if key.nil?
    raise PkernelJce::Error, "Key cannot be nil to build identity"
  end

  id = Pkernel::Identity.new( { key: key, certificate: cert, chain: chain } )
  if cert.nil?
    class_eval do
      include PkernelJce::IdentityManagement
    end 
  else
    c = PkernelJce::Certificate.ensure_java_cert(cert)
    if PkernelJce::Certificate.is_issuer_cert?(c)
      class_eval do
        include PkernelJce::IdentityIssuer
        include PkernelJce::IdentityManagement
      end 
    else
      class_eval do
        include PkernelJce::IdentityManagement
      end 
    end
  end

  id.provider = provider
  
  id
end

#dump(id, opts = {}) ⇒ Object

end build_from_components



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/pkernel_jce/identity.rb', line 140

def dump(id, opts = {})
  
  if id.nil?
    raise PkernelJce::Error, "Identity object is nil in write to keystore"
  end

  prov = opts[:provider] 
  if prov.nil?
    prov = PkernelJce::Provider.add_default
  else
    prov = PkernelJce::Provider.add_provider(prov)
  end

  format = opts[:format]
  format = :p12 if format.nil?
  sFormat = format
  case format
  when :p12, :pkcs12
    PkernelJce::GConf.instance.glog.debug "Loading PKCS12 keystore"
    ks = java.security.KeyStore.getInstance("PKCS12",prov)
    sFormat = :p12
  when :jks
    PkernelJce::GConf.instance.glog.debug "Loading JKS keystore"
    ks = java.security.KeyStore.getInstance("JKS")
    sFormat = :jks
  else
    PkernelJce::GConf.instance.glog.debug "Loading '#{format}' keystore"
    if prov.nil?
      ks = java.security.KeyStore.getInstance(format)
    else
      ks = java.security.KeyStore.getInstance(format, prov)
    end
    sFormat = format
  end

  result = { }
  pass = opts[:password]
  if pass.nil? or pass.empty?
    PkernelJce::GConf.instance.glog.warn "Password is not given to dump identity. Random password shall be generated."
    pass = SecureRandom.hex(8)
    result[:password] = pass
    #raise PkernelJce::Error, "Password should not be empty for identity storage"
  end

  chain = id.chain.map do |c|
    if c.java_kind_of?(org.bouncycastle.cert.X509CertificateHolder) 
      c.to_java_cert
    else
      c
    end
  end

  name = opts[:key_name] || "Pkernel JCE"
  
  ks.load(nil,nil)
  ks.setKeyEntry(name, id.privKey, pass.to_java.toCharArray, chain.to_java(java.security.cert.Certificate))
  baos = java.io.ByteArrayOutputStream.new
  
  file = opts[:file]
  if file.nil? or file.empty?
    ks.store(baos, pass.to_java.toCharArray)
    #baos.toByteArray
    result[:bin] = baos.toByteArray
  else
    fos = java.io.FileOutputStream.new(file)
    ks.store(fos, pass.to_java.toCharArray)
    fos.flush
    fos.close
    
    result[:file] = file
  end
  
  result
end

#load(opts = {}) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'lib/pkernel_jce/identity.rb', line 215

def load(opts = {})

  prov = opts[:provider] 
  if prov.nil?
    prov = PkernelJce::Provider.add_default
  else
    prov = PkernelJce::Provider.add_provider(prov)
  end

  format = opts[:format]
  format = :p12 if format.nil?
  sFormat = format
  case format
  when :p12, :pkcs12
    PkernelJce::GConf.instance.glog.debug "Loading PKCS12 keystore"
    ks = java.security.KeyStore.getInstance("PKCS12",prov)
    sFormat = :p12
  when :jks        
    PkernelJce::GConf.instance.glog.debug "Loading JKS keystore"
    ks = java.security.KeyStore.getInstance("JKS")
    sFormat = :jks
  else
    PkernelJce::GConf.instance.glog.debug "Loading '#{format}' keystore"
    if prov.nil?
      ks = java.security.KeyStore.getInstance(format.to_s)
    else
      ks = java.security.KeyStore.getInstance(format.to_s, prov)
    end
  end   
  
  pass = opts[:password] || ''
  
  file = opts[:file]
  bin = opts[:bin]
  baos = java.io.ByteArrayOutputStream.new

  if not file.nil? or not file.empty?
    fis = java.io.FileInputStream.new(file)
    ks.load(fis,pass.to_java.toCharArray)
    fis.close
  elsif bin.nil?
    ks.load(java.io.ByteArrayInputStream.new(bin),pass.to_java.toCharArray)
  else
    raise PkernelJce::Error, "No file or bin is given to load identity"
  end
  
  name = opts[:key_name] || ks.aliases.to_a[0]
   
  key = ks.getKey(name,pass.to_java.toCharArray)
  cert = ks.getCertificate(name)
  chain = ks.getCertificateChain(name)

  id = Pkernel::Identity.new( { privKey: key, certificate: cert, chain: chain } )
  id
end